From 8f9c9c537087e39b6d58faf860d8c1a7204d2d6a Mon Sep 17 00:00:00 2001 From: Gjermund Garaba Date: Thu, 20 Aug 2026 14:57:40 +0200 Subject: [PATCH 01/22] poc: Besu IBFT 2.0 / QBFT light clients Signed-off-by: Gjermund Garaba --- .env.example | 4 +- AGENTS.md | 23 + Cargo.lock | 35 + Cargo.toml | 4 + README.md | 4 + e2e/interchaintestv8/AGENTS.md | 21 + e2e/interchaintestv8/README.md | 79 ++ e2e/interchaintestv8/attestor/setup.go | 1 + e2e/interchaintestv8/besu_qbft_test.go | 73 ++ e2e/interchaintestv8/besu_to_besu_test.go | 572 +++++++++++++ e2e/interchaintestv8/chainconfig/besu_qbft.go | 436 ++++++++++ .../testdata/besu/qbft/config.toml | 11 + .../testdata/besu/qbft/docker-compose.yml | 86 ++ .../testdata/besu/qbft/genesis.json | 24 + .../testdata/besu/qbft/keys/validator1/key | 1 + .../testdata/besu/qbft/keys/validator2/key | 1 + .../testdata/besu/qbft/keys/validator3/key | 1 + .../testdata/besu/qbft/keys/validator4/key | 1 + e2e/interchaintestv8/e2esuite/config.go | 46 +- .../e2esuite/setup_ethereum.go | 38 + e2e/interchaintestv8/e2esuite/suite.go | 17 +- e2e/interchaintestv8/ethereum/ethereum.go | 23 +- e2e/interchaintestv8/ethereum/proof.go | 34 + e2e/interchaintestv8/go.mod | 99 ++- e2e/interchaintestv8/go.sum | 310 ++++++- e2e/interchaintestv8/ibc_eureka_test.go | 117 +-- e2e/interchaintestv8/proofapi/builder.go | 45 +- e2e/interchaintestv8/proofapi/config.go | 101 ++- e2e/interchaintestv8/testvalues/values.go | 15 +- e2e/interchaintestv8/types/besu_fixtures.go | 767 ++++++++++++++++++ ibc-solana/AGENTS.md | 20 + ibc-solidity/abi/BesuIBFT2LightClient.json | 758 +++++++++++++++++ ibc-solidity/abi/BesuQBFTLightClient.json | 758 +++++++++++++++++ ibc-solidity/abi/DummyLightClient.json | 173 ++++ .../abi/bytecode/AttestationLightClient.json | 2 +- .../abi/bytecode/BesuIBFT2LightClient.json | 1 + .../abi/bytecode/BesuQBFTLightClient.json | 1 + .../abi/bytecode/DummyLightClient.json | 1 + .../abi/bytecode/SP1ICS07Tendermint.json | 2 +- ibc-solidity/contracts/README.md | 13 + .../besu/BesuIBFT2LightClient.sol | 55 ++ .../besu/BesuLightClientBase.sol | 559 +++++++++++++ .../besu/BesuQBFTLightClient.sol | 56 ++ .../contracts/light-clients/besu/MPTProof.sol | 282 +++++++ .../contracts/light-clients/besu/README.md | 134 +++ .../light-clients/besu/RLPReader.sol | 386 +++++++++ .../besu/errors/IBesuLightClientErrors.sol | 90 ++ .../besu/msgs/IBesuLightClientMsgs.sol | 40 + .../light-clients/dummy/DummyLightClient.sol | 166 ++++ .../contracts/light-clients/dummy/README.md | 11 + .../utils/SolanaIFTSendCallConstructor.sol | 12 +- ibc-solidity/solidity.just | 9 + .../test/besu-bft/BesuIBFT2LightClient.t.sol | 46 ++ .../test/besu-bft/BesuLightClientTestBase.sol | 354 ++++++++ .../test/besu-bft/BesuQBFTLightClient.t.sol | 46 ++ .../test/besu-bft/fixtures/ibft2.json | 97 +++ ibc-solidity/test/besu-bft/fixtures/qbft.json | 97 +++ .../test/dummy-lc/DummyLightClientTest.t.sol | 144 ++++ packages/go-abigen/dummy/contract.go | 317 ++++++++ .../proof-api/modules/besu-to-besu/Cargo.toml | 21 + .../proof-api/modules/besu-to-besu/src/lib.rs | 219 +++++ .../modules/besu-to-besu/src/tx_builder.rs | 616 ++++++++++++++ .../modules/evmdummy-to-evmdummy/Cargo.toml | 16 + .../modules/evmdummy-to-evmdummy/src/lib.rs | 189 +++++ .../evmdummy-to-evmdummy/src/tx_builder.rs | 262 ++++++ packages/solidity/src/besu.rs | 25 + packages/solidity/src/dummy.rs | 37 + packages/solidity/src/ics26.rs | 10 + packages/solidity/src/lib.rs | 2 + packages/solidity/src/msgs.rs | 1 + programs/proof-api/Cargo.toml | 2 + programs/proof-api/README.md | 34 + programs/proof-api/config.example.json | 26 + programs/proof-api/src/bin/proof-api.rs | 4 + 74 files changed, 8987 insertions(+), 96 deletions(-) create mode 100644 AGENTS.md create mode 100644 e2e/interchaintestv8/AGENTS.md create mode 100644 e2e/interchaintestv8/besu_qbft_test.go create mode 100644 e2e/interchaintestv8/besu_to_besu_test.go create mode 100644 e2e/interchaintestv8/chainconfig/besu_qbft.go create mode 100644 e2e/interchaintestv8/chainconfig/testdata/besu/qbft/config.toml create mode 100644 e2e/interchaintestv8/chainconfig/testdata/besu/qbft/docker-compose.yml create mode 100644 e2e/interchaintestv8/chainconfig/testdata/besu/qbft/genesis.json create mode 100644 e2e/interchaintestv8/chainconfig/testdata/besu/qbft/keys/validator1/key create mode 100644 e2e/interchaintestv8/chainconfig/testdata/besu/qbft/keys/validator2/key create mode 100644 e2e/interchaintestv8/chainconfig/testdata/besu/qbft/keys/validator3/key create mode 100644 e2e/interchaintestv8/chainconfig/testdata/besu/qbft/keys/validator4/key create mode 100644 e2e/interchaintestv8/ethereum/proof.go create mode 100644 e2e/interchaintestv8/types/besu_fixtures.go create mode 100644 ibc-solana/AGENTS.md create mode 100644 ibc-solidity/abi/BesuIBFT2LightClient.json create mode 100644 ibc-solidity/abi/BesuQBFTLightClient.json create mode 100644 ibc-solidity/abi/DummyLightClient.json create mode 100644 ibc-solidity/abi/bytecode/BesuIBFT2LightClient.json create mode 100644 ibc-solidity/abi/bytecode/BesuQBFTLightClient.json create mode 100644 ibc-solidity/abi/bytecode/DummyLightClient.json create mode 100644 ibc-solidity/contracts/light-clients/besu/BesuIBFT2LightClient.sol create mode 100644 ibc-solidity/contracts/light-clients/besu/BesuLightClientBase.sol create mode 100644 ibc-solidity/contracts/light-clients/besu/BesuQBFTLightClient.sol create mode 100644 ibc-solidity/contracts/light-clients/besu/MPTProof.sol create mode 100644 ibc-solidity/contracts/light-clients/besu/README.md create mode 100644 ibc-solidity/contracts/light-clients/besu/RLPReader.sol create mode 100644 ibc-solidity/contracts/light-clients/besu/errors/IBesuLightClientErrors.sol create mode 100644 ibc-solidity/contracts/light-clients/besu/msgs/IBesuLightClientMsgs.sol create mode 100644 ibc-solidity/contracts/light-clients/dummy/DummyLightClient.sol create mode 100644 ibc-solidity/contracts/light-clients/dummy/README.md create mode 100644 ibc-solidity/test/besu-bft/BesuIBFT2LightClient.t.sol create mode 100644 ibc-solidity/test/besu-bft/BesuLightClientTestBase.sol create mode 100644 ibc-solidity/test/besu-bft/BesuQBFTLightClient.t.sol create mode 100644 ibc-solidity/test/besu-bft/fixtures/ibft2.json create mode 100644 ibc-solidity/test/besu-bft/fixtures/qbft.json create mode 100644 ibc-solidity/test/dummy-lc/DummyLightClientTest.t.sol create mode 100644 packages/go-abigen/dummy/contract.go create mode 100644 packages/proof-api/modules/besu-to-besu/Cargo.toml create mode 100644 packages/proof-api/modules/besu-to-besu/src/lib.rs create mode 100644 packages/proof-api/modules/besu-to-besu/src/tx_builder.rs create mode 100644 packages/proof-api/modules/evmdummy-to-evmdummy/Cargo.toml create mode 100644 packages/proof-api/modules/evmdummy-to-evmdummy/src/lib.rs create mode 100644 packages/proof-api/modules/evmdummy-to-evmdummy/src/tx_builder.rs create mode 100644 packages/solidity/src/besu.rs create mode 100644 packages/solidity/src/dummy.rs diff --git a/.env.example b/.env.example index 16d79a745..8114ea82d 100644 --- a/.env.example +++ b/.env.example @@ -1,4 +1,6 @@ -# Which type of ethereum testnet to run locally (anvil|pos) +# Which type of ethereum testnet to run locally (anvil|pos|besu-qbft|none) +# Validated Besu mode for e2e: ETH_TESTNET_TYPE=besu-qbft, ETH_LC_ON_COSMOS=attestor-native, +# COSMOS_LC_ON_ETH=sp1, SP1_PROVER=mock ETH_TESTNET_TYPE="anvil" # Preset for Ethereum PoS network configuration (minimal|mainnet) ETHEREUM_POS_NETWORK_PRESET="minimal" diff --git a/AGENTS.md b/AGENTS.md new file mode 100644 index 000000000..f948fab8d --- /dev/null +++ b/AGENTS.md @@ -0,0 +1,23 @@ +# AGENTS.md + +This repo combines Solidity/Foundry contracts, a Rust workspace, Solana Anchor programs, and Go-based end-to-end tooling for IBC Eureka. + +Look here first: +- `README.md` +- `justfile` +- `foundry.toml` +- `Cargo.toml` +- `contracts/README.md` + +Use the smallest relevant validation from the repo root: +- Solidity: `just lint-solidity` and `just test-foundry` +- Rust workspace, relayer, operator, and shared packages: `just lint-rust` and `just test-cargo` +- Broad cross-stack changes: `just lint` +- Solana or e2e changes: use the subtree-specific commands in `programs/solana/AGENTS.md` or `e2e/interchaintestv8/AGENTS.md` + +Hard constraints: +- Do not hand-edit generated outputs in `packages/go-abigen/`, most of `packages/go-anchor/`, `e2e/interchaintestv8/solana/go-anchor/`, or protobuf outputs under `e2e/interchaintestv8/types/`; regenerate with `just generate-abi`, `just generate-solana-types`, or `just generate-buf`. +- `packages/go-anchor/ics07_tendermint_patches/` is the hand-maintained exception inside `packages/go-anchor/`; preserve it across regeneration. +- If Solidity interfaces, ABI-exposed structs, or contract types change, run `just generate-abi` before validating Go or e2e code. +- If Solana program interfaces or IDLs change, run `just generate-solana-types`. +- If `.proto` files change, run `just generate-buf`. diff --git a/Cargo.lock b/Cargo.lock index ba1c33d0e..e1c0450aa 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -8491,6 +8491,7 @@ dependencies = [ "opentelemetry-otlp", "opentelemetry_sdk", "prometheus", + "proof-api-besu-to-besu", "proof-api-core", "proof-api-cosmos-to-cosmos", "proof-api-cosmos-to-eth", @@ -8499,6 +8500,7 @@ dependencies = [ "proof-api-eth-to-cosmos-compat", "proof-api-eth-to-eth", "proof-api-eth-to-solana", + "proof-api-evmdummy-to-evmdummy", "proof-api-solana-to-cosmos", "proof-api-solana-to-eth", "serde_json", @@ -8511,6 +8513,25 @@ dependencies = [ "warp", ] +[[package]] +name = "proof-api-besu-to-besu" +version = "0.1.0" +dependencies = [ + "alloy 2.0.4", + "alloy-rlp", + "anyhow", + "ethereum-apis 0.1.0", + "ethereum-light-client 0.1.0", + "ibc-eureka-solidity-types 0.1.0", + "proof-api-core", + "proof-api-lib", + "rlp 0.6.1", + "serde", + "serde_json", + "tonic 0.13.1", + "tracing", +] + [[package]] name = "proof-api-core" version = "0.1.0" @@ -8707,6 +8728,20 @@ dependencies = [ "tracing", ] +[[package]] +name = "proof-api-evmdummy-to-evmdummy" +version = "0.1.0" +dependencies = [ + "alloy 2.0.4", + "anyhow", + "ibc-eureka-solidity-types 0.1.0", + "proof-api-core", + "proof-api-lib", + "serde", + "serde_json", + "tonic 0.13.1", +] + [[package]] name = "proof-api-lib" version = "0.1.0" diff --git a/Cargo.toml b/Cargo.toml index bb12b2295..59332094d 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -20,6 +20,8 @@ members = [ "packages/proof-api/modules/eth-to-cosmos-compat", "packages/proof-api/modules/cosmos-to-eth", "packages/proof-api/modules/eth-to-eth", + "packages/proof-api/modules/evmdummy-to-evmdummy", + "packages/proof-api/modules/besu-to-besu", "packages/proof-api/modules/cosmos-to-cosmos", "packages/proof-api/modules/solana-to-cosmos", "packages/proof-api/modules/cosmos-to-solana", @@ -60,6 +62,8 @@ proof-api-eth-to-cosmos = { path = "packages/proof-api/modules/eth-to-cos proof-api-eth-to-cosmos-compat = { path = "packages/proof-api/modules/eth-to-cosmos-compat", default-features = false } proof-api-cosmos-to-eth = { path = "packages/proof-api/modules/cosmos-to-eth", default-features = false } proof-api-eth-to-eth = { path = "packages/proof-api/modules/eth-to-eth", default-features = false } +proof-api-evmdummy-to-evmdummy = { path = "packages/proof-api/modules/evmdummy-to-evmdummy", default-features = false } +proof-api-besu-to-besu = { path = "packages/proof-api/modules/besu-to-besu", default-features = false } proof-api-cosmos-to-cosmos = { path = "packages/proof-api/modules/cosmos-to-cosmos", default-features = false } proof-api-solana-to-cosmos = { path = "packages/proof-api/modules/solana-to-cosmos", default-features = false } proof-api-cosmos-to-solana = { path = "packages/proof-api/modules/cosmos-to-solana", default-features = false } diff --git a/README.md b/README.md index 97e659b46..921d5ac54 100644 --- a/README.md +++ b/README.md @@ -80,6 +80,9 @@ This project is structured with the following directories: | `ICS26Router.sol` | IBC router handles sequencing, replay protection, and timeout checks. Passes proofs to light clients for verification, and resolves `portId` for app callbacks. Provable IBC storage is stored in this contract. | ✅ | | `ICS20Transfer.sol` | IBC transfer application to send and receive tokens to/from another IBC transfer implementation. | ✅ | | `SP1ICS07Tendermint.sol` | Tendermint light client powered by SP1. The entry point for SP1 proofs. | ✅ | +| `BesuIBFT2LightClient.sol` | Besu IBFT 2.0 light client for header-validator mode with weak-subjectivity updates and EVM proof verification, following the YUI + prover sealing-header verification model. | ✅ | +| `BesuQBFTLightClient.sol` | Besu QBFT light client for header-validator mode with weak-subjectivity updates and EVM proof verification, following the YUI + prover sealing-header verification model. | ✅ | +| `DummyLightClient.sol` | Insecure dummy light client for local/dev/testing use. Accepts arbitrary updates and answers membership/non-membership from supplied state without proof verification. | 🧪 | | `ICS27GMP.sol` | IBC General Message Passing via Interchain Accounts. | ✅ | | `AttestationLightClient.sol` | The multisig contract implementing IBC Light Client specs. | ✅ | | `utils/IFTBaseUpgradeable.sol` | Interchain Fungible Token standard. Mint and burn alternative to ICS-20. | ⏳ | @@ -316,6 +319,7 @@ Note: These gas benchmarks are with Groth16. IBC is a peer-to-peer, light-client-based interoperability protocol. This repository contains the following light clients: - **SP1 Tendermint Light Client** – Verifies the consensus state of a Cosmos SDK chain powered by SP1 and `tendermint-rs`. (Solidity) +- **Besu IBFT 2.0 / QBFT Light Clients** – Verify Besu BFT headers in header-validator mode, track the counterparty `ICS26Router` account storage root, and verify EVM account/storage proofs for Eureka commitments. (Solidity) - [**Ethereum Light Client**](./ibc-solidity/programs/cw-ics08-wasm-eth/README.md) – Verifies the consensus state of the Ethereum chain. (CosmWasm) - **Attestation Light Client** – A multisig that can be used if the counterparty chain does not have a light client protocol. (Solidity and Solana) - **Solana Tendermint Light Client** - Verifies the consensus state of a Cosmos SDK chain powered by `tendermint-rs`. (Solana) diff --git a/e2e/interchaintestv8/AGENTS.md b/e2e/interchaintestv8/AGENTS.md new file mode 100644 index 000000000..4dac2d3e2 --- /dev/null +++ b/e2e/interchaintestv8/AGENTS.md @@ -0,0 +1,21 @@ +# AGENTS.md + +This subtree contains the Go end-to-end test suites that drive local Ethereum, Cosmos, and Solana environments through interchaintest. + +Look here first: +- `e2e/interchaintestv8/README.md` +- `e2e/interchaintestv8/go.mod` +- the relevant suite entrypoint (`ibc_eureka_test.go`, `relayer_test.go`, `sp1_ics07_test.go`, `solana_test.go`, etc.) + +Use the smallest relevant validation from the repo root: +- Single targeted test: `just test-e2e TestWithSuite/Test_Name` +- Common wrappers: `just test-e2e-eureka`, `just test-e2e-relayer`, `just test-e2e-cosmos-relayer`, `just test-e2e-sp1-ics07` +- Solana e2e wrappers: `just test-e2e-solana`, `just test-e2e-solana-gmp`, `just test-e2e-solana-ift`, `just test-e2e-solana-upgrade`, `just test-e2e-solana-attestation` +- Go lint for this subtree lives in `just lint-go`; see `justfile` for the other suite wrappers + +Local constraints: +- Prefer the smallest targeted test; full e2e runs are slow and environment-dependent. +- Local runs expect `.env` set up from `.env.example`; `just test-e2e` installs the relayer, and `just test-e2e-sp1-ics07` also installs the operator. +- If contract interfaces or ABI-exposed types change, run `just generate-abi` before e2e validation. +- If Solana IDLs change, run `just generate-solana-types`; if `.proto` files change, run `just generate-buf`. +- Do not hand-edit generated code under `e2e/interchaintestv8/types/` or `e2e/interchaintestv8/solana/go-anchor/`. diff --git a/e2e/interchaintestv8/README.md b/e2e/interchaintestv8/README.md index 17a01aed3..0d229b70a 100644 --- a/e2e/interchaintestv8/README.md +++ b/e2e/interchaintestv8/README.md @@ -29,3 +29,82 @@ just test-e2e TestWithIbcEurekaTestSuite/Test_Deploy # Alternatively: just test-e2e-eureka Test_Deploy ``` + +## Besu QBFT mode + +Set `ETH_TESTNET_TYPE=besu-qbft` to start a real 4-validator Besu QBFT network. + +### Supported in this mode + +This pass supports the following Besu configuration: + +- `ETH_TESTNET_TYPE=besu-qbft` +- `ETH_LC_ON_COSMOS=attestor-native` +- `COSMOS_LC_ON_ETH=sp1` +- `SP1_PROVER=mock` + +Validated coverage in this mode: + +- Besu chain bring-up +- contract deployment +- `eth_getProof` smoke coverage +- Dockerized Ethereum attestors reading Besu RPC +- relayer startup and client creation through `Test_Deploy` +- one-way Ethereum → Cosmos ICS20 transfer, including acknowledgement relay back to Ethereum + +### Not supported + +- `ETH_LC_ON_COSMOS=full` +- beacon-chain-based Ethereum verification on Cosmos +- full roundtrip Ethereum ↔ Cosmos ICS20 transfer in Besu mode + +### Focused local test commands + +From the repo root, run: + +```shell +# Besu bring-up, deploy, and proof smoke coverage +ETH_TESTNET_TYPE=besu-qbft \ +just test-e2e TestBesuQBFTChainBringUpAndDeploy + +# Full harness validation in the supported Besu mode +ETH_TESTNET_TYPE=besu-qbft \ +ETH_LC_ON_COSMOS=attestor-native \ +COSMOS_LC_ON_ETH=sp1 \ +SP1_PROVER=mock \ +just test-e2e TestWithIbcEurekaTestSuite/Test_Deploy + +# Focused one-way Ethereum -> Cosmos transfer in the supported Besu mode +ETH_TESTNET_TYPE=besu-qbft \ +ETH_LC_ON_COSMOS=attestor-native \ +COSMOS_LC_ON_ETH=sp1 \ +SP1_PROVER=mock \ +just test-e2e TestWithIbcEurekaTestSuite/Test_ICS20TransferERC20TokenFromEthereumToCosmos +``` + +## Focused Besu ↔ Besu e2e + +This focused suite starts two independent Besu QBFT networks, deploys Eureka contracts on both, starts the Rust relayer with `besu_to_besu` in both directions, deploys and registers Besu light clients on both chains, and verifies a one-way A → B ICS20 transfer plus the B → A acknowledgement relay using real Besu proofs. + +### Focused local test commands + +From the repo root, run: + +```shell +# Single Besu QBFT bring-up and deploy smoke test after helper changes +just test-e2e TestBesuQBFTChainBringUpAndDeploy + +# Dual-Besu deploy / client-registration path +just test-e2e TestWithBesuToBesuTestSuite/Test_Deploy + +# One-way Besu A -> Besu B ICS20 transfer with acknowledgement relay back to A +just test-e2e TestWithBesuToBesuTestSuite/Test_ICS20TransferERC20FromChainAToChainB + +# Regenerate the QBFT light-client fixture used by test/besu-bft/* +GENERATE_BESU_LIGHT_CLIENT_FIXTURES=true \ +just test-e2e TestWithBesuToBesuTestSuite/Test_ICS20TransferERC20FromChainAToChainB +``` + +When `GENERATE_BESU_LIGHT_CLIENT_FIXTURES=true` is set, the focused Besu↔Besu transfer test writes: + +- `test/besu-bft/fixtures/qbft.json` diff --git a/e2e/interchaintestv8/attestor/setup.go b/e2e/interchaintestv8/attestor/setup.go index 9cf930e5b..08101c754 100644 --- a/e2e/interchaintestv8/attestor/setup.go +++ b/e2e/interchaintestv8/attestor/setup.go @@ -203,6 +203,7 @@ func SetupAttestors(ctx context.Context, t *testing.T, params SetupParams) Setup // chainType should be ChainTypeEvm for PoW chains or ChainTypeCosmos for PoS chains. func SetupEthAttestors(ctx context.Context, t *testing.T, client *dockerclient.Client, networkID, ethRPC, ics26Address string, chainType ChainType) SetupResult { t.Helper() + require.NotEmpty(t, ethRPC, "Ethereum attestors require a Docker-reachable Ethereum RPC URL") return SetupAttestors(ctx, t, SetupParams{ NumAttestors: testvalues.NumAttestors, KeystorePathTemplate: testvalues.AttestorKeystorePathTemplate, diff --git a/e2e/interchaintestv8/besu_qbft_test.go b/e2e/interchaintestv8/besu_qbft_test.go new file mode 100644 index 000000000..26b92f169 --- /dev/null +++ b/e2e/interchaintestv8/besu_qbft_test.go @@ -0,0 +1,73 @@ +package main + +import ( + "context" + "os" + "testing" + + ethcommon "github.com/ethereum/go-ethereum/common" + "github.com/stretchr/testify/require" + + interchaintest "github.com/cosmos/interchaintest/v11" + + "github.com/srdtrk/solidity-ibc-eureka/e2e/v8/chainconfig" + "github.com/srdtrk/solidity-ibc-eureka/e2e/v8/ethereum" + "github.com/srdtrk/solidity-ibc-eureka/e2e/v8/testvalues" +) + +func TestBesuQBFTChainBringUpAndDeploy(t *testing.T) { + ctx := context.Background() + + _, networkID := interchaintest.DockerSetup(t) + + chain, err := chainconfig.SpinUpBesuQBFT(ctx, chainconfig.BesuQBFTParams{ + ChainID: 1337, + Subnet: "10.42.0.0/16", + Gateway: "10.42.0.1", + ValidatorIPs: [4]string{"10.42.0.2", "10.42.0.3", "10.42.0.4", "10.42.0.5"}, + DockerRPCAlias: "besu-qbft-rpc", + InterchainNetworkID: networkID, + }) + require.NoError(t, err) + t.Cleanup(func() { + cleanupCtx := context.Background() + if t.Failed() { + _ = chain.DumpLogs(cleanupCtx) + } + chain.Destroy(cleanupCtx) + }) + + cwd, err := os.Getwd() + require.NoError(t, err) + require.NoError(t, os.Chdir("../..")) + t.Cleanup(func() { + require.NoError(t, os.Chdir(cwd)) + }) + + require.Equal(t, "http://besu-qbft-rpc:8545", chain.DockerRPC) + + eth, err := ethereum.NewEthereum(ctx, chain.RPC, nil, chain.Faucet) + require.NoError(t, err) + + latestBlock, err := eth.RPCClient.BlockNumber(ctx) + require.NoError(t, err) + require.Greater(t, latestBlock, uint64(0)) + + var validators []ethcommon.Address + err = eth.RPCClient.Client().CallContext(ctx, &validators, "qbft_getValidatorsByBlockNumber", "latest") + require.NoError(t, err) + require.Len(t, validators, 4) + + stdout, err := eth.ForgeScript(chain.Faucet, testvalues.E2EDeployScriptPath) + require.NoError(t, err) + + contracts, err := ethereum.GetEthContractsFromDeployOutput(string(stdout)) + require.NoError(t, err) + require.NotEmpty(t, contracts.Ics26Router) + require.NotEmpty(t, contracts.Ics20Transfer) + require.NotEmpty(t, contracts.Erc20) + + proof, err := eth.GetProof(ctx, ethcommon.HexToAddress(contracts.Ics26Router), nil, "latest") + require.NoError(t, err) + require.NotEmpty(t, proof.AccountProof) +} diff --git a/e2e/interchaintestv8/besu_to_besu_test.go b/e2e/interchaintestv8/besu_to_besu_test.go new file mode 100644 index 000000000..dd70c3aff --- /dev/null +++ b/e2e/interchaintestv8/besu_to_besu_test.go @@ -0,0 +1,572 @@ +package main + +import ( + "context" + "crypto/ecdsa" + "fmt" + "math/big" + "os" + "path/filepath" + "strconv" + "strings" + "testing" + "time" + + sdkmath "cosmossdk.io/math" + + "github.com/cosmos/interchaintest/v11/testutil" + "github.com/stretchr/testify/suite" + + "github.com/ethereum/go-ethereum/accounts/abi/bind" + ethcommon "github.com/ethereum/go-ethereum/common" + ethtypes "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/crypto" + + "github.com/cosmos/solidity-ibc-eureka/packages/go-abigen/ibcerc20" + "github.com/cosmos/solidity-ibc-eureka/packages/go-abigen/ics20transfer" + "github.com/cosmos/solidity-ibc-eureka/packages/go-abigen/ics26router" + + "github.com/srdtrk/solidity-ibc-eureka/e2e/v8/chainconfig" + "github.com/srdtrk/solidity-ibc-eureka/e2e/v8/e2esuite" + "github.com/srdtrk/solidity-ibc-eureka/e2e/v8/ethereum" + "github.com/srdtrk/solidity-ibc-eureka/e2e/v8/proofapi" + "github.com/srdtrk/solidity-ibc-eureka/e2e/v8/testvalues" + e2etypes "github.com/srdtrk/solidity-ibc-eureka/e2e/v8/types" + "github.com/srdtrk/solidity-ibc-eureka/e2e/v8/types/erc20" + proofapitypes "github.com/srdtrk/solidity-ibc-eureka/e2e/v8/types/proofapi" +) + +const ( + besuToBesuChainAID = 1337 + besuToBesuChainBID = 1338 + + besuToBesuClientOnA = "besu-chain-b" + besuToBesuClientOnB = "besu-chain-a" + + besuToBesuConsensusTypeQBFT = "qbft" + + besuToBesuForgeDeployAttempts = 3 + besuToBesuDeployStableBlocks = 3 +) + +var ( + besuToBesuChainAIPs = [4]string{"10.42.0.2", "10.42.0.3", "10.42.0.4", "10.42.0.5"} + besuToBesuChainBIPs = [4]string{"10.43.0.2", "10.43.0.3", "10.43.0.4", "10.43.0.5"} +) + +type besuToBesuChainState struct { + network chainconfig.BesuQBFTChain + eth ethereum.Ethereum + contractAddresses ethereum.DeployedContracts + ics26 *ics26router.Contract + ics20 *ics20transfer.Contract + erc20 *erc20.Contract + deployer *ecdsa.PrivateKey + user *ecdsa.PrivateKey + relayerSubmitter *ecdsa.PrivateKey + clientAddress ethcommon.Address +} + +type BesuToBesuTestSuite struct { + suite.Suite + + cwd string + relayerConfigPath string + relayerProcess *os.Process + relayerClient proofapitypes.ProofApiServiceClient + besuFixtureGenerator *e2etypes.BesuFixtureGenerator + + chainA besuToBesuChainState + chainB besuToBesuChainState +} + +func TestWithBesuToBesuTestSuite(t *testing.T) { + suite.Run(t, new(BesuToBesuTestSuite)) +} + +func (s *BesuToBesuTestSuite) SetupSuite() { + ctx := context.Background() + + if os.Getenv(testvalues.EnvKeyRustLog) == "" { + os.Setenv(testvalues.EnvKeyRustLog, testvalues.EnvValueRustLog_Info) + } + + var err error + s.cwd, err = os.Getwd() + s.Require().NoError(err) + s.Require().NoError(os.Chdir("../..")) + + s.chainA = s.spinUpChain(ctx, chainconfig.BesuQBFTParams{ + ChainID: besuToBesuChainAID, + Subnet: "10.42.0.0/16", + Gateway: "10.42.0.1", + ValidatorIPs: besuToBesuChainAIPs, + }) + defer func() { + if s.chainA.eth.RPCClient == nil { + s.chainA.network.Destroy(context.Background()) + } + }() + + s.chainB = s.spinUpChain(ctx, chainconfig.BesuQBFTParams{ + ChainID: besuToBesuChainBID, + Subnet: "10.43.0.0/16", + Gateway: "10.43.0.1", + ValidatorIPs: besuToBesuChainBIPs, + }) + defer func() { + if s.chainB.eth.RPCClient == nil { + s.chainB.network.Destroy(context.Background()) + } + }() + + s.besuFixtureGenerator = e2etypes.NewBesuFixtureGenerator() + + s.createUsers(&s.chainA) + s.createUsers(&s.chainB) + + s.deployContracts(&s.chainA) + s.deployContracts(&s.chainB) + + s.startRelayer() + s.connectRelayer() + + s.createAndRegisterBesuClient(&s.chainB, &s.chainA, besuToBesuClientOnA, besuToBesuClientOnB) + s.createAndRegisterBesuClient(&s.chainA, &s.chainB, besuToBesuClientOnB, besuToBesuClientOnA) +} + +func (s *BesuToBesuTestSuite) TearDownSuite() { + ctx := context.Background() + + if s.T() != nil && s.T().Failed() { + _ = s.chainA.network.DumpLogs(ctx) + _ = s.chainB.network.DumpLogs(ctx) + } + + if s.relayerProcess != nil { + _ = s.relayerProcess.Kill() + } + if s.relayerConfigPath != "" { + _ = os.Remove(s.relayerConfigPath) + } + + s.chainB.network.Destroy(ctx) + s.chainA.network.Destroy(ctx) + + if s.cwd != "" { + _ = os.Chdir(s.cwd) + } +} + +func (s *BesuToBesuTestSuite) Test_Deploy() { + infoAB, err := s.relayerClient.Info(context.Background(), &proofapitypes.InfoRequest{ + SrcChain: s.chainA.eth.ChainID.String(), + DstChain: s.chainB.eth.ChainID.String(), + }) + s.Require().NoError(err) + s.Require().Equal(s.chainA.eth.ChainID.String(), infoAB.SourceChain.ChainId) + s.Require().Equal(s.chainB.eth.ChainID.String(), infoAB.TargetChain.ChainId) + + infoBA, err := s.relayerClient.Info(context.Background(), &proofapitypes.InfoRequest{ + SrcChain: s.chainB.eth.ChainID.String(), + DstChain: s.chainA.eth.ChainID.String(), + }) + s.Require().NoError(err) + s.Require().Equal(s.chainB.eth.ChainID.String(), infoBA.SourceChain.ChainId) + s.Require().Equal(s.chainA.eth.ChainID.String(), infoBA.TargetChain.ChainId) + + transferOnA, err := s.chainA.ics26.GetIBCApp(nil, "transfer") + s.Require().NoError(err) + s.Require().Equal(strings.ToLower(s.chainA.contractAddresses.Ics20Transfer), strings.ToLower(transferOnA.Hex())) + + transferOnB, err := s.chainB.ics26.GetIBCApp(nil, "transfer") + s.Require().NoError(err) + s.Require().Equal(strings.ToLower(s.chainB.contractAddresses.Ics20Transfer), strings.ToLower(transferOnB.Hex())) + + clientOnA, err := s.chainA.ics26.GetClient(nil, besuToBesuClientOnA) + s.Require().NoError(err) + s.Require().Equal(s.chainA.clientAddress, clientOnA) + clientOnB, err := s.chainB.ics26.GetClient(nil, besuToBesuClientOnB) + s.Require().NoError(err) + s.Require().Equal(s.chainB.clientAddress, clientOnB) + s.Require().NotEqual(ethcommon.Address{}, clientOnA) + s.Require().NotEqual(ethcommon.Address{}, clientOnB) +} + +func (s *BesuToBesuTestSuite) Test_ICS20TransferERC20FromChainAToChainB() { + ctx := context.Background() + transferAmount := big.NewInt(testvalues.TransferAmount) + userAddressA := crypto.PubkeyToAddress(s.chainA.user.PublicKey) + userAddressB := crypto.PubkeyToAddress(s.chainB.user.PublicKey) + ics20AddressA := ethcommon.HexToAddress(s.chainA.contractAddresses.Ics20Transfer) + ics26AddressA := ethcommon.HexToAddress(s.chainA.contractAddresses.Ics26Router) + ics26AddressB := ethcommon.HexToAddress(s.chainB.contractAddresses.Ics26Router) + erc20AddressA := ethcommon.HexToAddress(s.chainA.contractAddresses.Erc20) + + fundTx, err := s.chainA.erc20.Transfer(s.mustTransactOpts(&s.chainA, s.chainA.eth.Faucet), userAddressA, testvalues.StartingERC20Balance) + s.Require().NoError(err) + fundReceipt, err := s.chainA.eth.GetTxReciept(ctx, fundTx.Hash()) + s.Require().NoError(err) + s.Require().Equal(ethtypes.ReceiptStatusSuccessful, fundReceipt.Status) + + approveTx, err := s.chainA.erc20.Approve(s.mustTransactOpts(&s.chainA, s.chainA.user), ics20AddressA, transferAmount) + s.Require().NoError(err) + approveReceipt, err := s.chainA.eth.GetTxReciept(ctx, approveTx.Hash()) + s.Require().NoError(err) + s.Require().Equal(ethtypes.ReceiptStatusSuccessful, approveReceipt.Status) + + timeout := uint64(time.Now().Add(30 * time.Minute).Unix()) + sendTx, err := s.chainA.ics20.SendTransfer(s.mustTransactOpts(&s.chainA, s.chainA.user), ics20transfer.IICS20TransferMsgsSendTransferMsg{ + Denom: erc20AddressA, + Amount: transferAmount, + Receiver: strings.ToLower(userAddressB.Hex()), + TimeoutTimestamp: timeout, + SourceClient: besuToBesuClientOnA, + DestPort: "transfer", + Memo: "", + }) + s.Require().NoError(err) + sendReceipt, err := s.chainA.eth.GetTxReciept(ctx, sendTx.Hash()) + s.Require().NoError(err) + s.Require().Equal(ethtypes.ReceiptStatusSuccessful, sendReceipt.Status) + + sendEvent, err := e2esuite.GetEvmEvent(sendReceipt, s.chainA.ics26.ParseSendPacket) + s.Require().NoError(err) + + escrowAddress, err := s.chainA.ics20.GetEscrow(nil, besuToBesuClientOnA) + s.Require().NoError(err) + escrowBalance, err := s.chainA.erc20.BalanceOf(nil, escrowAddress) + s.Require().NoError(err) + s.Require().Equal(0, transferAmount.Cmp(escrowBalance)) + + userBalanceA, err := s.chainA.erc20.BalanceOf(nil, userAddressA) + s.Require().NoError(err) + expectedBalanceA := new(big.Int).Sub(new(big.Int).Set(testvalues.StartingERC20Balance), transferAmount) + s.Require().Equal(0, expectedBalanceA.Cmp(userBalanceA)) + + relayAB, err := s.relayerClient.RelayByTx(context.Background(), &proofapitypes.RelayByTxRequest{ + SrcChain: s.chainA.eth.ChainID.String(), + DstChain: s.chainB.eth.ChainID.String(), + SourceTxIds: [][]byte{sendTx.Hash().Bytes()}, + SrcClientId: besuToBesuClientOnA, + DstClientId: besuToBesuClientOnB, + }) + s.Require().NoError(err) + s.Require().NotEmpty(relayAB.Tx) + s.Require().Equal(strings.ToLower(s.chainB.contractAddresses.Ics26Router), strings.ToLower(relayAB.Address)) + + recvReceipt, err := s.chainB.eth.BroadcastTx(ctx, s.chainB.relayerSubmitter, 15_000_000, &ics26AddressB, relayAB.Tx) + s.Require().NoError(err) + s.Require().Equal(ethtypes.ReceiptStatusSuccessful, recvReceipt.Status) + + writeAckEvent, err := e2esuite.GetEvmEvent(recvReceipt, s.chainB.ics26.ParseWriteAcknowledgement) + s.Require().NoError(err) + + ibcDenomOnB := fmt.Sprintf( + "%s/%s/%s", + writeAckEvent.Packet.Payloads[0].DestPort, + writeAckEvent.Packet.DestClient, + strings.ToLower(erc20AddressA.Hex()), + ) + ibcERC20AddressOnB, err := s.chainB.ics20.IbcERC20Contract(nil, ibcDenomOnB) + s.Require().NoError(err) + ibcERC20OnB, err := ibcerc20.NewContract(ibcERC20AddressOnB, s.chainB.eth.RPCClient) + s.Require().NoError(err) + + userBalanceB, err := ibcERC20OnB.BalanceOf(nil, userAddressB) + s.Require().NoError(err) + s.Require().Equal(0, transferAmount.Cmp(userBalanceB)) + + ackRelay, err := s.relayerClient.RelayByTx(context.Background(), &proofapitypes.RelayByTxRequest{ + SrcChain: s.chainB.eth.ChainID.String(), + DstChain: s.chainA.eth.ChainID.String(), + SourceTxIds: [][]byte{recvReceipt.TxHash.Bytes()}, + SrcClientId: besuToBesuClientOnB, + DstClientId: besuToBesuClientOnA, + }) + s.Require().NoError(err) + s.Require().NotEmpty(ackRelay.Tx) + s.Require().Equal(strings.ToLower(s.chainA.contractAddresses.Ics26Router), strings.ToLower(ackRelay.Address)) + + ackReceipt, err := s.chainA.eth.BroadcastTx(ctx, s.chainA.relayerSubmitter, 15_000_000, &ics26AddressA, ackRelay.Tx) + s.Require().NoError(err) + s.Require().Equal(ethtypes.ReceiptStatusSuccessful, ackReceipt.Status) + + _, err = e2esuite.GetEvmEvent(ackReceipt, s.chainA.ics26.ParseAckPacket) + s.Require().NoError(err) + + if s.besuFixtureGenerator.Enabled { + sendHeight := sendReceipt.BlockNumber.Uint64() + s.Require().Greater(sendHeight, uint64(2)) + s.Require().Greater(ackReceipt.BlockNumber.Uint64(), sendHeight) + s.Require().NoError(s.besuFixtureGenerator.GenerateAndSaveQBFTFixture(ctx, e2etypes.GenerateQBFTFixtureParams{ + SourceChain: &s.chainA.eth, + RouterAddress: ics26AddressA, + Packet: sendEvent.Packet, + InitialTrustedHeight: sendHeight - 2, + UpdateHeight11: sendHeight - 1, + UpdateHeight12: sendHeight, + SyntheticSourceHeight: ackReceipt.BlockNumber.Uint64(), + TrustingPeriod: uint64(testvalues.DefaultTrustPeriod), + MaxClockDrift: uint64(testvalues.DefaultMaxClockDrift), + })) + } +} + +func (s *BesuToBesuTestSuite) spinUpChain(ctx context.Context, params chainconfig.BesuQBFTParams) besuToBesuChainState { + network, err := chainconfig.SpinUpBesuQBFT(ctx, params) + s.Require().NoError(err) + + ethChain, err := ethereum.NewEthereum(ctx, network.RPC, nil, network.Faucet) + s.Require().NoError(err) + + return besuToBesuChainState{ + network: network, + eth: ethChain, + } +} + +func (s *BesuToBesuTestSuite) createUsers(chain *besuToBesuChainState) { + var err error + chain.deployer, err = chain.eth.CreateAndFundUser() + s.Require().NoError(err) + chain.user, err = chain.eth.CreateAndFundUser() + s.Require().NoError(err) + chain.relayerSubmitter, err = chain.eth.CreateAndFundUser() + s.Require().NoError(err) +} + +func (s *BesuToBesuTestSuite) deployContracts(chain *besuToBesuChainState) { + os.Setenv(testvalues.EnvKeyEthRPC, chain.eth.RPC) + + stdout, err := s.runBesuForgeDeploy(chain) + s.Require().NoError(err) + + chain.contractAddresses, err = ethereum.GetEthContractsFromDeployOutput(string(stdout)) + s.Require().NoError(err) + + chain.ics26, err = ics26router.NewContract(ethcommon.HexToAddress(chain.contractAddresses.Ics26Router), chain.eth.RPCClient) + s.Require().NoError(err) + chain.ics20, err = ics20transfer.NewContract(ethcommon.HexToAddress(chain.contractAddresses.Ics20Transfer), chain.eth.RPCClient) + s.Require().NoError(err) + chain.erc20, err = erc20.NewContract(ethcommon.HexToAddress(chain.contractAddresses.Erc20), chain.eth.RPCClient) + s.Require().NoError(err) +} + +func (s *BesuToBesuTestSuite) runBesuForgeDeploy(chain *besuToBesuChainState) ([]byte, error) { + var ( + stdout []byte + err error + ) + + for attempt := 1; attempt <= besuToBesuForgeDeployAttempts; attempt++ { + if err := waitForBesuDeployReady(context.Background(), &chain.eth); err != nil { + return stdout, err + } + + stdout, err = chain.eth.ForgeScript(chain.deployer, testvalues.E2EDeployScriptPath) + if err == nil { + return stdout, nil + } + + if attempt == besuToBesuForgeDeployAttempts || !isRetriableBesuForgeDeployError(stdout, err) { + return stdout, err + } + + fmt.Printf("Besu forge deploy attempt %d/%d hit a transient RPC/txpool error; retrying after chain stability check: %v\n", attempt, besuToBesuForgeDeployAttempts, err) + time.Sleep(10 * time.Second) + } + + return stdout, err +} + +func waitForBesuDeployReady(ctx context.Context, ethChain *ethereum.Ethereum) error { + faucetAddress := crypto.PubkeyToAddress(ethChain.Faucet.PublicKey) + var ( + stableStartBlock uint64 + lastErr error + ) + + err := testutil.WaitForCondition(2*time.Minute, 2*time.Second, func() (bool, error) { + syncProgress, err := ethChain.RPCClient.SyncProgress(ctx) + if err != nil { + lastErr = err + stableStartBlock = 0 + return false, nil + } + if syncProgress != nil { + stableStartBlock = 0 + return false, nil + } + + blockNumber, err := ethChain.RPCClient.BlockNumber(ctx) + if err != nil || blockNumber == 0 { + lastErr = err + stableStartBlock = 0 + return false, nil + } + + if stableStartBlock == 0 { + stableStartBlock = blockNumber + return false, nil + } + if blockNumber < stableStartBlock+besuToBesuDeployStableBlocks { + return false, nil + } + + if err := ethChain.SendEth(ethChain.Faucet, faucetAddress, sdkmath.ZeroInt()); err != nil { + lastErr = err + stableStartBlock = 0 + return false, nil + } + + return true, nil + }) + if err != nil && lastErr != nil { + return fmt.Errorf("%w (last deploy readiness probe error: %v)", err, lastErr) + } + return err +} + +func isRetriableBesuForgeDeployError(stdout []byte, err error) bool { + if err == nil { + return false + } + + output := string(stdout) + "\n" + err.Error() + retriableMessages := []string{ + "Some transactions were discarded by the RPC node", + "tx is still known to the node", + "attempt to divide by zero", + "forge script timed out", + } + for _, message := range retriableMessages { + if strings.Contains(output, message) { + return true + } + } + + return false +} + +func (s *BesuToBesuTestSuite) startRelayer() { + config := proofapi.NewConfigBuilder(). + BesuToBesu(proofapi.BesuToBesuParams{ + SrcChainID: s.chainA.eth.ChainID.String(), + DstChainID: s.chainB.eth.ChainID.String(), + SrcRPC: s.chainA.eth.RPC, + DstRPC: s.chainB.eth.RPC, + SrcICS26: s.chainA.contractAddresses.Ics26Router, + DstICS26: s.chainB.contractAddresses.Ics26Router, + ConsensusType: besuToBesuConsensusTypeQBFT, + }). + BesuToBesu(proofapi.BesuToBesuParams{ + SrcChainID: s.chainB.eth.ChainID.String(), + DstChainID: s.chainA.eth.ChainID.String(), + SrcRPC: s.chainB.eth.RPC, + DstRPC: s.chainA.eth.RPC, + SrcICS26: s.chainB.contractAddresses.Ics26Router, + DstICS26: s.chainA.contractAddresses.Ics26Router, + ConsensusType: besuToBesuConsensusTypeQBFT, + }). + Build() + + s.relayerConfigPath = filepath.Join(os.TempDir(), fmt.Sprintf("besu-to-besu-relayer-%d.json", time.Now().UnixNano())) + s.Require().NoError(config.GenerateConfigFile(s.relayerConfigPath)) + + var err error + s.relayerProcess, err = proofapi.StartProofAPI(s.relayerConfigPath) + s.Require().NoError(err) +} + +func (s *BesuToBesuTestSuite) connectRelayer() { + var err error + s.relayerClient, err = proofapi.GetGRPCClient(proofapi.DefaultProofAPIGRPCAddress()) + s.Require().NoError(err) + + infoAB := s.waitForRelayerInfo(s.chainA.eth.ChainID.String(), s.chainB.eth.ChainID.String()) + s.Require().Equal(s.chainA.eth.ChainID.String(), infoAB.SourceChain.ChainId) + s.Require().Equal(s.chainB.eth.ChainID.String(), infoAB.TargetChain.ChainId) + + infoBA := s.waitForRelayerInfo(s.chainB.eth.ChainID.String(), s.chainA.eth.ChainID.String()) + s.Require().Equal(s.chainB.eth.ChainID.String(), infoBA.SourceChain.ChainId) + s.Require().Equal(s.chainA.eth.ChainID.String(), infoBA.TargetChain.ChainId) +} + +func (s *BesuToBesuTestSuite) waitForRelayerInfo(srcChainID, dstChainID string) *proofapitypes.InfoResponse { + var ( + info *proofapitypes.InfoResponse + err error + ) + + for range 20 { + info, err = s.relayerClient.Info(context.Background(), &proofapitypes.InfoRequest{ + SrcChain: srcChainID, + DstChain: dstChainID, + }) + if err == nil { + return info + } + time.Sleep(time.Second) + } + + s.Require().NoError(err) + return info +} + +func (s *BesuToBesuTestSuite) createAndRegisterBesuClient( + srcChain *besuToBesuChainState, + dstChain *besuToBesuChainState, + dstClientID string, + counterpartyClientID string, +) { + resp, err := s.relayerClient.CreateClient(context.Background(), &proofapitypes.CreateClientRequest{ + SrcChain: srcChain.eth.ChainID.String(), + DstChain: dstChain.eth.ChainID.String(), + Parameters: map[string]string{ + testvalues.ParameterKey_TrustingPeriod: strconv.Itoa(testvalues.DefaultTrustPeriod), + testvalues.ParameterKey_MaxClockDrift: strconv.Itoa(testvalues.DefaultMaxClockDrift), + testvalues.ParameterKey_RoleManager: dstChain.contractAddresses.Ics26Router, + }, + }) + s.Require().NoError(err) + s.Require().NotEmpty(resp.Tx) + + createClientReceipt, err := dstChain.eth.BroadcastTx(context.Background(), dstChain.relayerSubmitter, 15_000_000, nil, resp.Tx) + s.Require().NoError(err) + s.Require().Equal(ethtypes.ReceiptStatusSuccessful, createClientReceipt.Status) + s.Require().NotEqual(ethcommon.Address{}, createClientReceipt.ContractAddress) + + counterpartyInfo := ics26router.IICS02ClientMsgsCounterpartyInfo{ + ClientId: counterpartyClientID, + MerklePrefix: [][]byte{[]byte("")}, + } + addClientTx, err := dstChain.ics26.AddClient( + s.mustTransactOpts(dstChain, dstChain.deployer), + dstClientID, + counterpartyInfo, + createClientReceipt.ContractAddress, + ) + s.Require().NoError(err) + + addClientReceipt, err := dstChain.eth.GetTxReciept(context.Background(), addClientTx.Hash()) + s.Require().NoError(err) + s.Require().Equal(ethtypes.ReceiptStatusSuccessful, addClientReceipt.Status) + + addClientEvent, err := e2esuite.GetEvmEvent(addClientReceipt, dstChain.ics26.ParseICS02ClientAdded) + s.Require().NoError(err) + s.Require().Equal(dstClientID, addClientEvent.ClientId) + s.Require().Equal(createClientReceipt.ContractAddress, addClientEvent.Client) + + registeredClient, err := dstChain.ics26.GetClient(nil, dstClientID) + s.Require().NoError(err) + s.Require().Equal(createClientReceipt.ContractAddress, registeredClient) + + dstChain.clientAddress = createClientReceipt.ContractAddress +} + +func (s *BesuToBesuTestSuite) mustTransactOpts(chain *besuToBesuChainState, key *ecdsa.PrivateKey) *bind.TransactOpts { + txOpts, err := chain.eth.GetTransactOpts(key) + s.Require().NoError(err) + return txOpts +} diff --git a/e2e/interchaintestv8/chainconfig/besu_qbft.go b/e2e/interchaintestv8/chainconfig/besu_qbft.go new file mode 100644 index 000000000..0958813a9 --- /dev/null +++ b/e2e/interchaintestv8/chainconfig/besu_qbft.go @@ -0,0 +1,436 @@ +package chainconfig + +import ( + "context" + "crypto/ecdsa" + "embed" + "encoding/json" + "fmt" + "io" + "io/fs" + "math/big" + "os" + "path/filepath" + "strings" + "time" + + dockernetwork "github.com/docker/docker/api/types/network" + dockerclient "github.com/moby/moby/client" + + "github.com/ethereum/go-ethereum/common" + ethtypes "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/crypto" + "github.com/ethereum/go-ethereum/ethclient" + "github.com/testcontainers/testcontainers-go/modules/compose" + "github.com/testcontainers/testcontainers-go/wait" + + "github.com/cosmos/interchaintest/v11/testutil" + + "github.com/srdtrk/solidity-ibc-eureka/e2e/v8/testvalues" +) + +const ( + besuQBFTComposeFile = "docker-compose.yml" + besuQBFTProjectName = "besu-qbft" + + defaultBesuQBFTSubnet = "10.42.0.0/16" + defaultBesuQBFTGateway = "10.42.0.1" + + besuQBFTReadyStableBlocks = 6 + besuQBFTTxProbeReceiptTimeout = 30 * time.Second +) + +var defaultBesuQBFTValidatorIPs = [4]string{"10.42.0.2", "10.42.0.3", "10.42.0.4", "10.42.0.5"} + +//go:embed testdata/besu/qbft +var besuQBFTAssets embed.FS + +var besuQBFTServices = []string{"validator1", "validator2", "validator3", "validator4"} + +type BesuQBFTParams struct { + ChainID uint64 + Subnet string + Gateway string + ValidatorIPs [4]string + DockerRPCAlias string + InterchainNetworkID string +} + +type BesuQBFTChain struct { + RPC string + DockerRPC string + Faucet *ecdsa.PrivateKey + + stack *compose.DockerCompose + projectDir string +} + +func SpinUpBesuQBFT(ctx context.Context, params BesuQBFTParams) (chain BesuQBFTChain, err error) { + faucet, err := crypto.HexToECDSA(testvalues.E2EDeployerPrivateKeyHex) + if err != nil { + return BesuQBFTChain{}, fmt.Errorf("parse besu qbft faucet key: %w", err) + } + + projectDir, err := os.MkdirTemp("", "besu-qbft-*") + if err != nil { + return BesuQBFTChain{}, fmt.Errorf("create besu qbft temp dir: %w", err) + } + + chain = BesuQBFTChain{ + Faucet: faucet, + projectDir: projectDir, + } + defer func() { + if err != nil { + chain.Destroy(context.Background()) + } + }() + + if err := materializeBesuQBFTAssets(projectDir); err != nil { + return BesuQBFTChain{}, fmt.Errorf("materialize besu qbft assets: %w", err) + } + + if err := patchBesuQBFTGenesis(filepath.Join(projectDir, "genesis.json"), params.ChainID); err != nil { + return BesuQBFTChain{}, fmt.Errorf("patch besu qbft genesis: %w", err) + } + + if err := patchBesuQBFTCompose(filepath.Join(projectDir, besuQBFTComposeFile), params); err != nil { + return BesuQBFTChain{}, fmt.Errorf("patch besu qbft compose file: %w", err) + } + + stack, err := compose.NewDockerComposeWith( + compose.StackIdentifier(fmt.Sprintf("%s-%d", besuQBFTProjectName, time.Now().UnixNano())), + compose.WithStackFiles(filepath.Join(projectDir, besuQBFTComposeFile)), + ) + if err != nil { + return BesuQBFTChain{}, fmt.Errorf("create besu qbft compose stack: %w", err) + } + chain.stack = stack + + if err := stack. + WaitForService("validator1", wait.ForListeningPort("8545/tcp")). + Up(ctx, compose.Wait(true)); err != nil { + return BesuQBFTChain{}, fmt.Errorf("start besu qbft compose stack: %w", err) + } + + validator1, err := stack.ServiceContainer(ctx, "validator1") + if err != nil { + return BesuQBFTChain{}, fmt.Errorf("get validator1 container: %w", err) + } + + mappedPort, err := validator1.MappedPort(ctx, "8545/tcp") + if err != nil { + return BesuQBFTChain{}, fmt.Errorf("resolve validator1 rpc port: %w", err) + } + + chain.RPC = fmt.Sprintf("http://127.0.0.1:%s", mappedPort.Port()) + if params.DockerRPCAlias != "" { + chain.DockerRPC = fmt.Sprintf("http://%s:8545", params.DockerRPCAlias) + } + + if params.InterchainNetworkID != "" { + if err := connectBesuQBFTToInterchainNetwork(ctx, params.InterchainNetworkID, validator1.GetContainerID(), params.DockerRPCAlias); err != nil { + return BesuQBFTChain{}, fmt.Errorf("connect besu qbft rpc container to interchain network: %w", err) + } + } + + if err := waitForBesuQBFTReady(ctx, chain.RPC); err != nil { + return BesuQBFTChain{}, fmt.Errorf("wait for besu qbft readiness: %w", err) + } + + if err := waitForBesuQBFTTransactionHandling(ctx, chain.RPC, faucet); err != nil { + return BesuQBFTChain{}, fmt.Errorf("wait for besu qbft transaction handling: %w", err) + } + + return chain, nil +} + +func (c BesuQBFTChain) Destroy(ctx context.Context) { + if c.stack != nil { + if err := c.stack.Down(ctx, compose.RemoveOrphans(true), compose.RemoveVolumes(true)); err != nil { + fmt.Printf("failed to tear down besu qbft stack: %v\n", err) + } + } + + if c.projectDir != "" { + if err := os.RemoveAll(c.projectDir); err != nil { + fmt.Printf("failed to remove besu qbft temp dir %s: %v\n", c.projectDir, err) + } + } +} + +func (c BesuQBFTChain) DumpLogs(ctx context.Context) error { + if c.stack == nil { + return nil + } + + for _, service := range besuQBFTServices { + container, err := c.stack.ServiceContainer(ctx, service) + if err != nil { + return fmt.Errorf("get %s container: %w", service, err) + } + + logs, err := container.Logs(ctx) + if err != nil { + return fmt.Errorf("get %s logs: %w", service, err) + } + + fmt.Printf("===== %s logs =====\n", service) + if _, err := io.Copy(os.Stdout, logs); err != nil { + _ = logs.Close() + return fmt.Errorf("copy %s logs: %w", service, err) + } + fmt.Println() + if err := logs.Close(); err != nil { + return fmt.Errorf("close %s logs: %w", service, err) + } + } + + return nil +} + +func materializeBesuQBFTAssets(dst string) error { + sub, err := fs.Sub(besuQBFTAssets, "testdata/besu/qbft") + if err != nil { + return err + } + + return fs.WalkDir(sub, ".", func(path string, d fs.DirEntry, walkErr error) error { + if walkErr != nil { + return walkErr + } + + target := filepath.Join(dst, path) + if d.IsDir() { + return os.MkdirAll(target, 0o755) + } + + contents, err := fs.ReadFile(sub, path) + if err != nil { + return err + } + + mode := os.FileMode(0o644) + if filepath.Base(path) == "key" || strings.HasPrefix(path, "keys/") { + mode = 0o600 + } + + return os.WriteFile(target, contents, mode) + }) +} + +func patchBesuQBFTGenesis(path string, chainID uint64) error { + contents, err := os.ReadFile(path) + if err != nil { + return err + } + + var genesis map[string]any + if err := json.Unmarshal(contents, &genesis); err != nil { + return err + } + + config, ok := genesis["config"].(map[string]any) + if !ok { + return fmt.Errorf("genesis config missing or invalid") + } + config["chainId"] = chainID + + updated, err := json.MarshalIndent(genesis, "", " ") + if err != nil { + return err + } + updated = append(updated, '\n') + + return os.WriteFile(path, updated, 0o644) +} + +func patchBesuQBFTCompose(path string, params BesuQBFTParams) error { + contents, err := os.ReadFile(path) + if err != nil { + return err + } + + replacer := strings.NewReplacer( + defaultBesuQBFTSubnet, params.Subnet, + defaultBesuQBFTGateway, params.Gateway, + defaultBesuQBFTValidatorIPs[0], params.ValidatorIPs[0], + defaultBesuQBFTValidatorIPs[1], params.ValidatorIPs[1], + defaultBesuQBFTValidatorIPs[2], params.ValidatorIPs[2], + defaultBesuQBFTValidatorIPs[3], params.ValidatorIPs[3], + ) + + return os.WriteFile(path, []byte(replacer.Replace(string(contents))), 0o644) +} + +func connectBesuQBFTToInterchainNetwork(ctx context.Context, interchainNetworkID, containerID, alias string) error { + dockerClient, err := dockerclient.NewClientWithOpts(dockerclient.FromEnv, dockerclient.WithAPIVersionNegotiation()) + if err != nil { + return fmt.Errorf("create docker client: %w", err) + } + defer dockerClient.Close() + + settings := &dockernetwork.EndpointSettings{} + if alias != "" { + settings.Aliases = []string{alias} + } + + return dockerClient.NetworkConnect(ctx, interchainNetworkID, containerID, settings) +} + +func waitForBesuQBFTReady(ctx context.Context, rpcURL string) error { + var ( + stableStartBlock uint64 + lastErr error + ) + + err := testutil.WaitForCondition(3*time.Minute, 2*time.Second, func() (bool, error) { + client, err := ethclient.DialContext(ctx, rpcURL) + if err != nil { + lastErr = err + return false, nil + } + defer client.Close() + + syncProgress, err := client.SyncProgress(ctx) + if err != nil { + lastErr = err + stableStartBlock = 0 + return false, nil + } + if syncProgress != nil { + stableStartBlock = 0 + return false, nil + } + + peerCount, err := client.PeerCount(ctx) + if err != nil { + lastErr = err + stableStartBlock = 0 + return false, nil + } + if peerCount < uint64(len(besuQBFTServices)-1) { + stableStartBlock = 0 + return false, nil + } + + blockNumber, err := client.BlockNumber(ctx) + if err != nil || blockNumber == 0 { + lastErr = err + stableStartBlock = 0 + return false, nil + } + + var validators []common.Address + if err := client.Client().CallContext(ctx, &validators, "qbft_getValidatorsByBlockNumber", "latest"); err != nil { + lastErr = err + stableStartBlock = 0 + return false, nil + } + + if len(validators) != len(besuQBFTServices) { + stableStartBlock = 0 + return false, nil + } + + if stableStartBlock == 0 { + stableStartBlock = blockNumber + return false, nil + } + + return blockNumber >= stableStartBlock+besuQBFTReadyStableBlocks, nil + }) + if err != nil && lastErr != nil { + return fmt.Errorf("%w (last readiness observation: %v)", err, lastErr) + } + return err +} + +func waitForBesuQBFTTransactionHandling(ctx context.Context, rpcURL string, key *ecdsa.PrivateKey) error { + var lastErr error + + err := testutil.WaitForCondition(2*time.Minute, 2*time.Second, func() (bool, error) { + client, err := ethclient.DialContext(ctx, rpcURL) + if err != nil { + lastErr = err + return false, nil + } + defer client.Close() + + txHash, err := sendBesuQBFTProbeTx(ctx, client, key) + if err != nil { + lastErr = err + return false, nil + } + + receipt, err := waitForBesuQBFTProbeReceipt(ctx, client, txHash) + if err != nil { + lastErr = err + return false, nil + } + if receipt.Status != ethtypes.ReceiptStatusSuccessful { + return false, fmt.Errorf("besu qbft transaction probe failed on-chain with status %d", receipt.Status) + } + + return true, nil + }) + if err != nil && lastErr != nil { + return fmt.Errorf("%w (last transaction probe error: %v)", err, lastErr) + } + return err +} + +func sendBesuQBFTProbeTx(ctx context.Context, client *ethclient.Client, key *ecdsa.PrivateKey) (common.Hash, error) { + from := crypto.PubkeyToAddress(key.PublicKey) + + chainID, err := client.ChainID(ctx) + if err != nil { + return common.Hash{}, err + } + + nonce, err := client.PendingNonceAt(ctx, from) + if err != nil { + return common.Hash{}, err + } + + tx := ethtypes.NewTx(ðtypes.DynamicFeeTx{ + ChainID: chainID, + Nonce: nonce, + To: &from, + Value: big.NewInt(0), + Gas: 21_000, + GasFeeCap: big.NewInt(1), + GasTipCap: big.NewInt(1), + }) + + signedTx, err := ethtypes.SignTx(tx, ethtypes.LatestSignerForChainID(chainID), key) + if err != nil { + return common.Hash{}, err + } + if err := client.SendTransaction(ctx, signedTx); err != nil { + return common.Hash{}, err + } + + return signedTx.Hash(), nil +} + +func waitForBesuQBFTProbeReceipt(ctx context.Context, client *ethclient.Client, txHash common.Hash) (*ethtypes.Receipt, error) { + receiptCtx, cancel := context.WithTimeout(ctx, besuQBFTTxProbeReceiptTimeout) + defer cancel() + + ticker := time.NewTicker(time.Second) + defer ticker.Stop() + + for { + receipt, err := client.TransactionReceipt(receiptCtx, txHash) + if err == nil && receipt != nil { + return receipt, nil + } + + select { + case <-receiptCtx.Done(): + return nil, receiptCtx.Err() + case <-ticker.C: + } + } +} diff --git a/e2e/interchaintestv8/chainconfig/testdata/besu/qbft/config.toml b/e2e/interchaintestv8/chainconfig/testdata/besu/qbft/config.toml new file mode 100644 index 000000000..df73eabe6 --- /dev/null +++ b/e2e/interchaintestv8/chainconfig/testdata/besu/qbft/config.toml @@ -0,0 +1,11 @@ +genesis-file="/opt/besu/genesis.json" +data-path="/opt/besu/data" +node-private-key-file="/opt/besu/key" +data-storage-format="BONSAI" +bonsai-limit-trie-logs-enabled=false +rpc-http-enabled=true +rpc-http-host="0.0.0.0" +rpc-http-api=["ETH","NET","QBFT","WEB3","DEBUG"] +host-allowlist=["*"] +rpc-http-cors-origins=["all"] +min-gas-price=0 diff --git a/e2e/interchaintestv8/chainconfig/testdata/besu/qbft/docker-compose.yml b/e2e/interchaintestv8/chainconfig/testdata/besu/qbft/docker-compose.yml new file mode 100644 index 000000000..39d6da379 --- /dev/null +++ b/e2e/interchaintestv8/chainconfig/testdata/besu/qbft/docker-compose.yml @@ -0,0 +1,86 @@ +services: + validator1: + image: hyperledger/besu:26.4.0 + command: + - --config-file=/opt/besu/config.toml + - --identity=validator1 + - --p2p-host=10.42.0.2 + - --p2p-port=30303 + volumes: + - ./config.toml:/opt/besu/config.toml:ro + - ./genesis.json:/opt/besu/genesis.json:ro + - ./keys/validator1/key:/opt/besu/key:ro + - validator1-data:/opt/besu/data + ports: + - "8545" + networks: + qbft_testnet: + ipv4_address: 10.42.0.2 + + validator2: + image: hyperledger/besu:26.4.0 + command: + - --config-file=/opt/besu/config.toml + - --identity=validator2 + - --bootnodes=enode://ad83ac93fcc30a30f3e1bb6467623e45719167be50d13dccd8361cbca478cb540069869d1bae16de0f8b17a28f26f1c6c4dc12e71f240b366c6ff6f02f3fb93e@10.42.0.2:30303 + - --p2p-host=10.42.0.3 + - --p2p-port=30304 + volumes: + - ./config.toml:/opt/besu/config.toml:ro + - ./genesis.json:/opt/besu/genesis.json:ro + - ./keys/validator2/key:/opt/besu/key:ro + - validator2-data:/opt/besu/data + networks: + qbft_testnet: + ipv4_address: 10.42.0.3 + + validator3: + image: hyperledger/besu:26.4.0 + command: + - --config-file=/opt/besu/config.toml + - --identity=validator3 + - --bootnodes=enode://ad83ac93fcc30a30f3e1bb6467623e45719167be50d13dccd8361cbca478cb540069869d1bae16de0f8b17a28f26f1c6c4dc12e71f240b366c6ff6f02f3fb93e@10.42.0.2:30303 + - --p2p-host=10.42.0.4 + - --p2p-port=30305 + volumes: + - ./config.toml:/opt/besu/config.toml:ro + - ./genesis.json:/opt/besu/genesis.json:ro + - ./keys/validator3/key:/opt/besu/key:ro + - validator3-data:/opt/besu/data + networks: + qbft_testnet: + ipv4_address: 10.42.0.4 + + validator4: + image: hyperledger/besu:26.4.0 + command: + - --config-file=/opt/besu/config.toml + - --identity=validator4 + - --bootnodes=enode://ad83ac93fcc30a30f3e1bb6467623e45719167be50d13dccd8361cbca478cb540069869d1bae16de0f8b17a28f26f1c6c4dc12e71f240b366c6ff6f02f3fb93e@10.42.0.2:30303 + - --p2p-host=10.42.0.5 + - --p2p-port=30306 + volumes: + - ./config.toml:/opt/besu/config.toml:ro + - ./genesis.json:/opt/besu/genesis.json:ro + - ./keys/validator4/key:/opt/besu/key:ro + - validator4-data:/opt/besu/data + networks: + qbft_testnet: + ipv4_address: 10.42.0.5 + +networks: + qbft_testnet: + driver: bridge + driver_opts: + com.docker.network.enable_ipv6: "false" + ipam: + driver: default + config: + - subnet: 10.42.0.0/16 + gateway: 10.42.0.1 + +volumes: + validator1-data: + validator2-data: + validator3-data: + validator4-data: diff --git a/e2e/interchaintestv8/chainconfig/testdata/besu/qbft/genesis.json b/e2e/interchaintestv8/chainconfig/testdata/besu/qbft/genesis.json new file mode 100644 index 000000000..85f58aa50 --- /dev/null +++ b/e2e/interchaintestv8/chainconfig/testdata/besu/qbft/genesis.json @@ -0,0 +1,24 @@ +{ + "config": { + "chainId": 1337, + "cancunTime": 0, + "zeroBaseFee": true, + "qbft": { + "blockperiodseconds": 2, + "epochlength": 30000, + "requesttimeoutseconds": 4 + } + }, + "nonce": "0x0", + "timestamp": "0x58ee40ba", + "gasLimit": "0x2faf080", + "difficulty": "0x1", + "mixHash": "0x63746963616c2062797a616e74696e65206661756c7420746f6c6572616e6365", + "coinbase": "0x0000000000000000000000000000000000000000", + "alloc": { + "f39fd6e51aad88f6f4ce6ab8827279cfffb92266": { + "balance": "1000000000000000000000000" + } + }, + "extraData": "0xf87aa00000000000000000000000000000000000000000000000000000000000000000f85494065f139d8a49e9926232cc4435159024cb5064fc940eb968de631abc65322ecdca5dfdf9c6296e52f494543d3796700ee35803a1c43562a69fec08e1e4239420c5edbcf6263cd9e30df395a2b914f6e939b9bac080c0" +} diff --git a/e2e/interchaintestv8/chainconfig/testdata/besu/qbft/keys/validator1/key b/e2e/interchaintestv8/chainconfig/testdata/besu/qbft/keys/validator1/key new file mode 100644 index 000000000..0a70c443d --- /dev/null +++ b/e2e/interchaintestv8/chainconfig/testdata/besu/qbft/keys/validator1/key @@ -0,0 +1 @@ +0x18fddb41c4f6316532162f1c54a0cf4c62562b499c392720f04e7d33e32e88fa diff --git a/e2e/interchaintestv8/chainconfig/testdata/besu/qbft/keys/validator2/key b/e2e/interchaintestv8/chainconfig/testdata/besu/qbft/keys/validator2/key new file mode 100644 index 000000000..43586a8fe --- /dev/null +++ b/e2e/interchaintestv8/chainconfig/testdata/besu/qbft/keys/validator2/key @@ -0,0 +1 @@ +0x9a4cc956527624fba01e932a28f982233b8169d840b72a9089cd0d3da127ccb6 diff --git a/e2e/interchaintestv8/chainconfig/testdata/besu/qbft/keys/validator3/key b/e2e/interchaintestv8/chainconfig/testdata/besu/qbft/keys/validator3/key new file mode 100644 index 000000000..b2049aeca --- /dev/null +++ b/e2e/interchaintestv8/chainconfig/testdata/besu/qbft/keys/validator3/key @@ -0,0 +1 @@ +0x2fd21d48dcb473933de188ff882fed9d3bcbc4d43af77172f1b8035f1574a19b diff --git a/e2e/interchaintestv8/chainconfig/testdata/besu/qbft/keys/validator4/key b/e2e/interchaintestv8/chainconfig/testdata/besu/qbft/keys/validator4/key new file mode 100644 index 000000000..a2903bdff --- /dev/null +++ b/e2e/interchaintestv8/chainconfig/testdata/besu/qbft/keys/validator4/key @@ -0,0 +1 @@ +0xa9b2b5406572152ceb0a5480a65f63fc562e6970402dd58ede1bec32837ae25a diff --git a/e2e/interchaintestv8/e2esuite/config.go b/e2e/interchaintestv8/e2esuite/config.go index a0693a5ad..7ad0bea56 100644 --- a/e2e/interchaintestv8/e2esuite/config.go +++ b/e2e/interchaintestv8/e2esuite/config.go @@ -34,6 +34,10 @@ func (c *ethereumConfig) isAnvilBased() bool { return c.testnetType == testvalues.EthTestnetTypeAnvil } +func (c *ethereumConfig) isBesuQBFT() bool { + return c.testnetType == testvalues.EthTestnetTypeBesuQBFT +} + func (c *ethereumConfig) needsPoS() bool { return c.testnetType == testvalues.EthTestnetTypePoS } @@ -61,22 +65,31 @@ func (c *setupConfig) validate() error { ethTestnetType := c.ethereum.testnetType ethLcOnCosmos := c.cosmos.lightClientType - // Skip validation if no ethereum chain - if ethTestnetType == "" || ethTestnetType == testvalues.EthTestnetType_None { + switch ethTestnetType { + case "", testvalues.EthTestnetType_None: return nil + case testvalues.EthTestnetTypeAnvil: + if ethLcOnCosmos == testvalues.EthLCOnCosmosTypeFullWasm { + return fmt.Errorf("invalid config: ETH_TESTNET_TYPE=%s cannot use ETH_LC_ON_COSMOS=%s (Anvil doesn't have beacon chain)", ethTestnetType, ethLcOnCosmos) + } + return nil + case testvalues.EthTestnetTypePoS: + if ethLcOnCosmos == testvalues.EthLCOnCosmosTypeDummyWasm { + return fmt.Errorf("invalid config: ETH_TESTNET_TYPE=%s cannot use ETH_LC_ON_COSMOS=%s (PoS requires actual verification)", ethTestnetType, ethLcOnCosmos) + } + return nil + case testvalues.EthTestnetTypeBesuQBFT: + switch ethLcOnCosmos { + case "", testvalues.EthLCOnCosmosTypeDummyWasm, testvalues.EthLCOnCosmosTypeAttestorNative: + return nil + case testvalues.EthLCOnCosmosTypeFullWasm: + return fmt.Errorf("invalid config: ETH_TESTNET_TYPE=%s cannot use ETH_LC_ON_COSMOS=%s (Besu QBFT doesn't have beacon chain)", ethTestnetType, ethLcOnCosmos) + default: + return fmt.Errorf("invalid config: ETH_TESTNET_TYPE=%s does not support ETH_LC_ON_COSMOS=%s", ethTestnetType, ethLcOnCosmos) + } + default: + return fmt.Errorf("invalid config: unsupported ETH_TESTNET_TYPE=%s", ethTestnetType) } - - // Anvil cannot use full light client (no beacon chain to verify) - if c.ethereum.isAnvilBased() && ethLcOnCosmos == testvalues.EthLCOnCosmosTypeFullWasm { - return fmt.Errorf("invalid config: ETH_TESTNET_TYPE=%s cannot use ETH_LC_ON_COSMOS=%s (Anvil doesn't have beacon chain)", ethTestnetType, ethLcOnCosmos) - } - - // PoS testnets cannot use dummy light client (requires actual verification) - if !c.ethereum.isAnvilBased() && ethLcOnCosmos == testvalues.EthLCOnCosmosTypeDummyWasm { - return fmt.Errorf("invalid config: ETH_TESTNET_TYPE=%s cannot use ETH_LC_ON_COSMOS=%s (PoS requires actual verification)", ethTestnetType, ethLcOnCosmos) - } - - return nil } // Result types for parallel chain setup @@ -98,3 +111,8 @@ type ethPosSetupResult struct { chain *chainconfig.EthKurtosisChain err error } + +type ethBesuQBFTSetupResult struct { + chain *chainconfig.BesuQBFTChain + err error +} diff --git a/e2e/interchaintestv8/e2esuite/setup_ethereum.go b/e2e/interchaintestv8/e2esuite/setup_ethereum.go index 50c002cfd..493a7a6a1 100644 --- a/e2e/interchaintestv8/e2esuite/setup_ethereum.go +++ b/e2e/interchaintestv8/e2esuite/setup_ethereum.go @@ -85,6 +85,44 @@ func (s *TestSuite) processEthereumPoSResult(ctx context.Context, chain *chainco s.Eth.Chains = append(s.Eth.Chains, ðChain) } +func (s *TestSuite) setupEthereumBesuQBFTAsync(ctx context.Context, networkID string, resultCh chan<- ethBesuQBFTSetupResult) { + var result ethBesuQBFTSetupResult + defer func() { resultCh <- result }() + + chain, err := chainconfig.SpinUpBesuQBFT(ctx, chainconfig.BesuQBFTParams{ + ChainID: 1337, + Subnet: "10.42.0.0/16", + Gateway: "10.42.0.1", + ValidatorIPs: [4]string{"10.42.0.2", "10.42.0.3", "10.42.0.4", "10.42.0.5"}, + DockerRPCAlias: "besu-qbft-rpc", + InterchainNetworkID: networkID, + }) + if err != nil { + result.err = err + return + } + result.chain = &chain +} + +func (s *TestSuite) processEthereumBesuQBFTResult(ctx context.Context, chain *chainconfig.BesuQBFTChain) { + if chain == nil { + return + } + + s.T().Cleanup(func() { + cleanupCtx := context.Background() + if s.T().Failed() { + _ = chain.DumpLogs(cleanupCtx) + } + chain.Destroy(cleanupCtx) + }) + + ethChain, err := ethereum.NewEthereum(ctx, chain.RPC, nil, chain.Faucet) + s.Require().NoError(err, "Failed to create Ethereum client") + ethChain.DockerRPC = chain.DockerRPC + s.Eth.Chains = append(s.Eth.Chains, ðChain) +} + // setupAnvilChains detects and sets up any Anvil chains in the slice. func (s *TestSuite) setupAnvilChains(ctx context.Context, chains []ibc.Chain) { faucet, err := crypto.HexToECDSA(testvalues.E2EDeployerPrivateKeyHex) diff --git a/e2e/interchaintestv8/e2esuite/suite.go b/e2e/interchaintestv8/e2esuite/suite.go index 51cd89564..7d534bc57 100644 --- a/e2e/interchaintestv8/e2esuite/suite.go +++ b/e2e/interchaintestv8/e2esuite/suite.go @@ -118,6 +118,7 @@ func (s *TestSuite) setupChainsInParallel( solanaCh := make(chan solanaSetupResult, 1) interchainCh := make(chan interchainSetupResult, 1) ethPosCh := make(chan ethPosSetupResult, 1) + ethBesuQBFTCh := make(chan ethBesuQBFTSetupResult, 1) go s.setupSolanaAsync(ctx, cfg, solanaCh) go s.setupInterchainAsync(ctx, chainSpecs, interchainCh) @@ -128,17 +129,27 @@ func (s *TestSuite) setupChainsInParallel( ethPosCh <- ethPosSetupResult{} } + interchainRes := <-interchainCh + s.Require().NoError(interchainRes.err, "Interchain setup failed") + + if cfg.ethereum.isBesuQBFT() { + go s.setupEthereumBesuQBFTAsync(ctx, interchainRes.network, ethBesuQBFTCh) + } else { + ethBesuQBFTCh <- ethBesuQBFTSetupResult{} + } + solanaRes := <-solanaCh s.Require().NoError(solanaRes.err, "Solana chain setup failed") s.processSolanaResult(solanaRes.chain) - interchainRes := <-interchainCh - s.Require().NoError(interchainRes.err, "Interchain setup failed") - ethPosRes := <-ethPosCh s.Require().NoError(ethPosRes.err, "Ethereum PoS chain setup failed") s.processEthereumPoSResult(ctx, ethPosRes.chain) + ethBesuQBFTRes := <-ethBesuQBFTCh + s.Require().NoError(ethBesuQBFTRes.err, "Ethereum Besu QBFT chain setup failed") + s.processEthereumBesuQBFTResult(ctx, ethBesuQBFTRes.chain) + return interchainRes.chains, interchainRes.dockerClient, interchainRes.network, interchainRes.logger } diff --git a/e2e/interchaintestv8/ethereum/ethereum.go b/e2e/interchaintestv8/ethereum/ethereum.go index 54ff43b83..b6ac3ba26 100644 --- a/e2e/interchaintestv8/ethereum/ethereum.go +++ b/e2e/interchaintestv8/ethereum/ethereum.go @@ -12,6 +12,7 @@ import ( "math/big" "os" "os/exec" + "time" "github.com/ethereum/go-ethereum/accounts/abi/bind" ethcommon "github.com/ethereum/go-ethereum/common" @@ -24,6 +25,8 @@ import ( "github.com/srdtrk/solidity-ibc-eureka/e2e/v8/testvalues" ) +const forgeScriptTimeout = 5 * time.Minute + type Ethereum struct { ChainID *big.Int RPC string @@ -108,9 +111,10 @@ func (e Ethereum) ForgeScript(deployer *ecdsa.PrivateKey, solidityContract strin "--non-interactive", "-vvvv", solidityContract, } cmdArgs = append(cmdArgs, args...) - cmd := exec.Command( - "forge", cmdArgs..., - ) + ctx, cancel := context.WithTimeout(context.Background(), forgeScriptTimeout) + defer cancel() + + cmd := exec.CommandContext(ctx, "forge", cmdArgs...) // Tests run from the repository root; forge must run from the Foundry project root // so that foundry.toml and script paths resolve. cmd.Dir = testvalues.SolidityProjectDir @@ -124,18 +128,23 @@ func (e Ethereum) ForgeScript(deployer *ecdsa.PrivateKey, solidityContract strin cmd.Env = append(cmd.Env, extraEnv...) var stdoutBuf bytes.Buffer + var stderrBuf bytes.Buffer // Create a MultiWriter to write to both os.Stdout and the buffer - multiWriter := io.MultiWriter(os.Stdout, &stdoutBuf) + stdoutWriter := io.MultiWriter(os.Stdout, &stdoutBuf) + stderrWriter := io.MultiWriter(os.Stderr, &stderrBuf) // Set the command's stdout to the MultiWriter - cmd.Stdout = multiWriter - cmd.Stderr = os.Stderr + cmd.Stdout = stdoutWriter + cmd.Stderr = stderrWriter // Run the command if err := cmd.Run(); err != nil { + if ctx.Err() == context.DeadlineExceeded { + err = fmt.Errorf("forge script timed out after %s: %w", forgeScriptTimeout, err) + } fmt.Println("Error start command", cmd.Args, err) - return nil, err + return stdoutBuf.Bytes(), fmt.Errorf("%w\n%s", err, stderrBuf.String()) } // Get the output as byte slices diff --git a/e2e/interchaintestv8/ethereum/proof.go b/e2e/interchaintestv8/ethereum/proof.go new file mode 100644 index 000000000..da9659eaa --- /dev/null +++ b/e2e/interchaintestv8/ethereum/proof.go @@ -0,0 +1,34 @@ +package ethereum + +import ( + "context" + + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/common/hexutil" +) + +type StorageProof struct { + Key string `json:"key"` + Value *hexutil.Big `json:"value"` + Proof []string `json:"proof"` +} + +type AccountProof struct { + Address common.Address `json:"address"` + AccountProof []string `json:"accountProof"` + Balance *hexutil.Big `json:"balance"` + CodeHash common.Hash `json:"codeHash"` + Nonce hexutil.Uint64 `json:"nonce"` + StorageHash common.Hash `json:"storageHash"` + StorageProof []StorageProof `json:"storageProof"` +} + +func (e *Ethereum) GetProof(ctx context.Context, address common.Address, storageKeys []string, block string) (AccountProof, error) { + if storageKeys == nil { + storageKeys = []string{} + } + + var proof AccountProof + err := e.RPCClient.Client().CallContext(ctx, &proof, "eth_getProof", address, storageKeys, block) + return proof, err +} diff --git a/e2e/interchaintestv8/go.mod b/e2e/interchaintestv8/go.mod index bc4fb87f8..594f966ec 100644 --- a/e2e/interchaintestv8/go.mod +++ b/e2e/interchaintestv8/go.mod @@ -32,6 +32,7 @@ require ( github.com/moby/moby v28.5.2+incompatible github.com/rs/zerolog v1.35.1 github.com/stretchr/testify v1.12.1 + github.com/testcontainers/testcontainers-go v0.40.0 go.uber.org/zap v1.28.0 golang.org/x/sync v0.22.0 google.golang.org/genproto/googleapis/api v0.0.0-20260526163538-3dc84a4a5aaa @@ -39,6 +40,101 @@ require ( google.golang.org/protobuf v1.36.12 ) +require ( + dario.cat/mergo v1.0.2 // indirect + github.com/Azure/go-ansiterm v0.0.0-20250102033503-faa5f7b0171c // indirect + github.com/DefangLabs/secret-detector v0.0.0-20250403165618-22662109213e // indirect + github.com/acarl005/stripansi v0.0.0-20180116102854-5a71ef0e047d // indirect + github.com/apparentlymart/go-textseg/v15 v15.0.0 // indirect + github.com/buger/goterm v1.0.4 // indirect + github.com/compose-spec/compose-go/v2 v2.9.0 // indirect + github.com/containerd/console v1.0.5 // indirect + github.com/containerd/containerd/api v1.9.0 // indirect + github.com/containerd/containerd/v2 v2.1.4 // indirect + github.com/containerd/continuity v0.4.5 // indirect + github.com/containerd/log v0.1.0 // indirect + github.com/containerd/platforms v1.0.0-rc.1 // indirect + github.com/containerd/ttrpc v1.2.7 // indirect + github.com/containerd/typeurl/v2 v2.2.3 // indirect + github.com/cpuguy83/dockercfg v0.3.2 // indirect + github.com/docker/buildx v0.29.1 // indirect + github.com/docker/cli v28.5.1+incompatible // indirect + github.com/docker/cli-docs-tool v0.10.0 // indirect + github.com/docker/compose/v2 v2.40.2 // indirect + github.com/docker/distribution v2.8.3+incompatible // indirect + github.com/docker/docker-credential-helpers v0.9.3 // indirect + github.com/docker/go v1.5.1-1.0.20160303222718-d30aec9fd63c // indirect + github.com/docker/go-metrics v0.0.1 // indirect + github.com/eiannone/keyboard v0.0.0-20220611211555-0d226195f203 // indirect + github.com/emicklei/go-restful/v3 v3.11.0 // indirect + github.com/fsnotify/fsevents v0.2.0 // indirect + github.com/fvbommel/sortorder v1.1.0 // indirect + github.com/fxamacker/cbor/v2 v2.7.0 // indirect + github.com/go-openapi/jsonpointer v0.22.5 // indirect + github.com/go-openapi/jsonreference v0.20.2 // indirect + github.com/go-openapi/swag v0.23.0 // indirect + github.com/go-openapi/swag/jsonname v0.25.5 // indirect + github.com/golang-jwt/jwt/v5 v5.3.1 // indirect + github.com/google/gnostic-models v0.6.8 // indirect + github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 // indirect + github.com/hashicorp/errwrap v1.1.0 // indirect + github.com/hashicorp/go-multierror v1.1.1 // indirect + github.com/in-toto/in-toto-golang v0.9.0 // indirect + github.com/inhies/go-bytesize v0.0.0-20220417184213-4913239db9cf // indirect + github.com/jonboulle/clockwork v0.5.0 // indirect + github.com/josharian/intern v1.0.0 // indirect + github.com/magiconair/properties v1.8.10 // indirect + github.com/mailru/easyjson v0.7.7 // indirect + github.com/mattn/go-shellwords v1.0.12 // indirect + github.com/miekg/pkcs11 v1.1.1 // indirect + github.com/mitchellh/hashstructure/v2 v2.0.2 // indirect + github.com/moby/buildkit v0.25.1 // indirect + github.com/moby/go-archive v0.1.0 // indirect + github.com/moby/locker v1.0.1 // indirect + github.com/moby/patternmatcher v0.6.0 // indirect + github.com/moby/spdystream v0.5.0 // indirect + github.com/moby/sys/atomicwriter v0.1.0 // indirect + github.com/moby/sys/capability v0.4.0 // indirect + github.com/moby/sys/mountinfo v0.7.2 // indirect + github.com/moby/sys/signal v0.7.1 // indirect + github.com/moby/sys/symlink v0.3.0 // indirect + github.com/moby/sys/user v0.4.0 // indirect + github.com/moby/sys/userns v0.1.0 // indirect + github.com/moby/term v0.5.2 // indirect + github.com/morikuni/aec v1.0.0 // indirect + github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f // indirect + github.com/pelletier/go-toml v1.9.5 // indirect + github.com/rivo/uniseg v0.4.7 // indirect + github.com/santhosh-tekuri/jsonschema/v6 v6.0.2 // indirect + github.com/secure-systems-lab/go-securesystemslib v0.6.0 // indirect + github.com/serialx/hashring v0.0.0-20200727003509-22c0c7ab6b1b // indirect + github.com/shibumi/go-pathspec v1.3.0 // indirect + github.com/skratchdot/open-golang v0.0.0-20200116055534-eef842397966 // indirect + github.com/theupdateframework/notary v0.7.0 // indirect + github.com/tilt-dev/fsnotify v1.4.8-0.20220602155310-fff9c274a375 // indirect + github.com/tonistiigi/dchapes-mode v0.0.0-20250318174251-73d941a28323 // indirect + github.com/tonistiigi/fsutil v0.0.0-20250605211040-586307ad452f // indirect + github.com/tonistiigi/go-csvvalue v0.0.0-20240814133006-030d3b2625d0 // indirect + github.com/tonistiigi/units v0.0.0-20180711220420-6950e57a87ea // indirect + github.com/tonistiigi/vt100 v0.0.0-20240514184818-90bafcd6abab // indirect + github.com/x448/float16 v0.8.4 // indirect + github.com/xhit/go-str2duration/v2 v2.1.0 // indirect + github.com/zclconf/go-cty v1.17.0 // indirect + go.opentelemetry.io/contrib/instrumentation/net/http/httptrace/otelhttptrace v0.60.0 // indirect + gopkg.in/evanphx/json-patch.v4 v4.12.0 // indirect + gopkg.in/inf.v0 v0.9.1 // indirect + gopkg.in/ini.v1 v1.67.0 // indirect + k8s.io/api v0.32.3 // indirect + k8s.io/apimachinery v0.32.3 // indirect + k8s.io/client-go v0.32.3 // indirect + k8s.io/klog/v2 v2.130.1 // indirect + k8s.io/kube-openapi v0.0.0-20241105132330-32ad38e42d3f // indirect + k8s.io/utils v0.0.0-20241104100929-3ea5e8cea738 // indirect + sigs.k8s.io/json v0.0.0-20241010143419-9aa6b5e7a4b3 // indirect + sigs.k8s.io/structured-merge-diff/v4 v4.4.2 // indirect + tags.cncf.io/container-device-interface v1.0.1 // indirect +) + require ( cel.dev/expr v0.25.2 // indirect cloud.google.com/go v0.123.0 // indirect @@ -244,7 +340,7 @@ require ( github.com/marten-seemann/tcp v0.0.0-20210406111302-dfbc87cc63fd // indirect github.com/mattn/go-colorable v0.1.14 // indirect github.com/mattn/go-isatty v0.0.24 // indirect - github.com/mattn/go-runewidth v0.0.15 // indirect + github.com/mattn/go-runewidth v0.0.16 // indirect github.com/mholt/archives v0.1.5 // indirect github.com/miekg/dns v1.1.72 // indirect github.com/mikelolasagasti/xz v1.0.1 // indirect @@ -341,6 +437,7 @@ require ( github.com/supranational/blst v0.3.16 // indirect github.com/syndtr/goleveldb v1.0.1-0.20220721030215-126854af5e6d // indirect github.com/tendermint/go-amino v0.16.0 // indirect + github.com/testcontainers/testcontainers-go/modules/compose v0.40.0 github.com/tidwall/btree v1.8.1 // indirect github.com/tidwall/gjson v1.18.0 // indirect github.com/tidwall/match v1.2.0 // indirect diff --git a/e2e/interchaintestv8/go.sum b/e2e/interchaintestv8/go.sum index 12e1d81af..45b972cf2 100644 --- a/e2e/interchaintestv8/go.sum +++ b/e2e/interchaintestv8/go.sum @@ -64,6 +64,8 @@ cosmossdk.io/math v1.5.3 h1:WH6tu6Z3AUCeHbeOSHg2mt9rnoiUWVWaQ2t6Gkll96U= cosmossdk.io/math v1.5.3/go.mod h1:uqcZv7vexnhMFJF+6zh9EWdm/+Ylyln34IvPnBauPCQ= cosmossdk.io/schema v1.1.0 h1:mmpuz3dzouCoyjjcMcA/xHBEmMChN+EHh8EHxHRHhzE= cosmossdk.io/schema v1.1.0/go.mod h1:Gb7pqO+tpR+jLW5qDcNOSv0KtppYs7881kfzakguhhI= +dario.cat/mergo v1.0.2 h1:85+piFYR1tMbRrLcDwR18y4UKJ3aH1Tbzi24VRW1TK8= +dario.cat/mergo v1.0.2/go.mod h1:E/hbnu0NxMFBjpMIE34DRGLWqDy0g5FuKDhCb31ngxA= dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= filippo.io/bigmod v0.1.1-0.20260103110540-f8a47775ebe5 h1:JA0fFr+kxpqTdxR9LOBiTWpGNchqmkcsgmdeJZRclZ0= filippo.io/bigmod v0.1.1-0.20260103110540-f8a47775ebe5/go.mod h1:OjOXDNlClLblvXdwgFFOQFJEocLhhtai8vGLy0JCZlI= @@ -76,6 +78,8 @@ github.com/99designs/go-keychain v0.0.0-20191008050251-8e49817e8af4 h1:/vQbFIOMb github.com/99designs/go-keychain v0.0.0-20191008050251-8e49817e8af4/go.mod h1:hN7oaIRCjzsZ2dE+yG5k+rsdt3qcwykqK6HVGcKwsw4= github.com/99designs/keyring v1.2.2 h1:pZd3neh/EmUzWONb35LxQfvuY7kiSXAq3HQd97+XBn0= github.com/99designs/keyring v1.2.2/go.mod h1:wes/FrByc8j7lFOAGLGSNEg8f/PaI3cgTBqhFkHUrPk= +github.com/AdaLogics/go-fuzz-headers v0.0.0-20240806141605-e8a1dd7889d6 h1:He8afgbRMd7mFxO99hRNu+6tazq8nFF9lIwo9JFroBk= +github.com/AdaLogics/go-fuzz-headers v0.0.0-20240806141605-e8a1dd7889d6/go.mod h1:8o94RPi1/7XTJvwPpRSzSUedZrtlirdB3r9Z20bi2f8= github.com/AlekSi/pointer v1.1.0 h1:SSDMPcXD9jSl8FPy9cRzoRaMJtm9g9ggGTxecRUbQoI= github.com/AlekSi/pointer v1.1.0/go.mod h1:y7BvfRI3wXPWKXEBhU71nbnIEEZX0QTSB2Bj48UJIZE= github.com/Azure/go-ansiterm v0.0.0-20250102033503-faa5f7b0171c h1:udKWzYgxTojEKWjV8V+WSxDXJ4NFATAsZjh8iIbsQIg= @@ -90,6 +94,8 @@ github.com/DataDog/datadog-go v4.8.3+incompatible h1:fNGaYSuObuQb5nzeTQqowRAd9bp github.com/DataDog/datadog-go v4.8.3+incompatible/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ= github.com/DataDog/zstd v1.5.7 h1:ybO8RBeh29qrxIhCA9E8gKY6xfONU9T6G6aP9DTKfLE= github.com/DataDog/zstd v1.5.7/go.mod h1:g4AWEaM3yOg3HYfnJ3YIawPnVdXJh9QME85blwSAmyw= +github.com/DefangLabs/secret-detector v0.0.0-20250403165618-22662109213e h1:rd4bOvKmDIx0WeTv9Qz+hghsgyjikFiPrseXHlKepO0= +github.com/DefangLabs/secret-detector v0.0.0-20250403165618-22662109213e/go.mod h1:blbwPQh4DTlCZEfk1BLU4oMIhLda2U+A840Uag9DsZw= github.com/GeertJohan/go.incremental v1.0.0/go.mod h1:6fAjUhbVuX1KcMD3c8TEgVUqmo4seqhv0i0kdATSkM0= github.com/GeertJohan/go.rice v1.0.0/go.mod h1:eH6gbSOAUv07dQuZVnBmoDP8mgsM1rtixis4Tib9if0= github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.33.0 h1:l7+6kwRMJNwdCvYdDl7Eax+wzEYHSnNY7zrrfbhDdTA= @@ -105,6 +111,8 @@ github.com/Masterminds/semver/v3 v3.5.0 h1:kQceYJfbupGfZOKZQg0kou0DgAKhzDg2NZPAw github.com/Masterminds/semver/v3 v3.5.0/go.mod h1:4V+yj/TJE1HU9XfppCwVMZq3I84lprf4nC11bSS5beM= github.com/Microsoft/go-winio v0.6.2 h1:F2VQgta7ecxGYO8k3ZZz3RS8fVIXVxONVUPlNERoyfY= github.com/Microsoft/go-winio v0.6.2/go.mod h1:yd8OoFMLzJbo9gZq8j5qaps8bJ9aShtEA8Ipt1oGCvU= +github.com/Microsoft/hcsshim v0.13.0 h1:/BcXOiS6Qi7N9XqUcv27vkIuVOkBEcWstd2pMlWSeaA= +github.com/Microsoft/hcsshim v0.13.0/go.mod h1:9KWJ/8DgU+QzYGupX4tzMhRQE8h6w90lH6HAaclpEok= github.com/Nvveen/Gotty v0.0.0-20120604004816-cd527374f1e5 h1:TngWCqHvy9oXAN6lEVMRuU21PR1EtLVZJmdB18Gu3Rw= github.com/Nvveen/Gotty v0.0.0-20120604004816-cd527374f1e5/go.mod h1:lmUJ/7eu/Q8D7ML55dXQrVaamCz2vxCfdQBasLZfHKk= github.com/OffchainLabs/prysm/v6 v6.1.4 h1:gwLBbGaYsEh9zpZL337uVjXPX3F86UNJ7KIiFiPsY7c= @@ -114,12 +122,16 @@ github.com/RoaringBitmap/roaring/v2 v2.24.0 h1:zQkkBZtG3WRP4j+P3A5DO221SvL1Br88T github.com/RoaringBitmap/roaring/v2 v2.24.0/go.mod h1:SfT3of9nYh3vis1dIbCj4Yw6KQGujTN+f345nrN/0JA= github.com/STARRY-S/zip v0.2.3 h1:luE4dMvRPDOWQdeDdUxUoZkzUIpTccdKdhHHsQJ1fm4= github.com/STARRY-S/zip v0.2.3/go.mod h1:lqJ9JdeRipyOQJrYSOtpNAiaesFO6zVDsE8GIGFaoSk= +github.com/Shopify/logrus-bugsnag v0.0.0-20170309145241-6dbc35f2c30d h1:hi6J4K6DKrR4/ljxn6SF6nURyu785wKMuQcjt7H3VCQ= +github.com/Shopify/logrus-bugsnag v0.0.0-20170309145241-6dbc35f2c30d/go.mod h1:HI8ITrYtUY+O+ZhtlqUnD8+KwNPOyugEhfP9fdUIaEQ= github.com/Shopify/sarama v1.19.0/go.mod h1:FVkBWblsNy7DGZRfXLU0O9RCGt5g3g3yEuWXgklEdEo= github.com/Shopify/toxiproxy v2.1.4+incompatible/go.mod h1:OXgGpZ6Cli1/URJOF1DMxUHB2q5Ap20/P/eIdh4G0pI= github.com/VictoriaMetrics/fastcache v1.12.2 h1:N0y9ASrJ0F6h0QaC3o6uJb3NIZ9VKLjCM7NQbSmF7WI= github.com/VictoriaMetrics/fastcache v1.12.2/go.mod h1:AmC+Nzz1+3G2eCPapF6UcsnkThDcMsQicp4xDukwJYI= github.com/VividCortex/gohistogram v1.0.0 h1:6+hBz+qvs0JOrrNhhmR7lFxo5sINxBCGXrdtl/UvroE= github.com/VividCortex/gohistogram v1.0.0/go.mod h1:Pf5mBqqDxYaXu3hDrrU+w6nw50o/4+TcAqDqk/vUH7g= +github.com/acarl005/stripansi v0.0.0-20180116102854-5a71ef0e047d h1:licZJFw2RwpHMqeKTCYkitsPqHNxTmd4SNR5r94FGM8= +github.com/acarl005/stripansi v0.0.0-20180116102854-5a71ef0e047d/go.mod h1:asat636LX7Bqt5lYEZ27JNDcqxfjdBQuJ/MM4CN/Lzo= github.com/adlio/schema v1.4.0 h1:dekxG6P0my/bPvlyWzMULelR2Xej8RGErlnJcoY5ddw= github.com/adlio/schema v1.4.0/go.mod h1:3/ojUldWBCWp4e+6VN9ets6unG5WdqbjF7vyzM0zTVQ= github.com/adrg/xdg v0.5.3 h1:xRnxJXne7+oWDatRhR1JLnvuccuIeCoBu2rtuLqQB78= @@ -131,6 +143,8 @@ github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuy github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho= +github.com/anchore/go-struct-converter v0.0.0-20221118182256-c68fdcfa2092 h1:aM1rlcoLz8y5B2r4tTLMiVTrMtpfY0O8EScKJxaSaEc= +github.com/anchore/go-struct-converter v0.0.0-20221118182256-c68fdcfa2092/go.mod h1:rYqSE9HbjzpHTI74vwPvae4ZVYZd1lue2ta6xHPdblA= github.com/andres-erbsen/clock v0.0.0-20160526145045-9e14626cd129 h1:MzBOUgng9orim59UnfUTLRjMpd09C5uEVQ6RPGeCaVI= github.com/andres-erbsen/clock v0.0.0-20160526145045-9e14626cd129/go.mod h1:rFgpPQZYZ8vdbc+48xibu8ALc3yeyd64IhHS+PU6Yyg= github.com/andybalholm/brotli v1.2.0 h1:ukwgCxwYrmACq68yiUqwIWnGY0cTPox/M94sVwToPjQ= @@ -138,9 +152,13 @@ github.com/andybalholm/brotli v1.2.0/go.mod h1:rzTDkvFWvIrjDXZHkuS16NPggd91W3kUS github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= github.com/apache/thrift v0.12.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ= github.com/apache/thrift v0.13.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ= +github.com/apparentlymart/go-textseg/v15 v15.0.0 h1:uYvfpb3DyLSCGWnctWKGj857c6ew1u1fNQOlOtuGxQY= +github.com/apparentlymart/go-textseg/v15 v15.0.0/go.mod h1:K8XmNZdhEBkdlyDdvbmmsvpAG721bKi0joRfFdHIWJ4= github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o= github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY= github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= +github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5 h1:0CwZNZbxp69SHPdPJAN/hZIm0C4OItdklCFmMRWYpio= +github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5/go.mod h1:wHh0iHkYZB8zMSxRWpUBQtwG5a7fFgvEO+odwuTv2gs= github.com/aryann/difflib v0.0.0-20170710044230-e206f873d14a/go.mod h1:DAHtR1m6lCRdSC2Tm3DSWRPvIPr6xNKyeHdqDQSQT+A= github.com/attestantio/go-eth2-client v0.27.1 h1:g7bm+gG/p+gfzYdEuxuAepVWYb8EO+2KojV5/Lo2BxM= github.com/attestantio/go-eth2-client v0.27.1/go.mod h1:fvULSL9WtNskkOB4i+Yyr6BKpNHXvmpGZj9969fCrfY= @@ -191,6 +209,7 @@ github.com/aybabtme/rgbterm v0.0.0-20170906152045-cc83f3b3ce59/go.mod h1:q/89r3U github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= github.com/benbjohnson/clock v1.3.5 h1:VvXlSJBzZpA/zum6Sj74hxwYI2DIxRWuNIoXAzHZz5o= github.com/benbjohnson/clock v1.3.5/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= +github.com/beorn7/perks v0.0.0-20150223135152-b965b613227f/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= @@ -200,11 +219,14 @@ github.com/bgentry/go-netrc v0.0.0-20140422174119-9fd32a8b3d3d/go.mod h1:6QX/PXZ github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= github.com/bgentry/speakeasy v0.2.0 h1:tgObeVOf8WAvtuAX6DhJ4xks4CFNwPDZiqzGqIHE51E= github.com/bgentry/speakeasy v0.2.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= +github.com/bitly/go-hostpool v0.1.0/go.mod h1:4gOCgp6+NZnVqlKyZ/iBZFTAJKembaVENUpMkpg42fw= +github.com/bitly/go-simplejson v0.5.0/go.mod h1:cXHtHw4XUPsvGaxgjIAn8PhEWG9NfngEKAMDJEczWVA= github.com/bits-and-blooms/bitset v1.24.5 h1:654xBVHc23gJMAgOTkPNoCVfiRxuIOAUnAZFtopqJ4w= github.com/bits-and-blooms/bitset v1.24.5/go.mod h1:7hO7Gc7Pp1vODcmWvKMRA9BNmbv6a/7QIWpPxHddWR8= github.com/bketelsen/crypt v0.0.3-0.20200106085610-5cbc8cc4026c/go.mod h1:MKsuJmJgSg28kpZDP6UIiPt0e0Oz0kqKNGyRaWEPv84= github.com/blendle/zapdriver v1.3.1 h1:C3dydBOWYRiOk+B8X9IVZ5IOe+7cl+tGOexN4QqHfpE= github.com/blendle/zapdriver v1.3.1/go.mod h1:mdXfREi6u5MArG4j9fewC+FGnXaBR+T4Ox4J2u4eHCc= +github.com/bmizerany/assert v0.0.0-20160611221934-b7ed37b82869/go.mod h1:Ekp36dRnpXw/yCqJaO+ZrUyxD+3VXMFFr56k5XYrpB4= github.com/bodgit/plumbing v1.3.0 h1:pf9Itz1JOQgn7vEOE7v7nlEfBykYqvUYioC61TwWCFU= github.com/bodgit/plumbing v1.3.0/go.mod h1:JOTb4XiRu5xfnmdnDJo6GmSbSbtSyufrsyZFByMtKEs= github.com/bodgit/sevenzip v1.6.1 h1:kikg2pUMYC9ljU7W9SaqHXhym5HyKm8/M/jd31fYan4= @@ -216,9 +238,17 @@ github.com/btcsuite/btcd/btcec/v2 v2.3.6/go.mod h1:m22FrOAiuxl/tht9wIqAoGHcbnCCa github.com/btcsuite/btcd/btcutil v1.2.0 h1:p3+S2g3Q+7G5NOh4Ji+2UrBOrg5Z0Q4ykzShWG1Dhgs= github.com/btcsuite/btcd/btcutil v1.2.0/go.mod h1:/Taflm113pYjUpbWKKQEfa6XOtI/+WS8awxeMZpY75k= github.com/buger/goterm v0.0.0-20200322175922-2f3e71b85129/go.mod h1:u9UyCz2eTrSGy6fbupqJ54eY5c4IC8gREQ1053dK12U= +github.com/buger/goterm v1.0.4 h1:Z9YvGmOih81P0FbVtEYTFF6YsSgxSUKEhf/f9bTMXbY= +github.com/buger/goterm v1.0.4/go.mod h1:HiFWV3xnkolgrBV3mY8m0X0Pumt4zg4QhbdOzQtB8tE= github.com/buger/jsonparser v1.1.1/go.mod h1:6RYKKt7H4d4+iWqouImQ9R2FZql3VbhNgx27UK13J/0= github.com/buger/jsonparser v1.1.2 h1:frqHqw7otoVbk5M8LlE/L7HTnIq2v9RX6EJ48i9AxJk= github.com/buger/jsonparser v1.1.2/go.mod h1:6RYKKt7H4d4+iWqouImQ9R2FZql3VbhNgx27UK13J/0= +github.com/bugsnag/bugsnag-go v1.0.5-0.20150529004307-13fd6b8acda0 h1:s7+5BfS4WFJoVF9pnB8kBk03S7pZXRdKamnV0FOl5Sc= +github.com/bugsnag/bugsnag-go v1.0.5-0.20150529004307-13fd6b8acda0/go.mod h1:2oa8nejYd4cQ/b0hMIopN0lCRxU0bueqREvZLWFrtK8= +github.com/bugsnag/osext v0.0.0-20130617224835-0dd3f918b21b h1:otBG+dV+YK+Soembjv71DPz3uX/V/6MMlSyD9JBQ6kQ= +github.com/bugsnag/osext v0.0.0-20130617224835-0dd3f918b21b/go.mod h1:obH5gd0BsqsP2LwDJ9aOkm/6J86V6lyAXCoQWGw3K50= +github.com/bugsnag/panicwrap v0.0.0-20151223152923-e2c28503fcd0 h1:nvj0OLI3YqYXer/kZD8Ri1aaunCxIEsOst1BVJswV0o= +github.com/bugsnag/panicwrap v0.0.0-20151223152923-e2c28503fcd0/go.mod h1:D/8v3kj0zr8ZAKg1AQ6crr+5VwKN5eIywRkfhyM/+dE= github.com/bytedance/gopkg v0.1.4 h1:oZnQwnX82KAIWb7033bEwtxvTqXcYMxDBaQxo5JJHWM= github.com/bytedance/gopkg v0.1.4/go.mod h1:v1zWfPm21Fb+OsyXN2VAHdL6TBb2L88anLQgdyje6R4= github.com/bytedance/sonic v1.15.1 h1:nJD5PmM0vY7J8CT6MxoqbVAAMhkSmV2HgRAUrrpLoOw= @@ -253,6 +283,8 @@ github.com/chzyer/test v1.0.0 h1:p3BQDXSxOhOG0P9z6/hGnII4LGiEPOYBhs8asl/fC04= github.com/chzyer/test v1.0.0/go.mod h1:2JlltgoNkt4TW/z9V/IzDdFaMTM2JPIi26O1pF38GC8= github.com/clbanning/x2j v0.0.0-20191024224557-825249438eec/go.mod h1:jMjuTZXRI4dUb/I5gc9Hdhagfvm9+RyrPryS/auMzxE= github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= +github.com/cloudflare/cfssl v0.0.0-20180223231731-4e2dcbde5004 h1:lkAMpLVBDaj17e85keuznYcH5rqI438v41pKcBl4ZxQ= +github.com/cloudflare/cfssl v0.0.0-20180223231731-4e2dcbde5004/go.mod h1:yMWuSON2oQp+43nFtAV/uvKQIFpSPerB57DCt9t8sSA= github.com/cloudflare/circl v1.6.3 h1:9GPOhQGF9MCYUeXyMYlqTR6a5gTrgR/fBLXvUgtVcg8= github.com/cloudflare/circl v1.6.3/go.mod h1:2eXP6Qfat4O/Yhh8BznvKnJ+uzEoTQ6jVKJRn81BiS4= github.com/cloudwego/base64x v0.1.7 h1:NppS+Fgzg5ovhn4NkUXaDT3x9jldgH5ToMCqzBSi2zI= @@ -282,20 +314,47 @@ github.com/cockroachdb/redact v1.1.8/go.mod h1:GceHHpJ0rMDpYARL5In88Alq/xMBUtVlz github.com/cockroachdb/tokenbucket v0.0.0-20250429170803-42689b6311bb h1:3bCgBvB8PbJVMX1ouCcSIxvsqKPYM7gs72o0zC76n9g= github.com/cockroachdb/tokenbucket v0.0.0-20250429170803-42689b6311bb/go.mod h1:7nc4anLGjupUW/PeY5qiNYsdNXj7zopG+eqsS7To5IQ= github.com/codahale/hdrhistogram v0.0.0-20161010025455-3a0bb77429bd/go.mod h1:sE/e/2PUdi/liOCUjSTXgM1o87ZssimdTWN964YiIeI= +github.com/codahale/rfc6979 v0.0.0-20141003034818-6a90f24967eb h1:EDmT6Q9Zs+SbUoc7Ik9EfrFqcylYqgPZ9ANSbTAntnE= +github.com/codahale/rfc6979 v0.0.0-20141003034818-6a90f24967eb/go.mod h1:ZjrT6AXHbDs86ZSdt/osfBi5qfexBrKUdONk989Wnk4= github.com/cometbft/cometbft v0.40.0 h1:0+zc7FlcnonFfMwzhyDCd5vK/fHZqz0RfRyTCxZsFPU= github.com/cometbft/cometbft v0.40.0/go.mod h1:3z+Aq3BSkwNKw+Z40yPUTxtSRIpQa0w2PyCwyaxxHeU= github.com/cometbft/cometbft-db v1.0.4 h1:cezb8yx/ZWcF124wqUtAFjAuDksS1y1yXedvtprUFxs= github.com/cometbft/cometbft-db v1.0.4/go.mod h1:M+BtHAGU2XLrpUxo3Nn1nOCcnVCiLM9yx5OuT0u5SCA= +github.com/compose-spec/compose-go/v2 v2.9.0 h1:UHSv/QHlo6QJtrT4igF1rdORgIUhDo1gWuyJUoiNNIM= +github.com/compose-spec/compose-go/v2 v2.9.0/go.mod h1:Oky9AZGTRB4E+0VbTPZTUu4Kp+oEMMuwZXZtPPVT1iE= github.com/consensys/gnark-crypto v0.19.2 h1:qrEAIXq3T4egxqiliFFoNrepkIWVEeIYwt3UL0fvS80= github.com/consensys/gnark-crypto v0.19.2/go.mod h1:rT23F0XSZqE0mUA0+pRtnL56IbPxs6gp4CeRsBk4XS0= +github.com/containerd/cgroups/v3 v3.0.5 h1:44na7Ud+VwyE7LIoJ8JTNQOa549a8543BmzaJHo6Bzo= +github.com/containerd/cgroups/v3 v3.0.5/go.mod h1:SA5DLYnXO8pTGYiAHXz94qvLQTKfVM5GEVisn4jpins= +github.com/containerd/console v1.0.5 h1:R0ymNeydRqH2DmakFNdmjR2k0t7UPuiOV/N/27/qqsc= +github.com/containerd/console v1.0.5/go.mod h1:YynlIjWYF8myEu6sdkwKIvGQq+cOckRm6So2avqoYAk= +github.com/containerd/containerd/api v1.9.0 h1:HZ/licowTRazus+wt9fM6r/9BQO7S0vD5lMcWspGIg0= +github.com/containerd/containerd/api v1.9.0/go.mod h1:GhghKFmTR3hNtyznBoQ0EMWr9ju5AqHjcZPsSpTKutI= +github.com/containerd/containerd/v2 v2.1.4 h1:/hXWjiSFd6ftrBOBGfAZ6T30LJcx1dBjdKEeI8xucKQ= +github.com/containerd/containerd/v2 v2.1.4/go.mod h1:8C5QV9djwsYDNhxfTCFjWtTBZrqjditQ4/ghHSYjnHM= github.com/containerd/continuity v0.4.5 h1:ZRoN1sXq9u7V6QoHMcVWGhOwDFqZ4B9i5H6un1Wh0x4= github.com/containerd/continuity v0.4.5/go.mod h1:/lNJvtJKUQStBzpVQ1+rasXO1LAWtUQssk28EZvJ3nE= github.com/containerd/errdefs v1.0.0 h1:tg5yIfIlQIrxYtu9ajqY42W3lpS19XqdxRQeEwYG8PI= github.com/containerd/errdefs v1.0.0/go.mod h1:+YBYIdtsnF4Iw6nWZhJcqGSg/dwvV7tyJ/kCkyJ2k+M= github.com/containerd/errdefs/pkg v0.3.0 h1:9IKJ06FvyNlexW690DXuQNx2KA2cUJXx151Xdx3ZPPE= github.com/containerd/errdefs/pkg v0.3.0/go.mod h1:NJw6s9HwNuRhnjJhM7pylWwMyAkmCQvQ4GpJHEqRLVk= +github.com/containerd/fifo v1.1.0 h1:4I2mbh5stb1u6ycIABlBw9zgtlK8viPI9QkQNRQEEmY= +github.com/containerd/fifo v1.1.0/go.mod h1:bmC4NWMbXlt2EZ0Hc7Fx7QzTFxgPID13eH0Qu+MAb2o= github.com/containerd/log v0.1.0 h1:TCJt7ioM2cr/tfR8GPbGf9/VRAX8D2B4PjzCpfX540I= github.com/containerd/log v0.1.0/go.mod h1:VRRf09a7mHDIRezVKTRCrOq78v577GXq3bSa3EhrzVo= +github.com/containerd/nydus-snapshotter v0.15.2 h1:qsHI4M+Wwrf6Jr4eBqhNx8qh+YU0dSiJ+WPmcLFWNcg= +github.com/containerd/nydus-snapshotter v0.15.2/go.mod h1:FfwH2KBkNYoisK/e+KsmNr7xTU53DmnavQHMFOcXwfM= +github.com/containerd/platforms v1.0.0-rc.1 h1:83KIq4yy1erSRgOVHNk1HYdPvzdJ5CnsWaRoJX4C41E= +github.com/containerd/platforms v1.0.0-rc.1/go.mod h1:J71L7B+aiM5SdIEqmd9wp6THLVRzJGXfNuWCZCllLA4= +github.com/containerd/plugin v1.0.0 h1:c8Kf1TNl6+e2TtMHZt+39yAPDbouRH9WAToRjex483Y= +github.com/containerd/plugin v1.0.0/go.mod h1:hQfJe5nmWfImiqT1q8Si3jLv3ynMUIBB47bQ+KexvO8= +github.com/containerd/stargz-snapshotter v0.16.3 h1:zbQMm8dRuPHEOD4OqAYGajJJUwCeUzt4j7w9Iaw58u4= +github.com/containerd/stargz-snapshotter/estargz v0.16.3 h1:7evrXtoh1mSbGj/pfRccTampEyKpjpOnS3CyiV1Ebr8= +github.com/containerd/stargz-snapshotter/estargz v0.16.3/go.mod h1:uyr4BfYfOj3G9WBVE8cOlQmXAbPN9VEQpBBeJIuOipU= +github.com/containerd/ttrpc v1.2.7 h1:qIrroQvuOL9HQ1X6KHe2ohc7p+HP/0VE6XPU7elJRqQ= +github.com/containerd/ttrpc v1.2.7/go.mod h1:YCXHsb32f+Sq5/72xHubdiJRQY9inL4a4ZQrAbN1q9o= +github.com/containerd/typeurl/v2 v2.2.3 h1:yNA/94zxWdvYACdYO8zofhrTVuQY73fFU1y++dYSw40= +github.com/containerd/typeurl/v2 v2.2.3/go.mod h1:95ljDnPfD3bAbDJRugOiShd/DlAAsxGtUBhJxIn7SCk= github.com/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk= github.com/coreos/etcd v3.3.13+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= @@ -335,10 +394,13 @@ github.com/cosmos/interchaintest/v11 v11.0.0-20260805134452-6ecd341bf76a h1:q5N5 github.com/cosmos/interchaintest/v11 v11.0.0-20260805134452-6ecd341bf76a/go.mod h1:uup1v8NWddL2cvDzdxNK4egYU0uPVmAoG93+x36/UjA= github.com/cosmos/ledger-cosmos-go v1.0.0 h1:jNKW89nPf0vR0EkjHG8Zz16h6p3zqwYEOxlHArwgYtw= github.com/cosmos/ledger-cosmos-go v1.0.0/go.mod h1:mGaw2wDOf+Z6SfRJsMGxU9DIrBa4du0MAiPlpPhLAOE= +github.com/cpuguy83/dockercfg v0.3.2 h1:DlJTyZGBDlXqUZ2Dk2Q3xHs/FtnooJJVaad2S9GKorA= +github.com/cpuguy83/dockercfg v0.3.2/go.mod h1:sugsbF4//dDlL/i+S+rtpIWp+5h0BHJHfjj5/jFyUJc= github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= github.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= -github.com/cpuguy83/go-md2man/v2 v2.0.6 h1:XJtiaUW6dEEqVuZiMTn1ldk455QWwEIsMIJlo5vtkx0= github.com/cpuguy83/go-md2man/v2 v2.0.6/go.mod h1:oOW0eioCTA6cOiMLiUPZOpcVxMig6NIQQ7OS05n1F4g= +github.com/cpuguy83/go-md2man/v2 v2.0.7 h1:zbFlGlXEAKlwXpmvle3d8Oe3YnkKIK4xSRTd3sHPnBo= +github.com/cpuguy83/go-md2man/v2 v2.0.7/go.mod h1:oOW0eioCTA6cOiMLiUPZOpcVxMig6NIQQ7OS05n1F4g= github.com/crate-crypto/go-eth-kzg v1.5.0 h1:FYRiJMJG2iv+2Dy3fi14SVGjcPteZ5HAAUe4YWlJygc= github.com/crate-crypto/go-eth-kzg v1.5.0/go.mod h1:J9/u5sWfznSObptgfa92Jq8rTswn6ahQWEuiLHOjCUI= github.com/crate-crypto/go-ipa v0.0.0-20240724233137-53bbb0ceb27a h1:W8mUrRp6NOVl3J+MYp5kPMoUZPp7aOYHtaua31lwRHg= @@ -347,6 +409,8 @@ github.com/crate-crypto/go-kzg-4844 v1.1.0 h1:EN/u9k2TF6OWSHrCCDBBU6GLNMq88OspHH github.com/crate-crypto/go-kzg-4844 v1.1.0/go.mod h1:JolLjpSff1tCCJKaJx4psrlEdlXuJEC996PL3tTAFks= github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7DoTY= github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= +github.com/creack/pty v1.1.24 h1:bJrF4RRfyJnbTJqzRLHzcGaZK1NeM5kTC9jGgovnR1s= +github.com/creack/pty v1.1.24/go.mod h1:08sCNb52WyoAwi2QDyzUCTgcvVFhUzewun7wtTfvcwE= github.com/cyberdelia/templates v0.0.0-20141128023046-ca7fffd4298c/go.mod h1:GyV+0YP4qX0UQ7r2MoYZ+AvYDp12OF5yg4q8rGnyNh4= github.com/daaku/go.zipexe v1.0.0/go.mod h1:z8IiR6TsVLEYKwXAoE/I+8ys/sDkgTzSL0CLnGVd57E= github.com/danieljoos/wincred v1.2.3 h1:v7dZC2x32Ut3nEfRH+vhoZGvN72+dQ/snVXo/vMFLdQ= @@ -366,6 +430,7 @@ github.com/decred/dcrd/dcrec/secp256k1/v4 v4.4.1 h1:5RVFMOWjMyRy8cARdy79nAmgYw3h github.com/decred/dcrd/dcrec/secp256k1/v4 v4.4.1/go.mod h1:ZXNYxsqcloTdSy/rNShjYzMhyjf0LaoftYK0p+A3h40= github.com/deepmap/oapi-codegen v1.8.2 h1:SegyeYGcdi0jLLrpbCMoJxnUUn8GBXHsvr4rbzjuhfU= github.com/deepmap/oapi-codegen v1.8.2/go.mod h1:YLgSKSDv/bZQB7N4ws6luhozi3cEdRktEqrX88CvjIw= +github.com/denisenkom/go-mssqldb v0.0.0-20191128021309-1d7a30a10f73/go.mod h1:xbL0rPBG9cCiLr28tMa8zpbdarY27NDyej4t/EjAShU= github.com/desertbit/timer v0.0.0-20180107155436-c41aec40b27f/go.mod h1:xH/i4TFMt8koVQZ6WFms69WAsDWr2XsYL3Hkl7jkoLE= github.com/desertbit/timer v1.0.1 h1:yRpYNn5Vaaj6QXecdLMPMJsW81JLiI1eokUft5nBmeo= github.com/desertbit/timer v1.0.1/go.mod h1:htRrYeY5V/t4iu1xCJ5XsQvp4xve8QulXXctAzxqcwE= @@ -381,12 +446,35 @@ github.com/dgryski/go-farm v0.0.0-20240924180020-3414d57e47da/go.mod h1:SqUrOPUn github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no= github.com/distribution/reference v0.6.0 h1:0IXCQ5g4/QMHHkarYzh5l+u8T3t73zM5QvfrDyIgxBk= github.com/distribution/reference v0.6.0/go.mod h1:BbU0aIcezP1/5jX/8MP0YiH4SdvB5Y4f/wlDRiLyi3E= +github.com/dlclark/regexp2 v1.11.0 h1:G/nrcoOa7ZXlpoa/91N3X7mM3r8eIlMBBJZvsz/mxKI= +github.com/dlclark/regexp2 v1.11.0/go.mod h1:DHkYz0B9wPfa6wondMfaivmHpzrQ3v9q8cnmRbL6yW8= +github.com/docker/buildx v0.29.1 h1:58hxM5Z4mnNje3G5NKfULT9xCr8ooM8XFtlfUK9bKaA= +github.com/docker/buildx v0.29.1/go.mod h1:J4EFv6oxlPiV1MjO0VyJx2u5tLM7ImDEl9zyB8d4wPI= +github.com/docker/cli v28.5.1+incompatible h1:ESutzBALAD6qyCLqbQSEf1a/U8Ybms5agw59yGVc+yY= +github.com/docker/cli v28.5.1+incompatible/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHvMKP+vjCwu2uszcLI8= +github.com/docker/cli-docs-tool v0.10.0 h1:bOD6mKynPQgojQi3s2jgcUWGp/Ebqy1SeCr9VfKQLLU= +github.com/docker/cli-docs-tool v0.10.0/go.mod h1:5EM5zPnT2E7yCLERZmrDA234Vwn09fzRHP4aX1qwp1U= +github.com/docker/compose/v2 v2.40.2 h1:h2bDBJkOuqmj93XvT2oI0ArPQonE0lGtWiILXdiXvbA= +github.com/docker/compose/v2 v2.40.2/go.mod h1:CbSJpKGw20LInVsPjglZ8z7Squ3OBQOD7Ux5nkjGfIU= +github.com/docker/distribution v2.7.1+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= +github.com/docker/distribution v2.8.3+incompatible h1:AtKxIZ36LoNK51+Z6RpzLpddBirtxJnzDrHLEKxTAYk= +github.com/docker/distribution v2.8.3+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= github.com/docker/docker v28.5.2+incompatible h1:DBX0Y0zAjZbSrm1uzOkdr1onVghKaftjlSWt4AFexzM= github.com/docker/docker v28.5.2+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= +github.com/docker/docker-credential-helpers v0.9.3 h1:gAm/VtF9wgqJMoxzT3Gj5p4AqIjCBS4wrsOh9yRqcz8= +github.com/docker/docker-credential-helpers v0.9.3/go.mod h1:x+4Gbw9aGmChi3qTLZj8Dfn0TD20M/fuWy0E5+WDeCo= +github.com/docker/go v1.5.1-1.0.20160303222718-d30aec9fd63c h1:lzqkGL9b3znc+ZUgi7FlLnqjQhcXxkNM/quxIjBVMD0= +github.com/docker/go v1.5.1-1.0.20160303222718-d30aec9fd63c/go.mod h1:CADgU4DSXK5QUlFslkQu2yW2TKzFZcXq/leZfM0UH5Q= +github.com/docker/go-connections v0.4.0/go.mod h1:Gbd7IOopHjR8Iph03tsViu4nIes5XhDvyHbTtUxmeec= github.com/docker/go-connections v0.8.1 h1:JibmG5hULs5qXSr/cp/w3Pw5fZuStt4MOHMUExb29/M= github.com/docker/go-connections v0.8.1/go.mod h1:no1qkHdjq7kLMGUXYAduOhYPSJxxvgWBh7ogVvptn3Q= +github.com/docker/go-metrics v0.0.0-20180209012529-399ea8c73916/go.mod h1:/u0gXw0Gay3ceNrsHubL3BtdOL2fHf93USgMTe0W5dI= +github.com/docker/go-metrics v0.0.1 h1:AgB/0SvBxihN0X8OR4SjsblXkbMvalQ8cjmtKQ2rQV8= +github.com/docker/go-metrics v0.0.1/go.mod h1:cG1hvH2utMXtqgqqYE9plW6lDxS3/5ayHzueweSI3Vw= github.com/docker/go-units v0.5.0 h1:69rxXcBk27SvSaaxTtLh/8llcHD8vYHT7WSdRZ/jvr4= github.com/docker/go-units v0.5.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= +github.com/docker/libtrust v0.0.0-20160708172513-aabc10ec26b7 h1:UhxFibDNY/bfvqU5CAUmr9zpesgbU6SWc8/B4mflAE4= +github.com/docker/libtrust v0.0.0-20160708172513-aabc10ec26b7/go.mod h1:cyGadeNEkKy96OOhEzfZl+yxihPEzKnqJwvfuSUqbZE= github.com/dsnet/compress v0.0.2-0.20230904184137-39efe44ab707 h1:2tV76y6Q9BB+NEBasnqvs7e49aEBFI8ejC89PSnWH+4= github.com/dsnet/compress v0.0.2-0.20230904184137-39efe44ab707/go.mod h1:qssHWj60/X5sZFNxpG4HBPDHVqxNm4DfnCKgrbZOT+s= github.com/dsnet/golib v0.0.0-20171103203638-1ea166775780/go.mod h1:Lj+Z9rebOhdfkVLjJ8T6VcRQv3SXugXy999NBtR9aFY= @@ -395,6 +483,7 @@ github.com/dunglas/httpsfv v1.1.0/go.mod h1:zID2mqw9mFsnt7YC3vYQ9/cjq30q41W+1AnD github.com/dustin/go-humanize v0.0.0-20171111073723-bb3d318650d4/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY= github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto= +github.com/dvsekhvalnov/jose2go v0.0.0-20170216131308-f21a8cedbbae/go.mod h1:7BvyPhdbLxMXIYTFPLsyJRFMsKmOZnQmzh6Gb+uquuM= github.com/dvsekhvalnov/jose2go v1.8.0 h1:LqkkVKAlHFfH9LOEl5fe4p/zL02OhWE7pCufMBG2jLA= github.com/dvsekhvalnov/jose2go v1.8.0/go.mod h1:QsHjhyTlD/lAVqn/NSbVZmSCGeDehTB/mPZadG+mhXU= github.com/eapache/go-resiliency v1.1.0/go.mod h1:kFI+JgMyC7bLPUVY133qvEBtVayf5mFgVsvEsIPBvNs= @@ -403,8 +492,12 @@ github.com/eapache/queue v1.1.0/go.mod h1:6eCeP0CKFpHLu8blIFXhExK/dRa7WDZfr6jVFP github.com/ebitengine/purego v0.10.1 h1:dewVBCBT2GaMu1SrNTYxQhgQBethzfhiwvZiLGP/qyY= github.com/ebitengine/purego v0.10.1/go.mod h1:iIjxzd6CiRiOG0UyXP+V1+jWqUXVjPKLAI0mRfJZTmQ= github.com/edsrzf/mmap-go v1.0.0/go.mod h1:YO35OhQPt3KJa3ryjFM5Bs14WD66h8eGKpfaBNrHW5M= +github.com/eiannone/keyboard v0.0.0-20220611211555-0d226195f203 h1:XBBHcIb256gUJtLmY22n99HaZTz+r2Z51xUPi01m3wg= +github.com/eiannone/keyboard v0.0.0-20220611211555-0d226195f203/go.mod h1:E1jcSv8FaEny+OP/5k9UxZVw9YFWGj7eI4KR/iOBqCg= github.com/emicklei/dot v1.11.0 h1:zsrhCuFHAJge/aZIC4N4LdHy5tqYu4tWEaUzIwdYj4Y= github.com/emicklei/dot v1.11.0/go.mod h1:DeV7GvQtIw4h2u73RKBkkFdvVAz0D9fzeJrgPW6gy/s= +github.com/emicklei/go-restful/v3 v3.11.0 h1:rAQeMHw1c7zTmncogyy8VvRZwtkmkZ4FxERmMY4rD+g= +github.com/emicklei/go-restful/v3 v3.11.0/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc= github.com/envoyproxy/go-control-plane v0.6.9/go.mod h1:SBwIajubJHhxtWwsL9s8ss4safvEdbitLhGGK48rN6g= github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= @@ -421,6 +514,7 @@ github.com/envoyproxy/go-control-plane/ratelimit v0.1.0/go.mod h1:Wk+tMFAFbCXaJP github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= github.com/envoyproxy/protoc-gen-validate v1.3.3 h1:MVQghNeW+LZcmXe7SY1V36Z+WFMDjpqGAGacLe2T0ds= github.com/envoyproxy/protoc-gen-validate v1.3.3/go.mod h1:TsndJ/ngyIdQRhMcVVGDDHINPLWB7C82oDArY51KfB0= +github.com/erikstmartin/go-testdb v0.0.0-20160219214506-8d10e4a1bae5/go.mod h1:a2zkGnVExMxdzMo3M0Hi/3sEU+cWnZpSni0O6/Yb/P0= github.com/ethereum-optimism/op-geth v1.101511.0 h1:9t+f65gmxSlKF2nUthaPRbJKcHm6zWJc5bfxj7taJyY= github.com/ethereum-optimism/op-geth v1.101511.0/go.mod h1:SkytozVEPtnUeBlquwl0Qv5JKvrN/Y5aqh+VkQo/EOI= github.com/ethereum/c-kzg-4844/v2 v2.1.6 h1:xQymkKCT5E2Jiaoqf3v4wsNgjZLY0lRSkZn27fRjSls= @@ -445,10 +539,16 @@ github.com/franela/goblin v0.0.0-20200105215937-c9ffbefa60db/go.mod h1:7dvUGVsVB github.com/franela/goreq v0.0.0-20171204163338-bcd34c9993f8/go.mod h1:ZhphrRTfi2rbfLwlschooIH4+wKKDR4Pdxhh+TRoA20= github.com/frankban/quicktest v1.14.6 h1:7Xjx+VpznH+oBnejlPUj8oUpdxnVs4f8XU8WnHkI4W8= github.com/frankban/quicktest v1.14.6/go.mod h1:4ptaffx2x8+WTWXmUCuVU6aPUX1/Mz7zb5vbUoiM6w0= +github.com/fsnotify/fsevents v0.2.0 h1:BRlvlqjvNTfogHfeBOFvSC9N0Ddy+wzQCQukyoD7o/c= +github.com/fsnotify/fsevents v0.2.0/go.mod h1:B3eEk39i4hz8y1zaWS/wPrAP4O6wkIl7HQwKBr1qH/w= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= github.com/fsnotify/fsnotify v1.9.0 h1:2Ml+OJNzbYCTzsxtv8vKSFD9PbJjmhYF14k/jKC7S9k= github.com/fsnotify/fsnotify v1.9.0/go.mod h1:8jBTzvmWwFyi3Pb8djgCCO5IBqzKJ/Jwo8TRcHyHii0= +github.com/fvbommel/sortorder v1.1.0 h1:fUmoe+HLsBTctBDoaBwpQo5N+nrCp8g/BjKb/6ZQmYw= +github.com/fvbommel/sortorder v1.1.0/go.mod h1:uk88iVf1ovNn1iLfgUVU2F9o5eO30ui720w+kxuqRs0= +github.com/fxamacker/cbor/v2 v2.7.0 h1:iM5WgngdRBanHcxugY4JySA0nk1wZorNOpTgCMedv5E= +github.com/fxamacker/cbor/v2 v2.7.0/go.mod h1:pxXPTn3joSm21Gbwsv0w9OSA2y1HFR9qXEeXQVeNoDQ= github.com/gagliardetto/anchor-go v0.3.2 h1:/nlAp3B6s4DBlNABWrQ5bA2zpsUGVDqBfwmbUUg4ChQ= github.com/gagliardetto/anchor-go v0.3.2/go.mod h1:Jf9/DBNo6GsG6RguE4ZuJz+PZtypKg3iUpB++Oc6ynQ= github.com/gagliardetto/binary v0.6.1/go.mod h1:aOfYkc20U0deHaHn/LVZXiqlkDbFAX0FpTlDhsXa0S0= @@ -503,7 +603,19 @@ github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiU github.com/go-ole/go-ole v1.3.0 h1:Dt6ye7+vXGIKZ7Xtk4s6/xVdGDQynvom7xCFEdWr6uE= github.com/go-ole/go-ole v1.3.0/go.mod h1:5LS6F96DhAwUc7C+1HLexzMXY1xGRSryjyPPKW6zv78= github.com/go-openapi/jsonpointer v0.19.5/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= +github.com/go-openapi/jsonpointer v0.19.6/go.mod h1:osyAmYz/mB/C3I+WsTTSgw1ONzaLJoLCyoi6/zppojs= +github.com/go-openapi/jsonpointer v0.22.5 h1:8on/0Yp4uTb9f4XvTrM2+1CPrV05QPZXu+rvu2o9jcA= +github.com/go-openapi/jsonpointer v0.22.5/go.mod h1:gyUR3sCvGSWchA2sUBJGluYMbe1zazrYWIkWPjjMUY0= +github.com/go-openapi/jsonreference v0.20.2 h1:3sVjiK66+uXK/6oQ8xgcRKcFgQ5KXa2KvnJRumpMGbE= +github.com/go-openapi/jsonreference v0.20.2/go.mod h1:Bl1zwGIM8/wsvqjsOQLJ/SH+En5Ap4rVB5KVcIDZG2k= github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= +github.com/go-openapi/swag v0.22.3/go.mod h1:UzaqsxGiab7freDnrUUra0MwWfN/q7tE4j+VcZ0yl14= +github.com/go-openapi/swag v0.23.0 h1:vsEVJDUo2hPJ2tu0/Xc+4noaxyEffXNIs3cOULZ+GrE= +github.com/go-openapi/swag v0.23.0/go.mod h1:esZ8ITTYEsH1V2trKHjAN8Ai7xHb8RV+YSZ577vPjgQ= +github.com/go-openapi/swag/jsonname v0.25.5 h1:8p150i44rv/Drip4vWI3kGi9+4W9TdI3US3uUYSFhSo= +github.com/go-openapi/swag/jsonname v0.25.5/go.mod h1:jNqqikyiAK56uS7n8sLkdaNY/uq6+D2m2LANat09pKU= +github.com/go-openapi/testify/v2 v2.4.0 h1:8nsPrHVCWkQ4p8h1EsRVymA2XABB4OT40gcvAu+voFM= +github.com/go-openapi/testify/v2 v2.4.0/go.mod h1:HCPmvFFnheKK2BuwSA0TbbdxJ3I16pjwMkYkP4Ywn54= github.com/go-playground/assert/v2 v2.0.1/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4= github.com/go-playground/locales v0.13.0 h1:HyWk6mgj5qFqCT5fjGBuRArbVDfE4hi8+e8ceBS/t7Q= github.com/go-playground/locales v0.13.0/go.mod h1:taPMhCMXrRLJO55olJkUXHZBHCxTMfnGwq/HNwmWNS8= @@ -512,8 +624,12 @@ github.com/go-playground/universal-translator v0.17.0/go.mod h1:UkSxE5sNxxRwHyU+ github.com/go-playground/validator/v10 v10.2.0/go.mod h1:uOYAAleCW8F/7oMFd6aG0GOhaH6EGOAJShg8Id5JGkI= github.com/go-playground/validator/v10 v10.4.1 h1:pH2c5ADXtd66mxoE0Zm9SUhxE20r7aM3F26W0hOn+GE= github.com/go-playground/validator/v10 v10.4.1/go.mod h1:nlOn6nFhuKACm19sB/8EGNn9GlaMV7XkbRSipzJ0Ii4= +github.com/go-sql-driver/mysql v1.3.0/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w= +github.com/go-sql-driver/mysql v1.4.0 h1:7LxgVwFb2hIQtMm87NdgAVfXjnt4OePseqT1tKx+opk= github.com/go-sql-driver/mysql v1.4.0/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w= github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= +github.com/go-task/slim-sprig/v3 v3.0.0 h1:sUs3vkvUymDpBKi3qH1YSqBQk9+9D/8M2mN1vB6EwHI= +github.com/go-task/slim-sprig/v3 v3.0.0/go.mod h1:W848ghGpv3Qj3dhTPRyJypKRiqCdHZiAzKg9hl15HA8= github.com/go-viper/mapstructure/v2 v2.5.0 h1:vM5IJoUAy3d7zRSVtIwQgBj7BiWtMPfmPEgAXnvj1Ro= github.com/go-viper/mapstructure/v2 v2.5.0/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= github.com/go-yaml/yaml v2.1.0+incompatible h1:RYi2hDdss1u4YE7GwixGzWwVo47T8UQwnTLB6vQiq+o= @@ -533,12 +649,17 @@ github.com/gogo/googleapis v1.4.1 h1:1Yx4Myt7BxzvUr5ldGSbwYiZG6t9wGBZ+8/fX3Wvtq0 github.com/gogo/googleapis v1.4.1/go.mod h1:2lpHqI5OcWCtVElxXnPt+s8oJvMpySlOyM6xDCrzib4= github.com/golang-jwt/jwt/v4 v4.5.1 h1:JdqV9zKUdtaa9gdPlywC3aeoEsR681PlKC+4F5gQgeo= github.com/golang-jwt/jwt/v4 v4.5.1/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0= +github.com/golang-jwt/jwt/v5 v5.3.1 h1:kYf81DTWFe7t+1VvL7eS+jKFVWaUnK9cB1qbwn63YCY= +github.com/golang-jwt/jwt/v5 v5.3.1/go.mod h1:fxCRLWMO43lRc8nhHWY6LGqRcf+1gQWArsqaEUEa5bE= +github.com/golang-sql/civil v0.0.0-20190719163853-cb61b32ac6fe/go.mod h1:8vg3r2VgvsThLBIFL93Qb5yWzgyZWhEmBwUJWevAkK0= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= github.com/golang/groupcache v0.0.0-20160516000752-02826c3e7903/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/groupcache v0.0.0-20241129210726-2c02b8208cf8 h1:f+oWsMOmNPc8JmEHVZIycC7hBoQxHH9pNKQORJNozsQ= +github.com/golang/groupcache v0.0.0-20241129210726-2c02b8208cf8/go.mod h1:wcDNUvekVysuuOpQKo3191zZyTpiI6se1N1ULghS0sw= github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y= @@ -551,6 +672,7 @@ github.com/golang/protobuf v1.3.0/go.mod h1:Qd/q+1AKNOZr9uGQzbzCmRO6sUih6GTPZv6a github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= +github.com/golang/protobuf v1.3.4/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= github.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgjlRvqsdk= github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= @@ -573,8 +695,12 @@ github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Z github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/btree v1.1.3 h1:CVpQJjYgC4VbzxeGVHfvZrv1ctoYCAI8vbl07Fcxlyg= github.com/google/btree v1.1.3/go.mod h1:qOPhT0dTNdNzV6Z/lhRX0YXUafgPLFUh+gZMl761Gm4= +github.com/google/certificate-transparency-go v1.0.10-0.20180222191210-5ab67e519c93 h1:jc2UWq7CbdszqeH6qu1ougXMIUBfSy8Pbh/anURYbGI= +github.com/google/certificate-transparency-go v1.0.10-0.20180222191210-5ab67e519c93/go.mod h1:QeJfpSbVSfYc7RgB3gJFj9cbuQMMchQxrWXz8Ruopmg= github.com/google/flatbuffers v25.2.10+incompatible h1:F3vclr7C3HpB1k9mxCGRMXq6FdUalZ6H/pNX4FP1v0Q= github.com/google/flatbuffers v25.2.10+incompatible/go.mod h1:1AeVuKshWv4vARoZatz6mlQ0JxURH0Kv5+zNeJKJCa8= +github.com/google/gnostic-models v0.6.8 h1:yo/ABAfM5IMRsS1VnXjTBvUb61tFIHozhlYvRgGre9I= +github.com/google/gnostic-models v0.6.8/go.mod h1:5n7qKqH0f5wFt+aWF8CW6pZLLNOfYuF5OpfBSENuI8U= github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= @@ -583,6 +709,7 @@ github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/ github.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8= github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU= github.com/google/gofuzz v0.0.0-20170612174753-24818f796faf/go.mod h1:HP5RmnzzSNb993RKQDq4+1A4ia9nllfqcQFTQJedwGI= @@ -605,6 +732,8 @@ github.com/google/pprof v0.0.0-20250403155104-27863c87afa6/go.mod h1:boTsfXsheKC github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= github.com/google/s2a-go v0.1.9 h1:LGD7gtMgezd8a/Xak7mEWL0PjoTQFvpRudN895yqKW0= github.com/google/s2a-go v0.1.9/go.mod h1:YA0Ei2ZQL3acow2O62kdp9UlnvMmU7kA6Eutn0dXayM= +github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 h1:El6M4kTTCOh6aBiKaUGG7oYTSPP8MxqL4YI3kZKwcP4= +github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510/go.mod h1:pupxD2MaaD3pAXIBCelhxNneeOaAeabZDe5s4K6zSpQ= github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= @@ -620,6 +749,7 @@ github.com/gorilla/context v1.1.1/go.mod h1:kBGZzfjB9CEq2AlWe17Uuf7NDRt0dE0s8S51 github.com/gorilla/handlers v1.5.2 h1:cLTUSsNkgcwhgRqvCNmdbRWG0A3N4F+M2nWKdScwyEE= github.com/gorilla/handlers v1.5.2/go.mod h1:dX+xVpaxdSw+q0Qek8SSsl3dfMk3jNddUkMzo0GtH0w= github.com/gorilla/mux v1.6.2/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= +github.com/gorilla/mux v1.7.0/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= github.com/gorilla/mux v1.7.3/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= github.com/gorilla/mux v1.8.0/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So= github.com/gorilla/mux v1.8.1 h1:TuBL49tXwgrFYWhqrNgrUNEY92u81SPhu7sTdzQEiWY= @@ -647,6 +777,8 @@ github.com/grpc-ecosystem/grpc-gateway/v2 v2.29.0 h1:5VipnvEpbqr2gA2VbM+nYVbkIF2 github.com/grpc-ecosystem/grpc-gateway/v2 v2.29.0/go.mod h1:Hyl3n6Twe1hvtd9XUXDec4pTvgMSEixRuQKPTMH2bNs= github.com/gsterjov/go-libsecret v0.0.0-20161001094733-a6f4afe4910c h1:6rhixN/i8ZofjG1Y75iExal34USq5p+wiN1tpie8IrU= github.com/gsterjov/go-libsecret v0.0.0-20161001094733-a6f4afe4910c/go.mod h1:NMPJylDgVpX0MLRlPy15sqSwOFv/U1GZ2m21JhFfek0= +github.com/hailocab/go-hostpool v0.0.0-20160125115350-e80d13ce29ed h1:5upAirOpQc1Q53c0bnx2ufif5kANL7bfZWcc6VJWJd8= +github.com/hailocab/go-hostpool v0.0.0-20160125115350-e80d13ce29ed/go.mod h1:tMWxXQ9wFIaZeTI9F+hmhFiGpFmhOHzyShyFUhRm0H4= github.com/hako/durafmt v0.0.0-20200710122514-c0fb7b4da026/go.mod h1:5Scbynm8dF1XAPwIwkGPqzkM/shndPm79Jd1003hTjE= github.com/hashicorp/aws-sdk-go-base/v2 v2.0.0-beta.72 h1:vTCWu1wbdYo7PEZFem/rlr01+Un+wwVmI7wiegFdRLk= github.com/hashicorp/aws-sdk-go-base/v2 v2.0.0-beta.72/go.mod h1:Vn+BBgKQHVQYdVQ4NZDICE1Brb+JfaONyDHr3q07oQc= @@ -655,6 +787,8 @@ github.com/hashicorp/consul/api v1.3.0/go.mod h1:MmDNSzIMUjNpY/mQ398R4bk2FnqQLoP github.com/hashicorp/consul/sdk v0.1.1/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8= github.com/hashicorp/consul/sdk v0.3.0/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8= github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= +github.com/hashicorp/errwrap v1.1.0 h1:OxrOeh75EUXMY8TBjag2fzXGZ40LB6IKw45YeGUDY2I= +github.com/hashicorp/errwrap v1.1.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= github.com/hashicorp/go-bexpr v0.1.10 h1:9kuI5PFotCboP3dkDYFr/wi0gg0QVbSNz5oFRpxn4uE= github.com/hashicorp/go-bexpr v0.1.10/go.mod h1:oxlubA2vC/gFVfX1A6JGp7ls7uCDlfJn732ehYYg+g0= github.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= @@ -671,6 +805,8 @@ github.com/hashicorp/go-metrics v0.6.0 h1:+kjWqHRH2HxAocneVfB/BI6EeWUUHyPhyQZozM github.com/hashicorp/go-metrics v0.6.0/go.mod h1:0B52B5pZ7+qm5Zhzs8Fygr87isvmUgr0Zv9rmJ9qsnQ= github.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM= github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk= +github.com/hashicorp/go-multierror v1.1.1 h1:H5DkEtf6CXdFp0N0Em5UCwQpXMWke8IA0+lD48awMYo= +github.com/hashicorp/go-multierror v1.1.1/go.mod h1:iw975J/qwKPdAO1clOe2L8331t/9/fmwbPZ6JB6eMoM= github.com/hashicorp/go-plugin v1.7.0 h1:YghfQH/0QmPNc/AZMTFE3ac8fipZyZECHdDPshfk+mA= github.com/hashicorp/go-plugin v1.7.0/go.mod h1:BExt6KEaIYx804z8k4gRzRLEvxKVb+kn0NMcihqOqb8= github.com/hashicorp/go-rootcerts v1.0.0/go.mod h1:K6zTfqpRlCUIjkwsN4Z+hiSfzSTQa6eBIzfwKfwNnHU= @@ -728,6 +864,8 @@ github.com/icza/dyno v0.0.0-20220812133438-f0b6f8a18845 h1:H+uM0Bv88eur3ZSsd2NGK github.com/icza/dyno v0.0.0-20220812133438-f0b6f8a18845/go.mod h1:c1tRKs5Tx7E2+uHGSyyncziFjvGpgv4H2HrqXeUQ/Uk= github.com/improbable-eng/grpc-web v0.15.0 h1:BN+7z6uNXZ1tQGcNAuaU1YjsLTApzkjt2tzCixLaUPQ= github.com/improbable-eng/grpc-web v0.15.0/go.mod h1:1sy9HKV4Jt9aEs9JSnkWlRJPuPtwNr0l57L4f878wP8= +github.com/in-toto/in-toto-golang v0.9.0 h1:tHny7ac4KgtsfrG6ybU8gVOZux2H8jN05AXJ9EBM1XU= +github.com/in-toto/in-toto-golang v0.9.0/go.mod h1:xsBVrVsHNsB61++S6Dy2vWosKhuA3lUTQd+eF9HdeMo= github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8= github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= @@ -738,6 +876,8 @@ github.com/influxdata/influxdb1-client v0.0.0-20220302092344-a9ab5670611c h1:qSH github.com/influxdata/influxdb1-client v0.0.0-20220302092344-a9ab5670611c/go.mod h1:qj24IKcXYK6Iy9ceXlo3Tc+vtHo9lIhSX5JddghvEPo= github.com/influxdata/line-protocol v0.0.0-20210311194329-9aa0e372d097 h1:vilfsDSy7TDxedi9gyBkMvAirat/oRcL0lFdJBf6tdM= github.com/influxdata/line-protocol v0.0.0-20210311194329-9aa0e372d097/go.mod h1:xaLFMmpvUxqXtVkUJfg9QmT88cDaCJ3ZKgdZ78oO8Qo= +github.com/inhies/go-bytesize v0.0.0-20220417184213-4913239db9cf h1:FtEj8sfIcaaBfAKrE1Cwb61YDtYq9JxChK1c7AKce7s= +github.com/inhies/go-bytesize v0.0.0-20220417184213-4913239db9cf/go.mod h1:yrqSXGoD/4EKfF26AOGzscPOgTTJcyAwM2rpixWT+t4= github.com/ipfs/go-cid v0.5.0 h1:goEKKhaGm0ul11IHA7I6p1GmKz8kEYniqFopaB5Otwg= github.com/ipfs/go-cid v0.5.0/go.mod h1:0L7vmeNXpQpUS9vt+yEARkJ8rOg43DF3iPgn4GIN0mk= github.com/jackpal/go-nat-pmp v1.0.2 h1:KzKSgb7qkJvOUTqYl9/Hg/me3pWgBmERKrTGD7BdWus= @@ -749,10 +889,20 @@ github.com/jhump/protoreflect v1.18.0 h1:TOz0MSR/0JOZ5kECB/0ufGnC2jdsgZ123Rd/k4Z github.com/jhump/protoreflect v1.18.0/go.mod h1:ezWcltJIVF4zYdIFM+D/sHV4Oh5LNU08ORzCGfwvTz8= github.com/jhump/protoreflect/v2 v2.0.0-beta.2 h1:qZU+rEZUOYTz1Bnhi3xbwn+VxdXkLVeEpAeZzVXLY88= github.com/jhump/protoreflect/v2 v2.0.0-beta.2/go.mod h1:4tnOYkB/mq7QTyS3YKtVtNrJv4Psqout8HA1U+hZtgM= +github.com/jinzhu/gorm v0.0.0-20170222002820-5409931a1bb8 h1:CZkYfurY6KGhVtlalI4QwQ6T0Cu6iuY3e0x5RLu96WE= +github.com/jinzhu/gorm v0.0.0-20170222002820-5409931a1bb8/go.mod h1:Vla75njaFJ8clLU1W44h34PjIkijhjHIYnZxMqCdxqo= +github.com/jinzhu/inflection v0.0.0-20170102125226-1c35d901db3d/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkryuEj+Srlc= +github.com/jinzhu/inflection v1.0.0 h1:K317FqzuhWc8YvSVlFMCCUb36O/S9MCKRDI7QkRKD/E= +github.com/jinzhu/inflection v1.0.0/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkryuEj+Srlc= +github.com/jinzhu/now v1.1.1/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8= github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= github.com/jmhodges/levigo v1.0.0 h1:q5EC36kV79HWeTBWsod3mG11EgStG3qArTKcvlksN1U= github.com/jmhodges/levigo v1.0.0/go.mod h1:Q6Qx+uH3RAqyK4rFQroq9RL7mdkABMcfhEI+nNuzMJQ= github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= +github.com/jonboulle/clockwork v0.5.0 h1:Hyh9A8u51kptdkR+cqRpT1EebBwTn1oK9YfGYbdFz6I= +github.com/jonboulle/clockwork v0.5.0/go.mod h1:3mZlmanh0g2NDKO5TWZVJAfofYk64M7XN3SzBPjZF60= +github.com/josharian/intern v1.0.0 h1:vlS4z54oSdjm0bgjRigI+G1HpF+tI+9rE5LLzOg8HmY= +github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y= github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4= github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= github.com/json-iterator/go v1.1.7/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= @@ -764,6 +914,7 @@ github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHm github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= +github.com/juju/loggo v0.0.0-20190526231331-6e530bcce5d8/go.mod h1:vgyd7OREkbtVEN/8IXZe5Ooef3LQePvuBm9UWj6ZL8U= github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM= github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= @@ -781,6 +932,7 @@ github.com/klauspost/cpuid/v2 v2.3.0/go.mod h1:hqwkgyIinND0mEev00jJYCxPNVRVXFQeu github.com/klauspost/pgzip v1.2.6 h1:8RXeL5crjEUFnR2/Sn6GJNWtSQ3Dk8pq4CL3jvdDyjU= github.com/klauspost/pgzip v1.2.6/go.mod h1:Ch1tH69qFZu15pkjo5kYi6mth2Zzwzt50oCQKQE9RUs= github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= +github.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/koron/go-ssdp v0.0.6 h1:Jb0h04599eq/CY7rB5YEqPS83HmRfHP2azkxMN2rFtU= github.com/koron/go-ssdp v0.0.6/go.mod h1:0R9LfRJGek1zWTjN3JUNlm5INCDYGpRDfAptnct63fI= @@ -813,6 +965,7 @@ github.com/leanovate/gopter v0.2.11 h1:vRjThO1EKPb/1NsDXuDrzldR28RLkBflWYcU9CvzW github.com/leanovate/gopter v0.2.11/go.mod h1:aK3tzZP/C+p1m3SPRE4SYZFGP7jjkuSI4f7Xvpt0S9c= github.com/leodido/go-urn v1.2.0 h1:hpXL4XnriNwQ/ABnpepYM/1vCLWNDfUNts8dX3xTG6Y= github.com/leodido/go-urn v1.2.0/go.mod h1:+8+nEpDfqqsY+g338gtMEUOtuK+4dEMhiQEgxpxOKII= +github.com/lib/pq v0.0.0-20150723085316-0dad96c0b94f/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= github.com/lib/pq v1.12.3 h1:tTWxr2YLKwIvK90ZXEw8GP7UFHtcbTtty8zsI+YjrfQ= github.com/lib/pq v1.12.3/go.mod h1:/p+8NSbOcwzAEI7wiMXFlgydTwcgTr3OSKMsD2BitpA= github.com/libp2p/go-buffer-pool v0.1.0 h1:oK4mSFcQz7cTQIfqbe4MIj9gLW+mnanjyFtc6cdF0Y8= @@ -842,11 +995,14 @@ github.com/logrusorgru/aurora v2.0.3+incompatible/go.mod h1:7rIyQOR62GCctdiQpZ/z github.com/lufia/plan9stats v0.0.0-20260330125221-c963978e514e h1:Q6MvJtQK/iRcRtzAscm/zF23XxJlbECiGPyRicsX+Ak= github.com/lufia/plan9stats v0.0.0-20260330125221-c963978e514e/go.mod h1:autxFIvghDt3jPTLoqZ9OZ7s9qTGNAWmYCjVFWPX/zg= github.com/lyft/protoc-gen-validate v0.0.13/go.mod h1:XbGvPuh87YZc5TdIa2/I4pLk0QoUACkjt2znoq26NVQ= +github.com/magiconair/properties v1.5.3/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= github.com/magiconair/properties v1.8.1/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= github.com/magiconair/properties v1.8.10 h1:s31yESBquKXCV9a/ScB3ESkOjUYYv+X0rg8SYxI99mE= github.com/magiconair/properties v1.8.10/go.mod h1:Dhd985XPs7jluiymwWYZ0G4Z61jb3vdS329zhj2hYo0= github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= +github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0= +github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= github.com/manifoldco/promptui v0.9.0 h1:3V4HzJk1TtXW1MTZMP7mdlwbBpIinw3HztaIlYthEiA= github.com/manifoldco/promptui v0.9.0/go.mod h1:ka04sppxSGFAtxX0qhlYQjISsg9mR4GWtQEhdbn6Pgg= github.com/marcopolo/simnet v0.0.7 h1:DpH8BMGsF9+1w13L8rvCaAhb6nYJdY+dIXncDrssvUs= @@ -873,8 +1029,11 @@ github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27k github.com/mattn/go-isatty v0.0.24 h1:tGZZoVgT/KiqK1c8ocVLeDS8BSWMRd47J3Lbz7vsReI= github.com/mattn/go-isatty v0.0.24/go.mod h1:nMCL3Zebbrt45jsMDgnfIwz6ydEQApk5oEI3HqDio6A= github.com/mattn/go-runewidth v0.0.2/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= -github.com/mattn/go-runewidth v0.0.15 h1:UNAjwbU9l54TA3KzvqLGxwWjHmMgBUVhBiTjelZgg3U= -github.com/mattn/go-runewidth v0.0.15/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= +github.com/mattn/go-runewidth v0.0.16 h1:E5ScNMtiwvlvB5paMFdw9p4kSQzbXFikJ5SQO6TULQc= +github.com/mattn/go-runewidth v0.0.16/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= +github.com/mattn/go-shellwords v1.0.12 h1:M2zGm7EW6UQJvDeQxo4T51eKPurbeFbe8WtebGE2xrk= +github.com/mattn/go-shellwords v1.0.12/go.mod h1:EZzvwXDESEeg03EKmM+RmDnNOPKG4lLtQsUlTZDWQ8Y= +github.com/mattn/go-sqlite3 v1.6.0/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc= github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= github.com/mholt/archives v0.1.5 h1:Fh2hl1j7VEhc6DZs2DLMgiBNChUux154a1G+2esNvzQ= github.com/mholt/archives v0.1.5/go.mod h1:3TPMmBLPsgszL+1As5zECTuKwKvIfj6YcwWPpeTAXF4= @@ -882,6 +1041,9 @@ github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3N github.com/miekg/dns v1.1.35/go.mod h1:KNUDUusw/aVsxyTYZM1oqvCicbwhgbNgztCETuNZ7xM= github.com/miekg/dns v1.1.72 h1:vhmr+TF2A3tuoGNkLDFK9zi36F2LS+hKTRW0Uf8kbzI= github.com/miekg/dns v1.1.72/go.mod h1:+EuEPhdHOsfk6Wk5TT2CzssZdqkmFhf8r+aVyDEToIs= +github.com/miekg/pkcs11 v1.0.2/go.mod h1:XsNlhZGX73bx86s2hdc/FuaLm2CPZJemRLMA+WTFxgs= +github.com/miekg/pkcs11 v1.1.1 h1:Ugu9pdy6vAYku5DEpVWVFPYnzV+bxB+iRdbuFSu7TvU= +github.com/miekg/pkcs11 v1.1.1/go.mod h1:XsNlhZGX73bx86s2hdc/FuaLm2CPZJemRLMA+WTFxgs= github.com/mikelolasagasti/xz v1.0.1 h1:Q2F2jX0RYJUG3+WsM+FJknv+6eVjsjXNDV0KJXZzkD0= github.com/mikelolasagasti/xz v1.0.1/go.mod h1:muAirjiOUxPRXwm9HdDtB3uoRPrGnL85XHtokL9Hcgc= github.com/mikioh/tcp v0.0.0-20190314235350-803a9b46060c h1:bzE/A84HN25pxAuk9Eej1Kz9OUelF97nAc82bDquQI8= @@ -906,23 +1068,46 @@ github.com/mitchellh/go-testing-interface v1.0.0/go.mod h1:kRemZodwjscx+RGhAo8eI github.com/mitchellh/go-testing-interface v1.14.1 h1:jrgshOhYAUVNMAJiKbEu7EqAwgJJ2JqpQmpLJOu07cU= github.com/mitchellh/go-testing-interface v1.14.1/go.mod h1:gfgS7OtZj6MA4U1UrDRp04twqAjfvlZyCfX3sDjEym8= github.com/mitchellh/gox v0.4.0/go.mod h1:Sd9lOJ0+aimLBi73mGofS1ycjY8lL3uZM3JPS42BGNg= +github.com/mitchellh/hashstructure/v2 v2.0.2 h1:vGKWl0YJqUNxE8d+h8f6NJLcCJrgbhC4NcD46KavDd4= +github.com/mitchellh/hashstructure/v2 v2.0.2/go.mod h1:MG3aRVU/N29oo/V/IhBX8GR/zz4kQkprJgF2EVszyDE= github.com/mitchellh/iochan v1.0.0/go.mod h1:JwYml1nuB7xOzsp52dPpHFffvOCDupsG0QubkSMEySY= +github.com/mitchellh/mapstructure v0.0.0-20150613213606-2caf8efc9366/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY= github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= github.com/mitchellh/pointerstructure v1.2.0 h1:O+i9nHnXS3l/9Wu7r4NrEdwA2VFTicjUEN1uBnDo34A= github.com/mitchellh/pointerstructure v1.2.0/go.mod h1:BRAsLI5zgXmw97Lf6s25bs8ohIXc3tViBH44KcwB2g4= +github.com/moby/buildkit v0.25.1 h1:j7IlVkeNbEo+ZLoxdudYCHpmTsbwKvhgc/6UJ/mY/o8= +github.com/moby/buildkit v0.25.1/go.mod h1:phM8sdqnvgK2y1dPDnbwI6veUCXHOZ6KFSl6E164tkc= github.com/moby/docker-image-spec v1.3.1 h1:jMKff3w6PgbfSa69GfNg+zN/XLhfXJGnEx3Nl2EsFP0= github.com/moby/docker-image-spec v1.3.1/go.mod h1:eKmb5VW8vQEh/BAr2yvVNvuiJuY6UIocYsFu/DxxRpo= +github.com/moby/go-archive v0.1.0 h1:Kk/5rdW/g+H8NHdJW2gsXyZ7UnzvJNOy6VKJqueWdcQ= +github.com/moby/go-archive v0.1.0/go.mod h1:G9B+YoujNohJmrIYFBpSd54GTUB4lt9S+xVQvsJyFuo= +github.com/moby/locker v1.0.1 h1:fOXqR41zeveg4fFODix+1Ch4mj/gT0NE1XJbp/epuBg= +github.com/moby/locker v1.0.1/go.mod h1:S7SDdo5zpBK84bzzVlKr2V0hz+7x9hWbYC/kq7oQppc= github.com/moby/moby v28.5.2+incompatible h1:hIn6qcenb3JY1E3STwqEbBvJ8bha+u1LpqjX4CBvNCk= github.com/moby/moby v28.5.2+incompatible/go.mod h1:fDXVQ6+S340veQPv35CzDahGBmHsiclFwfEygB/TWMc= +github.com/moby/patternmatcher v0.6.0 h1:GmP9lR19aU5GqSSFko+5pRqHi+Ohk1O69aFiKkVGiPk= +github.com/moby/patternmatcher v0.6.0/go.mod h1:hDPoyOpDY7OrrMDLaYoY3hf52gNCR/YOUYxkhApJIxc= +github.com/moby/spdystream v0.5.0 h1:7r0J1Si3QO/kjRitvSLVVFUjxMEb/YLj6S9FF62JBCU= +github.com/moby/spdystream v0.5.0/go.mod h1:xBAYlnt/ay+11ShkdFKNAG7LsyK/tmNBVvVOwrfMgdI= github.com/moby/sys/atomicwriter v0.1.0 h1:kw5D/EqkBwsBFi0ss9v1VG3wIkVhzGvLklJ+w3A14Sw= github.com/moby/sys/atomicwriter v0.1.0/go.mod h1:Ul8oqv2ZMNHOceF643P6FKPXeCmYtlQMvpizfsSoaWs= +github.com/moby/sys/capability v0.4.0 h1:4D4mI6KlNtWMCM1Z/K0i7RV1FkX+DBDHKVJpCndZoHk= +github.com/moby/sys/capability v0.4.0/go.mod h1:4g9IK291rVkms3LKCDOoYlnV8xKwoDTpIrNEE35Wq0I= +github.com/moby/sys/mountinfo v0.7.2 h1:1shs6aH5s4o5H2zQLn796ADW1wMrIwHsyJ2v9KouLrg= +github.com/moby/sys/mountinfo v0.7.2/go.mod h1:1YOa8w8Ih7uW0wALDUgT1dTTSBrZ+HiBLGws92L2RU4= github.com/moby/sys/sequential v0.6.0 h1:qrx7XFUd/5DxtqcoH1h438hF5TmOvzC/lspjy7zgvCU= github.com/moby/sys/sequential v0.6.0/go.mod h1:uyv8EUTrca5PnDsdMGXhZe6CCe8U/UiTWd+lL+7b/Ko= +github.com/moby/sys/signal v0.7.1 h1:PrQxdvxcGijdo6UXXo/lU/TvHUWyPhj7UOpSo8tuvk0= +github.com/moby/sys/signal v0.7.1/go.mod h1:Se1VGehYokAkrSQwL4tDzHvETwUZlnY7S5XtQ50mQp8= +github.com/moby/sys/symlink v0.3.0 h1:GZX89mEZ9u53f97npBy4Rc3vJKj7JBDj/PN2I22GrNU= +github.com/moby/sys/symlink v0.3.0/go.mod h1:3eNdhduHmYPcgsJtZXW1W4XUJdZGBIkttZ8xKqPUJq0= github.com/moby/sys/user v0.4.0 h1:jhcMKit7SA80hivmFJcbB1vqmw//wU61Zdui2eQXuMs= github.com/moby/sys/user v0.4.0/go.mod h1:bG+tYYYJgaMtRKgEmuueC0hJEAZWwtIbZTB+85uoHjs= +github.com/moby/sys/userns v0.1.0 h1:tVLXkFOxVu9A64/yh59slHVv9ahO9UIev4JZusOLG/g= +github.com/moby/sys/userns v0.1.0/go.mod h1:IHUYgu/kao6N8YZlp9Cf444ySSvCmDlmzUcYfDHOl28= github.com/moby/term v0.5.2 h1:6qk3FJAFDs6i/q3W/pQ97SX192qKfZgGjCQqfCJkgzQ= github.com/moby/term v0.5.2/go.mod h1:d3djjFCrjnB+fl8NJux+EJzu0msscUP+f8it8hPkFLc= github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= @@ -974,6 +1159,8 @@ github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRW github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f h1:KUppIJq7/+SVif2QVs3tOP0zanoHgBEVAwHxUSIzRqU= github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= github.com/mwitkow/grpc-proxy v0.0.0-20181017164139-0f1106ef9c76/go.mod h1:x5OoJHDHqxHS801UIuhqGl6QdSAEJvtausosHSdazIo= +github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f h1:y5//uYreIhSUg3J1GEMiLbxo1LJaP8RfCpH6pymGZus= +github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f/go.mod h1:ZdcZmHo+o7JKHSa8/e818NopupXU1YMK5fe1lsApnBw= github.com/naoina/go-stringutil v0.1.0 h1:rCUeRUHjBjGTSHl0VC00jUPLz8/F9dDzYI70Hzifhks= github.com/naoina/go-stringutil v0.1.0/go.mod h1:XJ2SJL9jCtBh+P9q5btrd/Ylo8XwT/h1USek5+NqSA0= github.com/naoina/toml v0.1.2-0.20170918210437-9fafd6967416 h1:shk/vn9oCoOTmwcouEdwIeOtOGA/ELRUw/GwvxwfT+0= @@ -1006,22 +1193,32 @@ github.com/olekukonko/tablewriter v0.0.5 h1:P2Ga83D34wi1o9J6Wh1mRuqd4mF/x/lgBS7N github.com/olekukonko/tablewriter v0.0.5/go.mod h1:hPp6KlRPjbx+hW8ykQs1w3UBbZlj6HuIJcUGPhkA7kY= github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.7.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/ginkgo v1.12.0/go.mod h1:oUhWkIvk5aDxtKvDDuw8gItl8pKl42LzjC9KZE0HfGg= github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk= github.com/onsi/ginkgo v1.14.0/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9klQyY= github.com/onsi/ginkgo v1.16.5 h1:8xi0RTUf59SOSfEtZMvwTvXYMzG4gV23XVHOZiXNtnE= github.com/onsi/ginkgo v1.16.5/go.mod h1:+E8gABHa3K6zRBolWtd+ROzc/U5bkGt0FwiG042wbpU= +github.com/onsi/ginkgo/v2 v2.21.0 h1:7rg/4f3rB88pb5obDgNZrNHrQ4e6WpjonchcpuBRnZM= +github.com/onsi/ginkgo/v2 v2.21.0/go.mod h1:7Du3c42kxCUegi0IImZ1wUQzMBVecgIHjR1C+NkhLQo= github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= +github.com/onsi/gomega v1.9.0/go.mod h1:Ho0h+IUsWyvy1OpqCwxlQ/21gkhVunqlU8fDGcoTdcA= github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= github.com/onsi/gomega v1.38.0 h1:c/WX+w8SLAinvuKKQFh77WEucCnPk4j2OTUr7lt7BeY= github.com/onsi/gomega v1.38.0/go.mod h1:OcXcwId0b9QsE7Y49u+BTrL4IdKOBOKnD6VQNTJEB6o= github.com/op/go-logging v0.0.0-20160315200505-970db520ece7/go.mod h1:HzydrMdWErDVzsI23lYNej1Htcns9BCg93Dk0bBINWk= +github.com/opencontainers/go-digest v0.0.0-20170106003457-a6d0ee40d420/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s= github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8Oi/yOhh5U= github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM= +github.com/opencontainers/image-spec v1.0.1/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0= github.com/opencontainers/image-spec v1.1.1 h1:y0fUlFfIZhPF1W537XOLg0/fcx6zcHCJwooC2xJA040= github.com/opencontainers/image-spec v1.1.1/go.mod h1:qpqAh3Dmcf36wStyyWU+kCeDgrGnAve2nCC8+7h8Q0M= github.com/opencontainers/runc v1.3.6 h1:SLGIymCtsk80iNPWgbc8dtjI30r+5mTVV+4dN8/17Sk= github.com/opencontainers/runc v1.3.6/go.mod h1:o1wyv76EDlTkcf0KTFgN8bMWLPvgF/HfX709lDv+rr4= +github.com/opencontainers/runtime-spec v1.2.1 h1:S4k4ryNgEpxW1dzyqffOmhI1BHYcjzU8lpJfSlR0xww= +github.com/opencontainers/runtime-spec v1.2.1/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= +github.com/opencontainers/selinux v1.12.0 h1:6n5JV4Cf+4y0KNXW48TLj5DwfXpvWlxXplUkdTrmPb8= +github.com/opencontainers/selinux v1.12.0/go.mod h1:BTPX+bjVbWGXw7ZZWUbdENt8w0htPSrlgOOysQaU62U= github.com/opentracing-contrib/go-observer v0.0.0-20170622124052-a52f23424492/go.mod h1:Ngi6UdF0k5OKD5t5wlmGhe/EDKPoUM3BXZSSfIuJbis= github.com/opentracing/basictracer-go v1.0.0/go.mod h1:QfBfYuafItcjQuMwinw9GhYKwFXS9KnPs5lxoYwgW74= github.com/opentracing/opentracing-go v1.0.2/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= @@ -1040,6 +1237,8 @@ github.com/pbnjay/memory v0.0.0-20210728143218-7b4eea64cf58 h1:onHthvaw9LFnH4t2D github.com/pbnjay/memory v0.0.0-20210728143218-7b4eea64cf58/go.mod h1:DXv8WO4yhMYhSNPKjeNKa5WY9YCIEBRbNzFFPJbWO6Y= github.com/pborman/uuid v1.2.0/go.mod h1:X/NO0urCmaxf9VXbdlT7C2Yzkj2IKimNn4k+gtPdI/k= github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= +github.com/pelletier/go-toml v1.9.5 h1:4yBQzkHv+7BHq2PQUZF3Mx0IYxG7LsP222s7Agd3ve8= +github.com/pelletier/go-toml v1.9.5/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c= github.com/pelletier/go-toml/v2 v2.2.4 h1:mye9XuhQ6gvn5h28+VilKrrPoQVanw5PMw/TB0t5Ec4= github.com/pelletier/go-toml/v2 v2.2.4/go.mod h1:2gIqNv+qfxSVS7cM2xJQKtLSTLUE9V8t9Stt+h56mCY= github.com/performancecopilot/speed v3.0.0+incompatible/go.mod h1:/CLtqpZ5gBg1M9iaPbIdPPGyKcA8hKdoy6hAWba7Yac= @@ -1111,14 +1310,17 @@ github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI= github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55 h1:o4JXh1EVt9k/+g42oCprj/FisM4qX9L3sZB3upGN2ZU= github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55/go.mod h1:OmDBASR4679mdNQnz2pUhc2G8CO2JrUAVFDRBDP/hJE= +github.com/prometheus/client_golang v0.9.0-pre1.0.20180209125602-c332b6f63c06/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= github.com/prometheus/client_golang v0.9.3-0.20190127221311-3c4408c8b829/go.mod h1:p2iRAGwDERtqlqzRXnrOVns+ignqQo//hLXqYxZYVNs= github.com/prometheus/client_golang v0.9.3/go.mod h1:/TN21ttK/J9q6uSwhBd54HahCDft0ttaMvbicHlPoso= github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= +github.com/prometheus/client_golang v1.1.0/go.mod h1:I1FGZT9+L76gKKOs5djB6ezCbFQP1xR9D75/vuwEF3g= github.com/prometheus/client_golang v1.3.0/go.mod h1:hJaj2vgQTGQmVCsAACORcieXFeDPbaTKGT+JTgUa3og= github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M= github.com/prometheus/client_golang v1.24.1 h1:JnJkREXzWxUdCuPFpIWZiPispT9xVV59uiuyR2bPlnU= github.com/prometheus/client_golang v1.24.1/go.mod h1:F+oSRECHg4sse5ucfYpYDeIv/hu68Zo0uoHKetWnzcE= +github.com/prometheus/client_model v0.0.0-20171117100541-99fa1f4be8e5/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= github.com/prometheus/client_model v0.0.0-20190115171406-56726106282f/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= @@ -1127,19 +1329,23 @@ github.com/prometheus/client_model v0.1.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6T github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/client_model v0.6.2 h1:oBsgwpGs7iVziMvrGhE53c/GrLUsZdHnqNwqPLxwZyk= github.com/prometheus/client_model v0.6.2/go.mod h1:y3m2F6Gdpfy6Ut/GBsUqTWZqCUvMVzSfMLjcu6wAwpE= +github.com/prometheus/common v0.0.0-20180110214958-89604d197083/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= github.com/prometheus/common v0.0.0-20181113130724-41aa239b4cce/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= github.com/prometheus/common v0.2.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= github.com/prometheus/common v0.4.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= +github.com/prometheus/common v0.6.0/go.mod h1:eBmuwkDJBwy6iBfxCBob6t6dR6ENT/y+J+Zk0j9GMYc= github.com/prometheus/common v0.7.0/go.mod h1:DjGbpBbp5NYNiECxcL/VnbXCCaQpKd3tt26CguLLsqA= github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo= github.com/prometheus/common v0.15.0/go.mod h1:U+gB1OBLb1lF3O42bTCL+FK18tX9Oar16Clt/msog/s= github.com/prometheus/common v0.70.1 h1:1HvjP4D5oL3t8RsPlwxA9onvvStjtIHYE5XuuwOi/PY= github.com/prometheus/common v0.70.1/go.mod h1:VdFUQDMZK3VLkurFUVhia6uys/0suUp86TJz5qbJRhc= +github.com/prometheus/procfs v0.0.0-20180125133057-cb4147076ac7/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= github.com/prometheus/procfs v0.0.0-20190117184657-bf6a532e95b1/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= github.com/prometheus/procfs v0.0.0-20190507164030-5867b95ac084/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= +github.com/prometheus/procfs v0.0.3/go.mod h1:4A/X28fw3Fc593LaREMrKMqOKvUAntwMDaekg4FpcdQ= github.com/prometheus/procfs v0.0.8/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+GxbHq6oeK9A= github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= github.com/prometheus/procfs v0.3.0/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= @@ -1193,11 +1399,19 @@ github.com/ryanuber/go-glob v1.0.0/go.mod h1:807d1WSdnB0XRJzKNil9Om6lcp/3a0v4qIH github.com/sagikazarmark/locafero v0.12.0 h1:/NQhBAkUb4+fH1jivKHWusDYFjMOOKU88eegjfxfHb4= github.com/sagikazarmark/locafero v0.12.0/go.mod h1:sZh36u/YSZ918v0Io+U9ogLYQJ9tLLBmM4eneO6WwsI= github.com/samuel/go-zookeeper v0.0.0-20190923202752-2cc03de413da/go.mod h1:gi+0XIa01GRL2eRQVjQkKGqKF3SF9vZR/HnPullcV2E= +github.com/santhosh-tekuri/jsonschema/v6 v6.0.2 h1:KRzFb2m7YtdldCEkzs6KqmJw4nqEVZGK7IN2kJkjTuQ= +github.com/santhosh-tekuri/jsonschema/v6 v6.0.2/go.mod h1:JXeL+ps8p7/KNMjDQk3TCwPpBy0wYklyWTfbkIzdIFU= github.com/sasha-s/go-deadlock v0.3.9 h1:fiaT9rB7g5sr5ddNZvlwheclN9IP86eFW9WgqlEQV+w= github.com/sasha-s/go-deadlock v0.3.9/go.mod h1:KuZj51ZFmx42q/mPaYbRk0P1xcwe697zsJKE03vD4/Y= github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= +github.com/secure-systems-lab/go-securesystemslib v0.6.0 h1:T65atpAVCJQK14UA57LMdZGpHi4QYSH/9FZyNGqMYIA= +github.com/secure-systems-lab/go-securesystemslib v0.6.0/go.mod h1:8Mtpo9JKks/qhPG4HGZ2LGMvrPbzuxwfz/f/zLfEWkk= +github.com/serialx/hashring v0.0.0-20200727003509-22c0c7ab6b1b h1:h+3JX2VoWTFuyQEo87pStk/a99dzIO1mM9KxIyLPGTU= +github.com/serialx/hashring v0.0.0-20200727003509-22c0c7ab6b1b/go.mod h1:/yeG0My1xr/u+HZrFQ1tOQQQQrOawfyMUH13ai5brBc= github.com/shamaton/msgpack/v2 v2.4.1 h1:JtJ141QoQ3NqgPDsjq2v9VXlaON8SiQOwEaoNLEK/MQ= github.com/shamaton/msgpack/v2 v2.4.1/go.mod h1:6khjYnkx73f7VQU7wjcFS9DFjs+59naVWJv1TB7qdOI= +github.com/shibumi/go-pathspec v1.3.0 h1:QUyMZhFo0Md5B8zV8x2tesohbb5kfbpTi9rBnKh5dkI= +github.com/shibumi/go-pathspec v1.3.0/go.mod h1:Xutfslp817l2I1cZvgcfeMQJG5QnU2lh5tVaaMCl3jE= github.com/shirou/gopsutil v3.21.11+incompatible h1:+1+c1VGhc88SSonWP6foOcLhvnKlUeu/erjjvaPEYiI= github.com/shirou/gopsutil v3.21.11+incompatible/go.mod h1:5b4v6he4MtMOwMlS0TUMTu2PcXUg8+E1lC7eC3UO/RA= github.com/shirou/gopsutil/v4 v4.26.6 h1:Mzr/npDtQC/xpeEuQKHZt8Zo9CmPvhTj8nkR8w5TLDs= @@ -1206,12 +1420,16 @@ github.com/shopspring/decimal v1.3.1/go.mod h1:DKyhrW/HYNuLGql+MJL6WCR6knT2jwCFR github.com/shopspring/decimal v1.4.0 h1:bxl37RwXBklmTi0C79JfXCEBD1cqqHt0bbgBAGFp81k= github.com/shopspring/decimal v1.4.0/go.mod h1:gawqmDU56v4yIKSwfBSFip1HdCCXN8/+DMd9qYNcwME= github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= +github.com/sirupsen/logrus v1.0.6/go.mod h1:pMByvHTf9Beacp5x1UXfOR9xyW/9antXMhjMPG0dEzc= github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= +github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMBDgk/93Q= github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88= github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= github.com/sirupsen/logrus v1.9.4 h1:TsZE7l11zFCLZnZ+teH4Umoq5BhEIfIzfRDZ1Uzql2w= github.com/sirupsen/logrus v1.9.4/go.mod h1:ftWc9WdOfJ0a92nsE2jF5u5ZwH8Bv2zdeOC42RjbV2g= +github.com/skratchdot/open-golang v0.0.0-20200116055534-eef842397966 h1:JIAuq3EEf9cgbU6AtGPK4CTG3Zf6CKMNqf0MHTggAUA= +github.com/skratchdot/open-golang v0.0.0-20200116055534-eef842397966/go.mod h1:sUM3LWHvSMaG192sy56D9F7CNvL7jUJVXoqM1QKLnog= github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM= @@ -1221,23 +1439,30 @@ github.com/sorairolake/lzip-go v0.3.8/go.mod h1:JcBqGMV0frlxwrsE9sMWXDjqn3EeVf0/ github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= github.com/spaolacci/murmur3 v1.1.0 h1:7c1g84S4BPRrfL5Xrdp6fOJ206sU9y293DDHaoy0bLI= github.com/spaolacci/murmur3 v1.1.0/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= +github.com/spdx/tools-golang v0.5.5 h1:61c0KLfAcNqAjlg6UNMdkwpMernhw3zVRwDZ2x9XOmk= +github.com/spdx/tools-golang v0.5.5/go.mod h1:MVIsXx8ZZzaRWNQpUDhC4Dud34edUYJYecciXgrw5vE= github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= github.com/spf13/afero v1.15.0 h1:b/YBCLWAJdFWJTN9cLhiXXcD7mzKn9Dm86dNnfyQw1I= github.com/spf13/afero v1.15.0/go.mod h1:NC2ByUVxtQs4b3sIUphxK0NioZnmxgyCrfzeuq8lxMg= +github.com/spf13/cast v0.0.0-20150508191742-4d07383ffe94/go.mod h1:r2rcYCSwa1IExKTDiTfzaxqT2FNHs8hODu4LnUfgKEg= github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= github.com/spf13/cast v1.10.0 h1:h2x0u2shc1QuLHfxi+cTJvs30+ZAHOGRic8uyGTDWxY= github.com/spf13/cast v1.10.0/go.mod h1:jNfB8QC9IA6ZuY2ZjDp0KtFO2LZZlg4S/7bzP6qqeHo= +github.com/spf13/cobra v0.0.1/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= github.com/spf13/cobra v0.0.3/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= github.com/spf13/cobra v1.1.1/go.mod h1:WnodtKOvamDL/PwE2M4iKs8aMDBZ5Q5klgD3qfVJQMI= github.com/spf13/cobra v1.10.2 h1:DMTTonx5m65Ic0GOoRY2c16WCbHxOOw6xxezuLaBpcU= github.com/spf13/cobra v1.10.2/go.mod h1:7C1pvHqHw5A4vrJfjNwvOdzYu0Gml16OCs2GRiTUUS4= +github.com/spf13/jwalterweatherman v0.0.0-20141219030609-3d60171a6431/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= +github.com/spf13/pflag v1.0.0/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= github.com/spf13/pflag v1.0.1/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= github.com/spf13/pflag v1.0.9/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= github.com/spf13/pflag v1.0.10 h1:4EBh2KAYBwaONj6b2Ye1GiHfwjqyROoF4RwYO+vPwFk= github.com/spf13/pflag v1.0.10/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= +github.com/spf13/viper v0.0.0-20150530192845-be5ff3e4840c/go.mod h1:A8kyI5cUJhb8N+3pkfONlcEcZbueH6nhAm0Fq7SrnBM= github.com/spf13/viper v1.7.0/go.mod h1:8WkrPz2fc9jxqZNCJI/76HCieCp4Q8HaLFoCha5qpdg= github.com/spf13/viper v1.7.1/go.mod h1:8WkrPz2fc9jxqZNCJI/76HCieCp4Q8HaLFoCha5qpdg= github.com/spf13/viper v1.21.0 h1:x5S+0EU27Lbphp4UKm1C+1oQO+rKx36vfCoaVebLFSU= @@ -1252,6 +1477,7 @@ github.com/streamingfast/logging v0.0.0-20230608130331-f22c91403091 h1:RN5mrigyi github.com/streamingfast/logging v0.0.0-20230608130331-f22c91403091/go.mod h1:VlduQ80JcGJSargkRU4Sg9Xo63wZD/l8A5NC/Uo1/uU= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE= github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA= @@ -1284,6 +1510,12 @@ github.com/teris-io/shortid v0.0.0-20171029131806-771a37caa5cf/go.mod h1:M8agBzg github.com/teris-io/shortid v0.0.0-20201117134242-e59966efd125/go.mod h1:M8agBzgqHIhgj7wEn9/0hJUZcrvt9VY+Ln+S1I5Mha0= github.com/test-go/testify v1.1.4 h1:Tf9lntrKUMHiXQ07qBScBTSA0dhYQlu83hswqelv1iE= github.com/test-go/testify v1.1.4/go.mod h1:rH7cfJo/47vWGdi4GPj16x3/t1xGOj2YxzmNQzk2ghU= +github.com/testcontainers/testcontainers-go v0.40.0 h1:pSdJYLOVgLE8YdUY2FHQ1Fxu+aMnb6JfVz1mxk7OeMU= +github.com/testcontainers/testcontainers-go v0.40.0/go.mod h1:FSXV5KQtX2HAMlm7U3APNyLkkap35zNLxukw9oBi/MY= +github.com/testcontainers/testcontainers-go/modules/compose v0.40.0 h1:Bj8W7GieY56sRbVJx1yLh0JVEtOQ8SQMhX+jRtzenLA= +github.com/testcontainers/testcontainers-go/modules/compose v0.40.0/go.mod h1:fEEGqtsoH1KS+sUi1WG4+vH3fqdCyip1U9Hd8P3SRMA= +github.com/theupdateframework/notary v0.7.0 h1:QyagRZ7wlSpjT5N2qQAh/pN+DVqgekv4DzbAiAiEL3c= +github.com/theupdateframework/notary v0.7.0/go.mod h1:c9DRxcmhHmVLDay4/2fUYdISnHqbFDGRSlXPO0AhYWw= github.com/thomaso-mirodin/intmath v0.0.0-20160323211736-5dc6d854e46e h1:cR8/SYRgyQCt5cNCMniB/ZScMkhI9nk8U5C7SbISXjo= github.com/thomaso-mirodin/intmath v0.0.0-20160323211736-5dc6d854e46e/go.mod h1:Tu4lItkATkonrYuvtVjG0/rhy15qrNGNTjPdaphtZ/8= github.com/tidwall/btree v1.8.1 h1:27ehoXvm5AG/g+1VxLS1SD3vRhp/H7LuEfwNvddEdmA= @@ -1297,12 +1529,24 @@ github.com/tidwall/match v1.2.0/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JT github.com/tidwall/pretty v1.2.0/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU= github.com/tidwall/pretty v1.2.1 h1:qjsOFOWWQl+N3RsoF5/ssm1pHmJJwhjlSbZ51I6wMl4= github.com/tidwall/pretty v1.2.1/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU= +github.com/tilt-dev/fsnotify v1.4.8-0.20220602155310-fff9c274a375 h1:QB54BJwA6x8QU9nHY3xJSZR2kX9bgpZekRKGkLTmEXA= +github.com/tilt-dev/fsnotify v1.4.8-0.20220602155310-fff9c274a375/go.mod h1:xRroudyp5iVtxKqZCrA6n2TLFRBf8bmnjr1UD4x+z7g= github.com/tklauser/go-sysconf v0.4.0 h1:7H0uAN+7RkwWRaxhYXDLqa5V3LPrJeV8wmD9dRUgPQU= github.com/tklauser/go-sysconf v0.4.0/go.mod h1:8mTNWyog7H+MpKijp4VmKJAd2bbYQ2zuUwkYRbUArPI= github.com/tklauser/numcpus v0.12.0 h1:NR85qdvHA9pFse3x3weVZ0r0ST8R6l5RHbZrlRaqob4= github.com/tklauser/numcpus v0.12.0/go.mod h1:ABHeXzJnr/qqwguhClkZKT1/8VABcYrsyUiUGobwWJg= github.com/tmc/grpc-websocket-proxy v0.0.0-20170815181823-89b8d40f7ca8/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= +github.com/tonistiigi/dchapes-mode v0.0.0-20250318174251-73d941a28323 h1:r0p7fK56l8WPequOaR3i9LBqfPtEdXIQbUTzT55iqT4= +github.com/tonistiigi/dchapes-mode v0.0.0-20250318174251-73d941a28323/go.mod h1:3Iuxbr0P7D3zUzBMAZB+ois3h/et0shEz0qApgHYGpY= +github.com/tonistiigi/fsutil v0.0.0-20250605211040-586307ad452f h1:MoxeMfHAe5Qj/ySSBfL8A7l1V+hxuluj8owsIEEZipI= +github.com/tonistiigi/fsutil v0.0.0-20250605211040-586307ad452f/go.mod h1:BKdcez7BiVtBvIcef90ZPc6ebqIWr4JWD7+EvLm6J98= +github.com/tonistiigi/go-csvvalue v0.0.0-20240814133006-030d3b2625d0 h1:2f304B10LaZdB8kkVEaoXvAMVan2tl9AiK4G0odjQtE= +github.com/tonistiigi/go-csvvalue v0.0.0-20240814133006-030d3b2625d0/go.mod h1:278M4p8WsNh3n4a1eqiFcV2FGk7wE5fwUpUom9mK9lE= +github.com/tonistiigi/units v0.0.0-20180711220420-6950e57a87ea h1:SXhTLE6pb6eld/v/cCndK0AMpt1wiVFb/YYmqB3/QG0= +github.com/tonistiigi/units v0.0.0-20180711220420-6950e57a87ea/go.mod h1:WPnis/6cRcDZSUvVmezrxJPkiO87ThFYsoUiMwWNDJk= +github.com/tonistiigi/vt100 v0.0.0-20240514184818-90bafcd6abab h1:H6aJ0yKQ0gF49Qb2z5hI1UHxSQt4JMyxebFR15KnApw= +github.com/tonistiigi/vt100 v0.0.0-20240514184818-90bafcd6abab/go.mod h1:ulncasL3N9uLrVann0m+CDlJKWsIAP34MPcOJF6VRvc= github.com/twitchyliquid64/golang-asm v0.15.1 h1:SU5vSMR7hnwNxj24w34ZyCi/FmDZTkS4MhqMhdFk5YI= github.com/twitchyliquid64/golang-asm v0.15.1/go.mod h1:a1lVb/DtPvCB8fslRZhAngC2+aY1QWCk3Cedj/Gdt08= github.com/ugorji/go v1.1.7/go.mod h1:kZn38zHttfInRq0xu/PH0az30d+z6vm202qpg1oXVMw= @@ -1311,15 +1555,21 @@ github.com/ulikunitz/xz v0.5.8/go.mod h1:nbz6k7qbPmH4IRqmfOplQw/tblSgqTqBwxkY0oW github.com/ulikunitz/xz v0.5.15 h1:9DNdB5s+SgV3bQ2ApL10xRc35ck0DuIX/isZvIk+ubY= github.com/ulikunitz/xz v0.5.15/go.mod h1:nbz6k7qbPmH4IRqmfOplQw/tblSgqTqBwxkY0oWt/14= github.com/urfave/cli v1.20.0/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA= -github.com/urfave/cli v1.22.1 h1:+mkCCcOFKPnCmVYVcURKps1Xe+3zP90gSYGNfRkjoIY= github.com/urfave/cli v1.22.1/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= -github.com/urfave/cli/v2 v2.27.5 h1:WoHEJLdsXr6dDWoJgMq/CboDmyY/8HMMH1fTECbih+w= -github.com/urfave/cli/v2 v2.27.5/go.mod h1:3Sevf16NykTbInEnD0yKkjDAeZDS0A6bzhBH5hrMvTQ= +github.com/urfave/cli v1.22.17 h1:SYzXoiPfQjHBbkYxbew5prZHS1TOLT3ierW8SYLqtVQ= +github.com/urfave/cli/v2 v2.27.6 h1:VdRdS98FNhKZ8/Az8B7MTyGQmpIr36O1EHybx/LaZ4g= +github.com/urfave/cli/v2 v2.27.6/go.mod h1:3Sevf16NykTbInEnD0yKkjDAeZDS0A6bzhBH5hrMvTQ= github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= github.com/valyala/fasttemplate v1.0.1/go.mod h1:UQGH1tvbgY+Nz5t2n7tXsz52dQxojPUpymEIMZ47gx8= github.com/valyala/fasttemplate v1.2.1/go.mod h1:KHLXt3tVN2HBp8eijSv/kGJopbvo7S+qRAEEKiv+SiQ= +github.com/vbatts/tar-split v0.12.1 h1:CqKoORW7BUWBe7UL/iqTVvkTBOF8UvOMKOIZykxnnbo= +github.com/vbatts/tar-split v0.12.1/go.mod h1:eF6B6i6ftWQcDqEn3/iGFRFRo8cBIMSJVOpnNdfTMFA= github.com/wlynxg/anet v0.0.5 h1:J3VJGi1gvo0JwZ/P1/Yc/8p63SoW98B5dHkYDmpgvvU= github.com/wlynxg/anet v0.0.5/go.mod h1:eay5PRQr7fIVAMbTbchTnO9gG65Hg/uYGdc7mguHxoA= +github.com/x448/float16 v0.8.4 h1:qLwI1I70+NjRFUR3zs1JPUCgaCXSh3SW62uAKT1mSBM= +github.com/x448/float16 v0.8.4/go.mod h1:14CWIYCyZA/cWjXOioeEpHeN/83MdbZDRQHoFcYsOfg= +github.com/xhit/go-str2duration/v2 v2.1.0 h1:lxklc02Drh6ynqX+DdPyp5pCKLUQpRT8bp8Ydu2Bstc= +github.com/xhit/go-str2duration/v2 v2.1.0/go.mod h1:ohY8p+0f07DiV6Em5LKB0s2YpLtXVyJfNt1+BlmyAsU= github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= github.com/xrash/smetrics v0.0.0-20240521201337-686a1a2994c1 h1:gEOO8jv9F4OT7lGCjxCBTO/36wtF6j2nSip77qHd4x4= github.com/xrash/smetrics v0.0.0-20240521201337-686a1a2994c1/go.mod h1:Ohn+xnUBiLI6FVj/9LpzZWtj1/D6lUovWYBkxHVV3aM= @@ -1332,6 +1582,8 @@ github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1 github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= github.com/yusufpapurcu/wmi v1.2.4 h1:zFUKzehAFReQwLys1b/iSMl+JQGSCSjtVqQn9bBrPo0= github.com/yusufpapurcu/wmi v1.2.4/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0= +github.com/zclconf/go-cty v1.17.0 h1:seZvECve6XX4tmnvRzWtJNHdscMtYEx5R7bnnVyd/d0= +github.com/zclconf/go-cty v1.17.0/go.mod h1:wqFzcImaLTI6A5HfsRwB0nj5n0MRZFwmey8YoFPPs3U= github.com/zondax/golem v0.27.0 h1:IbBjGIXF3SoGOZHsILJvIM/F/ylwJzMcHAcggiqniPw= github.com/zondax/golem v0.27.0/go.mod h1:AmorCgJPt00L8xN1VrMBe13PSifoZksnQ1Ge906bu4A= github.com/zondax/hid v0.9.2 h1:WCJFnEDMiqGF64nlZz28E9qLVZ0KSJ7xpc5DLEyma2U= @@ -1354,6 +1606,8 @@ go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk= +go.opencensus.io v0.24.0 h1:y73uSU6J157QMP2kn2r30vwW1A2W2WFwSCGnAVxeaD0= +go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo= go.opentelemetry.io/auto/sdk v1.2.1 h1:jXsnJ4Lmnqd11kwkBV2LgLoFMZKizbCi5fNZ/ipaZ64= go.opentelemetry.io/auto/sdk v1.2.1/go.mod h1:KRTj+aOaElaLi+wW1kO/DZRXwkF4C5xPbEe3ZiIhN7Y= go.opentelemetry.io/contrib/bridges/otelslog v0.19.0 h1:5RgvxieNq9tS3ewrV1vnODvbHPfKUIJcYtF9Cvz+6aQ= @@ -1364,6 +1618,8 @@ go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.6 go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.69.0/go.mod h1:D7J12YRapIekYyPWgGPlA/23pRmpSEZC5xJC/TTLI9U= go.opentelemetry.io/contrib/instrumentation/host v0.69.0 h1:N/wKAdIOKd9U4bwiwY3j95e2ZR48onTMR/NI/SZQ/a4= go.opentelemetry.io/contrib/instrumentation/host v0.69.0/go.mod h1:rE1Bxmu3mwcmyTJV4EQdJ/C6zCUnuT9jCiinhRXLAXc= +go.opentelemetry.io/contrib/instrumentation/net/http/httptrace/otelhttptrace v0.60.0 h1:0tY123n7CdWMem7MOVdKOt0YfshufLCwfE5Bob+hQuM= +go.opentelemetry.io/contrib/instrumentation/net/http/httptrace/otelhttptrace v0.60.0/go.mod h1:CosX/aS4eHnG9D7nESYpV753l4j9q5j3SL/PUYd2lR8= go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.68.0 h1:CqXxU8VOmDefoh0+ztfGaymYbhdB/tT3zs79QaZTNGY= go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.68.0/go.mod h1:BuhAPThV8PBHBvg8ZzZ/Ok3idOdhWIodywz2xEcRbJo= go.opentelemetry.io/contrib/instrumentation/runtime v0.69.0 h1:MtkMsuRo3zEXTTMALfyrszwCDZTkB6wolyPjbwFAdq0= @@ -1467,15 +1723,18 @@ golang.org/x/arch v0.26.0/go.mod h1:0X+GdSIP+kL5wPmpK7sdkEVTt2XoYP0cSjQSbZBwOi8= golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20190325154230-a5d413f7728c/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190611184440-5c40567a22f8/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20200302210943-78000ba7a073/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200602180216-279210d13fed/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200728195943-123391ffb6de/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200820211705-5c72a883971a/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20201117144127-c1f2f97bffc9/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= golang.org/x/crypto v0.0.0-20201221181555-eec23a3978ad/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= @@ -1600,6 +1859,7 @@ golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190801041406-cbf593c0f2f3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190804053845-51ab0e2deafa/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190813064441-fde4db37ae7a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190826190057-c7b8b68b1456/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -1635,9 +1895,11 @@ golang.org/x/sys v0.0.0-20201204225414-ed752295db88/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210331175145-43e1dd70ce54/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210616094352-59db8d763f22/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210809222454-d867a43fc93e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= @@ -1645,6 +1907,7 @@ golang.org/x/sys v0.0.0-20211025201205-69cdffdb9359/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220310020820-b874c991c1a5/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220315194320-039c03cc5b86/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220503163025-988cb79eb6c6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= @@ -1756,6 +2019,8 @@ google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7 google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= google.golang.org/appengine v1.6.2/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= +google.golang.org/appengine v1.6.8 h1:IhEN5q69dyKagZPYMSdIjS2HqprW324FRQZJcGqPAsM= +google.golang.org/appengine v1.6.8/go.mod h1:1jJ3jBArFh5pcgW8gCtRJnepW8FzD1V44FJffLiz/Ds= google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= google.golang.org/genproto v0.0.0-20180831171423-11092d34479b/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= @@ -1789,6 +2054,7 @@ google.golang.org/genproto/googleapis/api v0.0.0-20260526163538-3dc84a4a5aaa h1: google.golang.org/genproto/googleapis/api v0.0.0-20260526163538-3dc84a4a5aaa/go.mod h1:q4lMZS6kskjT5HvCPrnnypcDPVJqT/f4nfxmkE7gryY= google.golang.org/genproto/googleapis/rpc v0.0.0-20260526163538-3dc84a4a5aaa h1:mZHHdPZl0dbGHCflZgAq/Q468DWVFcU2whhB2KAo8fk= google.golang.org/genproto/googleapis/rpc v0.0.0-20260526163538-3dc84a4a5aaa/go.mod h1:4Hqkh8ycfw05ld/3BWL7rJOSfebL2Q+DVDeRgYgxUU8= +google.golang.org/grpc v1.0.5/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw= google.golang.org/grpc v1.17.0/go.mod h1:6QZJwpn2B+Zp71q/5VxRsJ6NXXVCE5NRUHRo+f3cWCs= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= google.golang.org/grpc v1.20.0/go.mod h1:chYK+tFQF0nDUGJgXMSgLCQk3phJEuONr2DCgLDdAQM= @@ -1829,23 +2095,36 @@ google.golang.org/protobuf v1.36.12 h1:pJOKDDOyeXErUroCihFAd5LQuwXBSpVnKGrj5o/fw google.golang.org/protobuf v1.36.12/go.mod h1:HTf+CrKn2C3g5S8VImy6tdcUvCska2kB7j23XfzDpco= gopkg.in/Knetic/govaluate.v3 v3.0.0 h1:18mUyIt4ZlRlFZAAfVetz4/rzlJs9yhN+U02F4u1AOc= gopkg.in/Knetic/govaluate.v3 v3.0.0/go.mod h1:csKLBORsPbafmSCGTEh3U7Ozmsuq8ZSIlKk1bcqph0E= +gopkg.in/airbrake/gobrake.v2 v2.0.9/go.mod h1:/h5ZAUhDkGaJfjzjKLSjv6zCL6O0LLBxU4K+aSYdM/U= gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= gopkg.in/cenkalti/backoff.v1 v1.1.0 h1:Arh75ttbsvlpVA7WtVpH4u9h6Zl46xuptxqLxPiSo4Y= gopkg.in/cenkalti/backoff.v1 v1.1.0/go.mod h1:J6Vskwqd+OMVJl8C33mmtxTBs2gyzfv7UDAkHu8BrjI= +gopkg.in/cenkalti/backoff.v2 v2.2.1 h1:eJ9UAg01/HIHG987TwxvnzK2MgxXq97YY6rYDpY9aII= +gopkg.in/cenkalti/backoff.v2 v2.2.1/go.mod h1:S0QdOvT2AlerfSBkp0O+dk+bbIMaNbEmVk876gPCthU= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20200902074654-038fdea0a05b/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= gopkg.in/cheggaaa/pb.v1 v1.0.25/go.mod h1:V/YB90LKu/1FcN3WVnfiiE5oMCibMjukxqG/qStrOgw= gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= +gopkg.in/evanphx/json-patch.v4 v4.12.0 h1:n6jtcsulIzXPJaxegRbvFNNrZDjbij7ny3gmSPG+6V4= +gopkg.in/evanphx/json-patch.v4 v4.12.0/go.mod h1:p8EYWUEYMpynmqDbY58zCKCFZw8pRWMG4EsWvDvM72M= gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= gopkg.in/gcfg.v1 v1.2.3/go.mod h1:yesOnuUOFQAhST5vPY4nbZsb/huCgGGXlipJsBn0b3o= +gopkg.in/gemnasium/logrus-airbrake-hook.v2 v2.1.2/go.mod h1:Xk6kEKp8OKb+X14hQBKWaSkCsqBpgog8nAV2xsGOxlo= +gopkg.in/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc= +gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= gopkg.in/ini.v1 v1.51.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= +gopkg.in/ini.v1 v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA= +gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= gopkg.in/natefinch/lumberjack.v2 v2.2.1 h1:bBRl1b0OH9s/DuPhuXpNl+VtCaJXFZ5/uEFST95x9zc= gopkg.in/natefinch/lumberjack.v2 v2.2.1/go.mod h1:YD8tP3GAjkrDg1eZH7EGmyESg/lsYskCTPBJVb9jqSc= gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo= +gopkg.in/rethinkdb/rethinkdb-go.v6 v6.2.1 h1:d4KQkxAaAiRY2h5Zqis161Pv91A37uZyJOx73duwUwM= +gopkg.in/rethinkdb/rethinkdb-go.v6 v6.2.1/go.mod h1:WbjuEoo1oadwzQ4apSDU+JTvmllEHtsNHS6y7vFc7iw= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= gopkg.in/warnings.v0 v0.1.2/go.mod h1:jksf8JmL6Qr/oQM2OXTHunEvvTAsrWBLb6OOjuVWRNI= @@ -1872,6 +2151,18 @@ honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWh honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= +k8s.io/api v0.32.3 h1:Hw7KqxRusq+6QSplE3NYG4MBxZw1BZnq4aP4cJVINls= +k8s.io/api v0.32.3/go.mod h1:2wEDTXADtm/HA7CCMD8D8bK4yuBUptzaRhYcYEEYA3k= +k8s.io/apimachinery v0.32.3 h1:JmDuDarhDmA/Li7j3aPrwhpNBA94Nvk5zLeOge9HH1U= +k8s.io/apimachinery v0.32.3/go.mod h1:GpHVgxoKlTxClKcteaeuF1Ul/lDVb74KpZcxcmLDElE= +k8s.io/client-go v0.32.3 h1:RKPVltzopkSgHS7aS98QdscAgtgah/+zmpAogooIqVU= +k8s.io/client-go v0.32.3/go.mod h1:3v0+3k4IcT9bXTc4V2rt+d2ZPPG700Xy6Oi0Gdl2PaY= +k8s.io/klog/v2 v2.130.1 h1:n9Xl7H1Xvksem4KFG4PYbdQCQxqc/tTUyrgXaOhHSzk= +k8s.io/klog/v2 v2.130.1/go.mod h1:3Jpz1GvMt720eyJH1ckRHK1EDfpxISzJ7I9OYgaDtPE= +k8s.io/kube-openapi v0.0.0-20241105132330-32ad38e42d3f h1:GA7//TjRY9yWGy1poLzYYJJ4JRdzg3+O6e8I+e+8T5Y= +k8s.io/kube-openapi v0.0.0-20241105132330-32ad38e42d3f/go.mod h1:R/HEjbvWI0qdfb8viZUeVZm0X6IZnxAydC7YU42CMw4= +k8s.io/utils v0.0.0-20241104100929-3ea5e8cea738 h1:M3sRQVHv7vB20Xc2ybTt7ODCeFj6JSWYFzOFnYeS6Ro= +k8s.io/utils v0.0.0-20241104100929-3ea5e8cea738/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0= lukechampine.com/blake3 v1.4.1 h1:I3Smz7gso8w4/TunLKec6K2fn+kyKtDxr/xcQEN84Wg= lukechampine.com/blake3 v1.4.1/go.mod h1:QFosUxmjB8mnrWFSNwKmvxHpfY72bmD2tQ0kBMM3kwo= modernc.org/cc/v4 v4.27.1 h1:9W30zRlYrefrDV2JE2O8VDtJ1yPGownxciz5rrbQZis= @@ -1910,7 +2201,14 @@ pgregory.net/rapid v1.3.0/go.mod h1:dPlE4OBBxgXPqkP79flB6sJL1dx5azpI7HQ9MY9Z7uk= rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= +sigs.k8s.io/json v0.0.0-20241010143419-9aa6b5e7a4b3 h1:/Rv+M11QRah1itp8VhT6HoVx1Ray9eB4DBr+K+/sCJ8= +sigs.k8s.io/json v0.0.0-20241010143419-9aa6b5e7a4b3/go.mod h1:18nIHnGi6636UCz6m8i4DhaJ65T6EruyzmoQqI2BVDo= +sigs.k8s.io/structured-merge-diff/v4 v4.4.2 h1:MdmvkGuXi/8io6ixD5wud3vOLwc1rj0aNqRlpuvjmwA= +sigs.k8s.io/structured-merge-diff/v4 v4.4.2/go.mod h1:N8f93tFZh9U6vpxwRArLiikrE5/2tiu1w1AGfACIGE4= sigs.k8s.io/yaml v1.1.0/go.mod h1:UJmg0vDUVViEyp3mgSv9WPwZCDxu4rQW1olrI1uml+o= +sigs.k8s.io/yaml v1.4.0/go.mod h1:Ejl7/uTz7PSA4eKMyQCUTnhZYNmLIl+5c2lQPGR2BPY= sigs.k8s.io/yaml v1.6.0 h1:G8fkbMSAFqgEFgh4b1wmtzDnioxFCUgTZhlbj5P9QYs= sigs.k8s.io/yaml v1.6.0/go.mod h1:796bPqUfzR/0jLAl6XjHl3Ck7MiyVv8dbTdyT3/pMf4= sourcegraph.com/sourcegraph/appdash v0.0.0-20190731080439-ebfcffb1b5c0/go.mod h1:hI742Nqp5OhwiqlzhgfbWU4mW4yO10fP+LoT9WOswdU= +tags.cncf.io/container-device-interface v1.0.1 h1:KqQDr4vIlxwfYh0Ed/uJGVgX+CHAkahrgabg6Q8GYxc= +tags.cncf.io/container-device-interface v1.0.1/go.mod h1:JojJIOeW3hNbcnOH2q0NrWNha/JuHoDZcmYxAZwb2i0= diff --git a/e2e/interchaintestv8/ibc_eureka_test.go b/e2e/interchaintestv8/ibc_eureka_test.go index 83b8968ac..a517dbd00 100644 --- a/e2e/interchaintestv8/ibc_eureka_test.go +++ b/e2e/interchaintestv8/ibc_eureka_test.go @@ -610,38 +610,14 @@ func (s *IbcEurekaTestSuite) DeployTest(ctx context.Context, proofType types.Sup })) } -func (s *IbcEurekaTestSuite) Test_ICS20TransferERC20TokenfromEthereumToCosmosAndBack() { - ctx := context.Background() - proofType := types.GetEnvProofType() - s.ICS20TransferERC20TokenfromEthereumToCosmosAndBackTest(ctx, proofType, 1, big.NewInt(testvalues.TransferAmount)) +type ethToCosmosTransferResult struct { + denomOnCosmos transfertypes.Denom + escrowAddress ethcommon.Address } -func (s *IbcEurekaTestSuite) Test_25_ICS20TransferERC20TokenfromEthereumToCosmosAndBack() { - ctx := context.Background() - proofType := types.GetEnvProofType() - s.ICS20TransferERC20TokenfromEthereumToCosmosAndBackTest(ctx, proofType, 25, big.NewInt(testvalues.TransferAmount)) -} - -func (s *IbcEurekaTestSuite) Test_50_ICS20TransferERC20TokenfromEthereumToCosmosAndBack() { - ctx := context.Background() - proofType := types.GetEnvProofType() - s.ICS20TransferERC20TokenfromEthereumToCosmosAndBackTest(ctx, proofType, 50, big.NewInt(testvalues.TransferAmount)) -} - -func (s *IbcEurekaTestSuite) Test_ICS20TransferUint256TokenfromEthereumToCosmosAndBack() { - ctx := context.Background() - proofType := types.GetEnvProofType() - transferAmount := new(big.Int).Div(testvalues.StartingERC20Balance, big.NewInt(2)) - s.ICS20TransferERC20TokenfromEthereumToCosmosAndBackTest(ctx, proofType, 1, transferAmount) -} - -// ICS20TransferERC20TokenfromEthereumToCosmosAndBackTest tests the ICS20 transfer functionality by transferring -// ERC20 tokens with n packets from Ethereum to Cosmos chain and then back from Cosmos chain to Ethereum -func (s *IbcEurekaTestSuite) ICS20TransferERC20TokenfromEthereumToCosmosAndBackTest( +func (s *IbcEurekaTestSuite) transferERC20TokenFromEthereumToCosmos( ctx context.Context, proofType types.SupportedProofType, numOfTransfers int, transferAmount *big.Int, -) { - s.SetupSuite(ctx, proofType) - +) ethToCosmosTransferResult { eth, simd := s.Eth.Chains[0], s.Cosmos.Chains[0] ics26Address := ethcommon.HexToAddress(s.contractAddresses.Ics26Router) @@ -669,10 +645,10 @@ func (s *IbcEurekaTestSuite) ICS20TransferERC20TokenfromEthereumToCosmosAndBackT s.Require().Equal(totalTransferAmount, allowance) })) + result := ethToCosmosTransferResult{} var ( sendPacket ics26router.IICS26RouterMsgsPacket ethSendTxHash []byte - escrowAddress ethcommon.Address ) s.Require().True(s.Run(fmt.Sprintf("Send %d transfers on Ethereum", numOfTransfers), func() { timeout := uint64(time.Now().Add(30 * time.Minute).Unix()) @@ -715,26 +691,20 @@ func (s *IbcEurekaTestSuite) ICS20TransferERC20TokenfromEthereumToCosmosAndBackT s.Require().Equal(transfertypes.EncodingABI, sendPacket.Payloads[0].Encoding) s.True(s.Run("Verify balances on Ethereum", func() { - // User balance on Ethereum userBalance, err := s.erc20Contract.BalanceOf(nil, ethereumUserAddress) s.Require().NoError(err) s.Require().Equal(new(big.Int).Sub(testvalues.StartingERC20Balance, totalTransferAmount), userBalance) - // Get the escrow address - escrowAddress, err = s.ics20Contract.GetEscrow(nil, testvalues.CustomClientID) + result.escrowAddress, err = s.ics20Contract.GetEscrow(nil, testvalues.CustomClientID) s.Require().NoError(err) - // ICS20 contract balance on Ethereum - escrowBalance, err := s.erc20Contract.BalanceOf(nil, escrowAddress) + escrowBalance, err := s.erc20Contract.BalanceOf(nil, result.escrowAddress) s.Require().NoError(err) s.Require().Equal(totalTransferAmount, escrowBalance) })) })) - var ( - denomOnCosmos transfertypes.Denom - ackTxHash []byte - ) + var ackTxHash []byte s.Require().True(s.Run("Receive packets on Cosmos chain", func() { var relayTxBodyBz []byte s.Require().True(s.Run("Retrieve relay tx", func() { @@ -765,17 +735,16 @@ func (s *IbcEurekaTestSuite) ICS20TransferERC20TokenfromEthereumToCosmosAndBackT })) s.Require().True(s.Run("Verify balances on Cosmos chain", func() { - denomOnCosmos = transfertypes.NewDenom(s.contractAddresses.Erc20, transfertypes.NewHop(transfertypes.PortID, s.getEthLcClientIDOnCosmos())) + result.denomOnCosmos = transfertypes.NewDenom(s.contractAddresses.Erc20, transfertypes.NewHop(transfertypes.PortID, s.getEthLcClientIDOnCosmos())) - // User balance on Cosmos chain resp, err := e2esuite.GRPCQuery[banktypes.QueryBalanceResponse](ctx, simd, &banktypes.QueryBalanceRequest{ Address: cosmosUserAddress, - Denom: denomOnCosmos.IBCDenom(), + Denom: result.denomOnCosmos.IBCDenom(), }) s.Require().NoError(err) s.Require().NotNil(resp.Balance) s.Require().Equal(totalTransferAmount, resp.Balance.Amount.BigInt()) - s.Require().Equal(denomOnCosmos.IBCDenom(), resp.Balance.Denom) + s.Require().Equal(result.denomOnCosmos.IBCDenom(), resp.Balance.Denom) })) })) @@ -802,7 +771,6 @@ func (s *IbcEurekaTestSuite) ICS20TransferERC20TokenfromEthereumToCosmosAndBackT s.Require().Equal(ethtypes.ReceiptStatusSuccessful, receipt.Status, fmt.Sprintf("Tx failed: %+v", receipt)) s.T().Logf("Multicall ack %d packets gas used: %d", numOfTransfers, receipt.GasUsed) - // Verify the ack packet event exists _, err = e2esuite.GetEvmEvent(receipt, s.ics26Contract.ParseAckPacket) s.Require().NoError(err) })) @@ -813,18 +781,69 @@ func (s *IbcEurekaTestSuite) ICS20TransferERC20TokenfromEthereumToCosmosAndBackT )) s.Require().True(s.Run("Verify balances on Ethereum", func() { - // User balance on Ethereum userBalance, err := s.erc20Contract.BalanceOf(nil, ethereumUserAddress) s.Require().NoError(err) s.Require().Equal(new(big.Int).Sub(testvalues.StartingERC20Balance, totalTransferAmount), userBalance) - // ICS20 contract balance on Ethereum - escrowBalance, err := s.erc20Contract.BalanceOf(nil, escrowAddress) + escrowBalance, err := s.erc20Contract.BalanceOf(nil, result.escrowAddress) s.Require().NoError(err) s.Require().Equal(totalTransferAmount, escrowBalance) })) })) + return result +} + +func (s *IbcEurekaTestSuite) Test_ICS20TransferERC20TokenFromEthereumToCosmos() { + ctx := context.Background() + proofType := types.GetEnvProofType() + s.SetupSuite(ctx, proofType) + s.transferERC20TokenFromEthereumToCosmos(ctx, proofType, 1, big.NewInt(testvalues.TransferAmount)) +} + +func (s *IbcEurekaTestSuite) Test_ICS20TransferERC20TokenfromEthereumToCosmosAndBack() { + ctx := context.Background() + proofType := types.GetEnvProofType() + s.ICS20TransferERC20TokenfromEthereumToCosmosAndBackTest(ctx, proofType, 1, big.NewInt(testvalues.TransferAmount)) +} + +func (s *IbcEurekaTestSuite) Test_25_ICS20TransferERC20TokenfromEthereumToCosmosAndBack() { + ctx := context.Background() + proofType := types.GetEnvProofType() + s.ICS20TransferERC20TokenfromEthereumToCosmosAndBackTest(ctx, proofType, 25, big.NewInt(testvalues.TransferAmount)) +} + +func (s *IbcEurekaTestSuite) Test_50_ICS20TransferERC20TokenfromEthereumToCosmosAndBack() { + ctx := context.Background() + proofType := types.GetEnvProofType() + s.ICS20TransferERC20TokenfromEthereumToCosmosAndBackTest(ctx, proofType, 50, big.NewInt(testvalues.TransferAmount)) +} + +func (s *IbcEurekaTestSuite) Test_ICS20TransferUint256TokenfromEthereumToCosmosAndBack() { + ctx := context.Background() + proofType := types.GetEnvProofType() + transferAmount := new(big.Int).Div(testvalues.StartingERC20Balance, big.NewInt(2)) + s.ICS20TransferERC20TokenfromEthereumToCosmosAndBackTest(ctx, proofType, 1, transferAmount) +} + +// ICS20TransferERC20TokenfromEthereumToCosmosAndBackTest tests the ICS20 transfer functionality by transferring +// ERC20 tokens with n packets from Ethereum to Cosmos chain and then back from Cosmos chain to Ethereum +func (s *IbcEurekaTestSuite) ICS20TransferERC20TokenfromEthereumToCosmosAndBackTest( + ctx context.Context, proofType types.SupportedProofType, numOfTransfers int, transferAmount *big.Int, +) { + s.SetupSuite(ctx, proofType) + + eth, simd := s.Eth.Chains[0], s.Cosmos.Chains[0] + + ics26Address := ethcommon.HexToAddress(s.contractAddresses.Ics26Router) + ethereumUserAddress := crypto.PubkeyToAddress(s.key.PublicKey) + cosmosUserWallet := s.Cosmos.Users[0] + cosmosUserAddress := cosmosUserWallet.FormattedAddress() + + forwardTransfer := s.transferERC20TokenFromEthereumToCosmos(ctx, proofType, numOfTransfers, transferAmount) + denomOnCosmos := forwardTransfer.denomOnCosmos + escrowAddress := forwardTransfer.escrowAddress + var returnSendTxHash []byte s.Require().True(s.Run("Transfer tokens back from Cosmos chain", func() { timeout := uint64(time.Now().Add(30 * time.Minute).Unix()) @@ -929,6 +948,7 @@ func (s *IbcEurekaTestSuite) ICS20TransferERC20TokenfromEthereumToCosmosAndBackT })) })) + var ackTxHash []byte s.Require().True(s.Run("Acknowledge packets on Cosmos chain", func() { s.Require().True(s.Run("Verify commitments exists", func() { for i := range numOfTransfers { @@ -964,8 +984,9 @@ func (s *IbcEurekaTestSuite) ICS20TransferERC20TokenfromEthereumToCosmosAndBackT s.Require().True(s.Run("Broadcast relay tx", func() { resp := s.MustBroadcastSdkTxBody(ctx, simd, s.SimdRelayerSubmitter, 20_000_000, ackRelayTxBodyBz) - ackTxHash, err = hex.DecodeString(resp.TxHash) + decodedAckTxHash, err := hex.DecodeString(resp.TxHash) s.Require().NoError(err) + ackTxHash = decodedAckTxHash s.Require().NotEmpty(ackTxHash) })) diff --git a/e2e/interchaintestv8/proofapi/builder.go b/e2e/interchaintestv8/proofapi/builder.go index dedd4fc4d..85aa72083 100644 --- a/e2e/interchaintestv8/proofapi/builder.go +++ b/e2e/interchaintestv8/proofapi/builder.go @@ -104,11 +104,12 @@ func (b *ConfigBuilder) EthToCosmosAttested(p EthToCosmosAttestedParams) *Config SrcChain: p.EthChainID, DstChain: p.CosmosChainID, Config: EthToCosmosModuleConfig{ - Ics26Address: p.ICS26Address, - TmRpcUrl: p.TmRPC, - EthRpcUrl: p.EthRPC, - SignerAddress: p.SignerAddress, - Mode: AttestedMode{Config: aggConfig}, + Ics26Address: p.ICS26Address, + TmRpcUrl: p.TmRPC, + EthRpcUrl: p.EthRPC, + EthBeaconApiUrl: "", + SignerAddress: p.SignerAddress, + Mode: AttestedMode{Config: aggConfig}, }, } b.modules = append(b.modules, module) @@ -237,6 +238,40 @@ func (b *ConfigBuilder) EthToEthAttested(p EthToEthAttestedParams) *ConfigBuilde return b } +// ============================================================================= +// Besu → Besu +// ============================================================================= + +// BesuToBesuParams contains parameters for besu_to_besu module. +type BesuToBesuParams struct { + SrcChainID string + DstChainID string + SrcRPC string + DstRPC string + SrcICS26 string + DstICS26 string + ConsensusType string +} + +// BesuToBesu adds a Besu→Besu module. +func (b *ConfigBuilder) BesuToBesu(p BesuToBesuParams) *ConfigBuilder { + module := ModuleConfig{ + Name: ModuleBesuToBesu, + SrcChain: p.SrcChainID, + DstChain: p.DstChainID, + Config: BesuToBesuModuleConfig{ + SrcChainID: p.SrcChainID, + SrcRPCURL: p.SrcRPC, + SrcICS26Address: p.SrcICS26, + DstRPCURL: p.DstRPC, + DstICS26Address: p.DstICS26, + ConsensusType: p.ConsensusType, + }, + } + b.modules = append(b.modules, module) + return b +} + // ============================================================================= // Cosmos → Cosmos // ============================================================================= diff --git a/e2e/interchaintestv8/proofapi/config.go b/e2e/interchaintestv8/proofapi/config.go index fca6c89d0..5590016d7 100644 --- a/e2e/interchaintestv8/proofapi/config.go +++ b/e2e/interchaintestv8/proofapi/config.go @@ -9,6 +9,9 @@ import ( "math/rand" "net" "os" + "path/filepath" + "runtime" + "sort" "text/template" "time" @@ -21,6 +24,7 @@ const ( ModuleEthToCosmos = "eth_to_cosmos" ModuleEthToCosmosCompat = "eth_to_cosmos_compat" ModuleEthToEth = "eth_to_eth" + ModuleBesuToBesu = "besu_to_besu" ModuleSolanaToCosmos = "solana_to_cosmos" ModuleCosmosToSolana = "cosmos_to_solana" ModuleEthToSolana = "eth_to_solana" @@ -254,6 +258,16 @@ type EthToEthModuleConfig struct { Mode TxBuilderMode `json:"mode"` } +// BesuToBesuModuleConfig represents the configuration for besu_to_besu module. +type BesuToBesuModuleConfig struct { + SrcChainID string `json:"src_chain_id"` + SrcRPCURL string `json:"src_rpc_url"` + SrcICS26Address string `json:"src_ics26_address"` + DstRPCURL string `json:"dst_rpc_url"` + DstICS26Address string `json:"dst_ics26_address"` + ConsensusType string `json:"consensus_type"` +} + // AttestorConfig represents the attestor configuration section type AttestorConfig struct { AttestorQueryTimeoutMs int `json:"attestor_query_timeout_ms"` @@ -288,14 +302,91 @@ func DefaultAggregatorConfig() AggregatorConfig { } } -// DefaultSP1ProgramPaths returns the default paths for SP1 program ELF files +// DefaultSP1ProgramPaths returns the default paths for SP1 program ELF files. +// +// The e2e tests may run from a subdirectory, and newer SP1 toolchains can emit +// ELFs into either riscv32* or riscv64* target directories. Resolve the program +// paths against the repo root and prefer an existing artifact when available. func DefaultSP1ProgramPaths() SP1ProgramPaths { return SP1ProgramPaths{ - UpdateClient: "./ibc-solidity/programs/sp1-programs/target/elf-compilation/riscv64im-succinct-zkvm-elf/release/sp1-ics07-tendermint-update-client", - Membership: "./ibc-solidity/programs/sp1-programs/target/elf-compilation/riscv64im-succinct-zkvm-elf/release/sp1-ics07-tendermint-membership", - UpdateClientAndMembership: "./ibc-solidity/programs/sp1-programs/target/elf-compilation/riscv64im-succinct-zkvm-elf/release/sp1-ics07-tendermint-uc-and-membership", - Misbehaviour: "./ibc-solidity/programs/sp1-programs/target/elf-compilation/riscv64im-succinct-zkvm-elf/release/sp1-ics07-tendermint-misbehaviour", + UpdateClient: resolveSP1ProgramPath("sp1-ics07-tendermint-update-client"), + Membership: resolveSP1ProgramPath("sp1-ics07-tendermint-membership"), + UpdateClientAndMembership: resolveSP1ProgramPath("sp1-ics07-tendermint-uc-and-membership"), + Misbehaviour: resolveSP1ProgramPath("sp1-ics07-tendermint-misbehaviour"), + } +} + +func resolveSP1ProgramPath(programName string) string { + for _, candidate := range sp1ProgramPathCandidates(programName) { + if info, err := os.Stat(candidate); err == nil && !info.IsDir() && isELF(candidate) { + return candidate + } + } + + // Preserve the historical default as a final fallback so callers still get a + // predictable path in error messages when the programs have not been built. + return filepath.Join( + ".", + "ibc-solidity", + "programs", + "sp1-programs", + "target", + "elf-compilation", + "riscv64im-succinct-zkvm-elf", + "release", + programName, + ) +} + +func isELF(path string) bool { + f, err := os.Open(path) + if err != nil { + return false + } + defer f.Close() + + header := make([]byte, 5) + if _, err := f.Read(header); err != nil { + return false } + + return header[0] == 0x7f && header[1] == 'E' && header[2] == 'L' && header[3] == 'F' +} + +func sp1ProgramPathCandidates(programName string) []string { + seen := make(map[string]struct{}) + candidates := make([]string, 0, 8) + add := func(path string) { + cleaned := filepath.Clean(path) + if _, ok := seen[cleaned]; ok { + return + } + seen[cleaned] = struct{}{} + candidates = append(candidates, cleaned) + } + + repoRoot := "." + if _, thisFile, _, ok := runtime.Caller(0); ok { + repoRoot = filepath.Clean(filepath.Join(filepath.Dir(thisFile), "..", "..", "..")) + } + + preferredTargets := []string{ + "riscv64im-succinct-zkvm-elf", + "riscv32im-succinct-zkvm-elf", + } + for _, target := range preferredTargets { + add(filepath.Join(repoRoot, "ibc-solidity", "programs", "sp1-programs", "target", "elf-compilation", target, "release", programName)) + } + + globPattern := filepath.Join(repoRoot, "ibc-solidity", "programs", "sp1-programs", "target", "elf-compilation", "*", "release", programName) + if matches, err := filepath.Glob(globPattern); err == nil { + sort.Strings(matches) + for _, match := range matches { + add(match) + } + } + + return candidates } // SolanaToCosmosModuleConfig represents the configuration for solana_to_cosmos module diff --git a/e2e/interchaintestv8/testvalues/values.go b/e2e/interchaintestv8/testvalues/values.go index e579d6d12..9bded1c08 100644 --- a/e2e/interchaintestv8/testvalues/values.go +++ b/e2e/interchaintestv8/testvalues/values.go @@ -58,6 +58,8 @@ const ( EnvKeyGenerateWasmFixtures = "GENERATE_WASM_FIXTURES" // EnvKeyGenerateTendermintLightClientFixtures Generate fixtures for the tendermint light client tests if set to true. EnvKeyGenerateTendermintLightClientFixtures = "GENERATE_TENDERMINT_LIGHT_CLIENT_FIXTURES" + // EnvKeyGenerateBesuLightClientFixtures Generate fixtures for the Besu light client tests if set to true. + EnvKeyGenerateBesuLightClientFixtures = "GENERATE_BESU_LIGHT_CLIENT_FIXTURES" // The log level for the Rust logger. EnvKeyRustLog = "RUST_LOG" @@ -94,6 +96,9 @@ const ( // EthTestnetTypePoS uses Kurtosis for full PoS infrastructure with beacon chain EthTestnetTypePoS = "pos" + // EthTestnetTypeBesuQBFT uses a real 4-validator Besu QBFT network + EthTestnetTypeBesuQBFT = "besu-qbft" + // EthTestnetType_None disables Ethereum chain setup EthTestnetType_None = "none" @@ -109,7 +114,7 @@ const ( // Attestor light client (for Cosmos verification on Ethereum) CosmosLcTypeAttestor = "attestor" - // EnvKeyEthTestnetType The Ethereum testnet type (anvil|pos). + // EnvKeyEthTestnetType The Ethereum testnet type (anvil|pos|besu-qbft|none). EnvKeyEthTestnetType = "ETH_TESTNET_TYPE" // EnvKeyEthAnvilCount Number of Anvil chains to create (only when ETH_TESTNET_TYPE=anvil). Defaults to 1. EnvKeyEthAnvilCount = "ETH_ANVIL_COUNT" @@ -197,6 +202,8 @@ const ( SolanaLedgerDir = "test-ledger" // TendermintLightClientFixturesDir is the directory where the Tendermint light client fixtures are stored. TendermintLightClientFixturesDir = "packages/tendermint-light-client/fixtures/" + // BesuBFTFixturesDir is the directory where the Besu BFT light client fixtures are stored. + BesuBFTFixturesDir = "test/besu-bft/fixtures" // IbcCommitmentSlotHex is the storage slot in the IBC solidity contract for the IBC commitments. IbcCommitmentSlotHex = ics26router.IbcStoreStorageSlot @@ -229,8 +236,12 @@ const ( ParameterKey_Sp1Verifier = "sp1_verifier" // Zk algorithm parameter key for the proof API's sp1 light client creation. ParameterKey_ZkAlgorithm = "zk_algorithm" - // The role manager address parameter key for the proof API's sp1 light client creation. + // The role manager address parameter key for proof API light client creation. ParameterKey_RoleManager = "role_manager" + // Trusting period parameter key for proof API light client creation. + ParameterKey_TrustingPeriod = "trusting_period" + // Max clock drift parameter key for proof API light client creation. + ParameterKey_MaxClockDrift = "max_clock_drift" // Checksum hex parameter key for the proof API's ethereum light client creation. ParameterKey_ChecksumHex = "checksum_hex" diff --git a/e2e/interchaintestv8/types/besu_fixtures.go b/e2e/interchaintestv8/types/besu_fixtures.go new file mode 100644 index 000000000..4c6f2e197 --- /dev/null +++ b/e2e/interchaintestv8/types/besu_fixtures.go @@ -0,0 +1,767 @@ +package types + +import ( + "context" + "crypto/ecdsa" + "crypto/sha256" + "encoding/binary" + "encoding/hex" + "encoding/json" + "fmt" + "math/big" + "os" + "path/filepath" + "strings" + + ethcommon "github.com/ethereum/go-ethereum/common" + gethtypes "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/crypto" + "github.com/ethereum/go-ethereum/rlp" + + "github.com/cosmos/solidity-ibc-eureka/packages/go-abigen/ics26router" + + "github.com/srdtrk/solidity-ibc-eureka/e2e/v8/ethereum" + "github.com/srdtrk/solidity-ibc-eureka/e2e/v8/testvalues" +) + +type BesuFixtureGenerator struct { + Enabled bool +} + +type GenerateQBFTFixtureParams struct { + SourceChain *ethereum.Ethereum + RouterAddress ethcommon.Address + Packet ics26router.IICS26RouterMsgsPacket + InitialTrustedHeight uint64 + UpdateHeight11 uint64 + UpdateHeight12 uint64 + SyntheticSourceHeight uint64 + TrustingPeriod uint64 + MaxClockDrift uint64 +} + +type besuFixture struct { + RouterAddress string `json:"routerAddress"` + InitialTrustedHeight uint64 `json:"initialTrustedHeight"` + InitialTrustedTimestamp uint64 `json:"initialTrustedTimestamp"` + InitialTrustedStorageRoot string `json:"initialTrustedStorageRoot"` + InitialTrustedValidators []string `json:"initialTrustedValidators"` + TrustingPeriod uint64 `json:"trustingPeriod"` + MaxClockDrift uint64 `json:"maxClockDrift"` + UpdateHeight11 besuUpdateFixture `json:"updateHeight11"` + UpdateHeight12 besuUpdateFixture `json:"updateHeight12"` + LowQuorumHeight12 besuUpdateFixture `json:"lowQuorumHeight12"` + ConflictingHeight12 besuUpdateFixture `json:"conflictingHeight12"` + LowOverlapHeight13 besuUpdateFixture `json:"lowOverlapHeight13"` + Membership besuProofFixture `json:"membership"` + NonMembership besuProofFixture `json:"nonMembership"` +} + +type besuUpdateFixture struct { + Height uint64 `json:"height"` + HeaderRlp string `json:"headerRlp"` + TrustedHeight uint64 `json:"trustedHeight"` + AccountProof string `json:"accountProof"` + ExpectedTimestamp uint64 `json:"expectedTimestamp"` + ExpectedStorageRoot string `json:"expectedStorageRoot"` + ExpectedValidators []string `json:"expectedValidators"` +} + +type besuProofFixture struct { + Proof string `json:"proof"` + ProofHeight uint64 `json:"proofHeight"` + Path string `json:"path"` + Value string `json:"value,omitempty"` + ExpectedTimestamp uint64 `json:"expectedTimestamp"` +} + +type liveHeader struct { + Header *gethtypes.Header + HeaderRLP []byte + Validators []ethcommon.Address +} + +type mutableQBFTHeader struct { + items []rlp.RawValue + extraItems []rlp.RawValue +} + +var syntheticLowOverlapValidatorKeys = []string{ + "59c6995e998f97a5a0044966f094538f8e0f1c7f6d0bdf5f4b4a0d5c8fba8f5a", + "5de4111a39c2d6f5f2f1df6b0ad72037d399a8ce28b5c82853453ea50ccaa43d", + "7c852118294c1ec93b7d4c7d4b3f3b2d8f5f1e6d5c4b3a291817161514131211", +} + +func NewBesuFixtureGenerator() *BesuFixtureGenerator { + return &BesuFixtureGenerator{ + Enabled: os.Getenv(testvalues.EnvKeyGenerateBesuLightClientFixtures) == testvalues.EnvValueGenerateFixtures_True, + } +} + +func (g *BesuFixtureGenerator) GenerateAndSaveQBFTFixture(ctx context.Context, params GenerateQBFTFixtureParams) error { + if !g.Enabled { + return nil + } + + fixture, err := generateQBFTFixture(ctx, params) + if err != nil { + return err + } + + fixtureBz, err := json.MarshalIndent(fixture, "", " ") + if err != nil { + return err + } + + fixturePath := filepath.Join(testvalues.BesuBFTFixturesDir, "qbft.json") + return os.WriteFile(fixturePath, fixtureBz, 0o644) +} + +func generateQBFTFixture(ctx context.Context, params GenerateQBFTFixtureParams) (besuFixture, error) { + if params.SourceChain == nil { + return besuFixture{}, fmt.Errorf("missing source chain") + } + if params.InitialTrustedHeight == 0 { + return besuFixture{}, fmt.Errorf("initial trusted height must be greater than zero") + } + if params.UpdateHeight11 <= params.InitialTrustedHeight { + return besuFixture{}, fmt.Errorf("updateHeight11 must be greater than initial trusted height") + } + if params.UpdateHeight12 <= params.UpdateHeight11 { + return besuFixture{}, fmt.Errorf("updateHeight12 must be greater than updateHeight11") + } + if params.SyntheticSourceHeight <= params.UpdateHeight12 { + return besuFixture{}, fmt.Errorf("synthetic source height must be greater than updateHeight12") + } + + trustedHeader, err := fetchLiveHeader(ctx, params.SourceChain, params.InitialTrustedHeight) + if err != nil { + return besuFixture{}, err + } + update12Header, err := fetchLiveHeader(ctx, params.SourceChain, params.UpdateHeight12) + if err != nil { + return besuFixture{}, err + } + syntheticSourceHeader, err := fetchLiveHeader(ctx, params.SourceChain, params.SyntheticSourceHeight) + if err != nil { + return besuFixture{}, err + } + + validatorKeys, err := loadQBFTValidatorKeys() + if err != nil { + return besuFixture{}, err + } + + trustedProof, trustedProofRLP, err := fetchAccountProof(ctx, params.SourceChain, params.RouterAddress, params.InitialTrustedHeight) + if err != nil { + return besuFixture{}, err + } + _ = trustedProofRLP + + update11, err := buildLiveUpdateFixture(ctx, params.SourceChain, params.RouterAddress, params.InitialTrustedHeight, params.UpdateHeight11) + if err != nil { + return besuFixture{}, err + } + update12, err := buildLiveUpdateFixture(ctx, params.SourceChain, params.RouterAddress, params.InitialTrustedHeight, params.UpdateHeight12) + if err != nil { + return besuFixture{}, err + } + lowQuorumHeight12, err := buildLowQuorumFixture(update12, update12Header) + if err != nil { + return besuFixture{}, err + } + conflictingHeight12, err := buildConflictingFixture( + params.InitialTrustedHeight, + update12.Height, + syntheticSourceHeader, + validatorKeys, + params.SourceChain, + params.RouterAddress, + ) + if err != nil { + return besuFixture{}, err + } + lowOverlapHeight13, err := buildLowOverlapFixture( + params.InitialTrustedHeight, + update12.Height+1, + syntheticSourceHeader, + validatorKeys, + params.SourceChain, + params.RouterAddress, + ) + if err != nil { + return besuFixture{}, err + } + membership, err := buildMembershipFixture(ctx, params.SourceChain, params.RouterAddress, params.Packet, params.UpdateHeight12, update12Header.Header.Time) + if err != nil { + return besuFixture{}, err + } + nonMembership, err := buildNonMembershipFixture(ctx, params.SourceChain, params.RouterAddress, params.Packet, params.UpdateHeight12, update12Header.Header.Time) + if err != nil { + return besuFixture{}, err + } + + return besuFixture{ + RouterAddress: params.RouterAddress.Hex(), + InitialTrustedHeight: params.InitialTrustedHeight, + InitialTrustedTimestamp: trustedHeader.Header.Time, + InitialTrustedStorageRoot: trustedProof.StorageHash.Hex(), + InitialTrustedValidators: addressesToHex(trustedHeader.Validators), + TrustingPeriod: params.TrustingPeriod, + MaxClockDrift: params.MaxClockDrift, + UpdateHeight11: update11, + UpdateHeight12: update12, + LowQuorumHeight12: lowQuorumHeight12, + ConflictingHeight12: conflictingHeight12, + LowOverlapHeight13: lowOverlapHeight13, + Membership: membership, + NonMembership: nonMembership, + }, nil +} + +func buildLiveUpdateFixture( + ctx context.Context, + chain *ethereum.Ethereum, + routerAddress ethcommon.Address, + trustedHeight uint64, + targetHeight uint64, +) (besuUpdateFixture, error) { + header, err := fetchLiveHeader(ctx, chain, targetHeight) + if err != nil { + return besuUpdateFixture{}, err + } + proof, accountProofRLP, err := fetchAccountProof(ctx, chain, routerAddress, targetHeight) + if err != nil { + return besuUpdateFixture{}, err + } + + return besuUpdateFixture{ + Height: targetHeight, + HeaderRlp: encodeHex(header.HeaderRLP), + TrustedHeight: trustedHeight, + AccountProof: encodeHex(accountProofRLP), + ExpectedTimestamp: header.Header.Time, + ExpectedStorageRoot: proof.StorageHash.Hex(), + ExpectedValidators: addressesToHex(header.Validators), + }, nil +} + +func buildLowQuorumFixture(update besuUpdateFixture, header liveHeader) (besuUpdateFixture, error) { + mutable, err := decodeMutableQBFTHeader(header.HeaderRLP) + if err != nil { + return besuUpdateFixture{}, err + } + commitSeals, err := mutable.commitSeals() + if err != nil { + return besuUpdateFixture{}, err + } + if len(commitSeals) < 2 { + return besuUpdateFixture{}, fmt.Errorf("expected at least two commit seals, got %d", len(commitSeals)) + } + mutable.setCommitSeals(commitSeals[:2]) + mutatedHeader, err := mutable.encode() + if err != nil { + return besuUpdateFixture{}, err + } + + update.HeaderRlp = encodeHex(mutatedHeader) + return update, nil +} + +func buildConflictingFixture( + trustedHeight uint64, + targetHeight uint64, + baseHeader liveHeader, + validatorKeys map[ethcommon.Address]*ecdsa.PrivateKey, + chain *ethereum.Ethereum, + routerAddress ethcommon.Address, +) (besuUpdateFixture, error) { + mutable, err := decodeMutableQBFTHeader(baseHeader.HeaderRLP) + if err != nil { + return besuUpdateFixture{}, err + } + mutable.setHeight(targetHeight) + validators, err := mutable.validators() + if err != nil { + return besuUpdateFixture{}, err + } + signerKeys, err := signerKeysFor(validators[:3], validatorKeys) + if err != nil { + return besuUpdateFixture{}, err + } + mutable.setCommitSeals(signQBFTCommitSeals(mutable, signerKeys)) + mutatedHeader, err := mutable.encode() + if err != nil { + return besuUpdateFixture{}, err + } + + proof, accountProofRLP, err := fetchAccountProof(context.Background(), chain, routerAddress, baseHeader.Header.Number.Uint64()) + if err != nil { + return besuUpdateFixture{}, err + } + + return besuUpdateFixture{ + Height: targetHeight, + HeaderRlp: encodeHex(mutatedHeader), + TrustedHeight: trustedHeight, + AccountProof: encodeHex(accountProofRLP), + ExpectedTimestamp: baseHeader.Header.Time, + ExpectedStorageRoot: proof.StorageHash.Hex(), + ExpectedValidators: addressesToHex(validators), + }, nil +} + +func buildLowOverlapFixture( + trustedHeight uint64, + targetHeight uint64, + baseHeader liveHeader, + validatorKeys map[ethcommon.Address]*ecdsa.PrivateKey, + chain *ethereum.Ethereum, + routerAddress ethcommon.Address, +) (besuUpdateFixture, error) { + mutable, err := decodeMutableQBFTHeader(baseHeader.HeaderRLP) + if err != nil { + return besuUpdateFixture{}, err + } + mutable.setHeight(targetHeight) + + baseValidators, err := mutable.validators() + if err != nil { + return besuUpdateFixture{}, err + } + if len(baseValidators) == 0 { + return besuUpdateFixture{}, fmt.Errorf("missing base validators") + } + + syntheticKeys, err := loadSyntheticLowOverlapValidatorKeys() + if err != nil { + return besuUpdateFixture{}, err + } + lowOverlapValidators := []ethcommon.Address{ + baseValidators[0], + crypto.PubkeyToAddress(syntheticKeys[0].PublicKey), + crypto.PubkeyToAddress(syntheticKeys[1].PublicKey), + crypto.PubkeyToAddress(syntheticKeys[2].PublicKey), + } + mutable.setValidators(lowOverlapValidators) + + signerKeys, err := signerKeysFor([]ethcommon.Address{ + lowOverlapValidators[0], + lowOverlapValidators[1], + lowOverlapValidators[2], + }, mergeValidatorKeyMaps(validatorKeys, toKeyMap(syntheticKeys))) + if err != nil { + return besuUpdateFixture{}, err + } + mutable.setCommitSeals(signQBFTCommitSeals(mutable, signerKeys)) + mutatedHeader, err := mutable.encode() + if err != nil { + return besuUpdateFixture{}, err + } + + proof, accountProofRLP, err := fetchAccountProof(context.Background(), chain, routerAddress, baseHeader.Header.Number.Uint64()) + if err != nil { + return besuUpdateFixture{}, err + } + + return besuUpdateFixture{ + Height: targetHeight, + HeaderRlp: encodeHex(mutatedHeader), + TrustedHeight: trustedHeight, + AccountProof: encodeHex(accountProofRLP), + ExpectedTimestamp: baseHeader.Header.Time, + ExpectedStorageRoot: proof.StorageHash.Hex(), + ExpectedValidators: addressesToHex(lowOverlapValidators), + }, nil +} + +func buildMembershipFixture( + ctx context.Context, + chain *ethereum.Ethereum, + routerAddress ethcommon.Address, + packet ics26router.IICS26RouterMsgsPacket, + proofHeight uint64, + expectedTimestamp uint64, +) (besuProofFixture, error) { + path := packetCommitmentPath(packet) + proofRLP, err := fetchStorageProof(ctx, chain, routerAddress, path, proofHeight) + if err != nil { + return besuProofFixture{}, err + } + + return besuProofFixture{ + Proof: encodeHex(proofRLP), + ProofHeight: proofHeight, + Path: encodeHex(path), + Value: encodeHex(packetCommitment(packet)), + ExpectedTimestamp: expectedTimestamp, + }, nil +} + +func buildNonMembershipFixture( + ctx context.Context, + chain *ethereum.Ethereum, + routerAddress ethcommon.Address, + packet ics26router.IICS26RouterMsgsPacket, + proofHeight uint64, + expectedTimestamp uint64, +) (besuProofFixture, error) { + path := packetReceiptCommitmentPath(packet) + proofRLP, err := fetchStorageProof(ctx, chain, routerAddress, path, proofHeight) + if err != nil { + return besuProofFixture{}, err + } + + return besuProofFixture{ + Proof: encodeHex(proofRLP), + ProofHeight: proofHeight, + Path: encodeHex(path), + ExpectedTimestamp: expectedTimestamp, + }, nil +} + +func fetchLiveHeader(ctx context.Context, chain *ethereum.Ethereum, height uint64) (liveHeader, error) { + header, err := chain.RPCClient.HeaderByNumber(ctx, newUint64(height)) + if err != nil { + return liveHeader{}, fmt.Errorf("fetch header at height %d: %w", height, err) + } + headerRLP, err := rlp.EncodeToBytes(header) + if err != nil { + return liveHeader{}, fmt.Errorf("encode header rlp at height %d: %w", height, err) + } + mutable, err := decodeMutableQBFTHeader(headerRLP) + if err != nil { + return liveHeader{}, fmt.Errorf("decode header at height %d: %w", height, err) + } + validators, err := mutable.validators() + if err != nil { + return liveHeader{}, fmt.Errorf("extract validators at height %d: %w", height, err) + } + + return liveHeader{ + Header: header, + HeaderRLP: headerRLP, + Validators: validators, + }, nil +} + +func fetchAccountProof( + ctx context.Context, + chain *ethereum.Ethereum, + routerAddress ethcommon.Address, + height uint64, +) (ethereum.AccountProof, []byte, error) { + proof, err := chain.GetProof(ctx, routerAddress, nil, fmt.Sprintf("0x%x", height)) + if err != nil { + return ethereum.AccountProof{}, nil, fmt.Errorf("fetch account proof at height %d: %w", height, err) + } + proofRLP, err := encodeProofNodes(proof.AccountProof) + if err != nil { + return ethereum.AccountProof{}, nil, fmt.Errorf("encode account proof at height %d: %w", height, err) + } + return proof, proofRLP, nil +} + +func fetchStorageProof( + ctx context.Context, + chain *ethereum.Ethereum, + routerAddress ethcommon.Address, + path []byte, + height uint64, +) ([]byte, error) { + storageKey, err := evmICS26CommitmentStorageKey(path) + if err != nil { + return nil, err + } + proof, err := chain.GetProof(ctx, routerAddress, []string{storageKey.Hex()}, fmt.Sprintf("0x%x", height)) + if err != nil { + return nil, fmt.Errorf("fetch storage proof at height %d: %w", height, err) + } + if len(proof.StorageProof) != 1 { + return nil, fmt.Errorf("expected one storage proof at height %d, got %d", height, len(proof.StorageProof)) + } + proofRLP, err := encodeProofNodes(proof.StorageProof[0].Proof) + if err != nil { + return nil, fmt.Errorf("encode storage proof at height %d: %w", height, err) + } + return proofRLP, nil +} + +func encodeProofNodes(nodes []string) ([]byte, error) { + rawNodes := make([]rlp.RawValue, len(nodes)) + for i, node := range nodes { + rawNodes[i] = ethcommon.FromHex(node) + } + return rlp.EncodeToBytes(rawNodes) +} + +func evmICS26CommitmentStorageKey(path []byte) (ethcommon.Hash, error) { + slotHex := strings.TrimPrefix(testvalues.IbcCommitmentSlotHex, "0x") + slot, err := hex.DecodeString(slotHex) + if err != nil { + return ethcommon.Hash{}, fmt.Errorf("decode IBC commitment slot: %w", err) + } + if len(slot) != 32 { + return ethcommon.Hash{}, fmt.Errorf("invalid IBC commitment slot length: %d", len(slot)) + } + pathHash := crypto.Keccak256(path) + return crypto.Keccak256Hash(pathHash, slot), nil +} + +func packetCommitmentPath(packet ics26router.IICS26RouterMsgsPacket) []byte { + path := make([]byte, 0, len(packet.SourceClient)+1+8) + path = append(path, []byte(packet.SourceClient)...) + path = append(path, 1) + return appendUint64(path, packet.Sequence) +} + +func packetReceiptCommitmentPath(packet ics26router.IICS26RouterMsgsPacket) []byte { + path := make([]byte, 0, len(packet.DestClient)+1+8) + path = append(path, []byte(packet.DestClient)...) + path = append(path, 2) + return appendUint64(path, packet.Sequence) +} + +func packetCommitment(packet ics26router.IICS26RouterMsgsPacket) []byte { + destHash := sha256.Sum256([]byte(packet.DestClient)) + timeoutBytes := make([]byte, 8) + binary.BigEndian.PutUint64(timeoutBytes, packet.TimeoutTimestamp) + timeoutHash := sha256.Sum256(timeoutBytes) + + appBytes := make([]byte, 0, len(packet.Payloads)*32) + for _, payload := range packet.Payloads { + appBytes = append(appBytes, payloadCommitmentHash(payload)...) + } + appHash := sha256.Sum256(appBytes) + + final := make([]byte, 0, 1+32+32+32) + final = append(final, 2) + final = append(final, destHash[:]...) + final = append(final, timeoutHash[:]...) + final = append(final, appHash[:]...) + + commitment := sha256.Sum256(final) + return commitment[:] +} + +func payloadCommitmentHash(payload ics26router.IICS26RouterMsgsPayload) []byte { + parts := [][]byte{ + sha256Bytes([]byte(payload.SourcePort)), + sha256Bytes([]byte(payload.DestPort)), + sha256Bytes([]byte(payload.Version)), + sha256Bytes([]byte(payload.Encoding)), + sha256Bytes(payload.Value), + } + + concatenated := make([]byte, 0, len(parts)*32) + for _, part := range parts { + concatenated = append(concatenated, part...) + } + return sha256Bytes(concatenated) +} + +func sha256Bytes(input []byte) []byte { + sum := sha256.Sum256(input) + return sum[:] +} + +func appendUint64(dst []byte, value uint64) []byte { + var buf [8]byte + binary.BigEndian.PutUint64(buf[:], value) + return append(dst, buf[:]...) +} + +func decodeMutableQBFTHeader(headerRLP []byte) (*mutableQBFTHeader, error) { + var items []rlp.RawValue + if err := rlp.DecodeBytes(headerRLP, &items); err != nil { + return nil, err + } + if len(items) < 15 { + return nil, fmt.Errorf("expected at least 15 header items, got %d", len(items)) + } + var extraData []byte + if err := rlp.DecodeBytes(items[12], &extraData); err != nil { + return nil, err + } + var extraItems []rlp.RawValue + if err := rlp.DecodeBytes(extraData, &extraItems); err != nil { + return nil, err + } + if len(extraItems) != 5 { + return nil, fmt.Errorf("expected 5 extraData items, got %d", len(extraItems)) + } + return &mutableQBFTHeader{items: items, extraItems: extraItems}, nil +} + +func (h *mutableQBFTHeader) encode() ([]byte, error) { + extraData, err := rlp.EncodeToBytes(h.extraItems) + if err != nil { + return nil, err + } + items := cloneRawValues(h.items) + items[12], err = rlp.EncodeToBytes(extraData) + if err != nil { + return nil, err + } + return rlp.EncodeToBytes(items) +} + +func (h *mutableQBFTHeader) validators() ([]ethcommon.Address, error) { + var validators []ethcommon.Address + if err := rlp.DecodeBytes(h.extraItems[1], &validators); err != nil { + return nil, err + } + return validators, nil +} + +func (h *mutableQBFTHeader) commitSeals() ([][]byte, error) { + var seals [][]byte + if err := rlp.DecodeBytes(h.extraItems[4], &seals); err != nil { + return nil, err + } + return seals, nil +} + +func (h *mutableQBFTHeader) setHeight(height uint64) { + h.items[8] = mustRLP(height) +} + +func (h *mutableQBFTHeader) setValidators(validators []ethcommon.Address) { + h.extraItems[1] = mustRLP(validators) +} + +func (h *mutableQBFTHeader) setCommitSeals(seals [][]byte) { + h.extraItems[4] = mustRLP(seals) +} + +func signQBFTCommitSeals(header *mutableQBFTHeader, keys []*ecdsa.PrivateKey) [][]byte { + digest := header.commitSealDigest() + seals := make([][]byte, len(keys)) + for i, key := range keys { + seal, err := crypto.Sign(digest.Bytes(), key) + if err != nil { + panic(err) + } + seals[i] = seal + } + return seals +} + +func (h *mutableQBFTHeader) commitSealDigest() ethcommon.Hash { + signingExtraItems := cloneRawValues(h.extraItems) + signingExtraItems[4] = rlp.RawValue{0xc0} + signingExtraData, err := rlp.EncodeToBytes(signingExtraItems) + if err != nil { + panic(err) + } + + items := cloneRawValues(h.items) + items[12], err = rlp.EncodeToBytes(signingExtraData) + if err != nil { + panic(err) + } + payload, err := rlp.EncodeToBytes(items) + if err != nil { + panic(err) + } + return crypto.Keccak256Hash(payload) +} + +func loadQBFTValidatorKeys() (map[ethcommon.Address]*ecdsa.PrivateKey, error) { + validatorKeyPaths := []string{ + "e2e/interchaintestv8/chainconfig/testdata/besu/qbft/keys/validator1/key", + "e2e/interchaintestv8/chainconfig/testdata/besu/qbft/keys/validator2/key", + "e2e/interchaintestv8/chainconfig/testdata/besu/qbft/keys/validator3/key", + "e2e/interchaintestv8/chainconfig/testdata/besu/qbft/keys/validator4/key", + } + + keys := make(map[ethcommon.Address]*ecdsa.PrivateKey, len(validatorKeyPaths)) + for _, keyPath := range validatorKeyPaths { + keyHex, err := os.ReadFile(keyPath) + if err != nil { + return nil, err + } + key, err := crypto.HexToECDSA(strings.TrimPrefix(strings.TrimSpace(string(keyHex)), "0x")) + if err != nil { + return nil, err + } + keys[crypto.PubkeyToAddress(key.PublicKey)] = key + } + return keys, nil +} + +func loadSyntheticLowOverlapValidatorKeys() ([]*ecdsa.PrivateKey, error) { + keys := make([]*ecdsa.PrivateKey, len(syntheticLowOverlapValidatorKeys)) + for i, keyHex := range syntheticLowOverlapValidatorKeys { + key, err := crypto.HexToECDSA(strings.TrimPrefix(keyHex, "0x")) + if err != nil { + return nil, err + } + keys[i] = key + } + return keys, nil +} + +func signerKeysFor(validators []ethcommon.Address, keyMap map[ethcommon.Address]*ecdsa.PrivateKey) ([]*ecdsa.PrivateKey, error) { + keys := make([]*ecdsa.PrivateKey, len(validators)) + for i, validator := range validators { + key, ok := keyMap[validator] + if !ok { + return nil, fmt.Errorf("missing validator key for %s", validator.Hex()) + } + keys[i] = key + } + return keys, nil +} + +func toKeyMap(keys []*ecdsa.PrivateKey) map[ethcommon.Address]*ecdsa.PrivateKey { + out := make(map[ethcommon.Address]*ecdsa.PrivateKey, len(keys)) + for _, key := range keys { + out[crypto.PubkeyToAddress(key.PublicKey)] = key + } + return out +} + +func mergeValidatorKeyMaps( + primary map[ethcommon.Address]*ecdsa.PrivateKey, + secondary map[ethcommon.Address]*ecdsa.PrivateKey, +) map[ethcommon.Address]*ecdsa.PrivateKey { + out := make(map[ethcommon.Address]*ecdsa.PrivateKey, len(primary)+len(secondary)) + for address, key := range primary { + out[address] = key + } + for address, key := range secondary { + out[address] = key + } + return out +} + +func cloneRawValues(values []rlp.RawValue) []rlp.RawValue { + cloned := make([]rlp.RawValue, len(values)) + copy(cloned, values) + return cloned +} + +func mustRLP(value interface{}) rlp.RawValue { + encoded, err := rlp.EncodeToBytes(value) + if err != nil { + panic(err) + } + return encoded +} + +func addressesToHex(addresses []ethcommon.Address) []string { + encoded := make([]string, len(addresses)) + for i, address := range addresses { + encoded[i] = address.Hex() + } + return encoded +} + +func encodeHex(value []byte) string { + return "0x" + hex.EncodeToString(value) +} + +func newUint64(value uint64) *big.Int { + return new(big.Int).SetUint64(value) +} diff --git a/ibc-solana/AGENTS.md b/ibc-solana/AGENTS.md new file mode 100644 index 000000000..fd2e35b35 --- /dev/null +++ b/ibc-solana/AGENTS.md @@ -0,0 +1,20 @@ +# AGENTS.md + +This subtree contains the Anchor-based Solana IBC programs and their ProgramTest integration harness. + +Look here first: +- `programs/solana/README.md` +- `programs/solana/Anchor.toml` +- `programs/solana/Cargo.toml` +- `programs/solana/integration-tests/README.md` + +Use the smallest relevant validation from the repo root: +- Build and refresh IDLs: `just build-solana` +- Solana unit tests: `just test-solana` +- Anchor tests: `just test-anchor-solana` +- Lint: `just lint-solana` + +Local constraints: +- Prefer the repo `just` recipes over raw `anchor` commands; they auto-detect `anchor-nix` when available. +- If program interfaces or IDLs change, run `just generate-solana-types`; do not hand-edit `packages/go-anchor/` except `packages/go-anchor/ics07_tendermint_patches/`, and do not hand-edit `e2e/interchaintestv8/solana/go-anchor/`. +- Cluster-specific program IDs live in `programs/solana/Anchor.toml`, and keypairs live under `solana-keypairs//`; keep non-`localnet` keypairs out of git. diff --git a/ibc-solidity/abi/BesuIBFT2LightClient.json b/ibc-solidity/abi/BesuIBFT2LightClient.json new file mode 100644 index 000000000..06eb4679a --- /dev/null +++ b/ibc-solidity/abi/BesuIBFT2LightClient.json @@ -0,0 +1,758 @@ +[ + { + "type": "constructor", + "inputs": [ + { + "name": "ibcRouter", + "type": "address", + "internalType": "address" + }, + { + "name": "initialTrustedHeight", + "type": "uint64", + "internalType": "uint64" + }, + { + "name": "initialTrustedTimestamp", + "type": "uint64", + "internalType": "uint64" + }, + { + "name": "initialTrustedStorageRoot", + "type": "bytes32", + "internalType": "bytes32" + }, + { + "name": "initialTrustedValidators", + "type": "address[]", + "internalType": "address[]" + }, + { + "name": "trustingPeriod", + "type": "uint64", + "internalType": "uint64" + }, + { + "name": "maxClockDrift", + "type": "uint64", + "internalType": "uint64" + }, + { + "name": "roleManager", + "type": "address", + "internalType": "address" + } + ], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "DEFAULT_ADMIN_ROLE", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "bytes32", + "internalType": "bytes32" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "PROOF_SUBMITTER_ROLE", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "bytes32", + "internalType": "bytes32" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "getClientState", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "bytes", + "internalType": "bytes" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "getConsensusState", + "inputs": [ + { + "name": "revisionHeight", + "type": "uint64", + "internalType": "uint64" + } + ], + "outputs": [ + { + "name": "", + "type": "bytes", + "internalType": "bytes" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "getRoleAdmin", + "inputs": [ + { + "name": "role", + "type": "bytes32", + "internalType": "bytes32" + } + ], + "outputs": [ + { + "name": "", + "type": "bytes32", + "internalType": "bytes32" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "grantRole", + "inputs": [ + { + "name": "role", + "type": "bytes32", + "internalType": "bytes32" + }, + { + "name": "account", + "type": "address", + "internalType": "address" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "hasRole", + "inputs": [ + { + "name": "role", + "type": "bytes32", + "internalType": "bytes32" + }, + { + "name": "account", + "type": "address", + "internalType": "address" + } + ], + "outputs": [ + { + "name": "", + "type": "bool", + "internalType": "bool" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "misbehaviour", + "inputs": [ + { + "name": "", + "type": "bytes", + "internalType": "bytes" + } + ], + "outputs": [], + "stateMutability": "view" + }, + { + "type": "function", + "name": "renounceRole", + "inputs": [ + { + "name": "role", + "type": "bytes32", + "internalType": "bytes32" + }, + { + "name": "callerConfirmation", + "type": "address", + "internalType": "address" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "revokeRole", + "inputs": [ + { + "name": "role", + "type": "bytes32", + "internalType": "bytes32" + }, + { + "name": "account", + "type": "address", + "internalType": "address" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "supportsInterface", + "inputs": [ + { + "name": "interfaceId", + "type": "bytes4", + "internalType": "bytes4" + } + ], + "outputs": [ + { + "name": "", + "type": "bool", + "internalType": "bool" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "updateClient", + "inputs": [ + { + "name": "updateMsg", + "type": "bytes", + "internalType": "bytes" + } + ], + "outputs": [ + { + "name": "", + "type": "uint8", + "internalType": "enum ILightClientMsgs.UpdateResult" + } + ], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "verifyMembership", + "inputs": [ + { + "name": "msg_", + "type": "tuple", + "internalType": "struct ILightClientMsgs.MsgVerifyMembership", + "components": [ + { + "name": "proof", + "type": "bytes", + "internalType": "bytes" + }, + { + "name": "proofHeight", + "type": "tuple", + "internalType": "struct IICS02ClientMsgs.Height", + "components": [ + { + "name": "revisionNumber", + "type": "uint64", + "internalType": "uint64" + }, + { + "name": "revisionHeight", + "type": "uint64", + "internalType": "uint64" + } + ] + }, + { + "name": "path", + "type": "bytes[]", + "internalType": "bytes[]" + }, + { + "name": "value", + "type": "bytes", + "internalType": "bytes" + } + ] + } + ], + "outputs": [ + { + "name": "", + "type": "uint256", + "internalType": "uint256" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "verifyNonMembership", + "inputs": [ + { + "name": "msg_", + "type": "tuple", + "internalType": "struct ILightClientMsgs.MsgVerifyNonMembership", + "components": [ + { + "name": "proof", + "type": "bytes", + "internalType": "bytes" + }, + { + "name": "proofHeight", + "type": "tuple", + "internalType": "struct IICS02ClientMsgs.Height", + "components": [ + { + "name": "revisionNumber", + "type": "uint64", + "internalType": "uint64" + }, + { + "name": "revisionHeight", + "type": "uint64", + "internalType": "uint64" + } + ] + }, + { + "name": "path", + "type": "bytes[]", + "internalType": "bytes[]" + } + ] + } + ], + "outputs": [ + { + "name": "", + "type": "uint256", + "internalType": "uint256" + } + ], + "stateMutability": "view" + }, + { + "type": "event", + "name": "RoleAdminChanged", + "inputs": [ + { + "name": "role", + "type": "bytes32", + "indexed": true, + "internalType": "bytes32" + }, + { + "name": "previousAdminRole", + "type": "bytes32", + "indexed": true, + "internalType": "bytes32" + }, + { + "name": "newAdminRole", + "type": "bytes32", + "indexed": true, + "internalType": "bytes32" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "RoleGranted", + "inputs": [ + { + "name": "role", + "type": "bytes32", + "indexed": true, + "internalType": "bytes32" + }, + { + "name": "account", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "sender", + "type": "address", + "indexed": true, + "internalType": "address" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "RoleRevoked", + "inputs": [ + { + "name": "role", + "type": "bytes32", + "indexed": true, + "internalType": "bytes32" + }, + { + "name": "account", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "sender", + "type": "address", + "indexed": true, + "internalType": "address" + } + ], + "anonymous": false + }, + { + "type": "error", + "name": "AccessControlBadConfirmation", + "inputs": [] + }, + { + "type": "error", + "name": "AccessControlUnauthorizedAccount", + "inputs": [ + { + "name": "account", + "type": "address", + "internalType": "address" + }, + { + "name": "neededRole", + "type": "bytes32", + "internalType": "bytes32" + } + ] + }, + { + "type": "error", + "name": "ConflictingConsensusState", + "inputs": [ + { + "name": "revisionHeight", + "type": "uint64", + "internalType": "uint64" + } + ] + }, + { + "type": "error", + "name": "ConsensusStateExpired", + "inputs": [ + { + "name": "trustedTimestamp", + "type": "uint64", + "internalType": "uint64" + }, + { + "name": "currentTimestamp", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "trustingPeriod", + "type": "uint64", + "internalType": "uint64" + } + ] + }, + { + "type": "error", + "name": "ConsensusStateNotFound", + "inputs": [ + { + "name": "revisionHeight", + "type": "uint64", + "internalType": "uint64" + } + ] + }, + { + "type": "error", + "name": "DuplicateCommitSealSigner", + "inputs": [ + { + "name": "signer", + "type": "address", + "internalType": "address" + } + ] + }, + { + "type": "error", + "name": "DuplicateValidator", + "inputs": [ + { + "name": "validator", + "type": "address", + "internalType": "address" + } + ] + }, + { + "type": "error", + "name": "EmptyValidatorSet", + "inputs": [] + }, + { + "type": "error", + "name": "HeaderFromFuture", + "inputs": [ + { + "name": "currentTimestamp", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "headerTimestamp", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "maxClockDrift", + "type": "uint256", + "internalType": "uint256" + } + ] + }, + { + "type": "error", + "name": "InsufficientTrustedValidatorOverlap", + "inputs": [ + { + "name": "actual", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "required", + "type": "uint256", + "internalType": "uint256" + } + ] + }, + { + "type": "error", + "name": "InsufficientValidatorQuorum", + "inputs": [ + { + "name": "actual", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "required", + "type": "uint256", + "internalType": "uint256" + } + ] + }, + { + "type": "error", + "name": "InvalidCommitSeal", + "inputs": [] + }, + { + "type": "error", + "name": "InvalidCommitmentValue", + "inputs": [ + { + "name": "expectedValue", + "type": "bytes32", + "internalType": "bytes32" + }, + { + "name": "actualValue", + "type": "bytes32", + "internalType": "bytes32" + } + ] + }, + { + "type": "error", + "name": "InvalidDifficulty", + "inputs": [ + { + "name": "actualDifficulty", + "type": "uint256", + "internalType": "uint256" + } + ] + }, + { + "type": "error", + "name": "InvalidECDSASignatureLength", + "inputs": [ + { + "name": "length", + "type": "uint256", + "internalType": "uint256" + } + ] + }, + { + "type": "error", + "name": "InvalidExtraDataFormat", + "inputs": [ + { + "name": "itemsLength", + "type": "uint256", + "internalType": "uint256" + } + ] + }, + { + "type": "error", + "name": "InvalidHeaderFormat", + "inputs": [ + { + "name": "itemsLength", + "type": "uint256", + "internalType": "uint256" + } + ] + }, + { + "type": "error", + "name": "InvalidHeaderHeight", + "inputs": [] + }, + { + "type": "error", + "name": "InvalidMixHash", + "inputs": [ + { + "name": "actualMixHash", + "type": "bytes32", + "internalType": "bytes32" + } + ] + }, + { + "type": "error", + "name": "InvalidNonce", + "inputs": [ + { + "name": "actualNonce", + "type": "bytes", + "internalType": "bytes" + } + ] + }, + { + "type": "error", + "name": "InvalidOmmersHash", + "inputs": [ + { + "name": "actualOmmersHash", + "type": "bytes32", + "internalType": "bytes32" + } + ] + }, + { + "type": "error", + "name": "InvalidPathLength", + "inputs": [ + { + "name": "expectedLength", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "actualLength", + "type": "uint256", + "internalType": "uint256" + } + ] + }, + { + "type": "error", + "name": "InvalidRevisionNumber", + "inputs": [ + { + "name": "providedRevisionNumber", + "type": "uint64", + "internalType": "uint64" + } + ] + }, + { + "type": "error", + "name": "InvalidValidatorAddress", + "inputs": [ + { + "name": "validator", + "type": "address", + "internalType": "address" + } + ] + }, + { + "type": "error", + "name": "InvalidValidatorAddressLength", + "inputs": [ + { + "name": "length", + "type": "uint256", + "internalType": "uint256" + } + ] + }, + { + "type": "error", + "name": "InvalidValueLength", + "inputs": [ + { + "name": "expectedLength", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "actualLength", + "type": "uint256", + "internalType": "uint256" + } + ] + }, + { + "type": "error", + "name": "UnsupportedMisbehaviour", + "inputs": [] + }, + { + "type": "error", + "name": "ValueExists", + "inputs": [ + { + "name": "actualValue", + "type": "bytes32", + "internalType": "bytes32" + } + ] + } +] diff --git a/ibc-solidity/abi/BesuQBFTLightClient.json b/ibc-solidity/abi/BesuQBFTLightClient.json new file mode 100644 index 000000000..06eb4679a --- /dev/null +++ b/ibc-solidity/abi/BesuQBFTLightClient.json @@ -0,0 +1,758 @@ +[ + { + "type": "constructor", + "inputs": [ + { + "name": "ibcRouter", + "type": "address", + "internalType": "address" + }, + { + "name": "initialTrustedHeight", + "type": "uint64", + "internalType": "uint64" + }, + { + "name": "initialTrustedTimestamp", + "type": "uint64", + "internalType": "uint64" + }, + { + "name": "initialTrustedStorageRoot", + "type": "bytes32", + "internalType": "bytes32" + }, + { + "name": "initialTrustedValidators", + "type": "address[]", + "internalType": "address[]" + }, + { + "name": "trustingPeriod", + "type": "uint64", + "internalType": "uint64" + }, + { + "name": "maxClockDrift", + "type": "uint64", + "internalType": "uint64" + }, + { + "name": "roleManager", + "type": "address", + "internalType": "address" + } + ], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "DEFAULT_ADMIN_ROLE", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "bytes32", + "internalType": "bytes32" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "PROOF_SUBMITTER_ROLE", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "bytes32", + "internalType": "bytes32" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "getClientState", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "bytes", + "internalType": "bytes" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "getConsensusState", + "inputs": [ + { + "name": "revisionHeight", + "type": "uint64", + "internalType": "uint64" + } + ], + "outputs": [ + { + "name": "", + "type": "bytes", + "internalType": "bytes" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "getRoleAdmin", + "inputs": [ + { + "name": "role", + "type": "bytes32", + "internalType": "bytes32" + } + ], + "outputs": [ + { + "name": "", + "type": "bytes32", + "internalType": "bytes32" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "grantRole", + "inputs": [ + { + "name": "role", + "type": "bytes32", + "internalType": "bytes32" + }, + { + "name": "account", + "type": "address", + "internalType": "address" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "hasRole", + "inputs": [ + { + "name": "role", + "type": "bytes32", + "internalType": "bytes32" + }, + { + "name": "account", + "type": "address", + "internalType": "address" + } + ], + "outputs": [ + { + "name": "", + "type": "bool", + "internalType": "bool" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "misbehaviour", + "inputs": [ + { + "name": "", + "type": "bytes", + "internalType": "bytes" + } + ], + "outputs": [], + "stateMutability": "view" + }, + { + "type": "function", + "name": "renounceRole", + "inputs": [ + { + "name": "role", + "type": "bytes32", + "internalType": "bytes32" + }, + { + "name": "callerConfirmation", + "type": "address", + "internalType": "address" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "revokeRole", + "inputs": [ + { + "name": "role", + "type": "bytes32", + "internalType": "bytes32" + }, + { + "name": "account", + "type": "address", + "internalType": "address" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "supportsInterface", + "inputs": [ + { + "name": "interfaceId", + "type": "bytes4", + "internalType": "bytes4" + } + ], + "outputs": [ + { + "name": "", + "type": "bool", + "internalType": "bool" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "updateClient", + "inputs": [ + { + "name": "updateMsg", + "type": "bytes", + "internalType": "bytes" + } + ], + "outputs": [ + { + "name": "", + "type": "uint8", + "internalType": "enum ILightClientMsgs.UpdateResult" + } + ], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "verifyMembership", + "inputs": [ + { + "name": "msg_", + "type": "tuple", + "internalType": "struct ILightClientMsgs.MsgVerifyMembership", + "components": [ + { + "name": "proof", + "type": "bytes", + "internalType": "bytes" + }, + { + "name": "proofHeight", + "type": "tuple", + "internalType": "struct IICS02ClientMsgs.Height", + "components": [ + { + "name": "revisionNumber", + "type": "uint64", + "internalType": "uint64" + }, + { + "name": "revisionHeight", + "type": "uint64", + "internalType": "uint64" + } + ] + }, + { + "name": "path", + "type": "bytes[]", + "internalType": "bytes[]" + }, + { + "name": "value", + "type": "bytes", + "internalType": "bytes" + } + ] + } + ], + "outputs": [ + { + "name": "", + "type": "uint256", + "internalType": "uint256" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "verifyNonMembership", + "inputs": [ + { + "name": "msg_", + "type": "tuple", + "internalType": "struct ILightClientMsgs.MsgVerifyNonMembership", + "components": [ + { + "name": "proof", + "type": "bytes", + "internalType": "bytes" + }, + { + "name": "proofHeight", + "type": "tuple", + "internalType": "struct IICS02ClientMsgs.Height", + "components": [ + { + "name": "revisionNumber", + "type": "uint64", + "internalType": "uint64" + }, + { + "name": "revisionHeight", + "type": "uint64", + "internalType": "uint64" + } + ] + }, + { + "name": "path", + "type": "bytes[]", + "internalType": "bytes[]" + } + ] + } + ], + "outputs": [ + { + "name": "", + "type": "uint256", + "internalType": "uint256" + } + ], + "stateMutability": "view" + }, + { + "type": "event", + "name": "RoleAdminChanged", + "inputs": [ + { + "name": "role", + "type": "bytes32", + "indexed": true, + "internalType": "bytes32" + }, + { + "name": "previousAdminRole", + "type": "bytes32", + "indexed": true, + "internalType": "bytes32" + }, + { + "name": "newAdminRole", + "type": "bytes32", + "indexed": true, + "internalType": "bytes32" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "RoleGranted", + "inputs": [ + { + "name": "role", + "type": "bytes32", + "indexed": true, + "internalType": "bytes32" + }, + { + "name": "account", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "sender", + "type": "address", + "indexed": true, + "internalType": "address" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "RoleRevoked", + "inputs": [ + { + "name": "role", + "type": "bytes32", + "indexed": true, + "internalType": "bytes32" + }, + { + "name": "account", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "sender", + "type": "address", + "indexed": true, + "internalType": "address" + } + ], + "anonymous": false + }, + { + "type": "error", + "name": "AccessControlBadConfirmation", + "inputs": [] + }, + { + "type": "error", + "name": "AccessControlUnauthorizedAccount", + "inputs": [ + { + "name": "account", + "type": "address", + "internalType": "address" + }, + { + "name": "neededRole", + "type": "bytes32", + "internalType": "bytes32" + } + ] + }, + { + "type": "error", + "name": "ConflictingConsensusState", + "inputs": [ + { + "name": "revisionHeight", + "type": "uint64", + "internalType": "uint64" + } + ] + }, + { + "type": "error", + "name": "ConsensusStateExpired", + "inputs": [ + { + "name": "trustedTimestamp", + "type": "uint64", + "internalType": "uint64" + }, + { + "name": "currentTimestamp", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "trustingPeriod", + "type": "uint64", + "internalType": "uint64" + } + ] + }, + { + "type": "error", + "name": "ConsensusStateNotFound", + "inputs": [ + { + "name": "revisionHeight", + "type": "uint64", + "internalType": "uint64" + } + ] + }, + { + "type": "error", + "name": "DuplicateCommitSealSigner", + "inputs": [ + { + "name": "signer", + "type": "address", + "internalType": "address" + } + ] + }, + { + "type": "error", + "name": "DuplicateValidator", + "inputs": [ + { + "name": "validator", + "type": "address", + "internalType": "address" + } + ] + }, + { + "type": "error", + "name": "EmptyValidatorSet", + "inputs": [] + }, + { + "type": "error", + "name": "HeaderFromFuture", + "inputs": [ + { + "name": "currentTimestamp", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "headerTimestamp", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "maxClockDrift", + "type": "uint256", + "internalType": "uint256" + } + ] + }, + { + "type": "error", + "name": "InsufficientTrustedValidatorOverlap", + "inputs": [ + { + "name": "actual", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "required", + "type": "uint256", + "internalType": "uint256" + } + ] + }, + { + "type": "error", + "name": "InsufficientValidatorQuorum", + "inputs": [ + { + "name": "actual", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "required", + "type": "uint256", + "internalType": "uint256" + } + ] + }, + { + "type": "error", + "name": "InvalidCommitSeal", + "inputs": [] + }, + { + "type": "error", + "name": "InvalidCommitmentValue", + "inputs": [ + { + "name": "expectedValue", + "type": "bytes32", + "internalType": "bytes32" + }, + { + "name": "actualValue", + "type": "bytes32", + "internalType": "bytes32" + } + ] + }, + { + "type": "error", + "name": "InvalidDifficulty", + "inputs": [ + { + "name": "actualDifficulty", + "type": "uint256", + "internalType": "uint256" + } + ] + }, + { + "type": "error", + "name": "InvalidECDSASignatureLength", + "inputs": [ + { + "name": "length", + "type": "uint256", + "internalType": "uint256" + } + ] + }, + { + "type": "error", + "name": "InvalidExtraDataFormat", + "inputs": [ + { + "name": "itemsLength", + "type": "uint256", + "internalType": "uint256" + } + ] + }, + { + "type": "error", + "name": "InvalidHeaderFormat", + "inputs": [ + { + "name": "itemsLength", + "type": "uint256", + "internalType": "uint256" + } + ] + }, + { + "type": "error", + "name": "InvalidHeaderHeight", + "inputs": [] + }, + { + "type": "error", + "name": "InvalidMixHash", + "inputs": [ + { + "name": "actualMixHash", + "type": "bytes32", + "internalType": "bytes32" + } + ] + }, + { + "type": "error", + "name": "InvalidNonce", + "inputs": [ + { + "name": "actualNonce", + "type": "bytes", + "internalType": "bytes" + } + ] + }, + { + "type": "error", + "name": "InvalidOmmersHash", + "inputs": [ + { + "name": "actualOmmersHash", + "type": "bytes32", + "internalType": "bytes32" + } + ] + }, + { + "type": "error", + "name": "InvalidPathLength", + "inputs": [ + { + "name": "expectedLength", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "actualLength", + "type": "uint256", + "internalType": "uint256" + } + ] + }, + { + "type": "error", + "name": "InvalidRevisionNumber", + "inputs": [ + { + "name": "providedRevisionNumber", + "type": "uint64", + "internalType": "uint64" + } + ] + }, + { + "type": "error", + "name": "InvalidValidatorAddress", + "inputs": [ + { + "name": "validator", + "type": "address", + "internalType": "address" + } + ] + }, + { + "type": "error", + "name": "InvalidValidatorAddressLength", + "inputs": [ + { + "name": "length", + "type": "uint256", + "internalType": "uint256" + } + ] + }, + { + "type": "error", + "name": "InvalidValueLength", + "inputs": [ + { + "name": "expectedLength", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "actualLength", + "type": "uint256", + "internalType": "uint256" + } + ] + }, + { + "type": "error", + "name": "UnsupportedMisbehaviour", + "inputs": [] + }, + { + "type": "error", + "name": "ValueExists", + "inputs": [ + { + "name": "actualValue", + "type": "bytes32", + "internalType": "bytes32" + } + ] + } +] diff --git a/ibc-solidity/abi/DummyLightClient.json b/ibc-solidity/abi/DummyLightClient.json new file mode 100644 index 000000000..610620c90 --- /dev/null +++ b/ibc-solidity/abi/DummyLightClient.json @@ -0,0 +1,173 @@ +[ + { + "type": "function", + "name": "getClientState", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "bytes", + "internalType": "bytes" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "misbehaviour", + "inputs": [ + { + "name": "", + "type": "bytes", + "internalType": "bytes" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "updateClient", + "inputs": [ + { + "name": "updateMsg", + "type": "bytes", + "internalType": "bytes" + } + ], + "outputs": [ + { + "name": "", + "type": "uint8", + "internalType": "enum ILightClientMsgs.UpdateResult" + } + ], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "verifyMembership", + "inputs": [ + { + "name": "msg_", + "type": "tuple", + "internalType": "struct ILightClientMsgs.MsgVerifyMembership", + "components": [ + { + "name": "proof", + "type": "bytes", + "internalType": "bytes" + }, + { + "name": "proofHeight", + "type": "tuple", + "internalType": "struct IICS02ClientMsgs.Height", + "components": [ + { + "name": "revisionNumber", + "type": "uint64", + "internalType": "uint64" + }, + { + "name": "revisionHeight", + "type": "uint64", + "internalType": "uint64" + } + ] + }, + { + "name": "path", + "type": "bytes[]", + "internalType": "bytes[]" + }, + { + "name": "value", + "type": "bytes", + "internalType": "bytes" + } + ] + } + ], + "outputs": [ + { + "name": "", + "type": "uint256", + "internalType": "uint256" + } + ], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "verifyNonMembership", + "inputs": [ + { + "name": "msg_", + "type": "tuple", + "internalType": "struct ILightClientMsgs.MsgVerifyNonMembership", + "components": [ + { + "name": "proof", + "type": "bytes", + "internalType": "bytes" + }, + { + "name": "proofHeight", + "type": "tuple", + "internalType": "struct IICS02ClientMsgs.Height", + "components": [ + { + "name": "revisionNumber", + "type": "uint64", + "internalType": "uint64" + }, + { + "name": "revisionHeight", + "type": "uint64", + "internalType": "uint64" + } + ] + }, + { + "name": "path", + "type": "bytes[]", + "internalType": "bytes[]" + } + ] + } + ], + "outputs": [ + { + "name": "", + "type": "uint256", + "internalType": "uint256" + } + ], + "stateMutability": "nonpayable" + }, + { + "type": "error", + "name": "MembershipExists", + "inputs": [] + }, + { + "type": "error", + "name": "MissingMembership", + "inputs": [] + }, + { + "type": "error", + "name": "UnknownHeight", + "inputs": [] + }, + { + "type": "error", + "name": "ValueMismatch", + "inputs": [] + }, + { + "type": "error", + "name": "ZeroTimestamp", + "inputs": [] + } +] diff --git a/ibc-solidity/abi/bytecode/AttestationLightClient.json b/ibc-solidity/abi/bytecode/AttestationLightClient.json index 8039a88fc..a0dcee21f 100644 --- a/ibc-solidity/abi/bytecode/AttestationLightClient.json +++ b/ibc-solidity/abi/bytecode/AttestationLightClient.json @@ -1 +1 @@ -{"abi":[{"type":"constructor","inputs":[{"name":"attestorAddresses","type":"address[]","internalType":"address[]"},{"name":"minRequiredSigs","type":"uint8","internalType":"uint8"},{"name":"initialHeight","type":"uint64","internalType":"uint64"},{"name":"initialTimestampSeconds","type":"uint64","internalType":"uint64"},{"name":"roleManager","type":"address","internalType":"address"}],"stateMutability":"nonpayable"},{"type":"function","name":"DEFAULT_ADMIN_ROLE","inputs":[],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"type":"function","name":"PROOF_SUBMITTER_ROLE","inputs":[],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"type":"function","name":"getAttestationSet","inputs":[],"outputs":[{"name":"attestorAddresses","type":"address[]","internalType":"address[]"},{"name":"minRequiredSigs","type":"uint8","internalType":"uint8"}],"stateMutability":"view"},{"type":"function","name":"getClientState","inputs":[],"outputs":[{"name":"","type":"bytes","internalType":"bytes"}],"stateMutability":"view"},{"type":"function","name":"getConsensusTimestamp","inputs":[{"name":"revisionHeight","type":"uint64","internalType":"uint64"}],"outputs":[{"name":"","type":"uint64","internalType":"uint64"}],"stateMutability":"view"},{"type":"function","name":"getRoleAdmin","inputs":[{"name":"role","type":"bytes32","internalType":"bytes32"}],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"type":"function","name":"grantRole","inputs":[{"name":"role","type":"bytes32","internalType":"bytes32"},{"name":"account","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"hasRole","inputs":[{"name":"role","type":"bytes32","internalType":"bytes32"},{"name":"account","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"misbehaviour","inputs":[{"name":"","type":"bytes","internalType":"bytes"}],"outputs":[],"stateMutability":"view"},{"type":"function","name":"renounceRole","inputs":[{"name":"role","type":"bytes32","internalType":"bytes32"},{"name":"callerConfirmation","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"revokeRole","inputs":[{"name":"role","type":"bytes32","internalType":"bytes32"},{"name":"account","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"supportsInterface","inputs":[{"name":"interfaceId","type":"bytes4","internalType":"bytes4"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"updateClient","inputs":[{"name":"updateMsg","type":"bytes","internalType":"bytes"}],"outputs":[{"name":"","type":"uint8","internalType":"enum ILightClientMsgs.UpdateResult"}],"stateMutability":"nonpayable"},{"type":"function","name":"verifyMembership","inputs":[{"name":"msg_","type":"tuple","internalType":"struct ILightClientMsgs.MsgVerifyMembership","components":[{"name":"proof","type":"bytes","internalType":"bytes"},{"name":"proofHeight","type":"tuple","internalType":"struct IICS02ClientMsgs.Height","components":[{"name":"revisionNumber","type":"uint64","internalType":"uint64"},{"name":"revisionHeight","type":"uint64","internalType":"uint64"}]},{"name":"path","type":"bytes[]","internalType":"bytes[]"},{"name":"value","type":"bytes","internalType":"bytes"}]}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"verifyNonMembership","inputs":[{"name":"msg_","type":"tuple","internalType":"struct ILightClientMsgs.MsgVerifyNonMembership","components":[{"name":"proof","type":"bytes","internalType":"bytes"},{"name":"proofHeight","type":"tuple","internalType":"struct IICS02ClientMsgs.Height","components":[{"name":"revisionNumber","type":"uint64","internalType":"uint64"},{"name":"revisionHeight","type":"uint64","internalType":"uint64"}]},{"name":"path","type":"bytes[]","internalType":"bytes[]"}]}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"event","name":"RoleAdminChanged","inputs":[{"name":"role","type":"bytes32","indexed":true,"internalType":"bytes32"},{"name":"previousAdminRole","type":"bytes32","indexed":true,"internalType":"bytes32"},{"name":"newAdminRole","type":"bytes32","indexed":true,"internalType":"bytes32"}],"anonymous":false},{"type":"event","name":"RoleGranted","inputs":[{"name":"role","type":"bytes32","indexed":true,"internalType":"bytes32"},{"name":"account","type":"address","indexed":true,"internalType":"address"},{"name":"sender","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"type":"event","name":"RoleRevoked","inputs":[{"name":"role","type":"bytes32","indexed":true,"internalType":"bytes32"},{"name":"account","type":"address","indexed":true,"internalType":"address"},{"name":"sender","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"type":"error","name":"AccessControlBadConfirmation","inputs":[]},{"type":"error","name":"AccessControlUnauthorizedAccount","inputs":[{"name":"account","type":"address","internalType":"address"},{"name":"neededRole","type":"bytes32","internalType":"bytes32"}]},{"type":"error","name":"BadQuorum","inputs":[{"name":"minRequired","type":"uint8","internalType":"uint8"},{"name":"attestationCount","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"ConsensusTimestampNotFound","inputs":[{"name":"height","type":"uint64","internalType":"uint64"}]},{"type":"error","name":"DuplicateSigner","inputs":[{"name":"signer","type":"address","internalType":"address"}]},{"type":"error","name":"ECDSAInvalidSignature","inputs":[]},{"type":"error","name":"ECDSAInvalidSignatureLength","inputs":[{"name":"length","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"ECDSAInvalidSignatureS","inputs":[{"name":"s","type":"bytes32","internalType":"bytes32"}]},{"type":"error","name":"EmptyPackets","inputs":[]},{"type":"error","name":"EmptySignatures","inputs":[]},{"type":"error","name":"EmptyValue","inputs":[]},{"type":"error","name":"FeatureNotSupported","inputs":[]},{"type":"error","name":"FrozenClientState","inputs":[]},{"type":"error","name":"HeightMismatch","inputs":[{"name":"expected","type":"uint64","internalType":"uint64"},{"name":"provided","type":"uint64","internalType":"uint64"}]},{"type":"error","name":"InvalidPathLength","inputs":[{"name":"expectedLength","type":"uint256","internalType":"uint256"},{"name":"providedLength","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"InvalidSignatureLength","inputs":[{"name":"signature","type":"bytes","internalType":"bytes"}]},{"type":"error","name":"InvalidState","inputs":[{"name":"height","type":"uint64","internalType":"uint64"},{"name":"timestamp","type":"uint64","internalType":"uint64"}]},{"type":"error","name":"NoAttestors","inputs":[]},{"type":"error","name":"NotMember","inputs":[]},{"type":"error","name":"NotNonMember","inputs":[]},{"type":"error","name":"SignatureInvalid","inputs":[{"name":"signature","type":"bytes","internalType":"bytes"}]},{"type":"error","name":"ThresholdNotMet","inputs":[{"name":"validSigners","type":"uint256","internalType":"uint256"},{"name":"minRequired","type":"uint8","internalType":"uint8"}]},{"type":"error","name":"UnknownSigner","inputs":[{"name":"signer","type":"address","internalType":"address"}]}],"bytecode":{"object":"0x60806040523461032d57611f568038038061001981610349565b928339810160a08282031261032d5781516001600160401b03811161032d57820181601f8201121561032d578051916001600160401b0383116102c8578260051b916020610068818501610349565b8095815201906020829482010192831161032d57602001905b8282106103315750505060208301519260ff841680940361032d576100a860408201610382565b6100c060806100b960608501610382565b930161036e565b9284511561031e57851515806102f2575b855190156102dc575060405195608087016001600160401b038111888210176102c857604052858752602087019081526060604088019360018060401b03169788855201915f835286519060018060401b0382116102c8576801000000000000000082116102c85760015482600155808310610284575b5060015f5260205f205f5b838110610267575050505060ff90511669ff00000000000000000060025493610100600160481b03905160081b169251151560481b169260018060501b0319161717176002555f5b83518110156101fb5760018060a01b0360208260051b8601015116805f52600360205260ff60405f2054166101e957906001915f52600360205260405f208260ff198254161790550161019b565b637010e27960e11b5f5260045260245ffd5b505f84815260046020526040902080546001600160401b0319166001600160401b039092169190911790556001600160a01b03811661024e575061023d61048c565b505b6040516119a7908161050f8239f35b8061025b61026192610396565b5061040c565b5061023f565b82516001600160a01b031681830155602090920191600101610153565b60015f527fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf69081019083015b8181106102bd5750610148565b5f81556001016102b0565b634e487b7160e01b5f52604160045260245ffd5b866365846b7f60e01b5f5260045260245260445ffd5b5084515f19870160ff811161030a5760ff16106100d1565b634e487b7160e01b5f52601160045260245ffd5b6343d0a89360e11b5f5260045ffd5b5f80fd5b6020809161033e8461036e565b815201910190610081565b6040519190601f01601f191682016001600160401b038111838210176102c857604052565b51906001600160a01b038216820361032d57565b51906001600160401b038216820361032d57565b6001600160a01b0381165f9081525f516020611f365f395f51905f52602052604090205460ff16610407576001600160a01b03165f8181525f516020611f365f395f51905f5260205260408120805460ff191660011790553391905f516020611eb65f395f51905f528180a4600190565b505f90565b6001600160a01b0381165f9081525f516020611ed65f395f51905f52602052604090205460ff16610407576001600160a01b03165f8181525f516020611ed65f395f51905f5260205260408120805460ff191660011790553391905f516020611f165f395f51905f52905f516020611eb65f395f51905f529080a4600190565b5f80525f516020611ed65f395f51905f526020525f516020611ef65f395f51905f525460ff1661050a575f8080525f516020611ed65f395f51905f526020525f516020611ef65f395f51905f52805460ff1916600117905533905f516020611f165f395f51905f525f516020611eb65f395f51905f528280a4600190565b5f9056fe6080806040526004361015610012575f80fd5b5f3560e01c90816301ffc9a7146106ab575080630bece356146105e8578063248a9ca3146105be5780632f2ff15d1461058f57806336568abe146105335780634d6d9ffb146104865780635832611b146104405780635972185a14610406578063682ed5f01461035157806391d1485414610308578063a217fddf146102ee578063a845a7f314610261578063d547741f1461022b578063ddba65371461015f5763ef913a4b146100c1575f80fd5b3461015b575f60031936011261015b576101576040516020808201526080604082015261014b816100f460c08201611228565b60ff600254818116606085015267ffffffffffffffff8160081c16608085015260481c16151560a0830152037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0810183528261085e565b604051918291826107cd565b0390f35b5f80fd5b3461015b5761016d36610749565b505060ff60025460481c16610203575f80527f4c48d1d2b0f4f7485fc28e3db22341d96a20aa29e6efa8149da9751603abd4e06020527f6e0c24a6e293ff9b755263dbaa15ba3796b0b8d3fe17cfb4ddf8143b268eac475460ff16156101f6575b7fda81d7c2000000000000000000000000000000000000000000000000000000005f5260045ffd5b6101fe611277565b6101ce565b7f928b1233000000000000000000000000000000000000000000000000000000005f5260045ffd5b3461015b5761025f61023c3661079a565b9061025a610255825f525f602052600160405f20015490565b6112ff565b61175e565b005b3461015b575f60031936011261015b5760ff6002541660405161028e8161028781611228565b038261085e565b60405190604082019260408352815180945260206060840192015f945b8086106102c057505082935060208301520390f35b909260208060019273ffffffffffffffffffffffffffffffffffffffff8751168152019401950194906102ab565b3461015b575f60031936011261015b5760206040515f8152f35b3461015b576103163661079a565b905f525f60205273ffffffffffffffffffffffffffffffffffffffff60405f2091165f52602052602060ff60405f2054166040519015158152f35b3461015b57602060031936011261015b5760043567ffffffffffffffff811161015b5760a0600319823603011261015b5760ff60025460481c16610203575f80527f4c48d1d2b0f4f7485fc28e3db22341d96a20aa29e6efa8149da9751603abd4e060209081527f6e0c24a6e293ff9b755263dbaa15ba3796b0b8d3fe17cfb4ddf8143b268eac475490916103f19160ff16156103f9575b6004016110cb565b604051908152f35b610401611277565b6103e9565b3461015b575f60031936011261015b5760206040517fbd893629a699470e4ec82a5715bb4981fdaacc5d0a728bf5f55b801d8f4ef10b8152f35b3461015b57602060031936011261015b5760043567ffffffffffffffff811680910361015b575f526004602052602067ffffffffffffffff60405f205416604051908152f35b3461015b57602060031936011261015b5760043567ffffffffffffffff811161015b576080600319823603011261015b5760ff60025460481c16610203575f80527f4c48d1d2b0f4f7485fc28e3db22341d96a20aa29e6efa8149da9751603abd4e060209081527f6e0c24a6e293ff9b755263dbaa15ba3796b0b8d3fe17cfb4ddf8143b268eac475490916103f19160ff1615610526575b600401610ef5565b61052e611277565b61051e565b3461015b576105413661079a565b3373ffffffffffffffffffffffffffffffffffffffff8216036105675761025f9161175e565b7f6697b232000000000000000000000000000000000000000000000000000000005f5260045ffd5b3461015b5761025f6105a03661079a565b906105b9610255825f525f602052600160405f20015490565b61168c565b3461015b57602060031936011261015b5760206103f16004355f525f602052600160405f20015490565b3461015b576105f636610749565b60ff60025460481c16610203575f80527f4c48d1d2b0f4f7485fc28e3db22341d96a20aa29e6efa8149da9751603abd4e06020527f6e0c24a6e293ff9b755263dbaa15ba3796b0b8d3fe17cfb4ddf8143b268eac475461065e929060ff161561069e57610a3c565b6040516003821015610671576020918152f35b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b6106a6611277565b610a3c565b3461015b57602060031936011261015b57600435907fffffffff00000000000000000000000000000000000000000000000000000000821680920361015b57817f7965db0b000000000000000000000000000000000000000000000000000000006020931490811561071f575b5015158152f35b7f01ffc9a70000000000000000000000000000000000000000000000000000000091501483610718565b90602060031983011261015b5760043567ffffffffffffffff811161015b578260238201121561015b5780600401359267ffffffffffffffff841161015b576024848301011161015b576024019190565b600319604091011261015b576004359060243573ffffffffffffffffffffffffffffffffffffffff8116810361015b5790565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f602060409481855280519182918282880152018686015e5f8582860101520116010190565b6040810190811067ffffffffffffffff82111761083157604052565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff82111761083157604052565b92919267ffffffffffffffff821161083157604051916108e760207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116018461085e565b82948184528183011161015b578281602093845f960137010152565b9080601f8301121561015b5781602061091e9335910161089f565b90565b67ffffffffffffffff81116108315760051b60200190565b60208183031261015b5780359067ffffffffffffffff821161015b57019060408282031261015b576040519161096e83610815565b803567ffffffffffffffff811161015b578261098b918301610903565b835260208101359067ffffffffffffffff821161015b57019080601f8301121561015b5781356109ba81610921565b926109c8604051948561085e565b81845260208085019260051b8201019183831161015b5760208201905b8382106109f9575050505050602082015290565b813567ffffffffffffffff811161015b57602091610a1c87848094880101610903565b8152019101906109e5565b519067ffffffffffffffff8216820361015b57565b610a4891810190610939565b60205f818351604051918183925191829101835e8101838152039060025afa15610c915760205f8051604051838101917f01000000000000000000000000000000000000000000000000000000000000008352602182015260218152610aaf60418261085e565b604051918291518091835e8101838152039060025afa15610c9157610ada5f516020830151906113eb565b5160408180518101031261015b57604051610af481610815565b610b0f6040610b0560208501610a27565b9384845201610a27565b67ffffffffffffffff60208301938285521680151580610c7e575b15610c4457505067ffffffffffffffff8151165f52600460205267ffffffffffffffff60405f20541680610bf3575067ffffffffffffffff9051918183169260025490838260081c168511610bb6575b50505116905f52600460205260405f20907fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000008254161790555f90565b68ffffffffffffffff007fffffffffffffffffffffffffffffffffffffffffffffff0000000000000000ff9160081b169116176002555f80610b7a565b9167ffffffffffffffff9150511603610c0b57600290565b69010000000000000000007fffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffff6002541617600255600190565b67ffffffffffffffff92507fdcbc5460000000000000000000000000000000000000000000000000000000005f526004521660245260445ffd5b5067ffffffffffffffff82161515610b2a565b6040513d5f823e3d90fd5b9035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18136030182121561015b570180359067ffffffffffffffff821161015b57602001918160051b3603831361015b57565b3567ffffffffffffffff8116810361015b5790565b15610d0d5750565b67ffffffffffffffff907ff7caaa5c000000000000000000000000000000000000000000000000000000005f521660045260245ffd5b9035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18136030182121561015b570180359067ffffffffffffffff821161015b5760200191813603831361015b57565b60208183031261015b5780519067ffffffffffffffff821161015b57019060408282031261015b5760405191610dc983610815565b610dd281610a27565b835260208101519067ffffffffffffffff821161015b570181601f8201121561015b57805190610e0182610921565b92610e0f604051948561085e565b82845260208085019360061b8301019181831161015b57602001925b828410610e3e5750505050602082015290565b60408483031261015b5760206040918251610e5881610815565b865181528287015183820152815201930192610e2b565b15610e78575050565b9067ffffffffffffffff80927fc7441689000000000000000000000000000000000000000000000000000000005f52166004521660245260445ffd5b8051821015610ec85760209160051b010190565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b6060810190610f048282610c9c565b90506001610f128484610c9c565b9290500361109b5750610fb8610f2a60408301610cf0565b9267ffffffffffffffff841692835f526004602052610fb367ffffffffffffffff60405f20541694610f5e87871515610d05565b610f9e610f76610f6e8580610d43565b810190610939565b610f8e610f838251611365565b6020830151906113eb565b5160208082518301019101610d94565b9667ffffffffffffffff885116918214610e6f565b610c9c565b15610ec857610fd3610fcc82602093610d43565b369161089f565b818151910120920180515115611073575f5b8151805182101561104b57610ffb828692610eb4565b51511461100a57600101610fe5565b60209293506110199151610eb4565b5101516110235790565b7f9a960b4f000000000000000000000000000000000000000000000000000000005f5260045ffd5b7f291fc442000000000000000000000000000000000000000000000000000000005f5260045ffd5b7f1e6c84da000000000000000000000000000000000000000000000000000000005f5260045ffd5b7f88b3170e000000000000000000000000000000000000000000000000000000005f52600160045260245260445ffd5b608081016110d98183610d43565b9050156112005760608201906110ef8284610c9c565b905060016110fd8486610c9c565b9290500361109b575061111260408401610cf0565b9061117467ffffffffffffffff831693845f52600460205261116e67ffffffffffffffff60405f2054169561114986881515610d05565b611159610f76610f6e8a80610d43565b9567ffffffffffffffff875116918214610e6f565b85610c9c565b15610ec85760209161118c610fcc8361119894610d43565b83815191012095610d43565b908092918101031261015b576020903591019081515115611073575f5b8251805182101561104b576111cb828792610eb4565b515114806111e8575b6111e0576001016111b5565b505050905090565b508160206111f7838651610eb4565b510151146111d4565b7f1208b21b000000000000000000000000000000000000000000000000000000005f5260045ffd5b602060015491828152019060015f5260205f20905f5b81811061124b5750505090565b825473ffffffffffffffffffffffffffffffffffffffff1684526020909301926001928301920161123e565b335f9081527f4c48d1d2b0f4f7485fc28e3db22341d96a20aa29e6efa8149da9751603abd4e0602052604090205460ff16156112af57565b7fe2517d3f000000000000000000000000000000000000000000000000000000005f52336004527fbd893629a699470e4ec82a5715bb4981fdaacc5d0a728bf5f55b801d8f4ef10b60245260445ffd5b805f525f60205260405f2073ffffffffffffffffffffffffffffffffffffffff33165f5260205260ff60405f205416156113365750565b7fe2517d3f000000000000000000000000000000000000000000000000000000005f523360045260245260445ffd5b5f60208092604051918183925191829101835e8101838152039060025afa15610c915760205f8051604051838101917f020000000000000000000000000000000000000000000000000000000000000083526021820152602181526113cb60418261085e565b604051918291518091835e8101838152039060025afa15610c91575f5190565b91909182511561166457825160ff60025416907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82019060ff82116116375760ff8651921610156116095750508251927fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe061147e61146886610921565b95611476604051978861085e565b808752610921565b013660208601375f5b81518110156116025761149a8183610eb4565b5160418151036115cc5773ffffffffffffffffffffffffffffffffffffffff6114cf6114c68387611826565b90929192611860565b169081156115925750805f52600360205260ff60405f20541615611567575f5b82811061150c5750906001916115058288610eb4565b5201611487565b8173ffffffffffffffffffffffffffffffffffffffff61152c838a610eb4565b51161461153b576001016114ef565b507fe021c4f2000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b7fd7e8a2c2000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b6115c8906040519182917f9e3c1b3d000000000000000000000000000000000000000000000000000000008352600483016107cd565b0390fd5b6115c8906040519182917f2ee17a3d000000000000000000000000000000000000000000000000000000008352600483016107cd565b5050509050565b7f378b0805000000000000000000000000000000000000000000000000000000005f5260045260245260445ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b7f301b38b6000000000000000000000000000000000000000000000000000000005f5260045ffd5b805f525f60205260405f2073ffffffffffffffffffffffffffffffffffffffff83165f5260205260ff60405f205416155f1461175857805f525f60205260405f2073ffffffffffffffffffffffffffffffffffffffff83165f5260205260405f2060017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0082541617905573ffffffffffffffffffffffffffffffffffffffff339216907f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d5f80a4600190565b50505f90565b805f525f60205260405f2073ffffffffffffffffffffffffffffffffffffffff83165f5260205260ff60405f2054165f1461175857805f525f60205260405f2073ffffffffffffffffffffffffffffffffffffffff83165f5260205260405f207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00815416905573ffffffffffffffffffffffffffffffffffffffff339216907ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b5f80a4600190565b81519190604183036118565761184f9250602082015190606060408401519301515f1a9061190b565b9192909190565b50505f9160029190565b60048110156106715780611872575050565b600181036118a2577ff645eedf000000000000000000000000000000000000000000000000000000005f5260045ffd5b600281036118d657507ffce698f7000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b6003146118e05750565b7fd78bce0c000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b91907f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0841161198f579160209360809260ff5f9560405194855216868401526040830152606082015282805260015afa15610c91575f5173ffffffffffffffffffffffffffffffffffffffff81161561198557905f905f90565b505f906001905f90565b5050505f916003919056fea164736f6c634300081c000a2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d4c48d1d2b0f4f7485fc28e3db22341d96a20aa29e6efa8149da9751603abd4e06e0c24a6e293ff9b755263dbaa15ba3796b0b8d3fe17cfb4ddf8143b268eac47bd893629a699470e4ec82a5715bb4981fdaacc5d0a728bf5f55b801d8f4ef10bad3228b676f7d3cd4284a5443f17f1962b36e491b30a40b2405849e597ba5fb5","sourceMap":"815:11749:29:-:0;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;-1:-1:-1;;;;;815:11749:29;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;815:11749:29;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;:::i;:::-;;;;2648:28;815:11749;;2723:19;;;:69;;;815:11749;;;;;;;-1:-1:-1;815:11749:29;;;;;;-1:-1:-1;;;;;815:11749:29;;;;;;;;;;;;;;2893:217;;815:11749;;;;;2893:217;;815:11749;;;;;;;;;;;2893:217;815:11749;-1:-1:-1;815:11749:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;815:11749:29;;-1:-1:-1;815:11749:29;-1:-1:-1;815:11749:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;3171:3:29;815:11749;;3141:28;;;;;815:11749;;;;;;;;;;;;;;;-1:-1:-1;815:11749:29;3251:11;815:11749;;;;-1:-1:-1;815:11749:29;;;;;;;;-1:-1:-1;815:11749:29;3251:11;815:11749;;;-1:-1:-1;815:11749:29;;;;;;;;;;;3126:13;;815:11749;;;;-1:-1:-1;815:11749:29;;;;-1:-1:-1;815:11749:29;3141:28;-1:-1:-1;;815:11749:29;;;3372:27;815:11749;;;;;;;-1:-1:-1;;;;;;815:11749:29;-1:-1:-1;;;;;815:11749:29;;;;;;;;;-1:-1:-1;;;;;815:11749:29;;;;3496:44;;;:::i;:::-;;3451:249;815:11749;;;;;;;;;3451:249;3587:43;;3644:45;3587:43;;:::i;:::-;;3644:45;:::i;:::-;;3451:249;;815:11749;;;-1:-1:-1;;;;;815:11749:29;;;;;;;;;;;;;;;;-1:-1:-1;815:11749:29;;;;;;;;;;;;;;;;;;-1:-1:-1;815:11749:29;;;;;;;;;;-1:-1:-1;815:11749:29;;;;;-1:-1:-1;815:11749:29;;;;;;-1:-1:-1;815:11749:29;;;;;;-1:-1:-1;815:11749:29;2723:69;-1:-1:-1;815:11749:29;;-1:-1:-1;;815:11749:29;;;;;;;;;-1:-1:-1;2723:69:29;;815:11749;;;;-1:-1:-1;815:11749:29;;;;;-1:-1:-1;815:11749:29;;;;;-1:-1:-1;815:11749:29;;-1:-1:-1;815:11749:29;;-1:-1:-1;815:11749:29;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;-1:-1:-1;;815:11749:29;;;-1:-1:-1;;;;;815:11749:29;;;;;;;;;;:::o;:::-;;;-1:-1:-1;;;;;815:11749:29;;;;;;:::o;:::-;;;-1:-1:-1;;;;;815:11749:29;;;;;;:::o;6155:316:84:-;-1:-1:-1;;;;;815:11749:29;;2675:1;815:11749;;;-1:-1:-1;;;;;;;;;;;815:11749:29;;;;;;;;;;-1:-1:-1;;;;;815:11749:29;2675:1;815:11749;;;-1:-1:-1;;;;;;;;;;;815:11749:29;;;;;;;-1:-1:-1;;815:11749:29;;;;;735:10:112;;815:11749:29;-1:-1:-1;;;;;;;;;;;2675:1:29;;6346:40:84;6323:4;6400:11;:::o;6248:217::-;6442:12;2675:1:29;6442:12:84;:::o;6155:316::-;-1:-1:-1;;;;;815:11749:29;;;;;;-1:-1:-1;;;;;;;;;;;815:11749:29;;;;;;;;;;-1:-1:-1;;;;;815:11749:29;;;;;-1:-1:-1;;;;;;;;;;;815:11749:29;;;;;;;-1:-1:-1;;815:11749:29;;;;;735:10:112;;815:11749:29;-1:-1:-1;;;;;;;;;;;1507:33:29;-1:-1:-1;;;;;;;;;;;6346:40:84;815:11749:29;6346:40:84;6323:4;6400:11;:::o;6155:316::-;815:11749:29;;;-1:-1:-1;;;;;;;;;;;815:11749:29;;-1:-1:-1;;;;;;;;;;;815:11749:29;;;;;;;;;-1:-1:-1;;;;;;;;;;;815:11749:29;;-1:-1:-1;;;;;;;;;;;815:11749:29;;-1:-1:-1;;815:11749:29;6323:4:84;815:11749:29;;;735:10:112;;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;815:11749:29;;6346:40:84;6323:4;6400:11;:::o;6248:217::-;815:11749:29;6442:12:84;:::o","linkReferences":{}},"deployedBytecode":{"object":"0x6080806040526004361015610012575f80fd5b5f3560e01c90816301ffc9a7146106ab575080630bece356146105e8578063248a9ca3146105be5780632f2ff15d1461058f57806336568abe146105335780634d6d9ffb146104865780635832611b146104405780635972185a14610406578063682ed5f01461035157806391d1485414610308578063a217fddf146102ee578063a845a7f314610261578063d547741f1461022b578063ddba65371461015f5763ef913a4b146100c1575f80fd5b3461015b575f60031936011261015b576101576040516020808201526080604082015261014b816100f460c08201611228565b60ff600254818116606085015267ffffffffffffffff8160081c16608085015260481c16151560a0830152037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0810183528261085e565b604051918291826107cd565b0390f35b5f80fd5b3461015b5761016d36610749565b505060ff60025460481c16610203575f80527f4c48d1d2b0f4f7485fc28e3db22341d96a20aa29e6efa8149da9751603abd4e06020527f6e0c24a6e293ff9b755263dbaa15ba3796b0b8d3fe17cfb4ddf8143b268eac475460ff16156101f6575b7fda81d7c2000000000000000000000000000000000000000000000000000000005f5260045ffd5b6101fe611277565b6101ce565b7f928b1233000000000000000000000000000000000000000000000000000000005f5260045ffd5b3461015b5761025f61023c3661079a565b9061025a610255825f525f602052600160405f20015490565b6112ff565b61175e565b005b3461015b575f60031936011261015b5760ff6002541660405161028e8161028781611228565b038261085e565b60405190604082019260408352815180945260206060840192015f945b8086106102c057505082935060208301520390f35b909260208060019273ffffffffffffffffffffffffffffffffffffffff8751168152019401950194906102ab565b3461015b575f60031936011261015b5760206040515f8152f35b3461015b576103163661079a565b905f525f60205273ffffffffffffffffffffffffffffffffffffffff60405f2091165f52602052602060ff60405f2054166040519015158152f35b3461015b57602060031936011261015b5760043567ffffffffffffffff811161015b5760a0600319823603011261015b5760ff60025460481c16610203575f80527f4c48d1d2b0f4f7485fc28e3db22341d96a20aa29e6efa8149da9751603abd4e060209081527f6e0c24a6e293ff9b755263dbaa15ba3796b0b8d3fe17cfb4ddf8143b268eac475490916103f19160ff16156103f9575b6004016110cb565b604051908152f35b610401611277565b6103e9565b3461015b575f60031936011261015b5760206040517fbd893629a699470e4ec82a5715bb4981fdaacc5d0a728bf5f55b801d8f4ef10b8152f35b3461015b57602060031936011261015b5760043567ffffffffffffffff811680910361015b575f526004602052602067ffffffffffffffff60405f205416604051908152f35b3461015b57602060031936011261015b5760043567ffffffffffffffff811161015b576080600319823603011261015b5760ff60025460481c16610203575f80527f4c48d1d2b0f4f7485fc28e3db22341d96a20aa29e6efa8149da9751603abd4e060209081527f6e0c24a6e293ff9b755263dbaa15ba3796b0b8d3fe17cfb4ddf8143b268eac475490916103f19160ff1615610526575b600401610ef5565b61052e611277565b61051e565b3461015b576105413661079a565b3373ffffffffffffffffffffffffffffffffffffffff8216036105675761025f9161175e565b7f6697b232000000000000000000000000000000000000000000000000000000005f5260045ffd5b3461015b5761025f6105a03661079a565b906105b9610255825f525f602052600160405f20015490565b61168c565b3461015b57602060031936011261015b5760206103f16004355f525f602052600160405f20015490565b3461015b576105f636610749565b60ff60025460481c16610203575f80527f4c48d1d2b0f4f7485fc28e3db22341d96a20aa29e6efa8149da9751603abd4e06020527f6e0c24a6e293ff9b755263dbaa15ba3796b0b8d3fe17cfb4ddf8143b268eac475461065e929060ff161561069e57610a3c565b6040516003821015610671576020918152f35b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b6106a6611277565b610a3c565b3461015b57602060031936011261015b57600435907fffffffff00000000000000000000000000000000000000000000000000000000821680920361015b57817f7965db0b000000000000000000000000000000000000000000000000000000006020931490811561071f575b5015158152f35b7f01ffc9a70000000000000000000000000000000000000000000000000000000091501483610718565b90602060031983011261015b5760043567ffffffffffffffff811161015b578260238201121561015b5780600401359267ffffffffffffffff841161015b576024848301011161015b576024019190565b600319604091011261015b576004359060243573ffffffffffffffffffffffffffffffffffffffff8116810361015b5790565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f602060409481855280519182918282880152018686015e5f8582860101520116010190565b6040810190811067ffffffffffffffff82111761083157604052565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff82111761083157604052565b92919267ffffffffffffffff821161083157604051916108e760207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116018461085e565b82948184528183011161015b578281602093845f960137010152565b9080601f8301121561015b5781602061091e9335910161089f565b90565b67ffffffffffffffff81116108315760051b60200190565b60208183031261015b5780359067ffffffffffffffff821161015b57019060408282031261015b576040519161096e83610815565b803567ffffffffffffffff811161015b578261098b918301610903565b835260208101359067ffffffffffffffff821161015b57019080601f8301121561015b5781356109ba81610921565b926109c8604051948561085e565b81845260208085019260051b8201019183831161015b5760208201905b8382106109f9575050505050602082015290565b813567ffffffffffffffff811161015b57602091610a1c87848094880101610903565b8152019101906109e5565b519067ffffffffffffffff8216820361015b57565b610a4891810190610939565b60205f818351604051918183925191829101835e8101838152039060025afa15610c915760205f8051604051838101917f01000000000000000000000000000000000000000000000000000000000000008352602182015260218152610aaf60418261085e565b604051918291518091835e8101838152039060025afa15610c9157610ada5f516020830151906113eb565b5160408180518101031261015b57604051610af481610815565b610b0f6040610b0560208501610a27565b9384845201610a27565b67ffffffffffffffff60208301938285521680151580610c7e575b15610c4457505067ffffffffffffffff8151165f52600460205267ffffffffffffffff60405f20541680610bf3575067ffffffffffffffff9051918183169260025490838260081c168511610bb6575b50505116905f52600460205260405f20907fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000008254161790555f90565b68ffffffffffffffff007fffffffffffffffffffffffffffffffffffffffffffffff0000000000000000ff9160081b169116176002555f80610b7a565b9167ffffffffffffffff9150511603610c0b57600290565b69010000000000000000007fffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffff6002541617600255600190565b67ffffffffffffffff92507fdcbc5460000000000000000000000000000000000000000000000000000000005f526004521660245260445ffd5b5067ffffffffffffffff82161515610b2a565b6040513d5f823e3d90fd5b9035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18136030182121561015b570180359067ffffffffffffffff821161015b57602001918160051b3603831361015b57565b3567ffffffffffffffff8116810361015b5790565b15610d0d5750565b67ffffffffffffffff907ff7caaa5c000000000000000000000000000000000000000000000000000000005f521660045260245ffd5b9035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18136030182121561015b570180359067ffffffffffffffff821161015b5760200191813603831361015b57565b60208183031261015b5780519067ffffffffffffffff821161015b57019060408282031261015b5760405191610dc983610815565b610dd281610a27565b835260208101519067ffffffffffffffff821161015b570181601f8201121561015b57805190610e0182610921565b92610e0f604051948561085e565b82845260208085019360061b8301019181831161015b57602001925b828410610e3e5750505050602082015290565b60408483031261015b5760206040918251610e5881610815565b865181528287015183820152815201930192610e2b565b15610e78575050565b9067ffffffffffffffff80927fc7441689000000000000000000000000000000000000000000000000000000005f52166004521660245260445ffd5b8051821015610ec85760209160051b010190565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b6060810190610f048282610c9c565b90506001610f128484610c9c565b9290500361109b5750610fb8610f2a60408301610cf0565b9267ffffffffffffffff841692835f526004602052610fb367ffffffffffffffff60405f20541694610f5e87871515610d05565b610f9e610f76610f6e8580610d43565b810190610939565b610f8e610f838251611365565b6020830151906113eb565b5160208082518301019101610d94565b9667ffffffffffffffff885116918214610e6f565b610c9c565b15610ec857610fd3610fcc82602093610d43565b369161089f565b818151910120920180515115611073575f5b8151805182101561104b57610ffb828692610eb4565b51511461100a57600101610fe5565b60209293506110199151610eb4565b5101516110235790565b7f9a960b4f000000000000000000000000000000000000000000000000000000005f5260045ffd5b7f291fc442000000000000000000000000000000000000000000000000000000005f5260045ffd5b7f1e6c84da000000000000000000000000000000000000000000000000000000005f5260045ffd5b7f88b3170e000000000000000000000000000000000000000000000000000000005f52600160045260245260445ffd5b608081016110d98183610d43565b9050156112005760608201906110ef8284610c9c565b905060016110fd8486610c9c565b9290500361109b575061111260408401610cf0565b9061117467ffffffffffffffff831693845f52600460205261116e67ffffffffffffffff60405f2054169561114986881515610d05565b611159610f76610f6e8a80610d43565b9567ffffffffffffffff875116918214610e6f565b85610c9c565b15610ec85760209161118c610fcc8361119894610d43565b83815191012095610d43565b908092918101031261015b576020903591019081515115611073575f5b8251805182101561104b576111cb828792610eb4565b515114806111e8575b6111e0576001016111b5565b505050905090565b508160206111f7838651610eb4565b510151146111d4565b7f1208b21b000000000000000000000000000000000000000000000000000000005f5260045ffd5b602060015491828152019060015f5260205f20905f5b81811061124b5750505090565b825473ffffffffffffffffffffffffffffffffffffffff1684526020909301926001928301920161123e565b335f9081527f4c48d1d2b0f4f7485fc28e3db22341d96a20aa29e6efa8149da9751603abd4e0602052604090205460ff16156112af57565b7fe2517d3f000000000000000000000000000000000000000000000000000000005f52336004527fbd893629a699470e4ec82a5715bb4981fdaacc5d0a728bf5f55b801d8f4ef10b60245260445ffd5b805f525f60205260405f2073ffffffffffffffffffffffffffffffffffffffff33165f5260205260ff60405f205416156113365750565b7fe2517d3f000000000000000000000000000000000000000000000000000000005f523360045260245260445ffd5b5f60208092604051918183925191829101835e8101838152039060025afa15610c915760205f8051604051838101917f020000000000000000000000000000000000000000000000000000000000000083526021820152602181526113cb60418261085e565b604051918291518091835e8101838152039060025afa15610c91575f5190565b91909182511561166457825160ff60025416907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82019060ff82116116375760ff8651921610156116095750508251927fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe061147e61146886610921565b95611476604051978861085e565b808752610921565b013660208601375f5b81518110156116025761149a8183610eb4565b5160418151036115cc5773ffffffffffffffffffffffffffffffffffffffff6114cf6114c68387611826565b90929192611860565b169081156115925750805f52600360205260ff60405f20541615611567575f5b82811061150c5750906001916115058288610eb4565b5201611487565b8173ffffffffffffffffffffffffffffffffffffffff61152c838a610eb4565b51161461153b576001016114ef565b507fe021c4f2000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b7fd7e8a2c2000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b6115c8906040519182917f9e3c1b3d000000000000000000000000000000000000000000000000000000008352600483016107cd565b0390fd5b6115c8906040519182917f2ee17a3d000000000000000000000000000000000000000000000000000000008352600483016107cd565b5050509050565b7f378b0805000000000000000000000000000000000000000000000000000000005f5260045260245260445ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b7f301b38b6000000000000000000000000000000000000000000000000000000005f5260045ffd5b805f525f60205260405f2073ffffffffffffffffffffffffffffffffffffffff83165f5260205260ff60405f205416155f1461175857805f525f60205260405f2073ffffffffffffffffffffffffffffffffffffffff83165f5260205260405f2060017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0082541617905573ffffffffffffffffffffffffffffffffffffffff339216907f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d5f80a4600190565b50505f90565b805f525f60205260405f2073ffffffffffffffffffffffffffffffffffffffff83165f5260205260ff60405f2054165f1461175857805f525f60205260405f2073ffffffffffffffffffffffffffffffffffffffff83165f5260205260405f207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00815416905573ffffffffffffffffffffffffffffffffffffffff339216907ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b5f80a4600190565b81519190604183036118565761184f9250602082015190606060408401519301515f1a9061190b565b9192909190565b50505f9160029190565b60048110156106715780611872575050565b600181036118a2577ff645eedf000000000000000000000000000000000000000000000000000000005f5260045ffd5b600281036118d657507ffce698f7000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b6003146118e05750565b7fd78bce0c000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b91907f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0841161198f579160209360809260ff5f9560405194855216868401526040830152606082015282805260015afa15610c91575f5173ffffffffffffffffffffffffffffffffffffffff81161561198557905f905f90565b505f906001905f90565b5050505f916003919056fea164736f6c634300081c000a","sourceMap":"815:11749:29:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;815:11749:29;;;;;;;;3825:23;;;;815:11749;;;;;;3825:23;815:11749;;;;;;:::i;:::-;;;;;;;;;;;;1787:4;;;815:11749;;;;;;;;;;;;;;3825:23;;;;;;;;:::i;:::-;815:11749;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;;;;12225:20;815:11749;;;;;;;;;;;;;;;;12444:42;12440:105;;815:11749;9710:21;815:11749;9710:21;815:11749;;9710:21;12440:105;12513:20;;:::i;:::-;12440:105;;815:11749;;;;;;;;;;;4723:26:84;815:11749:29;;;:::i;:::-;4693:18:84;2484:4;4693:18;;3877:6;815:11749:29;3877:6:84;815:11749:29;;3877:22:84;815:11749:29;3877:6:84;815:11749:29;3877:22:84;815:11749:29;3786:120:84;;4693:18;2484:4;:::i;:::-;4723:26;:::i;:::-;815:11749:29;;;;;;-1:-1:-1;;815:11749:29;;;;;;4065:27;815:11749;;;;;;;;;:::i;:::-;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4034:11;815:11749;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;815:11749:29;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;2930:29:84;815:11749:29;-1:-1:-1;815:11749:29;;;;;;-1:-1:-1;815:11749:29;;;;;;;;;;;;;;;;-1:-1:-1;;815:11749:29;;;;;;;;;;;;;-1:-1:-1;;815:11749:29;;;;;;;;12225:20;815:11749;;;;;;;;;;;;;;;;;;5841:1853;;815:11749;;12444:42;12440:105;;815:11749;;;5841:1853;:::i;:::-;815:11749;;;;;;12440:105;12513:20;;:::i;:::-;12440:105;;815:11749;;;;;-1:-1:-1;;815:11749:29;;;;;;;;1507:33;815:11749;;;;;;;;-1:-1:-1;;815:11749:29;;;;;;;;;;;;;;;;1787:4;815:11749;;1787:4;815:11749;;;;1787:4;;815:11749;;;;;;;;;;;;-1:-1:-1;;815:11749:29;;;;;;;;;;;;;-1:-1:-1;;815:11749:29;;;;;;;;12225:20;815:11749;;;;;;;;;;;;;;;;;;7733:1799;;815:11749;;12444:42;12440:105;;815:11749;;;7733:1799;:::i;12440:105::-;12513:20;;:::i;:::-;12440:105;;815:11749;;;;;;;:::i;:::-;735:10:112;815:11749:29;;;5397:34:84;5393:102;;5505:37;;;:::i;5393:102::-;5454:30;815:11749:29;5454:30:84;815:11749:29;;5454:30:84;815:11749:29;;;;4306:25:84;815:11749:29;;;:::i;:::-;4276:18:84;2484:4;4276:18;;3877:6;815:11749:29;3877:6:84;815:11749:29;;3877:22:84;815:11749:29;3877:6:84;815:11749:29;3877:22:84;815:11749:29;3786:120:84;;2484:4;4306:25;:::i;815:11749:29:-;;;;;-1:-1:-1;;815:11749:29;;;;;;;;;3877:6:84;815:11749:29;3877:6:84;815:11749:29;;3877:22:84;815:11749:29;3877:6:84;815:11749:29;3877:22:84;815:11749:29;3786:120:84;;815:11749:29;;;;;;;:::i;:::-;;12225:20;815:11749;;;;;;;;;;;;;;4341:1461;;815:11749;;;12444:42;12440:105;;4341:1461;:::i;:::-;815:11749;;;;;;;;;;;;;;;;;;;;;;;12440:105;12513:20;;:::i;:::-;4341:1461;:::i;815:11749::-;;;;;-1:-1:-1;;815:11749:29;;;;;;;;;;;;;;;;2649:47:84;2664:32;815:11749:29;2649:47:84;;:87;;;;;815:11749:29;;;;;;;2649:87:84;844:25:124;829:40;;;2649:87:84;;;815:11749:29;;;-1:-1:-1;;815:11749:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;-1:-1:-1;;815:11749:29;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;:::o;:::-;;-1:-1:-1;815:11749:29;;;;;-1:-1:-1;815:11749:29;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;-1:-1:-1;815:11749:29;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;:::i;:::-;;:::o;:::-;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;1787:4;;815:11749;;;;;;;;1787:4::o;4341:1461::-;4562:58;4341:1461;4562:58;;;;:::i;:::-;815:11749;-1:-1:-1;4668:21:29;;;815:11749;;;;;;;;;;;;;;;;;;10125:12;;;;;;;;815:11749;-1:-1:-1;10125:12:29;;815:11749;;10099:39;;;815:11749;;;;;;;;;10099:39;;;;;;:::i;:::-;815:11749;;;;;;;;;;;;;;;10092:47;;10125:12;10092:47;;;;;4759:16;-1:-1:-1;10092:47:29;815:11749;4759:16;;;;;:::i;:::-;4859:21;815:11749;;;;4848:70;;1787:4;;;;815:11749;;;;;:::i;:::-;1787:4;815:11749;1787:4;815:11749;4848:70;;1787:4;:::i;:::-;;;;;;;:::i;:::-;815:11749;;1787:4;;;;;;815:11749;4937:16;;;:39;;;4341:1461;1787:4;;;;;815:11749;1787:4;;815:11749;-1:-1:-1;1787:4:29;5227:27;815:11749;1787:4;815:11749;;-1:-1:-1;1787:4:29;;815:11749;5282:22;5278:276;;1787:4;815:11749;1787:4;;815:11749;;;;1787:4;10125:12;1787:4;;;;;;815:11749;5568:39;;5564:109;;4341:1461;1787:4;;;815:11749;1787:4;-1:-1:-1;1787:4:29;5227:27;815:11749;1787:4;815:11749;-1:-1:-1;1787:4:29;;;;;;;;;-1:-1:-1;4341:1461:29;:::o;5564:109::-;1787:4;;;;;;;;;10125:12;1787:4;5564:109;;;;5278:276;1787:4;815:11749;1787:4;;;815:11749;5324:36;5320:169;;10125:12;5502:41;:::o;5320:169::-;1787:4;;10125:12;1787:4;;;10125:12;1787:4;;5425:49;:::o;1787:4::-;815:11749;1787:4;;;-1:-1:-1;1787:4:29;;815:11749;;1787:4;815:11749;1787:4;-1:-1:-1;1787:4:29;4937:39;815:11749;;;;4957:19;;4937:39;;10092:47;815:11749;;;-1:-1:-1;815:11749:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;:::o;:::-;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;1910:4::-;;;;;;;;;;;;;;;;;;;;;;;;;;815:11749;;;;;:::i;:::-;1787:4;;;:::i;:::-;1910;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;815:11749;;1910:4;815:11749;;;;:::i;:::-;1910:4;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;815:11749;;;;;;:::i;:::-;1910:4;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;815:11749;1910:4;;;;;815:11749;1910:4;815:11749;;1787:4;815:11749;1787:4;1910;;;815:11749;;1910:4;;;;;;;;;;;;:::o;:::-;;;;;;;;;;7733:1799;7940:9;;;;;;;;:::i;:::-;7984;;7960:1;7984:9;;;;:::i;:::-;7940:21;;;;815:11749;;8104:31;9118:9;8104:31;;;;;:::i;:::-;815:11749;;;;1787:4;;-1:-1:-1;1787:4:29;8157:27;8104:16;1787:4;8893:103;815:11749;8104:31;-1:-1:-1;1787:4:29;;815:11749;8215:7;8207:57;8215:7;;;;8207:57;:::i;:::-;8739:71;8324:59;8335:10;;;;:::i;:::-;8324:59;;;;:::i;:::-;8522:16;8410:67;8430:21;;8410:67;:::i;:::-;8104:16;8522;;;;;:::i;:::-;8750:21;8104:16;815:11749;;;8739:71;;;;;;:::i;:::-;1787:4;815:11749;1787:4;;815:11749;8901:39;;;8893:103;:::i;:::-;9118:9;:::i;:::-;1910:4;;;;;;8104:16;1910:4;;:::i;:::-;;;;:::i;:::-;815:11749;;;;;9108:23;9149:25;;;;815:11749;9149:36;1910:4;;-1:-1:-1;9270:3:29;9236:25;;815:11749;;9232:36;;;;;9293:28;;;;;:::i;:::-;;1910:4;9293:45;9289:198;;7960:1;1910:4;9217:13;;9289:198;8104:16;9366:25;;;:28;:25;;:28;:::i;:::-;;:39;1910:4;;;9454:18;:::o;1910:4::-;;-1:-1:-1;1910:4:29;8157:27;-1:-1:-1;1910:4:29;9232:36;9514:11;-1:-1:-1;9514:11:29;8157:27;-1:-1:-1;9514:11:29;1910:4;;-1:-1:-1;1910:4:29;8157:27;-1:-1:-1;1910:4:29;815:11749;;;;7960:1;815:11749;;;;;;;5841:1853;6042:10;;;;;;;:::i;:::-;:22;;;815:11749;;6097:9;;;;;;;;:::i;:::-;6141;;6117:1;6141:9;;;;:::i;:::-;6097:21;;;;815:11749;;6261:31;;;;;;:::i;:::-;815:11749;7265:9;815:11749;;;1787:4;;6063:1;1787:4;6314:27;6261:16;1787:4;7050:103;815:11749;6261:31;6063:1;1787:4;;815:11749;6372:7;6364:57;6372:7;;;;6364:57;:::i;:::-;6896:71;6481:59;6492:10;;;;:::i;6896:71::-;1787:4;815:11749;1787:4;;815:11749;7058:39;;;7050:103;:::i;:::-;7265:9;;:::i;:::-;1910:4;;;6261:16;1910:4;;;;7315:10;1910:4;;:::i;:::-;815:11749;;;;;7255:23;7315:10;;:::i;:::-;7304:33;;;;;;815:11749;;;;6261:16;815:11749;;7355:25;;;;;815:11749;7355:36;1910:4;;6063:1;7476:3;7442:25;;815:11749;;7438:36;;;;;7499:28;;;;;:::i;:::-;;1910:4;7499:45;:97;;;7476:3;7495:154;;6117:1;1910:4;7423:13;;7495:154;7616:18;;;;;;:::o;7499:97::-;7548:25;;6261:16;7548:28;:25;;;:28;:::i;:::-;;:39;1910:4;7548:48;7499:97;;815:11749;;6063:1;815:11749;;6063:1;815:11749;;;4034:11;815:11749;;;;;;;4034:11;-1:-1:-1;815:11749:29;;-1:-1:-1;815:11749:29;;-1:-1:-1;815:11749:29;;;;;;;;;;:::o;:::-;;;;;;;;;;;;4034:11;815:11749;;;;;;;3175:103:84;735:10:112;2930:6:84;815:11749:29;;;;;;;;;;;;3495:23:84;3491:108;;3175:103::o;3491:108::-;3541:47;2930:6;3541:47;735:10:112;3541:47:84;815:11749:29;1507:33;815:11749;;;2930:6:84;3541:47;3175:103;815:11749:29;2930:6:84;815:11749:29;2930:6:84;815:11749:29;;;2930:6:84;815:11749:29;;735:10:112;815:11749:29;-1:-1:-1;815:11749:29;;;;;-1:-1:-1;815:11749:29;;;3495:23:84;3491:108;;3175:103;:::o;3491:108::-;3541:47;2930:6;3541:47;735:10:112;3541:47:84;815:11749:29;;;;2930:6:84;3541:47;9980:166:29;-1:-1:-1;815:11749:29;9980:166;;815:11749;;;;;;;;;;;;;;;;;;10125:12;;;;;;;;815:11749;-1:-1:-1;10125:12:29;;815:11749;;10099:39;;;815:11749;;;;;;;;;10099:39;;;;;;:::i;:::-;815:11749;;;;;;;;;;;;;;;10092:47;;10125:12;10092:47;;;;;-1:-1:-1;10092:47:29;9980:166;:::o;10562:773::-;;;;815:11749;;10672:21;815:11749;;;;;10765:27;815:11749;;;;;;;;;;;;;;;;;-1:-1:-1;815:11749:29;;;;;;;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;:::i;:::-;;;;;;;10692:1;11003:3;815:11749;;10980:21;;;;;11041:13;;;;:::i;:::-;;1660:2;815:11749;;11811:42;1660:2;;815:11749;5503:8:122;5447:27;;;;:::i;:::-;5503:8;;;;;:::i;:::-;815:11749:29;11970:23;;;1660:2;;815:11749;;10692:1;815:11749;12041:11;815:11749;;;;10692:1;815:11749;;;1660:2;;;10692:1;11184:5;;;;;;11299:19;;10765:11;11299:19;;;;;:::i;:::-;815:11749;1910:4;10965:13;;11191:3;11222:7;815:11749;11222:7;;;;:::i;:::-;815:11749;;11222:20;815:11749;;10765:11;1910:4;11169:13;;815:11749;;;10692:1;815:11749;;;;10692:1;815:11749;1660:2;;10692:1;1660:2;;815:11749;;10692:1;1660:2;;;815:11749;;;1660:2;;;;;;;;;;:::i;:::-;;;;;;815:11749;;;1660:2;;;;;;;;;;:::i;10980:21::-;;;;;;10562:773::o;815:11749::-;;10692:1;815:11749;;;;;;10692:1;815:11749;;;10692:1;815:11749;;;;;10692:1;815:11749;;;10692:1;815:11749;;10692:1;815:11749;6155:316:84;815:11749:29;;;;;;;;;;;;-1:-1:-1;815:11749:29;;;;;-1:-1:-1;815:11749:29;;;6252:23:84;6248:217;815:11749:29;;;;;;;;;;;;;;;-1:-1:-1;815:11749:29;;;;-1:-1:-1;815:11749:29;6323:4:84;815:11749:29;;;;;;;;735:10:112;815:11749:29;;6346:40:84;;815:11749:29;6346:40:84;;6323:4;6400:11;:::o;6248:217::-;6442:12;;815:11749:29;6442:12:84;:::o;6708:317::-;815:11749:29;;;;;;;;;;;;-1:-1:-1;815:11749:29;;;;;-1:-1:-1;815:11749:29;;;6802:217:84;815:11749:29;;;;;;;;;;;;;;;-1:-1:-1;815:11749:29;;;;-1:-1:-1;815:11749:29;;;;;;;;735:10:112;815:11749:29;;6900:40:84;;815:11749:29;6900:40:84;;815:11749:29;6954:11:84;:::o;2433:778:122:-;815:11749:29;;;2433:778:122;2623:2;2603:22;;2623:2;;3055:25;2839:196;;;;;;;;;;;;;;;-1:-1:-1;2839:196:122;3055:25;;:::i;:::-;3048:32;;;;;:::o;2599:606::-;3111:83;;3127:1;3111:83;3131:35;3111:83;;:::o;11630:532::-;815:11749:29;;;;;;11716:29:122;;;11761:7;;:::o;11712:444::-;815:11749:29;11812:38:122;;815:11749:29;;11873:23:122;11725:20;11873:23;815:11749:29;11725:20:122;11873:23;11808:348;11926:35;11917:44;;11926:35;;11984:46;;11725:20;11984:46;815:11749:29;;;11725:20:122;11984:46;11913:243;12060:30;12051:39;12047:109;;11913:243;11630:532::o;12047:109::-;12113:32;11725:20;12113:32;815:11749:29;;;11725:20:122;12113:32;7142:1551;;;8222:66;8209:79;;8205:164;;815:11749:29;;;;;;-1:-1:-1;815:11749:29;;;;;;;;;;;;;;;;;;;8480:24:122;;;;;;;;;-1:-1:-1;8480:24:122;815:11749:29;;;8518:20:122;8514:113;;8637:49;-1:-1:-1;8637:49:122;-1:-1:-1;7142:1551:122;:::o;8514:113::-;8554:62;-1:-1:-1;8554:62:122;8480:24;8554:62;-1:-1:-1;8554:62:122;:::o;8205:164::-;8304:54;;;8320:1;8304:54;8324:30;8304:54;;:::o","linkReferences":{}},"methodIdentifiers":{"DEFAULT_ADMIN_ROLE()":"a217fddf","PROOF_SUBMITTER_ROLE()":"5972185a","getAttestationSet()":"a845a7f3","getClientState()":"ef913a4b","getConsensusTimestamp(uint64)":"5832611b","getRoleAdmin(bytes32)":"248a9ca3","grantRole(bytes32,address)":"2f2ff15d","hasRole(bytes32,address)":"91d14854","misbehaviour(bytes)":"ddba6537","renounceRole(bytes32,address)":"36568abe","revokeRole(bytes32,address)":"d547741f","supportsInterface(bytes4)":"01ffc9a7","updateClient(bytes)":"0bece356","verifyMembership((bytes,(uint64,uint64),bytes[],bytes))":"682ed5f0","verifyNonMembership((bytes,(uint64,uint64),bytes[]))":"4d6d9ffb"},"rawMetadata":"{\"compiler\":{\"version\":\"0.8.28+commit.7893614a\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"attestorAddresses\",\"type\":\"address[]\"},{\"internalType\":\"uint8\",\"name\":\"minRequiredSigs\",\"type\":\"uint8\"},{\"internalType\":\"uint64\",\"name\":\"initialHeight\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"initialTimestampSeconds\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"roleManager\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"AccessControlBadConfirmation\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"internalType\":\"bytes32\",\"name\":\"neededRole\",\"type\":\"bytes32\"}],\"name\":\"AccessControlUnauthorizedAccount\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint8\",\"name\":\"minRequired\",\"type\":\"uint8\"},{\"internalType\":\"uint256\",\"name\":\"attestationCount\",\"type\":\"uint256\"}],\"name\":\"BadQuorum\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"height\",\"type\":\"uint64\"}],\"name\":\"ConsensusTimestampNotFound\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"signer\",\"type\":\"address\"}],\"name\":\"DuplicateSigner\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ECDSAInvalidSignature\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"length\",\"type\":\"uint256\"}],\"name\":\"ECDSAInvalidSignatureLength\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"s\",\"type\":\"bytes32\"}],\"name\":\"ECDSAInvalidSignatureS\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"EmptyPackets\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"EmptySignatures\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"EmptyValue\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"FeatureNotSupported\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"FrozenClientState\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"expected\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"provided\",\"type\":\"uint64\"}],\"name\":\"HeightMismatch\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"expectedLength\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"providedLength\",\"type\":\"uint256\"}],\"name\":\"InvalidPathLength\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"signature\",\"type\":\"bytes\"}],\"name\":\"InvalidSignatureLength\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"height\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"timestamp\",\"type\":\"uint64\"}],\"name\":\"InvalidState\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"NoAttestors\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"NotMember\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"NotNonMember\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"signature\",\"type\":\"bytes\"}],\"name\":\"SignatureInvalid\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"validSigners\",\"type\":\"uint256\"},{\"internalType\":\"uint8\",\"name\":\"minRequired\",\"type\":\"uint8\"}],\"name\":\"ThresholdNotMet\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"signer\",\"type\":\"address\"}],\"name\":\"UnknownSigner\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"previousAdminRole\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"newAdminRole\",\"type\":\"bytes32\"}],\"name\":\"RoleAdminChanged\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"RoleGranted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"RoleRevoked\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"DEFAULT_ADMIN_ROLE\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"PROOF_SUBMITTER_ROLE\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getAttestationSet\",\"outputs\":[{\"internalType\":\"address[]\",\"name\":\"attestorAddresses\",\"type\":\"address[]\"},{\"internalType\":\"uint8\",\"name\":\"minRequiredSigs\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getClientState\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"revisionHeight\",\"type\":\"uint64\"}],\"name\":\"getConsensusTimestamp\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"}],\"name\":\"getRoleAdmin\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"grantRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"hasRole\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"name\":\"misbehaviour\",\"outputs\":[],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"callerConfirmation\",\"type\":\"address\"}],\"name\":\"renounceRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"revokeRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes4\",\"name\":\"interfaceId\",\"type\":\"bytes4\"}],\"name\":\"supportsInterface\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"updateMsg\",\"type\":\"bytes\"}],\"name\":\"updateClient\",\"outputs\":[{\"internalType\":\"enum ILightClientMsgs.UpdateResult\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes\",\"name\":\"proof\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"uint64\",\"name\":\"revisionNumber\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"revisionHeight\",\"type\":\"uint64\"}],\"internalType\":\"struct IICS02ClientMsgs.Height\",\"name\":\"proofHeight\",\"type\":\"tuple\"},{\"internalType\":\"bytes[]\",\"name\":\"path\",\"type\":\"bytes[]\"},{\"internalType\":\"bytes\",\"name\":\"value\",\"type\":\"bytes\"}],\"internalType\":\"struct ILightClientMsgs.MsgVerifyMembership\",\"name\":\"msg_\",\"type\":\"tuple\"}],\"name\":\"verifyMembership\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes\",\"name\":\"proof\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"uint64\",\"name\":\"revisionNumber\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"revisionHeight\",\"type\":\"uint64\"}],\"internalType\":\"struct IICS02ClientMsgs.Height\",\"name\":\"proofHeight\",\"type\":\"tuple\"},{\"internalType\":\"bytes[]\",\"name\":\"path\",\"type\":\"bytes[]\"}],\"internalType\":\"struct ILightClientMsgs.MsgVerifyNonMembership\",\"name\":\"msg_\",\"type\":\"tuple\"}],\"name\":\"verifyNonMembership\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"errors\":{\"AccessControlBadConfirmation()\":[{\"details\":\"The caller of a function is not the expected one. NOTE: Don't confuse with {AccessControlUnauthorizedAccount}.\"}],\"AccessControlUnauthorizedAccount(address,bytes32)\":[{\"details\":\"The `account` is missing a role.\"}],\"BadQuorum(uint8,uint256)\":[{\"params\":{\"attestationCount\":\"The size of the configured attestation set.\",\"minRequired\":\"The provided minimum required signatures.\"}}],\"ConsensusTimestampNotFound(uint64)\":[{\"params\":{\"height\":\"The height that has no associated timestamp.\"}}],\"DuplicateSigner(address)\":[{\"params\":{\"signer\":\"Address of the duplicate signer.\"}}],\"ECDSAInvalidSignature()\":[{\"details\":\"The signature derives the `address(0)`.\"}],\"ECDSAInvalidSignatureLength(uint256)\":[{\"details\":\"The signature has an invalid length.\"}],\"ECDSAInvalidSignatureS(bytes32)\":[{\"details\":\"The signature has an S value that is in the upper half order.\"}],\"HeightMismatch(uint64,uint64)\":[{\"params\":{\"expected\":\"The expected height from the proofHeight field.\",\"provided\":\"The height that was present in the attested payload.\"}}],\"InvalidPathLength(uint256,uint256)\":[{\"params\":{\"expectedLength\":\"The expected length of the path.\",\"providedLength\":\"The length of the provided path.\"}}],\"InvalidSignatureLength(bytes)\":[{\"params\":{\"signature\":\"The invalid signature.\"}}],\"InvalidState(uint64,uint64)\":[{\"params\":{\"height\":\"The height of the attested state.\",\"timestamp\":\"The timestamp of the attested state.\"}}],\"SignatureInvalid(bytes)\":[{\"params\":{\"signature\":\"The invalid signature.\"}}],\"ThresholdNotMet(uint256,uint8)\":[{\"params\":{\"minRequired\":\"The minimum required signatures.\",\"validSigners\":\"Number of valid, unique attestation signatures.\"}}],\"UnknownSigner(address)\":[{\"params\":{\"signer\":\"Address of the unknown signer.\"}}]},\"events\":{\"RoleAdminChanged(bytes32,bytes32,bytes32)\":{\"details\":\"Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite {RoleAdminChanged} not being emitted to signal this.\"},\"RoleGranted(bytes32,address,address)\":{\"details\":\"Emitted when `account` is granted `role`. `sender` is the account that originated the contract call. This account bears the admin role (for the granted role). Expected in cases where the role was granted using the internal {AccessControl-_grantRole}.\"},\"RoleRevoked(bytes32,address,address)\":{\"details\":\"Emitted when `account` is revoked `role`. `sender` is the account that originated the contract call: - if using `revokeRole`, it is the admin role bearer - if using `renounceRole`, it is the role bearer (i.e. `account`)\"}},\"kind\":\"dev\",\"methods\":{\"constructor\":{\"params\":{\"attestorAddresses\":\"The configured attestor addresses (EOAs)\",\"initialHeight\":\"The initial known height\",\"initialTimestampSeconds\":\"The initial timestamp in seconds for the initial height\",\"minRequiredSigs\":\"The quorum threshold\",\"roleManager\":\"Address that will administer roles and be allowed to submit proofs; if zero, anyone can submit\"}},\"getAttestationSet()\":{\"details\":\"The attestation set is fixed for the initial scope; rotation is out of scope.\",\"returns\":{\"attestorAddresses\":\"The configured attestor EOA addresses\",\"minRequiredSigs\":\"The minimum number of unique valid signatures required\"}},\"getClientState()\":{\"returns\":{\"_0\":\"The client state.\"}},\"getConsensusTimestamp(uint64)\":{\"params\":{\"revisionHeight\":\"The height for which to query the timestamp\"},\"returns\":{\"_0\":\"The trusted timestamp in unix seconds\"}},\"getRoleAdmin(bytes32)\":{\"details\":\"Returns the admin role that controls `role`. See {grantRole} and {revokeRole}. To change a role's admin, use {_setRoleAdmin}.\"},\"grantRole(bytes32,address)\":{\"details\":\"Grants `role` to `account`. If `account` had not been already granted `role`, emits a {RoleGranted} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleGranted} event.\"},\"hasRole(bytes32,address)\":{\"details\":\"Returns `true` if `account` has been granted `role`.\"},\"misbehaviour(bytes)\":{\"params\":{\"misbehaviourMsg\":\"The misbehaviour message\"}},\"renounceRole(bytes32,address)\":{\"details\":\"Revokes `role` from the calling account. Roles are often managed via {grantRole} and {revokeRole}: this function's purpose is to provide a mechanism for accounts to lose their privileges if they are compromised (such as when a trusted device is misplaced). If the calling account had been revoked `role`, emits a {RoleRevoked} event. Requirements: - the caller must be `callerConfirmation`. May emit a {RoleRevoked} event.\"},\"revokeRole(bytes32,address)\":{\"details\":\"Revokes `role` from `account`. If `account` had been granted `role`, emits a {RoleRevoked} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleRevoked} event.\"},\"supportsInterface(bytes4)\":{\"details\":\"Returns true if this contract implements the interface defined by `interfaceId`. See the corresponding https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[ERC section] to learn more about how these ids are created. This function call must use less than 30 000 gas.\"},\"updateClient(bytes)\":{\"params\":{\"updateMsg\":\"The encoded update message e.g., an SP1 proof.\"},\"returns\":{\"_0\":\"The result of the update operation\"}},\"verifyMembership((bytes,(uint64,uint64),bytes[],bytes))\":{\"details\":\"Notice that this message is not view, as it may update the client state for caching purposes.\",\"params\":{\"msg_\":\"The membership message\"},\"returns\":{\"_0\":\"The unix timestamp of the verification height in the counterparty chain in seconds.\"}},\"verifyNonMembership((bytes,(uint64,uint64),bytes[]))\":{\"details\":\"Notice that this message is not view, as it may update the client state for caching purposes.\",\"params\":{\"msg_\":\"The membership message\"},\"returns\":{\"_0\":\"The unix timestamp of the verification height in the counterparty chain in seconds.\"}}},\"stateVariables\":{\"PROOF_SUBMITTER_ROLE\":{\"details\":\"If `address(0)` has this role, then anyone can submit proofs. If this client is used with `ICS26Router`, the router must be granted this role.\",\"return\":\"The role identifier\",\"returns\":{\"_0\":\"The role identifier\"}}},\"title\":\"Attestation-based IBC Light Client\",\"version\":1},\"userdoc\":{\"errors\":{\"BadQuorum(uint8,uint256)\":[{\"notice\":\"Reverts when the quorum threshold is zero or exceeds the attestation count.\"}],\"ConsensusTimestampNotFound(uint64)\":[{\"notice\":\"Missing trusted timestamp for the given height.\"}],\"DuplicateSigner(address)\":[{\"notice\":\"The recovered signer appears more than once among the signatures.\"}],\"EmptyPackets()\":[{\"notice\":\"The provided packet attestations were empty.\"}],\"EmptySignatures()\":[{\"notice\":\"The provided signatures were empty.\"}],\"EmptyValue()\":[{\"notice\":\"The provided membership value was empty.\"}],\"FeatureNotSupported()\":[{\"notice\":\"Reverts for functions that are out of scope for this implementation.\"}],\"FrozenClientState()\":[{\"notice\":\"Reverts when an action is attempted on a frozen client state.\"}],\"HeightMismatch(uint64,uint64)\":[{\"notice\":\"The attested height did not match the provided proof height.\"}],\"InvalidPathLength(uint256,uint256)\":[{\"notice\":\"The provided proof path length is invalid.\"}],\"InvalidSignatureLength(bytes)\":[{\"notice\":\"ECDSA signature has an invalid length.\"}],\"InvalidState(uint64,uint64)\":[{\"notice\":\"The attested state is invalid.\"}],\"NoAttestors()\":[{\"notice\":\"Reverts when the attestation set is empty during initialization.\"}],\"NotMember()\":[{\"notice\":\"The provided value is not a member of the attested set.\"}],\"NotNonMember()\":[{\"notice\":\"The attested commitment is not zero (receipt exists, so packet was received).\"}],\"SignatureInvalid(bytes)\":[{\"notice\":\"ECDSA signature failed to recover a valid signer.\"}],\"ThresholdNotMet(uint256,uint8)\":[{\"notice\":\"The number of valid unique signatures is below the required threshold.\"}],\"UnknownSigner(address)\":[{\"notice\":\"The recovered signer is not part of the attestation set.\"}]},\"kind\":\"user\",\"methods\":{\"PROOF_SUBMITTER_ROLE()\":{\"notice\":\"The role identifier for the proof submitter role\"},\"constructor\":{\"notice\":\"Initializes the attestor light client with its fixed attestor set and initial height/timestamp.\"},\"getAttestationSet()\":{\"notice\":\"Returns the attestation set configuration.\"},\"getClientState()\":{\"notice\":\"Returns the client state.\"},\"getConsensusTimestamp(uint64)\":{\"notice\":\"Returns the trusted consensus timestamp (in seconds) at the given revision height.\"},\"misbehaviour(bytes)\":{\"notice\":\"Misbehaviour handling, moves the light client to the frozen state if misbehaviour is detected\"},\"updateClient(bytes)\":{\"notice\":\"Updating the client and consensus state\"},\"verifyMembership((bytes,(uint64,uint64),bytes[],bytes))\":{\"notice\":\"Querying the membership of a key-value pair\"},\"verifyNonMembership((bytes,(uint64,uint64),bytes[]))\":{\"notice\":\"Querying the non-membership of a key\"}},\"notice\":\"Implements an IBC light client that trusts an off-chain m-of-n attestor set.\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/light-clients/attestation/AttestationLightClient.sol\":\"AttestationLightClient\"},\"evmVersion\":\"cancun\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"none\"},\"optimizer\":{\"enabled\":true,\"runs\":10000},\"remappings\":[\":@openzeppelin-contracts/=node_modules/@openzeppelin/contracts/\",\":@openzeppelin-upgradeable/=node_modules/@openzeppelin/contracts-upgradeable/\",\":@openzeppelin/=node_modules/@openzeppelin/\",\":@sp1-contracts/=node_modules/sp1-contracts/contracts/src/\",\":@uniswap/permit2/=node_modules/@uniswap/permit2/\",\":forge-std/=node_modules/forge-std/src/\",\":sp1-contracts/=node_modules/sp1-contracts/\"],\"viaIR\":true},\"sources\":{\"contracts/interfaces/ILightClient.sol\":{\"keccak256\":\"0x1caae9e4f741a86c0056d5f7713a35f3bd96db7a9fd52fc9f1cf79aad76a442f\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://4a536db3b926560f69547c17e4f451a2631ddea0f42bd224c7fd8382d74429f6\",\"dweb:/ipfs/QmcQ33kxcmmowXgMbQGTBgiKBjF7v8UiP4y73bB9hhDizC\"]},\"contracts/light-clients/attestation/AttestationLightClient.sol\":{\"keccak256\":\"0xb287ccfd4e7b3baa99215a62484a99117b3be10d9765899c221f3fb0d54876fd\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://752979b4fe813e9cee697e2c29c7b119f8f0f84e2a9b6b1d0db97685a4435660\",\"dweb:/ipfs/QmTxfSdTKcrfaKKKtsX5Wy8RVMYcyYfkKCaDm2brNYTLFz\"]},\"contracts/light-clients/attestation/errors/IAttestationLightClientErrors.sol\":{\"keccak256\":\"0x0d3592b3c36cfcde83e2510bb9179b41befb486cbb65f529ff68c09fad751564\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://8d9bd1170d3954f7af6bd9fe79efbeff8f943073d27eb7bbecc8b9c66a0bdc62\",\"dweb:/ipfs/QmRuorHcJVhDJdYf7y43tyZuDowoBGkeRjH2z9C939XuDa\"]},\"contracts/light-clients/attestation/interfaces/IAttestationLightClient.sol\":{\"keccak256\":\"0x115ffce5474e6127fdb1f2b9284ea6d51ec978efd47f4425ba693c6c69d8b0af\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://bebb9e7d156b1a3ec682ff9cb8c9680b718bf0ae8e217ed153811dd399e456e8\",\"dweb:/ipfs/QmcjbxSBU4jvZMxn7PYYM6fxLCovWj1rKAtZazXY2RSA8U\"]},\"contracts/light-clients/attestation/msgs/IAttestationLightClientMsgs.sol\":{\"keccak256\":\"0x08148f1409f7e3c8968916950d920b8a4352796191875a4672ad2404e3541ef5\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://94c4b12d851c5e7b581d2794c88481df658eaf55ad4e54ddef14423c90986a67\",\"dweb:/ipfs/QmZysvpbY1Xe7kNVw1iHZsPaVMUMqLauJssyrceQybBgXw\"]},\"contracts/light-clients/attestation/msgs/IAttestationMsgs.sol\":{\"keccak256\":\"0xba7901ec5fb4a4845272501a1a0b183309cd0ae37d9ec5f9e3c6ce699bfd281f\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://72d0768a801a3c70910c10a1fc48c29c62d902dc602e20d72a1388ba498e8a4b\",\"dweb:/ipfs/QmUKLdbX2NwSyHFrh2WUHLm4zdFivu3Ryw2XyjT3R9Szse\"]},\"contracts/msgs/IICS02ClientMsgs.sol\":{\"keccak256\":\"0xb5fdb25319d5c32b3f527982d45ec1e9bec5215515581aee034d853006ea01a0\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://6b8939bf552c62c952a491008bcd9b59ab7dda20a9482bf93438e05793881542\",\"dweb:/ipfs/QmfWmzNCp8bd4pP26Lfw5HHp4dSZnCDqZDjVN7SD8P7eDh\"]},\"contracts/msgs/ILightClientMsgs.sol\":{\"keccak256\":\"0xa0565e7748b8b3284d72e1aa6ef4cc8264fcaa5f4e0761d22d64686953db6378\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://c4476010d7090bfaa74127526f2051c6bc82ff42a09b936e848880a1f15a6065\",\"dweb:/ipfs/QmY87JgRsFQXSZdGXNjNHEJCkdTHzFXH4vZEJ3q7MnHuP8\"]},\"node_modules/@openzeppelin/contracts/access/AccessControl.sol\":{\"keccak256\":\"0x1a6b4f6b7798ab80929d491b89d5427a9b3338c0fd1acd0ba325f69c6f1646af\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://7bb7f346c12a14dc622bc105ce3c47202fbc89f4b153a28a63bb68193297330c\",\"dweb:/ipfs/QmagwF8P3bUBXwdo159ueEnY9dLSvEWwK24kk2op58egwG\"]},\"node_modules/@openzeppelin/contracts/access/IAccessControl.sol\":{\"keccak256\":\"0xbff9f59c84e5337689161ce7641c0ef8e872d6a7536fbc1f5133f128887aba3c\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://b308f882e796f7b79c9502deacb0a62983035c6f6f4e962b319ba6a1f4a77d3d\",\"dweb:/ipfs/QmaWCW7ahEQqFjwhSUhV7Ae7WhfNvzSpE7DQ58hvEooqPL\"]},\"node_modules/@openzeppelin/contracts/utils/Context.sol\":{\"keccak256\":\"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://6a708e8a5bdb1011c2c381c9a5cfd8a9a956d7d0a9dc1bd8bcdaf52f76ef2f12\",\"dweb:/ipfs/Qmax9WHBnVsZP46ZxEMNRQpLQnrdE4dK8LehML1Py8FowF\"]},\"node_modules/@openzeppelin/contracts/utils/cryptography/ECDSA.sol\":{\"keccak256\":\"0x360cf86214a764694dae1522a38200b1737fe90e46dcf56a0f89de143071cc20\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://2e393290a46ca6d1fa1addb40709d26e1d250638ab6acdd103b5af21768ebc7b\",\"dweb:/ipfs/QmPwT3tXwQ9NbGtZ99XRq7sr8LCQP8XaCrzw49JdXGn7us\"]},\"node_modules/@openzeppelin/contracts/utils/introspection/ERC165.sol\":{\"keccak256\":\"0x2d9dc2fe26180f74c11c13663647d38e259e45f95eb88f57b61d2160b0109d3e\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://81233d1f98060113d9922180bb0f14f8335856fe9f339134b09335e9f678c377\",\"dweb:/ipfs/QmWh6R35SarhAn4z2wH8SU456jJSYL2FgucfTFgbHJJN4E\"]},\"node_modules/@openzeppelin/contracts/utils/introspection/IERC165.sol\":{\"keccak256\":\"0x8891738ffe910f0cf2da09566928589bf5d63f4524dd734fd9cedbac3274dd5c\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://971f954442df5c2ef5b5ebf1eb245d7105d9fbacc7386ee5c796df1d45b21617\",\"dweb:/ipfs/QmadRjHbkicwqwwh61raUEapaVEtaLMcYbQZWs9gUkgj3u\"]}},\"version\":1}","metadata":{"compiler":{"version":"0.8.28+commit.7893614a"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"address[]","name":"attestorAddresses","type":"address[]"},{"internalType":"uint8","name":"minRequiredSigs","type":"uint8"},{"internalType":"uint64","name":"initialHeight","type":"uint64"},{"internalType":"uint64","name":"initialTimestampSeconds","type":"uint64"},{"internalType":"address","name":"roleManager","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"type":"error","name":"AccessControlBadConfirmation"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bytes32","name":"neededRole","type":"bytes32"}],"type":"error","name":"AccessControlUnauthorizedAccount"},{"inputs":[{"internalType":"uint8","name":"minRequired","type":"uint8"},{"internalType":"uint256","name":"attestationCount","type":"uint256"}],"type":"error","name":"BadQuorum"},{"inputs":[{"internalType":"uint64","name":"height","type":"uint64"}],"type":"error","name":"ConsensusTimestampNotFound"},{"inputs":[{"internalType":"address","name":"signer","type":"address"}],"type":"error","name":"DuplicateSigner"},{"inputs":[],"type":"error","name":"ECDSAInvalidSignature"},{"inputs":[{"internalType":"uint256","name":"length","type":"uint256"}],"type":"error","name":"ECDSAInvalidSignatureLength"},{"inputs":[{"internalType":"bytes32","name":"s","type":"bytes32"}],"type":"error","name":"ECDSAInvalidSignatureS"},{"inputs":[],"type":"error","name":"EmptyPackets"},{"inputs":[],"type":"error","name":"EmptySignatures"},{"inputs":[],"type":"error","name":"EmptyValue"},{"inputs":[],"type":"error","name":"FeatureNotSupported"},{"inputs":[],"type":"error","name":"FrozenClientState"},{"inputs":[{"internalType":"uint64","name":"expected","type":"uint64"},{"internalType":"uint64","name":"provided","type":"uint64"}],"type":"error","name":"HeightMismatch"},{"inputs":[{"internalType":"uint256","name":"expectedLength","type":"uint256"},{"internalType":"uint256","name":"providedLength","type":"uint256"}],"type":"error","name":"InvalidPathLength"},{"inputs":[{"internalType":"bytes","name":"signature","type":"bytes"}],"type":"error","name":"InvalidSignatureLength"},{"inputs":[{"internalType":"uint64","name":"height","type":"uint64"},{"internalType":"uint64","name":"timestamp","type":"uint64"}],"type":"error","name":"InvalidState"},{"inputs":[],"type":"error","name":"NoAttestors"},{"inputs":[],"type":"error","name":"NotMember"},{"inputs":[],"type":"error","name":"NotNonMember"},{"inputs":[{"internalType":"bytes","name":"signature","type":"bytes"}],"type":"error","name":"SignatureInvalid"},{"inputs":[{"internalType":"uint256","name":"validSigners","type":"uint256"},{"internalType":"uint8","name":"minRequired","type":"uint8"}],"type":"error","name":"ThresholdNotMet"},{"inputs":[{"internalType":"address","name":"signer","type":"address"}],"type":"error","name":"UnknownSigner"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32","indexed":true},{"internalType":"bytes32","name":"previousAdminRole","type":"bytes32","indexed":true},{"internalType":"bytes32","name":"newAdminRole","type":"bytes32","indexed":true}],"type":"event","name":"RoleAdminChanged","anonymous":false},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32","indexed":true},{"internalType":"address","name":"account","type":"address","indexed":true},{"internalType":"address","name":"sender","type":"address","indexed":true}],"type":"event","name":"RoleGranted","anonymous":false},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32","indexed":true},{"internalType":"address","name":"account","type":"address","indexed":true},{"internalType":"address","name":"sender","type":"address","indexed":true}],"type":"event","name":"RoleRevoked","anonymous":false},{"inputs":[],"stateMutability":"view","type":"function","name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"PROOF_SUBMITTER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"getAttestationSet","outputs":[{"internalType":"address[]","name":"attestorAddresses","type":"address[]"},{"internalType":"uint8","name":"minRequiredSigs","type":"uint8"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"getClientState","outputs":[{"internalType":"bytes","name":"","type":"bytes"}]},{"inputs":[{"internalType":"uint64","name":"revisionHeight","type":"uint64"}],"stateMutability":"view","type":"function","name":"getConsensusTimestamp","outputs":[{"internalType":"uint64","name":"","type":"uint64"}]},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"stateMutability":"view","type":"function","name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}]},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"stateMutability":"nonpayable","type":"function","name":"grantRole"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"stateMutability":"view","type":"function","name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}]},{"inputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function","name":"misbehaviour"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"callerConfirmation","type":"address"}],"stateMutability":"nonpayable","type":"function","name":"renounceRole"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"stateMutability":"nonpayable","type":"function","name":"revokeRole"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"stateMutability":"view","type":"function","name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}]},{"inputs":[{"internalType":"bytes","name":"updateMsg","type":"bytes"}],"stateMutability":"nonpayable","type":"function","name":"updateClient","outputs":[{"internalType":"enum ILightClientMsgs.UpdateResult","name":"","type":"uint8"}]},{"inputs":[{"internalType":"struct ILightClientMsgs.MsgVerifyMembership","name":"msg_","type":"tuple","components":[{"internalType":"bytes","name":"proof","type":"bytes"},{"internalType":"struct IICS02ClientMsgs.Height","name":"proofHeight","type":"tuple","components":[{"internalType":"uint64","name":"revisionNumber","type":"uint64"},{"internalType":"uint64","name":"revisionHeight","type":"uint64"}]},{"internalType":"bytes[]","name":"path","type":"bytes[]"},{"internalType":"bytes","name":"value","type":"bytes"}]}],"stateMutability":"view","type":"function","name":"verifyMembership","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[{"internalType":"struct ILightClientMsgs.MsgVerifyNonMembership","name":"msg_","type":"tuple","components":[{"internalType":"bytes","name":"proof","type":"bytes"},{"internalType":"struct IICS02ClientMsgs.Height","name":"proofHeight","type":"tuple","components":[{"internalType":"uint64","name":"revisionNumber","type":"uint64"},{"internalType":"uint64","name":"revisionHeight","type":"uint64"}]},{"internalType":"bytes[]","name":"path","type":"bytes[]"}]}],"stateMutability":"view","type":"function","name":"verifyNonMembership","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]}],"devdoc":{"kind":"dev","methods":{"constructor":{"params":{"attestorAddresses":"The configured attestor addresses (EOAs)","initialHeight":"The initial known height","initialTimestampSeconds":"The initial timestamp in seconds for the initial height","minRequiredSigs":"The quorum threshold","roleManager":"Address that will administer roles and be allowed to submit proofs; if zero, anyone can submit"}},"getAttestationSet()":{"details":"The attestation set is fixed for the initial scope; rotation is out of scope.","returns":{"attestorAddresses":"The configured attestor EOA addresses","minRequiredSigs":"The minimum number of unique valid signatures required"}},"getClientState()":{"returns":{"_0":"The client state."}},"getConsensusTimestamp(uint64)":{"params":{"revisionHeight":"The height for which to query the timestamp"},"returns":{"_0":"The trusted timestamp in unix seconds"}},"getRoleAdmin(bytes32)":{"details":"Returns the admin role that controls `role`. See {grantRole} and {revokeRole}. To change a role's admin, use {_setRoleAdmin}."},"grantRole(bytes32,address)":{"details":"Grants `role` to `account`. If `account` had not been already granted `role`, emits a {RoleGranted} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleGranted} event."},"hasRole(bytes32,address)":{"details":"Returns `true` if `account` has been granted `role`."},"misbehaviour(bytes)":{"params":{"misbehaviourMsg":"The misbehaviour message"}},"renounceRole(bytes32,address)":{"details":"Revokes `role` from the calling account. Roles are often managed via {grantRole} and {revokeRole}: this function's purpose is to provide a mechanism for accounts to lose their privileges if they are compromised (such as when a trusted device is misplaced). If the calling account had been revoked `role`, emits a {RoleRevoked} event. Requirements: - the caller must be `callerConfirmation`. May emit a {RoleRevoked} event."},"revokeRole(bytes32,address)":{"details":"Revokes `role` from `account`. If `account` had been granted `role`, emits a {RoleRevoked} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleRevoked} event."},"supportsInterface(bytes4)":{"details":"Returns true if this contract implements the interface defined by `interfaceId`. See the corresponding https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[ERC section] to learn more about how these ids are created. This function call must use less than 30 000 gas."},"updateClient(bytes)":{"params":{"updateMsg":"The encoded update message e.g., an SP1 proof."},"returns":{"_0":"The result of the update operation"}},"verifyMembership((bytes,(uint64,uint64),bytes[],bytes))":{"details":"Notice that this message is not view, as it may update the client state for caching purposes.","params":{"msg_":"The membership message"},"returns":{"_0":"The unix timestamp of the verification height in the counterparty chain in seconds."}},"verifyNonMembership((bytes,(uint64,uint64),bytes[]))":{"details":"Notice that this message is not view, as it may update the client state for caching purposes.","params":{"msg_":"The membership message"},"returns":{"_0":"The unix timestamp of the verification height in the counterparty chain in seconds."}}},"version":1},"userdoc":{"kind":"user","methods":{"PROOF_SUBMITTER_ROLE()":{"notice":"The role identifier for the proof submitter role"},"constructor":{"notice":"Initializes the attestor light client with its fixed attestor set and initial height/timestamp."},"getAttestationSet()":{"notice":"Returns the attestation set configuration."},"getClientState()":{"notice":"Returns the client state."},"getConsensusTimestamp(uint64)":{"notice":"Returns the trusted consensus timestamp (in seconds) at the given revision height."},"misbehaviour(bytes)":{"notice":"Misbehaviour handling, moves the light client to the frozen state if misbehaviour is detected"},"updateClient(bytes)":{"notice":"Updating the client and consensus state"},"verifyMembership((bytes,(uint64,uint64),bytes[],bytes))":{"notice":"Querying the membership of a key-value pair"},"verifyNonMembership((bytes,(uint64,uint64),bytes[]))":{"notice":"Querying the non-membership of a key"}},"version":1}},"settings":{"remappings":["@openzeppelin-contracts/=node_modules/@openzeppelin/contracts/","@openzeppelin-upgradeable/=node_modules/@openzeppelin/contracts-upgradeable/","@openzeppelin/=node_modules/@openzeppelin/","@sp1-contracts/=node_modules/sp1-contracts/contracts/src/","@uniswap/permit2/=node_modules/@uniswap/permit2/","forge-std/=node_modules/forge-std/src/","sp1-contracts/=node_modules/sp1-contracts/"],"optimizer":{"enabled":true,"runs":10000},"metadata":{"bytecodeHash":"none"},"compilationTarget":{"contracts/light-clients/attestation/AttestationLightClient.sol":"AttestationLightClient"},"evmVersion":"cancun","libraries":{},"viaIR":true},"sources":{"contracts/interfaces/ILightClient.sol":{"keccak256":"0x1caae9e4f741a86c0056d5f7713a35f3bd96db7a9fd52fc9f1cf79aad76a442f","urls":["bzz-raw://4a536db3b926560f69547c17e4f451a2631ddea0f42bd224c7fd8382d74429f6","dweb:/ipfs/QmcQ33kxcmmowXgMbQGTBgiKBjF7v8UiP4y73bB9hhDizC"],"license":"MIT"},"contracts/light-clients/attestation/AttestationLightClient.sol":{"keccak256":"0xb287ccfd4e7b3baa99215a62484a99117b3be10d9765899c221f3fb0d54876fd","urls":["bzz-raw://752979b4fe813e9cee697e2c29c7b119f8f0f84e2a9b6b1d0db97685a4435660","dweb:/ipfs/QmTxfSdTKcrfaKKKtsX5Wy8RVMYcyYfkKCaDm2brNYTLFz"],"license":"MIT"},"contracts/light-clients/attestation/errors/IAttestationLightClientErrors.sol":{"keccak256":"0x0d3592b3c36cfcde83e2510bb9179b41befb486cbb65f529ff68c09fad751564","urls":["bzz-raw://8d9bd1170d3954f7af6bd9fe79efbeff8f943073d27eb7bbecc8b9c66a0bdc62","dweb:/ipfs/QmRuorHcJVhDJdYf7y43tyZuDowoBGkeRjH2z9C939XuDa"],"license":"MIT"},"contracts/light-clients/attestation/interfaces/IAttestationLightClient.sol":{"keccak256":"0x115ffce5474e6127fdb1f2b9284ea6d51ec978efd47f4425ba693c6c69d8b0af","urls":["bzz-raw://bebb9e7d156b1a3ec682ff9cb8c9680b718bf0ae8e217ed153811dd399e456e8","dweb:/ipfs/QmcjbxSBU4jvZMxn7PYYM6fxLCovWj1rKAtZazXY2RSA8U"],"license":"MIT"},"contracts/light-clients/attestation/msgs/IAttestationLightClientMsgs.sol":{"keccak256":"0x08148f1409f7e3c8968916950d920b8a4352796191875a4672ad2404e3541ef5","urls":["bzz-raw://94c4b12d851c5e7b581d2794c88481df658eaf55ad4e54ddef14423c90986a67","dweb:/ipfs/QmZysvpbY1Xe7kNVw1iHZsPaVMUMqLauJssyrceQybBgXw"],"license":"MIT"},"contracts/light-clients/attestation/msgs/IAttestationMsgs.sol":{"keccak256":"0xba7901ec5fb4a4845272501a1a0b183309cd0ae37d9ec5f9e3c6ce699bfd281f","urls":["bzz-raw://72d0768a801a3c70910c10a1fc48c29c62d902dc602e20d72a1388ba498e8a4b","dweb:/ipfs/QmUKLdbX2NwSyHFrh2WUHLm4zdFivu3Ryw2XyjT3R9Szse"],"license":"MIT"},"contracts/msgs/IICS02ClientMsgs.sol":{"keccak256":"0xb5fdb25319d5c32b3f527982d45ec1e9bec5215515581aee034d853006ea01a0","urls":["bzz-raw://6b8939bf552c62c952a491008bcd9b59ab7dda20a9482bf93438e05793881542","dweb:/ipfs/QmfWmzNCp8bd4pP26Lfw5HHp4dSZnCDqZDjVN7SD8P7eDh"],"license":"MIT"},"contracts/msgs/ILightClientMsgs.sol":{"keccak256":"0xa0565e7748b8b3284d72e1aa6ef4cc8264fcaa5f4e0761d22d64686953db6378","urls":["bzz-raw://c4476010d7090bfaa74127526f2051c6bc82ff42a09b936e848880a1f15a6065","dweb:/ipfs/QmY87JgRsFQXSZdGXNjNHEJCkdTHzFXH4vZEJ3q7MnHuP8"],"license":"MIT"},"node_modules/@openzeppelin/contracts/access/AccessControl.sol":{"keccak256":"0x1a6b4f6b7798ab80929d491b89d5427a9b3338c0fd1acd0ba325f69c6f1646af","urls":["bzz-raw://7bb7f346c12a14dc622bc105ce3c47202fbc89f4b153a28a63bb68193297330c","dweb:/ipfs/QmagwF8P3bUBXwdo159ueEnY9dLSvEWwK24kk2op58egwG"],"license":"MIT"},"node_modules/@openzeppelin/contracts/access/IAccessControl.sol":{"keccak256":"0xbff9f59c84e5337689161ce7641c0ef8e872d6a7536fbc1f5133f128887aba3c","urls":["bzz-raw://b308f882e796f7b79c9502deacb0a62983035c6f6f4e962b319ba6a1f4a77d3d","dweb:/ipfs/QmaWCW7ahEQqFjwhSUhV7Ae7WhfNvzSpE7DQ58hvEooqPL"],"license":"MIT"},"node_modules/@openzeppelin/contracts/utils/Context.sol":{"keccak256":"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2","urls":["bzz-raw://6a708e8a5bdb1011c2c381c9a5cfd8a9a956d7d0a9dc1bd8bcdaf52f76ef2f12","dweb:/ipfs/Qmax9WHBnVsZP46ZxEMNRQpLQnrdE4dK8LehML1Py8FowF"],"license":"MIT"},"node_modules/@openzeppelin/contracts/utils/cryptography/ECDSA.sol":{"keccak256":"0x360cf86214a764694dae1522a38200b1737fe90e46dcf56a0f89de143071cc20","urls":["bzz-raw://2e393290a46ca6d1fa1addb40709d26e1d250638ab6acdd103b5af21768ebc7b","dweb:/ipfs/QmPwT3tXwQ9NbGtZ99XRq7sr8LCQP8XaCrzw49JdXGn7us"],"license":"MIT"},"node_modules/@openzeppelin/contracts/utils/introspection/ERC165.sol":{"keccak256":"0x2d9dc2fe26180f74c11c13663647d38e259e45f95eb88f57b61d2160b0109d3e","urls":["bzz-raw://81233d1f98060113d9922180bb0f14f8335856fe9f339134b09335e9f678c377","dweb:/ipfs/QmWh6R35SarhAn4z2wH8SU456jJSYL2FgucfTFgbHJJN4E"],"license":"MIT"},"node_modules/@openzeppelin/contracts/utils/introspection/IERC165.sol":{"keccak256":"0x8891738ffe910f0cf2da09566928589bf5d63f4524dd734fd9cedbac3274dd5c","urls":["bzz-raw://971f954442df5c2ef5b5ebf1eb245d7105d9fbacc7386ee5c796df1d45b21617","dweb:/ipfs/QmadRjHbkicwqwwh61raUEapaVEtaLMcYbQZWs9gUkgj3u"],"license":"MIT"}},"version":1},"id":29} \ No newline at end of file +{"abi":[{"type":"constructor","inputs":[{"name":"attestorAddresses","type":"address[]","internalType":"address[]"},{"name":"minRequiredSigs","type":"uint8","internalType":"uint8"},{"name":"initialHeight","type":"uint64","internalType":"uint64"},{"name":"initialTimestampSeconds","type":"uint64","internalType":"uint64"},{"name":"roleManager","type":"address","internalType":"address"}],"stateMutability":"nonpayable"},{"type":"function","name":"DEFAULT_ADMIN_ROLE","inputs":[],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"type":"function","name":"PROOF_SUBMITTER_ROLE","inputs":[],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"type":"function","name":"getAttestationSet","inputs":[],"outputs":[{"name":"attestorAddresses","type":"address[]","internalType":"address[]"},{"name":"minRequiredSigs","type":"uint8","internalType":"uint8"}],"stateMutability":"view"},{"type":"function","name":"getClientState","inputs":[],"outputs":[{"name":"","type":"bytes","internalType":"bytes"}],"stateMutability":"view"},{"type":"function","name":"getConsensusTimestamp","inputs":[{"name":"revisionHeight","type":"uint64","internalType":"uint64"}],"outputs":[{"name":"","type":"uint64","internalType":"uint64"}],"stateMutability":"view"},{"type":"function","name":"getRoleAdmin","inputs":[{"name":"role","type":"bytes32","internalType":"bytes32"}],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"type":"function","name":"grantRole","inputs":[{"name":"role","type":"bytes32","internalType":"bytes32"},{"name":"account","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"hasRole","inputs":[{"name":"role","type":"bytes32","internalType":"bytes32"},{"name":"account","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"misbehaviour","inputs":[{"name":"","type":"bytes","internalType":"bytes"}],"outputs":[],"stateMutability":"view"},{"type":"function","name":"renounceRole","inputs":[{"name":"role","type":"bytes32","internalType":"bytes32"},{"name":"callerConfirmation","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"revokeRole","inputs":[{"name":"role","type":"bytes32","internalType":"bytes32"},{"name":"account","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"supportsInterface","inputs":[{"name":"interfaceId","type":"bytes4","internalType":"bytes4"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"updateClient","inputs":[{"name":"updateMsg","type":"bytes","internalType":"bytes"}],"outputs":[{"name":"","type":"uint8","internalType":"enum ILightClientMsgs.UpdateResult"}],"stateMutability":"nonpayable"},{"type":"function","name":"verifyMembership","inputs":[{"name":"msg_","type":"tuple","internalType":"struct ILightClientMsgs.MsgVerifyMembership","components":[{"name":"proof","type":"bytes","internalType":"bytes"},{"name":"proofHeight","type":"tuple","internalType":"struct IICS02ClientMsgs.Height","components":[{"name":"revisionNumber","type":"uint64","internalType":"uint64"},{"name":"revisionHeight","type":"uint64","internalType":"uint64"}]},{"name":"path","type":"bytes[]","internalType":"bytes[]"},{"name":"value","type":"bytes","internalType":"bytes"}]}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"verifyNonMembership","inputs":[{"name":"msg_","type":"tuple","internalType":"struct ILightClientMsgs.MsgVerifyNonMembership","components":[{"name":"proof","type":"bytes","internalType":"bytes"},{"name":"proofHeight","type":"tuple","internalType":"struct IICS02ClientMsgs.Height","components":[{"name":"revisionNumber","type":"uint64","internalType":"uint64"},{"name":"revisionHeight","type":"uint64","internalType":"uint64"}]},{"name":"path","type":"bytes[]","internalType":"bytes[]"}]}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"event","name":"RoleAdminChanged","inputs":[{"name":"role","type":"bytes32","indexed":true,"internalType":"bytes32"},{"name":"previousAdminRole","type":"bytes32","indexed":true,"internalType":"bytes32"},{"name":"newAdminRole","type":"bytes32","indexed":true,"internalType":"bytes32"}],"anonymous":false},{"type":"event","name":"RoleGranted","inputs":[{"name":"role","type":"bytes32","indexed":true,"internalType":"bytes32"},{"name":"account","type":"address","indexed":true,"internalType":"address"},{"name":"sender","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"type":"event","name":"RoleRevoked","inputs":[{"name":"role","type":"bytes32","indexed":true,"internalType":"bytes32"},{"name":"account","type":"address","indexed":true,"internalType":"address"},{"name":"sender","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"type":"error","name":"AccessControlBadConfirmation","inputs":[]},{"type":"error","name":"AccessControlUnauthorizedAccount","inputs":[{"name":"account","type":"address","internalType":"address"},{"name":"neededRole","type":"bytes32","internalType":"bytes32"}]},{"type":"error","name":"BadQuorum","inputs":[{"name":"minRequired","type":"uint8","internalType":"uint8"},{"name":"attestationCount","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"ConsensusTimestampNotFound","inputs":[{"name":"height","type":"uint64","internalType":"uint64"}]},{"type":"error","name":"DuplicateSigner","inputs":[{"name":"signer","type":"address","internalType":"address"}]},{"type":"error","name":"ECDSAInvalidSignature","inputs":[]},{"type":"error","name":"ECDSAInvalidSignatureLength","inputs":[{"name":"length","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"ECDSAInvalidSignatureS","inputs":[{"name":"s","type":"bytes32","internalType":"bytes32"}]},{"type":"error","name":"EmptyPackets","inputs":[]},{"type":"error","name":"EmptySignatures","inputs":[]},{"type":"error","name":"EmptyValue","inputs":[]},{"type":"error","name":"FeatureNotSupported","inputs":[]},{"type":"error","name":"FrozenClientState","inputs":[]},{"type":"error","name":"HeightMismatch","inputs":[{"name":"expected","type":"uint64","internalType":"uint64"},{"name":"provided","type":"uint64","internalType":"uint64"}]},{"type":"error","name":"InvalidPathLength","inputs":[{"name":"expectedLength","type":"uint256","internalType":"uint256"},{"name":"providedLength","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"InvalidSignatureLength","inputs":[{"name":"signature","type":"bytes","internalType":"bytes"}]},{"type":"error","name":"InvalidState","inputs":[{"name":"height","type":"uint64","internalType":"uint64"},{"name":"timestamp","type":"uint64","internalType":"uint64"}]},{"type":"error","name":"NoAttestors","inputs":[]},{"type":"error","name":"NotMember","inputs":[]},{"type":"error","name":"NotNonMember","inputs":[]},{"type":"error","name":"SignatureInvalid","inputs":[{"name":"signature","type":"bytes","internalType":"bytes"}]},{"type":"error","name":"ThresholdNotMet","inputs":[{"name":"validSigners","type":"uint256","internalType":"uint256"},{"name":"minRequired","type":"uint8","internalType":"uint8"}]},{"type":"error","name":"UnknownSigner","inputs":[{"name":"signer","type":"address","internalType":"address"}]}],"bytecode":{"object":"0x60806040523461032d57611f568038038061001981610349565b928339810160a08282031261032d5781516001600160401b03811161032d57820181601f8201121561032d578051916001600160401b0383116102c8578260051b916020610068818501610349565b8095815201906020829482010192831161032d57602001905b8282106103315750505060208301519260ff841680940361032d576100a860408201610382565b6100c060806100b960608501610382565b930161036e565b9284511561031e57851515806102f2575b855190156102dc575060405195608087016001600160401b038111888210176102c857604052858752602087019081526060604088019360018060401b03169788855201915f835286519060018060401b0382116102c8576801000000000000000082116102c85760015482600155808310610284575b5060015f5260205f205f5b838110610267575050505060ff90511669ff00000000000000000060025493610100600160481b03905160081b169251151560481b169260018060501b0319161717176002555f5b83518110156101fb5760018060a01b0360208260051b8601015116805f52600360205260ff60405f2054166101e957906001915f52600360205260405f208260ff198254161790550161019b565b637010e27960e11b5f5260045260245ffd5b505f84815260046020526040902080546001600160401b0319166001600160401b039092169190911790556001600160a01b03811661024e575061023d61048c565b505b6040516119a7908161050f8239f35b8061025b61026192610396565b5061040c565b5061023f565b82516001600160a01b031681830155602090920191600101610153565b60015f527fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf69081019083015b8181106102bd5750610148565b5f81556001016102b0565b634e487b7160e01b5f52604160045260245ffd5b866365846b7f60e01b5f5260045260245260445ffd5b5084515f19870160ff811161030a5760ff16106100d1565b634e487b7160e01b5f52601160045260245ffd5b6343d0a89360e11b5f5260045ffd5b5f80fd5b6020809161033e8461036e565b815201910190610081565b6040519190601f01601f191682016001600160401b038111838210176102c857604052565b51906001600160a01b038216820361032d57565b51906001600160401b038216820361032d57565b6001600160a01b0381165f9081525f516020611f365f395f51905f52602052604090205460ff16610407576001600160a01b03165f8181525f516020611f365f395f51905f5260205260408120805460ff191660011790553391905f516020611eb65f395f51905f528180a4600190565b505f90565b6001600160a01b0381165f9081525f516020611ed65f395f51905f52602052604090205460ff16610407576001600160a01b03165f8181525f516020611ed65f395f51905f5260205260408120805460ff191660011790553391905f516020611f165f395f51905f52905f516020611eb65f395f51905f529080a4600190565b5f80525f516020611ed65f395f51905f526020525f516020611ef65f395f51905f525460ff1661050a575f8080525f516020611ed65f395f51905f526020525f516020611ef65f395f51905f52805460ff1916600117905533905f516020611f165f395f51905f525f516020611eb65f395f51905f528280a4600190565b5f9056fe6080806040526004361015610012575f80fd5b5f3560e01c90816301ffc9a7146106ab575080630bece356146105e8578063248a9ca3146105be5780632f2ff15d1461058f57806336568abe146105335780634d6d9ffb146104865780635832611b146104405780635972185a14610406578063682ed5f01461035157806391d1485414610308578063a217fddf146102ee578063a845a7f314610261578063d547741f1461022b578063ddba65371461015f5763ef913a4b146100c1575f80fd5b3461015b575f60031936011261015b576101576040516020808201526080604082015261014b816100f460c08201611228565b60ff600254818116606085015267ffffffffffffffff8160081c16608085015260481c16151560a0830152037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0810183528261085e565b604051918291826107cd565b0390f35b5f80fd5b3461015b5761016d36610749565b505060ff60025460481c16610203575f80527f4c48d1d2b0f4f7485fc28e3db22341d96a20aa29e6efa8149da9751603abd4e06020527f6e0c24a6e293ff9b755263dbaa15ba3796b0b8d3fe17cfb4ddf8143b268eac475460ff16156101f6575b7fda81d7c2000000000000000000000000000000000000000000000000000000005f5260045ffd5b6101fe611277565b6101ce565b7f928b1233000000000000000000000000000000000000000000000000000000005f5260045ffd5b3461015b5761025f61023c3661079a565b9061025a610255825f525f602052600160405f20015490565b6112ff565b61175e565b005b3461015b575f60031936011261015b5760ff6002541660405161028e8161028781611228565b038261085e565b60405190604082019260408352815180945260206060840192015f945b8086106102c057505082935060208301520390f35b909260208060019273ffffffffffffffffffffffffffffffffffffffff8751168152019401950194906102ab565b3461015b575f60031936011261015b5760206040515f8152f35b3461015b576103163661079a565b905f525f60205273ffffffffffffffffffffffffffffffffffffffff60405f2091165f52602052602060ff60405f2054166040519015158152f35b3461015b57602060031936011261015b5760043567ffffffffffffffff811161015b5760a0600319823603011261015b5760ff60025460481c16610203575f80527f4c48d1d2b0f4f7485fc28e3db22341d96a20aa29e6efa8149da9751603abd4e060209081527f6e0c24a6e293ff9b755263dbaa15ba3796b0b8d3fe17cfb4ddf8143b268eac475490916103f19160ff16156103f9575b6004016110cb565b604051908152f35b610401611277565b6103e9565b3461015b575f60031936011261015b5760206040517fbd893629a699470e4ec82a5715bb4981fdaacc5d0a728bf5f55b801d8f4ef10b8152f35b3461015b57602060031936011261015b5760043567ffffffffffffffff811680910361015b575f526004602052602067ffffffffffffffff60405f205416604051908152f35b3461015b57602060031936011261015b5760043567ffffffffffffffff811161015b576080600319823603011261015b5760ff60025460481c16610203575f80527f4c48d1d2b0f4f7485fc28e3db22341d96a20aa29e6efa8149da9751603abd4e060209081527f6e0c24a6e293ff9b755263dbaa15ba3796b0b8d3fe17cfb4ddf8143b268eac475490916103f19160ff1615610526575b600401610ef5565b61052e611277565b61051e565b3461015b576105413661079a565b3373ffffffffffffffffffffffffffffffffffffffff8216036105675761025f9161175e565b7f6697b232000000000000000000000000000000000000000000000000000000005f5260045ffd5b3461015b5761025f6105a03661079a565b906105b9610255825f525f602052600160405f20015490565b61168c565b3461015b57602060031936011261015b5760206103f16004355f525f602052600160405f20015490565b3461015b576105f636610749565b60ff60025460481c16610203575f80527f4c48d1d2b0f4f7485fc28e3db22341d96a20aa29e6efa8149da9751603abd4e06020527f6e0c24a6e293ff9b755263dbaa15ba3796b0b8d3fe17cfb4ddf8143b268eac475461065e929060ff161561069e57610a3c565b6040516003821015610671576020918152f35b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b6106a6611277565b610a3c565b3461015b57602060031936011261015b57600435907fffffffff00000000000000000000000000000000000000000000000000000000821680920361015b57817f7965db0b000000000000000000000000000000000000000000000000000000006020931490811561071f575b5015158152f35b7f01ffc9a70000000000000000000000000000000000000000000000000000000091501483610718565b90602060031983011261015b5760043567ffffffffffffffff811161015b578260238201121561015b5780600401359267ffffffffffffffff841161015b576024848301011161015b576024019190565b600319604091011261015b576004359060243573ffffffffffffffffffffffffffffffffffffffff8116810361015b5790565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f602060409481855280519182918282880152018686015e5f8582860101520116010190565b6040810190811067ffffffffffffffff82111761083157604052565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff82111761083157604052565b92919267ffffffffffffffff821161083157604051916108e760207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116018461085e565b82948184528183011161015b578281602093845f960137010152565b9080601f8301121561015b5781602061091e9335910161089f565b90565b67ffffffffffffffff81116108315760051b60200190565b60208183031261015b5780359067ffffffffffffffff821161015b57019060408282031261015b576040519161096e83610815565b803567ffffffffffffffff811161015b578261098b918301610903565b835260208101359067ffffffffffffffff821161015b57019080601f8301121561015b5781356109ba81610921565b926109c8604051948561085e565b81845260208085019260051b8201019183831161015b5760208201905b8382106109f9575050505050602082015290565b813567ffffffffffffffff811161015b57602091610a1c87848094880101610903565b8152019101906109e5565b519067ffffffffffffffff8216820361015b57565b610a4891810190610939565b60205f818351604051918183925191829101835e8101838152039060025afa15610c915760205f8051604051838101917f01000000000000000000000000000000000000000000000000000000000000008352602182015260218152610aaf60418261085e565b604051918291518091835e8101838152039060025afa15610c9157610ada5f516020830151906113eb565b5160408180518101031261015b57604051610af481610815565b610b0f6040610b0560208501610a27565b9384845201610a27565b67ffffffffffffffff60208301938285521680151580610c7e575b15610c4457505067ffffffffffffffff8151165f52600460205267ffffffffffffffff60405f20541680610bf3575067ffffffffffffffff9051918183169260025490838260081c168511610bb6575b50505116905f52600460205260405f20907fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000008254161790555f90565b68ffffffffffffffff007fffffffffffffffffffffffffffffffffffffffffffffff0000000000000000ff9160081b169116176002555f80610b7a565b9167ffffffffffffffff9150511603610c0b57600290565b69010000000000000000007fffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffff6002541617600255600190565b67ffffffffffffffff92507fdcbc5460000000000000000000000000000000000000000000000000000000005f526004521660245260445ffd5b5067ffffffffffffffff82161515610b2a565b6040513d5f823e3d90fd5b9035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18136030182121561015b570180359067ffffffffffffffff821161015b57602001918160051b3603831361015b57565b3567ffffffffffffffff8116810361015b5790565b15610d0d5750565b67ffffffffffffffff907ff7caaa5c000000000000000000000000000000000000000000000000000000005f521660045260245ffd5b9035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18136030182121561015b570180359067ffffffffffffffff821161015b5760200191813603831361015b57565b60208183031261015b5780519067ffffffffffffffff821161015b57019060408282031261015b5760405191610dc983610815565b610dd281610a27565b835260208101519067ffffffffffffffff821161015b570181601f8201121561015b57805190610e0182610921565b92610e0f604051948561085e565b82845260208085019360061b8301019181831161015b57602001925b828410610e3e5750505050602082015290565b60408483031261015b5760206040918251610e5881610815565b865181528287015183820152815201930192610e2b565b15610e78575050565b9067ffffffffffffffff80927fc7441689000000000000000000000000000000000000000000000000000000005f52166004521660245260445ffd5b8051821015610ec85760209160051b010190565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b6060810190610f048282610c9c565b90506001610f128484610c9c565b9290500361109b5750610fb8610f2a60408301610cf0565b9267ffffffffffffffff841692835f526004602052610fb367ffffffffffffffff60405f20541694610f5e87871515610d05565b610f9e610f76610f6e8580610d43565b810190610939565b610f8e610f838251611365565b6020830151906113eb565b5160208082518301019101610d94565b9667ffffffffffffffff885116918214610e6f565b610c9c565b15610ec857610fd3610fcc82602093610d43565b369161089f565b818151910120920180515115611073575f5b8151805182101561104b57610ffb828692610eb4565b51511461100a57600101610fe5565b60209293506110199151610eb4565b5101516110235790565b7f9a960b4f000000000000000000000000000000000000000000000000000000005f5260045ffd5b7f291fc442000000000000000000000000000000000000000000000000000000005f5260045ffd5b7f1e6c84da000000000000000000000000000000000000000000000000000000005f5260045ffd5b7f88b3170e000000000000000000000000000000000000000000000000000000005f52600160045260245260445ffd5b608081016110d98183610d43565b9050156112005760608201906110ef8284610c9c565b905060016110fd8486610c9c565b9290500361109b575061111260408401610cf0565b9061117467ffffffffffffffff831693845f52600460205261116e67ffffffffffffffff60405f2054169561114986881515610d05565b611159610f76610f6e8a80610d43565b9567ffffffffffffffff875116918214610e6f565b85610c9c565b15610ec85760209161118c610fcc8361119894610d43565b83815191012095610d43565b908092918101031261015b576020903591019081515115611073575f5b8251805182101561104b576111cb828792610eb4565b515114806111e8575b6111e0576001016111b5565b505050905090565b508160206111f7838651610eb4565b510151146111d4565b7f1208b21b000000000000000000000000000000000000000000000000000000005f5260045ffd5b602060015491828152019060015f5260205f20905f5b81811061124b5750505090565b825473ffffffffffffffffffffffffffffffffffffffff1684526020909301926001928301920161123e565b335f9081527f4c48d1d2b0f4f7485fc28e3db22341d96a20aa29e6efa8149da9751603abd4e0602052604090205460ff16156112af57565b7fe2517d3f000000000000000000000000000000000000000000000000000000005f52336004527fbd893629a699470e4ec82a5715bb4981fdaacc5d0a728bf5f55b801d8f4ef10b60245260445ffd5b805f525f60205260405f2073ffffffffffffffffffffffffffffffffffffffff33165f5260205260ff60405f205416156113365750565b7fe2517d3f000000000000000000000000000000000000000000000000000000005f523360045260245260445ffd5b5f60208092604051918183925191829101835e8101838152039060025afa15610c915760205f8051604051838101917f020000000000000000000000000000000000000000000000000000000000000083526021820152602181526113cb60418261085e565b604051918291518091835e8101838152039060025afa15610c91575f5190565b91909182511561166457825160ff60025416907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82019060ff82116116375760ff8651921610156116095750508251927fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe061147e61146886610921565b95611476604051978861085e565b808752610921565b013660208601375f5b81518110156116025761149a8183610eb4565b5160418151036115cc5773ffffffffffffffffffffffffffffffffffffffff6114cf6114c68387611826565b90929192611860565b169081156115925750805f52600360205260ff60405f20541615611567575f5b82811061150c5750906001916115058288610eb4565b5201611487565b8173ffffffffffffffffffffffffffffffffffffffff61152c838a610eb4565b51161461153b576001016114ef565b507fe021c4f2000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b7fd7e8a2c2000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b6115c8906040519182917f9e3c1b3d000000000000000000000000000000000000000000000000000000008352600483016107cd565b0390fd5b6115c8906040519182917f2ee17a3d000000000000000000000000000000000000000000000000000000008352600483016107cd565b5050509050565b7f378b0805000000000000000000000000000000000000000000000000000000005f5260045260245260445ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b7f301b38b6000000000000000000000000000000000000000000000000000000005f5260045ffd5b805f525f60205260405f2073ffffffffffffffffffffffffffffffffffffffff83165f5260205260ff60405f205416155f1461175857805f525f60205260405f2073ffffffffffffffffffffffffffffffffffffffff83165f5260205260405f2060017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0082541617905573ffffffffffffffffffffffffffffffffffffffff339216907f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d5f80a4600190565b50505f90565b805f525f60205260405f2073ffffffffffffffffffffffffffffffffffffffff83165f5260205260ff60405f2054165f1461175857805f525f60205260405f2073ffffffffffffffffffffffffffffffffffffffff83165f5260205260405f207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00815416905573ffffffffffffffffffffffffffffffffffffffff339216907ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b5f80a4600190565b81519190604183036118565761184f9250602082015190606060408401519301515f1a9061190b565b9192909190565b50505f9160029190565b60048110156106715780611872575050565b600181036118a2577ff645eedf000000000000000000000000000000000000000000000000000000005f5260045ffd5b600281036118d657507ffce698f7000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b6003146118e05750565b7fd78bce0c000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b91907f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0841161198f579160209360809260ff5f9560405194855216868401526040830152606082015282805260015afa15610c91575f5173ffffffffffffffffffffffffffffffffffffffff81161561198557905f905f90565b505f906001905f90565b5050505f916003919056fea164736f6c634300081c000a2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d4c48d1d2b0f4f7485fc28e3db22341d96a20aa29e6efa8149da9751603abd4e06e0c24a6e293ff9b755263dbaa15ba3796b0b8d3fe17cfb4ddf8143b268eac47bd893629a699470e4ec82a5715bb4981fdaacc5d0a728bf5f55b801d8f4ef10bad3228b676f7d3cd4284a5443f17f1962b36e491b30a40b2405849e597ba5fb5","sourceMap":"815:11749:29:-:0;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;-1:-1:-1;;;;;815:11749:29;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;815:11749:29;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;:::i;:::-;;;;2648:28;815:11749;;2723:19;;;:69;;;815:11749;;;;;;;-1:-1:-1;815:11749:29;;;;;;-1:-1:-1;;;;;815:11749:29;;;;;;;;;;;;;;2893:217;;815:11749;;;;;2893:217;;815:11749;;;;;;;;;;;2893:217;815:11749;-1:-1:-1;815:11749:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;815:11749:29;;-1:-1:-1;815:11749:29;-1:-1:-1;815:11749:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;3171:3:29;815:11749;;3141:28;;;;;815:11749;;;;;;;;;;;;;;;-1:-1:-1;815:11749:29;3251:11;815:11749;;;;-1:-1:-1;815:11749:29;;;;;;;;-1:-1:-1;815:11749:29;3251:11;815:11749;;;-1:-1:-1;815:11749:29;;;;;;;;;;;3126:13;;815:11749;;;;-1:-1:-1;815:11749:29;;;;-1:-1:-1;815:11749:29;3141:28;-1:-1:-1;;815:11749:29;;;3372:27;815:11749;;;;;;;-1:-1:-1;;;;;;815:11749:29;-1:-1:-1;;;;;815:11749:29;;;;;;;;;-1:-1:-1;;;;;815:11749:29;;;;3496:44;;;:::i;:::-;;3451:249;815:11749;;;;;;;;;3451:249;3587:43;;3644:45;3587:43;;:::i;:::-;;3644:45;:::i;:::-;;3451:249;;815:11749;;;-1:-1:-1;;;;;815:11749:29;;;;;;;;;;;;;;;;-1:-1:-1;815:11749:29;;;;;;;;;;;;;;;;;;-1:-1:-1;815:11749:29;;;;;;;;;;-1:-1:-1;815:11749:29;;;;;-1:-1:-1;815:11749:29;;;;;;-1:-1:-1;815:11749:29;;;;;;-1:-1:-1;815:11749:29;2723:69;-1:-1:-1;815:11749:29;;-1:-1:-1;;815:11749:29;;;;;;;;;-1:-1:-1;2723:69:29;;815:11749;;;;-1:-1:-1;815:11749:29;;;;;-1:-1:-1;815:11749:29;;;;;-1:-1:-1;815:11749:29;;-1:-1:-1;815:11749:29;;-1:-1:-1;815:11749:29;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;-1:-1:-1;;815:11749:29;;;-1:-1:-1;;;;;815:11749:29;;;;;;;;;;:::o;:::-;;;-1:-1:-1;;;;;815:11749:29;;;;;;:::o;:::-;;;-1:-1:-1;;;;;815:11749:29;;;;;;:::o;6155:316:92:-;-1:-1:-1;;;;;815:11749:29;;2675:1;815:11749;;;-1:-1:-1;;;;;;;;;;;815:11749:29;;;;;;;;;;-1:-1:-1;;;;;815:11749:29;2675:1;815:11749;;;-1:-1:-1;;;;;;;;;;;815:11749:29;;;;;;;-1:-1:-1;;815:11749:29;;;;;735:10:120;;815:11749:29;-1:-1:-1;;;;;;;;;;;2675:1:29;;6346:40:92;6323:4;6400:11;:::o;6248:217::-;6442:12;2675:1:29;6442:12:92;:::o;6155:316::-;-1:-1:-1;;;;;815:11749:29;;;;;;-1:-1:-1;;;;;;;;;;;815:11749:29;;;;;;;;;;-1:-1:-1;;;;;815:11749:29;;;;;-1:-1:-1;;;;;;;;;;;815:11749:29;;;;;;;-1:-1:-1;;815:11749:29;;;;;735:10:120;;815:11749:29;-1:-1:-1;;;;;;;;;;;1507:33:29;-1:-1:-1;;;;;;;;;;;6346:40:92;815:11749:29;6346:40:92;6323:4;6400:11;:::o;6155:316::-;815:11749:29;;;-1:-1:-1;;;;;;;;;;;815:11749:29;;-1:-1:-1;;;;;;;;;;;815:11749:29;;;;;;;;;-1:-1:-1;;;;;;;;;;;815:11749:29;;-1:-1:-1;;;;;;;;;;;815:11749:29;;-1:-1:-1;;815:11749:29;6323:4:92;815:11749:29;;;735:10:120;;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;815:11749:29;;6346:40:92;6323:4;6400:11;:::o;6248:217::-;815:11749:29;6442:12:92;:::o","linkReferences":{}},"deployedBytecode":{"object":"0x6080806040526004361015610012575f80fd5b5f3560e01c90816301ffc9a7146106ab575080630bece356146105e8578063248a9ca3146105be5780632f2ff15d1461058f57806336568abe146105335780634d6d9ffb146104865780635832611b146104405780635972185a14610406578063682ed5f01461035157806391d1485414610308578063a217fddf146102ee578063a845a7f314610261578063d547741f1461022b578063ddba65371461015f5763ef913a4b146100c1575f80fd5b3461015b575f60031936011261015b576101576040516020808201526080604082015261014b816100f460c08201611228565b60ff600254818116606085015267ffffffffffffffff8160081c16608085015260481c16151560a0830152037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0810183528261085e565b604051918291826107cd565b0390f35b5f80fd5b3461015b5761016d36610749565b505060ff60025460481c16610203575f80527f4c48d1d2b0f4f7485fc28e3db22341d96a20aa29e6efa8149da9751603abd4e06020527f6e0c24a6e293ff9b755263dbaa15ba3796b0b8d3fe17cfb4ddf8143b268eac475460ff16156101f6575b7fda81d7c2000000000000000000000000000000000000000000000000000000005f5260045ffd5b6101fe611277565b6101ce565b7f928b1233000000000000000000000000000000000000000000000000000000005f5260045ffd5b3461015b5761025f61023c3661079a565b9061025a610255825f525f602052600160405f20015490565b6112ff565b61175e565b005b3461015b575f60031936011261015b5760ff6002541660405161028e8161028781611228565b038261085e565b60405190604082019260408352815180945260206060840192015f945b8086106102c057505082935060208301520390f35b909260208060019273ffffffffffffffffffffffffffffffffffffffff8751168152019401950194906102ab565b3461015b575f60031936011261015b5760206040515f8152f35b3461015b576103163661079a565b905f525f60205273ffffffffffffffffffffffffffffffffffffffff60405f2091165f52602052602060ff60405f2054166040519015158152f35b3461015b57602060031936011261015b5760043567ffffffffffffffff811161015b5760a0600319823603011261015b5760ff60025460481c16610203575f80527f4c48d1d2b0f4f7485fc28e3db22341d96a20aa29e6efa8149da9751603abd4e060209081527f6e0c24a6e293ff9b755263dbaa15ba3796b0b8d3fe17cfb4ddf8143b268eac475490916103f19160ff16156103f9575b6004016110cb565b604051908152f35b610401611277565b6103e9565b3461015b575f60031936011261015b5760206040517fbd893629a699470e4ec82a5715bb4981fdaacc5d0a728bf5f55b801d8f4ef10b8152f35b3461015b57602060031936011261015b5760043567ffffffffffffffff811680910361015b575f526004602052602067ffffffffffffffff60405f205416604051908152f35b3461015b57602060031936011261015b5760043567ffffffffffffffff811161015b576080600319823603011261015b5760ff60025460481c16610203575f80527f4c48d1d2b0f4f7485fc28e3db22341d96a20aa29e6efa8149da9751603abd4e060209081527f6e0c24a6e293ff9b755263dbaa15ba3796b0b8d3fe17cfb4ddf8143b268eac475490916103f19160ff1615610526575b600401610ef5565b61052e611277565b61051e565b3461015b576105413661079a565b3373ffffffffffffffffffffffffffffffffffffffff8216036105675761025f9161175e565b7f6697b232000000000000000000000000000000000000000000000000000000005f5260045ffd5b3461015b5761025f6105a03661079a565b906105b9610255825f525f602052600160405f20015490565b61168c565b3461015b57602060031936011261015b5760206103f16004355f525f602052600160405f20015490565b3461015b576105f636610749565b60ff60025460481c16610203575f80527f4c48d1d2b0f4f7485fc28e3db22341d96a20aa29e6efa8149da9751603abd4e06020527f6e0c24a6e293ff9b755263dbaa15ba3796b0b8d3fe17cfb4ddf8143b268eac475461065e929060ff161561069e57610a3c565b6040516003821015610671576020918152f35b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b6106a6611277565b610a3c565b3461015b57602060031936011261015b57600435907fffffffff00000000000000000000000000000000000000000000000000000000821680920361015b57817f7965db0b000000000000000000000000000000000000000000000000000000006020931490811561071f575b5015158152f35b7f01ffc9a70000000000000000000000000000000000000000000000000000000091501483610718565b90602060031983011261015b5760043567ffffffffffffffff811161015b578260238201121561015b5780600401359267ffffffffffffffff841161015b576024848301011161015b576024019190565b600319604091011261015b576004359060243573ffffffffffffffffffffffffffffffffffffffff8116810361015b5790565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f602060409481855280519182918282880152018686015e5f8582860101520116010190565b6040810190811067ffffffffffffffff82111761083157604052565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff82111761083157604052565b92919267ffffffffffffffff821161083157604051916108e760207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116018461085e565b82948184528183011161015b578281602093845f960137010152565b9080601f8301121561015b5781602061091e9335910161089f565b90565b67ffffffffffffffff81116108315760051b60200190565b60208183031261015b5780359067ffffffffffffffff821161015b57019060408282031261015b576040519161096e83610815565b803567ffffffffffffffff811161015b578261098b918301610903565b835260208101359067ffffffffffffffff821161015b57019080601f8301121561015b5781356109ba81610921565b926109c8604051948561085e565b81845260208085019260051b8201019183831161015b5760208201905b8382106109f9575050505050602082015290565b813567ffffffffffffffff811161015b57602091610a1c87848094880101610903565b8152019101906109e5565b519067ffffffffffffffff8216820361015b57565b610a4891810190610939565b60205f818351604051918183925191829101835e8101838152039060025afa15610c915760205f8051604051838101917f01000000000000000000000000000000000000000000000000000000000000008352602182015260218152610aaf60418261085e565b604051918291518091835e8101838152039060025afa15610c9157610ada5f516020830151906113eb565b5160408180518101031261015b57604051610af481610815565b610b0f6040610b0560208501610a27565b9384845201610a27565b67ffffffffffffffff60208301938285521680151580610c7e575b15610c4457505067ffffffffffffffff8151165f52600460205267ffffffffffffffff60405f20541680610bf3575067ffffffffffffffff9051918183169260025490838260081c168511610bb6575b50505116905f52600460205260405f20907fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000008254161790555f90565b68ffffffffffffffff007fffffffffffffffffffffffffffffffffffffffffffffff0000000000000000ff9160081b169116176002555f80610b7a565b9167ffffffffffffffff9150511603610c0b57600290565b69010000000000000000007fffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffff6002541617600255600190565b67ffffffffffffffff92507fdcbc5460000000000000000000000000000000000000000000000000000000005f526004521660245260445ffd5b5067ffffffffffffffff82161515610b2a565b6040513d5f823e3d90fd5b9035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18136030182121561015b570180359067ffffffffffffffff821161015b57602001918160051b3603831361015b57565b3567ffffffffffffffff8116810361015b5790565b15610d0d5750565b67ffffffffffffffff907ff7caaa5c000000000000000000000000000000000000000000000000000000005f521660045260245ffd5b9035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18136030182121561015b570180359067ffffffffffffffff821161015b5760200191813603831361015b57565b60208183031261015b5780519067ffffffffffffffff821161015b57019060408282031261015b5760405191610dc983610815565b610dd281610a27565b835260208101519067ffffffffffffffff821161015b570181601f8201121561015b57805190610e0182610921565b92610e0f604051948561085e565b82845260208085019360061b8301019181831161015b57602001925b828410610e3e5750505050602082015290565b60408483031261015b5760206040918251610e5881610815565b865181528287015183820152815201930192610e2b565b15610e78575050565b9067ffffffffffffffff80927fc7441689000000000000000000000000000000000000000000000000000000005f52166004521660245260445ffd5b8051821015610ec85760209160051b010190565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b6060810190610f048282610c9c565b90506001610f128484610c9c565b9290500361109b5750610fb8610f2a60408301610cf0565b9267ffffffffffffffff841692835f526004602052610fb367ffffffffffffffff60405f20541694610f5e87871515610d05565b610f9e610f76610f6e8580610d43565b810190610939565b610f8e610f838251611365565b6020830151906113eb565b5160208082518301019101610d94565b9667ffffffffffffffff885116918214610e6f565b610c9c565b15610ec857610fd3610fcc82602093610d43565b369161089f565b818151910120920180515115611073575f5b8151805182101561104b57610ffb828692610eb4565b51511461100a57600101610fe5565b60209293506110199151610eb4565b5101516110235790565b7f9a960b4f000000000000000000000000000000000000000000000000000000005f5260045ffd5b7f291fc442000000000000000000000000000000000000000000000000000000005f5260045ffd5b7f1e6c84da000000000000000000000000000000000000000000000000000000005f5260045ffd5b7f88b3170e000000000000000000000000000000000000000000000000000000005f52600160045260245260445ffd5b608081016110d98183610d43565b9050156112005760608201906110ef8284610c9c565b905060016110fd8486610c9c565b9290500361109b575061111260408401610cf0565b9061117467ffffffffffffffff831693845f52600460205261116e67ffffffffffffffff60405f2054169561114986881515610d05565b611159610f76610f6e8a80610d43565b9567ffffffffffffffff875116918214610e6f565b85610c9c565b15610ec85760209161118c610fcc8361119894610d43565b83815191012095610d43565b908092918101031261015b576020903591019081515115611073575f5b8251805182101561104b576111cb828792610eb4565b515114806111e8575b6111e0576001016111b5565b505050905090565b508160206111f7838651610eb4565b510151146111d4565b7f1208b21b000000000000000000000000000000000000000000000000000000005f5260045ffd5b602060015491828152019060015f5260205f20905f5b81811061124b5750505090565b825473ffffffffffffffffffffffffffffffffffffffff1684526020909301926001928301920161123e565b335f9081527f4c48d1d2b0f4f7485fc28e3db22341d96a20aa29e6efa8149da9751603abd4e0602052604090205460ff16156112af57565b7fe2517d3f000000000000000000000000000000000000000000000000000000005f52336004527fbd893629a699470e4ec82a5715bb4981fdaacc5d0a728bf5f55b801d8f4ef10b60245260445ffd5b805f525f60205260405f2073ffffffffffffffffffffffffffffffffffffffff33165f5260205260ff60405f205416156113365750565b7fe2517d3f000000000000000000000000000000000000000000000000000000005f523360045260245260445ffd5b5f60208092604051918183925191829101835e8101838152039060025afa15610c915760205f8051604051838101917f020000000000000000000000000000000000000000000000000000000000000083526021820152602181526113cb60418261085e565b604051918291518091835e8101838152039060025afa15610c91575f5190565b91909182511561166457825160ff60025416907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82019060ff82116116375760ff8651921610156116095750508251927fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe061147e61146886610921565b95611476604051978861085e565b808752610921565b013660208601375f5b81518110156116025761149a8183610eb4565b5160418151036115cc5773ffffffffffffffffffffffffffffffffffffffff6114cf6114c68387611826565b90929192611860565b169081156115925750805f52600360205260ff60405f20541615611567575f5b82811061150c5750906001916115058288610eb4565b5201611487565b8173ffffffffffffffffffffffffffffffffffffffff61152c838a610eb4565b51161461153b576001016114ef565b507fe021c4f2000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b7fd7e8a2c2000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b6115c8906040519182917f9e3c1b3d000000000000000000000000000000000000000000000000000000008352600483016107cd565b0390fd5b6115c8906040519182917f2ee17a3d000000000000000000000000000000000000000000000000000000008352600483016107cd565b5050509050565b7f378b0805000000000000000000000000000000000000000000000000000000005f5260045260245260445ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b7f301b38b6000000000000000000000000000000000000000000000000000000005f5260045ffd5b805f525f60205260405f2073ffffffffffffffffffffffffffffffffffffffff83165f5260205260ff60405f205416155f1461175857805f525f60205260405f2073ffffffffffffffffffffffffffffffffffffffff83165f5260205260405f2060017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0082541617905573ffffffffffffffffffffffffffffffffffffffff339216907f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d5f80a4600190565b50505f90565b805f525f60205260405f2073ffffffffffffffffffffffffffffffffffffffff83165f5260205260ff60405f2054165f1461175857805f525f60205260405f2073ffffffffffffffffffffffffffffffffffffffff83165f5260205260405f207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00815416905573ffffffffffffffffffffffffffffffffffffffff339216907ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b5f80a4600190565b81519190604183036118565761184f9250602082015190606060408401519301515f1a9061190b565b9192909190565b50505f9160029190565b60048110156106715780611872575050565b600181036118a2577ff645eedf000000000000000000000000000000000000000000000000000000005f5260045ffd5b600281036118d657507ffce698f7000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b6003146118e05750565b7fd78bce0c000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b91907f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0841161198f579160209360809260ff5f9560405194855216868401526040830152606082015282805260015afa15610c91575f5173ffffffffffffffffffffffffffffffffffffffff81161561198557905f905f90565b505f906001905f90565b5050505f916003919056fea164736f6c634300081c000a","sourceMap":"815:11749:29:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;815:11749:29;;;;;;;;3825:23;;;;815:11749;;;;;;3825:23;815:11749;;;;;;:::i;:::-;;;;;;;;;;;;1787:4;;;815:11749;;;;;;;;;;;;;;3825:23;;;;;;;;:::i;:::-;815:11749;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;;;;12225:20;815:11749;;;;;;;;;;;;;;;;12444:42;12440:105;;815:11749;9710:21;815:11749;9710:21;815:11749;;9710:21;12440:105;12513:20;;:::i;:::-;12440:105;;815:11749;;;;;;;;;;;4723:26:92;815:11749:29;;;:::i;:::-;4693:18:92;2484:4;4693:18;;3877:6;815:11749:29;3877:6:92;815:11749:29;;3877:22:92;815:11749:29;3877:6:92;815:11749:29;3877:22:92;815:11749:29;3786:120:92;;4693:18;2484:4;:::i;:::-;4723:26;:::i;:::-;815:11749:29;;;;;;-1:-1:-1;;815:11749:29;;;;;;4065:27;815:11749;;;;;;;;;:::i;:::-;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4034:11;815:11749;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;815:11749:29;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;2930:29:92;815:11749:29;-1:-1:-1;815:11749:29;;;;;;-1:-1:-1;815:11749:29;;;;;;;;;;;;;;;;-1:-1:-1;;815:11749:29;;;;;;;;;;;;;-1:-1:-1;;815:11749:29;;;;;;;;12225:20;815:11749;;;;;;;;;;;;;;;;;;5841:1853;;815:11749;;12444:42;12440:105;;815:11749;;;5841:1853;:::i;:::-;815:11749;;;;;;12440:105;12513:20;;:::i;:::-;12440:105;;815:11749;;;;;-1:-1:-1;;815:11749:29;;;;;;;;1507:33;815:11749;;;;;;;;-1:-1:-1;;815:11749:29;;;;;;;;;;;;;;;;1787:4;815:11749;;1787:4;815:11749;;;;1787:4;;815:11749;;;;;;;;;;;;-1:-1:-1;;815:11749:29;;;;;;;;;;;;;-1:-1:-1;;815:11749:29;;;;;;;;12225:20;815:11749;;;;;;;;;;;;;;;;;;7733:1799;;815:11749;;12444:42;12440:105;;815:11749;;;7733:1799;:::i;12440:105::-;12513:20;;:::i;:::-;12440:105;;815:11749;;;;;;;:::i;:::-;735:10:120;815:11749:29;;;5397:34:92;5393:102;;5505:37;;;:::i;5393:102::-;5454:30;815:11749:29;5454:30:92;815:11749:29;;5454:30:92;815:11749:29;;;;4306:25:92;815:11749:29;;;:::i;:::-;4276:18:92;2484:4;4276:18;;3877:6;815:11749:29;3877:6:92;815:11749:29;;3877:22:92;815:11749:29;3877:6:92;815:11749:29;3877:22:92;815:11749:29;3786:120:92;;2484:4;4306:25;:::i;815:11749:29:-;;;;;-1:-1:-1;;815:11749:29;;;;;;;;;3877:6:92;815:11749:29;3877:6:92;815:11749:29;;3877:22:92;815:11749:29;3877:6:92;815:11749:29;3877:22:92;815:11749:29;3786:120:92;;815:11749:29;;;;;;;:::i;:::-;;12225:20;815:11749;;;;;;;;;;;;;;4341:1461;;815:11749;;;12444:42;12440:105;;4341:1461;:::i;:::-;815:11749;;;;;;;;;;;;;;;;;;;;;;;12440:105;12513:20;;:::i;:::-;4341:1461;:::i;815:11749::-;;;;;-1:-1:-1;;815:11749:29;;;;;;;;;;;;;;;;2649:47:92;2664:32;815:11749:29;2649:47:92;;:87;;;;;815:11749:29;;;;;;;2649:87:92;844:25:130;829:40;;;2649:87:92;;;815:11749:29;;;-1:-1:-1;;815:11749:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;-1:-1:-1;;815:11749:29;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;:::o;:::-;;-1:-1:-1;815:11749:29;;;;;-1:-1:-1;815:11749:29;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;-1:-1:-1;815:11749:29;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;:::i;:::-;;:::o;:::-;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;1787:4;;815:11749;;;;;;;;1787:4::o;4341:1461::-;4562:58;4341:1461;4562:58;;;;:::i;:::-;815:11749;-1:-1:-1;4668:21:29;;;815:11749;;;;;;;;;;;;;;;;;;10125:12;;;;;;;;815:11749;-1:-1:-1;10125:12:29;;815:11749;;10099:39;;;815:11749;;;;;;;;;10099:39;;;;;;:::i;:::-;815:11749;;;;;;;;;;;;;;;10092:47;;10125:12;10092:47;;;;;4759:16;-1:-1:-1;10092:47:29;815:11749;4759:16;;;;;:::i;:::-;4859:21;815:11749;;;;4848:70;;1787:4;;;;815:11749;;;;;:::i;:::-;1787:4;815:11749;1787:4;815:11749;4848:70;;1787:4;:::i;:::-;;;;;;;:::i;:::-;815:11749;;1787:4;;;;;;815:11749;4937:16;;;:39;;;4341:1461;1787:4;;;;;815:11749;1787:4;;815:11749;-1:-1:-1;1787:4:29;5227:27;815:11749;1787:4;815:11749;;-1:-1:-1;1787:4:29;;815:11749;5282:22;5278:276;;1787:4;815:11749;1787:4;;815:11749;;;;1787:4;10125:12;1787:4;;;;;;815:11749;5568:39;;5564:109;;4341:1461;1787:4;;;815:11749;1787:4;-1:-1:-1;1787:4:29;5227:27;815:11749;1787:4;815:11749;-1:-1:-1;1787:4:29;;;;;;;;;-1:-1:-1;4341:1461:29;:::o;5564:109::-;1787:4;;;;;;;;;10125:12;1787:4;5564:109;;;;5278:276;1787:4;815:11749;1787:4;;;815:11749;5324:36;5320:169;;10125:12;5502:41;:::o;5320:169::-;1787:4;;10125:12;1787:4;;;10125:12;1787:4;;5425:49;:::o;1787:4::-;815:11749;1787:4;;;-1:-1:-1;1787:4:29;;815:11749;;1787:4;815:11749;1787:4;-1:-1:-1;1787:4:29;4937:39;815:11749;;;;4957:19;;4937:39;;10092:47;815:11749;;;-1:-1:-1;815:11749:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;:::o;:::-;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;1910:4::-;;;;;;;;;;;;;;;;;;;;;;;;;;815:11749;;;;;:::i;:::-;1787:4;;;:::i;:::-;1910;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;815:11749;;1910:4;815:11749;;;;:::i;:::-;1910:4;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;815:11749;;;;;;:::i;:::-;1910:4;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;815:11749;1910:4;;;;;815:11749;1910:4;815:11749;;1787:4;815:11749;1787:4;1910;;;815:11749;;1910:4;;;;;;;;;;;;:::o;:::-;;;;;;;;;;7733:1799;7940:9;;;;;;;;:::i;:::-;7984;;7960:1;7984:9;;;;:::i;:::-;7940:21;;;;815:11749;;8104:31;9118:9;8104:31;;;;;:::i;:::-;815:11749;;;;1787:4;;-1:-1:-1;1787:4:29;8157:27;8104:16;1787:4;8893:103;815:11749;8104:31;-1:-1:-1;1787:4:29;;815:11749;8215:7;8207:57;8215:7;;;;8207:57;:::i;:::-;8739:71;8324:59;8335:10;;;;:::i;:::-;8324:59;;;;:::i;:::-;8522:16;8410:67;8430:21;;8410:67;:::i;:::-;8104:16;8522;;;;;:::i;:::-;8750:21;8104:16;815:11749;;;8739:71;;;;;;:::i;:::-;1787:4;815:11749;1787:4;;815:11749;8901:39;;;8893:103;:::i;:::-;9118:9;:::i;:::-;1910:4;;;;;;8104:16;1910:4;;:::i;:::-;;;;:::i;:::-;815:11749;;;;;9108:23;9149:25;;;;815:11749;9149:36;1910:4;;-1:-1:-1;9270:3:29;9236:25;;815:11749;;9232:36;;;;;9293:28;;;;;:::i;:::-;;1910:4;9293:45;9289:198;;7960:1;1910:4;9217:13;;9289:198;8104:16;9366:25;;;:28;:25;;:28;:::i;:::-;;:39;1910:4;;;9454:18;:::o;1910:4::-;;-1:-1:-1;1910:4:29;8157:27;-1:-1:-1;1910:4:29;9232:36;9514:11;-1:-1:-1;9514:11:29;8157:27;-1:-1:-1;9514:11:29;1910:4;;-1:-1:-1;1910:4:29;8157:27;-1:-1:-1;1910:4:29;815:11749;;;;7960:1;815:11749;;;;;;;5841:1853;6042:10;;;;;;;:::i;:::-;:22;;;815:11749;;6097:9;;;;;;;;:::i;:::-;6141;;6117:1;6141:9;;;;:::i;:::-;6097:21;;;;815:11749;;6261:31;;;;;;:::i;:::-;815:11749;7265:9;815:11749;;;1787:4;;6063:1;1787:4;6314:27;6261:16;1787:4;7050:103;815:11749;6261:31;6063:1;1787:4;;815:11749;6372:7;6364:57;6372:7;;;;6364:57;:::i;:::-;6896:71;6481:59;6492:10;;;;:::i;6896:71::-;1787:4;815:11749;1787:4;;815:11749;7058:39;;;7050:103;:::i;:::-;7265:9;;:::i;:::-;1910:4;;;6261:16;1910:4;;;;7315:10;1910:4;;:::i;:::-;815:11749;;;;;7255:23;7315:10;;:::i;:::-;7304:33;;;;;;815:11749;;;;6261:16;815:11749;;7355:25;;;;;815:11749;7355:36;1910:4;;6063:1;7476:3;7442:25;;815:11749;;7438:36;;;;;7499:28;;;;;:::i;:::-;;1910:4;7499:45;:97;;;7476:3;7495:154;;6117:1;1910:4;7423:13;;7495:154;7616:18;;;;;;:::o;7499:97::-;7548:25;;6261:16;7548:28;:25;;;:28;:::i;:::-;;:39;1910:4;7548:48;7499:97;;815:11749;;6063:1;815:11749;;6063:1;815:11749;;;4034:11;815:11749;;;;;;;4034:11;-1:-1:-1;815:11749:29;;-1:-1:-1;815:11749:29;;-1:-1:-1;815:11749:29;;;;;;;;;;:::o;:::-;;;;;;;;;;;;4034:11;815:11749;;;;;;;3175:103:92;735:10:120;2930:6:92;815:11749:29;;;;;;;;;;;;3495:23:92;3491:108;;3175:103::o;3491:108::-;3541:47;2930:6;3541:47;735:10:120;3541:47:92;815:11749:29;1507:33;815:11749;;;2930:6:92;3541:47;3175:103;815:11749:29;2930:6:92;815:11749:29;2930:6:92;815:11749:29;;;2930:6:92;815:11749:29;;735:10:120;815:11749:29;-1:-1:-1;815:11749:29;;;;;-1:-1:-1;815:11749:29;;;3495:23:92;3491:108;;3175:103;:::o;3491:108::-;3541:47;2930:6;3541:47;735:10:120;3541:47:92;815:11749:29;;;;2930:6:92;3541:47;9980:166:29;-1:-1:-1;815:11749:29;9980:166;;815:11749;;;;;;;;;;;;;;;;;;10125:12;;;;;;;;815:11749;-1:-1:-1;10125:12:29;;815:11749;;10099:39;;;815:11749;;;;;;;;;10099:39;;;;;;:::i;:::-;815:11749;;;;;;;;;;;;;;;10092:47;;10125:12;10092:47;;;;;-1:-1:-1;10092:47:29;9980:166;:::o;10562:773::-;;;;815:11749;;10672:21;815:11749;;;;;10765:27;815:11749;;;;;;;;;;;;;;;;;-1:-1:-1;815:11749:29;;;;;;;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;:::i;:::-;;;;;;;10692:1;11003:3;815:11749;;10980:21;;;;;11041:13;;;;:::i;:::-;;1660:2;815:11749;;11811:42;1660:2;;815:11749;3927:8:129;3871:27;;;;:::i;:::-;3927:8;;;;;:::i;:::-;815:11749:29;11970:23;;;1660:2;;815:11749;;10692:1;815:11749;12041:11;815:11749;;;;10692:1;815:11749;;;1660:2;;;10692:1;11184:5;;;;;;11299:19;;10765:11;11299:19;;;;;:::i;:::-;815:11749;1910:4;10965:13;;11191:3;11222:7;815:11749;11222:7;;;;:::i;:::-;815:11749;;11222:20;815:11749;;10765:11;1910:4;11169:13;;815:11749;;;10692:1;815:11749;;;;10692:1;815:11749;1660:2;;10692:1;1660:2;;815:11749;;10692:1;1660:2;;;815:11749;;;1660:2;;;;;;;;;;:::i;:::-;;;;;;815:11749;;;1660:2;;;;;;;;;;:::i;10980:21::-;;;;;;10562:773::o;815:11749::-;;10692:1;815:11749;;;;;;10692:1;815:11749;;;10692:1;815:11749;;;;;10692:1;815:11749;;;10692:1;815:11749;;10692:1;815:11749;6155:316:92;815:11749:29;;;;;;;;;;;;-1:-1:-1;815:11749:29;;;;;-1:-1:-1;815:11749:29;;;6252:23:92;6248:217;815:11749:29;;;;;;;;;;;;;;;-1:-1:-1;815:11749:29;;;;-1:-1:-1;815:11749:29;6323:4:92;815:11749:29;;;;;;;;735:10:120;815:11749:29;;6346:40:92;;815:11749:29;6346:40:92;;6323:4;6400:11;:::o;6248:217::-;6442:12;;815:11749:29;6442:12:92;:::o;6708:317::-;815:11749:29;;;;;;;;;;;;-1:-1:-1;815:11749:29;;;;;-1:-1:-1;815:11749:29;;;6802:217:92;815:11749:29;;;;;;;;;;;;;;;-1:-1:-1;815:11749:29;;;;-1:-1:-1;815:11749:29;;;;;;;;735:10:120;815:11749:29;;6900:40:92;;815:11749:29;6900:40:92;;815:11749:29;6954:11:92;:::o;2129:778:129:-;815:11749:29;;;2129:778:129;2319:2;2299:22;;2319:2;;2751:25;2535:196;;;;;;;;;;;;;;;-1:-1:-1;2535:196:129;2751:25;;:::i;:::-;2744:32;;;;;:::o;2295:606::-;2807:83;;2823:1;2807:83;2827:35;2807:83;;:::o;7280:532::-;815:11749:29;;;;;;7366:29:129;;;7411:7;;:::o;7362:444::-;815:11749:29;7462:38:129;;815:11749:29;;7523:23:129;7375:20;7523:23;815:11749:29;7375:20:129;7523:23;7458:348;7576:35;7567:44;;7576:35;;7634:46;;7375:20;7634:46;815:11749:29;;;7375:20:129;7634:46;7563:243;7710:30;7701:39;7697:109;;7563:243;7280:532::o;7697:109::-;7763:32;7375:20;7763:32;815:11749:29;;;7375:20:129;7763:32;5203:1551;;;6283:66;6270:79;;6266:164;;815:11749:29;;;;;;-1:-1:-1;815:11749:29;;;;;;;;;;;;;;;;;;;6541:24:129;;;;;;;;;-1:-1:-1;6541:24:129;815:11749:29;;;6579:20:129;6575:113;;6698:49;-1:-1:-1;6698:49:129;-1:-1:-1;5203:1551:129;:::o;6575:113::-;6615:62;-1:-1:-1;6615:62:129;6541:24;6615:62;-1:-1:-1;6615:62:129;:::o;6266:164::-;6365:54;;;6381:1;6365:54;6385:30;6365:54;;:::o","linkReferences":{}},"methodIdentifiers":{"DEFAULT_ADMIN_ROLE()":"a217fddf","PROOF_SUBMITTER_ROLE()":"5972185a","getAttestationSet()":"a845a7f3","getClientState()":"ef913a4b","getConsensusTimestamp(uint64)":"5832611b","getRoleAdmin(bytes32)":"248a9ca3","grantRole(bytes32,address)":"2f2ff15d","hasRole(bytes32,address)":"91d14854","misbehaviour(bytes)":"ddba6537","renounceRole(bytes32,address)":"36568abe","revokeRole(bytes32,address)":"d547741f","supportsInterface(bytes4)":"01ffc9a7","updateClient(bytes)":"0bece356","verifyMembership((bytes,(uint64,uint64),bytes[],bytes))":"682ed5f0","verifyNonMembership((bytes,(uint64,uint64),bytes[]))":"4d6d9ffb"},"rawMetadata":"{\"compiler\":{\"version\":\"0.8.28+commit.7893614a\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"attestorAddresses\",\"type\":\"address[]\"},{\"internalType\":\"uint8\",\"name\":\"minRequiredSigs\",\"type\":\"uint8\"},{\"internalType\":\"uint64\",\"name\":\"initialHeight\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"initialTimestampSeconds\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"roleManager\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"AccessControlBadConfirmation\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"internalType\":\"bytes32\",\"name\":\"neededRole\",\"type\":\"bytes32\"}],\"name\":\"AccessControlUnauthorizedAccount\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint8\",\"name\":\"minRequired\",\"type\":\"uint8\"},{\"internalType\":\"uint256\",\"name\":\"attestationCount\",\"type\":\"uint256\"}],\"name\":\"BadQuorum\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"height\",\"type\":\"uint64\"}],\"name\":\"ConsensusTimestampNotFound\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"signer\",\"type\":\"address\"}],\"name\":\"DuplicateSigner\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ECDSAInvalidSignature\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"length\",\"type\":\"uint256\"}],\"name\":\"ECDSAInvalidSignatureLength\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"s\",\"type\":\"bytes32\"}],\"name\":\"ECDSAInvalidSignatureS\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"EmptyPackets\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"EmptySignatures\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"EmptyValue\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"FeatureNotSupported\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"FrozenClientState\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"expected\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"provided\",\"type\":\"uint64\"}],\"name\":\"HeightMismatch\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"expectedLength\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"providedLength\",\"type\":\"uint256\"}],\"name\":\"InvalidPathLength\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"signature\",\"type\":\"bytes\"}],\"name\":\"InvalidSignatureLength\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"height\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"timestamp\",\"type\":\"uint64\"}],\"name\":\"InvalidState\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"NoAttestors\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"NotMember\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"NotNonMember\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"signature\",\"type\":\"bytes\"}],\"name\":\"SignatureInvalid\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"validSigners\",\"type\":\"uint256\"},{\"internalType\":\"uint8\",\"name\":\"minRequired\",\"type\":\"uint8\"}],\"name\":\"ThresholdNotMet\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"signer\",\"type\":\"address\"}],\"name\":\"UnknownSigner\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"previousAdminRole\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"newAdminRole\",\"type\":\"bytes32\"}],\"name\":\"RoleAdminChanged\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"RoleGranted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"RoleRevoked\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"DEFAULT_ADMIN_ROLE\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"PROOF_SUBMITTER_ROLE\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getAttestationSet\",\"outputs\":[{\"internalType\":\"address[]\",\"name\":\"attestorAddresses\",\"type\":\"address[]\"},{\"internalType\":\"uint8\",\"name\":\"minRequiredSigs\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getClientState\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"revisionHeight\",\"type\":\"uint64\"}],\"name\":\"getConsensusTimestamp\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"}],\"name\":\"getRoleAdmin\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"grantRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"hasRole\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"name\":\"misbehaviour\",\"outputs\":[],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"callerConfirmation\",\"type\":\"address\"}],\"name\":\"renounceRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"revokeRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes4\",\"name\":\"interfaceId\",\"type\":\"bytes4\"}],\"name\":\"supportsInterface\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"updateMsg\",\"type\":\"bytes\"}],\"name\":\"updateClient\",\"outputs\":[{\"internalType\":\"enum ILightClientMsgs.UpdateResult\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes\",\"name\":\"proof\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"uint64\",\"name\":\"revisionNumber\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"revisionHeight\",\"type\":\"uint64\"}],\"internalType\":\"struct IICS02ClientMsgs.Height\",\"name\":\"proofHeight\",\"type\":\"tuple\"},{\"internalType\":\"bytes[]\",\"name\":\"path\",\"type\":\"bytes[]\"},{\"internalType\":\"bytes\",\"name\":\"value\",\"type\":\"bytes\"}],\"internalType\":\"struct ILightClientMsgs.MsgVerifyMembership\",\"name\":\"msg_\",\"type\":\"tuple\"}],\"name\":\"verifyMembership\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes\",\"name\":\"proof\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"uint64\",\"name\":\"revisionNumber\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"revisionHeight\",\"type\":\"uint64\"}],\"internalType\":\"struct IICS02ClientMsgs.Height\",\"name\":\"proofHeight\",\"type\":\"tuple\"},{\"internalType\":\"bytes[]\",\"name\":\"path\",\"type\":\"bytes[]\"}],\"internalType\":\"struct ILightClientMsgs.MsgVerifyNonMembership\",\"name\":\"msg_\",\"type\":\"tuple\"}],\"name\":\"verifyNonMembership\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"errors\":{\"AccessControlBadConfirmation()\":[{\"details\":\"The caller of a function is not the expected one. NOTE: Don't confuse with {AccessControlUnauthorizedAccount}.\"}],\"AccessControlUnauthorizedAccount(address,bytes32)\":[{\"details\":\"The `account` is missing a role.\"}],\"BadQuorum(uint8,uint256)\":[{\"params\":{\"attestationCount\":\"The size of the configured attestation set.\",\"minRequired\":\"The provided minimum required signatures.\"}}],\"ConsensusTimestampNotFound(uint64)\":[{\"params\":{\"height\":\"The height that has no associated timestamp.\"}}],\"DuplicateSigner(address)\":[{\"params\":{\"signer\":\"Address of the duplicate signer.\"}}],\"ECDSAInvalidSignature()\":[{\"details\":\"The signature derives the `address(0)`.\"}],\"ECDSAInvalidSignatureLength(uint256)\":[{\"details\":\"The signature has an invalid length.\"}],\"ECDSAInvalidSignatureS(bytes32)\":[{\"details\":\"The signature has an S value that is in the upper half order.\"}],\"HeightMismatch(uint64,uint64)\":[{\"params\":{\"expected\":\"The expected height from the proofHeight field.\",\"provided\":\"The height that was present in the attested payload.\"}}],\"InvalidPathLength(uint256,uint256)\":[{\"params\":{\"expectedLength\":\"The expected length of the path.\",\"providedLength\":\"The length of the provided path.\"}}],\"InvalidSignatureLength(bytes)\":[{\"params\":{\"signature\":\"The invalid signature.\"}}],\"InvalidState(uint64,uint64)\":[{\"params\":{\"height\":\"The height of the attested state.\",\"timestamp\":\"The timestamp of the attested state.\"}}],\"SignatureInvalid(bytes)\":[{\"params\":{\"signature\":\"The invalid signature.\"}}],\"ThresholdNotMet(uint256,uint8)\":[{\"params\":{\"minRequired\":\"The minimum required signatures.\",\"validSigners\":\"Number of valid, unique attestation signatures.\"}}],\"UnknownSigner(address)\":[{\"params\":{\"signer\":\"Address of the unknown signer.\"}}]},\"events\":{\"RoleAdminChanged(bytes32,bytes32,bytes32)\":{\"details\":\"Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite {RoleAdminChanged} not being emitted to signal this.\"},\"RoleGranted(bytes32,address,address)\":{\"details\":\"Emitted when `account` is granted `role`. `sender` is the account that originated the contract call. This account bears the admin role (for the granted role). Expected in cases where the role was granted using the internal {AccessControl-_grantRole}.\"},\"RoleRevoked(bytes32,address,address)\":{\"details\":\"Emitted when `account` is revoked `role`. `sender` is the account that originated the contract call: - if using `revokeRole`, it is the admin role bearer - if using `renounceRole`, it is the role bearer (i.e. `account`)\"}},\"kind\":\"dev\",\"methods\":{\"constructor\":{\"params\":{\"attestorAddresses\":\"The configured attestor addresses (EOAs)\",\"initialHeight\":\"The initial known height\",\"initialTimestampSeconds\":\"The initial timestamp in seconds for the initial height\",\"minRequiredSigs\":\"The quorum threshold\",\"roleManager\":\"Address that will administer roles and be allowed to submit proofs; if zero, anyone can submit\"}},\"getAttestationSet()\":{\"details\":\"The attestation set is fixed for the initial scope; rotation is out of scope.\",\"returns\":{\"attestorAddresses\":\"The configured attestor EOA addresses\",\"minRequiredSigs\":\"The minimum number of unique valid signatures required\"}},\"getClientState()\":{\"returns\":{\"_0\":\"The client state.\"}},\"getConsensusTimestamp(uint64)\":{\"params\":{\"revisionHeight\":\"The height for which to query the timestamp\"},\"returns\":{\"_0\":\"The trusted timestamp in unix seconds\"}},\"getRoleAdmin(bytes32)\":{\"details\":\"Returns the admin role that controls `role`. See {grantRole} and {revokeRole}. To change a role's admin, use {_setRoleAdmin}.\"},\"grantRole(bytes32,address)\":{\"details\":\"Grants `role` to `account`. If `account` had not been already granted `role`, emits a {RoleGranted} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleGranted} event.\"},\"hasRole(bytes32,address)\":{\"details\":\"Returns `true` if `account` has been granted `role`.\"},\"misbehaviour(bytes)\":{\"params\":{\"misbehaviourMsg\":\"The misbehaviour message\"}},\"renounceRole(bytes32,address)\":{\"details\":\"Revokes `role` from the calling account. Roles are often managed via {grantRole} and {revokeRole}: this function's purpose is to provide a mechanism for accounts to lose their privileges if they are compromised (such as when a trusted device is misplaced). If the calling account had been revoked `role`, emits a {RoleRevoked} event. Requirements: - the caller must be `callerConfirmation`. May emit a {RoleRevoked} event.\"},\"revokeRole(bytes32,address)\":{\"details\":\"Revokes `role` from `account`. If `account` had been granted `role`, emits a {RoleRevoked} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleRevoked} event.\"},\"supportsInterface(bytes4)\":{\"details\":\"Returns true if this contract implements the interface defined by `interfaceId`. See the corresponding https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[ERC section] to learn more about how these ids are created. This function call must use less than 30 000 gas.\"},\"updateClient(bytes)\":{\"params\":{\"updateMsg\":\"The encoded update message e.g., an SP1 proof.\"},\"returns\":{\"_0\":\"The result of the update operation\"}},\"verifyMembership((bytes,(uint64,uint64),bytes[],bytes))\":{\"details\":\"Notice that this message is not view, as it may update the client state for caching purposes.\",\"params\":{\"msg_\":\"The membership message\"},\"returns\":{\"_0\":\"The unix timestamp of the verification height in the counterparty chain in seconds.\"}},\"verifyNonMembership((bytes,(uint64,uint64),bytes[]))\":{\"details\":\"Notice that this message is not view, as it may update the client state for caching purposes.\",\"params\":{\"msg_\":\"The membership message\"},\"returns\":{\"_0\":\"The unix timestamp of the verification height in the counterparty chain in seconds.\"}}},\"stateVariables\":{\"PROOF_SUBMITTER_ROLE\":{\"details\":\"If `address(0)` has this role, then anyone can submit proofs. If this client is used with `ICS26Router`, the router must be granted this role.\",\"return\":\"The role identifier\",\"returns\":{\"_0\":\"The role identifier\"}}},\"title\":\"Attestation-based IBC Light Client\",\"version\":1},\"userdoc\":{\"errors\":{\"BadQuorum(uint8,uint256)\":[{\"notice\":\"Reverts when the quorum threshold is zero or exceeds the attestation count.\"}],\"ConsensusTimestampNotFound(uint64)\":[{\"notice\":\"Missing trusted timestamp for the given height.\"}],\"DuplicateSigner(address)\":[{\"notice\":\"The recovered signer appears more than once among the signatures.\"}],\"EmptyPackets()\":[{\"notice\":\"The provided packet attestations were empty.\"}],\"EmptySignatures()\":[{\"notice\":\"The provided signatures were empty.\"}],\"EmptyValue()\":[{\"notice\":\"The provided membership value was empty.\"}],\"FeatureNotSupported()\":[{\"notice\":\"Reverts for functions that are out of scope for this implementation.\"}],\"FrozenClientState()\":[{\"notice\":\"Reverts when an action is attempted on a frozen client state.\"}],\"HeightMismatch(uint64,uint64)\":[{\"notice\":\"The attested height did not match the provided proof height.\"}],\"InvalidPathLength(uint256,uint256)\":[{\"notice\":\"The provided proof path length is invalid.\"}],\"InvalidSignatureLength(bytes)\":[{\"notice\":\"ECDSA signature has an invalid length.\"}],\"InvalidState(uint64,uint64)\":[{\"notice\":\"The attested state is invalid.\"}],\"NoAttestors()\":[{\"notice\":\"Reverts when the attestation set is empty during initialization.\"}],\"NotMember()\":[{\"notice\":\"The provided value is not a member of the attested set.\"}],\"NotNonMember()\":[{\"notice\":\"The attested commitment is not zero (receipt exists, so packet was received).\"}],\"SignatureInvalid(bytes)\":[{\"notice\":\"ECDSA signature failed to recover a valid signer.\"}],\"ThresholdNotMet(uint256,uint8)\":[{\"notice\":\"The number of valid unique signatures is below the required threshold.\"}],\"UnknownSigner(address)\":[{\"notice\":\"The recovered signer is not part of the attestation set.\"}]},\"kind\":\"user\",\"methods\":{\"PROOF_SUBMITTER_ROLE()\":{\"notice\":\"The role identifier for the proof submitter role\"},\"constructor\":{\"notice\":\"Initializes the attestor light client with its fixed attestor set and initial height/timestamp.\"},\"getAttestationSet()\":{\"notice\":\"Returns the attestation set configuration.\"},\"getClientState()\":{\"notice\":\"Returns the client state.\"},\"getConsensusTimestamp(uint64)\":{\"notice\":\"Returns the trusted consensus timestamp (in seconds) at the given revision height.\"},\"misbehaviour(bytes)\":{\"notice\":\"Misbehaviour handling, moves the light client to the frozen state if misbehaviour is detected\"},\"updateClient(bytes)\":{\"notice\":\"Updating the client and consensus state\"},\"verifyMembership((bytes,(uint64,uint64),bytes[],bytes))\":{\"notice\":\"Querying the membership of a key-value pair\"},\"verifyNonMembership((bytes,(uint64,uint64),bytes[]))\":{\"notice\":\"Querying the non-membership of a key\"}},\"notice\":\"Implements an IBC light client that trusts an off-chain m-of-n attestor set.\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/light-clients/attestation/AttestationLightClient.sol\":\"AttestationLightClient\"},\"evmVersion\":\"cancun\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"none\"},\"optimizer\":{\"enabled\":true,\"runs\":10000},\"remappings\":[\":@openzeppelin-contracts/=node_modules/@openzeppelin/contracts/\",\":@openzeppelin-upgradeable/=node_modules/@openzeppelin/contracts-upgradeable/\",\":@openzeppelin/=node_modules/@openzeppelin/\",\":@sp1-contracts/=node_modules/sp1-contracts/contracts/src/\",\":@uniswap/permit2/=node_modules/@uniswap/permit2/\",\":forge-std/=node_modules/forge-std/src/\",\":sp1-contracts/=node_modules/sp1-contracts/\"],\"viaIR\":true},\"sources\":{\"contracts/interfaces/ILightClient.sol\":{\"keccak256\":\"0x1caae9e4f741a86c0056d5f7713a35f3bd96db7a9fd52fc9f1cf79aad76a442f\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://4a536db3b926560f69547c17e4f451a2631ddea0f42bd224c7fd8382d74429f6\",\"dweb:/ipfs/QmcQ33kxcmmowXgMbQGTBgiKBjF7v8UiP4y73bB9hhDizC\"]},\"contracts/light-clients/attestation/AttestationLightClient.sol\":{\"keccak256\":\"0xb287ccfd4e7b3baa99215a62484a99117b3be10d9765899c221f3fb0d54876fd\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://752979b4fe813e9cee697e2c29c7b119f8f0f84e2a9b6b1d0db97685a4435660\",\"dweb:/ipfs/QmTxfSdTKcrfaKKKtsX5Wy8RVMYcyYfkKCaDm2brNYTLFz\"]},\"contracts/light-clients/attestation/errors/IAttestationLightClientErrors.sol\":{\"keccak256\":\"0x0d3592b3c36cfcde83e2510bb9179b41befb486cbb65f529ff68c09fad751564\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://8d9bd1170d3954f7af6bd9fe79efbeff8f943073d27eb7bbecc8b9c66a0bdc62\",\"dweb:/ipfs/QmRuorHcJVhDJdYf7y43tyZuDowoBGkeRjH2z9C939XuDa\"]},\"contracts/light-clients/attestation/interfaces/IAttestationLightClient.sol\":{\"keccak256\":\"0x115ffce5474e6127fdb1f2b9284ea6d51ec978efd47f4425ba693c6c69d8b0af\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://bebb9e7d156b1a3ec682ff9cb8c9680b718bf0ae8e217ed153811dd399e456e8\",\"dweb:/ipfs/QmcjbxSBU4jvZMxn7PYYM6fxLCovWj1rKAtZazXY2RSA8U\"]},\"contracts/light-clients/attestation/msgs/IAttestationLightClientMsgs.sol\":{\"keccak256\":\"0x08148f1409f7e3c8968916950d920b8a4352796191875a4672ad2404e3541ef5\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://94c4b12d851c5e7b581d2794c88481df658eaf55ad4e54ddef14423c90986a67\",\"dweb:/ipfs/QmZysvpbY1Xe7kNVw1iHZsPaVMUMqLauJssyrceQybBgXw\"]},\"contracts/light-clients/attestation/msgs/IAttestationMsgs.sol\":{\"keccak256\":\"0xba7901ec5fb4a4845272501a1a0b183309cd0ae37d9ec5f9e3c6ce699bfd281f\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://72d0768a801a3c70910c10a1fc48c29c62d902dc602e20d72a1388ba498e8a4b\",\"dweb:/ipfs/QmUKLdbX2NwSyHFrh2WUHLm4zdFivu3Ryw2XyjT3R9Szse\"]},\"contracts/msgs/IICS02ClientMsgs.sol\":{\"keccak256\":\"0xb5fdb25319d5c32b3f527982d45ec1e9bec5215515581aee034d853006ea01a0\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://6b8939bf552c62c952a491008bcd9b59ab7dda20a9482bf93438e05793881542\",\"dweb:/ipfs/QmfWmzNCp8bd4pP26Lfw5HHp4dSZnCDqZDjVN7SD8P7eDh\"]},\"contracts/msgs/ILightClientMsgs.sol\":{\"keccak256\":\"0xa0565e7748b8b3284d72e1aa6ef4cc8264fcaa5f4e0761d22d64686953db6378\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://c4476010d7090bfaa74127526f2051c6bc82ff42a09b936e848880a1f15a6065\",\"dweb:/ipfs/QmY87JgRsFQXSZdGXNjNHEJCkdTHzFXH4vZEJ3q7MnHuP8\"]},\"node_modules/@openzeppelin/contracts/access/AccessControl.sol\":{\"keccak256\":\"0x1a6b4f6b7798ab80929d491b89d5427a9b3338c0fd1acd0ba325f69c6f1646af\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://7bb7f346c12a14dc622bc105ce3c47202fbc89f4b153a28a63bb68193297330c\",\"dweb:/ipfs/QmagwF8P3bUBXwdo159ueEnY9dLSvEWwK24kk2op58egwG\"]},\"node_modules/@openzeppelin/contracts/access/IAccessControl.sol\":{\"keccak256\":\"0xbff9f59c84e5337689161ce7641c0ef8e872d6a7536fbc1f5133f128887aba3c\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://b308f882e796f7b79c9502deacb0a62983035c6f6f4e962b319ba6a1f4a77d3d\",\"dweb:/ipfs/QmaWCW7ahEQqFjwhSUhV7Ae7WhfNvzSpE7DQ58hvEooqPL\"]},\"node_modules/@openzeppelin/contracts/utils/Context.sol\":{\"keccak256\":\"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://6a708e8a5bdb1011c2c381c9a5cfd8a9a956d7d0a9dc1bd8bcdaf52f76ef2f12\",\"dweb:/ipfs/Qmax9WHBnVsZP46ZxEMNRQpLQnrdE4dK8LehML1Py8FowF\"]},\"node_modules/@openzeppelin/contracts/utils/cryptography/ECDSA.sol\":{\"keccak256\":\"0x69f54c02b7d81d505910ec198c11ed4c6a728418a868b906b4a0cf29946fda84\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://8e25e4bdb7ae1f21d23bfee996e22736fc0ab44cfabedac82a757b1edc5623b9\",\"dweb:/ipfs/QmQdWQvB6JCP9ZMbzi8EvQ1PTETqkcTWrbcVurS7DKpa5n\"]},\"node_modules/@openzeppelin/contracts/utils/introspection/ERC165.sol\":{\"keccak256\":\"0x2d9dc2fe26180f74c11c13663647d38e259e45f95eb88f57b61d2160b0109d3e\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://81233d1f98060113d9922180bb0f14f8335856fe9f339134b09335e9f678c377\",\"dweb:/ipfs/QmWh6R35SarhAn4z2wH8SU456jJSYL2FgucfTFgbHJJN4E\"]},\"node_modules/@openzeppelin/contracts/utils/introspection/IERC165.sol\":{\"keccak256\":\"0x8891738ffe910f0cf2da09566928589bf5d63f4524dd734fd9cedbac3274dd5c\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://971f954442df5c2ef5b5ebf1eb245d7105d9fbacc7386ee5c796df1d45b21617\",\"dweb:/ipfs/QmadRjHbkicwqwwh61raUEapaVEtaLMcYbQZWs9gUkgj3u\"]}},\"version\":1}","metadata":{"compiler":{"version":"0.8.28+commit.7893614a"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"address[]","name":"attestorAddresses","type":"address[]"},{"internalType":"uint8","name":"minRequiredSigs","type":"uint8"},{"internalType":"uint64","name":"initialHeight","type":"uint64"},{"internalType":"uint64","name":"initialTimestampSeconds","type":"uint64"},{"internalType":"address","name":"roleManager","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"type":"error","name":"AccessControlBadConfirmation"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bytes32","name":"neededRole","type":"bytes32"}],"type":"error","name":"AccessControlUnauthorizedAccount"},{"inputs":[{"internalType":"uint8","name":"minRequired","type":"uint8"},{"internalType":"uint256","name":"attestationCount","type":"uint256"}],"type":"error","name":"BadQuorum"},{"inputs":[{"internalType":"uint64","name":"height","type":"uint64"}],"type":"error","name":"ConsensusTimestampNotFound"},{"inputs":[{"internalType":"address","name":"signer","type":"address"}],"type":"error","name":"DuplicateSigner"},{"inputs":[],"type":"error","name":"ECDSAInvalidSignature"},{"inputs":[{"internalType":"uint256","name":"length","type":"uint256"}],"type":"error","name":"ECDSAInvalidSignatureLength"},{"inputs":[{"internalType":"bytes32","name":"s","type":"bytes32"}],"type":"error","name":"ECDSAInvalidSignatureS"},{"inputs":[],"type":"error","name":"EmptyPackets"},{"inputs":[],"type":"error","name":"EmptySignatures"},{"inputs":[],"type":"error","name":"EmptyValue"},{"inputs":[],"type":"error","name":"FeatureNotSupported"},{"inputs":[],"type":"error","name":"FrozenClientState"},{"inputs":[{"internalType":"uint64","name":"expected","type":"uint64"},{"internalType":"uint64","name":"provided","type":"uint64"}],"type":"error","name":"HeightMismatch"},{"inputs":[{"internalType":"uint256","name":"expectedLength","type":"uint256"},{"internalType":"uint256","name":"providedLength","type":"uint256"}],"type":"error","name":"InvalidPathLength"},{"inputs":[{"internalType":"bytes","name":"signature","type":"bytes"}],"type":"error","name":"InvalidSignatureLength"},{"inputs":[{"internalType":"uint64","name":"height","type":"uint64"},{"internalType":"uint64","name":"timestamp","type":"uint64"}],"type":"error","name":"InvalidState"},{"inputs":[],"type":"error","name":"NoAttestors"},{"inputs":[],"type":"error","name":"NotMember"},{"inputs":[],"type":"error","name":"NotNonMember"},{"inputs":[{"internalType":"bytes","name":"signature","type":"bytes"}],"type":"error","name":"SignatureInvalid"},{"inputs":[{"internalType":"uint256","name":"validSigners","type":"uint256"},{"internalType":"uint8","name":"minRequired","type":"uint8"}],"type":"error","name":"ThresholdNotMet"},{"inputs":[{"internalType":"address","name":"signer","type":"address"}],"type":"error","name":"UnknownSigner"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32","indexed":true},{"internalType":"bytes32","name":"previousAdminRole","type":"bytes32","indexed":true},{"internalType":"bytes32","name":"newAdminRole","type":"bytes32","indexed":true}],"type":"event","name":"RoleAdminChanged","anonymous":false},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32","indexed":true},{"internalType":"address","name":"account","type":"address","indexed":true},{"internalType":"address","name":"sender","type":"address","indexed":true}],"type":"event","name":"RoleGranted","anonymous":false},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32","indexed":true},{"internalType":"address","name":"account","type":"address","indexed":true},{"internalType":"address","name":"sender","type":"address","indexed":true}],"type":"event","name":"RoleRevoked","anonymous":false},{"inputs":[],"stateMutability":"view","type":"function","name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"PROOF_SUBMITTER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"getAttestationSet","outputs":[{"internalType":"address[]","name":"attestorAddresses","type":"address[]"},{"internalType":"uint8","name":"minRequiredSigs","type":"uint8"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"getClientState","outputs":[{"internalType":"bytes","name":"","type":"bytes"}]},{"inputs":[{"internalType":"uint64","name":"revisionHeight","type":"uint64"}],"stateMutability":"view","type":"function","name":"getConsensusTimestamp","outputs":[{"internalType":"uint64","name":"","type":"uint64"}]},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"stateMutability":"view","type":"function","name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}]},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"stateMutability":"nonpayable","type":"function","name":"grantRole"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"stateMutability":"view","type":"function","name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}]},{"inputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function","name":"misbehaviour"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"callerConfirmation","type":"address"}],"stateMutability":"nonpayable","type":"function","name":"renounceRole"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"stateMutability":"nonpayable","type":"function","name":"revokeRole"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"stateMutability":"view","type":"function","name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}]},{"inputs":[{"internalType":"bytes","name":"updateMsg","type":"bytes"}],"stateMutability":"nonpayable","type":"function","name":"updateClient","outputs":[{"internalType":"enum ILightClientMsgs.UpdateResult","name":"","type":"uint8"}]},{"inputs":[{"internalType":"struct ILightClientMsgs.MsgVerifyMembership","name":"msg_","type":"tuple","components":[{"internalType":"bytes","name":"proof","type":"bytes"},{"internalType":"struct IICS02ClientMsgs.Height","name":"proofHeight","type":"tuple","components":[{"internalType":"uint64","name":"revisionNumber","type":"uint64"},{"internalType":"uint64","name":"revisionHeight","type":"uint64"}]},{"internalType":"bytes[]","name":"path","type":"bytes[]"},{"internalType":"bytes","name":"value","type":"bytes"}]}],"stateMutability":"view","type":"function","name":"verifyMembership","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[{"internalType":"struct ILightClientMsgs.MsgVerifyNonMembership","name":"msg_","type":"tuple","components":[{"internalType":"bytes","name":"proof","type":"bytes"},{"internalType":"struct IICS02ClientMsgs.Height","name":"proofHeight","type":"tuple","components":[{"internalType":"uint64","name":"revisionNumber","type":"uint64"},{"internalType":"uint64","name":"revisionHeight","type":"uint64"}]},{"internalType":"bytes[]","name":"path","type":"bytes[]"}]}],"stateMutability":"view","type":"function","name":"verifyNonMembership","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]}],"devdoc":{"kind":"dev","methods":{"constructor":{"params":{"attestorAddresses":"The configured attestor addresses (EOAs)","initialHeight":"The initial known height","initialTimestampSeconds":"The initial timestamp in seconds for the initial height","minRequiredSigs":"The quorum threshold","roleManager":"Address that will administer roles and be allowed to submit proofs; if zero, anyone can submit"}},"getAttestationSet()":{"details":"The attestation set is fixed for the initial scope; rotation is out of scope.","returns":{"attestorAddresses":"The configured attestor EOA addresses","minRequiredSigs":"The minimum number of unique valid signatures required"}},"getClientState()":{"returns":{"_0":"The client state."}},"getConsensusTimestamp(uint64)":{"params":{"revisionHeight":"The height for which to query the timestamp"},"returns":{"_0":"The trusted timestamp in unix seconds"}},"getRoleAdmin(bytes32)":{"details":"Returns the admin role that controls `role`. See {grantRole} and {revokeRole}. To change a role's admin, use {_setRoleAdmin}."},"grantRole(bytes32,address)":{"details":"Grants `role` to `account`. If `account` had not been already granted `role`, emits a {RoleGranted} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleGranted} event."},"hasRole(bytes32,address)":{"details":"Returns `true` if `account` has been granted `role`."},"misbehaviour(bytes)":{"params":{"misbehaviourMsg":"The misbehaviour message"}},"renounceRole(bytes32,address)":{"details":"Revokes `role` from the calling account. Roles are often managed via {grantRole} and {revokeRole}: this function's purpose is to provide a mechanism for accounts to lose their privileges if they are compromised (such as when a trusted device is misplaced). If the calling account had been revoked `role`, emits a {RoleRevoked} event. Requirements: - the caller must be `callerConfirmation`. May emit a {RoleRevoked} event."},"revokeRole(bytes32,address)":{"details":"Revokes `role` from `account`. If `account` had been granted `role`, emits a {RoleRevoked} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleRevoked} event."},"supportsInterface(bytes4)":{"details":"Returns true if this contract implements the interface defined by `interfaceId`. See the corresponding https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[ERC section] to learn more about how these ids are created. This function call must use less than 30 000 gas."},"updateClient(bytes)":{"params":{"updateMsg":"The encoded update message e.g., an SP1 proof."},"returns":{"_0":"The result of the update operation"}},"verifyMembership((bytes,(uint64,uint64),bytes[],bytes))":{"details":"Notice that this message is not view, as it may update the client state for caching purposes.","params":{"msg_":"The membership message"},"returns":{"_0":"The unix timestamp of the verification height in the counterparty chain in seconds."}},"verifyNonMembership((bytes,(uint64,uint64),bytes[]))":{"details":"Notice that this message is not view, as it may update the client state for caching purposes.","params":{"msg_":"The membership message"},"returns":{"_0":"The unix timestamp of the verification height in the counterparty chain in seconds."}}},"version":1},"userdoc":{"kind":"user","methods":{"PROOF_SUBMITTER_ROLE()":{"notice":"The role identifier for the proof submitter role"},"constructor":{"notice":"Initializes the attestor light client with its fixed attestor set and initial height/timestamp."},"getAttestationSet()":{"notice":"Returns the attestation set configuration."},"getClientState()":{"notice":"Returns the client state."},"getConsensusTimestamp(uint64)":{"notice":"Returns the trusted consensus timestamp (in seconds) at the given revision height."},"misbehaviour(bytes)":{"notice":"Misbehaviour handling, moves the light client to the frozen state if misbehaviour is detected"},"updateClient(bytes)":{"notice":"Updating the client and consensus state"},"verifyMembership((bytes,(uint64,uint64),bytes[],bytes))":{"notice":"Querying the membership of a key-value pair"},"verifyNonMembership((bytes,(uint64,uint64),bytes[]))":{"notice":"Querying the non-membership of a key"}},"version":1}},"settings":{"remappings":["@openzeppelin-contracts/=node_modules/@openzeppelin/contracts/","@openzeppelin-upgradeable/=node_modules/@openzeppelin/contracts-upgradeable/","@openzeppelin/=node_modules/@openzeppelin/","@sp1-contracts/=node_modules/sp1-contracts/contracts/src/","@uniswap/permit2/=node_modules/@uniswap/permit2/","forge-std/=node_modules/forge-std/src/","sp1-contracts/=node_modules/sp1-contracts/"],"optimizer":{"enabled":true,"runs":10000},"metadata":{"bytecodeHash":"none"},"compilationTarget":{"contracts/light-clients/attestation/AttestationLightClient.sol":"AttestationLightClient"},"evmVersion":"cancun","libraries":{},"viaIR":true},"sources":{"contracts/interfaces/ILightClient.sol":{"keccak256":"0x1caae9e4f741a86c0056d5f7713a35f3bd96db7a9fd52fc9f1cf79aad76a442f","urls":["bzz-raw://4a536db3b926560f69547c17e4f451a2631ddea0f42bd224c7fd8382d74429f6","dweb:/ipfs/QmcQ33kxcmmowXgMbQGTBgiKBjF7v8UiP4y73bB9hhDizC"],"license":"MIT"},"contracts/light-clients/attestation/AttestationLightClient.sol":{"keccak256":"0xb287ccfd4e7b3baa99215a62484a99117b3be10d9765899c221f3fb0d54876fd","urls":["bzz-raw://752979b4fe813e9cee697e2c29c7b119f8f0f84e2a9b6b1d0db97685a4435660","dweb:/ipfs/QmTxfSdTKcrfaKKKtsX5Wy8RVMYcyYfkKCaDm2brNYTLFz"],"license":"MIT"},"contracts/light-clients/attestation/errors/IAttestationLightClientErrors.sol":{"keccak256":"0x0d3592b3c36cfcde83e2510bb9179b41befb486cbb65f529ff68c09fad751564","urls":["bzz-raw://8d9bd1170d3954f7af6bd9fe79efbeff8f943073d27eb7bbecc8b9c66a0bdc62","dweb:/ipfs/QmRuorHcJVhDJdYf7y43tyZuDowoBGkeRjH2z9C939XuDa"],"license":"MIT"},"contracts/light-clients/attestation/interfaces/IAttestationLightClient.sol":{"keccak256":"0x115ffce5474e6127fdb1f2b9284ea6d51ec978efd47f4425ba693c6c69d8b0af","urls":["bzz-raw://bebb9e7d156b1a3ec682ff9cb8c9680b718bf0ae8e217ed153811dd399e456e8","dweb:/ipfs/QmcjbxSBU4jvZMxn7PYYM6fxLCovWj1rKAtZazXY2RSA8U"],"license":"MIT"},"contracts/light-clients/attestation/msgs/IAttestationLightClientMsgs.sol":{"keccak256":"0x08148f1409f7e3c8968916950d920b8a4352796191875a4672ad2404e3541ef5","urls":["bzz-raw://94c4b12d851c5e7b581d2794c88481df658eaf55ad4e54ddef14423c90986a67","dweb:/ipfs/QmZysvpbY1Xe7kNVw1iHZsPaVMUMqLauJssyrceQybBgXw"],"license":"MIT"},"contracts/light-clients/attestation/msgs/IAttestationMsgs.sol":{"keccak256":"0xba7901ec5fb4a4845272501a1a0b183309cd0ae37d9ec5f9e3c6ce699bfd281f","urls":["bzz-raw://72d0768a801a3c70910c10a1fc48c29c62d902dc602e20d72a1388ba498e8a4b","dweb:/ipfs/QmUKLdbX2NwSyHFrh2WUHLm4zdFivu3Ryw2XyjT3R9Szse"],"license":"MIT"},"contracts/msgs/IICS02ClientMsgs.sol":{"keccak256":"0xb5fdb25319d5c32b3f527982d45ec1e9bec5215515581aee034d853006ea01a0","urls":["bzz-raw://6b8939bf552c62c952a491008bcd9b59ab7dda20a9482bf93438e05793881542","dweb:/ipfs/QmfWmzNCp8bd4pP26Lfw5HHp4dSZnCDqZDjVN7SD8P7eDh"],"license":"MIT"},"contracts/msgs/ILightClientMsgs.sol":{"keccak256":"0xa0565e7748b8b3284d72e1aa6ef4cc8264fcaa5f4e0761d22d64686953db6378","urls":["bzz-raw://c4476010d7090bfaa74127526f2051c6bc82ff42a09b936e848880a1f15a6065","dweb:/ipfs/QmY87JgRsFQXSZdGXNjNHEJCkdTHzFXH4vZEJ3q7MnHuP8"],"license":"MIT"},"node_modules/@openzeppelin/contracts/access/AccessControl.sol":{"keccak256":"0x1a6b4f6b7798ab80929d491b89d5427a9b3338c0fd1acd0ba325f69c6f1646af","urls":["bzz-raw://7bb7f346c12a14dc622bc105ce3c47202fbc89f4b153a28a63bb68193297330c","dweb:/ipfs/QmagwF8P3bUBXwdo159ueEnY9dLSvEWwK24kk2op58egwG"],"license":"MIT"},"node_modules/@openzeppelin/contracts/access/IAccessControl.sol":{"keccak256":"0xbff9f59c84e5337689161ce7641c0ef8e872d6a7536fbc1f5133f128887aba3c","urls":["bzz-raw://b308f882e796f7b79c9502deacb0a62983035c6f6f4e962b319ba6a1f4a77d3d","dweb:/ipfs/QmaWCW7ahEQqFjwhSUhV7Ae7WhfNvzSpE7DQ58hvEooqPL"],"license":"MIT"},"node_modules/@openzeppelin/contracts/utils/Context.sol":{"keccak256":"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2","urls":["bzz-raw://6a708e8a5bdb1011c2c381c9a5cfd8a9a956d7d0a9dc1bd8bcdaf52f76ef2f12","dweb:/ipfs/Qmax9WHBnVsZP46ZxEMNRQpLQnrdE4dK8LehML1Py8FowF"],"license":"MIT"},"node_modules/@openzeppelin/contracts/utils/cryptography/ECDSA.sol":{"keccak256":"0x69f54c02b7d81d505910ec198c11ed4c6a728418a868b906b4a0cf29946fda84","urls":["bzz-raw://8e25e4bdb7ae1f21d23bfee996e22736fc0ab44cfabedac82a757b1edc5623b9","dweb:/ipfs/QmQdWQvB6JCP9ZMbzi8EvQ1PTETqkcTWrbcVurS7DKpa5n"],"license":"MIT"},"node_modules/@openzeppelin/contracts/utils/introspection/ERC165.sol":{"keccak256":"0x2d9dc2fe26180f74c11c13663647d38e259e45f95eb88f57b61d2160b0109d3e","urls":["bzz-raw://81233d1f98060113d9922180bb0f14f8335856fe9f339134b09335e9f678c377","dweb:/ipfs/QmWh6R35SarhAn4z2wH8SU456jJSYL2FgucfTFgbHJJN4E"],"license":"MIT"},"node_modules/@openzeppelin/contracts/utils/introspection/IERC165.sol":{"keccak256":"0x8891738ffe910f0cf2da09566928589bf5d63f4524dd734fd9cedbac3274dd5c","urls":["bzz-raw://971f954442df5c2ef5b5ebf1eb245d7105d9fbacc7386ee5c796df1d45b21617","dweb:/ipfs/QmadRjHbkicwqwwh61raUEapaVEtaLMcYbQZWs9gUkgj3u"],"license":"MIT"}},"version":1},"id":29} \ No newline at end of file diff --git a/ibc-solidity/abi/bytecode/BesuIBFT2LightClient.json b/ibc-solidity/abi/bytecode/BesuIBFT2LightClient.json new file mode 100644 index 000000000..3fdb5bb85 --- /dev/null +++ b/ibc-solidity/abi/bytecode/BesuIBFT2LightClient.json @@ -0,0 +1 @@ +{"abi":[{"type":"constructor","inputs":[{"name":"ibcRouter","type":"address","internalType":"address"},{"name":"initialTrustedHeight","type":"uint64","internalType":"uint64"},{"name":"initialTrustedTimestamp","type":"uint64","internalType":"uint64"},{"name":"initialTrustedStorageRoot","type":"bytes32","internalType":"bytes32"},{"name":"initialTrustedValidators","type":"address[]","internalType":"address[]"},{"name":"trustingPeriod","type":"uint64","internalType":"uint64"},{"name":"maxClockDrift","type":"uint64","internalType":"uint64"},{"name":"roleManager","type":"address","internalType":"address"}],"stateMutability":"nonpayable"},{"type":"function","name":"DEFAULT_ADMIN_ROLE","inputs":[],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"type":"function","name":"PROOF_SUBMITTER_ROLE","inputs":[],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"type":"function","name":"getClientState","inputs":[],"outputs":[{"name":"","type":"bytes","internalType":"bytes"}],"stateMutability":"view"},{"type":"function","name":"getConsensusState","inputs":[{"name":"revisionHeight","type":"uint64","internalType":"uint64"}],"outputs":[{"name":"","type":"bytes","internalType":"bytes"}],"stateMutability":"view"},{"type":"function","name":"getRoleAdmin","inputs":[{"name":"role","type":"bytes32","internalType":"bytes32"}],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"type":"function","name":"grantRole","inputs":[{"name":"role","type":"bytes32","internalType":"bytes32"},{"name":"account","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"hasRole","inputs":[{"name":"role","type":"bytes32","internalType":"bytes32"},{"name":"account","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"misbehaviour","inputs":[{"name":"","type":"bytes","internalType":"bytes"}],"outputs":[],"stateMutability":"view"},{"type":"function","name":"renounceRole","inputs":[{"name":"role","type":"bytes32","internalType":"bytes32"},{"name":"callerConfirmation","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"revokeRole","inputs":[{"name":"role","type":"bytes32","internalType":"bytes32"},{"name":"account","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"supportsInterface","inputs":[{"name":"interfaceId","type":"bytes4","internalType":"bytes4"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"updateClient","inputs":[{"name":"updateMsg","type":"bytes","internalType":"bytes"}],"outputs":[{"name":"","type":"uint8","internalType":"enum ILightClientMsgs.UpdateResult"}],"stateMutability":"nonpayable"},{"type":"function","name":"verifyMembership","inputs":[{"name":"msg_","type":"tuple","internalType":"struct ILightClientMsgs.MsgVerifyMembership","components":[{"name":"proof","type":"bytes","internalType":"bytes"},{"name":"proofHeight","type":"tuple","internalType":"struct IICS02ClientMsgs.Height","components":[{"name":"revisionNumber","type":"uint64","internalType":"uint64"},{"name":"revisionHeight","type":"uint64","internalType":"uint64"}]},{"name":"path","type":"bytes[]","internalType":"bytes[]"},{"name":"value","type":"bytes","internalType":"bytes"}]}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"verifyNonMembership","inputs":[{"name":"msg_","type":"tuple","internalType":"struct ILightClientMsgs.MsgVerifyNonMembership","components":[{"name":"proof","type":"bytes","internalType":"bytes"},{"name":"proofHeight","type":"tuple","internalType":"struct IICS02ClientMsgs.Height","components":[{"name":"revisionNumber","type":"uint64","internalType":"uint64"},{"name":"revisionHeight","type":"uint64","internalType":"uint64"}]},{"name":"path","type":"bytes[]","internalType":"bytes[]"}]}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"event","name":"RoleAdminChanged","inputs":[{"name":"role","type":"bytes32","indexed":true,"internalType":"bytes32"},{"name":"previousAdminRole","type":"bytes32","indexed":true,"internalType":"bytes32"},{"name":"newAdminRole","type":"bytes32","indexed":true,"internalType":"bytes32"}],"anonymous":false},{"type":"event","name":"RoleGranted","inputs":[{"name":"role","type":"bytes32","indexed":true,"internalType":"bytes32"},{"name":"account","type":"address","indexed":true,"internalType":"address"},{"name":"sender","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"type":"event","name":"RoleRevoked","inputs":[{"name":"role","type":"bytes32","indexed":true,"internalType":"bytes32"},{"name":"account","type":"address","indexed":true,"internalType":"address"},{"name":"sender","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"type":"error","name":"AccessControlBadConfirmation","inputs":[]},{"type":"error","name":"AccessControlUnauthorizedAccount","inputs":[{"name":"account","type":"address","internalType":"address"},{"name":"neededRole","type":"bytes32","internalType":"bytes32"}]},{"type":"error","name":"ConflictingConsensusState","inputs":[{"name":"revisionHeight","type":"uint64","internalType":"uint64"}]},{"type":"error","name":"ConsensusStateExpired","inputs":[{"name":"trustedTimestamp","type":"uint64","internalType":"uint64"},{"name":"currentTimestamp","type":"uint256","internalType":"uint256"},{"name":"trustingPeriod","type":"uint64","internalType":"uint64"}]},{"type":"error","name":"ConsensusStateNotFound","inputs":[{"name":"revisionHeight","type":"uint64","internalType":"uint64"}]},{"type":"error","name":"DuplicateCommitSealSigner","inputs":[{"name":"signer","type":"address","internalType":"address"}]},{"type":"error","name":"DuplicateValidator","inputs":[{"name":"validator","type":"address","internalType":"address"}]},{"type":"error","name":"EmptyValidatorSet","inputs":[]},{"type":"error","name":"HeaderFromFuture","inputs":[{"name":"currentTimestamp","type":"uint256","internalType":"uint256"},{"name":"headerTimestamp","type":"uint256","internalType":"uint256"},{"name":"maxClockDrift","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"InsufficientTrustedValidatorOverlap","inputs":[{"name":"actual","type":"uint256","internalType":"uint256"},{"name":"required","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"InsufficientValidatorQuorum","inputs":[{"name":"actual","type":"uint256","internalType":"uint256"},{"name":"required","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"InvalidCommitSeal","inputs":[]},{"type":"error","name":"InvalidCommitmentValue","inputs":[{"name":"expectedValue","type":"bytes32","internalType":"bytes32"},{"name":"actualValue","type":"bytes32","internalType":"bytes32"}]},{"type":"error","name":"InvalidDifficulty","inputs":[{"name":"actualDifficulty","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"InvalidECDSASignatureLength","inputs":[{"name":"length","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"InvalidExtraDataFormat","inputs":[{"name":"itemsLength","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"InvalidHeaderFormat","inputs":[{"name":"itemsLength","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"InvalidHeaderHeight","inputs":[]},{"type":"error","name":"InvalidMixHash","inputs":[{"name":"actualMixHash","type":"bytes32","internalType":"bytes32"}]},{"type":"error","name":"InvalidNonce","inputs":[{"name":"actualNonce","type":"bytes","internalType":"bytes"}]},{"type":"error","name":"InvalidOmmersHash","inputs":[{"name":"actualOmmersHash","type":"bytes32","internalType":"bytes32"}]},{"type":"error","name":"InvalidPathLength","inputs":[{"name":"expectedLength","type":"uint256","internalType":"uint256"},{"name":"actualLength","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"InvalidRevisionNumber","inputs":[{"name":"providedRevisionNumber","type":"uint64","internalType":"uint64"}]},{"type":"error","name":"InvalidValidatorAddress","inputs":[{"name":"validator","type":"address","internalType":"address"}]},{"type":"error","name":"InvalidValidatorAddressLength","inputs":[{"name":"length","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"InvalidValueLength","inputs":[{"name":"expectedLength","type":"uint256","internalType":"uint256"},{"name":"actualLength","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"UnsupportedMisbehaviour","inputs":[]},{"type":"error","name":"ValueExists","inputs":[{"name":"actualValue","type":"bytes32","internalType":"bytes32"}]}],"bytecode":{"object":"0x6080604052346103c0576138e780380380610019816103c4565b928339810190610100818303126103c057610033816103e9565b61003f602083016103fd565b9061004c604084016103fd565b60608401516080850151909291906001600160401b0381116103c05785019286601f850112156103c0578351966001600160401b038811610376578760051b9460206100998188016103c4565b809a81520190602082978201019283116103c057602001905b8282106103a8575050506100c860a087016103fd565b956100e160e06100da60c084016103fd565b92016103e9565b956001600160401b03169081156103995788511561038a575f5b89518110156101b1576001600160a01b03610116828c610411565b51161561018a575f5b81811061012f57506001016100fb565b6001600160a01b03610141828d610411565b51166001600160a01b03610155848e610411565b5116146101645760010161011f565b6001600160a01b03610176838d610411565b511663107f863360e21b5f5260045260245ffd5b6001600160a01b039061019d908b610411565b51166359bff38760e01b5f5260045260245ffd5b5060408051979896978a979181016001600160401b03811182821017610376576040525f81526020810190848252604051926080840198848a1060018060401b038b1117610376576040998a526001600160a01b031680855260208086018490526001600160401b03928316868c01819052878416606090970196909652600180546001600160a01b031916909217825592516002805495516001600160801b031996871692851692909217918c1b6fffffffffffffffff000000000000000090811692909217815560038054909616909617968b1b16959095179092555f948552600490529590922080546001600160401b03191694861694909417845583019190915592519392019190831161037657680100000000000000008311610376578154838355808410610350575b50905f5260205f205f5b83811061033357846001600160a01b03811661031a575061030961052f565b505b60405161329590816105b28239f35b8061032761032d92610439565b506104af565b5061030b565b82516001600160a01b0316818301556020909201916001016102ea565b825f528360205f2091820191015b81811061036b57506102e0565b5f815560010161035e565b634e487b7160e01b5f52604160045260245ffd5b63339e1ffb60e01b5f5260045ffd5b6359d119e360e01b5f5260045ffd5b602080916103b5846103e9565b8152019101906100b2565b5f80fd5b6040519190601f01601f191682016001600160401b0381118382101761037657604052565b51906001600160a01b03821682036103c057565b51906001600160401b03821682036103c057565b80518210156104255760209160051b010190565b634e487b7160e01b5f52603260045260245ffd5b6001600160a01b0381165f9081525f5160206138c75f395f51905f52602052604090205460ff166104aa576001600160a01b03165f8181525f5160206138c75f395f51905f5260205260408120805460ff191660011790553391905f5160206138475f395f51905f528180a4600190565b505f90565b6001600160a01b0381165f9081525f5160206138675f395f51905f52602052604090205460ff166104aa576001600160a01b03165f8181525f5160206138675f395f51905f5260205260408120805460ff191660011790553391905f5160206138a75f395f51905f52905f5160206138475f395f51905f529080a4600190565b5f80525f5160206138675f395f51905f526020525f5160206138875f395f51905f525460ff166105ad575f8080525f5160206138675f395f51905f526020525f5160206138875f395f51905f52805460ff1916600117905533905f5160206138a75f395f51905f525f5160206138475f395f51905f528280a4600190565b5f9056fe60806040526004361015610011575f80fd5b5f3560e01c806301ffc9a7146100f45780630bece356146100ef578063248a9ca3146100ea5780632f2ff15d146100e557806336568abe146100e05780634d6d9ffb146100db5780635972185a146100d6578063682ed5f0146100d157806391d14854146100cc578063a217fddf146100c7578063d547741f146100c2578063ddba6537146100bd578063edce8bdc146100b85763ef913a4b146100b3575f80fd5b610a16565b61095e565b61088b565b61085c565b610842565b6107f4565b6105e6565b6105ac565b6103ac565b610350565b61031a565b6102b5565b610217565b34610195576020600319360112610195576004357fffffffff00000000000000000000000000000000000000000000000000000000811680910361019557807f7965db0b000000000000000000000000000000000000000000000000000000006020921490811561016b575b506040519015158152f35b7f01ffc9a7000000000000000000000000000000000000000000000000000000009150145f610160565b5f80fd5b9060206003198301126101955760043567ffffffffffffffff811161019557826023820112156101955780600401359267ffffffffffffffff84116101955760248483010111610195576024019190565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b346101955761028161022836610199565b5f80527f4c48d1d2b0f4f7485fc28e3db22341d96a20aa29e6efa8149da9751603abd4e06020527f6e0c24a6e293ff9b755263dbaa15ba3796b0b8d3fe17cfb4ddf8143b268eac475490919060ff161561029957610d9d565b6040516003821015610294576020918152f35b6101ea565b6102a1611287565b610d9d565b90816020910312610195573590565b346101955760206003193601126101955760206102df6004355f525f602052600160405f20015490565b604051908152f35b6003196040910112610195576004359060243573ffffffffffffffffffffffffffffffffffffffff811681036101955790565b346101955761034e61032b366102e7565b90610349610344825f525f602052600160405f20015490565b61130f565b612142565b005b346101955761035e366102e7565b3373ffffffffffffffffffffffffffffffffffffffff8216036103845761034e91612219565b7f6697b232000000000000000000000000000000000000000000000000000000005f5260045ffd5b346101955760206003193601126101955760043567ffffffffffffffff8111610195578060040160806003198336030112610195575f80527f4c48d1d2b0f4f7485fc28e3db22341d96a20aa29e6efa8149da9751603abd4e060205260ff7f6e0c24a6e293ff9b755263dbaa15ba3796b0b8d3fe17cfb4ddf8143b268eac4754161561059f575b61044761044260248401611192565b61137c565b60648201916001610458848461119c565b90500361056157906104a96104966104a261049d61049661049061048961048460446104e09a01611192565b611b30565b988761119c565b9061126e565b3691610b4d565b6122ee565b928061121d565b906001840154906040516104d7816104c960208201948560209181520190565b03601f198101835282610afd565b5190209161237c565b805161051f5761051b61050b6104fe845467ffffffffffffffff1690565b67ffffffffffffffff1690565b6040519081529081906020820190565b0390f35b61053361052e61055e926124c1565b6124ee565b7fd039601e000000000000000000000000000000000000000000000000000000005f52600452602490565b5ffd5b61055e61056e848461119c565b7f88b3170e000000000000000000000000000000000000000000000000000000005f52600160045260245250604490565b6105a7611287565b610433565b34610195575f6003193601126101955760206040517fbd893629a699470e4ec82a5715bb4981fdaacc5d0a728bf5f55b801d8f4ef10b8152f35b346101955760206003193601126101955760043567ffffffffffffffff8111610195578060040160a06003198336030112610195575f80527f4c48d1d2b0f4f7485fc28e3db22341d96a20aa29e6efa8149da9751603abd4e060205260ff7f6e0c24a6e293ff9b755263dbaa15ba3796b0b8d3fe17cfb4ddf8143b268eac475416156107e7575b61067c61044260248401611192565b6064820191600161068d848461119c565b90500361056157608481019060206106a5838561121d565b9050036107a957906106f46104966106ed6106e56106de61049d6104966104906106d761048460446107149c01611192565b9b8b61119c565b948761121d565b8101906102a6565b948061121d565b906001850154906040516104d7816104c960208201948560209181520190565b8051156107755761052e610727916124c1565b908082036107475761051b61050b6104fe855467ffffffffffffffff1690565b7f56ed1b63000000000000000000000000000000000000000000000000000000005f5260045260245260445ffd5b61055e827f56ed1b63000000000000000000000000000000000000000000000000000000005f52906044916004525f602452565b61055e6107b6838561121d565b7f24fadac8000000000000000000000000000000000000000000000000000000005f52602060045260245250604490565b6107ef611287565b61066d565b3461019557602060ff610836610809366102e7565b905f525f845260405f209073ffffffffffffffffffffffffffffffffffffffff165f5260205260405f2090565b54166040519015158152f35b34610195575f6003193601126101955760206040515f8152f35b346101955761034e61086d366102e7565b90610886610344825f525f602052600160405f20015490565b612219565b346101955761089936610199565b50505f80527f4c48d1d2b0f4f7485fc28e3db22341d96a20aa29e6efa8149da9751603abd4e06020527f6e0c24a6e293ff9b755263dbaa15ba3796b0b8d3fe17cfb4ddf8143b268eac475460ff1615610915575b7f2c1ed462000000000000000000000000000000000000000000000000000000005f5260045ffd5b61091d611287565b6108ed565b67ffffffffffffffff81160361019557565b601f19601f602060409481855280519182918282880152018686015e5f8582860101520116010190565b346101955760206003193601126101955761097e60043561048481610922565b67ffffffffffffffff8154166002600183015492019060405192608084019160208501526040840152606080840152815480915260a08301915f5260205f20905f5b8181106109ea5761051b856109de818703601f198101835282610afd565b60405191829182610934565b825473ffffffffffffffffffffffffffffffffffffffff168452602090930192600192830192016109c0565b34610195575f6003193601126101955761051b60405173ffffffffffffffffffffffffffffffffffffffff60015416602082015267ffffffffffffffff600254818116604084015260401c16606082015267ffffffffffffffff600354818116608084015260401c1660a082015260a081526109de60c082610afd565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b6060810190811067ffffffffffffffff821117610adc57604052565b610a93565b6040810190811067ffffffffffffffff821117610adc57604052565b90601f601f19910116810190811067ffffffffffffffff821117610adc57604052565b60405190610b2f604083610afd565b565b67ffffffffffffffff8111610adc57601f01601f191660200190565b929192610b5982610b31565b91610b676040519384610afd565b829481845281830111610195578281602093845f960137010152565b9080601f8301121561019557816020610b9e93359101610b4d565b90565b6020818303126101955780359067ffffffffffffffff8211610195570180820391608083126101955760405192610bd784610ac0565b823567ffffffffffffffff811161019557604091610bfa84601f19938701610b83565b8652011261019557604051610c0e81610ae1565b6020830135610c1c81610922565b81526040830135610c2c81610922565b60208201526020840152606082013567ffffffffffffffff811161019557610c549201610b83565b604082015290565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b9060018201809211610c9757565b610c5c565b60c001908160c011610c9757565b60f701908160f711610c9757565b6080019081608011610c9757565b60b701908160b711610c9757565b91908201809211610c9757565b908160011b9180830460021490151715610c9757565b81519167ffffffffffffffff8311610adc57680100000000000000008311610adc578154838355808410610d77575b506020610d389101915f5260205f2090565b5f5b838110610d475750505050565b6001906020610d6a855173ffffffffffffffffffffffffffffffffffffffff1690565b9401938184015501610d3a565b825f528360205f2091820191015b818110610d925750610d26565b5f8155600101610d85565b610da991810190610ba1565b9060208201610dc461044282515167ffffffffffffffff1690565b610dce8351611614565b92606084019367ffffffffffffffff610def865167ffffffffffffffff1690565b161561116a5760035491604083901c67ffffffffffffffff1693610e1d67ffffffffffffffff861642610cd4565b9460a0840195610e35875167ffffffffffffffff1690565b9067ffffffffffffffff82161161112b5750505160200151610e7290610e649067ffffffffffffffff16611b30565b9367ffffffffffffffff1690565b67ffffffffffffffff81168015159081611102575b506110ad575090610ef591610eb66002610eae610ea385611b87565b60e086015190611ca1565b950185611ea7565b610ec660c0830194855190611f49565b60406080610ee960015473ffffffffffffffffffffffffffffffffffffffff1690565b93015191015191611ffe565b610f22610f0a865167ffffffffffffffff1690565b67ffffffffffffffff165f52600460205260405f2090565b610f376104fe825467ffffffffffffffff1690565b61103b5750916002610fb5928694610fa8610f73610f64610f0a610fc39a9b5167ffffffffffffffff1690565b955167ffffffffffffffff1690565b859067ffffffffffffffff167fffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000825416179055565b6001840155519101610cf7565b5167ffffffffffffffff1690565b600254610fdc9060401c67ffffffffffffffff166104fe565b67ffffffffffffffff821611610ff157505f90565b611037907fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff6fffffffffffffffff00000000000000006002549260401b16911617600255565b5f90565b91611051611059945167ffffffffffffffff1690565b905192612074565b6110a75761055e611072835167ffffffffffffffff1690565b7fc1aea5f7000000000000000000000000000000000000000000000000000000005f5267ffffffffffffffff16600452602490565b60029150565b61055e906110c3855467ffffffffffffffff1690565b7feae35725000000000000000000000000000000000000000000000000000000005f5267ffffffffffffffff9081166004524260245216604452606490565b9050611123429161111e6104fe885467ffffffffffffffff1690565b610cd4565b11155f610e87565b7f9b772277000000000000000000000000000000000000000000000000000000005f524260045267ffffffffffffffff9081166024521660445260645ffd5b7f59d119e3000000000000000000000000000000000000000000000000000000005f5260045ffd5b35610b9e81610922565b9035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe181360301821215610195570180359067ffffffffffffffff821161019557602001918160051b3603831361019557565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b9035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe181360301821215610195570180359067ffffffffffffffff82116101955760200191813603831361019557565b9015611282578061127e9161121d565b9091565b6111f0565b335f9081527f4c48d1d2b0f4f7485fc28e3db22341d96a20aa29e6efa8149da9751603abd4e0602052604090205460ff16156112bf57565b7fe2517d3f000000000000000000000000000000000000000000000000000000005f52336004527fbd893629a699470e4ec82a5715bb4981fdaacc5d0a728bf5f55b801d8f4ef10b60245260445ffd5b805f525f60205260ff6113433360405f209073ffffffffffffffffffffffffffffffffffffffff165f5260205260405f2090565b54161561134d5750565b7fe2517d3f000000000000000000000000000000000000000000000000000000005f523360045260245260445ffd5b67ffffffffffffffff168061138e5750565b7f3ce598a9000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b60405190610100820182811067ffffffffffffffff821117610adc57604052606060e0838281528260208201528260408201525f838201525f60808201525f60a08201528260c08201520152565b8051600110156112825760400190565b805160071015611282576101000190565b8051600d1015611282576101c00190565b8051600e1015611282576101e00190565b805160081015611282576101200190565b8051600310156112825760800190565b8051600b1015611282576101800190565b8051600c1015611282576101a00190565b8051600410156112825760a00190565b8051156112825760200190565b8051600210156112825760600190565b805160101015611282576102200190565b80518210156112825760209160051b010190565b67ffffffffffffffff8111610adc5760051b60200190565b90611501826114df565b61150e6040519182610afd565b828152601f1961151e82946114df565b0190602036910137565b90602082519201517fffffffffffffffffffffffffffffffffffffffff00000000000000000000000081169260148110611560575050565b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000929350829060140360031b1b161690565b60405160a091906115a38382610afd565b6004815291601f1901825f5b8281106115bb57505050565b8060606020809385010152016115af565b906115d6826114df565b6115e36040519182610afd565b828152601f196115f382946114df565b01905f5b82811061160357505050565b8060606020809385010152016115f7565b61163061162b6116226113b9565b928084526124c1565b612530565b602082019080825251600f8110611b0557507f1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d493476116766116708351611407565b516125fb565b03611aca57600161169061168a8351611417565b516124ee565b03611a8f577f63746963616c2062797a616e74696e65206661756c7420746f6c6572616e63656116c36116708351611428565b03611a54576116db6116d58251611439565b51612617565b80516008811490811591611a24575b506119ea575061162b61175d6116d5836117216117106104fe61168a611762985161144a565b67ffffffffffffffff166060880152565b61172e611670825161145b565b60808701526117576117466104fe61168a845161146b565b67ffffffffffffffff1660a0880152565b5161147c565b6124c1565b90604081019180835251600581036119bf57506117886117828351611407565b51612530565b908151156119975761179a82516114f7565b9360c082019485525f5b8351811015611933576117ba6116d582866114cb565b80516014810361190857506117d16117d791611528565b60601c90565b73ffffffffffffffffffffffffffffffffffffffff811680156118c6575f5b8381106118325750509061182c600192611811838a516114cb565b9073ffffffffffffffffffffffffffffffffffffffff169052565b016117a4565b8161187761185e611844848d516114cb565b5173ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff1690565b14611884576001016117f6565b7f41fe18cc000000000000000000000000000000000000000000000000000000005f5273ffffffffffffffffffffffffffffffffffffffff831660045260245ffd5b7f59bff387000000000000000000000000000000000000000000000000000000005f5273ffffffffffffffffffffffffffffffffffffffff821660045260245ffd5b7f83e46ad2000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b509261178291945061194692505161148d565b61195081516115cc565b9260e081019384525f5b8251811015611991578061198a816119776116d5600195886114cb565b88519061198483836114cb565b526114cb565b500161195a565b50925050565b7f339e1ffb000000000000000000000000000000000000000000000000000000005f5260045ffd5b7f30c6792a000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b611a20906040519182917fd5edd2a500000000000000000000000000000000000000000000000000000000835260048301610934565b0390fd5b7f011b4d03dd8c01f1049143cf9c4c817e4b167f1d1b83e5c6f0f10d89ba1e7bce9150602083012014155f6116ea565b611a6461167061055e9251611428565b7fa19e609c000000000000000000000000000000000000000000000000000000005f52600452602490565b611a9f61168a61055e9251611417565b7ff71b722f000000000000000000000000000000000000000000000000000000005f52600452602490565b611ada61167061055e9251611407565b7fb8120dca000000000000000000000000000000000000000000000000000000005f52600452602490565b7fbc277732000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b67ffffffffffffffff1690815f52600460205260405f209167ffffffffffffffff83541615611b5c5750565b7ff761631b000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b6020611c26611b94611592565b611c0d611bab60408601611bb1611bab825161149d565b51612f9a565b611bba8561149d565b52611bc48461149d565b50611bd2611bab8251611407565b611bdb85611407565b52611be584611407565b50611bf3611bab82516114aa565b611bfc856114aa565b52611c06846114aa565b505161145b565b611c168261145b565b52611c208161145b565b506126ed565b910190611c348251516115cc565b905f5b83518051821015611c8a579080600192600c82145f14611c78575050611c5c8361279e565b611c6682866114cb565b52611c7181856114cb565b5001611c37565b611c8591611bab916114cb565b611c5c565b505050611c9791506126ed565b6020815191012090565b919091611cae83516114f7565b925f5b8151811015611e9457611cc481836114cb565b51805160418103611e69575080601b60ff611d13611d0d611ce7611d209661277d565b517fff000000000000000000000000000000000000000000000000000000000000001690565b60f81c90565b1610611e16575b84613048565b50611d2a81612818565b15801590611df8575b611dd05773ffffffffffffffffffffffffffffffffffffffff81165f5b838110611d7057505090611d6a60019261181183896114cb565b01611cb1565b81611d8161185e611844848c6114cb565b14611d8e57600101611d50565b7f33af0d5f000000000000000000000000000000000000000000000000000000005f5273ffffffffffffffffffffffffffffffffffffffff831660045260245ffd5b7f09cb44e6000000000000000000000000000000000000000000000000000000005f5260045ffd5b5073ffffffffffffffffffffffffffffffffffffffff811615611d33565b611e58611e30611e2b611d0d611ce78561277d565b612806565b60f81b7fff000000000000000000000000000000000000000000000000000000000000001690565b5f1a611e638261277d565b53611d1a565b7ff2db9ce1000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b505050565b5f198114610c975760010190565b905f915f5b8151811015611f0057611edf73ffffffffffffffffffffffffffffffffffffffff611ed783856114cb565b511684612822565b611eec575b600101611eac565b92611ef8600191611e99565b939050611ee4565b50506003611f0f915404610c89565b90818110611f1b575050565b7fe2dcb1b9000000000000000000000000000000000000000000000000000000005f5260045260245260445ffd5b905f915f5b8151811015611fa257611f8173ffffffffffffffffffffffffffffffffffffffff611f7983856114cb565b511684612879565b611f8e575b600101611f4e565b92611f9a600191611e99565b939050611f86565b5050518060011b9080820460021490151715610c97576003611fc49104610c89565b90818110611fd0575050565b7f7818f4e4000000000000000000000000000000000000000000000000000000005f5260045260245260445ffd5b6120489261162b9261175d926040517fffffffffffffffffffffffffffffffffffffffff000000000000000000000000602082019260601b168252601481526104d7603482610afd565b805160021015611282576060610b9e9101516125fb565b8054821015611282575f5260205f2001905f90565b919067ffffffffffffffff80612092855467ffffffffffffffff1690565b921691161490811591612133575b5061212d5760020190815481510361212d575f5b8151811015612125576120ea6120ca828561205f565b905473ffffffffffffffffffffffffffffffffffffffff9160031b1c1690565b73ffffffffffffffffffffffffffffffffffffffff61210f61185e61184485876114cb565b91160361211e576001016120b4565b5050505f90565b505050600190565b50505f90565b9050600182015414155f6120a0565b805f525f60205260ff6121768360405f209073ffffffffffffffffffffffffffffffffffffffff165f5260205260405f2090565b541661212d57805f525f6020526121ae8260405f209073ffffffffffffffffffffffffffffffffffffffff165f5260205260405f2090565b60017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0082541617905573ffffffffffffffffffffffffffffffffffffffff339216907f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d5f80a4600190565b805f525f60205260ff61224d8360405f209073ffffffffffffffffffffffffffffffffffffffff165f5260205260405f2090565b54161561212d57805f525f6020526122868260405f209073ffffffffffffffffffffffffffffffffffffffff165f5260205260405f2090565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00815416905573ffffffffffffffffffffffffffffffffffffffff339216907ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b5f80a4600190565b60208151910120604051602081019182527f1260944489272988d9df285149b5aa1b0f48f2136d6f416159f840a3e0747600604082015260408152612334606082610afd565b51902090565b60405190612349602083610afd565b5f808352366020840137565b9061235f82610b31565b61236c6040519182610afd565b828152601f1961151e8294610b31565b61162b6123be919493946123906020610b31565b9561239e6040519788610afd565b602087526123ac6020610b31565b601f19602089019101368237526124c1565b906123c98451610ce1565b9184511515806124a1575b6123dd906124e7565b6123ef6123ea5f85612940565b612355565b925f19015f5b818110612409575050610b9e939450612a70565b8061248b600f61244e612485611d0d611ce78d61242860029960011c90565b908d61247f8a6124778a61244e612445611d0d611ce78a8a61278d565b60041c600f1690565b1660f81b7fff000000000000000000000000000000000000000000000000000000000000001690565b5f1a9261278d565b5361278d565b60ff1690565b5f1a61249a600183018861278d565b53016123f5565b5060016123d4565b604051906124b682610ae1565b5f6020838281520152565b6124c96124a9565b506020815191604051926124dc84610ae1565b835201602082015290565b1561019557565b80518015159081612524575b50156101955761250990612d46565b90519060208110612518575090565b6020036101000a900490565b6021915011155f6124fa565b61253981612d72565b156101955761254781612d92565b612550816114df565b9161255e6040519384610afd565b818352601f1961256d836114df565b015f5b8181106125e4575050602061259091015161258a81612df3565b90610cd4565b5f905b8282106125a05750505090565b6125dc816125af600193612e5e565b906125b8610b20565b8281528160208201526125cb86896114cb565b526125d685886114cb565b50610cd4565b910190612593565b6020906125ef6124a9565b82828801015201612570565b6021815103610195576020015160018101809111610c97575190565b8051156101955761262a610b9e91612d46565b61263681939293612355565b928360200190612f27565b805191908290602001825e015f815290565b610b2f9061267561266f94936040519586936020850190612641565b90612641565b03601f198101845283610afd565b6001907fff00000000000000000000000000000000000000000000000000000000000000610b9e94931681520190612641565b916001610b9e94937fff0000000000000000000000000000000000000000000000000000000000000061266f941681520190612641565b5f9060605b815183101561271a5761271260019161270b85856114cb565b5190612653565b9201916126f2565b9150508051603881106127595750610b9e6127358251612fc6565b916104c9612749611e306124858651610caa565b91604051948593602085016126b6565b61276b611e30612485610b9e93610c9c565b6104c960405193849260208401612683565b8051604010156112825760600190565b908151811015611282570160200190565b6001815114806127eb575b610b9e578051603881106127d95750610b9e6127c58251612fc6565b916104c9612749611e306124858651610cc6565b61276b611e30612485610b9e93610cb8565b50608060ff6127ff611d0d611ce78561149d565b16106127a9565b60ff601b9116019060ff8211610c9757565b6004111561029457565b905f5b825481101561211e5773ffffffffffffffffffffffffffffffffffffffff61284d828561205f565b90549060031b1c1673ffffffffffffffffffffffffffffffffffffffff83161461212557600101612825565b905f5b825181101561211e5773ffffffffffffffffffffffffffffffffffffffff6128a482856114cb565b511673ffffffffffffffffffffffffffffffffffffffff8316146121255760010161287c565b905f198201918211610c9757565b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff408201918211610c9757565b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff808201918211610c9757565b6020039060208211610c9757565b91908203918211610c9757565b91906129598351610ce1565b908351151580612a66575b61296d906124e7565b61297a6123ea8284612940565b938192600180841614612a04575b5f19869101935b84811061299d575050505050565b836129fb60016129f1600f61244e612485611d0d611ce78b60029b6129ea6129dd8861244e8f611d0d611ce76129d66124459360011c90565b809961278d565b9b8d03809c5f1a9261278d565b538c61278d565b5f1a92018961278d565b5301859061298f565b92507f0f00000000000000000000000000000000000000000000000000000000000000612a43612485611d0d611ce7612a3d8760011c90565b8661278d565b60f81b165f1a612a528661149d565b535f19612a5e83611e99565b939050612988565b5081811115612964565b915f915f612a7c6124a9565b50845115612d0d5790935f915b81518310156101955782158080612cf7575b61019557159081612cda575b5061019557612ab961178283836114cb565b948551600281145f14612bb65750612adb612ad66116d58861149d565b6130dd565b95612af1612aea88888461314a565b8092610cd4565b965111612b985715612b285750612b0890516128ca565b11610195575111612b1f576116d5610b9e91611407565b50610b9e61233a565b919094612b3586516128ca565b82146101955780612b57612b53612b4d600194611407565b51612d72565b1590565b15612b7957612b68612b6e91611407565b516130cf565b915b01919490612a89565b612b85612b9291611407565b5160208101519051902090565b91612b70565b505091509250612ba99150516128ca565b1161019557610b9e61233a565b929491939192601103612c7b5781518314612c5d57612be7612be1612485611d0d611ce7878761278d565b93610c89565b92601081101561019557612c04612bfe82896114cb565b516130b9565b15612c265750505050612c19919250516128ca565b0361019557610b9e61233a565b86612c3e612b53612b4d84600196989a97999b6114cb565b15612c5057612b9291612b68916114cb565b612b9291612b85916114cb565b505050612c6a90516128ca565b03610195576116d5610b9e916114ba565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f696e76616c6964206e6f6465206c656e677468000000000000000000000000006044820152606490fd5b9050612cef612ce984846114cb565b51613082565b14155f612aa7565b50612d05612b8585856114cb565b871415612a9b565b509050612d3e92507f56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b4219150146124e7565b610b9e61233a565b906020820191612d568351612df3565b925190838201809211610c975751928303928311610c97579190565b805115612d8d57602060c0910151515f1a1061103757600190565b505f90565b805115612d8d575f9060208101908151612dab81612df3565b8101809111610c9757915190518101809111610c975791905b828110612dd15750905090565b612dda81612e5e565b8101809111610c9757612ded9091611e99565b90612dc4565b515f1a6080811015612e0457505f90565b60b881108015612e48575b15612e1a5750600190565b60c0811015612e3957610b9e90612e349060b75b90612940565b610c89565b610b9e90612e349060f7612e2e565b5060c08110158015612e0f575060f88110612e0f565b80515f1a906080821015612e73575050600190565b60b8821015612e895750612e34610b9e91612905565b60c0821015612eca5760010151602082900360b7016101000a9004017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff4a0190565b60f8821015612ee05750612e34610b9e916128d8565b60010151602082900360f7016101000a9004017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0a0190565b601f8111610c97576101000a90565b90918015611e94575b6020811015612f6a5780612f4357505050565b612f57612f52612f5c92612932565b612f18565b6128ca565b905182518216911916179052565b91908051825260208101809111610c97579060208101809111610c975791601f19810190811115612f3057610c5c565b612fa48151612355565b90815115612fc257806020610b9e9201519051908360200190612f27565b5090565b5f81805b6130345750612fd881612355565b91815b612fe457505090565b612fed826128ca565b61301f7fff000000000000000000000000000000000000000000000000000000000000008360f81b165f1a918561278d565b5360081c908015610c97575f19019081612fdb565b9061303e90611e99565b9060081c80612fca565b8151919060418303613078576130719250602082015190606060408401519301515f1a906131ee565b9192909190565b50505f9160029190565b8051602081101561309a575060208101519051902090565b9060200151206040516020810191825260208152612334604082610afd565b6001815103612d8d5760200151515f1a60801490565b6130d890612d46565b902090565b9081511561019557600f6130f9612445611d0d611ce78661149d565b168061310c5750610b9e60025f9361294d565b600181036131215750610b9e60015f9361294d565b600281036131375750610b9e600260019361294d565b60030361019557610b9e6001809361294d565b91905f5b838101808211610c975782518110806131e4575b156131dc576131927fff00000000000000000000000000000000000000000000000000000000000000918461278d565b51167fff000000000000000000000000000000000000000000000000000000000000006131bf838661278d565b511690036131d5576131d090611e99565b61314e565b9250505090565b509250505090565b5083518210613162565b91907f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0841161327d579160209360809260ff5f9560405194855216868401526040830152606082015282805260015afa15613272575f5173ffffffffffffffffffffffffffffffffffffffff81161561326857905f905f90565b505f906001905f90565b6040513d5f823e3d90fd5b5050505f916003919056fea164736f6c634300081c000a2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d4c48d1d2b0f4f7485fc28e3db22341d96a20aa29e6efa8149da9751603abd4e06e0c24a6e293ff9b755263dbaa15ba3796b0b8d3fe17cfb4ddf8143b268eac47bd893629a699470e4ec82a5715bb4981fdaacc5d0a728bf5f55b801d8f4ef10bad3228b676f7d3cd4284a5443f17f1962b36e491b30a40b2405849e597ba5fb5","sourceMap":"124:1474:34:-:0;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;124:1474:34;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;124:1474:34;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;:::i;:::-;;-1:-1:-1;;;;;124:1474:34;;2163:25:35;;2159:84;;124:1474:34;;13516:22:35;13512:79;;-1:-1:-1;13643:3:35;124:1474:34;;13620:21:35;;;;;-1:-1:-1;;;;;13666:13:35;;;;:::i;:::-;124:1474:34;;13666:27:35;13662:111;;-1:-1:-1;13806:5:35;;;;;;13643:3;124:1474:34;;13605:13:35;;13813:3;-1:-1:-1;;;;;13840:13:35;;;;:::i;:::-;124:1474:34;;-1:-1:-1;;;;;13857:13:35;124:1474:34;;13857:13:35;:::i;:::-;124:1474:34;;13840:30:35;13836:117;;124:1474:34;;13791:13:35;;13836:117;-1:-1:-1;;;;;13920:13:35;124:1474:34;;13920:13:35;:::i;:::-;124:1474:34;;13901:33:35;;;-1:-1:-1;13901:33:35;;124:1474:34;;-1:-1:-1;13901:33:35;13662:111;-1:-1:-1;;;;;124:1474:34;13744:13:35;;124:1474:34;13744:13:35;:::i;:::-;124:1474:34;;13720:38:35;;;-1:-1:-1;13720:38:35;;124:1474:34;;-1:-1:-1;13720:38:35;13620:21;-1:-1:-1;124:1474:34;;;13620:21:35;;;;;;;124:1474:34;;-1:-1:-1;;;;;124:1474:34;;;;;;;;;;-1:-1:-1;124:1474:34;;;2397:84:35;;124:1474:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;124:1474:34;;;;;2323:255:35;;;124:1474:34;;;-1:-1:-1;;;;;124:1474:34;;;2323:255:35;;;124:1474:34;;;;;;;2323:255:35;;;124:1474:34;;;;;;;-1:-1:-1;;;;;;124:1474:34;;;;;;;;;;;;;-1:-1:-1;;;;;;124:1474:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;124:1474:34;;;2629:15:35;124:1474:34;;;;;;;;-1:-1:-1;;;;;;124:1474:34;;;;;;;;;;2736:26:35;;124:1474:34;;;;;;;2800:25:35;;;124:1474:34;;;;;;;;;;;;;;;;;;;;13600:377:35;124:1474:34;;-1:-1:-1;124:1474:34;;-1:-1:-1;124:1474:34;-1:-1:-1;124:1474:34;;;;;;;-1:-1:-1;;;;;124:1474:34;;;;2908:44:35;;;:::i;:::-;;2863:233;124:1474:34;;;;;;;;;2863:233:35;2983:43;;3040:45;2983:43;;:::i;:::-;;3040:45;:::i;:::-;;2863:233;;124:1474:34;;;-1:-1:-1;;;;;124:1474:34;;;;;;;;;;;;;;;;-1:-1:-1;124:1474:34;;;-1:-1:-1;124:1474:34;;;;;;;;;;;;;;;;-1:-1:-1;124:1474:34;;;;;;;;;;-1:-1:-1;124:1474:34;;2629:15:35;124:1474:34;;-1:-1:-1;124:1474:34;13512:79:35;13561:19;;;-1:-1:-1;13561:19:35;;-1:-1:-1;13561:19:35;2159:84;2211:21;;;-1:-1:-1;2211:21:35;;-1:-1:-1;2211:21:35;124:1474:34;;;;;;;:::i;:::-;;;;;;;;;;-1:-1:-1;124:1474:34;;;;;;;;;-1:-1:-1;;124:1474:34;;;-1:-1:-1;;;;;124:1474:34;;;;;;;;;;:::o;:::-;;;-1:-1:-1;;;;;124:1474:34;;;;;;:::o;:::-;;;-1:-1:-1;;;;;124:1474:34;;;;;;:::o;:::-;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;6155:316:92;-1:-1:-1;;;;;124:1474:34;;2187:1:35;124:1474:34;;;-1:-1:-1;;;;;;;;;;;124:1474:34;;;;;;;;;;-1:-1:-1;;;;;124:1474:34;2187:1:35;124:1474:34;;;-1:-1:-1;;;;;;;;;;;124:1474:34;;;;;;;-1:-1:-1;;124:1474:34;;;;;735:10:120;;124:1474:34;-1:-1:-1;;;;;;;;;;;2187:1:35;;6346:40:92;6323:4;6400:11;:::o;6248:217::-;6442:12;2187:1:35;6442:12:92;:::o;6155:316::-;-1:-1:-1;;;;;124:1474:34;;;;;;-1:-1:-1;;;;;;;;;;;124:1474:34;;;;;;;;;;-1:-1:-1;;;;;124:1474:34;;;;;-1:-1:-1;;;;;;;;;;;124:1474:34;;;;;;;-1:-1:-1;;124:1474:34;;;;;735:10:120;;124:1474:34;-1:-1:-1;;;;;;;;;;;1318:33:35;-1:-1:-1;;;;;;;;;;;6346:40:92;124:1474:34;6346:40:92;6323:4;6400:11;:::o;6155:316::-;124:1474:34;;;-1:-1:-1;;;;;;;;;;;124:1474:34;;-1:-1:-1;;;;;;;;;;;124:1474:34;;;;;;;;;-1:-1:-1;;;;;;;;;;;124:1474:34;;-1:-1:-1;;;;;;;;;;;124:1474:34;;-1:-1:-1;;124:1474:34;6323:4:92;124:1474:34;;;735:10:120;;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;124:1474:34;;6346:40:92;6323:4;6400:11;:::o;6248:217::-;124:1474:34;6442:12:92;:::o","linkReferences":{}},"deployedBytecode":{"object":"0x60806040526004361015610011575f80fd5b5f3560e01c806301ffc9a7146100f45780630bece356146100ef578063248a9ca3146100ea5780632f2ff15d146100e557806336568abe146100e05780634d6d9ffb146100db5780635972185a146100d6578063682ed5f0146100d157806391d14854146100cc578063a217fddf146100c7578063d547741f146100c2578063ddba6537146100bd578063edce8bdc146100b85763ef913a4b146100b3575f80fd5b610a16565b61095e565b61088b565b61085c565b610842565b6107f4565b6105e6565b6105ac565b6103ac565b610350565b61031a565b6102b5565b610217565b34610195576020600319360112610195576004357fffffffff00000000000000000000000000000000000000000000000000000000811680910361019557807f7965db0b000000000000000000000000000000000000000000000000000000006020921490811561016b575b506040519015158152f35b7f01ffc9a7000000000000000000000000000000000000000000000000000000009150145f610160565b5f80fd5b9060206003198301126101955760043567ffffffffffffffff811161019557826023820112156101955780600401359267ffffffffffffffff84116101955760248483010111610195576024019190565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b346101955761028161022836610199565b5f80527f4c48d1d2b0f4f7485fc28e3db22341d96a20aa29e6efa8149da9751603abd4e06020527f6e0c24a6e293ff9b755263dbaa15ba3796b0b8d3fe17cfb4ddf8143b268eac475490919060ff161561029957610d9d565b6040516003821015610294576020918152f35b6101ea565b6102a1611287565b610d9d565b90816020910312610195573590565b346101955760206003193601126101955760206102df6004355f525f602052600160405f20015490565b604051908152f35b6003196040910112610195576004359060243573ffffffffffffffffffffffffffffffffffffffff811681036101955790565b346101955761034e61032b366102e7565b90610349610344825f525f602052600160405f20015490565b61130f565b612142565b005b346101955761035e366102e7565b3373ffffffffffffffffffffffffffffffffffffffff8216036103845761034e91612219565b7f6697b232000000000000000000000000000000000000000000000000000000005f5260045ffd5b346101955760206003193601126101955760043567ffffffffffffffff8111610195578060040160806003198336030112610195575f80527f4c48d1d2b0f4f7485fc28e3db22341d96a20aa29e6efa8149da9751603abd4e060205260ff7f6e0c24a6e293ff9b755263dbaa15ba3796b0b8d3fe17cfb4ddf8143b268eac4754161561059f575b61044761044260248401611192565b61137c565b60648201916001610458848461119c565b90500361056157906104a96104966104a261049d61049661049061048961048460446104e09a01611192565b611b30565b988761119c565b9061126e565b3691610b4d565b6122ee565b928061121d565b906001840154906040516104d7816104c960208201948560209181520190565b03601f198101835282610afd565b5190209161237c565b805161051f5761051b61050b6104fe845467ffffffffffffffff1690565b67ffffffffffffffff1690565b6040519081529081906020820190565b0390f35b61053361052e61055e926124c1565b6124ee565b7fd039601e000000000000000000000000000000000000000000000000000000005f52600452602490565b5ffd5b61055e61056e848461119c565b7f88b3170e000000000000000000000000000000000000000000000000000000005f52600160045260245250604490565b6105a7611287565b610433565b34610195575f6003193601126101955760206040517fbd893629a699470e4ec82a5715bb4981fdaacc5d0a728bf5f55b801d8f4ef10b8152f35b346101955760206003193601126101955760043567ffffffffffffffff8111610195578060040160a06003198336030112610195575f80527f4c48d1d2b0f4f7485fc28e3db22341d96a20aa29e6efa8149da9751603abd4e060205260ff7f6e0c24a6e293ff9b755263dbaa15ba3796b0b8d3fe17cfb4ddf8143b268eac475416156107e7575b61067c61044260248401611192565b6064820191600161068d848461119c565b90500361056157608481019060206106a5838561121d565b9050036107a957906106f46104966106ed6106e56106de61049d6104966104906106d761048460446107149c01611192565b9b8b61119c565b948761121d565b8101906102a6565b948061121d565b906001850154906040516104d7816104c960208201948560209181520190565b8051156107755761052e610727916124c1565b908082036107475761051b61050b6104fe855467ffffffffffffffff1690565b7f56ed1b63000000000000000000000000000000000000000000000000000000005f5260045260245260445ffd5b61055e827f56ed1b63000000000000000000000000000000000000000000000000000000005f52906044916004525f602452565b61055e6107b6838561121d565b7f24fadac8000000000000000000000000000000000000000000000000000000005f52602060045260245250604490565b6107ef611287565b61066d565b3461019557602060ff610836610809366102e7565b905f525f845260405f209073ffffffffffffffffffffffffffffffffffffffff165f5260205260405f2090565b54166040519015158152f35b34610195575f6003193601126101955760206040515f8152f35b346101955761034e61086d366102e7565b90610886610344825f525f602052600160405f20015490565b612219565b346101955761089936610199565b50505f80527f4c48d1d2b0f4f7485fc28e3db22341d96a20aa29e6efa8149da9751603abd4e06020527f6e0c24a6e293ff9b755263dbaa15ba3796b0b8d3fe17cfb4ddf8143b268eac475460ff1615610915575b7f2c1ed462000000000000000000000000000000000000000000000000000000005f5260045ffd5b61091d611287565b6108ed565b67ffffffffffffffff81160361019557565b601f19601f602060409481855280519182918282880152018686015e5f8582860101520116010190565b346101955760206003193601126101955761097e60043561048481610922565b67ffffffffffffffff8154166002600183015492019060405192608084019160208501526040840152606080840152815480915260a08301915f5260205f20905f5b8181106109ea5761051b856109de818703601f198101835282610afd565b60405191829182610934565b825473ffffffffffffffffffffffffffffffffffffffff168452602090930192600192830192016109c0565b34610195575f6003193601126101955761051b60405173ffffffffffffffffffffffffffffffffffffffff60015416602082015267ffffffffffffffff600254818116604084015260401c16606082015267ffffffffffffffff600354818116608084015260401c1660a082015260a081526109de60c082610afd565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b6060810190811067ffffffffffffffff821117610adc57604052565b610a93565b6040810190811067ffffffffffffffff821117610adc57604052565b90601f601f19910116810190811067ffffffffffffffff821117610adc57604052565b60405190610b2f604083610afd565b565b67ffffffffffffffff8111610adc57601f01601f191660200190565b929192610b5982610b31565b91610b676040519384610afd565b829481845281830111610195578281602093845f960137010152565b9080601f8301121561019557816020610b9e93359101610b4d565b90565b6020818303126101955780359067ffffffffffffffff8211610195570180820391608083126101955760405192610bd784610ac0565b823567ffffffffffffffff811161019557604091610bfa84601f19938701610b83565b8652011261019557604051610c0e81610ae1565b6020830135610c1c81610922565b81526040830135610c2c81610922565b60208201526020840152606082013567ffffffffffffffff811161019557610c549201610b83565b604082015290565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b9060018201809211610c9757565b610c5c565b60c001908160c011610c9757565b60f701908160f711610c9757565b6080019081608011610c9757565b60b701908160b711610c9757565b91908201809211610c9757565b908160011b9180830460021490151715610c9757565b81519167ffffffffffffffff8311610adc57680100000000000000008311610adc578154838355808410610d77575b506020610d389101915f5260205f2090565b5f5b838110610d475750505050565b6001906020610d6a855173ffffffffffffffffffffffffffffffffffffffff1690565b9401938184015501610d3a565b825f528360205f2091820191015b818110610d925750610d26565b5f8155600101610d85565b610da991810190610ba1565b9060208201610dc461044282515167ffffffffffffffff1690565b610dce8351611614565b92606084019367ffffffffffffffff610def865167ffffffffffffffff1690565b161561116a5760035491604083901c67ffffffffffffffff1693610e1d67ffffffffffffffff861642610cd4565b9460a0840195610e35875167ffffffffffffffff1690565b9067ffffffffffffffff82161161112b5750505160200151610e7290610e649067ffffffffffffffff16611b30565b9367ffffffffffffffff1690565b67ffffffffffffffff81168015159081611102575b506110ad575090610ef591610eb66002610eae610ea385611b87565b60e086015190611ca1565b950185611ea7565b610ec660c0830194855190611f49565b60406080610ee960015473ffffffffffffffffffffffffffffffffffffffff1690565b93015191015191611ffe565b610f22610f0a865167ffffffffffffffff1690565b67ffffffffffffffff165f52600460205260405f2090565b610f376104fe825467ffffffffffffffff1690565b61103b5750916002610fb5928694610fa8610f73610f64610f0a610fc39a9b5167ffffffffffffffff1690565b955167ffffffffffffffff1690565b859067ffffffffffffffff167fffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000825416179055565b6001840155519101610cf7565b5167ffffffffffffffff1690565b600254610fdc9060401c67ffffffffffffffff166104fe565b67ffffffffffffffff821611610ff157505f90565b611037907fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff6fffffffffffffffff00000000000000006002549260401b16911617600255565b5f90565b91611051611059945167ffffffffffffffff1690565b905192612074565b6110a75761055e611072835167ffffffffffffffff1690565b7fc1aea5f7000000000000000000000000000000000000000000000000000000005f5267ffffffffffffffff16600452602490565b60029150565b61055e906110c3855467ffffffffffffffff1690565b7feae35725000000000000000000000000000000000000000000000000000000005f5267ffffffffffffffff9081166004524260245216604452606490565b9050611123429161111e6104fe885467ffffffffffffffff1690565b610cd4565b11155f610e87565b7f9b772277000000000000000000000000000000000000000000000000000000005f524260045267ffffffffffffffff9081166024521660445260645ffd5b7f59d119e3000000000000000000000000000000000000000000000000000000005f5260045ffd5b35610b9e81610922565b9035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe181360301821215610195570180359067ffffffffffffffff821161019557602001918160051b3603831361019557565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b9035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe181360301821215610195570180359067ffffffffffffffff82116101955760200191813603831361019557565b9015611282578061127e9161121d565b9091565b6111f0565b335f9081527f4c48d1d2b0f4f7485fc28e3db22341d96a20aa29e6efa8149da9751603abd4e0602052604090205460ff16156112bf57565b7fe2517d3f000000000000000000000000000000000000000000000000000000005f52336004527fbd893629a699470e4ec82a5715bb4981fdaacc5d0a728bf5f55b801d8f4ef10b60245260445ffd5b805f525f60205260ff6113433360405f209073ffffffffffffffffffffffffffffffffffffffff165f5260205260405f2090565b54161561134d5750565b7fe2517d3f000000000000000000000000000000000000000000000000000000005f523360045260245260445ffd5b67ffffffffffffffff168061138e5750565b7f3ce598a9000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b60405190610100820182811067ffffffffffffffff821117610adc57604052606060e0838281528260208201528260408201525f838201525f60808201525f60a08201528260c08201520152565b8051600110156112825760400190565b805160071015611282576101000190565b8051600d1015611282576101c00190565b8051600e1015611282576101e00190565b805160081015611282576101200190565b8051600310156112825760800190565b8051600b1015611282576101800190565b8051600c1015611282576101a00190565b8051600410156112825760a00190565b8051156112825760200190565b8051600210156112825760600190565b805160101015611282576102200190565b80518210156112825760209160051b010190565b67ffffffffffffffff8111610adc5760051b60200190565b90611501826114df565b61150e6040519182610afd565b828152601f1961151e82946114df565b0190602036910137565b90602082519201517fffffffffffffffffffffffffffffffffffffffff00000000000000000000000081169260148110611560575050565b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000929350829060140360031b1b161690565b60405160a091906115a38382610afd565b6004815291601f1901825f5b8281106115bb57505050565b8060606020809385010152016115af565b906115d6826114df565b6115e36040519182610afd565b828152601f196115f382946114df565b01905f5b82811061160357505050565b8060606020809385010152016115f7565b61163061162b6116226113b9565b928084526124c1565b612530565b602082019080825251600f8110611b0557507f1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d493476116766116708351611407565b516125fb565b03611aca57600161169061168a8351611417565b516124ee565b03611a8f577f63746963616c2062797a616e74696e65206661756c7420746f6c6572616e63656116c36116708351611428565b03611a54576116db6116d58251611439565b51612617565b80516008811490811591611a24575b506119ea575061162b61175d6116d5836117216117106104fe61168a611762985161144a565b67ffffffffffffffff166060880152565b61172e611670825161145b565b60808701526117576117466104fe61168a845161146b565b67ffffffffffffffff1660a0880152565b5161147c565b6124c1565b90604081019180835251600581036119bf57506117886117828351611407565b51612530565b908151156119975761179a82516114f7565b9360c082019485525f5b8351811015611933576117ba6116d582866114cb565b80516014810361190857506117d16117d791611528565b60601c90565b73ffffffffffffffffffffffffffffffffffffffff811680156118c6575f5b8381106118325750509061182c600192611811838a516114cb565b9073ffffffffffffffffffffffffffffffffffffffff169052565b016117a4565b8161187761185e611844848d516114cb565b5173ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff1690565b14611884576001016117f6565b7f41fe18cc000000000000000000000000000000000000000000000000000000005f5273ffffffffffffffffffffffffffffffffffffffff831660045260245ffd5b7f59bff387000000000000000000000000000000000000000000000000000000005f5273ffffffffffffffffffffffffffffffffffffffff821660045260245ffd5b7f83e46ad2000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b509261178291945061194692505161148d565b61195081516115cc565b9260e081019384525f5b8251811015611991578061198a816119776116d5600195886114cb565b88519061198483836114cb565b526114cb565b500161195a565b50925050565b7f339e1ffb000000000000000000000000000000000000000000000000000000005f5260045ffd5b7f30c6792a000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b611a20906040519182917fd5edd2a500000000000000000000000000000000000000000000000000000000835260048301610934565b0390fd5b7f011b4d03dd8c01f1049143cf9c4c817e4b167f1d1b83e5c6f0f10d89ba1e7bce9150602083012014155f6116ea565b611a6461167061055e9251611428565b7fa19e609c000000000000000000000000000000000000000000000000000000005f52600452602490565b611a9f61168a61055e9251611417565b7ff71b722f000000000000000000000000000000000000000000000000000000005f52600452602490565b611ada61167061055e9251611407565b7fb8120dca000000000000000000000000000000000000000000000000000000005f52600452602490565b7fbc277732000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b67ffffffffffffffff1690815f52600460205260405f209167ffffffffffffffff83541615611b5c5750565b7ff761631b000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b6020611c26611b94611592565b611c0d611bab60408601611bb1611bab825161149d565b51612f9a565b611bba8561149d565b52611bc48461149d565b50611bd2611bab8251611407565b611bdb85611407565b52611be584611407565b50611bf3611bab82516114aa565b611bfc856114aa565b52611c06846114aa565b505161145b565b611c168261145b565b52611c208161145b565b506126ed565b910190611c348251516115cc565b905f5b83518051821015611c8a579080600192600c82145f14611c78575050611c5c8361279e565b611c6682866114cb565b52611c7181856114cb565b5001611c37565b611c8591611bab916114cb565b611c5c565b505050611c9791506126ed565b6020815191012090565b919091611cae83516114f7565b925f5b8151811015611e9457611cc481836114cb565b51805160418103611e69575080601b60ff611d13611d0d611ce7611d209661277d565b517fff000000000000000000000000000000000000000000000000000000000000001690565b60f81c90565b1610611e16575b84613048565b50611d2a81612818565b15801590611df8575b611dd05773ffffffffffffffffffffffffffffffffffffffff81165f5b838110611d7057505090611d6a60019261181183896114cb565b01611cb1565b81611d8161185e611844848c6114cb565b14611d8e57600101611d50565b7f33af0d5f000000000000000000000000000000000000000000000000000000005f5273ffffffffffffffffffffffffffffffffffffffff831660045260245ffd5b7f09cb44e6000000000000000000000000000000000000000000000000000000005f5260045ffd5b5073ffffffffffffffffffffffffffffffffffffffff811615611d33565b611e58611e30611e2b611d0d611ce78561277d565b612806565b60f81b7fff000000000000000000000000000000000000000000000000000000000000001690565b5f1a611e638261277d565b53611d1a565b7ff2db9ce1000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b505050565b5f198114610c975760010190565b905f915f5b8151811015611f0057611edf73ffffffffffffffffffffffffffffffffffffffff611ed783856114cb565b511684612822565b611eec575b600101611eac565b92611ef8600191611e99565b939050611ee4565b50506003611f0f915404610c89565b90818110611f1b575050565b7fe2dcb1b9000000000000000000000000000000000000000000000000000000005f5260045260245260445ffd5b905f915f5b8151811015611fa257611f8173ffffffffffffffffffffffffffffffffffffffff611f7983856114cb565b511684612879565b611f8e575b600101611f4e565b92611f9a600191611e99565b939050611f86565b5050518060011b9080820460021490151715610c97576003611fc49104610c89565b90818110611fd0575050565b7f7818f4e4000000000000000000000000000000000000000000000000000000005f5260045260245260445ffd5b6120489261162b9261175d926040517fffffffffffffffffffffffffffffffffffffffff000000000000000000000000602082019260601b168252601481526104d7603482610afd565b805160021015611282576060610b9e9101516125fb565b8054821015611282575f5260205f2001905f90565b919067ffffffffffffffff80612092855467ffffffffffffffff1690565b921691161490811591612133575b5061212d5760020190815481510361212d575f5b8151811015612125576120ea6120ca828561205f565b905473ffffffffffffffffffffffffffffffffffffffff9160031b1c1690565b73ffffffffffffffffffffffffffffffffffffffff61210f61185e61184485876114cb565b91160361211e576001016120b4565b5050505f90565b505050600190565b50505f90565b9050600182015414155f6120a0565b805f525f60205260ff6121768360405f209073ffffffffffffffffffffffffffffffffffffffff165f5260205260405f2090565b541661212d57805f525f6020526121ae8260405f209073ffffffffffffffffffffffffffffffffffffffff165f5260205260405f2090565b60017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0082541617905573ffffffffffffffffffffffffffffffffffffffff339216907f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d5f80a4600190565b805f525f60205260ff61224d8360405f209073ffffffffffffffffffffffffffffffffffffffff165f5260205260405f2090565b54161561212d57805f525f6020526122868260405f209073ffffffffffffffffffffffffffffffffffffffff165f5260205260405f2090565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00815416905573ffffffffffffffffffffffffffffffffffffffff339216907ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b5f80a4600190565b60208151910120604051602081019182527f1260944489272988d9df285149b5aa1b0f48f2136d6f416159f840a3e0747600604082015260408152612334606082610afd565b51902090565b60405190612349602083610afd565b5f808352366020840137565b9061235f82610b31565b61236c6040519182610afd565b828152601f1961151e8294610b31565b61162b6123be919493946123906020610b31565b9561239e6040519788610afd565b602087526123ac6020610b31565b601f19602089019101368237526124c1565b906123c98451610ce1565b9184511515806124a1575b6123dd906124e7565b6123ef6123ea5f85612940565b612355565b925f19015f5b818110612409575050610b9e939450612a70565b8061248b600f61244e612485611d0d611ce78d61242860029960011c90565b908d61247f8a6124778a61244e612445611d0d611ce78a8a61278d565b60041c600f1690565b1660f81b7fff000000000000000000000000000000000000000000000000000000000000001690565b5f1a9261278d565b5361278d565b60ff1690565b5f1a61249a600183018861278d565b53016123f5565b5060016123d4565b604051906124b682610ae1565b5f6020838281520152565b6124c96124a9565b506020815191604051926124dc84610ae1565b835201602082015290565b1561019557565b80518015159081612524575b50156101955761250990612d46565b90519060208110612518575090565b6020036101000a900490565b6021915011155f6124fa565b61253981612d72565b156101955761254781612d92565b612550816114df565b9161255e6040519384610afd565b818352601f1961256d836114df565b015f5b8181106125e4575050602061259091015161258a81612df3565b90610cd4565b5f905b8282106125a05750505090565b6125dc816125af600193612e5e565b906125b8610b20565b8281528160208201526125cb86896114cb565b526125d685886114cb565b50610cd4565b910190612593565b6020906125ef6124a9565b82828801015201612570565b6021815103610195576020015160018101809111610c97575190565b8051156101955761262a610b9e91612d46565b61263681939293612355565b928360200190612f27565b805191908290602001825e015f815290565b610b2f9061267561266f94936040519586936020850190612641565b90612641565b03601f198101845283610afd565b6001907fff00000000000000000000000000000000000000000000000000000000000000610b9e94931681520190612641565b916001610b9e94937fff0000000000000000000000000000000000000000000000000000000000000061266f941681520190612641565b5f9060605b815183101561271a5761271260019161270b85856114cb565b5190612653565b9201916126f2565b9150508051603881106127595750610b9e6127358251612fc6565b916104c9612749611e306124858651610caa565b91604051948593602085016126b6565b61276b611e30612485610b9e93610c9c565b6104c960405193849260208401612683565b8051604010156112825760600190565b908151811015611282570160200190565b6001815114806127eb575b610b9e578051603881106127d95750610b9e6127c58251612fc6565b916104c9612749611e306124858651610cc6565b61276b611e30612485610b9e93610cb8565b50608060ff6127ff611d0d611ce78561149d565b16106127a9565b60ff601b9116019060ff8211610c9757565b6004111561029457565b905f5b825481101561211e5773ffffffffffffffffffffffffffffffffffffffff61284d828561205f565b90549060031b1c1673ffffffffffffffffffffffffffffffffffffffff83161461212557600101612825565b905f5b825181101561211e5773ffffffffffffffffffffffffffffffffffffffff6128a482856114cb565b511673ffffffffffffffffffffffffffffffffffffffff8316146121255760010161287c565b905f198201918211610c9757565b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff408201918211610c9757565b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff808201918211610c9757565b6020039060208211610c9757565b91908203918211610c9757565b91906129598351610ce1565b908351151580612a66575b61296d906124e7565b61297a6123ea8284612940565b938192600180841614612a04575b5f19869101935b84811061299d575050505050565b836129fb60016129f1600f61244e612485611d0d611ce78b60029b6129ea6129dd8861244e8f611d0d611ce76129d66124459360011c90565b809961278d565b9b8d03809c5f1a9261278d565b538c61278d565b5f1a92018961278d565b5301859061298f565b92507f0f00000000000000000000000000000000000000000000000000000000000000612a43612485611d0d611ce7612a3d8760011c90565b8661278d565b60f81b165f1a612a528661149d565b535f19612a5e83611e99565b939050612988565b5081811115612964565b915f915f612a7c6124a9565b50845115612d0d5790935f915b81518310156101955782158080612cf7575b61019557159081612cda575b5061019557612ab961178283836114cb565b948551600281145f14612bb65750612adb612ad66116d58861149d565b6130dd565b95612af1612aea88888461314a565b8092610cd4565b965111612b985715612b285750612b0890516128ca565b11610195575111612b1f576116d5610b9e91611407565b50610b9e61233a565b919094612b3586516128ca565b82146101955780612b57612b53612b4d600194611407565b51612d72565b1590565b15612b7957612b68612b6e91611407565b516130cf565b915b01919490612a89565b612b85612b9291611407565b5160208101519051902090565b91612b70565b505091509250612ba99150516128ca565b1161019557610b9e61233a565b929491939192601103612c7b5781518314612c5d57612be7612be1612485611d0d611ce7878761278d565b93610c89565b92601081101561019557612c04612bfe82896114cb565b516130b9565b15612c265750505050612c19919250516128ca565b0361019557610b9e61233a565b86612c3e612b53612b4d84600196989a97999b6114cb565b15612c5057612b9291612b68916114cb565b612b9291612b85916114cb565b505050612c6a90516128ca565b03610195576116d5610b9e916114ba565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f696e76616c6964206e6f6465206c656e677468000000000000000000000000006044820152606490fd5b9050612cef612ce984846114cb565b51613082565b14155f612aa7565b50612d05612b8585856114cb565b871415612a9b565b509050612d3e92507f56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b4219150146124e7565b610b9e61233a565b906020820191612d568351612df3565b925190838201809211610c975751928303928311610c97579190565b805115612d8d57602060c0910151515f1a1061103757600190565b505f90565b805115612d8d575f9060208101908151612dab81612df3565b8101809111610c9757915190518101809111610c975791905b828110612dd15750905090565b612dda81612e5e565b8101809111610c9757612ded9091611e99565b90612dc4565b515f1a6080811015612e0457505f90565b60b881108015612e48575b15612e1a5750600190565b60c0811015612e3957610b9e90612e349060b75b90612940565b610c89565b610b9e90612e349060f7612e2e565b5060c08110158015612e0f575060f88110612e0f565b80515f1a906080821015612e73575050600190565b60b8821015612e895750612e34610b9e91612905565b60c0821015612eca5760010151602082900360b7016101000a9004017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff4a0190565b60f8821015612ee05750612e34610b9e916128d8565b60010151602082900360f7016101000a9004017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0a0190565b601f8111610c97576101000a90565b90918015611e94575b6020811015612f6a5780612f4357505050565b612f57612f52612f5c92612932565b612f18565b6128ca565b905182518216911916179052565b91908051825260208101809111610c97579060208101809111610c975791601f19810190811115612f3057610c5c565b612fa48151612355565b90815115612fc257806020610b9e9201519051908360200190612f27565b5090565b5f81805b6130345750612fd881612355565b91815b612fe457505090565b612fed826128ca565b61301f7fff000000000000000000000000000000000000000000000000000000000000008360f81b165f1a918561278d565b5360081c908015610c97575f19019081612fdb565b9061303e90611e99565b9060081c80612fca565b8151919060418303613078576130719250602082015190606060408401519301515f1a906131ee565b9192909190565b50505f9160029190565b8051602081101561309a575060208101519051902090565b9060200151206040516020810191825260208152612334604082610afd565b6001815103612d8d5760200151515f1a60801490565b6130d890612d46565b902090565b9081511561019557600f6130f9612445611d0d611ce78661149d565b168061310c5750610b9e60025f9361294d565b600181036131215750610b9e60015f9361294d565b600281036131375750610b9e600260019361294d565b60030361019557610b9e6001809361294d565b91905f5b838101808211610c975782518110806131e4575b156131dc576131927fff00000000000000000000000000000000000000000000000000000000000000918461278d565b51167fff000000000000000000000000000000000000000000000000000000000000006131bf838661278d565b511690036131d5576131d090611e99565b61314e565b9250505090565b509250505090565b5083518210613162565b91907f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0841161327d579160209360809260ff5f9560405194855216868401526040830152606082015282805260015afa15613272575f5173ffffffffffffffffffffffffffffffffffffffff81161561326857905f905f90565b505f906001905f90565b6040513d5f823e3d90fd5b5050505f916003919056fea164736f6c634300081c000a","sourceMap":"124:1474:34:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;;;;-1:-1:-1;;124:1474:34;;;;;;;;;;;;;;;2649:47:92;2664:32;124:1474:34;2649:47:92;;:87;;;;;124:1474:34;;;;;;;;;;2649:87:92;844:25:130;829:40;;;2649:87:92;;;124:1474:34;-1:-1:-1;124:1474:34;;;;;-1:-1:-1;;124:1474:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;3516:2265:35;124:1474:34;;;:::i;:::-;-1:-1:-1;124:1474:34;;;;;;;;;;;;17324:42:35;17320:105;;3516:2265;:::i;:::-;124:1474:34;;;;;;;;;;;;;;;:::i;17320:105:35:-;17393:20;;:::i;:::-;3516:2265;:::i;124:1474:34:-;;;;;;;;;;;:::o;:::-;;;;;-1:-1:-1;;124:1474:34;;;;;;;;;3877:6:92;124:1474:34;3877:6:92;124:1474:34;;3877:22:92;124:1474:34;3877:6:92;124:1474:34;3877:22:92;124:1474:34;3786:120:92;;124:1474:34;;;;;;;;-1:-1:-1;;124:1474:34;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;4306:25:92;124:1474:34;;;:::i;:::-;4276:18:92;2484:4;4276:18;;3877:6;124:1474:34;3877:6:92;124:1474:34;;3877:22:92;124:1474:34;3877:6:92;124:1474:34;3877:22:92;124:1474:34;3786:120:92;;4276:18;2484:4;:::i;:::-;4306:25;:::i;:::-;124:1474:34;;;;;;;;:::i;:::-;735:10:120;124:1474:34;;;5397:34:92;5393:102;;5505:37;;;:::i;5393:102::-;5454:30;;;124:1474:34;5454:30:92;;124:1474:34;;;;;-1:-1:-1;;124:1474:34;;;;;;;;;;;;;;;;-1:-1:-1;;124:1474:34;;;;;;;-1:-1:-1;124:1474:34;;;;;;;;;17324:42:35;17320:105;;124:1474:34;7178:31:35;;:16;;;:31;:::i;:::-;;:::i;:::-;7224:9;;;;7244:1;7224:9;;;;:::i;:::-;:21;;;7220:97;;7386:31;124:1474:34;7532:10:35;7450:36;124:1474:34;7473:12:35;:9;7367:51;7386:31;;7532:95;7386:31;;;:::i;:::-;7367:51;:::i;:::-;7473:9;;;:::i;:::-;:12;;:::i;:::-;124:1474:34;;;:::i;:::-;7450:36:35;:::i;:::-;7532:10;;;:::i;124:1474:34:-;7558:26:35;7244:1;7558:26;;124:1474:34;;;;7596:29:35;;;124:1474:34;7596:29:35;;;;124:1474:34;;;;;;;7596:29:35;;-1:-1:-1;;7596:29:35;;;;;;:::i;:::-;124:1474:34;7586:40:35;;7532:95;;:::i;:::-;124:1474:34;;7637:109:35;;124:1474:34;7755:31:35;124:1474:34;;;;;;;;;;;;7755:31:35;124:1474:34;;;;;;;;;;;;;;;;;7637:109:35;7704:29;:20;7684:51;7704:20;;:::i;:::-;:29;:::i;:::-;7684:51;-1:-1:-1;7684:51:35;124:1474:34;;;;;7684:51:35;-1:-1:-1;7684:51:35;7220:97;7268:38;7289:9;;;;:::i;:::-;7268:38;-1:-1:-1;7268:38:35;7244:1;124:1474:34;;;;-1:-1:-1;124:1474:34;;;17320:105:35;17393:20;;:::i;:::-;17320:105;;124:1474:34;;;;;-1:-1:-1;;124:1474:34;;;;;;;;1318:33:35;124:1474:34;;;;;;;;-1:-1:-1;;124:1474:34;;;;;;;;;;;;;;;;-1:-1:-1;;124:1474:34;;;;;;;-1:-1:-1;124:1474:34;;;;;;;;;17324:42:35;17320:105;;124:1474:34;5983:31:35;;:16;;;:31;:::i;:::-;6029:9;;;;6049:1;6029:9;;;;:::i;:::-;:21;;;6025:97;;6135:10;;;;124:1474:34;6135:10:35;;;;:::i;:::-;:23;;;6131:102;;6302:31;124:1474:34;6515:10:35;6436:33;6447:10;6366:36;124:1474:34;6389:12:35;:9;6283:51;6302:31;;6515:95;6302:31;;;:::i;6283:51::-;6389:9;;;:::i;6366:36::-;6447:10;;;:::i;:::-;6436:33;;;;:::i;:::-;6515:10;;;:::i;124:1474:34:-;6541:26:35;6049:1;6541:26;;124:1474:34;;;;6579:29:35;;;124:1474:34;6579:29:35;;;;124:1474:34;;;;;;;6515:95:35;124:1474:34;;6624:20:35;6620:107;;6767:20;:29;:20;;:::i;:29::-;6811:28;;;;6807:116;;124:1474:34;6932:31:35;124:1474:34;;;;;;;6807:116:35;6862:50;-1:-1:-1;6862:50:35;124:1474:34;;;;;-1:-1:-1;7684:51:35;6620:107;6667:49;;;-1:-1:-1;6667:49:35;124:1474:34;;;;;-1:-1:-1;124:1474:34;;;6131:102:35;6181:41;6204:10;;;;:::i;:::-;6181:41;-1:-1:-1;6181:41:35;124:1474:34;;;;;-1:-1:-1;124:1474:34;;;17320:105:35;17393:20;;:::i;:::-;17320:105;;124:1474:34;;;;;;2930:29:92;124:1474:34;;;:::i;:::-;;2930:6:92;124:1474:34;2930:6:92;124:1474:34;;;2930:6:92;124:1474:34;;;;;;;;;;;;;2930:29:92;124:1474:34;;;;;;;;;;;;;;;-1:-1:-1;;124:1474:34;;;;;;;;;;;;;;;;4723:26:92;124:1474:34;;;:::i;:::-;4693:18:92;2484:4;4693:18;;3877:6;124:1474:34;3877:6:92;124:1474:34;;3877:22:92;124:1474:34;3877:6:92;124:1474:34;3877:22:92;124:1474:34;3786:120:92;;2484:4;4723:26;:::i;124:1474:34:-;;;;;;;:::i;:::-;-1:-1:-1;;17363:1:35;124:1474:34;;;;;;;;;17324:42:35;17320:105;;124:1474:34;7887:25:35;17363:1;7887:25;124:1474:34;17363:1:35;7887:25;17320:105;17393:20;;:::i;:::-;17320:105;;124:1474:34;;;;;;;:::o;:::-;-1:-1:-1;;124:1474:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;-1:-1:-1;;124:1474:34;;;;;3361:34:35;124:1474:34;;;;;:::i;3361:34:35:-;124:1474:34;;;;3477:25:35;3449:26;;;124:1474:34;3477:25:35;;124:1474:34;;;;;;;3412:91:35;124:1474:34;3412:91:35;;124:1474:34;;;;;;;;;;;;;;;;;;;-1:-1:-1;124:1474:34;;-1:-1:-1;124:1474:34;;-1:-1:-1;124:1474:34;;;;;;;3412:91:35;;;;;-1:-1:-1;;3412:91:35;;;;;;:::i;:::-;124:1474:34;;;;;;;:::i;:::-;;;;;;;;;;;;3449:26:35;124:1474:34;;;;;;;;;;;;-1:-1:-1;;124:1474:34;;;;;;;;;3199:11:35;124:1474:34;;3188:23:35;;;124:1474:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3188:23:35;;;;;;:::i;124:1474:34:-;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;:::i;:::-;;;;;;;;;;;;;;;:::o;:::-;;;-1:-1:-1;;124:1474:34;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;:::i;:::-;:::o;:::-;;;;;;;;-1:-1:-1;;124:1474:34;;;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;-1:-1:-1;124:1474:34;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;:::i;:::-;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;-1:-1:-1;;124:1474:34;;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;:::o;:::-;;;;;;;;;;;;1404:66:35;124:1474:34;;;;;;;:::o;:::-;;:::i;:::-;16633:4:35;124:1474:34;;;16633:4:35;124:1474:34;;;:::o;:::-;16787:4:35;124:1474:34;;;16787:4:35;124:1474:34;;;:::o;:::-;16120:4:35;124:1474:34;;;16120:4:35;124:1474:34;;;:::o;:::-;16262:4:35;124:1474:34;;;16262:4:35;124:1474:34;;;:::o;:::-;;;;;;;;;;:::o;:::-;;;;;;;;;8355:1:37;124:1474:34;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;124:1474:34;;;-1:-1:-1;124:1474:34;;;;;;;;;;;;;;;;-1:-1:-1;124:1474:34;;;;;;3516:2265:35;3700:40;3516:2265;3700:40;;;;:::i;:::-;3771:18;;;;:33;124:1474:34;3771:18:35;;124:1474:34;;;;;3771:33:35;3845:28;3858:14;;3845:28;:::i;:::-;3887:13;;;;124:1474:34;;;;;;;;;;;3887:18:35;3883:77;;3991:25;124:1474:34;;;;;;;;3973:43:35;;124:1474:34;;;3973:15:35;:43;:::i;:::-;4019:16;;;;124:1474:34;;;;;;;;;3973:62:35;124:1474:34;;;-1:-1:-1;3969:178:35;;-1:-1:-1;;4223:18:35;3771;4223:33;124:1474:34;;;4204:53:35;;124:1474:34;;7367:51:35;:::i;4204:53::-;124:1474:34;;;;;;;;;4284:31:35;;;:139;;;;3516:2265;4267:298;;;4618:25;;4838:79;4618:25;4674:72;3991:25;4602:62;4618:25;;;:::i;:::-;4645:18;;;;4602:62;;:::i;:::-;4713:32;;4674:72;;:::i;:::-;4787:17;;;;;;;;;:::i;:::-;4899;4881:16;124:1474:34;3991:11:35;124:1474:34;;;;;;4881:16:35;;124:1474:34;4899:17:35;;;4838:79;;:::i;:::-;4976:30;124:1474:34;;;;;;;;;;;;4976:15:35;124:1474:34;;;;;;;4976:30:35;5020:37;124:1474:34;;;;;;;5020:37:35;5016:303;;124:1474:34;;3991:25:35;124:1474:34;;;;5412:46:35;124:1474:34;5372:30:35;124:1474:34;;;;;;;;;5372:30:35;124:1474:34;;;;;;;5412:46:35;124:1474:34;;;;;;;;;;;5412:46:35;3991:11;5468:29;;124:1474:34;5552:17:35;5521:28;;124:1474:34;:::i;:::-;;;;;;;3991:25:35;124:1474:34;5584:55:35;;124:1474:34;;;;;;5584:55:35;124:1474:34;;;5584:55:35;5580:141;;5731:43;3771:33;3516:2265;:::o;5580:141::-;5655:55;;124:1474:34;;3991:25:35;124:1474:34;;;;;;;;3991:25:35;124:1474:34;;5655:55:35;3771:33;3516:2265;:::o;5016:303::-;124:1474:34;;5077:95:35;124:1474:34;;;;;;;5154:17:35;;5077:95;;:::i;:::-;5073:175;;5268:40;124:1474:34;;;;;;;;5268:40:35;3771:33;5268:40;124:1474:34;;4976:15:35;124:1474:34;;;;5073:175:35;3991:25;;-1:-1:-1;5192:41:35:o;4267:298::-;4455:99;124:1474:34;;;;;;;;;4455:99:35;3771:33;4455:99;124:1474:34;;;;4455:99:35;124:1474:34;3973:15:35;124:1474:34;;;;;;;;4284:139:35;3973:15;;4335:69;3973:15;124:1474:34;4335:40:35;124:1474:34;;;;;;;4335:40:35;:69;:::i;:::-;:88;;4284:139;;;3969:178;4058:78;3771:33;4058:78;3973:15;4058:78;124:1474:34;;;;;;;;;;;-1:-1:-1;7684:51:35;3883:77;3928:21;3771:33;3928:21;;3771:33;3928:21;124:1474:34;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;:::i;:::-;;;:::o;:::-;;:::i;3175:103:92:-;735:10:120;2930:6:92;124:1474:34;;;;;;;;;;;;3495:23:92;3491:108;;3175:103::o;3491:108::-;3541:47;2930:6;3541:47;735:10:120;3541:47:92;124:1474:34;1318:33:35;124:1474:34;;;2930:6:92;3541:47;3175:103;124:1474:34;2930:6:92;124:1474:34;2930:6:92;124:1474:34;;;2930:29:92;735:10:120;124:1474:34;2930:6:92;124:1474:34;;;;;;;;;;;;;2930:29:92;124:1474:34;;3495:23:92;3491:108;;3175:103;:::o;3491:108::-;3541:47;2930:6;3541:47;735:10:120;3541:47:92;124:1474:34;;;;2930:6:92;3541:47;14970:177:35;124:1474:34;;15051:19:35;15047:94;;14970:177;:::o;15047:94::-;15093:37;15069:1;15093:37;;124:1474:34;;15069:1:35;15093:37;124:1474:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;124:1474:34;;;;-1:-1:-1;124:1474:34;;;;-1:-1:-1;124:1474:34;;;;;;;;;;;:::o;:::-;;;8387:1:35;124:1474:34;;;;;;;:::o;:::-;;;8556:1:35;124:1474:34;;;;;;;:::o;:::-;;;8695:2:35;124:1474:34;;;;;;;:::o;:::-;;;8881:2:35;124:1474:34;;;;;;;:::o;:::-;;;8924:1:35;124:1474:34;;;;;;;:::o;:::-;;;9154:1:35;124:1474:34;;;;;;;:::o;:::-;;;9227:2:35;124:1474:34;;;;;;;:::o;:::-;;;9295:2:35;124:1474:34;;;;;;;:::o;:::-;;;10526:1:35;124:1474:34;;;;;;;:::o;:::-;;;;;;;;;:::o;:::-;;;1131:1;124:1474;;;;;;;:::o;:::-;;;7692:2:37;124:1474:34;;;;;;;:::o;:::-;;;;;;;;;;;;;;;:::o;1404:66:35:-;;;;;;;;;;;:::o;:::-;;;;;:::i;:::-;124:1474:34;;;;;;:::i;:::-;1404:66:35;;;-1:-1:-1;;1404:66:35;;;;:::i;:::-;;;;;;;;:::o;:::-;;124:1474:34;;;;;1404:66:35;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;124:1474:34;1404:66:35;;;:::o;:::-;124:1474:34;;1404:66:35;;124:1474:34;;1404:66:35;124:1474:34;;:::i;:::-;937:1;1404:66:35;;;-1:-1:-1;;1404:66:35;;-1:-1:-1;1404:66:35;;;;;;;;;:::o;:::-;;124:1474:34;1404:66:35;;;;;;;;;;;;;;;:::i;:::-;124:1474:34;;;;;;:::i;:::-;1404:66:35;;;-1:-1:-1;;1404:66:35;;;;:::i;:::-;;;-1:-1:-1;1404:66:35;;;;;;;;;:::o;:::-;;124:1474:34;1404:66:35;;;;;;;;;;8026:2705;8192:30;:21;124:1474:34;;:::i;:::-;8133:28:35;;;;8192:21;:::i;:::-;:30;:::i;:::-;8171:18;;;:51;;;;124:1474:34;8264:2:35;8236:30;;8232:114;;8368:18;1522:66;8368:36;:21;:18;;:21;:::i;:::-;;:36;:::i;:::-;8360:66;8356:168;;8387:1;8537:30;:21;:18;;:21;:::i;:::-;;:30;:::i;:::-;:35;8533:122;;1404:66;8676:37;:22;:18;;:22;:::i;:37::-;8668:67;8664:167;;8862:32;:22;:18;;:22;:::i;:::-;;:32;:::i;:::-;124:1474:34;;8924:1:35;8908:17;;;;;:73;;;8026:2705;8904:130;;;9067:18;9342:21;9276:32;:22;9067:18;9044:54;9060:38;9067:30;:21;9342:30;9067:18;;:21;:::i;9060:38::-;124:1474:34;;9044:13:35;;;1404:66;;9044:54;9135:36;:21;:18;;:21;:::i;:36::-;9108:16;;;1404:66;9182:58;9201:39;9208:31;:22;:18;;:22;:::i;9201:39::-;124:1474:34;;9182:16:35;;;1404:66;;9182:58;9276:18;:22;:::i;:32::-;9342:21;:::i;:30::-;9318:21;;;;:54;;;;124:1474:34;9418:1:35;9386:33;;9382:123;;9559:21;:33;:24;:21;;:24;:::i;:::-;;:33;:::i;:::-;124:1474:34;;;9606:26:35;9602:83;;9715:36;124:1474:34;;9715:36:35;:::i;:::-;9695:17;;;;:56;;;-1:-1:-1;9808:3:35;124:1474:34;;9781:25:35;;;;;9857:27;:17;;;;:::i;:27::-;124:1474:34;;9927:2:35;9902:27;;9898:125;;10065:23;;10057:32;10065:23;;:::i;:::-;1404:66;;;;10057:32;124:1474:34;;;10107:23:35;;10103:103;;-1:-1:-1;10239:5:35;;;;;;10412:17;;;:32;8387:1;10412:17;:32;:17;;;:32;:::i;:::-;1404:66;124:1474:34;;1404:66:35;;;10412:32;1404:66;9766:13;;10246:3;10273:17;:33;:20;;:17;;;:20;:::i;:::-;124:1474:34;;;;;10273:20:35;124:1474:34;;;;10273:33:35;;10269:116;;8387:1;1404:66;10224:13;;10269:116;10337:29;-1:-1:-1;10337:29:35;124:1474:34;;;10157:34:35;124:1474:34;1404:66:35;-1:-1:-1;7684:51:35;10103:103;10157:34;-1:-1:-1;10157:34:35;124:1474:34;;;10157:34:35;124:1474:34;1404:66:35;-1:-1:-1;7684:51:35;9898:125;9956:52;-1:-1:-1;9956:52:35;124:1474:34;;;-1:-1:-1;7684:51:35;9781:25;;;10504:24;9781:25;;;10504:33;9781:25;;10504:21;:24;:::i;:33::-;10568:29;124:1474:34;;10568:29:35;:::i;:::-;10547:18;;;;:50;;;-1:-1:-1;10649:3:35;124:1474:34;;10627:20:35;;;;;10692:12;10668:46;10692:12;:22;:12;8387:1;10692:12;;;:::i;:22::-;10668:18;;:46;;;;;:::i;:::-;;;:::i;:::-;;1404:66;10612:13;;10627:20;;;;;8026:2705::o;9602:83::-;9655:19;-1:-1:-1;9655:19:35;;-1:-1:-1;9655:19:35;9382:123;9442:52;-1:-1:-1;9442:52:35;124:1474:34;;;-1:-1:-1;7684:51:35;8904:130;9004:19;124:1474:34;;;9004:19:35;;;;;;;;;;:::i;:::-;;;;8908:73;8949:32;124:1474:34;;8171:18:35;124:1474:34;;8929:16:35;:52;;8908:73;;;8664:167;8781:37;:22;8758:62;8781:18;;:22;:::i;:37::-;8758:62;-1:-1:-1;8758:62:35;124:1474:34;;;;;8533:122:35;8613:30;:21;8595:49;8613:18;;:21;:::i;:30::-;8595:49;-1:-1:-1;8595:49:35;124:1474:34;;;;;8356:168:35;8475:36;:21;8449:64;8475:18;;:21;:::i;:36::-;8449:64;-1:-1:-1;8449:64:35;124:1474:34;;;;;8232:114:35;8289:46;8133:16;8289:46;124:1474:34;;;-1:-1:-1;7684:51:35;14672:292;124:1474:34;;;;-1:-1:-1;124:1474:34;14812:15:35;124:1474:34;;;-1:-1:-1;124:1474:34;;;;;;14857:29:35;14853:105;;14672:292;:::o;14853:105::-;14909:38;-1:-1:-1;14909:38:35;14812:15;124:1474:34;;-1:-1:-1;14909:38:35;791:805:34;1319:18;1242:26;925:14;;:::i;:::-;15839:17:35;1174:24:34;979:21;;;15839:17:35;979:24:34;:21;;:24;:::i;:::-;;15839:17:35;:::i;:::-;949:55:34;;;:::i;:::-;;;;;:::i;:::-;;15839:17:35;1044:24:34;:21;;:24;:::i;15839:17:35:-;1014:55:34;;;:::i;:::-;;;;;:::i;:::-;;15839:17:35;1109:24:34;:21;;:24;:::i;15839:17:35:-;1079:55:34;;;:::i;:::-;;;;;:::i;:::-;;1174:21;:24;:::i;15839:17:35:-;1144:55:34;;;:::i;:::-;;;;;:::i;:::-;;1242:26;:::i;:::-;1319:18;;;1307:38;1319:18;;124:1474;1307:38;:::i;:::-;1360:13;1001:1;1406:3;1379:18;;124:1474;;1375:29;;;;;1442:82;;1066:1;1442:82;1447:2;1442:7;;:82;1447:2;;;1452:33;;;;;:::i;:::-;1425:99;;;;:::i;:::-;;;;;;:::i;:::-;;1404:66:35;1360:13:34;;1442:82;15839:17:35;1502:21:34;;;;:::i;15839:17:35:-;1442:82:34;;1375:29;;;;1561:27;1375:29;;1561:27;:::i;:::-;1319:18;124:1474;;;;1551:38;791:805;:::o;11363:509:35:-;;;;11495:27;124:1474:34;;11495:27:35;:::i;:::-;11537:13;11549:1;11570:3;124:1474:34;;11552:16:35;;;;;11629:8;;;;:::i;:::-;;124:1474:34;;11998:2:35;11983:17;;11979:95;;12093:8;;12105:2;124:1474:34;12087:15:35;12093:8;;12226:30;12093:8;;:::i;:::-;124:1474:34;;;;;12093:8:35;124:1474:34;;;;12087:15:35;124:1474:34;12087:20:35;12083:90;;11570:3;12226:30;;:::i;:::-;124:1474:34;;;;:::i;:::-;12270:33:35;;;:57;;;11570:3;12266:114;;124:1474:34;;;11549:1:35;11672:5;;;;;;11836:19;;;;1404:66;11836:19;;;;;:::i;:::-;1404:66;11537:13;;11679:3;11706:10;:20;:10;;;;;:::i;:20::-;;11702:107;;1404:66;;11657:13;;11702:107;11757:33;11549:1;11757:33;124:1474:34;;;10157:34:35;124:1474:34;1404:66:35;-1:-1:-1;7684:51:35;12266:114;12350:19;11549:1;12350:19;;11549:1;12350:19;12270:57;124:1474:34;;;;12307:20:35;12270:57;;12083:90;12134:28;12141:20;:15;12147:8;;;;:::i;12141:15::-;:20;:::i;:::-;124:1474:34;;;;;;12134:28:35;11549:1;12123:39;;;;:::i;:::-;;12083:90;;11979:95;12023:40;11549:1;12023:40;124:1474:34;;;-1:-1:-1;7684:51:35;11552:16;;;;11363:509::o;124:1474:34:-;-1:-1:-1;;124:1474:34;;;;;;;:::o;12415:540:35:-;;-1:-1:-1;12612:13:35;-1:-1:-1;12647:3:35;124:1474:34;;12627:18:35;;;;;12670:47;124:1474:34;12706:10:35;;;;:::i;:::-;124:1474:34;;12670:47:35;;:::i;:::-;12666:94;;12647:3;1404:66;;12612:13;;12666:94;12737:8;;1404:66;12737:8;;:::i;:::-;12666:94;;;;;12627:18;;;12826:1;12799:32;12627:18;124:1474:34;;12799:32:35;:::i;:::-;12845:17;;;;12841:108;;12415:540;;:::o;12841:108::-;12885:53;-1:-1:-1;12885:53:35;124:1474:34;;;;;-1:-1:-1;12885:53:35;12961:463;;-1:-1:-1;13100:13:35;-1:-1:-1;13135:3:35;124:1474:34;;13115:18:35;;;;;13158:39;124:1474:34;13186:10:35;;;;:::i;:::-;124:1474:34;;13158:39:35;;:::i;:::-;13154:86;;13135:3;1404:66;;13100:13;;13154:86;13217:8;;1404:66;13217:8;;:::i;:::-;13154:86;;;;;13115:18;;;124:1474:34;;1404:66:35;124:1474:34;;;;;13299:1:35;124:1474:34;;;;;;;13303:1:35;13279:29;:25;124:1474:34;13279:29:35;:::i;:::-;13322:17;;;;13318:100;;12961:463;;:::o;13318:100::-;13362:45;-1:-1:-1;13362:45:35;124:1474:34;;;;;-1:-1:-1;13362:45:35;10737:440;11083:31;10737:440;11083:22;10737:440;10955:76;10737:440;124:1474:34;;;11004:25:35;;;124:1474:34;;;;;;11004:25:35;;;;;;;:::i;11083:31::-;124:1474:34;;11152:1:35;124:1474:34;;;;;11139:30:35;124:1474:34;;11139:15:35;:30;:::i;124:1474:34:-;;;;;;;;-1:-1:-1;124:1474:34;;-1:-1:-1;124:1474:34;;;-1:-1:-1;124:1474:34;:::o;13989:677:35:-;;;124:1474:34;;;;;;;;;;;;;;14236:37:35;;;;:82;;;13989:677;14232:125;;;14370:25;;124:1474:34;;;;;14370:53:35;14366:96;;124:1474:34;14514:3:35;124:1474:34;;14491:21:35;;;;;124:1474:34;14537:28:35;;;;:::i;:::-;124:1474:34;;;;;;;;;;;;14537:45:35;14569:13;;;;;:::i;14537:45::-;124:1474:34;;14537:45:35;14533:96;;1404:66;;14476:13;;14533:96;14602:12;;;124:1474:34;14602:12:35;:::o;14491:21::-;;;;1404:66;13989:677;:::o;14366:96::-;14439:12;;124:1474:34;14439:12:35;:::o;14236:82::-;14277:26;;;;;124:1474:34;14277:41:35;;14236:82;;;6155:316:92;124:1474:34;;;;;;;2930:29:92;124:1474:34;;;;;;;;;;;;;;;;2930:29:92;124:1474:34;;;;;;;;;;6291:29:92;124:1474:34;;;;;;;;;;;;;;;;6291:29:92;6323:4;124:1474:34;;;;;;;;735:10:120;124:1474:34;;6346:40:92;;124:1474:34;6346:40:92;;6323:4;6400:11;:::o;6708:317::-;124:1474:34;;;;;;;2930:29:92;124:1474:34;;;;;;;;;;;;;;;;2930:29:92;124:1474:34;;;;;;;;;;;6844:29:92;124:1474:34;;;;;;;;;;;;;;;;6844:29:92;124:1474:34;;;;;;;735:10:120;124:1474:34;;6900:40:92;;124:1474:34;6900:40:92;;124:1474:34;6954:11:92;:::o;11183:174:35:-;124:1474:34;;;;;11307:18:35;124:1474:34;;;11296:53:35;;124:1474:34;;;1652:66:35;124:1474:34;;;;;11296:53:35;;;;;;:::i;:::-;124:1474:34;11286:64:35;;11183:174;:::o;124:1474:34:-;;;;;;;;:::i;:::-;2680:1:37;124:1474:34;;;1404:66:35;124:1474:34;;;1404:66:35;124:1474:34:o;:::-;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;-1:-1:-1;;124:1474:34;;;;:::i;1295:390:37:-;1615:20;:29;1295:390;;;;124:1474:34;1516:2:37;124:1474:34;:::i;:::-;;;;;;;;:::i;:::-;1516:2:37;124:1474:34;;;1516:2:37;124:1474:34;:::i;:::-;-1:-1:-1;;1516:2:37;124:1474:34;;;;1404:66:35;;;1529:63:37;1615:20;:::i;:29::-;1656:21;8343:13;124:1474:34;;8343:13:37;:::i;:::-;124:1474:34;;;8374:13:37;;:33;;;1295:390;8366:42;;;:::i;:::-;8429:26;8439:15;-1:-1:-1;8439:15:37;;:::i;:::-;8429:26;:::i;:::-;8465:18;-1:-1:-1;;124:1474:34;1675:1:37;8651:14;;;;;;1608:70;;;;;;;:::i;8667:6::-;8732:5;8796:37;8748:3;8804:21;:16;8810:9;;8732:5;;8355:1;8732:5;124:1474:34;;;;8732:5:37;8729:9;;8693:59;8729:9;8715:37;8729:9;8723:21;:16;8729:9;;;;;:::i;8723:16::-;124:1474:34;;;;;;8723:21:37;8722:29;124:1474:34;;;;;;8715:37:37;1675:1;8693:59;;;:::i;:::-;;8810:9;:::i;8804:16::-;124:1474:34;;;;8796:37:37;1675:1;8770:63;;8506:1;124:1474:34;;8770:63:37;;:::i;:::-;;124:1474:34;8644:204:37;;8374:33;-1:-1:-1;8391:16:37;8374:33;;124:1474:34;;;;;;;:::i;:::-;-1:-1:-1;124:1474:34;;;;;;;:::o;1812:221:38:-;124:1474:34;;:::i;:::-;;1923:58:38;124:1474:34;;;;;;;;;:::i;:::-;1404:66:35;;1923:58:38;;1998:28;;1404:66:35;1812:221:38;:::o;124:1474:34:-;;;;:::o;6361:439:38:-;124:1474:34;;6448:12:38;;;:30;;;;6361:439;124:1474:34;;;;6522:21:38;;;:::i;:::-;6554:14;6578:192;;;;;;;6780:13;6361:439;:::o;6578:192::-;;;;;;;6361:439;:::o;6448:30::-;6476:2;6464:14;;;;6448:30;;;3245:519;3341:12;;;:::i;:::-;124:1474:34;;;3381:14:38;;;:::i;:::-;1404:66:35;;;:::i;:::-;124:1474:34;;;;;;;:::i;:::-;1404:66:35;;;-1:-1:-1;;124:1474:34;;;:::i;:::-;;-1:-1:-1;124:1474:34;;;;;;3479:11:38;;124:1474:34;3479:41:38;:11;;124:1474:34;3493:27:38;;;:::i;:::-;3479:41;;:::i;:::-;-1:-1:-1;3555:179:38;3575:9;;;;;;3744:13;;;3245:519;:::o;3586:3::-;3707:16;3615:19;;1404:66:35;3615:19:38;;:::i;:::-;124:1474:34;;;:::i;:::-;1404:66:35;;;3660:24:38;124:1474:34;3660:24:38;;1404:66:35;3648:36:38;;;;:::i;:::-;;;;;;:::i;:::-;;3707:16;:::i;:::-;3586:3;1404:66:35;3560:13:38;;;124:1474:34;;;;;:::i;:::-;;;;;;;;;;6837:298:38;6969:2;124:1474:34;;6957:14:38;124:1474:34;;7024:11:38;;124:1474:34;7038:1:38;124:1474:34;;;;;;;7049:56:38;6837:298;:::o;7141:379::-;124:1474:34;;7234:12:38;124:1474:34;;7290:21:38;7486:3;7290:21;;:::i;:::-;7343:14;;;;;;:::i;:::-;7393:61;;;;7486:3;;:::i;124:1474:34:-;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;:::i;:::-;;;:::i;:::-;;-1:-1:-1;;124:1474:34;;;;;;:::i;:::-;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;16315:523:35:-;-1:-1:-1;;124:1474:34;16476:3:35;124:1474:34;;16458:16:35;;;;;16505:31;1404:66;16527:8;;;;;:::i;:::-;;16505:31;;:::i;:::-;16476:3;1404:66;16443:13;;;16458:16;;;;124:1474:34;;16578:2:35;16561:19;;16557:120;;124:1474:34;16757:74:35;16711:29;124:1474:34;;16711:29:35;:::i;:::-;124:1474:34;16757:74:35;16774:37;16781:29;16787:22;124:1474:34;;16787:22:35;:::i;16774:37::-;124:1474:34;;;16757:74:35;;;;;;;:::i;16557:120::-;16620:36;16627:28;16633:21;16603:63;16633:21;;:::i;16620:36::-;16603:63;124:1474:34;;16603:63:35;;;;;;;:::i;124:1474:34:-;;;12098:2:35;124:1474:34;;;;;;;:::o;:::-;;;;;;;;;;;;;:::o;15869:440:35:-;15977:1;124:1474:34;;15963:15:35;:39;;;15869:440;15959:80;;124:1474:34;;16065:2:35;16052:15;;16048:108;;124:1474:34;16232:70:35;16190:25;124:1474:34;;16190:25:35;:::i;:::-;124:1474:34;16232:70:35;16249:37;16256:29;16262:22;124:1474:34;;16262:22:35;:::i;16048:108::-;16107:32;16114:24;16120:17;16090:55;16120:17;;:::i;15963:39::-;15988:6;15998:4;124:1474:34;15982:13:35;15988:6;;;;:::i;15982:13::-;124:1474:34;15982:20:35;15963:39;;124:1474:34;;;;;;;;;;;;:::o;:::-;;-1:-1:-1;124:1474:34;;;:::o;15153:284:35:-;;124:1474:34;15307:3:35;124:1474:34;;15284:21:35;;;;;124:1474:34;15330:13:35;;;;:::i;:::-;124:1474:34;;;;;;;;;;15330:23:35;15326:73;;1404:66;;15269:13;;15443:282;;124:1474:34;15595:3:35;124:1474:34;;15572:21:35;;;;;124:1474:34;15618:13:35;;;;:::i;:::-;124:1474:34;;;;;15618:23:35;15614:73;;1404:66;;15557:13;;124:1474:34;;-1:-1:-1;;124:1474:34;;;;;;;:::o;:::-;;;;;;;;;;:::o;:::-;;;;;;;;;;:::o;:::-;;;;;;;;;:::o;:::-;;;;;;;;;;:::o;8215:649:37:-;;;8343:13;124:1474:34;;8343:13:37;:::i;:::-;124:1474:34;;;8374:13:37;;:33;;;8215:649;8366:42;;;:::i;:::-;8429:26;8439:15;;;;:::i;8429:26::-;8465:18;;8497:10;8506:1;8497:10;;;:15;8493:118;;8215:649;-1:-1:-1;;124:1474:34;;;8644:204:37;8651:14;;;;;;8215:649;;;;;:::o;8667:6::-;8732:5;8770:63;8506:1;8796:37;8748:3;8804:21;:16;8810:9;;8732:5;8355:1;8732:5;8693:59;8715:37;8732:5;8723:21;8732:5;8729:9;;8732:5;8723:16;8732:5;124:1474:34;;;;8732:5:37;8729:9;;;:::i;8715:37::-;124:1474:34;;;8693:59:37;;8386:1;8693:59;;;:::i;:::-;;8810:9;;:::i;8796:37::-;8386:1;8770:63;124:1474:34;;8770:63:37;;:::i;:::-;;124:1474:34;8644:204:37;;;;8493:118;8558:10;;124:1474:34;8549:26:37;:21;8555:14;;8558:10;;124:1474:34;;;;8558:10:37;8555:14;;:::i;8549:26::-;124:1474:34;;;8386:1:37;8528:55;;;;:::i;:::-;;-1:-1:-1;;8597:3:37;;;:::i;:::-;8493:118;;;;;8374:33;-1:-1:-1;8391:16:37;;;;8374:33;;2450:5418;;2680:1;2691:20;2680:1;124:1474:34;;:::i;:::-;;;;2810:17:37;2806:223;;3097:13;;2680:1;3092:4724;3130:3;124:1474:34;;3112:16:37;;;;;3212:6;;;;:50;;3130:3;3208:97;;3419:6;:47;;;;3130:3;3415:94;;;3635:17;:8;;;;:::i;:17::-;124:1474:34;;;3686:1:37;3671:16;;3667:4139;3686:1;;;3865:7;3837:46;3865:17;:7;;;:::i;:17::-;3837:46;:::i;:::-;3925:56;3999:28;3925:56;;;;;:::i;:::-;3999:28;;;:::i;:::-;124:1474:34;;-1:-1:-1;4046:994:37;;5058:1185;;;124:1474:34;5136:16:37;124:1474:34;;5136:16:37;:::i;:::-;-1:-1:-1;5128:144:37;;124:1474:34;-1:-1:-1;5294:109:37;;5436:7;5472:18;5436:7;;:::i;5294:109::-;5368:12;;;:::i;5058:1185::-;124:1474:34;;;5615:16:37;124:1474:34;;5615:16:37;:::i;:::-;5610:21;;5606:138;;5771:7;5770:17;5771:16;:7;1404:66:35;5771:7:37;;:::i;:::-;;:16;:::i;:::-;5770:17;;124:1474:34;5770:17:37;5771:7;;;5958;:26;:7;;:::i;:::-;;:26;:::i;:::-;5766:459;;1404:66:35;3097:13:37;;;;;5766:459;6175:7;:27;:7;;:::i;:::-;;4455:11:38;;;124:1474:34;;;4532:62:38;;4351:272;;6175:27:37;5766:459;;;4046:994;124:1474:34;;;;;;4839:16:37;124:1474:34;;;4839:16:37;:::i;:::-;-1:-1:-1;4831:149:37;;5009:12;;:::i;3667:4139::-;6267:17;;;;;;6282:2;6267:17;6282:2;;124:1474:34;;6340:36:37;;6356:20;;6572:17;6507:43;6515:34;6521:27;;;;;:::i;6507:43::-;6572:17;;:::i;:::-;6615:12;6625:2;6615:12;;;6611:146;;6783:33;6803:12;;;;:::i;:::-;;6783:33;:::i;:::-;6803:12;;;124:1474:34;;;;6887:16:37;124:1474:34;;;;6887:16:37;:::i;:::-;6882:21;6878:157;;7068:12;;:::i;6779:555::-;7114:12;7113:22;7114:21;:12;;1404:66:35;7114:12:37;;;;;;;:::i;7113:22::-;7114:12;;;7178:31;:12;;;;:::i;7109:225::-;7279:32;:12;;;;:::i;6336:1388::-;124:1474:34;;;7532:16:37;124:1474:34;;7532:16:37;:::i;:::-;7527:21;7523:135;;7687:8;:18;:8;;:::i;6263:1543::-;124:1474:34;;7762:29:37;;;124:1474:34;7762:29:37;;;124:1474:34;;;;;;;;;;;;;9004:19:35;3419:47:37;3457:8;;3445:21;3457:8;;;;:::i;:::-;;3445:21;:::i;:::-;3429:37;;3419:47;;;3212:50;3234:8;:28;:8;;;;:::i;:28::-;3222:40;;;3212:50;;2806:223;2906:78;;;2898:87;2906:78;;2918:66;2906:78;;;2898:87;:::i;:::-;3006:12;;:::i;2689:281:38:-;;2818:11;;;124:1474:34;2803:27:38;124:1474:34;;2803:27:38;:::i;:::-;124:1474:34;;;;;;;;;;;;;;;;;;;;2943:20:38;2689:281;:::o;3868:321::-;124:1474:34;;3948:13:38;3944:31;;4024:11;627:4;4024:11;;124:1474:34;4045:64:38;124:1474:34;4045:64:38;4123:24;4119:42;;4178:4;3868:321;:::o;3944:31::-;3963:12;124:1474:34;3963:12:38;:::o;7628:424::-;124:1474:34;;7712:13:38;7708:27;;124:1474:34;7791:11:38;;;;124:1474:34;;;7805:27:38;;;:::i;:::-;124:1474:34;;;;;;;;;;;;;;;;;;7891:132:38;;7898:16;;;;;;8033:12;;;7628:424;:::o;7891:132::-;7950:20;;;:::i;:::-;124:1474:34;;;;;;;8005:7:38;7930:40;8005:7;;:::i;:::-;7891:132;;;9416:581;9520:64;124:1474:34;9520:64:38;538:4;9598:26;;538:4;;;9640:8;124:1474:34;9640:8:38;:::o;9594:397::-;583:4;9669:25;;:83;;;;9594:397;9665:326;;;9768:8;9775:1;9768:8;:::o;9665:326::-;627:4;9797:24;;627:4;;;9874:35;;:31;;670:4;9874:31;;;:::i;:::-;:35;:::i;9793:198::-;9947:33;;:29;;670:4;9947:29;124:1474:34;9669:83:38;9699:25;627:4;9699:25;;;:52;;9669:83;9699:52;9728:23;670:4;9728:23;;9669:83;;8101:1263;8227:64;;-1:-1:-1;8227:64:38;;538:4;8305:26;;538:4;;;8347:11;;8357:1;8101:1263;:::o;8301:1032::-;583:4;8379:25;;583:4;;;8430:26;;:30;:26;;:::i;8375:958::-;627:4;8481:24;;627:4;;;8521:385;;;;;;;;;;;;;;;;124:1474:34;:::o;8477:856:38:-;670:4;8926:23;;670:4;;;8975:24;;:28;:24;;:::i;8922:411::-;9034:289;;;;;;;;;;;;;;;;124:1474:34;:::o;707:2:38:-;;;;;;;;;:::o;10155:770::-;;;10236:8;;10232:21;;10317:16;707:2;10317:16;;;;;10518:7;10514:405;;10155:770;;;:::o;10514:405::-;10640:24;10648:15;10640:28;10648:15;;:::i;:::-;10640:24;:::i;:::-;:28;:::i;:::-;10682:227;;;;;;;;;;;;10155:770::o;10335:16::-;10367:65;;;;;;707:2;124:1474:34;;;;;;;10476:17:38;707:2;124:1474:34;;;;;;;10335:16:38;-1:-1:-1;;124:1474:34;;;;;;10310:194:38;124:1474:34;;:::i;5161:337:38:-;5271:19;124:1474:34;;5271:19:38;:::i;:::-;124:1474:34;;;5304:18:38;5300:37;;5441:11;5369:57;5459:8;5441:11;;124:1474:34;;;5369:57:38;;;;5459:8;;:::i;5300:37::-;5324:13;;:::o;16844:430:35:-;-1:-1:-1;16929:19:35;;16989:8;;;17084:17;;;;:::i;:::-;17111:11;17132:116;17157:5;;;17257:10;;16844:430;:::o;17164:3::-;17187:5;;;:::i;:::-;17183:31;124:1474:34;;;;;-1:-1:-1;17183:31:35;;;;:::i;:::-;;124:1474:34;;17164:3:35;124:1474:34;;;;-1:-1:-1;;124:1474:34;17137:18:35;;;;16982:73;17013:8;;;;:::i;:::-;124:1474:34;17043:1:35;124:1474:34;16982:73:35;;;2129:778:129;124:1474:34;;;2129:778:129;2319:2;2299:22;;2319:2;;2751:25;2535:196;;;;;;;;;;;;;;;-1:-1:-1;2535:196:129;2751:25;;:::i;:::-;2744:32;;;;;:::o;2295:606::-;2807:83;;2823:1;2807:83;2827:35;2807:83;;:::o;10497:270:37:-;124:1474:34;;10608:2:37;10596:14;;10608:2;;;4455:11:38;10608:2:37;4455:11:38;;124:1474:34;;;4532:62:38;;10626:32:37;:::o;10592:169::-;4455:11:38;10608:2:37;4455:11:38;124:1474:34;4532:62:38;124:1474:34;;10608:2:37;10706:43;;124:1474:34;;;10608:2:37;10706:43;;;124:1474:34;10706:43:37;;:::i;7874:335::-;7989:1;124:1474:34;;7977:13:37;7973:56;;8072:11;;124:1474:34;8093:60:37;124:1474:34;8093:60:37;8174:4;8169:9;;7874:335::o;4781:270:38:-;4902:21;4781:270;4902:21;:::i;:::-;4957:65;;4781:270;:::o;8870:729:37:-;;124:1474:34;;9000:13:37;124:1474:34;;9066:3:37;9046:17;:12;9052:5;;;;:::i;9046:17::-;:23;9111:16;;;9143:10;9566:25;9152:1;124:1474:34;9107:434:37;9566:25;:::i;9107:434::-;9217:1;9202:16;;9217:1;;9234:10;9566:25;9217:1;124:1474:34;9198:343:37;9566:25;:::i;9198:343::-;9308:1;9293:16;;9308:1;;9325:10;9566:25;9308:1;9217;9289:252;9566:25;:::i;9289:252::-;9398:1;9383:16;9398:1;;9566:25;9217:1;9439:13;9379:162;9566:25;:::i;9605:320::-;;;124:1474:34;9800:3:37;124:1474:34;;;;;;;;;;9757:24:37;;:41;;;9800:3;9757:41;;;9823:16;124:1474:34;;9823:16:37;;:::i;:::-;124:1474:34;;;9843:5:37;;;;:::i;:::-;124:1474:34;;9823:25:37;;9819:72;;9800:3;;;:::i;:::-;9750:151;;9819:72;9868:8;;;;;:::o;9757:41::-;;;;;;9605:320;:::o;9757:41::-;124:1474:34;;;9785:13:37;;9757:41;;5203:1551:129;;;6283:66;6270:79;;6266:164;;124:1474:34;;;;;;-1:-1:-1;124:1474:34;;;;;;;;;;;;;;;;;;;6541:24:129;;;;;;;;;-1:-1:-1;6541:24:129;124:1474:34;;;6579:20:129;6575:113;;6698:49;-1:-1:-1;6698:49:129;-1:-1:-1;5203:1551:129;:::o;6575:113::-;6615:62;-1:-1:-1;6615:62:129;6541:24;6615:62;-1:-1:-1;6615:62:129;:::o;6541:24::-;124:1474:34;;;;;;;;;6266:164:129;6365:54;;;6381:1;6365:54;6385:30;6365:54;;:::o","linkReferences":{}},"methodIdentifiers":{"DEFAULT_ADMIN_ROLE()":"a217fddf","PROOF_SUBMITTER_ROLE()":"5972185a","getClientState()":"ef913a4b","getConsensusState(uint64)":"edce8bdc","getRoleAdmin(bytes32)":"248a9ca3","grantRole(bytes32,address)":"2f2ff15d","hasRole(bytes32,address)":"91d14854","misbehaviour(bytes)":"ddba6537","renounceRole(bytes32,address)":"36568abe","revokeRole(bytes32,address)":"d547741f","supportsInterface(bytes4)":"01ffc9a7","updateClient(bytes)":"0bece356","verifyMembership((bytes,(uint64,uint64),bytes[],bytes))":"682ed5f0","verifyNonMembership((bytes,(uint64,uint64),bytes[]))":"4d6d9ffb"},"rawMetadata":"{\"compiler\":{\"version\":\"0.8.28+commit.7893614a\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"ibcRouter\",\"type\":\"address\"},{\"internalType\":\"uint64\",\"name\":\"initialTrustedHeight\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"initialTrustedTimestamp\",\"type\":\"uint64\"},{\"internalType\":\"bytes32\",\"name\":\"initialTrustedStorageRoot\",\"type\":\"bytes32\"},{\"internalType\":\"address[]\",\"name\":\"initialTrustedValidators\",\"type\":\"address[]\"},{\"internalType\":\"uint64\",\"name\":\"trustingPeriod\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"maxClockDrift\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"roleManager\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"AccessControlBadConfirmation\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"internalType\":\"bytes32\",\"name\":\"neededRole\",\"type\":\"bytes32\"}],\"name\":\"AccessControlUnauthorizedAccount\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"revisionHeight\",\"type\":\"uint64\"}],\"name\":\"ConflictingConsensusState\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"trustedTimestamp\",\"type\":\"uint64\"},{\"internalType\":\"uint256\",\"name\":\"currentTimestamp\",\"type\":\"uint256\"},{\"internalType\":\"uint64\",\"name\":\"trustingPeriod\",\"type\":\"uint64\"}],\"name\":\"ConsensusStateExpired\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"revisionHeight\",\"type\":\"uint64\"}],\"name\":\"ConsensusStateNotFound\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"signer\",\"type\":\"address\"}],\"name\":\"DuplicateCommitSealSigner\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"validator\",\"type\":\"address\"}],\"name\":\"DuplicateValidator\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"EmptyValidatorSet\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"currentTimestamp\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"headerTimestamp\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxClockDrift\",\"type\":\"uint256\"}],\"name\":\"HeaderFromFuture\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"actual\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"required\",\"type\":\"uint256\"}],\"name\":\"InsufficientTrustedValidatorOverlap\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"actual\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"required\",\"type\":\"uint256\"}],\"name\":\"InsufficientValidatorQuorum\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidCommitSeal\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"expectedValue\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"actualValue\",\"type\":\"bytes32\"}],\"name\":\"InvalidCommitmentValue\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"actualDifficulty\",\"type\":\"uint256\"}],\"name\":\"InvalidDifficulty\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"length\",\"type\":\"uint256\"}],\"name\":\"InvalidECDSASignatureLength\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"itemsLength\",\"type\":\"uint256\"}],\"name\":\"InvalidExtraDataFormat\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"itemsLength\",\"type\":\"uint256\"}],\"name\":\"InvalidHeaderFormat\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidHeaderHeight\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"actualMixHash\",\"type\":\"bytes32\"}],\"name\":\"InvalidMixHash\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"actualNonce\",\"type\":\"bytes\"}],\"name\":\"InvalidNonce\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"actualOmmersHash\",\"type\":\"bytes32\"}],\"name\":\"InvalidOmmersHash\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"expectedLength\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"actualLength\",\"type\":\"uint256\"}],\"name\":\"InvalidPathLength\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"providedRevisionNumber\",\"type\":\"uint64\"}],\"name\":\"InvalidRevisionNumber\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"validator\",\"type\":\"address\"}],\"name\":\"InvalidValidatorAddress\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"length\",\"type\":\"uint256\"}],\"name\":\"InvalidValidatorAddressLength\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"expectedLength\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"actualLength\",\"type\":\"uint256\"}],\"name\":\"InvalidValueLength\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"UnsupportedMisbehaviour\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"actualValue\",\"type\":\"bytes32\"}],\"name\":\"ValueExists\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"previousAdminRole\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"newAdminRole\",\"type\":\"bytes32\"}],\"name\":\"RoleAdminChanged\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"RoleGranted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"RoleRevoked\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"DEFAULT_ADMIN_ROLE\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"PROOF_SUBMITTER_ROLE\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getClientState\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"revisionHeight\",\"type\":\"uint64\"}],\"name\":\"getConsensusState\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"}],\"name\":\"getRoleAdmin\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"grantRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"hasRole\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"name\":\"misbehaviour\",\"outputs\":[],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"callerConfirmation\",\"type\":\"address\"}],\"name\":\"renounceRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"revokeRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes4\",\"name\":\"interfaceId\",\"type\":\"bytes4\"}],\"name\":\"supportsInterface\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"updateMsg\",\"type\":\"bytes\"}],\"name\":\"updateClient\",\"outputs\":[{\"internalType\":\"enum ILightClientMsgs.UpdateResult\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes\",\"name\":\"proof\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"uint64\",\"name\":\"revisionNumber\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"revisionHeight\",\"type\":\"uint64\"}],\"internalType\":\"struct IICS02ClientMsgs.Height\",\"name\":\"proofHeight\",\"type\":\"tuple\"},{\"internalType\":\"bytes[]\",\"name\":\"path\",\"type\":\"bytes[]\"},{\"internalType\":\"bytes\",\"name\":\"value\",\"type\":\"bytes\"}],\"internalType\":\"struct ILightClientMsgs.MsgVerifyMembership\",\"name\":\"msg_\",\"type\":\"tuple\"}],\"name\":\"verifyMembership\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes\",\"name\":\"proof\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"uint64\",\"name\":\"revisionNumber\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"revisionHeight\",\"type\":\"uint64\"}],\"internalType\":\"struct IICS02ClientMsgs.Height\",\"name\":\"proofHeight\",\"type\":\"tuple\"},{\"internalType\":\"bytes[]\",\"name\":\"path\",\"type\":\"bytes[]\"}],\"internalType\":\"struct ILightClientMsgs.MsgVerifyNonMembership\",\"name\":\"msg_\",\"type\":\"tuple\"}],\"name\":\"verifyNonMembership\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"errors\":{\"AccessControlBadConfirmation()\":[{\"details\":\"The caller of a function is not the expected one. NOTE: Don't confuse with {AccessControlUnauthorizedAccount}.\"}],\"AccessControlUnauthorizedAccount(address,bytes32)\":[{\"details\":\"The `account` is missing a role.\"}]},\"events\":{\"RoleAdminChanged(bytes32,bytes32,bytes32)\":{\"details\":\"Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite {RoleAdminChanged} not being emitted to signal this.\"},\"RoleGranted(bytes32,address,address)\":{\"details\":\"Emitted when `account` is granted `role`. `sender` is the account that originated the contract call. This account bears the admin role (for the granted role). Expected in cases where the role was granted using the internal {AccessControl-_grantRole}.\"},\"RoleRevoked(bytes32,address,address)\":{\"details\":\"Emitted when `account` is revoked `role`. `sender` is the account that originated the contract call: - if using `revokeRole`, it is the admin role bearer - if using `renounceRole`, it is the role bearer (i.e. `account`)\"}},\"kind\":\"dev\",\"methods\":{\"getClientState()\":{\"returns\":{\"_0\":\"The client state.\"}},\"getRoleAdmin(bytes32)\":{\"details\":\"Returns the admin role that controls `role`. See {grantRole} and {revokeRole}. To change a role's admin, use {_setRoleAdmin}.\"},\"grantRole(bytes32,address)\":{\"details\":\"Grants `role` to `account`. If `account` had not been already granted `role`, emits a {RoleGranted} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleGranted} event.\"},\"hasRole(bytes32,address)\":{\"details\":\"Returns `true` if `account` has been granted `role`.\"},\"renounceRole(bytes32,address)\":{\"details\":\"Revokes `role` from the calling account. Roles are often managed via {grantRole} and {revokeRole}: this function's purpose is to provide a mechanism for accounts to lose their privileges if they are compromised (such as when a trusted device is misplaced). If the calling account had been revoked `role`, emits a {RoleRevoked} event. Requirements: - the caller must be `callerConfirmation`. May emit a {RoleRevoked} event.\"},\"revokeRole(bytes32,address)\":{\"details\":\"Revokes `role` from `account`. If `account` had been granted `role`, emits a {RoleRevoked} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleRevoked} event.\"},\"supportsInterface(bytes4)\":{\"details\":\"Returns true if this contract implements the interface defined by `interfaceId`. See the corresponding https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[ERC section] to learn more about how these ids are created. This function call must use less than 30 000 gas.\"},\"updateClient(bytes)\":{\"params\":{\"updateMsg\":\"The encoded update message e.g., an SP1 proof.\"},\"returns\":{\"_0\":\"The result of the update operation\"}},\"verifyMembership((bytes,(uint64,uint64),bytes[],bytes))\":{\"details\":\"Notice that this message is not view, as it may update the client state for caching purposes.\",\"params\":{\"msg_\":\"The membership message\"},\"returns\":{\"_0\":\"The unix timestamp of the verification height in the counterparty chain in seconds.\"}},\"verifyNonMembership((bytes,(uint64,uint64),bytes[]))\":{\"details\":\"Notice that this message is not view, as it may update the client state for caching purposes.\",\"params\":{\"msg_\":\"The membership message\"},\"returns\":{\"_0\":\"The unix timestamp of the verification height in the counterparty chain in seconds.\"}}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"getClientState()\":{\"notice\":\"Returns the client state.\"},\"updateClient(bytes)\":{\"notice\":\"Updating the client and consensus state\"},\"verifyMembership((bytes,(uint64,uint64),bytes[],bytes))\":{\"notice\":\"Querying the membership of a key-value pair\"},\"verifyNonMembership((bytes,(uint64,uint64),bytes[]))\":{\"notice\":\"Querying the non-membership of a key\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/light-clients/besu/BesuIBFT2LightClient.sol\":\"BesuIBFT2LightClient\"},\"evmVersion\":\"cancun\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"none\"},\"optimizer\":{\"enabled\":true,\"runs\":10000},\"remappings\":[\":@openzeppelin-contracts/=node_modules/@openzeppelin/contracts/\",\":@openzeppelin-upgradeable/=node_modules/@openzeppelin/contracts-upgradeable/\",\":@openzeppelin/=node_modules/@openzeppelin/\",\":@sp1-contracts/=node_modules/sp1-contracts/contracts/src/\",\":@uniswap/permit2/=node_modules/@uniswap/permit2/\",\":forge-std/=node_modules/forge-std/src/\",\":sp1-contracts/=node_modules/sp1-contracts/\"],\"viaIR\":true},\"sources\":{\"contracts/interfaces/ILightClient.sol\":{\"keccak256\":\"0x1caae9e4f741a86c0056d5f7713a35f3bd96db7a9fd52fc9f1cf79aad76a442f\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://4a536db3b926560f69547c17e4f451a2631ddea0f42bd224c7fd8382d74429f6\",\"dweb:/ipfs/QmcQ33kxcmmowXgMbQGTBgiKBjF7v8UiP4y73bB9hhDizC\"]},\"contracts/light-clients/besu/BesuIBFT2LightClient.sol\":{\"keccak256\":\"0x097eb9878e468b9277356596cbc1109e9f189e26b5bc44626d258c3cfa0b4c16\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://61c05c9caa8a5eade32baa598422b48f2b095a2f2adfb490c23d49b3e962e8b7\",\"dweb:/ipfs/QmQ1ksNug4KReKZuTNxpefJZ6RNh7yZc8PRVrZQBHCoLAU\"]},\"contracts/light-clients/besu/BesuLightClientBase.sol\":{\"keccak256\":\"0x44fd20d599cfed2298d6a26ec8584c5955b4c6b097d7b9f42d9ef7e462d7a4ad\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://86ce26f4e3d6b4327680d93daf5b8a795fb5e76cf566bd9328988d4b5e170c7e\",\"dweb:/ipfs/QmTkwvf1Xvasx3zpgcYVQa2VMEL1CXjrESwuV7vKNa3VhQ\"]},\"contracts/light-clients/besu/MPTProof.sol\":{\"keccak256\":\"0x232c01021016519bf2fdda5abfac7ab23f01e3c9f59c0233a5944d16a94b343a\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://17387ba08707c70bc36df9a36a7f731d63db9f183b2675b7db35b9861c24c3b7\",\"dweb:/ipfs/QmerMaj4tnVPwfdA69eVx9joJXQP72MR4KLudSpPf28NkZ\"]},\"contracts/light-clients/besu/RLPReader.sol\":{\"keccak256\":\"0xeb60cddae95fa2779d1e8f0d7a622737480ee67348ea0c6e65f13c93cfc9d5bb\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://550fcc3d1527dd6a4f3621a72d7afc5c49dd5aa4b16992934a81c17dd0386a27\",\"dweb:/ipfs/QmeF5UNemcyEeyU3y6Ru5bK4NG1v9xpWvp3J9WdXfsgkGa\"]},\"contracts/light-clients/besu/errors/IBesuLightClientErrors.sol\":{\"keccak256\":\"0x5b5fd8ec4ad07c713fb5337cfec9769e4d0fa30817bc237a98b2ce4cf155feac\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://8fc013ed01d0e08590ee92f80f8089c18c334024d4d1a77a04ce3673b5d1e103\",\"dweb:/ipfs/QmeWAn9JoVVsBin8JnvBLRP51QBCsM9m95bVrZoKFtkUfo\"]},\"contracts/light-clients/besu/msgs/IBesuLightClientMsgs.sol\":{\"keccak256\":\"0xbd6a5a6309d1076319f61820ae239848dcb4dca598240d5f9f927e02ed8b58c9\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://ef5a28164d53832a52112a91747dbe84439a8003c489116425b7fd2d631425d9\",\"dweb:/ipfs/QmbUqMt72DZFtfyupG9jQXEkQFGpVrUb4wQW3bNiUPV1AR\"]},\"contracts/msgs/IICS02ClientMsgs.sol\":{\"keccak256\":\"0xb5fdb25319d5c32b3f527982d45ec1e9bec5215515581aee034d853006ea01a0\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://6b8939bf552c62c952a491008bcd9b59ab7dda20a9482bf93438e05793881542\",\"dweb:/ipfs/QmfWmzNCp8bd4pP26Lfw5HHp4dSZnCDqZDjVN7SD8P7eDh\"]},\"contracts/msgs/ILightClientMsgs.sol\":{\"keccak256\":\"0xa0565e7748b8b3284d72e1aa6ef4cc8264fcaa5f4e0761d22d64686953db6378\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://c4476010d7090bfaa74127526f2051c6bc82ff42a09b936e848880a1f15a6065\",\"dweb:/ipfs/QmY87JgRsFQXSZdGXNjNHEJCkdTHzFXH4vZEJ3q7MnHuP8\"]},\"node_modules/@openzeppelin/contracts/access/AccessControl.sol\":{\"keccak256\":\"0x1a6b4f6b7798ab80929d491b89d5427a9b3338c0fd1acd0ba325f69c6f1646af\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://7bb7f346c12a14dc622bc105ce3c47202fbc89f4b153a28a63bb68193297330c\",\"dweb:/ipfs/QmagwF8P3bUBXwdo159ueEnY9dLSvEWwK24kk2op58egwG\"]},\"node_modules/@openzeppelin/contracts/access/IAccessControl.sol\":{\"keccak256\":\"0xbff9f59c84e5337689161ce7641c0ef8e872d6a7536fbc1f5133f128887aba3c\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://b308f882e796f7b79c9502deacb0a62983035c6f6f4e962b319ba6a1f4a77d3d\",\"dweb:/ipfs/QmaWCW7ahEQqFjwhSUhV7Ae7WhfNvzSpE7DQ58hvEooqPL\"]},\"node_modules/@openzeppelin/contracts/utils/Context.sol\":{\"keccak256\":\"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://6a708e8a5bdb1011c2c381c9a5cfd8a9a956d7d0a9dc1bd8bcdaf52f76ef2f12\",\"dweb:/ipfs/Qmax9WHBnVsZP46ZxEMNRQpLQnrdE4dK8LehML1Py8FowF\"]},\"node_modules/@openzeppelin/contracts/utils/cryptography/ECDSA.sol\":{\"keccak256\":\"0x69f54c02b7d81d505910ec198c11ed4c6a728418a868b906b4a0cf29946fda84\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://8e25e4bdb7ae1f21d23bfee996e22736fc0ab44cfabedac82a757b1edc5623b9\",\"dweb:/ipfs/QmQdWQvB6JCP9ZMbzi8EvQ1PTETqkcTWrbcVurS7DKpa5n\"]},\"node_modules/@openzeppelin/contracts/utils/introspection/ERC165.sol\":{\"keccak256\":\"0x2d9dc2fe26180f74c11c13663647d38e259e45f95eb88f57b61d2160b0109d3e\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://81233d1f98060113d9922180bb0f14f8335856fe9f339134b09335e9f678c377\",\"dweb:/ipfs/QmWh6R35SarhAn4z2wH8SU456jJSYL2FgucfTFgbHJJN4E\"]},\"node_modules/@openzeppelin/contracts/utils/introspection/IERC165.sol\":{\"keccak256\":\"0x8891738ffe910f0cf2da09566928589bf5d63f4524dd734fd9cedbac3274dd5c\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://971f954442df5c2ef5b5ebf1eb245d7105d9fbacc7386ee5c796df1d45b21617\",\"dweb:/ipfs/QmadRjHbkicwqwwh61raUEapaVEtaLMcYbQZWs9gUkgj3u\"]}},\"version\":1}","metadata":{"compiler":{"version":"0.8.28+commit.7893614a"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"address","name":"ibcRouter","type":"address"},{"internalType":"uint64","name":"initialTrustedHeight","type":"uint64"},{"internalType":"uint64","name":"initialTrustedTimestamp","type":"uint64"},{"internalType":"bytes32","name":"initialTrustedStorageRoot","type":"bytes32"},{"internalType":"address[]","name":"initialTrustedValidators","type":"address[]"},{"internalType":"uint64","name":"trustingPeriod","type":"uint64"},{"internalType":"uint64","name":"maxClockDrift","type":"uint64"},{"internalType":"address","name":"roleManager","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"type":"error","name":"AccessControlBadConfirmation"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bytes32","name":"neededRole","type":"bytes32"}],"type":"error","name":"AccessControlUnauthorizedAccount"},{"inputs":[{"internalType":"uint64","name":"revisionHeight","type":"uint64"}],"type":"error","name":"ConflictingConsensusState"},{"inputs":[{"internalType":"uint64","name":"trustedTimestamp","type":"uint64"},{"internalType":"uint256","name":"currentTimestamp","type":"uint256"},{"internalType":"uint64","name":"trustingPeriod","type":"uint64"}],"type":"error","name":"ConsensusStateExpired"},{"inputs":[{"internalType":"uint64","name":"revisionHeight","type":"uint64"}],"type":"error","name":"ConsensusStateNotFound"},{"inputs":[{"internalType":"address","name":"signer","type":"address"}],"type":"error","name":"DuplicateCommitSealSigner"},{"inputs":[{"internalType":"address","name":"validator","type":"address"}],"type":"error","name":"DuplicateValidator"},{"inputs":[],"type":"error","name":"EmptyValidatorSet"},{"inputs":[{"internalType":"uint256","name":"currentTimestamp","type":"uint256"},{"internalType":"uint256","name":"headerTimestamp","type":"uint256"},{"internalType":"uint256","name":"maxClockDrift","type":"uint256"}],"type":"error","name":"HeaderFromFuture"},{"inputs":[{"internalType":"uint256","name":"actual","type":"uint256"},{"internalType":"uint256","name":"required","type":"uint256"}],"type":"error","name":"InsufficientTrustedValidatorOverlap"},{"inputs":[{"internalType":"uint256","name":"actual","type":"uint256"},{"internalType":"uint256","name":"required","type":"uint256"}],"type":"error","name":"InsufficientValidatorQuorum"},{"inputs":[],"type":"error","name":"InvalidCommitSeal"},{"inputs":[{"internalType":"bytes32","name":"expectedValue","type":"bytes32"},{"internalType":"bytes32","name":"actualValue","type":"bytes32"}],"type":"error","name":"InvalidCommitmentValue"},{"inputs":[{"internalType":"uint256","name":"actualDifficulty","type":"uint256"}],"type":"error","name":"InvalidDifficulty"},{"inputs":[{"internalType":"uint256","name":"length","type":"uint256"}],"type":"error","name":"InvalidECDSASignatureLength"},{"inputs":[{"internalType":"uint256","name":"itemsLength","type":"uint256"}],"type":"error","name":"InvalidExtraDataFormat"},{"inputs":[{"internalType":"uint256","name":"itemsLength","type":"uint256"}],"type":"error","name":"InvalidHeaderFormat"},{"inputs":[],"type":"error","name":"InvalidHeaderHeight"},{"inputs":[{"internalType":"bytes32","name":"actualMixHash","type":"bytes32"}],"type":"error","name":"InvalidMixHash"},{"inputs":[{"internalType":"bytes","name":"actualNonce","type":"bytes"}],"type":"error","name":"InvalidNonce"},{"inputs":[{"internalType":"bytes32","name":"actualOmmersHash","type":"bytes32"}],"type":"error","name":"InvalidOmmersHash"},{"inputs":[{"internalType":"uint256","name":"expectedLength","type":"uint256"},{"internalType":"uint256","name":"actualLength","type":"uint256"}],"type":"error","name":"InvalidPathLength"},{"inputs":[{"internalType":"uint64","name":"providedRevisionNumber","type":"uint64"}],"type":"error","name":"InvalidRevisionNumber"},{"inputs":[{"internalType":"address","name":"validator","type":"address"}],"type":"error","name":"InvalidValidatorAddress"},{"inputs":[{"internalType":"uint256","name":"length","type":"uint256"}],"type":"error","name":"InvalidValidatorAddressLength"},{"inputs":[{"internalType":"uint256","name":"expectedLength","type":"uint256"},{"internalType":"uint256","name":"actualLength","type":"uint256"}],"type":"error","name":"InvalidValueLength"},{"inputs":[],"type":"error","name":"UnsupportedMisbehaviour"},{"inputs":[{"internalType":"bytes32","name":"actualValue","type":"bytes32"}],"type":"error","name":"ValueExists"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32","indexed":true},{"internalType":"bytes32","name":"previousAdminRole","type":"bytes32","indexed":true},{"internalType":"bytes32","name":"newAdminRole","type":"bytes32","indexed":true}],"type":"event","name":"RoleAdminChanged","anonymous":false},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32","indexed":true},{"internalType":"address","name":"account","type":"address","indexed":true},{"internalType":"address","name":"sender","type":"address","indexed":true}],"type":"event","name":"RoleGranted","anonymous":false},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32","indexed":true},{"internalType":"address","name":"account","type":"address","indexed":true},{"internalType":"address","name":"sender","type":"address","indexed":true}],"type":"event","name":"RoleRevoked","anonymous":false},{"inputs":[],"stateMutability":"view","type":"function","name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"PROOF_SUBMITTER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"getClientState","outputs":[{"internalType":"bytes","name":"","type":"bytes"}]},{"inputs":[{"internalType":"uint64","name":"revisionHeight","type":"uint64"}],"stateMutability":"view","type":"function","name":"getConsensusState","outputs":[{"internalType":"bytes","name":"","type":"bytes"}]},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"stateMutability":"view","type":"function","name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}]},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"stateMutability":"nonpayable","type":"function","name":"grantRole"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"stateMutability":"view","type":"function","name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}]},{"inputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function","name":"misbehaviour"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"callerConfirmation","type":"address"}],"stateMutability":"nonpayable","type":"function","name":"renounceRole"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"stateMutability":"nonpayable","type":"function","name":"revokeRole"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"stateMutability":"view","type":"function","name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}]},{"inputs":[{"internalType":"bytes","name":"updateMsg","type":"bytes"}],"stateMutability":"nonpayable","type":"function","name":"updateClient","outputs":[{"internalType":"enum ILightClientMsgs.UpdateResult","name":"","type":"uint8"}]},{"inputs":[{"internalType":"struct ILightClientMsgs.MsgVerifyMembership","name":"msg_","type":"tuple","components":[{"internalType":"bytes","name":"proof","type":"bytes"},{"internalType":"struct IICS02ClientMsgs.Height","name":"proofHeight","type":"tuple","components":[{"internalType":"uint64","name":"revisionNumber","type":"uint64"},{"internalType":"uint64","name":"revisionHeight","type":"uint64"}]},{"internalType":"bytes[]","name":"path","type":"bytes[]"},{"internalType":"bytes","name":"value","type":"bytes"}]}],"stateMutability":"view","type":"function","name":"verifyMembership","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[{"internalType":"struct ILightClientMsgs.MsgVerifyNonMembership","name":"msg_","type":"tuple","components":[{"internalType":"bytes","name":"proof","type":"bytes"},{"internalType":"struct IICS02ClientMsgs.Height","name":"proofHeight","type":"tuple","components":[{"internalType":"uint64","name":"revisionNumber","type":"uint64"},{"internalType":"uint64","name":"revisionHeight","type":"uint64"}]},{"internalType":"bytes[]","name":"path","type":"bytes[]"}]}],"stateMutability":"view","type":"function","name":"verifyNonMembership","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]}],"devdoc":{"kind":"dev","methods":{"getClientState()":{"returns":{"_0":"The client state."}},"getRoleAdmin(bytes32)":{"details":"Returns the admin role that controls `role`. See {grantRole} and {revokeRole}. To change a role's admin, use {_setRoleAdmin}."},"grantRole(bytes32,address)":{"details":"Grants `role` to `account`. If `account` had not been already granted `role`, emits a {RoleGranted} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleGranted} event."},"hasRole(bytes32,address)":{"details":"Returns `true` if `account` has been granted `role`."},"renounceRole(bytes32,address)":{"details":"Revokes `role` from the calling account. Roles are often managed via {grantRole} and {revokeRole}: this function's purpose is to provide a mechanism for accounts to lose their privileges if they are compromised (such as when a trusted device is misplaced). If the calling account had been revoked `role`, emits a {RoleRevoked} event. Requirements: - the caller must be `callerConfirmation`. May emit a {RoleRevoked} event."},"revokeRole(bytes32,address)":{"details":"Revokes `role` from `account`. If `account` had been granted `role`, emits a {RoleRevoked} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleRevoked} event."},"supportsInterface(bytes4)":{"details":"Returns true if this contract implements the interface defined by `interfaceId`. See the corresponding https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[ERC section] to learn more about how these ids are created. This function call must use less than 30 000 gas."},"updateClient(bytes)":{"params":{"updateMsg":"The encoded update message e.g., an SP1 proof."},"returns":{"_0":"The result of the update operation"}},"verifyMembership((bytes,(uint64,uint64),bytes[],bytes))":{"details":"Notice that this message is not view, as it may update the client state for caching purposes.","params":{"msg_":"The membership message"},"returns":{"_0":"The unix timestamp of the verification height in the counterparty chain in seconds."}},"verifyNonMembership((bytes,(uint64,uint64),bytes[]))":{"details":"Notice that this message is not view, as it may update the client state for caching purposes.","params":{"msg_":"The membership message"},"returns":{"_0":"The unix timestamp of the verification height in the counterparty chain in seconds."}}},"version":1},"userdoc":{"kind":"user","methods":{"getClientState()":{"notice":"Returns the client state."},"updateClient(bytes)":{"notice":"Updating the client and consensus state"},"verifyMembership((bytes,(uint64,uint64),bytes[],bytes))":{"notice":"Querying the membership of a key-value pair"},"verifyNonMembership((bytes,(uint64,uint64),bytes[]))":{"notice":"Querying the non-membership of a key"}},"version":1}},"settings":{"remappings":["@openzeppelin-contracts/=node_modules/@openzeppelin/contracts/","@openzeppelin-upgradeable/=node_modules/@openzeppelin/contracts-upgradeable/","@openzeppelin/=node_modules/@openzeppelin/","@sp1-contracts/=node_modules/sp1-contracts/contracts/src/","@uniswap/permit2/=node_modules/@uniswap/permit2/","forge-std/=node_modules/forge-std/src/","sp1-contracts/=node_modules/sp1-contracts/"],"optimizer":{"enabled":true,"runs":10000},"metadata":{"bytecodeHash":"none"},"compilationTarget":{"contracts/light-clients/besu/BesuIBFT2LightClient.sol":"BesuIBFT2LightClient"},"evmVersion":"cancun","libraries":{},"viaIR":true},"sources":{"contracts/interfaces/ILightClient.sol":{"keccak256":"0x1caae9e4f741a86c0056d5f7713a35f3bd96db7a9fd52fc9f1cf79aad76a442f","urls":["bzz-raw://4a536db3b926560f69547c17e4f451a2631ddea0f42bd224c7fd8382d74429f6","dweb:/ipfs/QmcQ33kxcmmowXgMbQGTBgiKBjF7v8UiP4y73bB9hhDizC"],"license":"MIT"},"contracts/light-clients/besu/BesuIBFT2LightClient.sol":{"keccak256":"0x097eb9878e468b9277356596cbc1109e9f189e26b5bc44626d258c3cfa0b4c16","urls":["bzz-raw://61c05c9caa8a5eade32baa598422b48f2b095a2f2adfb490c23d49b3e962e8b7","dweb:/ipfs/QmQ1ksNug4KReKZuTNxpefJZ6RNh7yZc8PRVrZQBHCoLAU"],"license":"MIT"},"contracts/light-clients/besu/BesuLightClientBase.sol":{"keccak256":"0x44fd20d599cfed2298d6a26ec8584c5955b4c6b097d7b9f42d9ef7e462d7a4ad","urls":["bzz-raw://86ce26f4e3d6b4327680d93daf5b8a795fb5e76cf566bd9328988d4b5e170c7e","dweb:/ipfs/QmTkwvf1Xvasx3zpgcYVQa2VMEL1CXjrESwuV7vKNa3VhQ"],"license":"MIT"},"contracts/light-clients/besu/MPTProof.sol":{"keccak256":"0x232c01021016519bf2fdda5abfac7ab23f01e3c9f59c0233a5944d16a94b343a","urls":["bzz-raw://17387ba08707c70bc36df9a36a7f731d63db9f183b2675b7db35b9861c24c3b7","dweb:/ipfs/QmerMaj4tnVPwfdA69eVx9joJXQP72MR4KLudSpPf28NkZ"],"license":"Apache-2.0"},"contracts/light-clients/besu/RLPReader.sol":{"keccak256":"0xeb60cddae95fa2779d1e8f0d7a622737480ee67348ea0c6e65f13c93cfc9d5bb","urls":["bzz-raw://550fcc3d1527dd6a4f3621a72d7afc5c49dd5aa4b16992934a81c17dd0386a27","dweb:/ipfs/QmeF5UNemcyEeyU3y6Ru5bK4NG1v9xpWvp3J9WdXfsgkGa"],"license":"Apache-2.0"},"contracts/light-clients/besu/errors/IBesuLightClientErrors.sol":{"keccak256":"0x5b5fd8ec4ad07c713fb5337cfec9769e4d0fa30817bc237a98b2ce4cf155feac","urls":["bzz-raw://8fc013ed01d0e08590ee92f80f8089c18c334024d4d1a77a04ce3673b5d1e103","dweb:/ipfs/QmeWAn9JoVVsBin8JnvBLRP51QBCsM9m95bVrZoKFtkUfo"],"license":"MIT"},"contracts/light-clients/besu/msgs/IBesuLightClientMsgs.sol":{"keccak256":"0xbd6a5a6309d1076319f61820ae239848dcb4dca598240d5f9f927e02ed8b58c9","urls":["bzz-raw://ef5a28164d53832a52112a91747dbe84439a8003c489116425b7fd2d631425d9","dweb:/ipfs/QmbUqMt72DZFtfyupG9jQXEkQFGpVrUb4wQW3bNiUPV1AR"],"license":"MIT"},"contracts/msgs/IICS02ClientMsgs.sol":{"keccak256":"0xb5fdb25319d5c32b3f527982d45ec1e9bec5215515581aee034d853006ea01a0","urls":["bzz-raw://6b8939bf552c62c952a491008bcd9b59ab7dda20a9482bf93438e05793881542","dweb:/ipfs/QmfWmzNCp8bd4pP26Lfw5HHp4dSZnCDqZDjVN7SD8P7eDh"],"license":"MIT"},"contracts/msgs/ILightClientMsgs.sol":{"keccak256":"0xa0565e7748b8b3284d72e1aa6ef4cc8264fcaa5f4e0761d22d64686953db6378","urls":["bzz-raw://c4476010d7090bfaa74127526f2051c6bc82ff42a09b936e848880a1f15a6065","dweb:/ipfs/QmY87JgRsFQXSZdGXNjNHEJCkdTHzFXH4vZEJ3q7MnHuP8"],"license":"MIT"},"node_modules/@openzeppelin/contracts/access/AccessControl.sol":{"keccak256":"0x1a6b4f6b7798ab80929d491b89d5427a9b3338c0fd1acd0ba325f69c6f1646af","urls":["bzz-raw://7bb7f346c12a14dc622bc105ce3c47202fbc89f4b153a28a63bb68193297330c","dweb:/ipfs/QmagwF8P3bUBXwdo159ueEnY9dLSvEWwK24kk2op58egwG"],"license":"MIT"},"node_modules/@openzeppelin/contracts/access/IAccessControl.sol":{"keccak256":"0xbff9f59c84e5337689161ce7641c0ef8e872d6a7536fbc1f5133f128887aba3c","urls":["bzz-raw://b308f882e796f7b79c9502deacb0a62983035c6f6f4e962b319ba6a1f4a77d3d","dweb:/ipfs/QmaWCW7ahEQqFjwhSUhV7Ae7WhfNvzSpE7DQ58hvEooqPL"],"license":"MIT"},"node_modules/@openzeppelin/contracts/utils/Context.sol":{"keccak256":"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2","urls":["bzz-raw://6a708e8a5bdb1011c2c381c9a5cfd8a9a956d7d0a9dc1bd8bcdaf52f76ef2f12","dweb:/ipfs/Qmax9WHBnVsZP46ZxEMNRQpLQnrdE4dK8LehML1Py8FowF"],"license":"MIT"},"node_modules/@openzeppelin/contracts/utils/cryptography/ECDSA.sol":{"keccak256":"0x69f54c02b7d81d505910ec198c11ed4c6a728418a868b906b4a0cf29946fda84","urls":["bzz-raw://8e25e4bdb7ae1f21d23bfee996e22736fc0ab44cfabedac82a757b1edc5623b9","dweb:/ipfs/QmQdWQvB6JCP9ZMbzi8EvQ1PTETqkcTWrbcVurS7DKpa5n"],"license":"MIT"},"node_modules/@openzeppelin/contracts/utils/introspection/ERC165.sol":{"keccak256":"0x2d9dc2fe26180f74c11c13663647d38e259e45f95eb88f57b61d2160b0109d3e","urls":["bzz-raw://81233d1f98060113d9922180bb0f14f8335856fe9f339134b09335e9f678c377","dweb:/ipfs/QmWh6R35SarhAn4z2wH8SU456jJSYL2FgucfTFgbHJJN4E"],"license":"MIT"},"node_modules/@openzeppelin/contracts/utils/introspection/IERC165.sol":{"keccak256":"0x8891738ffe910f0cf2da09566928589bf5d63f4524dd734fd9cedbac3274dd5c","urls":["bzz-raw://971f954442df5c2ef5b5ebf1eb245d7105d9fbacc7386ee5c796df1d45b21617","dweb:/ipfs/QmadRjHbkicwqwwh61raUEapaVEtaLMcYbQZWs9gUkgj3u"],"license":"MIT"}},"version":1},"id":34} \ No newline at end of file diff --git a/ibc-solidity/abi/bytecode/BesuQBFTLightClient.json b/ibc-solidity/abi/bytecode/BesuQBFTLightClient.json new file mode 100644 index 000000000..c481fc3dd --- /dev/null +++ b/ibc-solidity/abi/bytecode/BesuQBFTLightClient.json @@ -0,0 +1 @@ +{"abi":[{"type":"constructor","inputs":[{"name":"ibcRouter","type":"address","internalType":"address"},{"name":"initialTrustedHeight","type":"uint64","internalType":"uint64"},{"name":"initialTrustedTimestamp","type":"uint64","internalType":"uint64"},{"name":"initialTrustedStorageRoot","type":"bytes32","internalType":"bytes32"},{"name":"initialTrustedValidators","type":"address[]","internalType":"address[]"},{"name":"trustingPeriod","type":"uint64","internalType":"uint64"},{"name":"maxClockDrift","type":"uint64","internalType":"uint64"},{"name":"roleManager","type":"address","internalType":"address"}],"stateMutability":"nonpayable"},{"type":"function","name":"DEFAULT_ADMIN_ROLE","inputs":[],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"type":"function","name":"PROOF_SUBMITTER_ROLE","inputs":[],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"type":"function","name":"getClientState","inputs":[],"outputs":[{"name":"","type":"bytes","internalType":"bytes"}],"stateMutability":"view"},{"type":"function","name":"getConsensusState","inputs":[{"name":"revisionHeight","type":"uint64","internalType":"uint64"}],"outputs":[{"name":"","type":"bytes","internalType":"bytes"}],"stateMutability":"view"},{"type":"function","name":"getRoleAdmin","inputs":[{"name":"role","type":"bytes32","internalType":"bytes32"}],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"type":"function","name":"grantRole","inputs":[{"name":"role","type":"bytes32","internalType":"bytes32"},{"name":"account","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"hasRole","inputs":[{"name":"role","type":"bytes32","internalType":"bytes32"},{"name":"account","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"misbehaviour","inputs":[{"name":"","type":"bytes","internalType":"bytes"}],"outputs":[],"stateMutability":"view"},{"type":"function","name":"renounceRole","inputs":[{"name":"role","type":"bytes32","internalType":"bytes32"},{"name":"callerConfirmation","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"revokeRole","inputs":[{"name":"role","type":"bytes32","internalType":"bytes32"},{"name":"account","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"supportsInterface","inputs":[{"name":"interfaceId","type":"bytes4","internalType":"bytes4"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"updateClient","inputs":[{"name":"updateMsg","type":"bytes","internalType":"bytes"}],"outputs":[{"name":"","type":"uint8","internalType":"enum ILightClientMsgs.UpdateResult"}],"stateMutability":"nonpayable"},{"type":"function","name":"verifyMembership","inputs":[{"name":"msg_","type":"tuple","internalType":"struct ILightClientMsgs.MsgVerifyMembership","components":[{"name":"proof","type":"bytes","internalType":"bytes"},{"name":"proofHeight","type":"tuple","internalType":"struct IICS02ClientMsgs.Height","components":[{"name":"revisionNumber","type":"uint64","internalType":"uint64"},{"name":"revisionHeight","type":"uint64","internalType":"uint64"}]},{"name":"path","type":"bytes[]","internalType":"bytes[]"},{"name":"value","type":"bytes","internalType":"bytes"}]}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"verifyNonMembership","inputs":[{"name":"msg_","type":"tuple","internalType":"struct ILightClientMsgs.MsgVerifyNonMembership","components":[{"name":"proof","type":"bytes","internalType":"bytes"},{"name":"proofHeight","type":"tuple","internalType":"struct IICS02ClientMsgs.Height","components":[{"name":"revisionNumber","type":"uint64","internalType":"uint64"},{"name":"revisionHeight","type":"uint64","internalType":"uint64"}]},{"name":"path","type":"bytes[]","internalType":"bytes[]"}]}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"event","name":"RoleAdminChanged","inputs":[{"name":"role","type":"bytes32","indexed":true,"internalType":"bytes32"},{"name":"previousAdminRole","type":"bytes32","indexed":true,"internalType":"bytes32"},{"name":"newAdminRole","type":"bytes32","indexed":true,"internalType":"bytes32"}],"anonymous":false},{"type":"event","name":"RoleGranted","inputs":[{"name":"role","type":"bytes32","indexed":true,"internalType":"bytes32"},{"name":"account","type":"address","indexed":true,"internalType":"address"},{"name":"sender","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"type":"event","name":"RoleRevoked","inputs":[{"name":"role","type":"bytes32","indexed":true,"internalType":"bytes32"},{"name":"account","type":"address","indexed":true,"internalType":"address"},{"name":"sender","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"type":"error","name":"AccessControlBadConfirmation","inputs":[]},{"type":"error","name":"AccessControlUnauthorizedAccount","inputs":[{"name":"account","type":"address","internalType":"address"},{"name":"neededRole","type":"bytes32","internalType":"bytes32"}]},{"type":"error","name":"ConflictingConsensusState","inputs":[{"name":"revisionHeight","type":"uint64","internalType":"uint64"}]},{"type":"error","name":"ConsensusStateExpired","inputs":[{"name":"trustedTimestamp","type":"uint64","internalType":"uint64"},{"name":"currentTimestamp","type":"uint256","internalType":"uint256"},{"name":"trustingPeriod","type":"uint64","internalType":"uint64"}]},{"type":"error","name":"ConsensusStateNotFound","inputs":[{"name":"revisionHeight","type":"uint64","internalType":"uint64"}]},{"type":"error","name":"DuplicateCommitSealSigner","inputs":[{"name":"signer","type":"address","internalType":"address"}]},{"type":"error","name":"DuplicateValidator","inputs":[{"name":"validator","type":"address","internalType":"address"}]},{"type":"error","name":"EmptyValidatorSet","inputs":[]},{"type":"error","name":"HeaderFromFuture","inputs":[{"name":"currentTimestamp","type":"uint256","internalType":"uint256"},{"name":"headerTimestamp","type":"uint256","internalType":"uint256"},{"name":"maxClockDrift","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"InsufficientTrustedValidatorOverlap","inputs":[{"name":"actual","type":"uint256","internalType":"uint256"},{"name":"required","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"InsufficientValidatorQuorum","inputs":[{"name":"actual","type":"uint256","internalType":"uint256"},{"name":"required","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"InvalidCommitSeal","inputs":[]},{"type":"error","name":"InvalidCommitmentValue","inputs":[{"name":"expectedValue","type":"bytes32","internalType":"bytes32"},{"name":"actualValue","type":"bytes32","internalType":"bytes32"}]},{"type":"error","name":"InvalidDifficulty","inputs":[{"name":"actualDifficulty","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"InvalidECDSASignatureLength","inputs":[{"name":"length","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"InvalidExtraDataFormat","inputs":[{"name":"itemsLength","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"InvalidHeaderFormat","inputs":[{"name":"itemsLength","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"InvalidHeaderHeight","inputs":[]},{"type":"error","name":"InvalidMixHash","inputs":[{"name":"actualMixHash","type":"bytes32","internalType":"bytes32"}]},{"type":"error","name":"InvalidNonce","inputs":[{"name":"actualNonce","type":"bytes","internalType":"bytes"}]},{"type":"error","name":"InvalidOmmersHash","inputs":[{"name":"actualOmmersHash","type":"bytes32","internalType":"bytes32"}]},{"type":"error","name":"InvalidPathLength","inputs":[{"name":"expectedLength","type":"uint256","internalType":"uint256"},{"name":"actualLength","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"InvalidRevisionNumber","inputs":[{"name":"providedRevisionNumber","type":"uint64","internalType":"uint64"}]},{"type":"error","name":"InvalidValidatorAddress","inputs":[{"name":"validator","type":"address","internalType":"address"}]},{"type":"error","name":"InvalidValidatorAddressLength","inputs":[{"name":"length","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"InvalidValueLength","inputs":[{"name":"expectedLength","type":"uint256","internalType":"uint256"},{"name":"actualLength","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"UnsupportedMisbehaviour","inputs":[]},{"type":"error","name":"ValueExists","inputs":[{"name":"actualValue","type":"bytes32","internalType":"bytes32"}]}],"bytecode":{"object":"0x6080604052346103c05761393e80380380610019816103c4565b928339810190610100818303126103c057610033816103e9565b61003f602083016103fd565b9061004c604084016103fd565b60608401516080850151909291906001600160401b0381116103c05785019286601f850112156103c0578351966001600160401b038811610376578760051b9460206100998188016103c4565b809a81520190602082978201019283116103c057602001905b8282106103a8575050506100c860a087016103fd565b956100e160e06100da60c084016103fd565b92016103e9565b956001600160401b03169081156103995788511561038a575f5b89518110156101b1576001600160a01b03610116828c610411565b51161561018a575f5b81811061012f57506001016100fb565b6001600160a01b03610141828d610411565b51166001600160a01b03610155848e610411565b5116146101645760010161011f565b6001600160a01b03610176838d610411565b511663107f863360e21b5f5260045260245ffd5b6001600160a01b039061019d908b610411565b51166359bff38760e01b5f5260045260245ffd5b5060408051979896978a979181016001600160401b03811182821017610376576040525f81526020810190848252604051926080840198848a1060018060401b038b1117610376576040998a526001600160a01b031680855260208086018490526001600160401b03928316868c01819052878416606090970196909652600180546001600160a01b031916909217825592516002805495516001600160801b031996871692851692909217918c1b6fffffffffffffffff000000000000000090811692909217815560038054909616909617968b1b16959095179092555f948552600490529590922080546001600160401b03191694861694909417845583019190915592519392019190831161037657680100000000000000008311610376578154838355808410610350575b50905f5260205f205f5b83811061033357846001600160a01b03811661031a575061030961052f565b505b6040516132ec90816105b28239f35b8061032761032d92610439565b506104af565b5061030b565b82516001600160a01b0316818301556020909201916001016102ea565b825f528360205f2091820191015b81811061036b57506102e0565b5f815560010161035e565b634e487b7160e01b5f52604160045260245ffd5b63339e1ffb60e01b5f5260045ffd5b6359d119e360e01b5f5260045ffd5b602080916103b5846103e9565b8152019101906100b2565b5f80fd5b6040519190601f01601f191682016001600160401b0381118382101761037657604052565b51906001600160a01b03821682036103c057565b51906001600160401b03821682036103c057565b80518210156104255760209160051b010190565b634e487b7160e01b5f52603260045260245ffd5b6001600160a01b0381165f9081525f51602061391e5f395f51905f52602052604090205460ff166104aa576001600160a01b03165f8181525f51602061391e5f395f51905f5260205260408120805460ff191660011790553391905f51602061389e5f395f51905f528180a4600190565b505f90565b6001600160a01b0381165f9081525f5160206138be5f395f51905f52602052604090205460ff166104aa576001600160a01b03165f8181525f5160206138be5f395f51905f5260205260408120805460ff191660011790553391905f5160206138fe5f395f51905f52905f51602061389e5f395f51905f529080a4600190565b5f80525f5160206138be5f395f51905f526020525f5160206138de5f395f51905f525460ff166105ad575f8080525f5160206138be5f395f51905f526020525f5160206138de5f395f51905f52805460ff1916600117905533905f5160206138fe5f395f51905f525f51602061389e5f395f51905f528280a4600190565b5f9056fe60806040526004361015610011575f80fd5b5f3560e01c806301ffc9a7146100f45780630bece356146100ef578063248a9ca3146100ea5780632f2ff15d146100e557806336568abe146100e05780634d6d9ffb146100db5780635972185a146100d6578063682ed5f0146100d157806391d14854146100cc578063a217fddf146100c7578063d547741f146100c2578063ddba6537146100bd578063edce8bdc146100b85763ef913a4b146100b3575f80fd5b610a16565b61095e565b61088b565b61085c565b610842565b6107f4565b6105e6565b6105ac565b6103ac565b610350565b61031a565b6102b5565b610217565b34610195576020600319360112610195576004357fffffffff00000000000000000000000000000000000000000000000000000000811680910361019557807f7965db0b000000000000000000000000000000000000000000000000000000006020921490811561016b575b506040519015158152f35b7f01ffc9a7000000000000000000000000000000000000000000000000000000009150145f610160565b5f80fd5b9060206003198301126101955760043567ffffffffffffffff811161019557826023820112156101955780600401359267ffffffffffffffff84116101955760248483010111610195576024019190565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b346101955761028161022836610199565b5f80527f4c48d1d2b0f4f7485fc28e3db22341d96a20aa29e6efa8149da9751603abd4e06020527f6e0c24a6e293ff9b755263dbaa15ba3796b0b8d3fe17cfb4ddf8143b268eac475490919060ff161561029957610d9d565b6040516003821015610294576020918152f35b6101ea565b6102a1611287565b610d9d565b90816020910312610195573590565b346101955760206003193601126101955760206102df6004355f525f602052600160405f20015490565b604051908152f35b6003196040910112610195576004359060243573ffffffffffffffffffffffffffffffffffffffff811681036101955790565b346101955761034e61032b366102e7565b90610349610344825f525f602052600160405f20015490565b61130f565b612199565b005b346101955761035e366102e7565b3373ffffffffffffffffffffffffffffffffffffffff8216036103845761034e91612270565b7f6697b232000000000000000000000000000000000000000000000000000000005f5260045ffd5b346101955760206003193601126101955760043567ffffffffffffffff8111610195578060040160806003198336030112610195575f80527f4c48d1d2b0f4f7485fc28e3db22341d96a20aa29e6efa8149da9751603abd4e060205260ff7f6e0c24a6e293ff9b755263dbaa15ba3796b0b8d3fe17cfb4ddf8143b268eac4754161561059f575b61044761044260248401611192565b61137c565b60648201916001610458848461119c565b90500361056157906104a96104966104a261049d61049661049061048961048460446104e09a01611192565b611b30565b988761119c565b9061126e565b3691610b4d565b612345565b928061121d565b906001840154906040516104d7816104c960208201948560209181520190565b03601f198101835282610afd565b519020916123d3565b805161051f5761051b61050b6104fe845467ffffffffffffffff1690565b67ffffffffffffffff1690565b6040519081529081906020820190565b0390f35b61053361052e61055e92612518565b612545565b7fd039601e000000000000000000000000000000000000000000000000000000005f52600452602490565b5ffd5b61055e61056e848461119c565b7f88b3170e000000000000000000000000000000000000000000000000000000005f52600160045260245250604490565b6105a7611287565b610433565b34610195575f6003193601126101955760206040517fbd893629a699470e4ec82a5715bb4981fdaacc5d0a728bf5f55b801d8f4ef10b8152f35b346101955760206003193601126101955760043567ffffffffffffffff8111610195578060040160a06003198336030112610195575f80527f4c48d1d2b0f4f7485fc28e3db22341d96a20aa29e6efa8149da9751603abd4e060205260ff7f6e0c24a6e293ff9b755263dbaa15ba3796b0b8d3fe17cfb4ddf8143b268eac475416156107e7575b61067c61044260248401611192565b6064820191600161068d848461119c565b90500361056157608481019060206106a5838561121d565b9050036107a957906106f46104966106ed6106e56106de61049d6104966104906106d761048460446107149c01611192565b9b8b61119c565b948761121d565b8101906102a6565b948061121d565b906001850154906040516104d7816104c960208201948560209181520190565b8051156107755761052e61072791612518565b908082036107475761051b61050b6104fe855467ffffffffffffffff1690565b7f56ed1b63000000000000000000000000000000000000000000000000000000005f5260045260245260445ffd5b61055e827f56ed1b63000000000000000000000000000000000000000000000000000000005f52906044916004525f602452565b61055e6107b6838561121d565b7f24fadac8000000000000000000000000000000000000000000000000000000005f52602060045260245250604490565b6107ef611287565b61066d565b3461019557602060ff610836610809366102e7565b905f525f845260405f209073ffffffffffffffffffffffffffffffffffffffff165f5260205260405f2090565b54166040519015158152f35b34610195575f6003193601126101955760206040515f8152f35b346101955761034e61086d366102e7565b90610886610344825f525f602052600160405f20015490565b612270565b346101955761089936610199565b50505f80527f4c48d1d2b0f4f7485fc28e3db22341d96a20aa29e6efa8149da9751603abd4e06020527f6e0c24a6e293ff9b755263dbaa15ba3796b0b8d3fe17cfb4ddf8143b268eac475460ff1615610915575b7f2c1ed462000000000000000000000000000000000000000000000000000000005f5260045ffd5b61091d611287565b6108ed565b67ffffffffffffffff81160361019557565b601f19601f602060409481855280519182918282880152018686015e5f8582860101520116010190565b346101955760206003193601126101955761097e60043561048481610922565b67ffffffffffffffff8154166002600183015492019060405192608084019160208501526040840152606080840152815480915260a08301915f5260205f20905f5b8181106109ea5761051b856109de818703601f198101835282610afd565b60405191829182610934565b825473ffffffffffffffffffffffffffffffffffffffff168452602090930192600192830192016109c0565b34610195575f6003193601126101955761051b60405173ffffffffffffffffffffffffffffffffffffffff60015416602082015267ffffffffffffffff600254818116604084015260401c16606082015267ffffffffffffffff600354818116608084015260401c1660a082015260a081526109de60c082610afd565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b6060810190811067ffffffffffffffff821117610adc57604052565b610a93565b6040810190811067ffffffffffffffff821117610adc57604052565b90601f601f19910116810190811067ffffffffffffffff821117610adc57604052565b60405190610b2f604083610afd565b565b67ffffffffffffffff8111610adc57601f01601f191660200190565b929192610b5982610b31565b91610b676040519384610afd565b829481845281830111610195578281602093845f960137010152565b9080601f8301121561019557816020610b9e93359101610b4d565b90565b6020818303126101955780359067ffffffffffffffff8211610195570180820391608083126101955760405192610bd784610ac0565b823567ffffffffffffffff811161019557604091610bfa84601f19938701610b83565b8652011261019557604051610c0e81610ae1565b6020830135610c1c81610922565b81526040830135610c2c81610922565b60208201526020840152606082013567ffffffffffffffff811161019557610c549201610b83565b604082015290565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b9060018201809211610c9757565b610c5c565b60c001908160c011610c9757565b60f701908160f711610c9757565b6080019081608011610c9757565b60b701908160b711610c9757565b91908201809211610c9757565b908160011b9180830460021490151715610c9757565b81519167ffffffffffffffff8311610adc57680100000000000000008311610adc578154838355808410610d77575b506020610d389101915f5260205f2090565b5f5b838110610d475750505050565b6001906020610d6a855173ffffffffffffffffffffffffffffffffffffffff1690565b9401938184015501610d3a565b825f528360205f2091820191015b818110610d925750610d26565b5f8155600101610d85565b610da991810190610ba1565b9060208201610dc461044282515167ffffffffffffffff1690565b610dce8351611614565b92606084019367ffffffffffffffff610def865167ffffffffffffffff1690565b161561116a5760035491604083901c67ffffffffffffffff1693610e1d67ffffffffffffffff861642610cd4565b9460a0840195610e35875167ffffffffffffffff1690565b9067ffffffffffffffff82161161112b5750505160200151610e7290610e649067ffffffffffffffff16611b30565b9367ffffffffffffffff1690565b67ffffffffffffffff81168015159081611102575b506110ad575090610ef591610eb66002610eae610ea385611bc2565b60e086015190611cf8565b950185611efe565b610ec660c0830194855190611fa0565b60406080610ee960015473ffffffffffffffffffffffffffffffffffffffff1690565b93015191015191612055565b610f22610f0a865167ffffffffffffffff1690565b67ffffffffffffffff165f52600460205260405f2090565b610f376104fe825467ffffffffffffffff1690565b61103b5750916002610fb5928694610fa8610f73610f64610f0a610fc39a9b5167ffffffffffffffff1690565b955167ffffffffffffffff1690565b859067ffffffffffffffff167fffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000825416179055565b6001840155519101610cf7565b5167ffffffffffffffff1690565b600254610fdc9060401c67ffffffffffffffff166104fe565b67ffffffffffffffff821611610ff157505f90565b611037907fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff6fffffffffffffffff00000000000000006002549260401b16911617600255565b5f90565b91611051611059945167ffffffffffffffff1690565b9051926120cb565b6110a75761055e611072835167ffffffffffffffff1690565b7fc1aea5f7000000000000000000000000000000000000000000000000000000005f5267ffffffffffffffff16600452602490565b60029150565b61055e906110c3855467ffffffffffffffff1690565b7feae35725000000000000000000000000000000000000000000000000000000005f5267ffffffffffffffff9081166004524260245216604452606490565b9050611123429161111e6104fe885467ffffffffffffffff1690565b610cd4565b11155f610e87565b7f9b772277000000000000000000000000000000000000000000000000000000005f524260045267ffffffffffffffff9081166024521660445260645ffd5b7f59d119e3000000000000000000000000000000000000000000000000000000005f5260045ffd5b35610b9e81610922565b9035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe181360301821215610195570180359067ffffffffffffffff821161019557602001918160051b3603831361019557565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b9035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe181360301821215610195570180359067ffffffffffffffff82116101955760200191813603831361019557565b9015611282578061127e9161121d565b9091565b6111f0565b335f9081527f4c48d1d2b0f4f7485fc28e3db22341d96a20aa29e6efa8149da9751603abd4e0602052604090205460ff16156112bf57565b7fe2517d3f000000000000000000000000000000000000000000000000000000005f52336004527fbd893629a699470e4ec82a5715bb4981fdaacc5d0a728bf5f55b801d8f4ef10b60245260445ffd5b805f525f60205260ff6113433360405f209073ffffffffffffffffffffffffffffffffffffffff165f5260205260405f2090565b54161561134d5750565b7fe2517d3f000000000000000000000000000000000000000000000000000000005f523360045260245260445ffd5b67ffffffffffffffff168061138e5750565b7f3ce598a9000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b60405190610100820182811067ffffffffffffffff821117610adc57604052606060e0838281528260208201528260408201525f838201525f60808201525f60a08201528260c08201520152565b8051600110156112825760400190565b805160071015611282576101000190565b8051600d1015611282576101c00190565b8051600e1015611282576101e00190565b805160081015611282576101200190565b8051600310156112825760800190565b8051600b1015611282576101800190565b8051600c1015611282576101a00190565b8051600410156112825760a00190565b8051156112825760200190565b8051600210156112825760600190565b805160101015611282576102200190565b80518210156112825760209160051b010190565b67ffffffffffffffff8111610adc5760051b60200190565b90611501826114df565b61150e6040519182610afd565b828152601f1961151e82946114df565b0190602036910137565b90602082519201517fffffffffffffffffffffffffffffffffffffffff00000000000000000000000081169260148110611560575050565b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000929350829060140360031b1b161690565b60405160c091906115a38382610afd565b6005815291601f1901825f5b8281106115bb57505050565b8060606020809385010152016115af565b906115d6826114df565b6115e36040519182610afd565b828152601f196115f382946114df565b01905f5b82811061160357505050565b8060606020809385010152016115f7565b61163061162b6116226113b9565b92808452612518565b612587565b602082019080825251600f8110611b0557507f1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d493476116766116708351611407565b51612652565b03611aca57600161169061168a8351611417565b51612545565b03611a8f577f63746963616c2062797a616e74696e65206661756c7420746f6c6572616e63656116c36116708351611428565b03611a54576116db6116d58251611439565b5161266e565b80516008811490811591611a24575b506119ea575061162b61175d6116d5836117216117106104fe61168a611762985161144a565b67ffffffffffffffff166060880152565b61172e611670825161145b565b60808701526117576117466104fe61168a845161146b565b67ffffffffffffffff1660a0880152565b5161147c565b612518565b90604081019180835251600581036119bf57506117886117828351611407565b51612587565b908151156119975761179a82516114f7565b9360c082019485525f5b8351811015611933576117ba6116d582866114cb565b80516014810361190857506117d16117d791611528565b60601c90565b73ffffffffffffffffffffffffffffffffffffffff811680156118c6575f5b8381106118325750509061182c600192611811838a516114cb565b9073ffffffffffffffffffffffffffffffffffffffff169052565b016117a4565b8161187761185e611844848d516114cb565b5173ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff1690565b14611884576001016117f6565b7f41fe18cc000000000000000000000000000000000000000000000000000000005f5273ffffffffffffffffffffffffffffffffffffffff831660045260245ffd5b7f59bff387000000000000000000000000000000000000000000000000000000005f5273ffffffffffffffffffffffffffffffffffffffff821660045260245ffd5b7f83e46ad2000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b509261178291945061194692505161148d565b61195081516115cc565b9260e081019384525f5b8251811015611991578061198a816119776116d5600195886114cb565b88519061198483836114cb565b526114cb565b500161195a565b50925050565b7f339e1ffb000000000000000000000000000000000000000000000000000000005f5260045ffd5b7f30c6792a000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b611a20906040519182917fd5edd2a500000000000000000000000000000000000000000000000000000000835260048301610934565b0390fd5b7f011b4d03dd8c01f1049143cf9c4c817e4b167f1d1b83e5c6f0f10d89ba1e7bce9150602083012014155f6116ea565b611a6461167061055e9251611428565b7fa19e609c000000000000000000000000000000000000000000000000000000005f52600452602490565b611a9f61168a61055e9251611417565b7ff71b722f000000000000000000000000000000000000000000000000000000005f52600452602490565b611ada61167061055e9251611407565b7fb8120dca000000000000000000000000000000000000000000000000000000005f52600452602490565b7fbc277732000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b67ffffffffffffffff1690815f52600460205260405f209167ffffffffffffffff83541615611b5c5750565b7ff761631b000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b60405190611b96604083610afd565b600182527fc0000000000000000000000000000000000000000000000000000000000000006020830152565b6020611c7d611bcf611592565b611c48611be660408601611bec611be6825161149d565b51612ff1565b611bf58561149d565b52611bff8461149d565b50611c0d611be68251611407565b611c1685611407565b52611c2084611407565b50611c2e611be682516114aa565b611c37856114aa565b52611c41846114aa565b505161145b565b611c518261145b565b52611c5b8161145b565b50611c64611b87565b611c6d8261148d565b52611c778161148d565b50612744565b910190611c8b8251516115cc565b905f5b83518051821015611ce1579080600192600c82145f14611ccf575050611cb3836127f5565b611cbd82866114cb565b52611cc881856114cb565b5001611c8e565b611cdc91611be6916114cb565b611cb3565b505050611cee9150612744565b6020815191012090565b919091611d0583516114f7565b925f5b8151811015611eeb57611d1b81836114cb565b51805160418103611ec0575080601b60ff611d6a611d64611d3e611d77966127d4565b517fff000000000000000000000000000000000000000000000000000000000000001690565b60f81c90565b1610611e6d575b8461309f565b50611d818161286f565b15801590611e4f575b611e275773ffffffffffffffffffffffffffffffffffffffff81165f5b838110611dc757505090611dc160019261181183896114cb565b01611d08565b81611dd861185e611844848c6114cb565b14611de557600101611da7565b7f33af0d5f000000000000000000000000000000000000000000000000000000005f5273ffffffffffffffffffffffffffffffffffffffff831660045260245ffd5b7f09cb44e6000000000000000000000000000000000000000000000000000000005f5260045ffd5b5073ffffffffffffffffffffffffffffffffffffffff811615611d8a565b611eaf611e87611e82611d64611d3e856127d4565b61285d565b60f81b7fff000000000000000000000000000000000000000000000000000000000000001690565b5f1a611eba826127d4565b53611d71565b7ff2db9ce1000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b505050565b5f198114610c975760010190565b905f915f5b8151811015611f5757611f3673ffffffffffffffffffffffffffffffffffffffff611f2e83856114cb565b511684612879565b611f43575b600101611f03565b92611f4f600191611ef0565b939050611f3b565b50506003611f66915404610c89565b90818110611f72575050565b7fe2dcb1b9000000000000000000000000000000000000000000000000000000005f5260045260245260445ffd5b905f915f5b8151811015611ff957611fd873ffffffffffffffffffffffffffffffffffffffff611fd083856114cb565b5116846128d0565b611fe5575b600101611fa5565b92611ff1600191611ef0565b939050611fdd565b5050518060011b9080820460021490151715610c9757600361201b9104610c89565b90818110612027575050565b7f7818f4e4000000000000000000000000000000000000000000000000000000005f5260045260245260445ffd5b61209f9261162b9261175d926040517fffffffffffffffffffffffffffffffffffffffff000000000000000000000000602082019260601b168252601481526104d7603482610afd565b805160021015611282576060610b9e910151612652565b8054821015611282575f5260205f2001905f90565b919067ffffffffffffffff806120e9855467ffffffffffffffff1690565b92169116149081159161218a575b5061218457600201908154815103612184575f5b815181101561217c5761214161212182856120b6565b905473ffffffffffffffffffffffffffffffffffffffff9160031b1c1690565b73ffffffffffffffffffffffffffffffffffffffff61216661185e61184485876114cb565b9116036121755760010161210b565b5050505f90565b505050600190565b50505f90565b9050600182015414155f6120f7565b805f525f60205260ff6121cd8360405f209073ffffffffffffffffffffffffffffffffffffffff165f5260205260405f2090565b541661218457805f525f6020526122058260405f209073ffffffffffffffffffffffffffffffffffffffff165f5260205260405f2090565b60017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0082541617905573ffffffffffffffffffffffffffffffffffffffff339216907f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d5f80a4600190565b805f525f60205260ff6122a48360405f209073ffffffffffffffffffffffffffffffffffffffff165f5260205260405f2090565b54161561218457805f525f6020526122dd8260405f209073ffffffffffffffffffffffffffffffffffffffff165f5260205260405f2090565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00815416905573ffffffffffffffffffffffffffffffffffffffff339216907ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b5f80a4600190565b60208151910120604051602081019182527f1260944489272988d9df285149b5aa1b0f48f2136d6f416159f840a3e074760060408201526040815261238b606082610afd565b51902090565b604051906123a0602083610afd565b5f808352366020840137565b906123b682610b31565b6123c36040519182610afd565b828152601f1961151e8294610b31565b61162b612415919493946123e76020610b31565b956123f56040519788610afd565b602087526124036020610b31565b601f1960208901910136823752612518565b906124208451610ce1565b9184511515806124f8575b6124349061253e565b6124466124415f85612997565b6123ac565b925f19015f5b818110612460575050610b9e939450612ac7565b806124e2600f6124a56124dc611d64611d3e8d61247f60029960011c90565b908d6124d68a6124ce8a6124a561249c611d64611d3e8a8a6127e4565b60041c600f1690565b1660f81b7fff000000000000000000000000000000000000000000000000000000000000001690565b5f1a926127e4565b536127e4565b60ff1690565b5f1a6124f160018301886127e4565b530161244c565b50600161242b565b6040519061250d82610ae1565b5f6020838281520152565b612520612500565b5060208151916040519261253384610ae1565b835201602082015290565b1561019557565b8051801515908161257b575b50156101955761256090612d9d565b9051906020811061256f575090565b6020036101000a900490565b6021915011155f612551565b61259081612dc9565b156101955761259e81612de9565b6125a7816114df565b916125b56040519384610afd565b818352601f196125c4836114df565b015f5b81811061263b57505060206125e79101516125e181612e4a565b90610cd4565b5f905b8282106125f75750505090565b61263381612606600193612eb5565b9061260f610b20565b82815281602082015261262286896114cb565b5261262d85886114cb565b50610cd4565b9101906125ea565b602090612646612500565b828288010152016125c7565b6021815103610195576020015160018101809111610c97575190565b80511561019557612681610b9e91612d9d565b61268d819392936123ac565b928360200190612f7e565b805191908290602001825e015f815290565b610b2f906126cc6126c694936040519586936020850190612698565b90612698565b03601f198101845283610afd565b6001907fff00000000000000000000000000000000000000000000000000000000000000610b9e94931681520190612698565b916001610b9e94937fff000000000000000000000000000000000000000000000000000000000000006126c6941681520190612698565b5f9060605b81518310156127715761276960019161276285856114cb565b51906126aa565b920191612749565b9150508051603881106127b05750610b9e61278c825161301d565b916104c96127a0611e876124dc8651610caa565b916040519485936020850161270d565b6127c2611e876124dc610b9e93610c9c565b6104c9604051938492602084016126da565b8051604010156112825760600190565b908151811015611282570160200190565b600181511480612842575b610b9e578051603881106128305750610b9e61281c825161301d565b916104c96127a0611e876124dc8651610cc6565b6127c2611e876124dc610b9e93610cb8565b50608060ff612856611d64611d3e8561149d565b1610612800565b60ff601b9116019060ff8211610c9757565b6004111561029457565b905f5b82548110156121755773ffffffffffffffffffffffffffffffffffffffff6128a482856120b6565b90549060031b1c1673ffffffffffffffffffffffffffffffffffffffff83161461217c5760010161287c565b905f5b82518110156121755773ffffffffffffffffffffffffffffffffffffffff6128fb82856114cb565b511673ffffffffffffffffffffffffffffffffffffffff83161461217c576001016128d3565b905f198201918211610c9757565b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff408201918211610c9757565b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff808201918211610c9757565b6020039060208211610c9757565b91908203918211610c9757565b91906129b08351610ce1565b908351151580612abd575b6129c49061253e565b6129d16124418284612997565b938192600180841614612a5b575b5f19869101935b8481106129f4575050505050565b83612a526001612a48600f6124a56124dc611d64611d3e8b60029b612a41612a34886124a58f611d64611d3e612a2d61249c9360011c90565b80996127e4565b9b8d03809c5f1a926127e4565b538c6127e4565b5f1a9201896127e4565b530185906129e6565b92507f0f00000000000000000000000000000000000000000000000000000000000000612a9a6124dc611d64611d3e612a948760011c90565b866127e4565b60f81b165f1a612aa98661149d565b535f19612ab583611ef0565b9390506129df565b50818111156129bb565b915f915f612ad3612500565b50845115612d645790935f915b81518310156101955782158080612d4e575b61019557159081612d31575b5061019557612b1061178283836114cb565b948551600281145f14612c0d5750612b32612b2d6116d58861149d565b613134565b95612b48612b418888846131a1565b8092610cd4565b965111612bef5715612b7f5750612b5f9051612921565b11610195575111612b76576116d5610b9e91611407565b50610b9e612391565b919094612b8c8651612921565b82146101955780612bae612baa612ba4600194611407565b51612dc9565b1590565b15612bd057612bbf612bc591611407565b51613126565b915b01919490612ae0565b612bdc612be991611407565b5160208101519051902090565b91612bc7565b505091509250612c00915051612921565b1161019557610b9e612391565b929491939192601103612cd25781518314612cb457612c3e612c386124dc611d64611d3e87876127e4565b93610c89565b92601081101561019557612c5b612c5582896114cb565b51613110565b15612c7d5750505050612c7091925051612921565b0361019557610b9e612391565b86612c95612baa612ba484600196989a97999b6114cb565b15612ca757612be991612bbf916114cb565b612be991612bdc916114cb565b505050612cc19051612921565b03610195576116d5610b9e916114ba565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f696e76616c6964206e6f6465206c656e677468000000000000000000000000006044820152606490fd5b9050612d46612d4084846114cb565b516130d9565b14155f612afe565b50612d5c612bdc85856114cb565b871415612af2565b509050612d9592507f56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b42191501461253e565b610b9e612391565b906020820191612dad8351612e4a565b925190838201809211610c975751928303928311610c97579190565b805115612de457602060c0910151515f1a1061103757600190565b505f90565b805115612de4575f9060208101908151612e0281612e4a565b8101809111610c9757915190518101809111610c975791905b828110612e285750905090565b612e3181612eb5565b8101809111610c9757612e449091611ef0565b90612e1b565b515f1a6080811015612e5b57505f90565b60b881108015612e9f575b15612e715750600190565b60c0811015612e9057610b9e90612e8b9060b75b90612997565b610c89565b610b9e90612e8b9060f7612e85565b5060c08110158015612e66575060f88110612e66565b80515f1a906080821015612eca575050600190565b60b8821015612ee05750612e8b610b9e9161295c565b60c0821015612f215760010151602082900360b7016101000a9004017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff4a0190565b60f8821015612f375750612e8b610b9e9161292f565b60010151602082900360f7016101000a9004017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0a0190565b601f8111610c97576101000a90565b90918015611eeb575b6020811015612fc15780612f9a57505050565b612fae612fa9612fb392612989565b612f6f565b612921565b905182518216911916179052565b91908051825260208101809111610c97579060208101809111610c975791601f19810190811115612f8757610c5c565b612ffb81516123ac565b9081511561301957806020610b9e9201519051908360200190612f7e565b5090565b5f81805b61308b575061302f816123ac565b91815b61303b57505090565b61304482612921565b6130767fff000000000000000000000000000000000000000000000000000000000000008360f81b165f1a91856127e4565b5360081c908015610c97575f19019081613032565b9061309590611ef0565b9060081c80613021565b81519190604183036130cf576130c89250602082015190606060408401519301515f1a90613245565b9192909190565b50505f9160029190565b805160208110156130f1575060208101519051902090565b906020015120604051602081019182526020815261238b604082610afd565b6001815103612de45760200151515f1a60801490565b61312f90612d9d565b902090565b9081511561019557600f61315061249c611d64611d3e8661149d565b16806131635750610b9e60025f936129a4565b600181036131785750610b9e60015f936129a4565b6002810361318e5750610b9e60026001936129a4565b60030361019557610b9e600180936129a4565b91905f5b838101808211610c9757825181108061323b575b15613233576131e97fff0000000000000000000000000000000000000000000000000000000000000091846127e4565b51167fff0000000000000000000000000000000000000000000000000000000000000061321683866127e4565b5116900361322c5761322790611ef0565b6131a5565b9250505090565b509250505090565b50835182106131b9565b91907f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a084116132d4579160209360809260ff5f9560405194855216868401526040830152606082015282805260015afa156132c9575f5173ffffffffffffffffffffffffffffffffffffffff8116156132bf57905f905f90565b505f906001905f90565b6040513d5f823e3d90fd5b5050505f916003919056fea164736f6c634300081c000a2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d4c48d1d2b0f4f7485fc28e3db22341d96a20aa29e6efa8149da9751603abd4e06e0c24a6e293ff9b755263dbaa15ba3796b0b8d3fe17cfb4ddf8143b268eac47bd893629a699470e4ec82a5715bb4981fdaacc5d0a728bf5f55b801d8f4ef10bad3228b676f7d3cd4284a5443f17f1962b36e491b30a40b2405849e597ba5fb5","sourceMap":"124:1506:36:-:0;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;124:1506:36;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;124:1506:36;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;:::i;:::-;;-1:-1:-1;;;;;124:1506:36;;2163:25:35;;2159:84;;124:1506:36;;13516:22:35;13512:79;;-1:-1:-1;13643:3:35;124:1506:36;;13620:21:35;;;;;-1:-1:-1;;;;;13666:13:35;;;;:::i;:::-;124:1506:36;;13666:27:35;13662:111;;-1:-1:-1;13806:5:35;;;;;;13643:3;124:1506:36;;13605:13:35;;13813:3;-1:-1:-1;;;;;13840:13:35;;;;:::i;:::-;124:1506:36;;-1:-1:-1;;;;;13857:13:35;124:1506:36;;13857:13:35;:::i;:::-;124:1506:36;;13840:30:35;13836:117;;124:1506:36;;13791:13:35;;13836:117;-1:-1:-1;;;;;13920:13:35;124:1506:36;;13920:13:35;:::i;:::-;124:1506:36;;13901:33:35;;;-1:-1:-1;13901:33:35;;124:1506:36;;-1:-1:-1;13901:33:35;13662:111;-1:-1:-1;;;;;124:1506:36;13744:13:35;;124:1506:36;13744:13:35;:::i;:::-;124:1506:36;;13720:38:35;;;-1:-1:-1;13720:38:35;;124:1506:36;;-1:-1:-1;13720:38:35;13620:21;-1:-1:-1;124:1506:36;;;13620:21:35;;;;;;;124:1506:36;;-1:-1:-1;;;;;124:1506:36;;;;;;;;;;-1:-1:-1;124:1506:36;;;2397:84:35;;124:1506:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;124:1506:36;;;;;2323:255:35;;;124:1506:36;;;-1:-1:-1;;;;;124:1506:36;;;2323:255:35;;;124:1506:36;;;;;;;2323:255:35;;;124:1506:36;;;;;;;-1:-1:-1;;;;;;124:1506:36;;;;;;;;;;;;;-1:-1:-1;;;;;;124:1506:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;124:1506:36;;;2629:15:35;124:1506:36;;;;;;;;-1:-1:-1;;;;;;124:1506:36;;;;;;;;;;2736:26:35;;124:1506:36;;;;;;;2800:25:35;;;124:1506:36;;;;;;;;;;;;;;;;;;;;13600:377:35;124:1506:36;;-1:-1:-1;124:1506:36;;-1:-1:-1;124:1506:36;-1:-1:-1;124:1506:36;;;;;;;-1:-1:-1;;;;;124:1506:36;;;;2908:44:35;;;:::i;:::-;;2863:233;124:1506:36;;;;;;;;;2863:233:35;2983:43;;3040:45;2983:43;;:::i;:::-;;3040:45;:::i;:::-;;2863:233;;124:1506:36;;;-1:-1:-1;;;;;124:1506:36;;;;;;;;;;;;;;;;-1:-1:-1;124:1506:36;;;-1:-1:-1;124:1506:36;;;;;;;;;;;;;;;;-1:-1:-1;124:1506:36;;;;;;;;;;-1:-1:-1;124:1506:36;;2629:15:35;124:1506:36;;-1:-1:-1;124:1506:36;13512:79:35;13561:19;;;-1:-1:-1;13561:19:35;;-1:-1:-1;13561:19:35;2159:84;2211:21;;;-1:-1:-1;2211:21:35;;-1:-1:-1;2211:21:35;124:1506:36;;;;;;;:::i;:::-;;;;;;;;;;-1:-1:-1;124:1506:36;;;;;;;;;-1:-1:-1;;124:1506:36;;;-1:-1:-1;;;;;124:1506:36;;;;;;;;;;:::o;:::-;;;-1:-1:-1;;;;;124:1506:36;;;;;;:::o;:::-;;;-1:-1:-1;;;;;124:1506:36;;;;;;:::o;:::-;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;6155:316:92;-1:-1:-1;;;;;124:1506:36;;2187:1:35;124:1506:36;;;-1:-1:-1;;;;;;;;;;;124:1506:36;;;;;;;;;;-1:-1:-1;;;;;124:1506:36;2187:1:35;124:1506:36;;;-1:-1:-1;;;;;;;;;;;124:1506:36;;;;;;;-1:-1:-1;;124:1506:36;;;;;735:10:120;;124:1506:36;-1:-1:-1;;;;;;;;;;;2187:1:35;;6346:40:92;6323:4;6400:11;:::o;6248:217::-;6442:12;2187:1:35;6442:12:92;:::o;6155:316::-;-1:-1:-1;;;;;124:1506:36;;;;;;-1:-1:-1;;;;;;;;;;;124:1506:36;;;;;;;;;;-1:-1:-1;;;;;124:1506:36;;;;;-1:-1:-1;;;;;;;;;;;124:1506:36;;;;;;;-1:-1:-1;;124:1506:36;;;;;735:10:120;;124:1506:36;-1:-1:-1;;;;;;;;;;;1318:33:35;-1:-1:-1;;;;;;;;;;;6346:40:92;124:1506:36;6346:40:92;6323:4;6400:11;:::o;6155:316::-;124:1506:36;;;-1:-1:-1;;;;;;;;;;;124:1506:36;;-1:-1:-1;;;;;;;;;;;124:1506:36;;;;;;;;;-1:-1:-1;;;;;;;;;;;124:1506:36;;-1:-1:-1;;;;;;;;;;;124:1506:36;;-1:-1:-1;;124:1506:36;6323:4:92;124:1506:36;;;735:10:120;;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;124:1506:36;;6346:40:92;6323:4;6400:11;:::o;6248:217::-;124:1506:36;6442:12:92;:::o","linkReferences":{}},"deployedBytecode":{"object":"0x60806040526004361015610011575f80fd5b5f3560e01c806301ffc9a7146100f45780630bece356146100ef578063248a9ca3146100ea5780632f2ff15d146100e557806336568abe146100e05780634d6d9ffb146100db5780635972185a146100d6578063682ed5f0146100d157806391d14854146100cc578063a217fddf146100c7578063d547741f146100c2578063ddba6537146100bd578063edce8bdc146100b85763ef913a4b146100b3575f80fd5b610a16565b61095e565b61088b565b61085c565b610842565b6107f4565b6105e6565b6105ac565b6103ac565b610350565b61031a565b6102b5565b610217565b34610195576020600319360112610195576004357fffffffff00000000000000000000000000000000000000000000000000000000811680910361019557807f7965db0b000000000000000000000000000000000000000000000000000000006020921490811561016b575b506040519015158152f35b7f01ffc9a7000000000000000000000000000000000000000000000000000000009150145f610160565b5f80fd5b9060206003198301126101955760043567ffffffffffffffff811161019557826023820112156101955780600401359267ffffffffffffffff84116101955760248483010111610195576024019190565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b346101955761028161022836610199565b5f80527f4c48d1d2b0f4f7485fc28e3db22341d96a20aa29e6efa8149da9751603abd4e06020527f6e0c24a6e293ff9b755263dbaa15ba3796b0b8d3fe17cfb4ddf8143b268eac475490919060ff161561029957610d9d565b6040516003821015610294576020918152f35b6101ea565b6102a1611287565b610d9d565b90816020910312610195573590565b346101955760206003193601126101955760206102df6004355f525f602052600160405f20015490565b604051908152f35b6003196040910112610195576004359060243573ffffffffffffffffffffffffffffffffffffffff811681036101955790565b346101955761034e61032b366102e7565b90610349610344825f525f602052600160405f20015490565b61130f565b612199565b005b346101955761035e366102e7565b3373ffffffffffffffffffffffffffffffffffffffff8216036103845761034e91612270565b7f6697b232000000000000000000000000000000000000000000000000000000005f5260045ffd5b346101955760206003193601126101955760043567ffffffffffffffff8111610195578060040160806003198336030112610195575f80527f4c48d1d2b0f4f7485fc28e3db22341d96a20aa29e6efa8149da9751603abd4e060205260ff7f6e0c24a6e293ff9b755263dbaa15ba3796b0b8d3fe17cfb4ddf8143b268eac4754161561059f575b61044761044260248401611192565b61137c565b60648201916001610458848461119c565b90500361056157906104a96104966104a261049d61049661049061048961048460446104e09a01611192565b611b30565b988761119c565b9061126e565b3691610b4d565b612345565b928061121d565b906001840154906040516104d7816104c960208201948560209181520190565b03601f198101835282610afd565b519020916123d3565b805161051f5761051b61050b6104fe845467ffffffffffffffff1690565b67ffffffffffffffff1690565b6040519081529081906020820190565b0390f35b61053361052e61055e92612518565b612545565b7fd039601e000000000000000000000000000000000000000000000000000000005f52600452602490565b5ffd5b61055e61056e848461119c565b7f88b3170e000000000000000000000000000000000000000000000000000000005f52600160045260245250604490565b6105a7611287565b610433565b34610195575f6003193601126101955760206040517fbd893629a699470e4ec82a5715bb4981fdaacc5d0a728bf5f55b801d8f4ef10b8152f35b346101955760206003193601126101955760043567ffffffffffffffff8111610195578060040160a06003198336030112610195575f80527f4c48d1d2b0f4f7485fc28e3db22341d96a20aa29e6efa8149da9751603abd4e060205260ff7f6e0c24a6e293ff9b755263dbaa15ba3796b0b8d3fe17cfb4ddf8143b268eac475416156107e7575b61067c61044260248401611192565b6064820191600161068d848461119c565b90500361056157608481019060206106a5838561121d565b9050036107a957906106f46104966106ed6106e56106de61049d6104966104906106d761048460446107149c01611192565b9b8b61119c565b948761121d565b8101906102a6565b948061121d565b906001850154906040516104d7816104c960208201948560209181520190565b8051156107755761052e61072791612518565b908082036107475761051b61050b6104fe855467ffffffffffffffff1690565b7f56ed1b63000000000000000000000000000000000000000000000000000000005f5260045260245260445ffd5b61055e827f56ed1b63000000000000000000000000000000000000000000000000000000005f52906044916004525f602452565b61055e6107b6838561121d565b7f24fadac8000000000000000000000000000000000000000000000000000000005f52602060045260245250604490565b6107ef611287565b61066d565b3461019557602060ff610836610809366102e7565b905f525f845260405f209073ffffffffffffffffffffffffffffffffffffffff165f5260205260405f2090565b54166040519015158152f35b34610195575f6003193601126101955760206040515f8152f35b346101955761034e61086d366102e7565b90610886610344825f525f602052600160405f20015490565b612270565b346101955761089936610199565b50505f80527f4c48d1d2b0f4f7485fc28e3db22341d96a20aa29e6efa8149da9751603abd4e06020527f6e0c24a6e293ff9b755263dbaa15ba3796b0b8d3fe17cfb4ddf8143b268eac475460ff1615610915575b7f2c1ed462000000000000000000000000000000000000000000000000000000005f5260045ffd5b61091d611287565b6108ed565b67ffffffffffffffff81160361019557565b601f19601f602060409481855280519182918282880152018686015e5f8582860101520116010190565b346101955760206003193601126101955761097e60043561048481610922565b67ffffffffffffffff8154166002600183015492019060405192608084019160208501526040840152606080840152815480915260a08301915f5260205f20905f5b8181106109ea5761051b856109de818703601f198101835282610afd565b60405191829182610934565b825473ffffffffffffffffffffffffffffffffffffffff168452602090930192600192830192016109c0565b34610195575f6003193601126101955761051b60405173ffffffffffffffffffffffffffffffffffffffff60015416602082015267ffffffffffffffff600254818116604084015260401c16606082015267ffffffffffffffff600354818116608084015260401c1660a082015260a081526109de60c082610afd565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b6060810190811067ffffffffffffffff821117610adc57604052565b610a93565b6040810190811067ffffffffffffffff821117610adc57604052565b90601f601f19910116810190811067ffffffffffffffff821117610adc57604052565b60405190610b2f604083610afd565b565b67ffffffffffffffff8111610adc57601f01601f191660200190565b929192610b5982610b31565b91610b676040519384610afd565b829481845281830111610195578281602093845f960137010152565b9080601f8301121561019557816020610b9e93359101610b4d565b90565b6020818303126101955780359067ffffffffffffffff8211610195570180820391608083126101955760405192610bd784610ac0565b823567ffffffffffffffff811161019557604091610bfa84601f19938701610b83565b8652011261019557604051610c0e81610ae1565b6020830135610c1c81610922565b81526040830135610c2c81610922565b60208201526020840152606082013567ffffffffffffffff811161019557610c549201610b83565b604082015290565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b9060018201809211610c9757565b610c5c565b60c001908160c011610c9757565b60f701908160f711610c9757565b6080019081608011610c9757565b60b701908160b711610c9757565b91908201809211610c9757565b908160011b9180830460021490151715610c9757565b81519167ffffffffffffffff8311610adc57680100000000000000008311610adc578154838355808410610d77575b506020610d389101915f5260205f2090565b5f5b838110610d475750505050565b6001906020610d6a855173ffffffffffffffffffffffffffffffffffffffff1690565b9401938184015501610d3a565b825f528360205f2091820191015b818110610d925750610d26565b5f8155600101610d85565b610da991810190610ba1565b9060208201610dc461044282515167ffffffffffffffff1690565b610dce8351611614565b92606084019367ffffffffffffffff610def865167ffffffffffffffff1690565b161561116a5760035491604083901c67ffffffffffffffff1693610e1d67ffffffffffffffff861642610cd4565b9460a0840195610e35875167ffffffffffffffff1690565b9067ffffffffffffffff82161161112b5750505160200151610e7290610e649067ffffffffffffffff16611b30565b9367ffffffffffffffff1690565b67ffffffffffffffff81168015159081611102575b506110ad575090610ef591610eb66002610eae610ea385611bc2565b60e086015190611cf8565b950185611efe565b610ec660c0830194855190611fa0565b60406080610ee960015473ffffffffffffffffffffffffffffffffffffffff1690565b93015191015191612055565b610f22610f0a865167ffffffffffffffff1690565b67ffffffffffffffff165f52600460205260405f2090565b610f376104fe825467ffffffffffffffff1690565b61103b5750916002610fb5928694610fa8610f73610f64610f0a610fc39a9b5167ffffffffffffffff1690565b955167ffffffffffffffff1690565b859067ffffffffffffffff167fffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000825416179055565b6001840155519101610cf7565b5167ffffffffffffffff1690565b600254610fdc9060401c67ffffffffffffffff166104fe565b67ffffffffffffffff821611610ff157505f90565b611037907fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff6fffffffffffffffff00000000000000006002549260401b16911617600255565b5f90565b91611051611059945167ffffffffffffffff1690565b9051926120cb565b6110a75761055e611072835167ffffffffffffffff1690565b7fc1aea5f7000000000000000000000000000000000000000000000000000000005f5267ffffffffffffffff16600452602490565b60029150565b61055e906110c3855467ffffffffffffffff1690565b7feae35725000000000000000000000000000000000000000000000000000000005f5267ffffffffffffffff9081166004524260245216604452606490565b9050611123429161111e6104fe885467ffffffffffffffff1690565b610cd4565b11155f610e87565b7f9b772277000000000000000000000000000000000000000000000000000000005f524260045267ffffffffffffffff9081166024521660445260645ffd5b7f59d119e3000000000000000000000000000000000000000000000000000000005f5260045ffd5b35610b9e81610922565b9035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe181360301821215610195570180359067ffffffffffffffff821161019557602001918160051b3603831361019557565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b9035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe181360301821215610195570180359067ffffffffffffffff82116101955760200191813603831361019557565b9015611282578061127e9161121d565b9091565b6111f0565b335f9081527f4c48d1d2b0f4f7485fc28e3db22341d96a20aa29e6efa8149da9751603abd4e0602052604090205460ff16156112bf57565b7fe2517d3f000000000000000000000000000000000000000000000000000000005f52336004527fbd893629a699470e4ec82a5715bb4981fdaacc5d0a728bf5f55b801d8f4ef10b60245260445ffd5b805f525f60205260ff6113433360405f209073ffffffffffffffffffffffffffffffffffffffff165f5260205260405f2090565b54161561134d5750565b7fe2517d3f000000000000000000000000000000000000000000000000000000005f523360045260245260445ffd5b67ffffffffffffffff168061138e5750565b7f3ce598a9000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b60405190610100820182811067ffffffffffffffff821117610adc57604052606060e0838281528260208201528260408201525f838201525f60808201525f60a08201528260c08201520152565b8051600110156112825760400190565b805160071015611282576101000190565b8051600d1015611282576101c00190565b8051600e1015611282576101e00190565b805160081015611282576101200190565b8051600310156112825760800190565b8051600b1015611282576101800190565b8051600c1015611282576101a00190565b8051600410156112825760a00190565b8051156112825760200190565b8051600210156112825760600190565b805160101015611282576102200190565b80518210156112825760209160051b010190565b67ffffffffffffffff8111610adc5760051b60200190565b90611501826114df565b61150e6040519182610afd565b828152601f1961151e82946114df565b0190602036910137565b90602082519201517fffffffffffffffffffffffffffffffffffffffff00000000000000000000000081169260148110611560575050565b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000929350829060140360031b1b161690565b60405160c091906115a38382610afd565b6005815291601f1901825f5b8281106115bb57505050565b8060606020809385010152016115af565b906115d6826114df565b6115e36040519182610afd565b828152601f196115f382946114df565b01905f5b82811061160357505050565b8060606020809385010152016115f7565b61163061162b6116226113b9565b92808452612518565b612587565b602082019080825251600f8110611b0557507f1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d493476116766116708351611407565b51612652565b03611aca57600161169061168a8351611417565b51612545565b03611a8f577f63746963616c2062797a616e74696e65206661756c7420746f6c6572616e63656116c36116708351611428565b03611a54576116db6116d58251611439565b5161266e565b80516008811490811591611a24575b506119ea575061162b61175d6116d5836117216117106104fe61168a611762985161144a565b67ffffffffffffffff166060880152565b61172e611670825161145b565b60808701526117576117466104fe61168a845161146b565b67ffffffffffffffff1660a0880152565b5161147c565b612518565b90604081019180835251600581036119bf57506117886117828351611407565b51612587565b908151156119975761179a82516114f7565b9360c082019485525f5b8351811015611933576117ba6116d582866114cb565b80516014810361190857506117d16117d791611528565b60601c90565b73ffffffffffffffffffffffffffffffffffffffff811680156118c6575f5b8381106118325750509061182c600192611811838a516114cb565b9073ffffffffffffffffffffffffffffffffffffffff169052565b016117a4565b8161187761185e611844848d516114cb565b5173ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff1690565b14611884576001016117f6565b7f41fe18cc000000000000000000000000000000000000000000000000000000005f5273ffffffffffffffffffffffffffffffffffffffff831660045260245ffd5b7f59bff387000000000000000000000000000000000000000000000000000000005f5273ffffffffffffffffffffffffffffffffffffffff821660045260245ffd5b7f83e46ad2000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b509261178291945061194692505161148d565b61195081516115cc565b9260e081019384525f5b8251811015611991578061198a816119776116d5600195886114cb565b88519061198483836114cb565b526114cb565b500161195a565b50925050565b7f339e1ffb000000000000000000000000000000000000000000000000000000005f5260045ffd5b7f30c6792a000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b611a20906040519182917fd5edd2a500000000000000000000000000000000000000000000000000000000835260048301610934565b0390fd5b7f011b4d03dd8c01f1049143cf9c4c817e4b167f1d1b83e5c6f0f10d89ba1e7bce9150602083012014155f6116ea565b611a6461167061055e9251611428565b7fa19e609c000000000000000000000000000000000000000000000000000000005f52600452602490565b611a9f61168a61055e9251611417565b7ff71b722f000000000000000000000000000000000000000000000000000000005f52600452602490565b611ada61167061055e9251611407565b7fb8120dca000000000000000000000000000000000000000000000000000000005f52600452602490565b7fbc277732000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b67ffffffffffffffff1690815f52600460205260405f209167ffffffffffffffff83541615611b5c5750565b7ff761631b000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b60405190611b96604083610afd565b600182527fc0000000000000000000000000000000000000000000000000000000000000006020830152565b6020611c7d611bcf611592565b611c48611be660408601611bec611be6825161149d565b51612ff1565b611bf58561149d565b52611bff8461149d565b50611c0d611be68251611407565b611c1685611407565b52611c2084611407565b50611c2e611be682516114aa565b611c37856114aa565b52611c41846114aa565b505161145b565b611c518261145b565b52611c5b8161145b565b50611c64611b87565b611c6d8261148d565b52611c778161148d565b50612744565b910190611c8b8251516115cc565b905f5b83518051821015611ce1579080600192600c82145f14611ccf575050611cb3836127f5565b611cbd82866114cb565b52611cc881856114cb565b5001611c8e565b611cdc91611be6916114cb565b611cb3565b505050611cee9150612744565b6020815191012090565b919091611d0583516114f7565b925f5b8151811015611eeb57611d1b81836114cb565b51805160418103611ec0575080601b60ff611d6a611d64611d3e611d77966127d4565b517fff000000000000000000000000000000000000000000000000000000000000001690565b60f81c90565b1610611e6d575b8461309f565b50611d818161286f565b15801590611e4f575b611e275773ffffffffffffffffffffffffffffffffffffffff81165f5b838110611dc757505090611dc160019261181183896114cb565b01611d08565b81611dd861185e611844848c6114cb565b14611de557600101611da7565b7f33af0d5f000000000000000000000000000000000000000000000000000000005f5273ffffffffffffffffffffffffffffffffffffffff831660045260245ffd5b7f09cb44e6000000000000000000000000000000000000000000000000000000005f5260045ffd5b5073ffffffffffffffffffffffffffffffffffffffff811615611d8a565b611eaf611e87611e82611d64611d3e856127d4565b61285d565b60f81b7fff000000000000000000000000000000000000000000000000000000000000001690565b5f1a611eba826127d4565b53611d71565b7ff2db9ce1000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b505050565b5f198114610c975760010190565b905f915f5b8151811015611f5757611f3673ffffffffffffffffffffffffffffffffffffffff611f2e83856114cb565b511684612879565b611f43575b600101611f03565b92611f4f600191611ef0565b939050611f3b565b50506003611f66915404610c89565b90818110611f72575050565b7fe2dcb1b9000000000000000000000000000000000000000000000000000000005f5260045260245260445ffd5b905f915f5b8151811015611ff957611fd873ffffffffffffffffffffffffffffffffffffffff611fd083856114cb565b5116846128d0565b611fe5575b600101611fa5565b92611ff1600191611ef0565b939050611fdd565b5050518060011b9080820460021490151715610c9757600361201b9104610c89565b90818110612027575050565b7f7818f4e4000000000000000000000000000000000000000000000000000000005f5260045260245260445ffd5b61209f9261162b9261175d926040517fffffffffffffffffffffffffffffffffffffffff000000000000000000000000602082019260601b168252601481526104d7603482610afd565b805160021015611282576060610b9e910151612652565b8054821015611282575f5260205f2001905f90565b919067ffffffffffffffff806120e9855467ffffffffffffffff1690565b92169116149081159161218a575b5061218457600201908154815103612184575f5b815181101561217c5761214161212182856120b6565b905473ffffffffffffffffffffffffffffffffffffffff9160031b1c1690565b73ffffffffffffffffffffffffffffffffffffffff61216661185e61184485876114cb565b9116036121755760010161210b565b5050505f90565b505050600190565b50505f90565b9050600182015414155f6120f7565b805f525f60205260ff6121cd8360405f209073ffffffffffffffffffffffffffffffffffffffff165f5260205260405f2090565b541661218457805f525f6020526122058260405f209073ffffffffffffffffffffffffffffffffffffffff165f5260205260405f2090565b60017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0082541617905573ffffffffffffffffffffffffffffffffffffffff339216907f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d5f80a4600190565b805f525f60205260ff6122a48360405f209073ffffffffffffffffffffffffffffffffffffffff165f5260205260405f2090565b54161561218457805f525f6020526122dd8260405f209073ffffffffffffffffffffffffffffffffffffffff165f5260205260405f2090565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00815416905573ffffffffffffffffffffffffffffffffffffffff339216907ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b5f80a4600190565b60208151910120604051602081019182527f1260944489272988d9df285149b5aa1b0f48f2136d6f416159f840a3e074760060408201526040815261238b606082610afd565b51902090565b604051906123a0602083610afd565b5f808352366020840137565b906123b682610b31565b6123c36040519182610afd565b828152601f1961151e8294610b31565b61162b612415919493946123e76020610b31565b956123f56040519788610afd565b602087526124036020610b31565b601f1960208901910136823752612518565b906124208451610ce1565b9184511515806124f8575b6124349061253e565b6124466124415f85612997565b6123ac565b925f19015f5b818110612460575050610b9e939450612ac7565b806124e2600f6124a56124dc611d64611d3e8d61247f60029960011c90565b908d6124d68a6124ce8a6124a561249c611d64611d3e8a8a6127e4565b60041c600f1690565b1660f81b7fff000000000000000000000000000000000000000000000000000000000000001690565b5f1a926127e4565b536127e4565b60ff1690565b5f1a6124f160018301886127e4565b530161244c565b50600161242b565b6040519061250d82610ae1565b5f6020838281520152565b612520612500565b5060208151916040519261253384610ae1565b835201602082015290565b1561019557565b8051801515908161257b575b50156101955761256090612d9d565b9051906020811061256f575090565b6020036101000a900490565b6021915011155f612551565b61259081612dc9565b156101955761259e81612de9565b6125a7816114df565b916125b56040519384610afd565b818352601f196125c4836114df565b015f5b81811061263b57505060206125e79101516125e181612e4a565b90610cd4565b5f905b8282106125f75750505090565b61263381612606600193612eb5565b9061260f610b20565b82815281602082015261262286896114cb565b5261262d85886114cb565b50610cd4565b9101906125ea565b602090612646612500565b828288010152016125c7565b6021815103610195576020015160018101809111610c97575190565b80511561019557612681610b9e91612d9d565b61268d819392936123ac565b928360200190612f7e565b805191908290602001825e015f815290565b610b2f906126cc6126c694936040519586936020850190612698565b90612698565b03601f198101845283610afd565b6001907fff00000000000000000000000000000000000000000000000000000000000000610b9e94931681520190612698565b916001610b9e94937fff000000000000000000000000000000000000000000000000000000000000006126c6941681520190612698565b5f9060605b81518310156127715761276960019161276285856114cb565b51906126aa565b920191612749565b9150508051603881106127b05750610b9e61278c825161301d565b916104c96127a0611e876124dc8651610caa565b916040519485936020850161270d565b6127c2611e876124dc610b9e93610c9c565b6104c9604051938492602084016126da565b8051604010156112825760600190565b908151811015611282570160200190565b600181511480612842575b610b9e578051603881106128305750610b9e61281c825161301d565b916104c96127a0611e876124dc8651610cc6565b6127c2611e876124dc610b9e93610cb8565b50608060ff612856611d64611d3e8561149d565b1610612800565b60ff601b9116019060ff8211610c9757565b6004111561029457565b905f5b82548110156121755773ffffffffffffffffffffffffffffffffffffffff6128a482856120b6565b90549060031b1c1673ffffffffffffffffffffffffffffffffffffffff83161461217c5760010161287c565b905f5b82518110156121755773ffffffffffffffffffffffffffffffffffffffff6128fb82856114cb565b511673ffffffffffffffffffffffffffffffffffffffff83161461217c576001016128d3565b905f198201918211610c9757565b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff408201918211610c9757565b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff808201918211610c9757565b6020039060208211610c9757565b91908203918211610c9757565b91906129b08351610ce1565b908351151580612abd575b6129c49061253e565b6129d16124418284612997565b938192600180841614612a5b575b5f19869101935b8481106129f4575050505050565b83612a526001612a48600f6124a56124dc611d64611d3e8b60029b612a41612a34886124a58f611d64611d3e612a2d61249c9360011c90565b80996127e4565b9b8d03809c5f1a926127e4565b538c6127e4565b5f1a9201896127e4565b530185906129e6565b92507f0f00000000000000000000000000000000000000000000000000000000000000612a9a6124dc611d64611d3e612a948760011c90565b866127e4565b60f81b165f1a612aa98661149d565b535f19612ab583611ef0565b9390506129df565b50818111156129bb565b915f915f612ad3612500565b50845115612d645790935f915b81518310156101955782158080612d4e575b61019557159081612d31575b5061019557612b1061178283836114cb565b948551600281145f14612c0d5750612b32612b2d6116d58861149d565b613134565b95612b48612b418888846131a1565b8092610cd4565b965111612bef5715612b7f5750612b5f9051612921565b11610195575111612b76576116d5610b9e91611407565b50610b9e612391565b919094612b8c8651612921565b82146101955780612bae612baa612ba4600194611407565b51612dc9565b1590565b15612bd057612bbf612bc591611407565b51613126565b915b01919490612ae0565b612bdc612be991611407565b5160208101519051902090565b91612bc7565b505091509250612c00915051612921565b1161019557610b9e612391565b929491939192601103612cd25781518314612cb457612c3e612c386124dc611d64611d3e87876127e4565b93610c89565b92601081101561019557612c5b612c5582896114cb565b51613110565b15612c7d5750505050612c7091925051612921565b0361019557610b9e612391565b86612c95612baa612ba484600196989a97999b6114cb565b15612ca757612be991612bbf916114cb565b612be991612bdc916114cb565b505050612cc19051612921565b03610195576116d5610b9e916114ba565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f696e76616c6964206e6f6465206c656e677468000000000000000000000000006044820152606490fd5b9050612d46612d4084846114cb565b516130d9565b14155f612afe565b50612d5c612bdc85856114cb565b871415612af2565b509050612d9592507f56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b42191501461253e565b610b9e612391565b906020820191612dad8351612e4a565b925190838201809211610c975751928303928311610c97579190565b805115612de457602060c0910151515f1a1061103757600190565b505f90565b805115612de4575f9060208101908151612e0281612e4a565b8101809111610c9757915190518101809111610c975791905b828110612e285750905090565b612e3181612eb5565b8101809111610c9757612e449091611ef0565b90612e1b565b515f1a6080811015612e5b57505f90565b60b881108015612e9f575b15612e715750600190565b60c0811015612e9057610b9e90612e8b9060b75b90612997565b610c89565b610b9e90612e8b9060f7612e85565b5060c08110158015612e66575060f88110612e66565b80515f1a906080821015612eca575050600190565b60b8821015612ee05750612e8b610b9e9161295c565b60c0821015612f215760010151602082900360b7016101000a9004017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff4a0190565b60f8821015612f375750612e8b610b9e9161292f565b60010151602082900360f7016101000a9004017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0a0190565b601f8111610c97576101000a90565b90918015611eeb575b6020811015612fc15780612f9a57505050565b612fae612fa9612fb392612989565b612f6f565b612921565b905182518216911916179052565b91908051825260208101809111610c97579060208101809111610c975791601f19810190811115612f8757610c5c565b612ffb81516123ac565b9081511561301957806020610b9e9201519051908360200190612f7e565b5090565b5f81805b61308b575061302f816123ac565b91815b61303b57505090565b61304482612921565b6130767fff000000000000000000000000000000000000000000000000000000000000008360f81b165f1a91856127e4565b5360081c908015610c97575f19019081613032565b9061309590611ef0565b9060081c80613021565b81519190604183036130cf576130c89250602082015190606060408401519301515f1a90613245565b9192909190565b50505f9160029190565b805160208110156130f1575060208101519051902090565b906020015120604051602081019182526020815261238b604082610afd565b6001815103612de45760200151515f1a60801490565b61312f90612d9d565b902090565b9081511561019557600f61315061249c611d64611d3e8661149d565b16806131635750610b9e60025f936129a4565b600181036131785750610b9e60015f936129a4565b6002810361318e5750610b9e60026001936129a4565b60030361019557610b9e600180936129a4565b91905f5b838101808211610c9757825181108061323b575b15613233576131e97fff0000000000000000000000000000000000000000000000000000000000000091846127e4565b51167fff0000000000000000000000000000000000000000000000000000000000000061321683866127e4565b5116900361322c5761322790611ef0565b6131a5565b9250505090565b509250505090565b50835182106131b9565b91907f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a084116132d4579160209360809260ff5f9560405194855216868401526040830152606082015282805260015afa156132c9575f5173ffffffffffffffffffffffffffffffffffffffff8116156132bf57905f905f90565b505f906001905f90565b6040513d5f823e3d90fd5b5050505f916003919056fea164736f6c634300081c000a","sourceMap":"124:1506:36:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;;;;-1:-1:-1;;124:1506:36;;;;;;;;;;;;;;;2649:47:92;2664:32;124:1506:36;2649:47:92;;:87;;;;;124:1506:36;;;;;;;;;;2649:87:92;844:25:130;829:40;;;2649:87:92;;;124:1506:36;-1:-1:-1;124:1506:36;;;;;-1:-1:-1;;124:1506:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;3516:2265:35;124:1506:36;;;:::i;:::-;-1:-1:-1;124:1506:36;;;;;;;;;;;;17324:42:35;17320:105;;3516:2265;:::i;:::-;124:1506:36;;;;;;;;;;;;;;;:::i;17320:105:35:-;17393:20;;:::i;:::-;3516:2265;:::i;124:1506:36:-;;;;;;;;;;;:::o;:::-;;;;;-1:-1:-1;;124:1506:36;;;;;;;;;3877:6:92;124:1506:36;3877:6:92;124:1506:36;;3877:22:92;124:1506:36;3877:6:92;124:1506:36;3877:22:92;124:1506:36;3786:120:92;;124:1506:36;;;;;;;;-1:-1:-1;;124:1506:36;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;4306:25:92;124:1506:36;;;:::i;:::-;4276:18:92;2484:4;4276:18;;3877:6;124:1506:36;3877:6:92;124:1506:36;;3877:22:92;124:1506:36;3877:6:92;124:1506:36;3877:22:92;124:1506:36;3786:120:92;;4276:18;2484:4;:::i;:::-;4306:25;:::i;:::-;124:1506:36;;;;;;;;:::i;:::-;735:10:120;124:1506:36;;;5397:34:92;5393:102;;5505:37;;;:::i;5393:102::-;5454:30;;;124:1506:36;5454:30:92;;124:1506:36;;;;;-1:-1:-1;;124:1506:36;;;;;;;;;;;;;;;;-1:-1:-1;;124:1506:36;;;;;;;-1:-1:-1;124:1506:36;;;;;;;;;17324:42:35;17320:105;;124:1506:36;7178:31:35;;:16;;;:31;:::i;:::-;;:::i;:::-;7224:9;;;;7244:1;7224:9;;;;:::i;:::-;:21;;;7220:97;;7386:31;124:1506:36;7532:10:35;7450:36;124:1506:36;7473:12:35;:9;7367:51;7386:31;;7532:95;7386:31;;;:::i;:::-;7367:51;:::i;:::-;7473:9;;;:::i;:::-;:12;;:::i;:::-;124:1506:36;;;:::i;:::-;7450:36:35;:::i;:::-;7532:10;;;:::i;124:1506:36:-;7558:26:35;7244:1;7558:26;;124:1506:36;;;;7596:29:35;;;124:1506:36;7596:29:35;;;;124:1506:36;;;;;;;7596:29:35;;-1:-1:-1;;7596:29:35;;;;;;:::i;:::-;124:1506:36;7586:40:35;;7532:95;;:::i;:::-;124:1506:36;;7637:109:35;;124:1506:36;7755:31:35;124:1506:36;;;;;;;;;;;;7755:31:35;124:1506:36;;;;;;;;;;;;;;;;;7637:109:35;7704:29;:20;7684:51;7704:20;;:::i;:::-;:29;:::i;:::-;7684:51;-1:-1:-1;7684:51:35;124:1506:36;;;;;7684:51:35;-1:-1:-1;7684:51:35;7220:97;7268:38;7289:9;;;;:::i;:::-;7268:38;-1:-1:-1;7268:38:35;7244:1;124:1506:36;;;;-1:-1:-1;124:1506:36;;;17320:105:35;17393:20;;:::i;:::-;17320:105;;124:1506:36;;;;;-1:-1:-1;;124:1506:36;;;;;;;;1318:33:35;124:1506:36;;;;;;;;-1:-1:-1;;124:1506:36;;;;;;;;;;;;;;;;-1:-1:-1;;124:1506:36;;;;;;;-1:-1:-1;124:1506:36;;;;;;;;;17324:42:35;17320:105;;124:1506:36;5983:31:35;;:16;;;:31;:::i;:::-;6029:9;;;;6049:1;6029:9;;;;:::i;:::-;:21;;;6025:97;;6135:10;;;;124:1506:36;6135:10:35;;;;:::i;:::-;:23;;;6131:102;;6302:31;124:1506:36;6515:10:35;6436:33;6447:10;6366:36;124:1506:36;6389:12:35;:9;6283:51;6302:31;;6515:95;6302:31;;;:::i;6283:51::-;6389:9;;;:::i;6366:36::-;6447:10;;;:::i;:::-;6436:33;;;;:::i;:::-;6515:10;;;:::i;124:1506:36:-;6541:26:35;6049:1;6541:26;;124:1506:36;;;;6579:29:35;;;124:1506:36;6579:29:35;;;;124:1506:36;;;;;;;6515:95:35;124:1506:36;;6624:20:35;6620:107;;6767:20;:29;:20;;:::i;:29::-;6811:28;;;;6807:116;;124:1506:36;6932:31:35;124:1506:36;;;;;;;6807:116:35;6862:50;-1:-1:-1;6862:50:35;124:1506:36;;;;;-1:-1:-1;7684:51:35;6620:107;6667:49;;;-1:-1:-1;6667:49:35;124:1506:36;;;;;-1:-1:-1;124:1506:36;;;6131:102:35;6181:41;6204:10;;;;:::i;:::-;6181:41;-1:-1:-1;6181:41:35;124:1506:36;;;;;-1:-1:-1;124:1506:36;;;17320:105:35;17393:20;;:::i;:::-;17320:105;;124:1506:36;;;;;;2930:29:92;124:1506:36;;;:::i;:::-;;2930:6:92;124:1506:36;2930:6:92;124:1506:36;;;2930:6:92;124:1506:36;;;;;;;;;;;;;2930:29:92;124:1506:36;;;;;;;;;;;;;;;-1:-1:-1;;124:1506:36;;;;;;;;;;;;;;;;4723:26:92;124:1506:36;;;:::i;:::-;4693:18:92;2484:4;4693:18;;3877:6;124:1506:36;3877:6:92;124:1506:36;;3877:22:92;124:1506:36;3877:6:92;124:1506:36;3877:22:92;124:1506:36;3786:120:92;;2484:4;4723:26;:::i;124:1506:36:-;;;;;;;:::i;:::-;-1:-1:-1;;17363:1:35;124:1506:36;;;;;;;;;17324:42:35;17320:105;;124:1506:36;7887:25:35;17363:1;7887:25;124:1506:36;17363:1:35;7887:25;17320:105;17393:20;;:::i;:::-;17320:105;;124:1506:36;;;;;;;:::o;:::-;-1:-1:-1;;124:1506:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;-1:-1:-1;;124:1506:36;;;;;3361:34:35;124:1506:36;;;;;:::i;3361:34:35:-;124:1506:36;;;;3477:25:35;3449:26;;;124:1506:36;3477:25:35;;124:1506:36;;;;;;;3412:91:35;124:1506:36;3412:91:35;;124:1506:36;;;;;;;;;;;;;;;;;;;-1:-1:-1;124:1506:36;;-1:-1:-1;124:1506:36;;-1:-1:-1;124:1506:36;;;;;;;3412:91:35;;;;;-1:-1:-1;;3412:91:35;;;;;;:::i;:::-;124:1506:36;;;;;;;:::i;:::-;;;;;;;;;;;;3449:26:35;124:1506:36;;;;;;;;;;;;-1:-1:-1;;124:1506:36;;;;;;;;;3199:11:35;124:1506:36;;3188:23:35;;;124:1506:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3188:23:35;;;;;;:::i;124:1506:36:-;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;:::i;:::-;;;;;;;;;;;;;;;:::o;:::-;;;-1:-1:-1;;124:1506:36;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;:::i;:::-;:::o;:::-;;;;;;;;-1:-1:-1;;124:1506:36;;;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;-1:-1:-1;124:1506:36;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;:::i;:::-;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;-1:-1:-1;;124:1506:36;;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;:::o;:::-;;;;;;;;;;;;1404:66:35;124:1506:36;;;;;;;:::o;:::-;;:::i;:::-;16633:4:35;124:1506:36;;;16633:4:35;124:1506:36;;;:::o;:::-;16787:4:35;124:1506:36;;;16787:4:35;124:1506:36;;;:::o;:::-;16120:4:35;124:1506:36;;;16120:4:35;124:1506:36;;;:::o;:::-;16262:4:35;124:1506:36;;;16262:4:35;124:1506:36;;;:::o;:::-;;;;;;;;;;:::o;:::-;;;;;;;;;8355:1:37;124:1506:36;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;124:1506:36;;;-1:-1:-1;124:1506:36;;;;;;;;;;;;;;;;-1:-1:-1;124:1506:36;;;;;;3516:2265:35;3700:40;3516:2265;3700:40;;;;:::i;:::-;3771:18;;;;:33;124:1506:36;3771:18:35;;124:1506:36;;;;;3771:33:35;3845:28;3858:14;;3845:28;:::i;:::-;3887:13;;;;124:1506:36;;;;;;;;;;;3887:18:35;3883:77;;3991:25;124:1506:36;;;;;;;;3973:43:35;;124:1506:36;;;3973:15:35;:43;:::i;:::-;4019:16;;;;124:1506:36;;;;;;;;;3973:62:35;124:1506:36;;;-1:-1:-1;3969:178:35;;-1:-1:-1;;4223:18:35;3771;4223:33;124:1506:36;;;4204:53:35;;124:1506:36;;7367:51:35;:::i;4204:53::-;124:1506:36;;;;;;;;;4284:31:35;;;:139;;;;3516:2265;4267:298;;;4618:25;;4838:79;4618:25;4674:72;3991:25;4602:62;4618:25;;;:::i;:::-;4645:18;;;;4602:62;;:::i;:::-;4713:32;;4674:72;;:::i;:::-;4787:17;;;;;;;;;:::i;:::-;4899;4881:16;124:1506:36;3991:11:35;124:1506:36;;;;;;4881:16:35;;124:1506:36;4899:17:35;;;4838:79;;:::i;:::-;4976:30;124:1506:36;;;;;;;;;;;;4976:15:35;124:1506:36;;;;;;;4976:30:35;5020:37;124:1506:36;;;;;;;5020:37:35;5016:303;;124:1506:36;;3991:25:35;124:1506:36;;;;5412:46:35;124:1506:36;5372:30:35;124:1506:36;;;;;;;;;5372:30:35;124:1506:36;;;;;;;5412:46:35;124:1506:36;;;;;;;;;;;5412:46:35;3991:11;5468:29;;124:1506:36;5552:17:35;5521:28;;124:1506:36;:::i;:::-;;;;;;;3991:25:35;124:1506:36;5584:55:35;;124:1506:36;;;;;;5584:55:35;124:1506:36;;;5584:55:35;5580:141;;5731:43;3771:33;3516:2265;:::o;5580:141::-;5655:55;;124:1506:36;;3991:25:35;124:1506:36;;;;;;;;3991:25:35;124:1506:36;;5655:55:35;3771:33;3516:2265;:::o;5016:303::-;124:1506:36;;5077:95:35;124:1506:36;;;;;;;5154:17:35;;5077:95;;:::i;:::-;5073:175;;5268:40;124:1506:36;;;;;;;;5268:40:35;3771:33;5268:40;124:1506:36;;4976:15:35;124:1506:36;;;;5073:175:35;3991:25;;-1:-1:-1;5192:41:35:o;4267:298::-;4455:99;124:1506:36;;;;;;;;;4455:99:35;3771:33;4455:99;124:1506:36;;;;4455:99:35;124:1506:36;3973:15:35;124:1506:36;;;;;;;;4284:139:35;3973:15;;4335:69;3973:15;124:1506:36;4335:40:35;124:1506:36;;;;;;;4335:40:35;:69;:::i;:::-;:88;;4284:139;;;3969:178;4058:78;3771:33;4058:78;3973:15;4058:78;124:1506:36;;;;;;;;;;;-1:-1:-1;7684:51:35;3883:77;3928:21;3771:33;3928:21;;3771:33;3928:21;124:1506:36;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;:::i;:::-;;;:::o;:::-;;:::i;3175:103:92:-;735:10:120;2930:6:92;124:1506:36;;;;;;;;;;;;3495:23:92;3491:108;;3175:103::o;3491:108::-;3541:47;2930:6;3541:47;735:10:120;3541:47:92;124:1506:36;1318:33:35;124:1506:36;;;2930:6:92;3541:47;3175:103;124:1506:36;2930:6:92;124:1506:36;2930:6:92;124:1506:36;;;2930:29:92;735:10:120;124:1506:36;2930:6:92;124:1506:36;;;;;;;;;;;;;2930:29:92;124:1506:36;;3495:23:92;3491:108;;3175:103;:::o;3491:108::-;3541:47;2930:6;3541:47;735:10:120;3541:47:92;124:1506:36;;;;2930:6:92;3541:47;14970:177:35;124:1506:36;;15051:19:35;15047:94;;14970:177;:::o;15047:94::-;15093:37;15069:1;15093:37;;124:1506:36;;15069:1:35;15093:37;124:1506:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;124:1506:36;;;;-1:-1:-1;124:1506:36;;;;-1:-1:-1;124:1506:36;;;;;;;;;;;:::o;:::-;;;8387:1:35;124:1506:36;;;;;;;:::o;:::-;;;8556:1:35;124:1506:36;;;;;;;:::o;:::-;;;8695:2:35;124:1506:36;;;;;;;:::o;:::-;;;8881:2:35;124:1506:36;;;;;;;:::o;:::-;;;8924:1:35;124:1506:36;;;;;;;:::o;:::-;;;9154:1:35;124:1506:36;;;;;;;:::o;:::-;;;9227:2:35;124:1506:36;;;;;;;:::o;:::-;;;9295:2:35;124:1506:36;;;;;;;:::o;:::-;;;10526:1:35;124:1506:36;;;;;;;:::o;:::-;;;;;;;;;:::o;:::-;;;1130:1;124:1506;;;;;;;:::o;:::-;;;7692:2:37;124:1506:36;;;;;;;:::o;:::-;;;;;;;;;;;;;;;:::o;1404:66:35:-;;;;;;;;;;;:::o;:::-;;;;;:::i;:::-;124:1506:36;;;;;;:::i;:::-;1404:66:35;;;-1:-1:-1;;1404:66:35;;;;:::i;:::-;;;;;;;;:::o;:::-;;124:1506:36;;;;;1404:66:35;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;124:1506:36;1404:66:35;;;:::o;:::-;124:1506:36;;1404:66:35;;124:1506:36;;1404:66:35;124:1506:36;;:::i;:::-;936:1;1404:66:35;;;-1:-1:-1;;1404:66:35;;-1:-1:-1;1404:66:35;;;;;;;;;:::o;:::-;;124:1506:36;1404:66:35;;;;;;;;;;;;;;;:::i;:::-;124:1506:36;;;;;;:::i;:::-;1404:66:35;;;-1:-1:-1;;1404:66:35;;;;:::i;:::-;;;-1:-1:-1;1404:66:35;;;;;;;;;:::o;:::-;;124:1506:36;1404:66:35;;;;;;;;;;8026:2705;8192:30;:21;124:1506:36;;:::i;:::-;8133:28:35;;;;8192:21;:::i;:::-;:30;:::i;:::-;8171:18;;;:51;;;;124:1506:36;8264:2:35;8236:30;;8232:114;;8368:18;1522:66;8368:36;:21;:18;;:21;:::i;:::-;;:36;:::i;:::-;8360:66;8356:168;;8387:1;8537:30;:21;:18;;:21;:::i;:::-;;:30;:::i;:::-;:35;8533:122;;1404:66;8676:37;:22;:18;;:22;:::i;:37::-;8668:67;8664:167;;8862:32;:22;:18;;:22;:::i;:::-;;:32;:::i;:::-;124:1506:36;;8924:1:35;8908:17;;;;;:73;;;8026:2705;8904:130;;;9067:18;9342:21;9276:32;:22;9067:18;9044:54;9060:38;9067:30;:21;9342:30;9067:18;;:21;:::i;9060:38::-;124:1506:36;;9044:13:35;;;1404:66;;9044:54;9135:36;:21;:18;;:21;:::i;:36::-;9108:16;;;1404:66;9182:58;9201:39;9208:31;:22;:18;;:22;:::i;9201:39::-;124:1506:36;;9182:16:35;;;1404:66;;9182:58;9276:18;:22;:::i;:32::-;9342:21;:::i;:30::-;9318:21;;;;:54;;;;124:1506:36;9418:1:35;9386:33;;9382:123;;9559:21;:33;:24;:21;;:24;:::i;:::-;;:33;:::i;:::-;124:1506:36;;;9606:26:35;9602:83;;9715:36;124:1506:36;;9715:36:35;:::i;:::-;9695:17;;;;:56;;;-1:-1:-1;9808:3:35;124:1506:36;;9781:25:35;;;;;9857:27;:17;;;;:::i;:27::-;124:1506:36;;9927:2:35;9902:27;;9898:125;;10065:23;;10057:32;10065:23;;:::i;:::-;1404:66;;;;10057:32;124:1506:36;;;10107:23:35;;10103:103;;-1:-1:-1;10239:5:35;;;;;;10412:17;;;:32;8387:1;10412:17;:32;:17;;;:32;:::i;:::-;1404:66;124:1506:36;;1404:66:35;;;10412:32;1404:66;9766:13;;10246:3;10273:17;:33;:20;;:17;;;:20;:::i;:::-;124:1506:36;;;;;10273:20:35;124:1506:36;;;;10273:33:35;;10269:116;;8387:1;1404:66;10224:13;;10269:116;10337:29;-1:-1:-1;10337:29:35;124:1506:36;;;10157:34:35;124:1506:36;1404:66:35;-1:-1:-1;7684:51:35;10103:103;10157:34;-1:-1:-1;10157:34:35;124:1506:36;;;10157:34:35;124:1506:36;1404:66:35;-1:-1:-1;7684:51:35;9898:125;9956:52;-1:-1:-1;9956:52:35;124:1506:36;;;-1:-1:-1;7684:51:35;9781:25;;;10504:24;9781:25;;;10504:33;9781:25;;10504:21;:24;:::i;:33::-;10568:29;124:1506:36;;10568:29:35;:::i;:::-;10547:18;;;;:50;;;-1:-1:-1;10649:3:35;124:1506:36;;10627:20:35;;;;;10692:12;10668:46;10692:12;:22;:12;8387:1;10692:12;;;:::i;:22::-;10668:18;;:46;;;;;:::i;:::-;;;:::i;:::-;;1404:66;10612:13;;10627:20;;;;;8026:2705::o;9602:83::-;9655:19;-1:-1:-1;9655:19:35;;-1:-1:-1;9655:19:35;9382:123;9442:52;-1:-1:-1;9442:52:35;124:1506:36;;;-1:-1:-1;7684:51:35;8904:130;9004:19;124:1506:36;;;9004:19:35;;;;;;;;;;:::i;:::-;;;;8908:73;8949:32;124:1506:36;;8171:18:35;124:1506:36;;8929:16:35;:52;;8908:73;;;8664:167;8781:37;:22;8758:62;8781:18;;:22;:::i;:37::-;8758:62;-1:-1:-1;8758:62:35;124:1506:36;;;;;8533:122:35;8613:30;:21;8595:49;8613:18;;:21;:::i;:30::-;8595:49;-1:-1:-1;8595:49:35;124:1506:36;;;;;8356:168:35;8475:36;:21;8449:64;8475:18;;:21;:::i;:36::-;8449:64;-1:-1:-1;8449:64:35;124:1506:36;;;;;8232:114:35;8289:46;8133:16;8289:46;124:1506:36;;;-1:-1:-1;7684:51:35;14672:292;124:1506:36;;;;-1:-1:-1;124:1506:36;14812:15:35;124:1506:36;;;-1:-1:-1;124:1506:36;;;;;;14857:29:35;14853:105;;14672:292;:::o;14853:105::-;14909:38;-1:-1:-1;14909:38:35;14812:15;124:1506:36;;-1:-1:-1;14909:38:35;124:1506:36;;;;;;;;:::i;:::-;;;;;;;;;:::o;790:838::-;1351:18;1274:26;924:14;;:::i;:::-;15839:17:35;1173:24:36;978:21;;;15839:17:35;978:24:36;:21;;:24;:::i;:::-;;15839:17:35;:::i;:::-;948:55:36;;;:::i;:::-;;;;;:::i;:::-;;15839:17:35;1043:24:36;:21;;:24;:::i;15839:17:35:-;1013:55:36;;;:::i;:::-;;;;;:::i;:::-;;15839:17:35;1108:24:36;:21;;:24;:::i;15839:17:35:-;1078:55:36;;;:::i;:::-;;;;;:::i;:::-;;1173:21;:24;:::i;15839:17:35:-;1143:55:36;;;:::i;:::-;;;;;:::i;:::-;;1208:23;;:::i;:::-;;;;:::i;:::-;1404:66:35;1208:23:36;;;:::i;:::-;;1274:26;:::i;:::-;1351:18;;;1339:38;1351:18;;124:1506;1339:38;:::i;:::-;1392:13;1000:1;1438:3;1411:18;;124:1506;;1407:29;;;;;1474:82;;1065:1;1474:82;1479:2;1474:7;;:82;1479:2;;;1484:33;;;;;:::i;:::-;1457:99;;;;:::i;:::-;;;;;;:::i;:::-;;1404:66:35;1392:13:36;;1474:82;15839:17:35;1534:21:36;;;;:::i;15839:17:35:-;1474:82:36;;1407:29;;;;1593:27;1407:29;;1593:27;:::i;:::-;1351:18;124:1506;;;;1583:38;790:838;:::o;11363:509:35:-;;;;11495:27;124:1506:36;;11495:27:35;:::i;:::-;11537:13;11549:1;11570:3;124:1506:36;;11552:16:35;;;;;11629:8;;;;:::i;:::-;;124:1506:36;;11998:2:35;11983:17;;11979:95;;12093:8;;12105:2;124:1506:36;12087:15:35;12093:8;;12226:30;12093:8;;:::i;:::-;124:1506:36;;;;;12093:8:35;124:1506:36;;;;12087:15:35;124:1506:36;12087:20:35;12083:90;;11570:3;12226:30;;:::i;:::-;124:1506:36;;;;:::i;:::-;12270:33:35;;;:57;;;11570:3;12266:114;;124:1506:36;;;11549:1:35;11672:5;;;;;;11836:19;;;;1404:66;11836:19;;;;;:::i;:::-;1404:66;11537:13;;11679:3;11706:10;:20;:10;;;;;:::i;:20::-;;11702:107;;1404:66;;11657:13;;11702:107;11757:33;11549:1;11757:33;124:1506:36;;;10157:34:35;124:1506:36;1404:66:35;-1:-1:-1;7684:51:35;12266:114;12350:19;11549:1;12350:19;;11549:1;12350:19;12270:57;124:1506:36;;;;12307:20:35;12270:57;;12083:90;12134:28;12141:20;:15;12147:8;;;;:::i;12141:15::-;:20;:::i;:::-;124:1506:36;;;;;;12134:28:35;11549:1;12123:39;;;;:::i;:::-;;12083:90;;11979:95;12023:40;11549:1;12023:40;124:1506:36;;;-1:-1:-1;7684:51:35;11552:16;;;;11363:509::o;124:1506:36:-;-1:-1:-1;;124:1506:36;;;;;;;:::o;12415:540:35:-;;-1:-1:-1;12612:13:35;-1:-1:-1;12647:3:35;124:1506:36;;12627:18:35;;;;;12670:47;124:1506:36;12706:10:35;;;;:::i;:::-;124:1506:36;;12670:47:35;;:::i;:::-;12666:94;;12647:3;1404:66;;12612:13;;12666:94;12737:8;;1404:66;12737:8;;:::i;:::-;12666:94;;;;;12627:18;;;12826:1;12799:32;12627:18;124:1506:36;;12799:32:35;:::i;:::-;12845:17;;;;12841:108;;12415:540;;:::o;12841:108::-;12885:53;-1:-1:-1;12885:53:35;124:1506:36;;;;;-1:-1:-1;12885:53:35;12961:463;;-1:-1:-1;13100:13:35;-1:-1:-1;13135:3:35;124:1506:36;;13115:18:35;;;;;13158:39;124:1506:36;13186:10:35;;;;:::i;:::-;124:1506:36;;13158:39:35;;:::i;:::-;13154:86;;13135:3;1404:66;;13100:13;;13154:86;13217:8;;1404:66;13217:8;;:::i;:::-;13154:86;;;;;13115:18;;;124:1506:36;;1404:66:35;124:1506:36;;;;;13299:1:35;124:1506:36;;;;;;;13303:1:35;13279:29;:25;124:1506:36;13279:29:35;:::i;:::-;13322:17;;;;13318:100;;12961:463;;:::o;13318:100::-;13362:45;-1:-1:-1;13362:45:35;124:1506:36;;;;;-1:-1:-1;13362:45:35;10737:440;11083:31;10737:440;11083:22;10737:440;10955:76;10737:440;124:1506:36;;;11004:25:35;;;124:1506:36;;;;;;11004:25:35;;;;;;;:::i;11083:31::-;124:1506:36;;11152:1:35;124:1506:36;;;;;11139:30:35;124:1506:36;;11139:15:35;:30;:::i;124:1506:36:-;;;;;;;;-1:-1:-1;124:1506:36;;-1:-1:-1;124:1506:36;;;-1:-1:-1;124:1506:36;:::o;13989:677:35:-;;;124:1506:36;;;;;;;;;;;;;;14236:37:35;;;;:82;;;13989:677;14232:125;;;14370:25;;124:1506:36;;;;;14370:53:35;14366:96;;124:1506:36;14514:3:35;124:1506:36;;14491:21:35;;;;;124:1506:36;14537:28:35;;;;:::i;:::-;124:1506:36;;;;;;;;;;;;14537:45:35;14569:13;;;;;:::i;14537:45::-;124:1506:36;;14537:45:35;14533:96;;1404:66;;14476:13;;14533:96;14602:12;;;124:1506:36;14602:12:35;:::o;14491:21::-;;;;1404:66;13989:677;:::o;14366:96::-;14439:12;;124:1506:36;14439:12:35;:::o;14236:82::-;14277:26;;;;;124:1506:36;14277:41:35;;14236:82;;;6155:316:92;124:1506:36;;;;;;;2930:29:92;124:1506:36;;;;;;;;;;;;;;;;2930:29:92;124:1506:36;;;;;;;;;;6291:29:92;124:1506:36;;;;;;;;;;;;;;;;6291:29:92;6323:4;124:1506:36;;;;;;;;735:10:120;124:1506:36;;6346:40:92;;124:1506:36;6346:40:92;;6323:4;6400:11;:::o;6708:317::-;124:1506:36;;;;;;;2930:29:92;124:1506:36;;;;;;;;;;;;;;;;2930:29:92;124:1506:36;;;;;;;;;;;6844:29:92;124:1506:36;;;;;;;;;;;;;;;;6844:29:92;124:1506:36;;;;;;;735:10:120;124:1506:36;;6900:40:92;;124:1506:36;6900:40:92;;124:1506:36;6954:11:92;:::o;11183:174:35:-;124:1506:36;;;;;11307:18:35;124:1506:36;;;11296:53:35;;124:1506:36;;;1652:66:35;124:1506:36;;;;;11296:53:35;;;;;;:::i;:::-;124:1506:36;11286:64:35;;11183:174;:::o;124:1506:36:-;;;;;;;;:::i;:::-;2680:1:37;124:1506:36;;;1404:66:35;124:1506:36;;;1404:66:35;124:1506:36:o;:::-;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;-1:-1:-1;;124:1506:36;;;;:::i;1295:390:37:-;1615:20;:29;1295:390;;;;124:1506:36;1516:2:37;124:1506:36;:::i;:::-;;;;;;;;:::i;:::-;1516:2:37;124:1506:36;;;1516:2:37;124:1506:36;:::i;:::-;-1:-1:-1;;1516:2:37;124:1506:36;;;;1404:66:35;;;1529:63:37;1615:20;:::i;:29::-;1656:21;8343:13;124:1506:36;;8343:13:37;:::i;:::-;124:1506:36;;;8374:13:37;;:33;;;1295:390;8366:42;;;:::i;:::-;8429:26;8439:15;-1:-1:-1;8439:15:37;;:::i;:::-;8429:26;:::i;:::-;8465:18;-1:-1:-1;;124:1506:36;1675:1:37;8651:14;;;;;;1608:70;;;;;;;:::i;8667:6::-;8732:5;8796:37;8748:3;8804:21;:16;8810:9;;8732:5;;8355:1;8732:5;124:1506:36;;;;8732:5:37;8729:9;;8693:59;8729:9;8715:37;8729:9;8723:21;:16;8729:9;;;;;:::i;8723:16::-;124:1506:36;;;;;;8723:21:37;8722:29;124:1506:36;;;;;;8715:37:37;1675:1;8693:59;;;:::i;:::-;;8810:9;:::i;8804:16::-;124:1506:36;;;;8796:37:37;1675:1;8770:63;;8506:1;124:1506:36;;8770:63:37;;:::i;:::-;;124:1506:36;8644:204:37;;8374:33;-1:-1:-1;8391:16:37;8374:33;;124:1506:36;;;;;;;:::i;:::-;-1:-1:-1;124:1506:36;;;;;;;:::o;1812:221:38:-;124:1506:36;;:::i;:::-;;1923:58:38;124:1506:36;;;;;;;;;:::i;:::-;1404:66:35;;1923:58:38;;1998:28;;1404:66:35;1812:221:38;:::o;124:1506:36:-;;;;:::o;6361:439:38:-;124:1506:36;;6448:12:38;;;:30;;;;6361:439;124:1506:36;;;;6522:21:38;;;:::i;:::-;6554:14;6578:192;;;;;;;6780:13;6361:439;:::o;6578:192::-;;;;;;;6361:439;:::o;6448:30::-;6476:2;6464:14;;;;6448:30;;;3245:519;3341:12;;;:::i;:::-;124:1506:36;;;3381:14:38;;;:::i;:::-;1404:66:35;;;:::i;:::-;124:1506:36;;;;;;;:::i;:::-;1404:66:35;;;-1:-1:-1;;124:1506:36;;;:::i;:::-;;-1:-1:-1;124:1506:36;;;;;;3479:11:38;;124:1506:36;3479:41:38;:11;;124:1506:36;3493:27:38;;;:::i;:::-;3479:41;;:::i;:::-;-1:-1:-1;3555:179:38;3575:9;;;;;;3744:13;;;3245:519;:::o;3586:3::-;3707:16;3615:19;;1404:66:35;3615:19:38;;:::i;:::-;124:1506:36;;;:::i;:::-;1404:66:35;;;3660:24:38;124:1506:36;3660:24:38;;1404:66:35;3648:36:38;;;;:::i;:::-;;;;;;:::i;:::-;;3707:16;:::i;:::-;3586:3;1404:66:35;3560:13:38;;;124:1506:36;;;;;:::i;:::-;;;;;;;;;;6837:298:38;6969:2;124:1506:36;;6957:14:38;124:1506:36;;7024:11:38;;124:1506:36;7038:1:38;124:1506:36;;;;;;;7049:56:38;6837:298;:::o;7141:379::-;124:1506:36;;7234:12:38;124:1506:36;;7290:21:38;7486:3;7290:21;;:::i;:::-;7343:14;;;;;;:::i;:::-;7393:61;;;;7486:3;;:::i;124:1506:36:-;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;:::i;:::-;;;:::i;:::-;;-1:-1:-1;;124:1506:36;;;;;;:::i;:::-;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;16315:523:35:-;-1:-1:-1;;124:1506:36;16476:3:35;124:1506:36;;16458:16:35;;;;;16505:31;1404:66;16527:8;;;;;:::i;:::-;;16505:31;;:::i;:::-;16476:3;1404:66;16443:13;;;16458:16;;;;124:1506:36;;16578:2:35;16561:19;;16557:120;;124:1506:36;16757:74:35;16711:29;124:1506:36;;16711:29:35;:::i;:::-;124:1506:36;16757:74:35;16774:37;16781:29;16787:22;124:1506:36;;16787:22:35;:::i;16774:37::-;124:1506:36;;;16757:74:35;;;;;;;:::i;16557:120::-;16620:36;16627:28;16633:21;16603:63;16633:21;;:::i;16620:36::-;16603:63;124:1506:36;;16603:63:35;;;;;;;:::i;124:1506:36:-;;;12098:2:35;124:1506:36;;;;;;;:::o;:::-;;;;;;;;;;;;;:::o;15869:440:35:-;15977:1;124:1506:36;;15963:15:35;:39;;;15869:440;15959:80;;124:1506:36;;16065:2:35;16052:15;;16048:108;;124:1506:36;16232:70:35;16190:25;124:1506:36;;16190:25:35;:::i;:::-;124:1506:36;16232:70:35;16249:37;16256:29;16262:22;124:1506:36;;16262:22:35;:::i;16048:108::-;16107:32;16114:24;16120:17;16090:55;16120:17;;:::i;15963:39::-;15988:6;15998:4;124:1506:36;15982:13:35;15988:6;;;;:::i;15982:13::-;124:1506:36;15982:20:35;15963:39;;124:1506:36;;;;;;;;;;;;:::o;:::-;;-1:-1:-1;124:1506:36;;;:::o;15153:284:35:-;;124:1506:36;15307:3:35;124:1506:36;;15284:21:35;;;;;124:1506:36;15330:13:35;;;;:::i;:::-;124:1506:36;;;;;;;;;;15330:23:35;15326:73;;1404:66;;15269:13;;15443:282;;124:1506:36;15595:3:35;124:1506:36;;15572:21:35;;;;;124:1506:36;15618:13:35;;;;:::i;:::-;124:1506:36;;;;;15618:23:35;15614:73;;1404:66;;15557:13;;124:1506:36;;-1:-1:-1;;124:1506:36;;;;;;;:::o;:::-;;;;;;;;;;:::o;:::-;;;;;;;;;;:::o;:::-;;;;;;;;;:::o;:::-;;;;;;;;;;:::o;8215:649:37:-;;;8343:13;124:1506:36;;8343:13:37;:::i;:::-;124:1506:36;;;8374:13:37;;:33;;;8215:649;8366:42;;;:::i;:::-;8429:26;8439:15;;;;:::i;8429:26::-;8465:18;;8497:10;8506:1;8497:10;;;:15;8493:118;;8215:649;-1:-1:-1;;124:1506:36;;;8644:204:37;8651:14;;;;;;8215:649;;;;;:::o;8667:6::-;8732:5;8770:63;8506:1;8796:37;8748:3;8804:21;:16;8810:9;;8732:5;8355:1;8732:5;8693:59;8715:37;8732:5;8723:21;8732:5;8729:9;;8732:5;8723:16;8732:5;124:1506:36;;;;8732:5:37;8729:9;;;:::i;8715:37::-;124:1506:36;;;8693:59:37;;8386:1;8693:59;;;:::i;:::-;;8810:9;;:::i;8796:37::-;8386:1;8770:63;124:1506:36;;8770:63:37;;:::i;:::-;;124:1506:36;8644:204:37;;;;8493:118;8558:10;;124:1506:36;8549:26:37;:21;8555:14;;8558:10;;124:1506:36;;;;8558:10:37;8555:14;;:::i;8549:26::-;124:1506:36;;;8386:1:37;8528:55;;;;:::i;:::-;;-1:-1:-1;;8597:3:37;;;:::i;:::-;8493:118;;;;;8374:33;-1:-1:-1;8391:16:37;;;;8374:33;;2450:5418;;2680:1;2691:20;2680:1;124:1506:36;;:::i;:::-;;;;2810:17:37;2806:223;;3097:13;;2680:1;3092:4724;3130:3;124:1506:36;;3112:16:37;;;;;3212:6;;;;:50;;3130:3;3208:97;;3419:6;:47;;;;3130:3;3415:94;;;3635:17;:8;;;;:::i;:17::-;124:1506:36;;;3686:1:37;3671:16;;3667:4139;3686:1;;;3865:7;3837:46;3865:17;:7;;;:::i;:17::-;3837:46;:::i;:::-;3925:56;3999:28;3925:56;;;;;:::i;:::-;3999:28;;;:::i;:::-;124:1506:36;;-1:-1:-1;4046:994:37;;5058:1185;;;124:1506:36;5136:16:37;124:1506:36;;5136:16:37;:::i;:::-;-1:-1:-1;5128:144:37;;124:1506:36;-1:-1:-1;5294:109:37;;5436:7;5472:18;5436:7;;:::i;5294:109::-;5368:12;;;:::i;5058:1185::-;124:1506:36;;;5615:16:37;124:1506:36;;5615:16:37;:::i;:::-;5610:21;;5606:138;;5771:7;5770:17;5771:16;:7;1404:66:35;5771:7:37;;:::i;:::-;;:16;:::i;:::-;5770:17;;124:1506:36;5770:17:37;5771:7;;;5958;:26;:7;;:::i;:::-;;:26;:::i;:::-;5766:459;;1404:66:35;3097:13:37;;;;;5766:459;6175:7;:27;:7;;:::i;:::-;;4455:11:38;;;124:1506:36;;;4532:62:38;;4351:272;;6175:27:37;5766:459;;;4046:994;124:1506:36;;;;;;4839:16:37;124:1506:36;;;4839:16:37;:::i;:::-;-1:-1:-1;4831:149:37;;5009:12;;:::i;3667:4139::-;6267:17;;;;;;6282:2;6267:17;6282:2;;124:1506:36;;6340:36:37;;6356:20;;6572:17;6507:43;6515:34;6521:27;;;;;:::i;6507:43::-;6572:17;;:::i;:::-;6615:12;6625:2;6615:12;;;6611:146;;6783:33;6803:12;;;;:::i;:::-;;6783:33;:::i;:::-;6803:12;;;124:1506:36;;;;6887:16:37;124:1506:36;;;;6887:16:37;:::i;:::-;6882:21;6878:157;;7068:12;;:::i;6779:555::-;7114:12;7113:22;7114:21;:12;;1404:66:35;7114:12:37;;;;;;;:::i;7113:22::-;7114:12;;;7178:31;:12;;;;:::i;7109:225::-;7279:32;:12;;;;:::i;6336:1388::-;124:1506:36;;;7532:16:37;124:1506:36;;7532:16:37;:::i;:::-;7527:21;7523:135;;7687:8;:18;:8;;:::i;6263:1543::-;124:1506:36;;7762:29:37;;;124:1506:36;7762:29:37;;;124:1506:36;;;;;;;;;;;;;9004:19:35;3419:47:37;3457:8;;3445:21;3457:8;;;;:::i;:::-;;3445:21;:::i;:::-;3429:37;;3419:47;;;3212:50;3234:8;:28;:8;;;;:::i;:28::-;3222:40;;;3212:50;;2806:223;2906:78;;;2898:87;2906:78;;2918:66;2906:78;;;2898:87;:::i;:::-;3006:12;;:::i;2689:281:38:-;;2818:11;;;124:1506:36;2803:27:38;124:1506:36;;2803:27:38;:::i;:::-;124:1506:36;;;;;;;;;;;;;;;;;;;;2943:20:38;2689:281;:::o;3868:321::-;124:1506:36;;3948:13:38;3944:31;;4024:11;627:4;4024:11;;124:1506:36;4045:64:38;124:1506:36;4045:64:38;4123:24;4119:42;;4178:4;3868:321;:::o;3944:31::-;3963:12;124:1506:36;3963:12:38;:::o;7628:424::-;124:1506:36;;7712:13:38;7708:27;;124:1506:36;7791:11:38;;;;124:1506:36;;;7805:27:38;;;:::i;:::-;124:1506:36;;;;;;;;;;;;;;;;;;7891:132:38;;7898:16;;;;;;8033:12;;;7628:424;:::o;7891:132::-;7950:20;;;:::i;:::-;124:1506:36;;;;;;;8005:7:38;7930:40;8005:7;;:::i;:::-;7891:132;;;9416:581;9520:64;124:1506:36;9520:64:38;538:4;9598:26;;538:4;;;9640:8;124:1506:36;9640:8:38;:::o;9594:397::-;583:4;9669:25;;:83;;;;9594:397;9665:326;;;9768:8;9775:1;9768:8;:::o;9665:326::-;627:4;9797:24;;627:4;;;9874:35;;:31;;670:4;9874:31;;;:::i;:::-;:35;:::i;9793:198::-;9947:33;;:29;;670:4;9947:29;124:1506:36;9669:83:38;9699:25;627:4;9699:25;;;:52;;9669:83;9699:52;9728:23;670:4;9728:23;;9669:83;;8101:1263;8227:64;;-1:-1:-1;8227:64:38;;538:4;8305:26;;538:4;;;8347:11;;8357:1;8101:1263;:::o;8301:1032::-;583:4;8379:25;;583:4;;;8430:26;;:30;:26;;:::i;8375:958::-;627:4;8481:24;;627:4;;;8521:385;;;;;;;;;;;;;;;;124:1506:36;:::o;8477:856:38:-;670:4;8926:23;;670:4;;;8975:24;;:28;:24;;:::i;8922:411::-;9034:289;;;;;;;;;;;;;;;;124:1506:36;:::o;707:2:38:-;;;;;;;;;:::o;10155:770::-;;;10236:8;;10232:21;;10317:16;707:2;10317:16;;;;;10518:7;10514:405;;10155:770;;;:::o;10514:405::-;10640:24;10648:15;10640:28;10648:15;;:::i;:::-;10640:24;:::i;:::-;:28;:::i;:::-;10682:227;;;;;;;;;;;;10155:770::o;10335:16::-;10367:65;;;;;;707:2;124:1506:36;;;;;;;10476:17:38;707:2;124:1506:36;;;;;;;10335:16:38;-1:-1:-1;;124:1506:36;;;;;;10310:194:38;124:1506:36;;:::i;5161:337:38:-;5271:19;124:1506:36;;5271:19:38;:::i;:::-;124:1506:36;;;5304:18:38;5300:37;;5441:11;5369:57;5459:8;5441:11;;124:1506:36;;;5369:57:38;;;;5459:8;;:::i;5300:37::-;5324:13;;:::o;16844:430:35:-;-1:-1:-1;16929:19:35;;16989:8;;;17084:17;;;;:::i;:::-;17111:11;17132:116;17157:5;;;17257:10;;16844:430;:::o;17164:3::-;17187:5;;;:::i;:::-;17183:31;124:1506:36;;;;;-1:-1:-1;17183:31:35;;;;:::i;:::-;;124:1506:36;;17164:3:35;124:1506:36;;;;-1:-1:-1;;124:1506:36;17137:18:35;;;;16982:73;17013:8;;;;:::i;:::-;124:1506:36;17043:1:35;124:1506:36;16982:73:35;;;2129:778:129;124:1506:36;;;2129:778:129;2319:2;2299:22;;2319:2;;2751:25;2535:196;;;;;;;;;;;;;;;-1:-1:-1;2535:196:129;2751:25;;:::i;:::-;2744:32;;;;;:::o;2295:606::-;2807:83;;2823:1;2807:83;2827:35;2807:83;;:::o;10497:270:37:-;124:1506:36;;10608:2:37;10596:14;;10608:2;;;4455:11:38;10608:2:37;4455:11:38;;124:1506:36;;;4532:62:38;;10626:32:37;:::o;10592:169::-;4455:11:38;10608:2:37;4455:11:38;124:1506:36;4532:62:38;124:1506:36;;10608:2:37;10706:43;;124:1506:36;;;10608:2:37;10706:43;;;124:1506:36;10706:43:37;;:::i;7874:335::-;7989:1;124:1506:36;;7977:13:37;7973:56;;8072:11;;124:1506:36;8093:60:37;124:1506:36;8093:60:37;8174:4;8169:9;;7874:335::o;4781:270:38:-;4902:21;4781:270;4902:21;:::i;:::-;4957:65;;4781:270;:::o;8870:729:37:-;;124:1506:36;;9000:13:37;124:1506:36;;9066:3:37;9046:17;:12;9052:5;;;;:::i;9046:17::-;:23;9111:16;;;9143:10;9566:25;9152:1;124:1506:36;9107:434:37;9566:25;:::i;9107:434::-;9217:1;9202:16;;9217:1;;9234:10;9566:25;9217:1;124:1506:36;9198:343:37;9566:25;:::i;9198:343::-;9308:1;9293:16;;9308:1;;9325:10;9566:25;9308:1;9217;9289:252;9566:25;:::i;9289:252::-;9398:1;9383:16;9398:1;;9566:25;9217:1;9439:13;9379:162;9566:25;:::i;9605:320::-;;;124:1506:36;9800:3:37;124:1506:36;;;;;;;;;;9757:24:37;;:41;;;9800:3;9757:41;;;9823:16;124:1506:36;;9823:16:37;;:::i;:::-;124:1506:36;;;9843:5:37;;;;:::i;:::-;124:1506:36;;9823:25:37;;9819:72;;9800:3;;;:::i;:::-;9750:151;;9819:72;9868:8;;;;;:::o;9757:41::-;;;;;;9605:320;:::o;9757:41::-;124:1506:36;;;9785:13:37;;9757:41;;5203:1551:129;;;6283:66;6270:79;;6266:164;;124:1506:36;;;;;;-1:-1:-1;124:1506:36;;;;;;;;;;;;;;;;;;;6541:24:129;;;;;;;;;-1:-1:-1;6541:24:129;124:1506:36;;;6579:20:129;6575:113;;6698:49;-1:-1:-1;6698:49:129;-1:-1:-1;5203:1551:129;:::o;6575:113::-;6615:62;-1:-1:-1;6615:62:129;6541:24;6615:62;-1:-1:-1;6615:62:129;:::o;6541:24::-;124:1506:36;;;;;;;;;6266:164:129;6365:54;;;6381:1;6365:54;6385:30;6365:54;;:::o","linkReferences":{}},"methodIdentifiers":{"DEFAULT_ADMIN_ROLE()":"a217fddf","PROOF_SUBMITTER_ROLE()":"5972185a","getClientState()":"ef913a4b","getConsensusState(uint64)":"edce8bdc","getRoleAdmin(bytes32)":"248a9ca3","grantRole(bytes32,address)":"2f2ff15d","hasRole(bytes32,address)":"91d14854","misbehaviour(bytes)":"ddba6537","renounceRole(bytes32,address)":"36568abe","revokeRole(bytes32,address)":"d547741f","supportsInterface(bytes4)":"01ffc9a7","updateClient(bytes)":"0bece356","verifyMembership((bytes,(uint64,uint64),bytes[],bytes))":"682ed5f0","verifyNonMembership((bytes,(uint64,uint64),bytes[]))":"4d6d9ffb"},"rawMetadata":"{\"compiler\":{\"version\":\"0.8.28+commit.7893614a\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"ibcRouter\",\"type\":\"address\"},{\"internalType\":\"uint64\",\"name\":\"initialTrustedHeight\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"initialTrustedTimestamp\",\"type\":\"uint64\"},{\"internalType\":\"bytes32\",\"name\":\"initialTrustedStorageRoot\",\"type\":\"bytes32\"},{\"internalType\":\"address[]\",\"name\":\"initialTrustedValidators\",\"type\":\"address[]\"},{\"internalType\":\"uint64\",\"name\":\"trustingPeriod\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"maxClockDrift\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"roleManager\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"AccessControlBadConfirmation\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"internalType\":\"bytes32\",\"name\":\"neededRole\",\"type\":\"bytes32\"}],\"name\":\"AccessControlUnauthorizedAccount\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"revisionHeight\",\"type\":\"uint64\"}],\"name\":\"ConflictingConsensusState\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"trustedTimestamp\",\"type\":\"uint64\"},{\"internalType\":\"uint256\",\"name\":\"currentTimestamp\",\"type\":\"uint256\"},{\"internalType\":\"uint64\",\"name\":\"trustingPeriod\",\"type\":\"uint64\"}],\"name\":\"ConsensusStateExpired\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"revisionHeight\",\"type\":\"uint64\"}],\"name\":\"ConsensusStateNotFound\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"signer\",\"type\":\"address\"}],\"name\":\"DuplicateCommitSealSigner\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"validator\",\"type\":\"address\"}],\"name\":\"DuplicateValidator\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"EmptyValidatorSet\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"currentTimestamp\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"headerTimestamp\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxClockDrift\",\"type\":\"uint256\"}],\"name\":\"HeaderFromFuture\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"actual\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"required\",\"type\":\"uint256\"}],\"name\":\"InsufficientTrustedValidatorOverlap\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"actual\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"required\",\"type\":\"uint256\"}],\"name\":\"InsufficientValidatorQuorum\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidCommitSeal\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"expectedValue\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"actualValue\",\"type\":\"bytes32\"}],\"name\":\"InvalidCommitmentValue\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"actualDifficulty\",\"type\":\"uint256\"}],\"name\":\"InvalidDifficulty\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"length\",\"type\":\"uint256\"}],\"name\":\"InvalidECDSASignatureLength\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"itemsLength\",\"type\":\"uint256\"}],\"name\":\"InvalidExtraDataFormat\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"itemsLength\",\"type\":\"uint256\"}],\"name\":\"InvalidHeaderFormat\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidHeaderHeight\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"actualMixHash\",\"type\":\"bytes32\"}],\"name\":\"InvalidMixHash\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"actualNonce\",\"type\":\"bytes\"}],\"name\":\"InvalidNonce\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"actualOmmersHash\",\"type\":\"bytes32\"}],\"name\":\"InvalidOmmersHash\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"expectedLength\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"actualLength\",\"type\":\"uint256\"}],\"name\":\"InvalidPathLength\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"providedRevisionNumber\",\"type\":\"uint64\"}],\"name\":\"InvalidRevisionNumber\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"validator\",\"type\":\"address\"}],\"name\":\"InvalidValidatorAddress\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"length\",\"type\":\"uint256\"}],\"name\":\"InvalidValidatorAddressLength\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"expectedLength\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"actualLength\",\"type\":\"uint256\"}],\"name\":\"InvalidValueLength\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"UnsupportedMisbehaviour\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"actualValue\",\"type\":\"bytes32\"}],\"name\":\"ValueExists\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"previousAdminRole\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"newAdminRole\",\"type\":\"bytes32\"}],\"name\":\"RoleAdminChanged\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"RoleGranted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"RoleRevoked\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"DEFAULT_ADMIN_ROLE\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"PROOF_SUBMITTER_ROLE\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getClientState\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"revisionHeight\",\"type\":\"uint64\"}],\"name\":\"getConsensusState\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"}],\"name\":\"getRoleAdmin\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"grantRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"hasRole\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"name\":\"misbehaviour\",\"outputs\":[],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"callerConfirmation\",\"type\":\"address\"}],\"name\":\"renounceRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"revokeRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes4\",\"name\":\"interfaceId\",\"type\":\"bytes4\"}],\"name\":\"supportsInterface\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"updateMsg\",\"type\":\"bytes\"}],\"name\":\"updateClient\",\"outputs\":[{\"internalType\":\"enum ILightClientMsgs.UpdateResult\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes\",\"name\":\"proof\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"uint64\",\"name\":\"revisionNumber\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"revisionHeight\",\"type\":\"uint64\"}],\"internalType\":\"struct IICS02ClientMsgs.Height\",\"name\":\"proofHeight\",\"type\":\"tuple\"},{\"internalType\":\"bytes[]\",\"name\":\"path\",\"type\":\"bytes[]\"},{\"internalType\":\"bytes\",\"name\":\"value\",\"type\":\"bytes\"}],\"internalType\":\"struct ILightClientMsgs.MsgVerifyMembership\",\"name\":\"msg_\",\"type\":\"tuple\"}],\"name\":\"verifyMembership\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes\",\"name\":\"proof\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"uint64\",\"name\":\"revisionNumber\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"revisionHeight\",\"type\":\"uint64\"}],\"internalType\":\"struct IICS02ClientMsgs.Height\",\"name\":\"proofHeight\",\"type\":\"tuple\"},{\"internalType\":\"bytes[]\",\"name\":\"path\",\"type\":\"bytes[]\"}],\"internalType\":\"struct ILightClientMsgs.MsgVerifyNonMembership\",\"name\":\"msg_\",\"type\":\"tuple\"}],\"name\":\"verifyNonMembership\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"errors\":{\"AccessControlBadConfirmation()\":[{\"details\":\"The caller of a function is not the expected one. NOTE: Don't confuse with {AccessControlUnauthorizedAccount}.\"}],\"AccessControlUnauthorizedAccount(address,bytes32)\":[{\"details\":\"The `account` is missing a role.\"}]},\"events\":{\"RoleAdminChanged(bytes32,bytes32,bytes32)\":{\"details\":\"Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite {RoleAdminChanged} not being emitted to signal this.\"},\"RoleGranted(bytes32,address,address)\":{\"details\":\"Emitted when `account` is granted `role`. `sender` is the account that originated the contract call. This account bears the admin role (for the granted role). Expected in cases where the role was granted using the internal {AccessControl-_grantRole}.\"},\"RoleRevoked(bytes32,address,address)\":{\"details\":\"Emitted when `account` is revoked `role`. `sender` is the account that originated the contract call: - if using `revokeRole`, it is the admin role bearer - if using `renounceRole`, it is the role bearer (i.e. `account`)\"}},\"kind\":\"dev\",\"methods\":{\"getClientState()\":{\"returns\":{\"_0\":\"The client state.\"}},\"getRoleAdmin(bytes32)\":{\"details\":\"Returns the admin role that controls `role`. See {grantRole} and {revokeRole}. To change a role's admin, use {_setRoleAdmin}.\"},\"grantRole(bytes32,address)\":{\"details\":\"Grants `role` to `account`. If `account` had not been already granted `role`, emits a {RoleGranted} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleGranted} event.\"},\"hasRole(bytes32,address)\":{\"details\":\"Returns `true` if `account` has been granted `role`.\"},\"renounceRole(bytes32,address)\":{\"details\":\"Revokes `role` from the calling account. Roles are often managed via {grantRole} and {revokeRole}: this function's purpose is to provide a mechanism for accounts to lose their privileges if they are compromised (such as when a trusted device is misplaced). If the calling account had been revoked `role`, emits a {RoleRevoked} event. Requirements: - the caller must be `callerConfirmation`. May emit a {RoleRevoked} event.\"},\"revokeRole(bytes32,address)\":{\"details\":\"Revokes `role` from `account`. If `account` had been granted `role`, emits a {RoleRevoked} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleRevoked} event.\"},\"supportsInterface(bytes4)\":{\"details\":\"Returns true if this contract implements the interface defined by `interfaceId`. See the corresponding https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[ERC section] to learn more about how these ids are created. This function call must use less than 30 000 gas.\"},\"updateClient(bytes)\":{\"params\":{\"updateMsg\":\"The encoded update message e.g., an SP1 proof.\"},\"returns\":{\"_0\":\"The result of the update operation\"}},\"verifyMembership((bytes,(uint64,uint64),bytes[],bytes))\":{\"details\":\"Notice that this message is not view, as it may update the client state for caching purposes.\",\"params\":{\"msg_\":\"The membership message\"},\"returns\":{\"_0\":\"The unix timestamp of the verification height in the counterparty chain in seconds.\"}},\"verifyNonMembership((bytes,(uint64,uint64),bytes[]))\":{\"details\":\"Notice that this message is not view, as it may update the client state for caching purposes.\",\"params\":{\"msg_\":\"The membership message\"},\"returns\":{\"_0\":\"The unix timestamp of the verification height in the counterparty chain in seconds.\"}}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"getClientState()\":{\"notice\":\"Returns the client state.\"},\"updateClient(bytes)\":{\"notice\":\"Updating the client and consensus state\"},\"verifyMembership((bytes,(uint64,uint64),bytes[],bytes))\":{\"notice\":\"Querying the membership of a key-value pair\"},\"verifyNonMembership((bytes,(uint64,uint64),bytes[]))\":{\"notice\":\"Querying the non-membership of a key\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/light-clients/besu/BesuQBFTLightClient.sol\":\"BesuQBFTLightClient\"},\"evmVersion\":\"cancun\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"none\"},\"optimizer\":{\"enabled\":true,\"runs\":10000},\"remappings\":[\":@openzeppelin-contracts/=node_modules/@openzeppelin/contracts/\",\":@openzeppelin-upgradeable/=node_modules/@openzeppelin/contracts-upgradeable/\",\":@openzeppelin/=node_modules/@openzeppelin/\",\":@sp1-contracts/=node_modules/sp1-contracts/contracts/src/\",\":@uniswap/permit2/=node_modules/@uniswap/permit2/\",\":forge-std/=node_modules/forge-std/src/\",\":sp1-contracts/=node_modules/sp1-contracts/\"],\"viaIR\":true},\"sources\":{\"contracts/interfaces/ILightClient.sol\":{\"keccak256\":\"0x1caae9e4f741a86c0056d5f7713a35f3bd96db7a9fd52fc9f1cf79aad76a442f\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://4a536db3b926560f69547c17e4f451a2631ddea0f42bd224c7fd8382d74429f6\",\"dweb:/ipfs/QmcQ33kxcmmowXgMbQGTBgiKBjF7v8UiP4y73bB9hhDizC\"]},\"contracts/light-clients/besu/BesuLightClientBase.sol\":{\"keccak256\":\"0x44fd20d599cfed2298d6a26ec8584c5955b4c6b097d7b9f42d9ef7e462d7a4ad\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://86ce26f4e3d6b4327680d93daf5b8a795fb5e76cf566bd9328988d4b5e170c7e\",\"dweb:/ipfs/QmTkwvf1Xvasx3zpgcYVQa2VMEL1CXjrESwuV7vKNa3VhQ\"]},\"contracts/light-clients/besu/BesuQBFTLightClient.sol\":{\"keccak256\":\"0x77a13cd3904586c9d194f6161c1893f7eabd42e0b44a63d1f3c33fce78af4442\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://3f1538090d25aa3e2b0ee9d333aab1afbd5caa10ec9df5fe7a41ecc4a14856d3\",\"dweb:/ipfs/QmbPjkkXdjzKgj2JmzMbyWqfdywfQJVXgVgvJddW636XUb\"]},\"contracts/light-clients/besu/MPTProof.sol\":{\"keccak256\":\"0x232c01021016519bf2fdda5abfac7ab23f01e3c9f59c0233a5944d16a94b343a\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://17387ba08707c70bc36df9a36a7f731d63db9f183b2675b7db35b9861c24c3b7\",\"dweb:/ipfs/QmerMaj4tnVPwfdA69eVx9joJXQP72MR4KLudSpPf28NkZ\"]},\"contracts/light-clients/besu/RLPReader.sol\":{\"keccak256\":\"0xeb60cddae95fa2779d1e8f0d7a622737480ee67348ea0c6e65f13c93cfc9d5bb\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://550fcc3d1527dd6a4f3621a72d7afc5c49dd5aa4b16992934a81c17dd0386a27\",\"dweb:/ipfs/QmeF5UNemcyEeyU3y6Ru5bK4NG1v9xpWvp3J9WdXfsgkGa\"]},\"contracts/light-clients/besu/errors/IBesuLightClientErrors.sol\":{\"keccak256\":\"0x5b5fd8ec4ad07c713fb5337cfec9769e4d0fa30817bc237a98b2ce4cf155feac\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://8fc013ed01d0e08590ee92f80f8089c18c334024d4d1a77a04ce3673b5d1e103\",\"dweb:/ipfs/QmeWAn9JoVVsBin8JnvBLRP51QBCsM9m95bVrZoKFtkUfo\"]},\"contracts/light-clients/besu/msgs/IBesuLightClientMsgs.sol\":{\"keccak256\":\"0xbd6a5a6309d1076319f61820ae239848dcb4dca598240d5f9f927e02ed8b58c9\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://ef5a28164d53832a52112a91747dbe84439a8003c489116425b7fd2d631425d9\",\"dweb:/ipfs/QmbUqMt72DZFtfyupG9jQXEkQFGpVrUb4wQW3bNiUPV1AR\"]},\"contracts/msgs/IICS02ClientMsgs.sol\":{\"keccak256\":\"0xb5fdb25319d5c32b3f527982d45ec1e9bec5215515581aee034d853006ea01a0\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://6b8939bf552c62c952a491008bcd9b59ab7dda20a9482bf93438e05793881542\",\"dweb:/ipfs/QmfWmzNCp8bd4pP26Lfw5HHp4dSZnCDqZDjVN7SD8P7eDh\"]},\"contracts/msgs/ILightClientMsgs.sol\":{\"keccak256\":\"0xa0565e7748b8b3284d72e1aa6ef4cc8264fcaa5f4e0761d22d64686953db6378\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://c4476010d7090bfaa74127526f2051c6bc82ff42a09b936e848880a1f15a6065\",\"dweb:/ipfs/QmY87JgRsFQXSZdGXNjNHEJCkdTHzFXH4vZEJ3q7MnHuP8\"]},\"node_modules/@openzeppelin/contracts/access/AccessControl.sol\":{\"keccak256\":\"0x1a6b4f6b7798ab80929d491b89d5427a9b3338c0fd1acd0ba325f69c6f1646af\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://7bb7f346c12a14dc622bc105ce3c47202fbc89f4b153a28a63bb68193297330c\",\"dweb:/ipfs/QmagwF8P3bUBXwdo159ueEnY9dLSvEWwK24kk2op58egwG\"]},\"node_modules/@openzeppelin/contracts/access/IAccessControl.sol\":{\"keccak256\":\"0xbff9f59c84e5337689161ce7641c0ef8e872d6a7536fbc1f5133f128887aba3c\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://b308f882e796f7b79c9502deacb0a62983035c6f6f4e962b319ba6a1f4a77d3d\",\"dweb:/ipfs/QmaWCW7ahEQqFjwhSUhV7Ae7WhfNvzSpE7DQ58hvEooqPL\"]},\"node_modules/@openzeppelin/contracts/utils/Context.sol\":{\"keccak256\":\"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://6a708e8a5bdb1011c2c381c9a5cfd8a9a956d7d0a9dc1bd8bcdaf52f76ef2f12\",\"dweb:/ipfs/Qmax9WHBnVsZP46ZxEMNRQpLQnrdE4dK8LehML1Py8FowF\"]},\"node_modules/@openzeppelin/contracts/utils/cryptography/ECDSA.sol\":{\"keccak256\":\"0x69f54c02b7d81d505910ec198c11ed4c6a728418a868b906b4a0cf29946fda84\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://8e25e4bdb7ae1f21d23bfee996e22736fc0ab44cfabedac82a757b1edc5623b9\",\"dweb:/ipfs/QmQdWQvB6JCP9ZMbzi8EvQ1PTETqkcTWrbcVurS7DKpa5n\"]},\"node_modules/@openzeppelin/contracts/utils/introspection/ERC165.sol\":{\"keccak256\":\"0x2d9dc2fe26180f74c11c13663647d38e259e45f95eb88f57b61d2160b0109d3e\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://81233d1f98060113d9922180bb0f14f8335856fe9f339134b09335e9f678c377\",\"dweb:/ipfs/QmWh6R35SarhAn4z2wH8SU456jJSYL2FgucfTFgbHJJN4E\"]},\"node_modules/@openzeppelin/contracts/utils/introspection/IERC165.sol\":{\"keccak256\":\"0x8891738ffe910f0cf2da09566928589bf5d63f4524dd734fd9cedbac3274dd5c\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://971f954442df5c2ef5b5ebf1eb245d7105d9fbacc7386ee5c796df1d45b21617\",\"dweb:/ipfs/QmadRjHbkicwqwwh61raUEapaVEtaLMcYbQZWs9gUkgj3u\"]}},\"version\":1}","metadata":{"compiler":{"version":"0.8.28+commit.7893614a"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"address","name":"ibcRouter","type":"address"},{"internalType":"uint64","name":"initialTrustedHeight","type":"uint64"},{"internalType":"uint64","name":"initialTrustedTimestamp","type":"uint64"},{"internalType":"bytes32","name":"initialTrustedStorageRoot","type":"bytes32"},{"internalType":"address[]","name":"initialTrustedValidators","type":"address[]"},{"internalType":"uint64","name":"trustingPeriod","type":"uint64"},{"internalType":"uint64","name":"maxClockDrift","type":"uint64"},{"internalType":"address","name":"roleManager","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"type":"error","name":"AccessControlBadConfirmation"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bytes32","name":"neededRole","type":"bytes32"}],"type":"error","name":"AccessControlUnauthorizedAccount"},{"inputs":[{"internalType":"uint64","name":"revisionHeight","type":"uint64"}],"type":"error","name":"ConflictingConsensusState"},{"inputs":[{"internalType":"uint64","name":"trustedTimestamp","type":"uint64"},{"internalType":"uint256","name":"currentTimestamp","type":"uint256"},{"internalType":"uint64","name":"trustingPeriod","type":"uint64"}],"type":"error","name":"ConsensusStateExpired"},{"inputs":[{"internalType":"uint64","name":"revisionHeight","type":"uint64"}],"type":"error","name":"ConsensusStateNotFound"},{"inputs":[{"internalType":"address","name":"signer","type":"address"}],"type":"error","name":"DuplicateCommitSealSigner"},{"inputs":[{"internalType":"address","name":"validator","type":"address"}],"type":"error","name":"DuplicateValidator"},{"inputs":[],"type":"error","name":"EmptyValidatorSet"},{"inputs":[{"internalType":"uint256","name":"currentTimestamp","type":"uint256"},{"internalType":"uint256","name":"headerTimestamp","type":"uint256"},{"internalType":"uint256","name":"maxClockDrift","type":"uint256"}],"type":"error","name":"HeaderFromFuture"},{"inputs":[{"internalType":"uint256","name":"actual","type":"uint256"},{"internalType":"uint256","name":"required","type":"uint256"}],"type":"error","name":"InsufficientTrustedValidatorOverlap"},{"inputs":[{"internalType":"uint256","name":"actual","type":"uint256"},{"internalType":"uint256","name":"required","type":"uint256"}],"type":"error","name":"InsufficientValidatorQuorum"},{"inputs":[],"type":"error","name":"InvalidCommitSeal"},{"inputs":[{"internalType":"bytes32","name":"expectedValue","type":"bytes32"},{"internalType":"bytes32","name":"actualValue","type":"bytes32"}],"type":"error","name":"InvalidCommitmentValue"},{"inputs":[{"internalType":"uint256","name":"actualDifficulty","type":"uint256"}],"type":"error","name":"InvalidDifficulty"},{"inputs":[{"internalType":"uint256","name":"length","type":"uint256"}],"type":"error","name":"InvalidECDSASignatureLength"},{"inputs":[{"internalType":"uint256","name":"itemsLength","type":"uint256"}],"type":"error","name":"InvalidExtraDataFormat"},{"inputs":[{"internalType":"uint256","name":"itemsLength","type":"uint256"}],"type":"error","name":"InvalidHeaderFormat"},{"inputs":[],"type":"error","name":"InvalidHeaderHeight"},{"inputs":[{"internalType":"bytes32","name":"actualMixHash","type":"bytes32"}],"type":"error","name":"InvalidMixHash"},{"inputs":[{"internalType":"bytes","name":"actualNonce","type":"bytes"}],"type":"error","name":"InvalidNonce"},{"inputs":[{"internalType":"bytes32","name":"actualOmmersHash","type":"bytes32"}],"type":"error","name":"InvalidOmmersHash"},{"inputs":[{"internalType":"uint256","name":"expectedLength","type":"uint256"},{"internalType":"uint256","name":"actualLength","type":"uint256"}],"type":"error","name":"InvalidPathLength"},{"inputs":[{"internalType":"uint64","name":"providedRevisionNumber","type":"uint64"}],"type":"error","name":"InvalidRevisionNumber"},{"inputs":[{"internalType":"address","name":"validator","type":"address"}],"type":"error","name":"InvalidValidatorAddress"},{"inputs":[{"internalType":"uint256","name":"length","type":"uint256"}],"type":"error","name":"InvalidValidatorAddressLength"},{"inputs":[{"internalType":"uint256","name":"expectedLength","type":"uint256"},{"internalType":"uint256","name":"actualLength","type":"uint256"}],"type":"error","name":"InvalidValueLength"},{"inputs":[],"type":"error","name":"UnsupportedMisbehaviour"},{"inputs":[{"internalType":"bytes32","name":"actualValue","type":"bytes32"}],"type":"error","name":"ValueExists"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32","indexed":true},{"internalType":"bytes32","name":"previousAdminRole","type":"bytes32","indexed":true},{"internalType":"bytes32","name":"newAdminRole","type":"bytes32","indexed":true}],"type":"event","name":"RoleAdminChanged","anonymous":false},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32","indexed":true},{"internalType":"address","name":"account","type":"address","indexed":true},{"internalType":"address","name":"sender","type":"address","indexed":true}],"type":"event","name":"RoleGranted","anonymous":false},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32","indexed":true},{"internalType":"address","name":"account","type":"address","indexed":true},{"internalType":"address","name":"sender","type":"address","indexed":true}],"type":"event","name":"RoleRevoked","anonymous":false},{"inputs":[],"stateMutability":"view","type":"function","name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"PROOF_SUBMITTER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"getClientState","outputs":[{"internalType":"bytes","name":"","type":"bytes"}]},{"inputs":[{"internalType":"uint64","name":"revisionHeight","type":"uint64"}],"stateMutability":"view","type":"function","name":"getConsensusState","outputs":[{"internalType":"bytes","name":"","type":"bytes"}]},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"stateMutability":"view","type":"function","name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}]},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"stateMutability":"nonpayable","type":"function","name":"grantRole"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"stateMutability":"view","type":"function","name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}]},{"inputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function","name":"misbehaviour"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"callerConfirmation","type":"address"}],"stateMutability":"nonpayable","type":"function","name":"renounceRole"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"stateMutability":"nonpayable","type":"function","name":"revokeRole"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"stateMutability":"view","type":"function","name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}]},{"inputs":[{"internalType":"bytes","name":"updateMsg","type":"bytes"}],"stateMutability":"nonpayable","type":"function","name":"updateClient","outputs":[{"internalType":"enum ILightClientMsgs.UpdateResult","name":"","type":"uint8"}]},{"inputs":[{"internalType":"struct ILightClientMsgs.MsgVerifyMembership","name":"msg_","type":"tuple","components":[{"internalType":"bytes","name":"proof","type":"bytes"},{"internalType":"struct IICS02ClientMsgs.Height","name":"proofHeight","type":"tuple","components":[{"internalType":"uint64","name":"revisionNumber","type":"uint64"},{"internalType":"uint64","name":"revisionHeight","type":"uint64"}]},{"internalType":"bytes[]","name":"path","type":"bytes[]"},{"internalType":"bytes","name":"value","type":"bytes"}]}],"stateMutability":"view","type":"function","name":"verifyMembership","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[{"internalType":"struct ILightClientMsgs.MsgVerifyNonMembership","name":"msg_","type":"tuple","components":[{"internalType":"bytes","name":"proof","type":"bytes"},{"internalType":"struct IICS02ClientMsgs.Height","name":"proofHeight","type":"tuple","components":[{"internalType":"uint64","name":"revisionNumber","type":"uint64"},{"internalType":"uint64","name":"revisionHeight","type":"uint64"}]},{"internalType":"bytes[]","name":"path","type":"bytes[]"}]}],"stateMutability":"view","type":"function","name":"verifyNonMembership","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]}],"devdoc":{"kind":"dev","methods":{"getClientState()":{"returns":{"_0":"The client state."}},"getRoleAdmin(bytes32)":{"details":"Returns the admin role that controls `role`. See {grantRole} and {revokeRole}. To change a role's admin, use {_setRoleAdmin}."},"grantRole(bytes32,address)":{"details":"Grants `role` to `account`. If `account` had not been already granted `role`, emits a {RoleGranted} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleGranted} event."},"hasRole(bytes32,address)":{"details":"Returns `true` if `account` has been granted `role`."},"renounceRole(bytes32,address)":{"details":"Revokes `role` from the calling account. Roles are often managed via {grantRole} and {revokeRole}: this function's purpose is to provide a mechanism for accounts to lose their privileges if they are compromised (such as when a trusted device is misplaced). If the calling account had been revoked `role`, emits a {RoleRevoked} event. Requirements: - the caller must be `callerConfirmation`. May emit a {RoleRevoked} event."},"revokeRole(bytes32,address)":{"details":"Revokes `role` from `account`. If `account` had been granted `role`, emits a {RoleRevoked} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleRevoked} event."},"supportsInterface(bytes4)":{"details":"Returns true if this contract implements the interface defined by `interfaceId`. See the corresponding https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[ERC section] to learn more about how these ids are created. This function call must use less than 30 000 gas."},"updateClient(bytes)":{"params":{"updateMsg":"The encoded update message e.g., an SP1 proof."},"returns":{"_0":"The result of the update operation"}},"verifyMembership((bytes,(uint64,uint64),bytes[],bytes))":{"details":"Notice that this message is not view, as it may update the client state for caching purposes.","params":{"msg_":"The membership message"},"returns":{"_0":"The unix timestamp of the verification height in the counterparty chain in seconds."}},"verifyNonMembership((bytes,(uint64,uint64),bytes[]))":{"details":"Notice that this message is not view, as it may update the client state for caching purposes.","params":{"msg_":"The membership message"},"returns":{"_0":"The unix timestamp of the verification height in the counterparty chain in seconds."}}},"version":1},"userdoc":{"kind":"user","methods":{"getClientState()":{"notice":"Returns the client state."},"updateClient(bytes)":{"notice":"Updating the client and consensus state"},"verifyMembership((bytes,(uint64,uint64),bytes[],bytes))":{"notice":"Querying the membership of a key-value pair"},"verifyNonMembership((bytes,(uint64,uint64),bytes[]))":{"notice":"Querying the non-membership of a key"}},"version":1}},"settings":{"remappings":["@openzeppelin-contracts/=node_modules/@openzeppelin/contracts/","@openzeppelin-upgradeable/=node_modules/@openzeppelin/contracts-upgradeable/","@openzeppelin/=node_modules/@openzeppelin/","@sp1-contracts/=node_modules/sp1-contracts/contracts/src/","@uniswap/permit2/=node_modules/@uniswap/permit2/","forge-std/=node_modules/forge-std/src/","sp1-contracts/=node_modules/sp1-contracts/"],"optimizer":{"enabled":true,"runs":10000},"metadata":{"bytecodeHash":"none"},"compilationTarget":{"contracts/light-clients/besu/BesuQBFTLightClient.sol":"BesuQBFTLightClient"},"evmVersion":"cancun","libraries":{},"viaIR":true},"sources":{"contracts/interfaces/ILightClient.sol":{"keccak256":"0x1caae9e4f741a86c0056d5f7713a35f3bd96db7a9fd52fc9f1cf79aad76a442f","urls":["bzz-raw://4a536db3b926560f69547c17e4f451a2631ddea0f42bd224c7fd8382d74429f6","dweb:/ipfs/QmcQ33kxcmmowXgMbQGTBgiKBjF7v8UiP4y73bB9hhDizC"],"license":"MIT"},"contracts/light-clients/besu/BesuLightClientBase.sol":{"keccak256":"0x44fd20d599cfed2298d6a26ec8584c5955b4c6b097d7b9f42d9ef7e462d7a4ad","urls":["bzz-raw://86ce26f4e3d6b4327680d93daf5b8a795fb5e76cf566bd9328988d4b5e170c7e","dweb:/ipfs/QmTkwvf1Xvasx3zpgcYVQa2VMEL1CXjrESwuV7vKNa3VhQ"],"license":"MIT"},"contracts/light-clients/besu/BesuQBFTLightClient.sol":{"keccak256":"0x77a13cd3904586c9d194f6161c1893f7eabd42e0b44a63d1f3c33fce78af4442","urls":["bzz-raw://3f1538090d25aa3e2b0ee9d333aab1afbd5caa10ec9df5fe7a41ecc4a14856d3","dweb:/ipfs/QmbPjkkXdjzKgj2JmzMbyWqfdywfQJVXgVgvJddW636XUb"],"license":"MIT"},"contracts/light-clients/besu/MPTProof.sol":{"keccak256":"0x232c01021016519bf2fdda5abfac7ab23f01e3c9f59c0233a5944d16a94b343a","urls":["bzz-raw://17387ba08707c70bc36df9a36a7f731d63db9f183b2675b7db35b9861c24c3b7","dweb:/ipfs/QmerMaj4tnVPwfdA69eVx9joJXQP72MR4KLudSpPf28NkZ"],"license":"Apache-2.0"},"contracts/light-clients/besu/RLPReader.sol":{"keccak256":"0xeb60cddae95fa2779d1e8f0d7a622737480ee67348ea0c6e65f13c93cfc9d5bb","urls":["bzz-raw://550fcc3d1527dd6a4f3621a72d7afc5c49dd5aa4b16992934a81c17dd0386a27","dweb:/ipfs/QmeF5UNemcyEeyU3y6Ru5bK4NG1v9xpWvp3J9WdXfsgkGa"],"license":"Apache-2.0"},"contracts/light-clients/besu/errors/IBesuLightClientErrors.sol":{"keccak256":"0x5b5fd8ec4ad07c713fb5337cfec9769e4d0fa30817bc237a98b2ce4cf155feac","urls":["bzz-raw://8fc013ed01d0e08590ee92f80f8089c18c334024d4d1a77a04ce3673b5d1e103","dweb:/ipfs/QmeWAn9JoVVsBin8JnvBLRP51QBCsM9m95bVrZoKFtkUfo"],"license":"MIT"},"contracts/light-clients/besu/msgs/IBesuLightClientMsgs.sol":{"keccak256":"0xbd6a5a6309d1076319f61820ae239848dcb4dca598240d5f9f927e02ed8b58c9","urls":["bzz-raw://ef5a28164d53832a52112a91747dbe84439a8003c489116425b7fd2d631425d9","dweb:/ipfs/QmbUqMt72DZFtfyupG9jQXEkQFGpVrUb4wQW3bNiUPV1AR"],"license":"MIT"},"contracts/msgs/IICS02ClientMsgs.sol":{"keccak256":"0xb5fdb25319d5c32b3f527982d45ec1e9bec5215515581aee034d853006ea01a0","urls":["bzz-raw://6b8939bf552c62c952a491008bcd9b59ab7dda20a9482bf93438e05793881542","dweb:/ipfs/QmfWmzNCp8bd4pP26Lfw5HHp4dSZnCDqZDjVN7SD8P7eDh"],"license":"MIT"},"contracts/msgs/ILightClientMsgs.sol":{"keccak256":"0xa0565e7748b8b3284d72e1aa6ef4cc8264fcaa5f4e0761d22d64686953db6378","urls":["bzz-raw://c4476010d7090bfaa74127526f2051c6bc82ff42a09b936e848880a1f15a6065","dweb:/ipfs/QmY87JgRsFQXSZdGXNjNHEJCkdTHzFXH4vZEJ3q7MnHuP8"],"license":"MIT"},"node_modules/@openzeppelin/contracts/access/AccessControl.sol":{"keccak256":"0x1a6b4f6b7798ab80929d491b89d5427a9b3338c0fd1acd0ba325f69c6f1646af","urls":["bzz-raw://7bb7f346c12a14dc622bc105ce3c47202fbc89f4b153a28a63bb68193297330c","dweb:/ipfs/QmagwF8P3bUBXwdo159ueEnY9dLSvEWwK24kk2op58egwG"],"license":"MIT"},"node_modules/@openzeppelin/contracts/access/IAccessControl.sol":{"keccak256":"0xbff9f59c84e5337689161ce7641c0ef8e872d6a7536fbc1f5133f128887aba3c","urls":["bzz-raw://b308f882e796f7b79c9502deacb0a62983035c6f6f4e962b319ba6a1f4a77d3d","dweb:/ipfs/QmaWCW7ahEQqFjwhSUhV7Ae7WhfNvzSpE7DQ58hvEooqPL"],"license":"MIT"},"node_modules/@openzeppelin/contracts/utils/Context.sol":{"keccak256":"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2","urls":["bzz-raw://6a708e8a5bdb1011c2c381c9a5cfd8a9a956d7d0a9dc1bd8bcdaf52f76ef2f12","dweb:/ipfs/Qmax9WHBnVsZP46ZxEMNRQpLQnrdE4dK8LehML1Py8FowF"],"license":"MIT"},"node_modules/@openzeppelin/contracts/utils/cryptography/ECDSA.sol":{"keccak256":"0x69f54c02b7d81d505910ec198c11ed4c6a728418a868b906b4a0cf29946fda84","urls":["bzz-raw://8e25e4bdb7ae1f21d23bfee996e22736fc0ab44cfabedac82a757b1edc5623b9","dweb:/ipfs/QmQdWQvB6JCP9ZMbzi8EvQ1PTETqkcTWrbcVurS7DKpa5n"],"license":"MIT"},"node_modules/@openzeppelin/contracts/utils/introspection/ERC165.sol":{"keccak256":"0x2d9dc2fe26180f74c11c13663647d38e259e45f95eb88f57b61d2160b0109d3e","urls":["bzz-raw://81233d1f98060113d9922180bb0f14f8335856fe9f339134b09335e9f678c377","dweb:/ipfs/QmWh6R35SarhAn4z2wH8SU456jJSYL2FgucfTFgbHJJN4E"],"license":"MIT"},"node_modules/@openzeppelin/contracts/utils/introspection/IERC165.sol":{"keccak256":"0x8891738ffe910f0cf2da09566928589bf5d63f4524dd734fd9cedbac3274dd5c","urls":["bzz-raw://971f954442df5c2ef5b5ebf1eb245d7105d9fbacc7386ee5c796df1d45b21617","dweb:/ipfs/QmadRjHbkicwqwwh61raUEapaVEtaLMcYbQZWs9gUkgj3u"],"license":"MIT"}},"version":1},"id":36} \ No newline at end of file diff --git a/ibc-solidity/abi/bytecode/DummyLightClient.json b/ibc-solidity/abi/bytecode/DummyLightClient.json new file mode 100644 index 000000000..a600e2b42 --- /dev/null +++ b/ibc-solidity/abi/bytecode/DummyLightClient.json @@ -0,0 +1 @@ +{"abi":[{"type":"function","name":"getClientState","inputs":[],"outputs":[{"name":"","type":"bytes","internalType":"bytes"}],"stateMutability":"view"},{"type":"function","name":"misbehaviour","inputs":[{"name":"","type":"bytes","internalType":"bytes"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"updateClient","inputs":[{"name":"updateMsg","type":"bytes","internalType":"bytes"}],"outputs":[{"name":"","type":"uint8","internalType":"enum ILightClientMsgs.UpdateResult"}],"stateMutability":"nonpayable"},{"type":"function","name":"verifyMembership","inputs":[{"name":"msg_","type":"tuple","internalType":"struct ILightClientMsgs.MsgVerifyMembership","components":[{"name":"proof","type":"bytes","internalType":"bytes"},{"name":"proofHeight","type":"tuple","internalType":"struct IICS02ClientMsgs.Height","components":[{"name":"revisionNumber","type":"uint64","internalType":"uint64"},{"name":"revisionHeight","type":"uint64","internalType":"uint64"}]},{"name":"path","type":"bytes[]","internalType":"bytes[]"},{"name":"value","type":"bytes","internalType":"bytes"}]}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"nonpayable"},{"type":"function","name":"verifyNonMembership","inputs":[{"name":"msg_","type":"tuple","internalType":"struct ILightClientMsgs.MsgVerifyNonMembership","components":[{"name":"proof","type":"bytes","internalType":"bytes"},{"name":"proofHeight","type":"tuple","internalType":"struct IICS02ClientMsgs.Height","components":[{"name":"revisionNumber","type":"uint64","internalType":"uint64"},{"name":"revisionHeight","type":"uint64","internalType":"uint64"}]},{"name":"path","type":"bytes[]","internalType":"bytes[]"}]}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"nonpayable"}],"bytecode":{"object":"0x60808060405234601557610c5a908161001a8239f35b5f80fdfe6080806040526004361015610012575f80fd5b5f3560e01c9081630bece3561461031f575080634d6d9ffb1461024a578063682ed5f0146100d2578063ddba6537146100c25763ef913a4b14610053575f80fd5b346100be575f6003193601126100be576100ba60405167ffffffffffffffff5f54818116602084015260401c16604082015267ffffffffffffffff600154166060820152606081526100a6608082610860565b60405191829160208352602083019061081f565b0390f35b5f80fd5b346100be576100d0366107ce565b005b346100be5760206003193601126100be5760043567ffffffffffffffff81116100be578060040160a060031983360301126100be57602482019161014661011884610a96565b936101406064608485019461013961013087896109cd565b90501515610914565b0185610979565b91610b32565b5f52600360205260405f20549182156101ec5761016d91610166916109cd565b36916108b0565b602081519101200361018e5760209067ffffffffffffffff60405191168152f35b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f76616c7565206d69736d617463680000000000000000000000000000000000006044820152fd5b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f6d697373696e67206d656d6265727368697000000000000000000000000000006044820152fd5b346100be5760206003193601126100be5760043567ffffffffffffffff81116100be57608060031982360301126100be5761029c6024820161014061028e82610a96565b936064810190600401610979565b5f52600360205260405f20546102c15760209067ffffffffffffffff60405191168152f35b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f6d656d62657273686970206578697374730000000000000000000000000000006044820152fd5b346100be5761032d366107ce565b8101906020818303126100be5780359067ffffffffffffffff82116100be570191828203608081126100be57606082019082821067ffffffffffffffff8311176107a1576040918252126100be5760405161038781610844565b61039084610883565b815261039e60208501610883565b602082015281526103b160408401610883565b926020820193845260608101359067ffffffffffffffff82116100be57019180601f840112156100be578235926103e784610898565b936103f56040519586610860565b80855260208086019160051b830101918383116100be5760208101915b8383106106a6578787876040810191825267ffffffffffffffff8351161561064857519167ffffffffffffffff808451169161045660208601938385511690610a1e565b82825116905f52600260205260405f20907fffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000825416179055511680602060405161049f81610844565b868152015267ffffffffffffffff8451167fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000005f5416175f5581517fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff6fffffffffffffffff00000000000000005f549260401b169116175f557fffffffffffffffffffffffffffffffffffffffffffffffff000000000000000060015416176001555f5b8251805182101561063e576020908260051b01015160208101906105698251511515610914565b5160405160208101916040820160208452815180915260608301602060608360051b8601019301915f5b8181106105f7575050505091816105ba6105db93600197969503601f198101835282610860565b51902067ffffffffffffffff88511667ffffffffffffffff87511690610a50565b905160208151910120905f52600360205260405f205501610542565b90919293602080610632837fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa08a60019603018852885161081f565b96019401929101610593565b60206040515f8152f35b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f7a65726f2074696d657374616d700000000000000000000000000000000000006044820152fd5b823567ffffffffffffffff81116100be578201906040601f1983880301126100be57604051906106d582610844565b602083013567ffffffffffffffff81116100be5760209084010187601f820112156100be57803561070581610898565b916107136040519384610860565b81835260208084019260051b820101918a83116100be5760208201905b8382106107735750505050825260408301359167ffffffffffffffff83116100be57610764886020809695819601016108f6565b83820152815201920191610412565b813567ffffffffffffffff81116100be576020916107968e8480948801016108f6565b815201910190610730565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b9060206003198301126100be5760043567ffffffffffffffff81116100be57826023820112156100be5780600401359267ffffffffffffffff84116100be57602484830101116100be576024019190565b90601f19601f602080948051918291828752018686015e5f8582860101520116010190565b6040810190811067ffffffffffffffff8211176107a157604052565b90601f601f19910116810190811067ffffffffffffffff8211176107a157604052565b359067ffffffffffffffff821682036100be57565b67ffffffffffffffff81116107a15760051b60200190565b92919267ffffffffffffffff82116107a157604051916108da6020601f19601f8401160184610860565b8294818452818301116100be578281602093845f960137010152565b9080601f830112156100be57816020610911933591016108b0565b90565b1561091b57565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600b60248201527f656d7074792076616c75650000000000000000000000000000000000000000006044820152fd5b9035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1813603018212156100be570180359067ffffffffffffffff82116100be57602001918160051b360383136100be57565b9035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1813603018212156100be570180359067ffffffffffffffff82116100be576020019181360383136100be57565b9067ffffffffffffffff6040519181602084019416845216604082015260408152610a4a606082610860565b51902090565b9167ffffffffffffffff60405192816020850195168552166040830152606082015260608152610a4a608082610860565b3567ffffffffffffffff811681036100be5790565b610ab590610aaf6020610aa883610a81565b9201610a81565b90610a1e565b5f52600260205267ffffffffffffffff60405f2054168015610ad45790565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f756e6b6e6f776e206865696768740000000000000000000000000000000000006044820152fd5b90929192610b4b6020610b4484610a81565b9301610a81565b90604051946020860191816040880160208552526060870160608360051b89010192825f907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1813603015b838310610bc45750505050505094610bbb81610911969703601f198101835282610860565b51902091610a50565b9091929394957fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa08c82030186528635828112156100be578301906020823592019167ffffffffffffffff81116100be5780360383136100be57602082601f19601f8480600198869897879852868601375f84820186015201160101980196019493019190610b9656fea164736f6c634300081c000a","sourceMap":"261:3672:41:-:0;;;;;;;;;;;;;;;;;","linkReferences":{}},"deployedBytecode":{"object":"0x6080806040526004361015610012575f80fd5b5f3560e01c9081630bece3561461031f575080634d6d9ffb1461024a578063682ed5f0146100d2578063ddba6537146100c25763ef913a4b14610053575f80fd5b346100be575f6003193601126100be576100ba60405167ffffffffffffffff5f54818116602084015260401c16604082015267ffffffffffffffff600154166060820152606081526100a6608082610860565b60405191829160208352602083019061081f565b0390f35b5f80fd5b346100be576100d0366107ce565b005b346100be5760206003193601126100be5760043567ffffffffffffffff81116100be578060040160a060031983360301126100be57602482019161014661011884610a96565b936101406064608485019461013961013087896109cd565b90501515610914565b0185610979565b91610b32565b5f52600360205260405f20549182156101ec5761016d91610166916109cd565b36916108b0565b602081519101200361018e5760209067ffffffffffffffff60405191168152f35b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f76616c7565206d69736d617463680000000000000000000000000000000000006044820152fd5b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f6d697373696e67206d656d6265727368697000000000000000000000000000006044820152fd5b346100be5760206003193601126100be5760043567ffffffffffffffff81116100be57608060031982360301126100be5761029c6024820161014061028e82610a96565b936064810190600401610979565b5f52600360205260405f20546102c15760209067ffffffffffffffff60405191168152f35b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f6d656d62657273686970206578697374730000000000000000000000000000006044820152fd5b346100be5761032d366107ce565b8101906020818303126100be5780359067ffffffffffffffff82116100be570191828203608081126100be57606082019082821067ffffffffffffffff8311176107a1576040918252126100be5760405161038781610844565b61039084610883565b815261039e60208501610883565b602082015281526103b160408401610883565b926020820193845260608101359067ffffffffffffffff82116100be57019180601f840112156100be578235926103e784610898565b936103f56040519586610860565b80855260208086019160051b830101918383116100be5760208101915b8383106106a6578787876040810191825267ffffffffffffffff8351161561064857519167ffffffffffffffff808451169161045660208601938385511690610a1e565b82825116905f52600260205260405f20907fffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000825416179055511680602060405161049f81610844565b868152015267ffffffffffffffff8451167fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000005f5416175f5581517fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff6fffffffffffffffff00000000000000005f549260401b169116175f557fffffffffffffffffffffffffffffffffffffffffffffffff000000000000000060015416176001555f5b8251805182101561063e576020908260051b01015160208101906105698251511515610914565b5160405160208101916040820160208452815180915260608301602060608360051b8601019301915f5b8181106105f7575050505091816105ba6105db93600197969503601f198101835282610860565b51902067ffffffffffffffff88511667ffffffffffffffff87511690610a50565b905160208151910120905f52600360205260405f205501610542565b90919293602080610632837fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa08a60019603018852885161081f565b96019401929101610593565b60206040515f8152f35b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f7a65726f2074696d657374616d700000000000000000000000000000000000006044820152fd5b823567ffffffffffffffff81116100be578201906040601f1983880301126100be57604051906106d582610844565b602083013567ffffffffffffffff81116100be5760209084010187601f820112156100be57803561070581610898565b916107136040519384610860565b81835260208084019260051b820101918a83116100be5760208201905b8382106107735750505050825260408301359167ffffffffffffffff83116100be57610764886020809695819601016108f6565b83820152815201920191610412565b813567ffffffffffffffff81116100be576020916107968e8480948801016108f6565b815201910190610730565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b9060206003198301126100be5760043567ffffffffffffffff81116100be57826023820112156100be5780600401359267ffffffffffffffff84116100be57602484830101116100be576024019190565b90601f19601f602080948051918291828752018686015e5f8582860101520116010190565b6040810190811067ffffffffffffffff8211176107a157604052565b90601f601f19910116810190811067ffffffffffffffff8211176107a157604052565b359067ffffffffffffffff821682036100be57565b67ffffffffffffffff81116107a15760051b60200190565b92919267ffffffffffffffff82116107a157604051916108da6020601f19601f8401160184610860565b8294818452818301116100be578281602093845f960137010152565b9080601f830112156100be57816020610911933591016108b0565b90565b1561091b57565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600b60248201527f656d7074792076616c75650000000000000000000000000000000000000000006044820152fd5b9035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1813603018212156100be570180359067ffffffffffffffff82116100be57602001918160051b360383136100be57565b9035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1813603018212156100be570180359067ffffffffffffffff82116100be576020019181360383136100be57565b9067ffffffffffffffff6040519181602084019416845216604082015260408152610a4a606082610860565b51902090565b9167ffffffffffffffff60405192816020850195168552166040830152606082015260608152610a4a608082610860565b3567ffffffffffffffff811681036100be5790565b610ab590610aaf6020610aa883610a81565b9201610a81565b90610a1e565b5f52600260205267ffffffffffffffff60405f2054168015610ad45790565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f756e6b6e6f776e206865696768740000000000000000000000000000000000006044820152fd5b90929192610b4b6020610b4484610a81565b9301610a81565b90604051946020860191816040880160208552526060870160608360051b89010192825f907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1813603015b838310610bc45750505050505094610bbb81610911969703601f198101835282610860565b51902091610a50565b9091929394957fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa08c82030186528635828112156100be578301906020823592019167ffffffffffffffff81116100be5780360383136100be57602082601f19601f8480600198869897879852868601375f84820186015201160101980196019493019190610b9656fea164736f6c634300081c000a","sourceMap":"261:3672:41:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;261:3672:41;;;;;;;;;;;;;;2883:24;;;261:3672;;;;;;;;;;;;;;;;;2883:24;;;;;;:::i;:::-;261:3672;;;;;2883:24;261:3672;;2883:24;261:3672;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;261:3672:41;;;;;;;;;;;;;;;;-1:-1:-1;;261:3672:41;;;;;;;2032:16;;;2021:28;2159:43;2021:28;;;:::i;:::-;2067:10;2192:9;;2067:10;;;;2059:46;2067:10;;;;:::i;:::-;:22;;;;2059:46;:::i;:::-;2192:9;;;:::i;:::-;2159:43;;:::i;:::-;261:3672;;2136:22;261:3672;;;;;;2221:23;;;261:3672;;;2308:10;;;;:::i;:::-;261:3672;;;:::i;:::-;;;;;;2298:21;2285:34;261:3672;;;;;;;;;;;;;2192:9;261:3672;;;;;;;;;;;2032:16;261:3672;;;;;;;;;;2192:9;261:3672;;;;;;;;;;;2032:16;261:3672;;;;;;;;;;;;;;-1:-1:-1;;261:3672:41;;;;;;;;;;;;;-1:-1:-1;;261:3672:41;;;;;;;2600:43;2529:16;;;2633:9;2518:28;;;:::i;:::-;2633:9;;;;261:3672;;;2633:9;:::i;2600:43::-;261:3672;;2577:22;261:3672;;;;;;;;;;;;;;;;;;;2633:9;261:3672;;;;;;;;;;;2529:16;261:3672;;;;;;;;;;;;;;;;:::i;:::-;966:40;;261:3672;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1024:19;261:3672;;1113:11;261:3672;;;;;;1188:21;1154:56;261:3672;1188:21;;261:3672;;;;;1154:56;;:::i;:::-;261:3672;;;;;;;1220:11;261:3672;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;1284:70;261:3672;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1414:3;1389:16;;261:3672;;1385:27;;;;;261:3672;;;;;;;1464:19;261:3672;1505:16;;;1497:52;1505:16;;261:3672;1505:28;;1497:52;:::i;:::-;1604:15;261:3672;;;1593:27;;261:3672;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1593:27;;;;;;;1659:70;1593:27;261:3672;1593:27;;;;-1:-1:-1;;1593:27:41;;;;;;:::i;:::-;261:3672;1583:38;;261:3672;;;;;;;;1659:70;;:::i;:::-;1793:16;;261:3672;;;;;1783:27;261:3672;;;1743:22;261:3672;;;;;;;1370:13;;261:3672;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;1385:27;261:3672;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;261:3672:41;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;261:3672:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;-1:-1:-1;;261:3672:41;;;;;;;;;;;;;;;;;-1:-1:-1;261:3672:41;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;:::o;:::-;;;-1:-1:-1;;261:3672:41;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;:::o;:::-;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;-1:-1:-1;;261:3672:41;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;-1:-1:-1;261:3672:41;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;:::i;:::-;;:::o;:::-;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;3487:174::-;;261:3672;;;3611:42;;;;;261:3672;;;;;;;;;;3611:42;;;;;;:::i;:::-;261:3672;3601:53;;3487:174;:::o;3667:264::-;;261:3672;;;3871:52;;;;;261:3672;;;;;;;;;;;;;;3871:52;;;;;;:::i;261:3672::-;;;;;;;;;;:::o;2920:273::-;3052:56;2920:273;3086:21;;3063;;;:::i;:::-;3086;;;:::i;:::-;3052:56;;:::i;:::-;-1:-1:-1;261:3672:41;3040:11;3086:21;261:3672;;;-1:-1:-1;261:3672:41;;;3127:14;;261:3672;;2920:273;:::o;261:3672::-;;;;;;;3086:21;261:3672;;;;;;;;;;;;;;;3199:282;;;;;3423:21;;3400;;;:::i;:::-;3423;;;:::i;:::-;261:3672;;;3456:16;3423:21;3456:16;;261:3672;;;;;3423:21;261:3672;;;;;;;;;;;;;;;-1:-1:-1;261:3672:41;;;;;;;;;;;;3456:16;;;;;;;;;3385:89;3456:16;;;-1:-1:-1;;3456:16:41;;;;;;:::i;:::-;261:3672;3446:27;;3385:89;;:::i;261:3672::-;;;;;;;;;;;;;;;;;;;;;;;;;3423:21;261:3672;;;;;;;;;;;;;;;;;3423:21;261:3672;-1:-1:-1;;261:3672:41;;;;;;;;;;;;;;;-1:-1:-1;261:3672:41;;;;;;;;;;;;;;;;;;;;","linkReferences":{}},"methodIdentifiers":{"getClientState()":"ef913a4b","misbehaviour(bytes)":"ddba6537","updateClient(bytes)":"0bece356","verifyMembership((bytes,(uint64,uint64),bytes[],bytes))":"682ed5f0","verifyNonMembership((bytes,(uint64,uint64),bytes[]))":"4d6d9ffb"},"rawMetadata":"{\"compiler\":{\"version\":\"0.8.28+commit.7893614a\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"name\":\"getClientState\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"name\":\"misbehaviour\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"updateMsg\",\"type\":\"bytes\"}],\"name\":\"updateClient\",\"outputs\":[{\"internalType\":\"enum ILightClientMsgs.UpdateResult\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes\",\"name\":\"proof\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"uint64\",\"name\":\"revisionNumber\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"revisionHeight\",\"type\":\"uint64\"}],\"internalType\":\"struct IICS02ClientMsgs.Height\",\"name\":\"proofHeight\",\"type\":\"tuple\"},{\"internalType\":\"bytes[]\",\"name\":\"path\",\"type\":\"bytes[]\"},{\"internalType\":\"bytes\",\"name\":\"value\",\"type\":\"bytes\"}],\"internalType\":\"struct ILightClientMsgs.MsgVerifyMembership\",\"name\":\"msg_\",\"type\":\"tuple\"}],\"name\":\"verifyMembership\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes\",\"name\":\"proof\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"uint64\",\"name\":\"revisionNumber\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"revisionHeight\",\"type\":\"uint64\"}],\"internalType\":\"struct IICS02ClientMsgs.Height\",\"name\":\"proofHeight\",\"type\":\"tuple\"},{\"internalType\":\"bytes[]\",\"name\":\"path\",\"type\":\"bytes[]\"}],\"internalType\":\"struct ILightClientMsgs.MsgVerifyNonMembership\",\"name\":\"msg_\",\"type\":\"tuple\"}],\"name\":\"verifyNonMembership\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"getClientState()\":{\"returns\":{\"_0\":\"The client state.\"}},\"updateClient(bytes)\":{\"params\":{\"updateMsg\":\"The encoded update message e.g., an SP1 proof.\"},\"returns\":{\"_0\":\"The result of the update operation\"}},\"verifyMembership((bytes,(uint64,uint64),bytes[],bytes))\":{\"details\":\"Notice that this message is not view, as it may update the client state for caching purposes.\",\"params\":{\"msg_\":\"The membership message\"},\"returns\":{\"_0\":\"The unix timestamp of the verification height in the counterparty chain in seconds.\"}},\"verifyNonMembership((bytes,(uint64,uint64),bytes[]))\":{\"details\":\"Notice that this message is not view, as it may update the client state for caching purposes.\",\"params\":{\"msg_\":\"The membership message\"},\"returns\":{\"_0\":\"The unix timestamp of the verification height in the counterparty chain in seconds.\"}}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"getClientState()\":{\"notice\":\"Returns the client state.\"},\"updateClient(bytes)\":{\"notice\":\"Updating the client and consensus state\"},\"verifyMembership((bytes,(uint64,uint64),bytes[],bytes))\":{\"notice\":\"Querying the membership of a key-value pair\"},\"verifyNonMembership((bytes,(uint64,uint64),bytes[]))\":{\"notice\":\"Querying the non-membership of a key\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/light-clients/dummy/DummyLightClient.sol\":\"DummyLightClient\"},\"evmVersion\":\"cancun\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"none\"},\"optimizer\":{\"enabled\":true,\"runs\":10000},\"remappings\":[\":@openzeppelin-contracts/=node_modules/@openzeppelin/contracts/\",\":@openzeppelin-upgradeable/=node_modules/@openzeppelin/contracts-upgradeable/\",\":@openzeppelin/=node_modules/@openzeppelin/\",\":@sp1-contracts/=node_modules/sp1-contracts/contracts/src/\",\":@uniswap/permit2/=node_modules/@uniswap/permit2/\",\":forge-std/=node_modules/forge-std/src/\",\":sp1-contracts/=node_modules/sp1-contracts/\"],\"viaIR\":true},\"sources\":{\"contracts/interfaces/ILightClient.sol\":{\"keccak256\":\"0x1caae9e4f741a86c0056d5f7713a35f3bd96db7a9fd52fc9f1cf79aad76a442f\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://4a536db3b926560f69547c17e4f451a2631ddea0f42bd224c7fd8382d74429f6\",\"dweb:/ipfs/QmcQ33kxcmmowXgMbQGTBgiKBjF7v8UiP4y73bB9hhDizC\"]},\"contracts/light-clients/dummy/DummyLightClient.sol\":{\"keccak256\":\"0x71e8d19d1164eb76d80529206ef42fe782c2c7c5e1d9cc7d62e27e0a4ab969c7\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://6ced75b4a2a948ae297411595f617b80584c6ac381eabb39dd43cdb62caeb9f5\",\"dweb:/ipfs/QmXN4t37cgiqSiH4TLZKGEANE4fXdjKHugeLyQ8b682iSs\"]},\"contracts/msgs/IICS02ClientMsgs.sol\":{\"keccak256\":\"0xb5fdb25319d5c32b3f527982d45ec1e9bec5215515581aee034d853006ea01a0\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://6b8939bf552c62c952a491008bcd9b59ab7dda20a9482bf93438e05793881542\",\"dweb:/ipfs/QmfWmzNCp8bd4pP26Lfw5HHp4dSZnCDqZDjVN7SD8P7eDh\"]},\"contracts/msgs/ILightClientMsgs.sol\":{\"keccak256\":\"0xa0565e7748b8b3284d72e1aa6ef4cc8264fcaa5f4e0761d22d64686953db6378\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://c4476010d7090bfaa74127526f2051c6bc82ff42a09b936e848880a1f15a6065\",\"dweb:/ipfs/QmY87JgRsFQXSZdGXNjNHEJCkdTHzFXH4vZEJ3q7MnHuP8\"]}},\"version\":1}","metadata":{"compiler":{"version":"0.8.28+commit.7893614a"},"language":"Solidity","output":{"abi":[{"inputs":[],"stateMutability":"view","type":"function","name":"getClientState","outputs":[{"internalType":"bytes","name":"","type":"bytes"}]},{"inputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"nonpayable","type":"function","name":"misbehaviour"},{"inputs":[{"internalType":"bytes","name":"updateMsg","type":"bytes"}],"stateMutability":"nonpayable","type":"function","name":"updateClient","outputs":[{"internalType":"enum ILightClientMsgs.UpdateResult","name":"","type":"uint8"}]},{"inputs":[{"internalType":"struct ILightClientMsgs.MsgVerifyMembership","name":"msg_","type":"tuple","components":[{"internalType":"bytes","name":"proof","type":"bytes"},{"internalType":"struct IICS02ClientMsgs.Height","name":"proofHeight","type":"tuple","components":[{"internalType":"uint64","name":"revisionNumber","type":"uint64"},{"internalType":"uint64","name":"revisionHeight","type":"uint64"}]},{"internalType":"bytes[]","name":"path","type":"bytes[]"},{"internalType":"bytes","name":"value","type":"bytes"}]}],"stateMutability":"nonpayable","type":"function","name":"verifyMembership","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[{"internalType":"struct ILightClientMsgs.MsgVerifyNonMembership","name":"msg_","type":"tuple","components":[{"internalType":"bytes","name":"proof","type":"bytes"},{"internalType":"struct IICS02ClientMsgs.Height","name":"proofHeight","type":"tuple","components":[{"internalType":"uint64","name":"revisionNumber","type":"uint64"},{"internalType":"uint64","name":"revisionHeight","type":"uint64"}]},{"internalType":"bytes[]","name":"path","type":"bytes[]"}]}],"stateMutability":"nonpayable","type":"function","name":"verifyNonMembership","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]}],"devdoc":{"kind":"dev","methods":{"getClientState()":{"returns":{"_0":"The client state."}},"updateClient(bytes)":{"params":{"updateMsg":"The encoded update message e.g., an SP1 proof."},"returns":{"_0":"The result of the update operation"}},"verifyMembership((bytes,(uint64,uint64),bytes[],bytes))":{"details":"Notice that this message is not view, as it may update the client state for caching purposes.","params":{"msg_":"The membership message"},"returns":{"_0":"The unix timestamp of the verification height in the counterparty chain in seconds."}},"verifyNonMembership((bytes,(uint64,uint64),bytes[]))":{"details":"Notice that this message is not view, as it may update the client state for caching purposes.","params":{"msg_":"The membership message"},"returns":{"_0":"The unix timestamp of the verification height in the counterparty chain in seconds."}}},"version":1},"userdoc":{"kind":"user","methods":{"getClientState()":{"notice":"Returns the client state."},"updateClient(bytes)":{"notice":"Updating the client and consensus state"},"verifyMembership((bytes,(uint64,uint64),bytes[],bytes))":{"notice":"Querying the membership of a key-value pair"},"verifyNonMembership((bytes,(uint64,uint64),bytes[]))":{"notice":"Querying the non-membership of a key"}},"version":1}},"settings":{"remappings":["@openzeppelin-contracts/=node_modules/@openzeppelin/contracts/","@openzeppelin-upgradeable/=node_modules/@openzeppelin/contracts-upgradeable/","@openzeppelin/=node_modules/@openzeppelin/","@sp1-contracts/=node_modules/sp1-contracts/contracts/src/","@uniswap/permit2/=node_modules/@uniswap/permit2/","forge-std/=node_modules/forge-std/src/","sp1-contracts/=node_modules/sp1-contracts/"],"optimizer":{"enabled":true,"runs":10000},"metadata":{"bytecodeHash":"none"},"compilationTarget":{"contracts/light-clients/dummy/DummyLightClient.sol":"DummyLightClient"},"evmVersion":"cancun","libraries":{},"viaIR":true},"sources":{"contracts/interfaces/ILightClient.sol":{"keccak256":"0x1caae9e4f741a86c0056d5f7713a35f3bd96db7a9fd52fc9f1cf79aad76a442f","urls":["bzz-raw://4a536db3b926560f69547c17e4f451a2631ddea0f42bd224c7fd8382d74429f6","dweb:/ipfs/QmcQ33kxcmmowXgMbQGTBgiKBjF7v8UiP4y73bB9hhDizC"],"license":"MIT"},"contracts/light-clients/dummy/DummyLightClient.sol":{"keccak256":"0x71e8d19d1164eb76d80529206ef42fe782c2c7c5e1d9cc7d62e27e0a4ab969c7","urls":["bzz-raw://6ced75b4a2a948ae297411595f617b80584c6ac381eabb39dd43cdb62caeb9f5","dweb:/ipfs/QmXN4t37cgiqSiH4TLZKGEANE4fXdjKHugeLyQ8b682iSs"],"license":"MIT"},"contracts/msgs/IICS02ClientMsgs.sol":{"keccak256":"0xb5fdb25319d5c32b3f527982d45ec1e9bec5215515581aee034d853006ea01a0","urls":["bzz-raw://6b8939bf552c62c952a491008bcd9b59ab7dda20a9482bf93438e05793881542","dweb:/ipfs/QmfWmzNCp8bd4pP26Lfw5HHp4dSZnCDqZDjVN7SD8P7eDh"],"license":"MIT"},"contracts/msgs/ILightClientMsgs.sol":{"keccak256":"0xa0565e7748b8b3284d72e1aa6ef4cc8264fcaa5f4e0761d22d64686953db6378","urls":["bzz-raw://c4476010d7090bfaa74127526f2051c6bc82ff42a09b936e848880a1f15a6065","dweb:/ipfs/QmY87JgRsFQXSZdGXNjNHEJCkdTHzFXH4vZEJ3q7MnHuP8"],"license":"MIT"}},"version":1},"id":41} \ No newline at end of file diff --git a/ibc-solidity/abi/bytecode/SP1ICS07Tendermint.json b/ibc-solidity/abi/bytecode/SP1ICS07Tendermint.json index d023e9a37..eea3d2be2 100644 --- a/ibc-solidity/abi/bytecode/SP1ICS07Tendermint.json +++ b/ibc-solidity/abi/bytecode/SP1ICS07Tendermint.json @@ -1 +1 @@ -{"abi":[{"type":"constructor","inputs":[{"name":"updateClientProgramVkey","type":"bytes32","internalType":"bytes32"},{"name":"membershipProgramVkey","type":"bytes32","internalType":"bytes32"},{"name":"updateClientAndMembershipProgramVkey","type":"bytes32","internalType":"bytes32"},{"name":"misbehaviourProgramVkey","type":"bytes32","internalType":"bytes32"},{"name":"sp1Verifier","type":"address","internalType":"address"},{"name":"_clientState","type":"bytes","internalType":"bytes"},{"name":"_consensusState","type":"bytes32","internalType":"bytes32"},{"name":"roleManager","type":"address","internalType":"address"}],"stateMutability":"nonpayable"},{"type":"function","name":"ALLOWED_SP1_CLOCK_DRIFT","inputs":[],"outputs":[{"name":"","type":"uint16","internalType":"uint16"}],"stateMutability":"view"},{"type":"function","name":"DEFAULT_ADMIN_ROLE","inputs":[],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"type":"function","name":"MEMBERSHIP_PROGRAM_VKEY","inputs":[],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"type":"function","name":"MISBEHAVIOUR_PROGRAM_VKEY","inputs":[],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"type":"function","name":"PROOF_SUBMITTER_ROLE","inputs":[],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"type":"function","name":"UPDATE_CLIENT_AND_MEMBERSHIP_PROGRAM_VKEY","inputs":[],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"type":"function","name":"UPDATE_CLIENT_PROGRAM_VKEY","inputs":[],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"type":"function","name":"VERIFIER","inputs":[],"outputs":[{"name":"","type":"address","internalType":"contract ISP1Verifier"}],"stateMutability":"view"},{"type":"function","name":"clientState","inputs":[],"outputs":[{"name":"chainId","type":"string","internalType":"string"},{"name":"trustLevel","type":"tuple","internalType":"struct IICS07TendermintMsgs.TrustThreshold","components":[{"name":"numerator","type":"uint8","internalType":"uint8"},{"name":"denominator","type":"uint8","internalType":"uint8"}]},{"name":"latestHeight","type":"tuple","internalType":"struct IICS02ClientMsgs.Height","components":[{"name":"revisionNumber","type":"uint64","internalType":"uint64"},{"name":"revisionHeight","type":"uint64","internalType":"uint64"}]},{"name":"trustingPeriod","type":"uint32","internalType":"uint32"},{"name":"unbondingPeriod","type":"uint32","internalType":"uint32"},{"name":"isFrozen","type":"bool","internalType":"bool"},{"name":"zkAlgorithm","type":"uint8","internalType":"enum IICS07TendermintMsgs.SupportedZkAlgorithm"}],"stateMutability":"view"},{"type":"function","name":"getClientState","inputs":[],"outputs":[{"name":"","type":"bytes","internalType":"bytes"}],"stateMutability":"view"},{"type":"function","name":"getConsensusStateHash","inputs":[{"name":"revisionHeight","type":"uint64","internalType":"uint64"}],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"type":"function","name":"getRoleAdmin","inputs":[{"name":"role","type":"bytes32","internalType":"bytes32"}],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"type":"function","name":"grantRole","inputs":[{"name":"role","type":"bytes32","internalType":"bytes32"},{"name":"account","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"hasRole","inputs":[{"name":"role","type":"bytes32","internalType":"bytes32"},{"name":"account","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"misbehaviour","inputs":[{"name":"misbehaviourMsg","type":"bytes","internalType":"bytes"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"multicall","inputs":[{"name":"data","type":"bytes[]","internalType":"bytes[]"}],"outputs":[{"name":"results","type":"bytes[]","internalType":"bytes[]"}],"stateMutability":"nonpayable"},{"type":"function","name":"renounceRole","inputs":[{"name":"role","type":"bytes32","internalType":"bytes32"},{"name":"callerConfirmation","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"revokeRole","inputs":[{"name":"role","type":"bytes32","internalType":"bytes32"},{"name":"account","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"supportsInterface","inputs":[{"name":"interfaceId","type":"bytes4","internalType":"bytes4"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"updateClient","inputs":[{"name":"updateMsg","type":"bytes","internalType":"bytes"}],"outputs":[{"name":"","type":"uint8","internalType":"enum ILightClientMsgs.UpdateResult"}],"stateMutability":"nonpayable"},{"type":"function","name":"verifyMembership","inputs":[{"name":"msg_","type":"tuple","internalType":"struct ILightClientMsgs.MsgVerifyMembership","components":[{"name":"proof","type":"bytes","internalType":"bytes"},{"name":"proofHeight","type":"tuple","internalType":"struct IICS02ClientMsgs.Height","components":[{"name":"revisionNumber","type":"uint64","internalType":"uint64"},{"name":"revisionHeight","type":"uint64","internalType":"uint64"}]},{"name":"path","type":"bytes[]","internalType":"bytes[]"},{"name":"value","type":"bytes","internalType":"bytes"}]}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"nonpayable"},{"type":"function","name":"verifyNonMembership","inputs":[{"name":"msg_","type":"tuple","internalType":"struct ILightClientMsgs.MsgVerifyNonMembership","components":[{"name":"proof","type":"bytes","internalType":"bytes"},{"name":"proofHeight","type":"tuple","internalType":"struct IICS02ClientMsgs.Height","components":[{"name":"revisionNumber","type":"uint64","internalType":"uint64"},{"name":"revisionHeight","type":"uint64","internalType":"uint64"}]},{"name":"path","type":"bytes[]","internalType":"bytes[]"}]}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"nonpayable"},{"type":"event","name":"RoleAdminChanged","inputs":[{"name":"role","type":"bytes32","indexed":true,"internalType":"bytes32"},{"name":"previousAdminRole","type":"bytes32","indexed":true,"internalType":"bytes32"},{"name":"newAdminRole","type":"bytes32","indexed":true,"internalType":"bytes32"}],"anonymous":false},{"type":"event","name":"RoleGranted","inputs":[{"name":"role","type":"bytes32","indexed":true,"internalType":"bytes32"},{"name":"account","type":"address","indexed":true,"internalType":"address"},{"name":"sender","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"type":"event","name":"RoleRevoked","inputs":[{"name":"role","type":"bytes32","indexed":true,"internalType":"bytes32"},{"name":"account","type":"address","indexed":true,"internalType":"address"},{"name":"sender","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"type":"error","name":"AccessControlBadConfirmation","inputs":[]},{"type":"error","name":"AccessControlUnauthorizedAccount","inputs":[{"name":"account","type":"address","internalType":"address"},{"name":"neededRole","type":"bytes32","internalType":"bytes32"}]},{"type":"error","name":"AddressEmptyCode","inputs":[{"name":"target","type":"address","internalType":"address"}]},{"type":"error","name":"CannotHandleMisbehavior","inputs":[]},{"type":"error","name":"ChainIdMismatch","inputs":[{"name":"expected","type":"string","internalType":"string"},{"name":"actual","type":"string","internalType":"string"}]},{"type":"error","name":"ClientStateMismatch","inputs":[{"name":"expected","type":"bytes","internalType":"bytes"},{"name":"actual","type":"bytes","internalType":"bytes"}]},{"type":"error","name":"ConsensusStateHashMismatch","inputs":[{"name":"expected","type":"bytes32","internalType":"bytes32"},{"name":"actual","type":"bytes32","internalType":"bytes32"}]},{"type":"error","name":"ConsensusStateNotFound","inputs":[]},{"type":"error","name":"ConsensusStateRootMismatch","inputs":[{"name":"expected","type":"bytes32","internalType":"bytes32"},{"name":"actual","type":"bytes32","internalType":"bytes32"}]},{"type":"error","name":"EmptyValue","inputs":[]},{"type":"error","name":"FailedCall","inputs":[]},{"type":"error","name":"FeatureNotSupported","inputs":[]},{"type":"error","name":"FrozenClientState","inputs":[]},{"type":"error","name":"InvalidMembershipProof","inputs":[]},{"type":"error","name":"KeyValuePairNotInCache","inputs":[{"name":"path","type":"bytes[]","internalType":"bytes[]"},{"name":"value","type":"bytes","internalType":"bytes"}]},{"type":"error","name":"LengthIsOutOfRange","inputs":[{"name":"length","type":"uint256","internalType":"uint256"},{"name":"min","type":"uint256","internalType":"uint256"},{"name":"max","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"MembershipProofKeyNotFound","inputs":[{"name":"path","type":"bytes[]","internalType":"bytes[]"}]},{"type":"error","name":"MembershipProofValueMismatch","inputs":[{"name":"expected","type":"bytes","internalType":"bytes"},{"name":"actual","type":"bytes","internalType":"bytes"}]},{"type":"error","name":"ProofHeightMismatch","inputs":[{"name":"expectedRevisionNumber","type":"uint64","internalType":"uint64"},{"name":"expectedRevisionHeight","type":"uint64","internalType":"uint64"},{"name":"actualRevisionNumber","type":"uint64","internalType":"uint64"},{"name":"actualRevisionHeight","type":"uint64","internalType":"uint64"}]},{"type":"error","name":"ProofIsInTheFuture","inputs":[{"name":"now","type":"uint256","internalType":"uint256"},{"name":"proofTimestamp","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"ProofIsTooOld","inputs":[{"name":"now","type":"uint256","internalType":"uint256"},{"name":"proofTimestamp","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"TrustThresholdMismatch","inputs":[{"name":"expectedNumerator","type":"uint256","internalType":"uint256"},{"name":"expectedDenominator","type":"uint256","internalType":"uint256"},{"name":"actualNumerator","type":"uint256","internalType":"uint256"},{"name":"actualDenominator","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"TrustingPeriodMismatch","inputs":[{"name":"expected","type":"uint256","internalType":"uint256"},{"name":"actual","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"TrustingPeriodTooLong","inputs":[{"name":"trustingPeriod","type":"uint256","internalType":"uint256"},{"name":"unbondingPeriod","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"UnbondingPeriodMismatch","inputs":[{"name":"expected","type":"uint256","internalType":"uint256"},{"name":"actual","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"UnknownMembershipProofType","inputs":[{"name":"proofType","type":"uint8","internalType":"uint8"}]},{"type":"error","name":"UnknownZkAlgorithm","inputs":[{"name":"algorithm","type":"uint8","internalType":"uint8"}]},{"type":"error","name":"VerificationKeyMismatch","inputs":[{"name":"expected","type":"bytes32","internalType":"bytes32"},{"name":"actual","type":"bytes32","internalType":"bytes32"}]}],"bytecode":{"object":"0x61012060405234610541576137268038038061001a81610564565b928339810161010082820312610541578151916020810151604082015160608301519061004960808501610589565b60a08501519095906001600160401b0381116105415785019080601f8301121561054157815161007b9260200161059d565b9261008d60e060c08701519601610589565b9660805260a05260c05260e05280518101906020820190602081840312610541576020810151906001600160401b038211610541570191829003601f1981019061012013610541576040519160e083016001600160401b0381118482101761052d5760405260208401516001600160401b038111610541576020908501019080601f830112156105415781516101259260200161059d565b825260408112610541576040610139610545565b916101458286016105dd565b8352610153606086016105dd565b602084015260208401928352603f19011261054157610170610545565b61017c608085016105eb565b815261018a60a085016105eb565b6020820152604083019081526101a260c085016105ff565b90606084019182526101b660e086016105ff565b92608085019384526101008601519586151587036105415760a0860196875261012001519460028610156105415760c08101958652518051906001600160401b03821161052d57600154600181811c91168015610523575b602082101461050f57601f81116104ac575b50602090601f831160011461043f5763ffffffff95949392915f9183610434575b50508160011b915f199060031b1c1916176001555b5160ff81511661ff00602060025493015160081b169161ffff191617176002555160018060401b0381511660035491602068010000000000000000600160801b0391015160401b169160018060801b031916171760035551169267ffffffff00000000600454925160201b169051151560401b92519160028310156104205769ff00000000000000000068ff00000000000000009360481b169469ff000000000000000000199160018060481b0319161716179116171760045560018060401b0360035460401c165f52600560205260405f205560018060a01b03166101005260045463ffffffff8116610708810163ffffffff811161040c5763ffffffff809360201c1692839116116103f757826001600160a01b0381166103de575061037c610706565b505b604051612efd908161078982396080518181816105570152611445015260a0518181816101f90152611e01015260c051818181610cb30152612185015260e0518181816102a00152610ac1015261010051818181610c780152611a1a0152f35b806103eb6103f192610610565b50610686565b5061037e565b6333fae18560e21b5f5260045260245260445ffd5b634e487b7160e01b5f52601160045260245ffd5b634e487b7160e01b5f52602160045260245ffd5b015190505f80610241565b90601f1983169160015f52815f20925f5b818110610494575091600193918563ffffffff99989796941061047c575b505050811b01600155610256565b01515f1960f88460031b161c191690555f808061046e565b92936020600181928786015181550195019301610450565b60015f527fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf6601f840160051c81019160208510610505575b601f0160051c01905b8181106104fa5750610220565b5f81556001016104ed565b90915081906104e4565b634e487b7160e01b5f52602260045260245ffd5b90607f169061020e565b634e487b7160e01b5f52604160045260245ffd5b5f80fd5b60408051919082016001600160401b0381118382101761052d57604052565b6040519190601f01601f191682016001600160401b0381118382101761052d57604052565b51906001600160a01b038216820361054157565b9192916001600160401b03821161052d576105c1601f8301601f1916602001610564565b938285528282011161054157815f926020928387015e84010152565b519060ff8216820361054157565b51906001600160401b038216820361054157565b519063ffffffff8216820361054157565b6001600160a01b0381165f9081525f5160206137065f395f51905f52602052604090205460ff16610681576001600160a01b03165f8181525f5160206137065f395f51905f5260205260408120805460ff191660011790553391905f5160206136865f395f51905f528180a4600190565b505f90565b6001600160a01b0381165f9081525f5160206136a65f395f51905f52602052604090205460ff16610681576001600160a01b03165f8181525f5160206136a65f395f51905f5260205260408120805460ff191660011790553391905f5160206136e65f395f51905f52905f5160206136865f395f51905f529080a4600190565b5f80525f5160206136a65f395f51905f526020525f5160206136c65f395f51905f525460ff16610784575f8080525f5160206136a65f395f51905f526020525f5160206136c65f395f51905f52805460ff1916600117905533905f5160206136e65f395f51905f525f5160206136865f395f51905f528280a4600190565b5f9056fe6080806040526004361015610012575f80fd5b5f3560e01c90816301ffc9a714610cd6575080630225293e14610c9c57806308c84e7014610c4c5780630bece35614610b8957806323842fb814610b59578063248a9ca314610b2f5780632c3ee47414610b135780632f2ff15d14610ae4578063314d4dff14610aaa57806336568abe14610a4e5780634d6d9ffb1461096c5780635972185a14610932578063682ed5f01461080e57806391d14854146107c5578063a217fddf146107ab578063ac9650d81461066a578063bd3ce6b01461057a578063ca7242f914610540578063d547741f1461050a578063ddba65371461021c578063e45a6d0d146101e25763ef913a4b1461010e575f80fd5b346101de575f6003193601126101de576101da60405160208082015261012060408201526101c6816101436101608201610ec6565b60ff600254818116606085015260081c16608083015267ffffffffffffffff60035481811660a085015260401c1660c083015260ff60045463ffffffff811660e085015263ffffffff8160201c16610100850152818160401c16151561012085015260481c166101b28161105f565b61014083015203601f19810183528261103c565b604051918291602083526020830190610df8565b0390f35b5f80fd5b346101de575f6003193601126101de5760206040517f00000000000000000000000000000000000000000000000000000000000000008152f35b346101de5761022a36610d74565b6004549160ff8360401c166104e2575f80527f4c48d1d2b0f4f7485fc28e3db22341d96a20aa29e6efa8149da9751603abd4e06020527f6e0c24a6e293ff9b755263dbaa15ba3796b0b8d3fe17cfb4ddf8143b268eac4754610298929060ff16156104d5575b8101906110d9565b6102c78151517f0000000000000000000000000000000000000000000000000000000000000000808214611189565b6020815101518051810160208101916020818303126101de57602081015167ffffffffffffffff81116101de57019061018090829003126101de576040519061030f82610fcc565b602081015167ffffffffffffffff81116101de57839082016020019061033491611260565b825261034260408201611348565b60208301908152906103578460608301611219565b604084019081529161036c8560a08401611219565b60608501908152946103818160e08501611365565b9260808601938452610140019061039791611365565b9360a081019485525190516fffffffffffffffffffffffffffffffff166103bd916126e8565b516040805182516fffffffffffffffffffffffffffffffff16602080830191825284015182840152919092015160608084019190915282529061040160808261103c565b51902090516020015167ffffffffffffffff1661041d90611649565b61042a919081811461187c565b516040805182516fffffffffffffffffffffffffffffffff16602080830191825284015182840152919092015160608084019190915282529061046e60808261103c565b51902090516020015167ffffffffffffffff1661048a90611649565b610497919081811461187c565b516104a190611a03565b7fffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffff1668010000000000000000176004555f80f35b6104dd61178e565b610290565b7f928b1233000000000000000000000000000000000000000000000000000000005f5260045ffd5b346101de5761053e61051b36610dc5565b90610539610534825f525f602052600160405f20015490565b611816565b611ba5565b005b346101de575f6003193601126101de5760206040517f00000000000000000000000000000000000000000000000000000000000000008152f35b346101de575f6003193601126101de576040516105a18161059a81610ec6565b038261103c565b6101206040516105b081610f83565b60025460ff8116825260ff602083019160081c16815260ff6040516105d481610f83565b67ffffffffffffffff600354818116835281602084019160401c168152816004549385808660481c1697816106146040519d8d8f9e8f9081520190610df8565b9a511660208c0152511660408a0152511660608801525116608086015263ffffffff811660a086015263ffffffff8160201c1660c086015260401c16151560e08401526106608161105f565b6101008301520390f35b346101de5760206003193601126101de5760043567ffffffffffffffff81116101de57366023820112156101de57806004013567ffffffffffffffff81116101de57602482013660248360051b850101116101de5760405160206106ce818361103c565b5f825280820192601f1982013685376106e685611735565b956106f4604051978861103c565b858752601f1961070387611735565b01835f5b82811061079b575050505f5b868110156107885760019061076c61076661073660248460051b87010187611690565b9190888b846040519586948486013783018281015f81528d519283915e01015f815203601f19810183528261103c565b30612621565b610776828b61174d565b52610781818a61174d565b5001610713565b604051848152806101da8187018b610e1d565b606082828c010152018490610707565b346101de575f6003193601126101de5760206040515f8152f35b346101de576107d336610dc5565b905f525f60205273ffffffffffffffffffffffffffffffffffffffff60405f2091165f52602052602060ff60405f2054166040519015158152f35b346101de5760206003193601126101de5760043567ffffffffffffffff81116101de578060040160a060031983360301126101de5760ff60045460401c166104e2575f80527f4c48d1d2b0f4f7485fc28e3db22341d96a20aa29e6efa8149da9751603abd4e06020527f6e0c24a6e293ff9b755263dbaa15ba3796b0b8d3fe17cfb4ddf8143b268eac475460ff1615610925575b60848201916108b18383611690565b9050156108fd57602092826108c9816108f595611690565b60246108ed6108e66108de60648901876116e1565b979096611690565b3691611085565b950191611cee565b604051908152f35b7f1208b21b000000000000000000000000000000000000000000000000000000005f5260045ffd5b61092d61178e565b6108a2565b346101de575f6003193601126101de5760206040517fbd893629a699470e4ec82a5715bb4981fdaacc5d0a728bf5f55b801d8f4ef10b8152f35b346101de5760206003193601126101de5760043567ffffffffffffffff81116101de5780600401608060031983360301126101de5760ff60045460401c166104e2575f80527f4c48d1d2b0f4f7485fc28e3db22341d96a20aa29e6efa8149da9751603abd4e060209081527f6e0c24a6e293ff9b755263dbaa15ba3796b0b8d3fe17cfb4ddf8143b268eac475490926108f592909160ff1615610a41575b610a24610a178280611690565b91909260648501906116e1565b929091602460405195610a37898861103c565b5f87520191611cee565b610a4961178e565b610a0a565b346101de57610a5c36610dc5565b3373ffffffffffffffffffffffffffffffffffffffff821603610a825761053e91611ba5565b7f6697b232000000000000000000000000000000000000000000000000000000005f5260045ffd5b346101de575f6003193601126101de5760206040517f00000000000000000000000000000000000000000000000000000000000000008152f35b346101de5761053e610af536610dc5565b90610b0e610534825f525f602052600160405f20015490565b611ad3565b346101de575f6003193601126101de5760206040516107088152f35b346101de5760206003193601126101de5760206108f56004355f525f602052600160405f20015490565b346101de5760206003193601126101de5760043567ffffffffffffffff811681036101de576108f5602091611649565b346101de57610b9736610d74565b60ff60045460401c166104e2575f80527f4c48d1d2b0f4f7485fc28e3db22341d96a20aa29e6efa8149da9751603abd4e06020527f6e0c24a6e293ff9b755263dbaa15ba3796b0b8d3fe17cfb4ddf8143b268eac4754610bff929060ff1615610c3f57611431565b6040516003821015610c12576020918152f35b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b610c4761178e565b611431565b346101de575f6003193601126101de57602060405173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b346101de575f6003193601126101de5760206040517f00000000000000000000000000000000000000000000000000000000000000008152f35b346101de5760206003193601126101de57600435907fffffffff0000000000000000000000000000000000000000000000000000000082168092036101de57817f7965db0b0000000000000000000000000000000000000000000000000000000060209314908115610d4a575b5015158152f35b7f01ffc9a70000000000000000000000000000000000000000000000000000000091501483610d43565b9060206003198301126101de5760043567ffffffffffffffff81116101de57826023820112156101de5780600401359267ffffffffffffffff84116101de57602484830101116101de576024019190565b60031960409101126101de576004359060243573ffffffffffffffffffffffffffffffffffffffff811681036101de5790565b90601f19601f602080948051918291828752018686015e5f8582860101520116010190565b9080602083519182815201916020808360051b8301019401925f915b838310610e4857505050505090565b9091929394602080610e6683601f1986600196030187528951610df8565b97019301930191939290610e39565b90600182811c92168015610ebc575b6020831014610e8f57565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b91607f1691610e84565b6001545f9291610ed582610e75565b8082529160018116908115610f495750600114610ef0575050565b60015f9081529293509091907fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf65b838310610f2f575060209250010190565b600181602092949394548385870101520191019190610f1e565b60209495507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0091509291921683830152151560051b010190565b6040810190811067ffffffffffffffff821117610f9f57604052565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b60c0810190811067ffffffffffffffff821117610f9f57604052565b6020810190811067ffffffffffffffff821117610f9f57604052565b6060810190811067ffffffffffffffff821117610f9f57604052565b60e0810190811067ffffffffffffffff821117610f9f57604052565b90601f601f19910116810190811067ffffffffffffffff821117610f9f57604052565b60021115610c1257565b67ffffffffffffffff8111610f9f57601f01601f191660200190565b92919261109182611069565b9161109f604051938461103c565b8294818452818301116101de578281602093845f960137010152565b9080601f830112156101de578160206110d693359101611085565b90565b6020818303126101de5780359067ffffffffffffffff82116101de5701906020828203126101de576040519161110e83610fe8565b80359067ffffffffffffffff82116101de57016060818303126101de576040519161113883611004565b81358352602082013567ffffffffffffffff81116101de578161115c9184016110bb565b6020840152604082013567ffffffffffffffff81116101de5761117f92016110bb565b6040820152815290565b15611192575050565b7fd56bdc26000000000000000000000000000000000000000000000000000000005f5260045260245260445ffd5b9291926111cc82611069565b916111da604051938461103c565b8294818452818301116101de578281602093845f96015e010152565b519060ff821682036101de57565b519067ffffffffffffffff821682036101de57565b91908260409103126101de5760405161123181610f83565b602061124a81839561124281611204565b855201611204565b910152565b519063ffffffff821682036101de57565b91908281039261012084126101de576040519161127c83611020565b8294825167ffffffffffffffff81116101de57830182601f820112156101de576040916112b284836020601f19955191016111c0565b865201126101de576112f7906040516112ca81610f83565b6112d6602085016111f6565b81526112e4604085016111f6565b6020820152602085015260608301611219565b604083015261130860a0820161124f565b606083015261131960c0820161124f565b608083015260e08101519081151582036101de576101009160a084015201519060028210156101de5760c00152565b51906fffffffffffffffffffffffffffffffff821682036101de57565b91908260609103126101de5760405161137d81611004565b604080829461138b81611348565b8452602081015160208501520151910152565b9190610180838203126101de57604051906113b882610fcc565b819380519167ffffffffffffffff83116101de57610140826113e18360a09661124a9601611260565b86526113f08360208301611365565b60208701526114028360808301611365565b604087015261141360e08201611348565b6060870152611426836101008301611219565b608087015201611219565b61143d918101906110d9565b61146c8151517f0000000000000000000000000000000000000000000000000000000000000000808214611189565b60208151015180518101906020818303126101de5760208101519167ffffffffffffffff83116101de576114a792602080920192010161139e565b906114b1826118b3565b6114ba82611946565b916003831015610c1257826115ec57908167ffffffffffffffff6020604060a06110d6960193845184848201511685600354851c168111611564575b505001516040516115498161153b858201948591909160408060608301946fffffffffffffffffffffffffffffffff8151168452602081015160208501520151910152565b03601f19810183528261103c565b51902092510151165f52600560205260405f20555b51611a03565b6115a3866115e593511667ffffffffffffffff167fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000006003541617600355565b7fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff6fffffffffffffffff00000000000000006003549260401b16911617600355565b5f806114f6565b5060018203611631576110d690680100000000000000007fffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffff600454161760045561155e565b60028214611642576110d69061155e565b5050600290565b67ffffffffffffffff165f52600560205260405f205480156116685790565b7f5b48b457000000000000000000000000000000000000000000000000000000005f5260045ffd5b9035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1813603018212156101de570180359067ffffffffffffffff82116101de576020019181360383136101de57565b9035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1813603018212156101de570180359067ffffffffffffffff82116101de57602001918160051b360383136101de57565b67ffffffffffffffff8111610f9f5760051b60200190565b80518210156117615760209160051b010190565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b335f9081527f4c48d1d2b0f4f7485fc28e3db22341d96a20aa29e6efa8149da9751603abd4e0602052604090205460ff16156117c657565b7fe2517d3f000000000000000000000000000000000000000000000000000000005f52336004527fbd893629a699470e4ec82a5715bb4981fdaacc5d0a728bf5f55b801d8f4ef10b60245260445ffd5b805f525f60205260405f2073ffffffffffffffffffffffffffffffffffffffff33165f5260205260ff60405f2054161561184d5750565b7fe2517d3f000000000000000000000000000000000000000000000000000000005f523360045260245260445ffd5b15611885575050565b7f6d23e8a3000000000000000000000000000000000000000000000000000000005f5260045260245260445ffd5b611944906118d981516fffffffffffffffffffffffffffffffff606084015116906126e8565b61193c67ffffffffffffffff602060808185015160405161192e8161153b868201948591909160408060608301946fffffffffffffffffffffffffffffffff8151168452602081015160208501520151910152565b519020940151015116611649565b80821461187c565b565b67ffffffffffffffff602060a08301510151165f52600560205260405f205480155f146119735750505f90565b604082019081516040516119bc8161153b60208201948591909160408060608301946fffffffffffffffffffffffffffffffff8151168452602081015160208501520151910152565b51902014918215926119da575b5050156119d557600190565b600290565b6fffffffffffffffffffffffffffffffff91925060208291015151169151511611155f806119c9565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169080516040602083015192015192803b156101de575f92611a9b92611aad604051968795869485947f41493c600000000000000000000000000000000000000000000000000000000086526004860152606060248601526064850190610df8565b90600319848303016044850152610df8565b03915afa8015611ac857611abe5750565b5f6119449161103c565b6040513d5f823e3d90fd5b805f525f60205260405f2073ffffffffffffffffffffffffffffffffffffffff83165f5260205260ff60405f205416155f14611b9f57805f525f60205260405f2073ffffffffffffffffffffffffffffffffffffffff83165f5260205260405f2060017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0082541617905573ffffffffffffffffffffffffffffffffffffffff339216907f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d5f80a4600190565b50505f90565b805f525f60205260405f2073ffffffffffffffffffffffffffffffffffffffff83165f5260205260ff60405f2054165f14611b9f57805f525f60205260405f2073ffffffffffffffffffffffffffffffffffffffff83165f5260205260405f207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00815416905573ffffffffffffffffffffffffffffffffffffffff339216907ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b5f80a4600190565b3567ffffffffffffffff811681036101de5790565b929190611c8e81611735565b93611c9c604051958661103c565b602085838152019160051b8101918383116101de5781905b838210611cc2575050505050565b813567ffffffffffffffff81116101de57602091611ce387849387016110bb565b815201910190611cb4565b9094929193948015612568578101906020818303126101de5780359067ffffffffffffffff82116101de57016040818303126101de5760405191611d3183610f83565b813560028110156101de578352602082013567ffffffffffffffff81116101de57611d5c92016110bb565b90602081019182528051611d6f8161105f565b611d788161105f565b611fe5575051908151820160208101926020818303126101de57602081015167ffffffffffffffff81116101de570190608090829003126101de5760405192611dc084610f83565b602082015167ffffffffffffffff81116101de5782611de9836020604094611df1970101612a5a565b865201611365565b9460208301958652611e288351517f0000000000000000000000000000000000000000000000000000000000000000808214611189565b6020835101519182518301926020818503126101de5760208101519067ffffffffffffffff82116101de5701926040848203126101de5760405193611e6c85610f83565b6020810151855260408101519167ffffffffffffffff83116101de57611e99926020809201920101612ac0565b94611eb360208501968088525180151580611fd957612c0d565b5f805b87518051831015611fa657611ece83611ee19261174d565b5151611edb368888611c82565b90612da9565b15611f9c57508694611f40611f55956fffffffffffffffffffffffffffffffff9a9895611f3961155e966020633b9aca009f9d8198611f20915161174d565b51015190815181518082149182611f88575b5050612c4b565b6001612c99565b51950194611f4d86611c6d565b875191612e1b565b516001815111611f69575b50505151160490565b611f75611f8192611c6d565b90848451511691612eab565b5f80611f60565b909150898401209089830120145f80611f32565b9060010190611eb6565b5061155e92506020915094611f40611f55956fffffffffffffffffffffffffffffffff9a9895633b9aca009c9a98612c99565b5061ffff811115612c0d565b94906001869593949551611ff88161105f565b6120018161105f565b146120485760ff86516120138161105f565b61201c8161105f565b7fd3a2e6c9000000000000000000000000000000000000000000000000000000005f521660045260245ffd5b90919293945051926060602060405161206081610f83565b60405161206c81610fcc565b60405161207881611020565b84815260405161208781610f83565b5f81525f858201528482015260405161209f81610f83565b5f81525f8582015260408201525f858201525f60808201525f60a08201525f60c082015281526120cd612a22565b838201526120d9612a22565b60408201525f848201526040516120ef81610f83565b5f81525f84820152608082015260405161210881610f83565b5f81525f8482015260a08201528152015283518401936020818603126101de5760208101519067ffffffffffffffff82116101de5701936020858203126101de576040519461215686610fe8565b60208101519067ffffffffffffffff82116101de57602061217f92816121ac9501920101612a5a565b808652517f0000000000000000000000000000000000000000000000000000000000000000808214611189565b602084510151948551860160208101966020818303126101de57602081015167ffffffffffffffff81116101de570190604090829003126101de57604051966121f488610f83565b602082015167ffffffffffffffff81116101de578160206122179285010161139e565b885260408201519167ffffffffffffffff83116101de5761223b9201602001612ac0565b9361225560208801958087525180151580611fd957612c0d565b602081019561226387611c6d565b67ffffffffffffffff60a08a5101519181602084015116918291161480612549575b61228e85611c6d565b9267ffffffffffffffff6122a18c611c6d565b91511691156124fb57505050506122bc9061155e89516118b3565b6122c68751611946565b6003811015610c1257806124ca57506122de86611c6d565b67ffffffffffffffff8060035460401c16911611612477575b506040865101516040516123408161153b60208201948591909160408060608301946fffffffffffffffffffffffffffffffff8151168452602081015160208501520151910152565b51902067ffffffffffffffff61235587611c6d565b165f52600560205260405f20555b5f805b8551805183101561244c57611ece8361237e9261174d565b156124425750633b9aca0096936fffffffffffffffffffffffffffffffff9693611f39879460206123b56123cd9660409b5161174d565b5101519081518151808214918261242c575050612c4b565b6123f48351858101519067ffffffffffffffff602060a08185015193015101511690612e1b565b51600181511161240a575b505051015151160490565b61241661242592611c6d565b90858585510151511691612eab565b5f806123ff565b9091506020840120906020830120145f80611f32565b9060010190612366565b5060409592506123cd9150936fffffffffffffffffffffffffffffffff9693633b9aca009895612c99565b6124836124b891611c6d565b67ffffffffffffffff167fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000006003541617600355565b6124c46115a386611c6d565b5f6122f7565b6001915003612363577f59bc8fd3000000000000000000000000000000000000000000000000000000005f5260045ffd5b6084945067ffffffffffffffff9081604051957fb8d8167e00000000000000000000000000000000000000000000000000000000875216600486015216602484015260448301526064820152fd5b5061255384611c6d565b67ffffffffffffffff80845116911614612285565b5050909161257b60206125909201611c6d565b916040519461258986610f83565b3691611c82565b8352602083019182526040516125af8161153b86602083019586612954565b5190205c9151905182156125c9575050633b9aca00900490565b9061261d61260b926040519384937ff06fc33b000000000000000000000000000000000000000000000000000000008552604060048601526044850190610e1d565b90600319848303016024850152610df8565b0390fd5b905f8091602081519101845af480806126d5575b156126555750506040513d81523d5f602083013e60203d82010160405290565b1561269c5773ffffffffffffffffffffffffffffffffffffffff907f9996b315000000000000000000000000000000000000000000000000000000005f521660045260245ffd5b3d156126ad576040513d5f823e3d90fd5b7fd6bda275000000000000000000000000000000000000000000000000000000005f5260045ffd5b503d1515806126355750813b1515612635565b906fffffffffffffffffffffffffffffffff633b9aca00911604428111612925578042034281116128f857610708106128c9575080515161272a600154610e75565b14806128a2575b815190156128625750602081015160ff815116906002549160ff8316928382149283612849575b6020015160ff169215612801575050505063ffffffff606082015116906004549163ffffffff83168082036127d357505063ffffffff608081920151169160201c168082036127a5575050565b7f1eb5c1eb000000000000000000000000000000000000000000000000000000005f5260045260245260445ffd5b7f73b1bde3000000000000000000000000000000000000000000000000000000005f5260045260245260445ffd5b6084945060ff90604051947fd382033a000000000000000000000000000000000000000000000000000000008652600486015260081c16602484015260448301526064820152fd5b6020810151600883901c60ff9081169116149350612758565b61261d906040519182917ff6b6676b0000000000000000000000000000000000000000000000000000000083526040600484015261260b60448401610ec6565b508051602081519101206040516128bc8161059a81610ec6565b6020815191012014612731565b7f12e74add000000000000000000000000000000000000000000000000000000005f524260045260245260445ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b7f20daedb6000000000000000000000000000000000000000000000000000000005f524260045260245260445ffd5b9067ffffffffffffffff90939293168152604060208201526080810190835191604080830152825180915260a0820190602060a08260051b8501019401915f905b8282106129d9575050505060206110d6939401519060607fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc082850301910152610df8565b90919294602080612a14837fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6089600196030186528951610df8565b970192019201909291612995565b60405190612a2f82611004565b5f6040838281528260208201520152565b9080601f830112156101de5781516110d6926020016111c0565b91906060838203126101de5760405190612a7382611004565b819380518352602081015167ffffffffffffffff81116101de5782612a99918301612a40565b602084015260408101519167ffffffffffffffff83116101de5760409261124a9201612a40565b9080601f830112156101de57815191612ad883611735565b92612ae6604051948561103c565b80845260208085019160051b830101918383116101de5760208101915b838310612b1257505050505090565b825167ffffffffffffffff81116101de578201906040601f1983880301126101de5760405190612b4182610f83565b602083015167ffffffffffffffff81116101de5760209084010187601f820112156101de578051612b7181611735565b91612b7f604051938461103c565b81835260208084019260051b820101918a83116101de5760208201905b838210612bdf5750505050825260408301519167ffffffffffffffff83116101de57612bd088602080969581960101612a40565b83820152815201920191612b03565b815167ffffffffffffffff81116101de57602091612c028e848094880101612a40565b815201910190612b9c565b15612c155750565b7fb0369c31000000000000000000000000000000000000000000000000000000005f52600452600160245261ffff60445260645ffd5b91909115612c57575050565b9061261d61260b926040519384937f5f1ca381000000000000000000000000000000000000000000000000000000008552604060048601526044850190610df8565b91909115612ca5575050565b604051907ffef760c700000000000000000000000000000000000000000000000000000000825280602483016020600485015252604482019260448260051b84010191815f907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1813603015b838310612d1e5786860387fd5b90919293947fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbc8782030188528535828112156101de578301906020823592019167ffffffffffffffff81116101de5780360383136101de57602082601f19601f8480600198869897879852868601375f85828601015201160101970198019301919096939296612d11565b908151815103611b9f575f5b8251811015612e1357612dc8818461174d565b5151612dd4828461174d565b515103612e0c57612de5818461174d565b5160208151910120612df7828461174d565b516020815191012003612e0c57600101612db5565b5050505f90565b505050600190565b91612e7060209261193c60405185810190612e678161153b888591909160408060608301946fffffffffffffffffffffffffffffffff8151168452602081015160208501520151910152565b51902091611649565b0151808203612e7d575050565b7f4b2dfe98000000000000000000000000000000000000000000000000000000005f5260045260245260445ffd5b929190925f5b8451811015612ee9578083612ec86001938861174d565b51604051612edf8161153b60208201948986612954565b5190205d01612eb1565b505050905056fea164736f6c634300081c000a2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d4c48d1d2b0f4f7485fc28e3db22341d96a20aa29e6efa8149da9751603abd4e06e0c24a6e293ff9b755263dbaa15ba3796b0b8d3fe17cfb4ddf8143b268eac47bd893629a699470e4ec82a5715bb4981fdaacc5d0a728bf5f55b801d8f4ef10bad3228b676f7d3cd4284a5443f17f1962b36e491b30a40b2405849e597ba5fb5","sourceMap":"1355:25496:38:-:0;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;-1:-1:-1;;;;;1355:25496:38;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;:::i;:::-;3774:52;1355:25496;3774:52;1355:25496;3836:47;1355:25496;3893:80;1355:25496;3983:51;1355:25496;;4059:60;;;1355:25496;4059:60;;1355:25496;;;;;;;;;4059:60;;1355:25496;;-1:-1:-1;;;;;1355:25496:38;;;;;;;;;-1:-1:-1;;1355:25496:38;;;;-1:-1:-1;1355:25496:38;;;;;;;;-1:-1:-1;;;;;1355:25496:38;;;;;;;;;;;;;;-1:-1:-1;;;;;1355:25496:38;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;1355:25496:38;;;;;;;;;;;;;;;;-1:-1:-1;1355:25496:38;;;;;;;;;;;-1:-1:-1;1355:25496:38;;;;;;;;;;;;;;;;-1:-1:-1;;1355:25496:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1355:25496:38;4129:21;1355:25496;;;-1:-1:-1;1355:25496:38;;;;;;;;;4220:36;1355:25496;;;;;2472:10;;;1355:25496;2472:10;;;;1355:25496;2472:10;;1355:25496;2472:10;1355:25496;;;;;4288:83;2472:10;;1355:25496;-1:-1:-1;;;;;1355:25496:38;;;;4529:44;;;:::i;:::-;;4484:351;1355:25496;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4484:351;4637:43;;4736:45;4637:43;;:::i;:::-;;4736:45;:::i;:::-;;4484:351;;2472:10;;;;-1:-1:-1;2472:10:38;1355:25496;2472:10;;;;-1:-1:-1;2472:10:38;;1355:25496;;;-1:-1:-1;2472:10:38;;1355:25496;2472:10;;-1:-1:-1;2472:10:38;1355:25496;;;;-1:-1:-1;1355:25496:38;;;;;-1:-1:-1;1355:25496:38;;;;;-1:-1:-1;1355:25496:38;;;;;;;;;;;;-1:-1:-1;1355:25496:38;;-1:-1:-1;1355:25496:38;;-1:-1:-1;1355:25496:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1355:25496:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1355:25496:38;;;;;;;;;-1:-1:-1;1355:25496:38;;;;;;;;-1:-1:-1;1355:25496:38;;;;;-1:-1:-1;1355:25496:38;;;;;;;;;;;;-1:-1:-1;1355:25496:38;;;;;-1:-1:-1;1355:25496:38;;-1:-1:-1;1355:25496:38;;;;;;;;;;-1:-1:-1;;;;;1355:25496:38;;;;;;;;;;:::o;:::-;;;;;;;-1:-1:-1;;1355:25496:38;;;-1:-1:-1;;;;;1355:25496:38;;;;;;;;;;:::o;:::-;;;-1:-1:-1;;;;;1355:25496:38;;;;;;:::o;:::-;;;;-1:-1:-1;;;;;1355:25496:38;;;;;;;;-1:-1:-1;;1355:25496:38;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;:::o;:::-;;;-1:-1:-1;;;;;1355:25496:38;;;;;;:::o;:::-;;;;;;;;;;:::o;6155:316:84:-;-1:-1:-1;;;;;1355:25496:38;;;;;;-1:-1:-1;;;;;;;;;;;1355:25496:38;;;;;;;;;;-1:-1:-1;;;;;1355:25496:38;;;;;-1:-1:-1;;;;;;;;;;;1355:25496:38;;;;;;;-1:-1:-1;;1355:25496:38;;;;;735:10:112;;1355:25496:38;-1:-1:-1;;;;;;;;;;;1355:25496:38;;6346:40:84;6323:4;6400:11;:::o;6248:217::-;6442:12;1355:25496:38;6442:12:84;:::o;6155:316::-;-1:-1:-1;;;;;1355:25496:38;;;;;;-1:-1:-1;;;;;;;;;;;1355:25496:38;;;;;;;;;;-1:-1:-1;;;;;1355:25496:38;;;;;-1:-1:-1;;;;;;;;;;;1355:25496:38;;;;;;;-1:-1:-1;;1355:25496:38;;;;;735:10:112;;1355:25496:38;-1:-1:-1;;;;;;;;;;;2576:33:38;-1:-1:-1;;;;;;;;;;;6346:40:84;1355:25496:38;6346:40:84;6323:4;6400:11;:::o;6155:316::-;1355:25496:38;;;-1:-1:-1;;;;;;;;;;;1355:25496:38;;-1:-1:-1;;;;;;;;;;;1355:25496:38;;;;;;;;;-1:-1:-1;;;;;;;;;;;1355:25496:38;;-1:-1:-1;;;;;;;;;;;1355:25496:38;;-1:-1:-1;;1355:25496:38;6323:4:84;1355:25496:38;;;735:10:112;;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;1355:25496:38;;6346:40:84;6323:4;6400:11;:::o;6248:217::-;1355:25496:38;6442:12:84;:::o","linkReferences":{}},"deployedBytecode":{"object":"0x6080806040526004361015610012575f80fd5b5f3560e01c90816301ffc9a714610cd6575080630225293e14610c9c57806308c84e7014610c4c5780630bece35614610b8957806323842fb814610b59578063248a9ca314610b2f5780632c3ee47414610b135780632f2ff15d14610ae4578063314d4dff14610aaa57806336568abe14610a4e5780634d6d9ffb1461096c5780635972185a14610932578063682ed5f01461080e57806391d14854146107c5578063a217fddf146107ab578063ac9650d81461066a578063bd3ce6b01461057a578063ca7242f914610540578063d547741f1461050a578063ddba65371461021c578063e45a6d0d146101e25763ef913a4b1461010e575f80fd5b346101de575f6003193601126101de576101da60405160208082015261012060408201526101c6816101436101608201610ec6565b60ff600254818116606085015260081c16608083015267ffffffffffffffff60035481811660a085015260401c1660c083015260ff60045463ffffffff811660e085015263ffffffff8160201c16610100850152818160401c16151561012085015260481c166101b28161105f565b61014083015203601f19810183528261103c565b604051918291602083526020830190610df8565b0390f35b5f80fd5b346101de575f6003193601126101de5760206040517f00000000000000000000000000000000000000000000000000000000000000008152f35b346101de5761022a36610d74565b6004549160ff8360401c166104e2575f80527f4c48d1d2b0f4f7485fc28e3db22341d96a20aa29e6efa8149da9751603abd4e06020527f6e0c24a6e293ff9b755263dbaa15ba3796b0b8d3fe17cfb4ddf8143b268eac4754610298929060ff16156104d5575b8101906110d9565b6102c78151517f0000000000000000000000000000000000000000000000000000000000000000808214611189565b6020815101518051810160208101916020818303126101de57602081015167ffffffffffffffff81116101de57019061018090829003126101de576040519061030f82610fcc565b602081015167ffffffffffffffff81116101de57839082016020019061033491611260565b825261034260408201611348565b60208301908152906103578460608301611219565b604084019081529161036c8560a08401611219565b60608501908152946103818160e08501611365565b9260808601938452610140019061039791611365565b9360a081019485525190516fffffffffffffffffffffffffffffffff166103bd916126e8565b516040805182516fffffffffffffffffffffffffffffffff16602080830191825284015182840152919092015160608084019190915282529061040160808261103c565b51902090516020015167ffffffffffffffff1661041d90611649565b61042a919081811461187c565b516040805182516fffffffffffffffffffffffffffffffff16602080830191825284015182840152919092015160608084019190915282529061046e60808261103c565b51902090516020015167ffffffffffffffff1661048a90611649565b610497919081811461187c565b516104a190611a03565b7fffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffff1668010000000000000000176004555f80f35b6104dd61178e565b610290565b7f928b1233000000000000000000000000000000000000000000000000000000005f5260045ffd5b346101de5761053e61051b36610dc5565b90610539610534825f525f602052600160405f20015490565b611816565b611ba5565b005b346101de575f6003193601126101de5760206040517f00000000000000000000000000000000000000000000000000000000000000008152f35b346101de575f6003193601126101de576040516105a18161059a81610ec6565b038261103c565b6101206040516105b081610f83565b60025460ff8116825260ff602083019160081c16815260ff6040516105d481610f83565b67ffffffffffffffff600354818116835281602084019160401c168152816004549385808660481c1697816106146040519d8d8f9e8f9081520190610df8565b9a511660208c0152511660408a0152511660608801525116608086015263ffffffff811660a086015263ffffffff8160201c1660c086015260401c16151560e08401526106608161105f565b6101008301520390f35b346101de5760206003193601126101de5760043567ffffffffffffffff81116101de57366023820112156101de57806004013567ffffffffffffffff81116101de57602482013660248360051b850101116101de5760405160206106ce818361103c565b5f825280820192601f1982013685376106e685611735565b956106f4604051978861103c565b858752601f1961070387611735565b01835f5b82811061079b575050505f5b868110156107885760019061076c61076661073660248460051b87010187611690565b9190888b846040519586948486013783018281015f81528d519283915e01015f815203601f19810183528261103c565b30612621565b610776828b61174d565b52610781818a61174d565b5001610713565b604051848152806101da8187018b610e1d565b606082828c010152018490610707565b346101de575f6003193601126101de5760206040515f8152f35b346101de576107d336610dc5565b905f525f60205273ffffffffffffffffffffffffffffffffffffffff60405f2091165f52602052602060ff60405f2054166040519015158152f35b346101de5760206003193601126101de5760043567ffffffffffffffff81116101de578060040160a060031983360301126101de5760ff60045460401c166104e2575f80527f4c48d1d2b0f4f7485fc28e3db22341d96a20aa29e6efa8149da9751603abd4e06020527f6e0c24a6e293ff9b755263dbaa15ba3796b0b8d3fe17cfb4ddf8143b268eac475460ff1615610925575b60848201916108b18383611690565b9050156108fd57602092826108c9816108f595611690565b60246108ed6108e66108de60648901876116e1565b979096611690565b3691611085565b950191611cee565b604051908152f35b7f1208b21b000000000000000000000000000000000000000000000000000000005f5260045ffd5b61092d61178e565b6108a2565b346101de575f6003193601126101de5760206040517fbd893629a699470e4ec82a5715bb4981fdaacc5d0a728bf5f55b801d8f4ef10b8152f35b346101de5760206003193601126101de5760043567ffffffffffffffff81116101de5780600401608060031983360301126101de5760ff60045460401c166104e2575f80527f4c48d1d2b0f4f7485fc28e3db22341d96a20aa29e6efa8149da9751603abd4e060209081527f6e0c24a6e293ff9b755263dbaa15ba3796b0b8d3fe17cfb4ddf8143b268eac475490926108f592909160ff1615610a41575b610a24610a178280611690565b91909260648501906116e1565b929091602460405195610a37898861103c565b5f87520191611cee565b610a4961178e565b610a0a565b346101de57610a5c36610dc5565b3373ffffffffffffffffffffffffffffffffffffffff821603610a825761053e91611ba5565b7f6697b232000000000000000000000000000000000000000000000000000000005f5260045ffd5b346101de575f6003193601126101de5760206040517f00000000000000000000000000000000000000000000000000000000000000008152f35b346101de5761053e610af536610dc5565b90610b0e610534825f525f602052600160405f20015490565b611ad3565b346101de575f6003193601126101de5760206040516107088152f35b346101de5760206003193601126101de5760206108f56004355f525f602052600160405f20015490565b346101de5760206003193601126101de5760043567ffffffffffffffff811681036101de576108f5602091611649565b346101de57610b9736610d74565b60ff60045460401c166104e2575f80527f4c48d1d2b0f4f7485fc28e3db22341d96a20aa29e6efa8149da9751603abd4e06020527f6e0c24a6e293ff9b755263dbaa15ba3796b0b8d3fe17cfb4ddf8143b268eac4754610bff929060ff1615610c3f57611431565b6040516003821015610c12576020918152f35b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b610c4761178e565b611431565b346101de575f6003193601126101de57602060405173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b346101de575f6003193601126101de5760206040517f00000000000000000000000000000000000000000000000000000000000000008152f35b346101de5760206003193601126101de57600435907fffffffff0000000000000000000000000000000000000000000000000000000082168092036101de57817f7965db0b0000000000000000000000000000000000000000000000000000000060209314908115610d4a575b5015158152f35b7f01ffc9a70000000000000000000000000000000000000000000000000000000091501483610d43565b9060206003198301126101de5760043567ffffffffffffffff81116101de57826023820112156101de5780600401359267ffffffffffffffff84116101de57602484830101116101de576024019190565b60031960409101126101de576004359060243573ffffffffffffffffffffffffffffffffffffffff811681036101de5790565b90601f19601f602080948051918291828752018686015e5f8582860101520116010190565b9080602083519182815201916020808360051b8301019401925f915b838310610e4857505050505090565b9091929394602080610e6683601f1986600196030187528951610df8565b97019301930191939290610e39565b90600182811c92168015610ebc575b6020831014610e8f57565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b91607f1691610e84565b6001545f9291610ed582610e75565b8082529160018116908115610f495750600114610ef0575050565b60015f9081529293509091907fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf65b838310610f2f575060209250010190565b600181602092949394548385870101520191019190610f1e565b60209495507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0091509291921683830152151560051b010190565b6040810190811067ffffffffffffffff821117610f9f57604052565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b60c0810190811067ffffffffffffffff821117610f9f57604052565b6020810190811067ffffffffffffffff821117610f9f57604052565b6060810190811067ffffffffffffffff821117610f9f57604052565b60e0810190811067ffffffffffffffff821117610f9f57604052565b90601f601f19910116810190811067ffffffffffffffff821117610f9f57604052565b60021115610c1257565b67ffffffffffffffff8111610f9f57601f01601f191660200190565b92919261109182611069565b9161109f604051938461103c565b8294818452818301116101de578281602093845f960137010152565b9080601f830112156101de578160206110d693359101611085565b90565b6020818303126101de5780359067ffffffffffffffff82116101de5701906020828203126101de576040519161110e83610fe8565b80359067ffffffffffffffff82116101de57016060818303126101de576040519161113883611004565b81358352602082013567ffffffffffffffff81116101de578161115c9184016110bb565b6020840152604082013567ffffffffffffffff81116101de5761117f92016110bb565b6040820152815290565b15611192575050565b7fd56bdc26000000000000000000000000000000000000000000000000000000005f5260045260245260445ffd5b9291926111cc82611069565b916111da604051938461103c565b8294818452818301116101de578281602093845f96015e010152565b519060ff821682036101de57565b519067ffffffffffffffff821682036101de57565b91908260409103126101de5760405161123181610f83565b602061124a81839561124281611204565b855201611204565b910152565b519063ffffffff821682036101de57565b91908281039261012084126101de576040519161127c83611020565b8294825167ffffffffffffffff81116101de57830182601f820112156101de576040916112b284836020601f19955191016111c0565b865201126101de576112f7906040516112ca81610f83565b6112d6602085016111f6565b81526112e4604085016111f6565b6020820152602085015260608301611219565b604083015261130860a0820161124f565b606083015261131960c0820161124f565b608083015260e08101519081151582036101de576101009160a084015201519060028210156101de5760c00152565b51906fffffffffffffffffffffffffffffffff821682036101de57565b91908260609103126101de5760405161137d81611004565b604080829461138b81611348565b8452602081015160208501520151910152565b9190610180838203126101de57604051906113b882610fcc565b819380519167ffffffffffffffff83116101de57610140826113e18360a09661124a9601611260565b86526113f08360208301611365565b60208701526114028360808301611365565b604087015261141360e08201611348565b6060870152611426836101008301611219565b608087015201611219565b61143d918101906110d9565b61146c8151517f0000000000000000000000000000000000000000000000000000000000000000808214611189565b60208151015180518101906020818303126101de5760208101519167ffffffffffffffff83116101de576114a792602080920192010161139e565b906114b1826118b3565b6114ba82611946565b916003831015610c1257826115ec57908167ffffffffffffffff6020604060a06110d6960193845184848201511685600354851c168111611564575b505001516040516115498161153b858201948591909160408060608301946fffffffffffffffffffffffffffffffff8151168452602081015160208501520151910152565b03601f19810183528261103c565b51902092510151165f52600560205260405f20555b51611a03565b6115a3866115e593511667ffffffffffffffff167fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000006003541617600355565b7fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff6fffffffffffffffff00000000000000006003549260401b16911617600355565b5f806114f6565b5060018203611631576110d690680100000000000000007fffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffff600454161760045561155e565b60028214611642576110d69061155e565b5050600290565b67ffffffffffffffff165f52600560205260405f205480156116685790565b7f5b48b457000000000000000000000000000000000000000000000000000000005f5260045ffd5b9035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1813603018212156101de570180359067ffffffffffffffff82116101de576020019181360383136101de57565b9035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1813603018212156101de570180359067ffffffffffffffff82116101de57602001918160051b360383136101de57565b67ffffffffffffffff8111610f9f5760051b60200190565b80518210156117615760209160051b010190565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b335f9081527f4c48d1d2b0f4f7485fc28e3db22341d96a20aa29e6efa8149da9751603abd4e0602052604090205460ff16156117c657565b7fe2517d3f000000000000000000000000000000000000000000000000000000005f52336004527fbd893629a699470e4ec82a5715bb4981fdaacc5d0a728bf5f55b801d8f4ef10b60245260445ffd5b805f525f60205260405f2073ffffffffffffffffffffffffffffffffffffffff33165f5260205260ff60405f2054161561184d5750565b7fe2517d3f000000000000000000000000000000000000000000000000000000005f523360045260245260445ffd5b15611885575050565b7f6d23e8a3000000000000000000000000000000000000000000000000000000005f5260045260245260445ffd5b611944906118d981516fffffffffffffffffffffffffffffffff606084015116906126e8565b61193c67ffffffffffffffff602060808185015160405161192e8161153b868201948591909160408060608301946fffffffffffffffffffffffffffffffff8151168452602081015160208501520151910152565b519020940151015116611649565b80821461187c565b565b67ffffffffffffffff602060a08301510151165f52600560205260405f205480155f146119735750505f90565b604082019081516040516119bc8161153b60208201948591909160408060608301946fffffffffffffffffffffffffffffffff8151168452602081015160208501520151910152565b51902014918215926119da575b5050156119d557600190565b600290565b6fffffffffffffffffffffffffffffffff91925060208291015151169151511611155f806119c9565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169080516040602083015192015192803b156101de575f92611a9b92611aad604051968795869485947f41493c600000000000000000000000000000000000000000000000000000000086526004860152606060248601526064850190610df8565b90600319848303016044850152610df8565b03915afa8015611ac857611abe5750565b5f6119449161103c565b6040513d5f823e3d90fd5b805f525f60205260405f2073ffffffffffffffffffffffffffffffffffffffff83165f5260205260ff60405f205416155f14611b9f57805f525f60205260405f2073ffffffffffffffffffffffffffffffffffffffff83165f5260205260405f2060017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0082541617905573ffffffffffffffffffffffffffffffffffffffff339216907f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d5f80a4600190565b50505f90565b805f525f60205260405f2073ffffffffffffffffffffffffffffffffffffffff83165f5260205260ff60405f2054165f14611b9f57805f525f60205260405f2073ffffffffffffffffffffffffffffffffffffffff83165f5260205260405f207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00815416905573ffffffffffffffffffffffffffffffffffffffff339216907ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b5f80a4600190565b3567ffffffffffffffff811681036101de5790565b929190611c8e81611735565b93611c9c604051958661103c565b602085838152019160051b8101918383116101de5781905b838210611cc2575050505050565b813567ffffffffffffffff81116101de57602091611ce387849387016110bb565b815201910190611cb4565b9094929193948015612568578101906020818303126101de5780359067ffffffffffffffff82116101de57016040818303126101de5760405191611d3183610f83565b813560028110156101de578352602082013567ffffffffffffffff81116101de57611d5c92016110bb565b90602081019182528051611d6f8161105f565b611d788161105f565b611fe5575051908151820160208101926020818303126101de57602081015167ffffffffffffffff81116101de570190608090829003126101de5760405192611dc084610f83565b602082015167ffffffffffffffff81116101de5782611de9836020604094611df1970101612a5a565b865201611365565b9460208301958652611e288351517f0000000000000000000000000000000000000000000000000000000000000000808214611189565b6020835101519182518301926020818503126101de5760208101519067ffffffffffffffff82116101de5701926040848203126101de5760405193611e6c85610f83565b6020810151855260408101519167ffffffffffffffff83116101de57611e99926020809201920101612ac0565b94611eb360208501968088525180151580611fd957612c0d565b5f805b87518051831015611fa657611ece83611ee19261174d565b5151611edb368888611c82565b90612da9565b15611f9c57508694611f40611f55956fffffffffffffffffffffffffffffffff9a9895611f3961155e966020633b9aca009f9d8198611f20915161174d565b51015190815181518082149182611f88575b5050612c4b565b6001612c99565b51950194611f4d86611c6d565b875191612e1b565b516001815111611f69575b50505151160490565b611f75611f8192611c6d565b90848451511691612eab565b5f80611f60565b909150898401209089830120145f80611f32565b9060010190611eb6565b5061155e92506020915094611f40611f55956fffffffffffffffffffffffffffffffff9a9895633b9aca009c9a98612c99565b5061ffff811115612c0d565b94906001869593949551611ff88161105f565b6120018161105f565b146120485760ff86516120138161105f565b61201c8161105f565b7fd3a2e6c9000000000000000000000000000000000000000000000000000000005f521660045260245ffd5b90919293945051926060602060405161206081610f83565b60405161206c81610fcc565b60405161207881611020565b84815260405161208781610f83565b5f81525f858201528482015260405161209f81610f83565b5f81525f8582015260408201525f858201525f60808201525f60a08201525f60c082015281526120cd612a22565b838201526120d9612a22565b60408201525f848201526040516120ef81610f83565b5f81525f84820152608082015260405161210881610f83565b5f81525f8482015260a08201528152015283518401936020818603126101de5760208101519067ffffffffffffffff82116101de5701936020858203126101de576040519461215686610fe8565b60208101519067ffffffffffffffff82116101de57602061217f92816121ac9501920101612a5a565b808652517f0000000000000000000000000000000000000000000000000000000000000000808214611189565b602084510151948551860160208101966020818303126101de57602081015167ffffffffffffffff81116101de570190604090829003126101de57604051966121f488610f83565b602082015167ffffffffffffffff81116101de578160206122179285010161139e565b885260408201519167ffffffffffffffff83116101de5761223b9201602001612ac0565b9361225560208801958087525180151580611fd957612c0d565b602081019561226387611c6d565b67ffffffffffffffff60a08a5101519181602084015116918291161480612549575b61228e85611c6d565b9267ffffffffffffffff6122a18c611c6d565b91511691156124fb57505050506122bc9061155e89516118b3565b6122c68751611946565b6003811015610c1257806124ca57506122de86611c6d565b67ffffffffffffffff8060035460401c16911611612477575b506040865101516040516123408161153b60208201948591909160408060608301946fffffffffffffffffffffffffffffffff8151168452602081015160208501520151910152565b51902067ffffffffffffffff61235587611c6d565b165f52600560205260405f20555b5f805b8551805183101561244c57611ece8361237e9261174d565b156124425750633b9aca0096936fffffffffffffffffffffffffffffffff9693611f39879460206123b56123cd9660409b5161174d565b5101519081518151808214918261242c575050612c4b565b6123f48351858101519067ffffffffffffffff602060a08185015193015101511690612e1b565b51600181511161240a575b505051015151160490565b61241661242592611c6d565b90858585510151511691612eab565b5f806123ff565b9091506020840120906020830120145f80611f32565b9060010190612366565b5060409592506123cd9150936fffffffffffffffffffffffffffffffff9693633b9aca009895612c99565b6124836124b891611c6d565b67ffffffffffffffff167fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000006003541617600355565b6124c46115a386611c6d565b5f6122f7565b6001915003612363577f59bc8fd3000000000000000000000000000000000000000000000000000000005f5260045ffd5b6084945067ffffffffffffffff9081604051957fb8d8167e00000000000000000000000000000000000000000000000000000000875216600486015216602484015260448301526064820152fd5b5061255384611c6d565b67ffffffffffffffff80845116911614612285565b5050909161257b60206125909201611c6d565b916040519461258986610f83565b3691611c82565b8352602083019182526040516125af8161153b86602083019586612954565b5190205c9151905182156125c9575050633b9aca00900490565b9061261d61260b926040519384937ff06fc33b000000000000000000000000000000000000000000000000000000008552604060048601526044850190610e1d565b90600319848303016024850152610df8565b0390fd5b905f8091602081519101845af480806126d5575b156126555750506040513d81523d5f602083013e60203d82010160405290565b1561269c5773ffffffffffffffffffffffffffffffffffffffff907f9996b315000000000000000000000000000000000000000000000000000000005f521660045260245ffd5b3d156126ad576040513d5f823e3d90fd5b7fd6bda275000000000000000000000000000000000000000000000000000000005f5260045ffd5b503d1515806126355750813b1515612635565b906fffffffffffffffffffffffffffffffff633b9aca00911604428111612925578042034281116128f857610708106128c9575080515161272a600154610e75565b14806128a2575b815190156128625750602081015160ff815116906002549160ff8316928382149283612849575b6020015160ff169215612801575050505063ffffffff606082015116906004549163ffffffff83168082036127d357505063ffffffff608081920151169160201c168082036127a5575050565b7f1eb5c1eb000000000000000000000000000000000000000000000000000000005f5260045260245260445ffd5b7f73b1bde3000000000000000000000000000000000000000000000000000000005f5260045260245260445ffd5b6084945060ff90604051947fd382033a000000000000000000000000000000000000000000000000000000008652600486015260081c16602484015260448301526064820152fd5b6020810151600883901c60ff9081169116149350612758565b61261d906040519182917ff6b6676b0000000000000000000000000000000000000000000000000000000083526040600484015261260b60448401610ec6565b508051602081519101206040516128bc8161059a81610ec6565b6020815191012014612731565b7f12e74add000000000000000000000000000000000000000000000000000000005f524260045260245260445ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b7f20daedb6000000000000000000000000000000000000000000000000000000005f524260045260245260445ffd5b9067ffffffffffffffff90939293168152604060208201526080810190835191604080830152825180915260a0820190602060a08260051b8501019401915f905b8282106129d9575050505060206110d6939401519060607fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc082850301910152610df8565b90919294602080612a14837fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6089600196030186528951610df8565b970192019201909291612995565b60405190612a2f82611004565b5f6040838281528260208201520152565b9080601f830112156101de5781516110d6926020016111c0565b91906060838203126101de5760405190612a7382611004565b819380518352602081015167ffffffffffffffff81116101de5782612a99918301612a40565b602084015260408101519167ffffffffffffffff83116101de5760409261124a9201612a40565b9080601f830112156101de57815191612ad883611735565b92612ae6604051948561103c565b80845260208085019160051b830101918383116101de5760208101915b838310612b1257505050505090565b825167ffffffffffffffff81116101de578201906040601f1983880301126101de5760405190612b4182610f83565b602083015167ffffffffffffffff81116101de5760209084010187601f820112156101de578051612b7181611735565b91612b7f604051938461103c565b81835260208084019260051b820101918a83116101de5760208201905b838210612bdf5750505050825260408301519167ffffffffffffffff83116101de57612bd088602080969581960101612a40565b83820152815201920191612b03565b815167ffffffffffffffff81116101de57602091612c028e848094880101612a40565b815201910190612b9c565b15612c155750565b7fb0369c31000000000000000000000000000000000000000000000000000000005f52600452600160245261ffff60445260645ffd5b91909115612c57575050565b9061261d61260b926040519384937f5f1ca381000000000000000000000000000000000000000000000000000000008552604060048601526044850190610df8565b91909115612ca5575050565b604051907ffef760c700000000000000000000000000000000000000000000000000000000825280602483016020600485015252604482019260448260051b84010191815f907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1813603015b838310612d1e5786860387fd5b90919293947fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbc8782030188528535828112156101de578301906020823592019167ffffffffffffffff81116101de5780360383136101de57602082601f19601f8480600198869897879852868601375f85828601015201160101970198019301919096939296612d11565b908151815103611b9f575f5b8251811015612e1357612dc8818461174d565b5151612dd4828461174d565b515103612e0c57612de5818461174d565b5160208151910120612df7828461174d565b516020815191012003612e0c57600101612db5565b5050505f90565b505050600190565b91612e7060209261193c60405185810190612e678161153b888591909160408060608301946fffffffffffffffffffffffffffffffff8151168452602081015160208501520151910152565b51902091611649565b0151808203612e7d575050565b7f4b2dfe98000000000000000000000000000000000000000000000000000000005f5260045260245260445ffd5b929190925f5b8451811015612ee9578083612ec86001938861174d565b51604051612edf8161153b60208201948986612954565b5190205d01612eb1565b505050905056fea164736f6c634300081c000a","sourceMap":"1355:25496:38:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;1355:25496:38;;;;;;;;4960:23;;;;1355:25496;;;;;;4960:23;1355:25496;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4960:23;1355:25496;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;4960:23;-1:-1:-1;;4960:23:38;;;;;;:::i;:::-;1355:25496;;;;;4960:23;1355:25496;;4960:23;1355:25496;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;1355:25496:38;;;;;;;;1648:48;1355:25496;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;9619:70;;1355:25496;;;26731:42;26727:105;;1355:25496;9619:70;;;;:::i;:::-;9699:196;9720:30;;1355:25496;9759:25;9720:64;;;9699:196;:::i;:::-;1355:25496;9982:30;;:43;;1355:25496;;9971:95;;1355:25496;9971:95;;1355:25496;;;;;;;;;9971:95;;1355:25496;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;;;;;;;;19046:18;1355:25496;;;;19066:11;;;:::i;:::-;19282:29;1355:25496;;;;;;;;19271:41;;;1355:25496;;;;;;;;;;;;;;;;;;;;;;;19271:41;;;;1355:25496;;19271:41;:::i;:::-;1355:25496;19261:52;;19381:21;;1355:25496;19381:36;1355:25496;;;19359:59;;;:::i;:::-;19428:179;;19449:54;;;;19428:179;:::i;:::-;19811:29;1355:25496;;;;;;;;19800:41;;;1355:25496;;;;;;;;;;;;;;;;;;;;;;;19800:41;;;;1355:25496;;19800:41;:::i;:::-;1355:25496;19790:52;;19910:21;;1355:25496;19910:36;1355:25496;;;19888:59;;;:::i;:::-;19957:179;;19978:54;;;;19957:179;:::i;:::-;10139:30;;;;:::i;:::-;1355:25496;;;;;;;;;26727:105;26800:20;;:::i;:::-;26727:105;;1355:25496;;;;;;;;;;;4723:26:84;1355:25496:38;;;:::i;:::-;4693:18:84;2484:4;4693:18;;3877:6;1355:25496:38;3877:6:84;1355:25496:38;;3877:22:84;1355:25496:38;3877:6:84;1355:25496:38;3877:22:84;1355:25496:38;3786:120:84;;4693:18;2484:4;:::i;:::-;4723:26;:::i;:::-;1355:25496:38;;;;;;-1:-1:-1;;1355:25496:38;;;;;;;;1551:51;1355:25496;;;;;;;;-1:-1:-1;;1355:25496:38;;;;;;;;;;;;:::i;:::-;;;;:::i;:::-;;;;;;;:::i;:::-;2095:51;1355:25496;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;2095:51;1355:25496;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;1355:25496:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;-1:-1:-1;;1355:25496:38;;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;-1:-1:-1;;1355:25496:38;;;:::i;:::-;;;;;;;;;;1526:13:116;;;1355:25496:38;1558:3:116;1541:15;;;;;;1347:26;1355:25496:38;1590:75:116;1355:25496:38;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;1355:25496:38;;;;;;:::i;:::-;1627:4:116;1590:75;:::i;:::-;1577:88;;;;:::i;:::-;;;;;;:::i;:::-;;1355:25496:38;1526:13:116;;1541:15;1355:25496:38;;;;;;;;;;1541:15:116;1355:25496:38;:::i;:::-;;;;;;;;;;;;;;;;;;-1:-1:-1;;1355:25496:38;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;2930:29:84;1355:25496:38;-1:-1:-1;1355:25496:38;;;;;;-1:-1:-1;1355:25496:38;;;;;;;;;;;;;;;;-1:-1:-1;;1355:25496:38;;;;;;;;;;;;;;;;-1:-1:-1;;1355:25496:38;;;;;;;;;;;;;;;;;;;;;;;;;26731:42;26727:105;;1355:25496;7188:10;;;;;;;;:::i;:::-;:21;;;1355:25496;;;7253:10;;;;7241:64;7253:10;;:::i;:::-;7265:16;1355:25496;7294:10;7283:9;;;;;;:::i;:::-;7294:10;;;;:::i;:::-;1355:25496;;;:::i;:::-;7265:16;;7241:64;;:::i;:::-;1355:25496;;;;;;;;;;;;;26727:105;26800:20;;:::i;:::-;26727:105;;1355:25496;;;;;-1:-1:-1;;1355:25496:38;;;;;;;;2576:33;1355:25496;;;;;;;;-1:-1:-1;;1355:25496:38;;;;;;;;;;;;;;;;-1:-1:-1;;1355:25496:38;;;;;;;;;;;;;;;;;;;;;;;;;;;7544:63;;1355:25496;;;;26731:42;26727:105;;1355:25496;7586:9;7556:10;;;;:::i;:::-;7586:9;;;;;;;;:::i;:::-;1355:25496;;;7568:16;1355:25496;;;;;;;:::i;:::-;;;;7568:16;7544:63;;:::i;26727:105::-;26800:20;;:::i;:::-;26727:105;;1355:25496;;;;;;;:::i;:::-;735:10:112;1355:25496:38;;;5397:34:84;5393:102;;5505:37;;;:::i;5393:102::-;5454:30;1355:25496:38;5454:30:84;1355:25496:38;;5454:30:84;1355:25496:38;;;;;-1:-1:-1;;1355:25496:38;;;;;;;;1854:50;1355:25496;;;;;;;4306:25:84;1355:25496:38;;;:::i;:::-;4276:18:84;2484:4;4276:18;;3877:6;1355:25496:38;3877:6:84;1355:25496:38;;3877:22:84;1355:25496:38;3877:6:84;1355:25496:38;3877:22:84;1355:25496:38;3786:120:84;;2484:4;4306:25;:::i;1355:25496:38:-;;;;;-1:-1:-1;;1355:25496:38;;;;;;;;2472:10;1355:25496;;;;;;;;-1:-1:-1;;1355:25496:38;;;;;;;;;3877:6:84;1355:25496:38;3877:6:84;1355:25496:38;;3877:22:84;1355:25496:38;3877:6:84;1355:25496:38;3877:22:84;1355:25496:38;3786:120:84;;1355:25496:38;;;;;-1:-1:-1;;1355:25496:38;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;5401:1560;;1355:25496;;;26731:42;26727:105;;5401:1560;:::i;:::-;1355:25496;;;;;;;;;;;;;;;;;;;;;;;26727:105;26800:20;;:::i;:::-;5401:1560;:::i;1355:25496::-;;;;;-1:-1:-1;;1355:25496:38;;;;;;;;;1950:38;1355:25496;;;;;;;;;-1:-1:-1;;1355:25496:38;;;;;;;;1742:66;1355:25496;;;;;;;;-1:-1:-1;;1355:25496:38;;;;;;;;;;;;;;;;2649:47:84;2664:32;1355:25496:38;2649:47:84;;:87;;;;;1355:25496:38;;;;;;;2649:87:84;844:25:124;829:40;;;2649:87:84;;;1355:25496:38;;;-1:-1:-1;;1355:25496:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;-1:-1:-1;;1355:25496:38;;;;;;;;;;;;;;;;;;;:::o;:::-;;-1:-1:-1;;1355:25496:38;;;;;;;;;;;;;;;;;-1:-1:-1;1355:25496:38;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1355:25496:38;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;-1:-1:-1;;1355:25496:38;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;2095:51;1355:25496;;;;;;;:::i;:::-;;;;;2095:51;1355:25496;;;2095:51;;;;1355:25496;;;;;;;:::o;:::-;2095:51;-1:-1:-1;1355:25496:38;;;;;-1:-1:-1;1355:25496:38;;-1:-1:-1;1355:25496:38;;;;;;;;;;;;;;:::o;:::-;2095:51;1355:25496;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;:::o;:::-;;-1:-1:-1;1355:25496:38;;;;;-1:-1:-1;1355:25496:38;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;:::o;:::-;;;-1:-1:-1;;1355:25496:38;;;;;;;;;;;;;;;;:::o;:::-;;-1:-1:-1;1355:25496:38;;;:::o;:::-;;;;;;;;-1:-1:-1;;1355:25496:38;;;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;-1:-1:-1;1355:25496:38;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;:::i;:::-;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;:::o;:::-;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;-1:-1:-1;1355:25496:38;;;;;;:::o;:::-;;;;;;;;;;:::o;:::-;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;:::i;:::-;;;;:::o;:::-;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;1355:25496:38;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;;;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;;;;;;;;:::i;:::-;;;;;;;:::i;5401:1560::-;5644:58;5401:1560;5644:58;;;;:::i;:::-;5712:186;5733:24;;1355:25496;5766:26;5733:59;;;5712:186;:::i;:::-;5985:37;:24;;:37;;1355:25496;;5974:89;;1355:25496;5985:37;1355:25496;;;;;;5985:37;5974:89;;1355:25496;;;;;;;;5974:89;5985:37;5974:89;;;1355:25496;;;;:::i;:::-;6108:6;;;;:::i;:::-;6171:26;;;:::i;:::-;1355:25496;;;;;;;6211:52;;;6344:16;;1355:25496;5985:37;1355:25496;6344:16;6899:24;6344:16;;;;;:31;;;;1355:25496;;;;;;;;6344:73;;6340:155;;6207:666;6586:24;;;;1355:25496;;6575:36;;;;;;;;1355:25496;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6575:36;;-1:-1:-1;;6575:36:38;;;;;;:::i;:::-;1355:25496;6565:47;;6530:16;;:31;1355:25496;;-1:-1:-1;1355:25496:38;6508:21;5985:37;1355:25496;;-1:-1:-1;1355:25496:38;;6207:666;6899:24;;:::i;6340:155::-;1355:25496;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6340:155;;;;6207:666;-1:-1:-1;1355:25496:38;6633:58;;1355:25496;;6899:24;1355:25496;;;6707:20;1355:25496;;;6707:20;1355:25496;6207:666;;6629:244;6771:34;6755:50;;6751:122;;6899:24;6629:244;6207:666;;6751:122;6821:41;;6771:34;6821:41;:::o;5036:228::-;1355:25496;;-1:-1:-1;1355:25496:38;5145:21;1355:25496;;;-1:-1:-1;1355:25496:38;;5200:9;;1355:25496;;5036:228;:::o;1355:25496::-;;-1:-1:-1;1355:25496:38;;-1:-1:-1;1355:25496:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;3175:103:84;735:10:112;2930:6:84;1355:25496:38;;;;;;;;;;;;3495:23:84;3491:108;;3175:103::o;3491:108::-;3541:47;2930:6;3541:47;735:10:112;3541:47:84;1355:25496:38;2576:33;1355:25496;;;2930:6:84;3541:47;3175:103;1355:25496:38;2930:6:84;1355:25496:38;2930:6:84;1355:25496:38;;;2930:6:84;1355:25496:38;;735:10:112;1355:25496:38;-1:-1:-1;1355:25496:38;;;;;-1:-1:-1;1355:25496:38;;;3495:23:84;3491:108;;3175:103;:::o;3491:108::-;3541:47;2930:6;3541:47;735:10:112;3541:47:84;1355:25496:38;;;;2930:6:84;3541:47;1355:25496:38;;;;;;:::o;:::-;;;;;;;;;;;18217:570;18605:175;18217:570;18383:11;18363:18;;1355:25496;18383:11;;;1355:25496;;18383:11;;:::i;:::-;18537:58;1355:25496;18462:28;18559:20;18462:28;;;;1355:25496;;18451:40;;;;;;;;1355:25496;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18451:40;1355:25496;18441:51;;18559:20;;;:35;1355:25496;;18537:58;:::i;:::-;18626:52;;;18605:175;:::i;:::-;18217:570::o;22962:1028::-;1355:25496;23184:31;:16;;;;:31;1355:25496;;;;23162:21;23184:31;1355:25496;;;;;23230:32;;23226:758;23230:32;;;23350:43;;1355:25496;23350:43;:::o;23226:758::-;1355:25496;23470:24;;;;;1355:25496;;23459:36;;;23184:31;23459:36;;;;1355:25496;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23459:36;1355:25496;23449:47;;23427:69;;;;:165;;;23226:758;-1:-1:-1;;23410:574:38;;;23768:42;23761:49;:::o;23410:574::-;23939:34;23932:41;:::o;23427:165::-;1355:25496;23516:28;;;23184:31;23516:28;;;;1355:25496;;23558:24;;1355:25496;;-1:-1:-1;23516:76:38;23427:165;;;;24151:152;1355:25496;24231:8;1355:25496;;;;24284:11;24264:18;;;;24284:11;;;24231:65;;;;;;-1:-1:-1;1355:25496:38;;;;24284:11;1355:25496;24231:65;;;;;;;1355:25496;24231:65;;;;;1355:25496;;;;;;;;;;;:::i;:::-;;-1:-1:-1;;1355:25496:38;;;;;;;;;:::i;:::-;24231:65;;;;;;;;;;24151:152;:::o;24231:65::-;-1:-1:-1;24231:65:38;;;:::i;:::-;24284:11;1355:25496;;-1:-1:-1;1355:25496:38;;;;;6155:316:84;1355:25496:38;;;;;;;;;;;;-1:-1:-1;1355:25496:38;;;;;-1:-1:-1;1355:25496:38;;;6252:23:84;6248:217;1355:25496:38;;;;;;;;;;;;;;;-1:-1:-1;1355:25496:38;;;;-1:-1:-1;1355:25496:38;6323:4:84;1355:25496:38;;;;;;;;735:10:112;1355:25496:38;;6346:40:84;;1355:25496:38;6346:40:84;;6323:4;6400:11;:::o;6248:217::-;6442:12;;1355:25496:38;6442:12:84;:::o;6708:317::-;1355:25496:38;;;;;;;;;;;;-1:-1:-1;1355:25496:38;;;;;-1:-1:-1;1355:25496:38;;;6802:217:84;1355:25496:38;;;;;;;;;;;;;;;-1:-1:-1;1355:25496:38;;;;-1:-1:-1;1355:25496:38;;;;;;;;735:10:112;1355:25496:38;;6900:40:84;;1355:25496:38;6900:40:84;;1355:25496:38;6954:11:84;:::o;1355:25496:38:-;;;;;;;;;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;8191:1064;;;;;;;8421:17;;8417:181;;8665:52;;1355:25496;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;:::i;:::-;;;;:::i;:::-;8731:83;;8876:21;;1355:25496;;;10929:60;;1355:25496;10929:60;;1355:25496;;;;;;;;;10929:60;;1355:25496;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;:::i;:::-;;;;;;;;10999:160;11020:14;;1355:25496;11043:23;11020:46;;;10999:160;:::i;:::-;1355:25496;11242:14;;:27;;1355:25496;;;11231:75;;1355:25496;;;;;;;;;11231:75;;1355:25496;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;11231:75;1355:25496;11231:75;;;1355:25496;;;;:::i;:::-;;11316:177;1355:25496;;;;;;;;11337:25;;;:70;;;11316:177;:::i;:::-;1355:25496;;11663:3;11640:14;;1355:25496;;11636:25;;;;;11703:17;;11691:43;11703:17;;:::i;:::-;;:22;1355:25496;;;;;:::i;:::-;11691:43;;:::i;:::-;11690:44;11686:99;;11824:14;;;12132:50;12335:14;11824;1355:25496;11824:14;;;11865:185;12280:27;11824:14;1355:25496;26385:3;11824:14;;;;:17;:14;;:17;:::i;:::-;;:23;;1355:25496;;;;;11894:30;;;:72;;;;11663:3;11865:185;;;:::i;:::-;1355:25496;12132:50;:::i;:::-;1355:25496;12252:26;;;;;;:::i;:::-;12280:27;;;;:::i;12335:14::-;12464;1355:25496;;;12464:25;12460:152;;11616:503;12651:27;;;1355:25496;;;8830:81;:::o;12460:152::-;12519:26;12505:96;12519:26;;:::i;:::-;12563:27;;;;1355:25496;;12505:96;;:::i;:::-;12460:152;;;;11894:72;1355:25496;;;;;;11928:16;1355:25496;;;;11948:18;11928:38;11894:72;;;;11686:99;11758:8;1355:25496;;11621:13;;;11636:25;;12280:27;11636:25;;1355:25496;11636:25;;;12132:50;12335:14;11636:25;1355:25496;11636:25;;;26385:3;11636:25;;;12132:50;:::i;11337:70::-;11366:41;1355:25496;11366:41;;;11316:177;:::i;8727:421::-;1355:25496;;;;;;;;;;;;:::i;:::-;;;;:::i;:::-;8932:98;8928:220;;1355:25496;8727:421;1355:25496;;;;:::i;:::-;;;;:::i;:::-;9188:60;1355:25496;9188:60;1355:25496;9188:60;1355:25496;;;9188:60;8928:220;9102:21;;;;;;;1355:25496;;;;;;;;:::i;:::-;;;;;;:::i;:::-;;;;;;:::i;:::-;;;;;;;;;:::i;:::-;-1:-1:-1;1355:25496:38;;-1:-1:-1;1355:25496:38;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;1355:25496:38;;-1:-1:-1;1355:25496:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;1355:25496:38;;-1:-1:-1;1355:25496:38;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;1355:25496:38;;-1:-1:-1;1355:25496:38;;;;;;;;;;;;;;13696:75;;1355:25496;;;;;;;;;13696:75;;1355:25496;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;13696:75;;13785:208;13696:75;;1355:25496;;;;:::i;:::-;;;;;13833:41;13810:64;;;13785:208;:::i;:::-;1355:25496;14028:14;;:27;;1355:25496;;;14017:95;;1355:25496;14017:95;;1355:25496;;;;;;;;;14017:95;;1355:25496;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;:::i;:::-;;14126:189;1355:25496;;;;;;;;14151:25;;;:70;;;14126:189;:::i;:::-;1355:25496;14355:26;;;;;;:::i;:::-;1355:25496;;14385:25;;:35;;:50;;1355:25496;14385:50;;1355:25496;;;;;;14355:80;:184;;;8928:220;14598:26;;;:::i;:::-;14646;1355:25496;14646:26;;;:::i;:::-;1355:25496;;;;;;;14897:25;;;;14954:14;14897:25;;;;;:::i;14954:14::-;15080:45;15099:25;;15080:45;:::i;:::-;1355:25496;;;;;;15143:52;;;15284:26;;;;:::i;:::-;1355:25496;;;;;;;;;15284:68;15280:153;;15139:599;15543:25;1355:25496;15543:25;;:43;;1355:25496;;15532:55;;;1355:25496;15532:55;;;;1355:25496;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15532:55;1355:25496;15522:66;;1355:25496;15472:26;;;:::i;:::-;1355:25496;;;15450:21;1355:25496;;;;;;15139:599;1355:25496;;15927:3;15904:14;;1355:25496;;15900:25;;;;;15967:17;;15955:43;15967:17;;:::i;15955:43::-;15954:44;15950:99;;16088:14;26385:3;16088:14;;1355:25496;16088:14;;16129:185;16088:14;;1355:25496;16088:17;16396:50;16088:14;1355:25496;16088:14;;:17;:::i;:::-;;:23;;1355:25496;;;;;16158:30;;;:72;;;;16129:185;;;:::i;16396:50::-;16632:43;16506:25;;:43;;;;:48;1355:25496;;;16506:48;;;1355:25496;16568:35;;;:50;1355:25496;;16632:43;;:::i;:::-;16799:14;1355:25496;;;16799:25;16795:198;;15880:503;17032:25;;;:43;;1355:25496;;;9046:91;:::o;16795:198::-;16871:26;16840:142;16871:26;;:::i;:::-;16915:25;;;;;:43;;1355:25496;;16840:142;;:::i;:::-;16795:198;;;;16158:72;1355:25496;;;;;;16192:16;1355:25496;;;;16212:18;16192:38;16158:72;;;;15950:99;16022:8;1355:25496;;15885:13;;;15900:25;;1355:25496;15900:25;;;16396:50;15900:25;;;1355:25496;15900:25;;26385:3;15900:25;;16396:50;:::i;15280:153::-;1355:25496;;;;:::i;:::-;;;;;;;;;;;;;;;;:::i;:::-;15280:153;;;15139:599;1355:25496;;;15613:58;15139:599;15609:129;15698:25;1355:25496;15698:25;;1355:25496;15698:25;1355:25496;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14355:184;14459:26;;;;:::i;:::-;1355:25496;;;;;;;14459:80;14355:184;;8417:181;8522:26;;;;;;1355:25496;8522:26;;;:::i;:::-;1355:25496;;;;;;;:::i;:::-;;;;:::i;:::-;;;8522:26;8550:35;;1355:25496;;;;;25522:31;;;;8522:26;25522:31;;;;;:::i;:::-;1355:25496;25512:42;;4288:69:121;25671:11:38;;25684:12;;25632:14;;1355:25496;;8489:98;;26385:3;8489:98;1355:25496;8482:105;:::o;1355:25496::-;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;-1:-1:-1;;1355:25496:38;;;;;;;;;:::i;:::-;;;;4691:549:110;;-1:-1:-1;4691:549:110;;3490:129:115;;;;;;;;;;4874:72:110;;4691:549;4870:364;;;4774:252:115;;;;;;;;-1:-1:-1;3490:129:115;4774:252;;;3490:129;4774:252;;;;;;4962:32:110;:::o;4870:364::-;5011:223;;;1355:25496:38;5045:24:110;;-1:-1:-1;5045:24:110;1355:25496:38;5045:24:110;1355:25496:38;;-1:-1:-1;5045:24:110;5011:223;4536:73:115;5090:33:110;4536:73:115;;1355:25496:38;;;-1:-1:-1;1355:25496:38;;;;;5086:148:110;5204:19;-1:-1:-1;5204:19:110;;-1:-1:-1;5204:19:110;4874:72;-1:-1:-1;4536:73:115;4886:33:110;;;4874:72;4886:59;4923:18;;;:22;;4874:72;;20400:2140:38;;1355:25496;26385:3;20400:2140;1355:25496;;20608:15;20583:40;;1355:25496;;20608:15;;1355:25496;20608:15;1355:25496;;;;2472:10;-1:-1:-1;1355:25496:38;;21386:25;;;1355:25496;;21429:11;1355:25496;;:::i;:::-;21380:76;:180;;;20400:2140;21611:25;;1355:25496;;;;21678:28;;;;;1355:25496;;;;;21720:22;1355:25496;;;;;21678:74;;;;:172;;;;20400:2140;21678:28;22062:40;1355:25496;;;;;;;22157:32;;;;1355:25496;22157:32;;;1355:25496;;;22193:26;1355:25496;;;;;22157:62;;;1355:25496;;22358:33;;1355:25496;22358:33;;;;1355:25496;;;21678:28;1355:25496;;22358:64;;;1355:25496;;20400:2140;;:::o;1355:25496::-;;-1:-1:-1;1355:25496:38;22193:26;1355:25496;;;;-1:-1:-1;1355:25496:38;;;-1:-1:-1;1355:25496:38;22193:26;1355:25496;;;;-1:-1:-1;1355:25496:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21678:172;:28;21772:40;;1355:25496;;;;;;;;;;;21772:78;;-1:-1:-1;21678:172:38;;1355:25496;;;;;;;;;;;;;;;;;;;;;:::i;21380:180::-;21492:25;;;1355:25496;;;;;21476:43;1355:25496;;;;;;;:::i;:::-;;;;;;21523:37;21476:84;21380:180;;1355:25496;;-1:-1:-1;1355:25496:38;20608:15;1355:25496;;;;;-1:-1:-1;1355:25496:38;;;-1:-1:-1;1355:25496:38;;;;;-1:-1:-1;1355:25496:38;;;-1:-1:-1;1355:25496:38;20608:15;1355:25496;;;;;-1:-1:-1;1355:25496:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;1355:25496:38;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;-1:-1:-1;;1355:25496:38;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::o;:::-;;;;;;8961:69;1355:25496;;14284:16;1355:25496;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1355:25496:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;1355:25496:38;;;;;;;;;;;;;;;-1:-1:-1;1355:25496:38;;;;;;;;;;;;;;;;;;;;;;;;358:427:47;;1355:25496:38;;;;452:20:47;448:63;;1355:25496:38;554:3:47;1355:25496:38;;540:12:47;;;;;577:4;;;;:::i;:::-;;1355:25496:38;592:4:47;;;;:::i;:::-;;1355:25496:38;577:26:47;573:77;;677:4;;;;:::i;:::-;;1355:25496:38;;;;;667:15:47;696:4;;;;:::i;:::-;;1355:25496:38;;;;;686:15:47;667:34;663:85;;1355:25496:38;;525:13:47;;663:85;721:12;;;1355:25496:38;721:12:47;:::o;540:::-;;;;1355:25496:38;358:427:47;:::o;17339:759:38:-;;17732:177;17609:33;17339:759;17688:34;1355:25496;;17609:33;;;;;;;;;1355:25496;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17609:33;1355:25496;17599:44;;17688:34;;:::i;17732:177::-;17965:26;1355:25496;17941:50;;;1355:25496;;17339:759;;:::o;1355:25496::-;;-1:-1:-1;1355:25496:38;;;;;;-1:-1:-1;1355:25496:38;24776:318;;;;;24914:1;24937:3;1355:25496;;24917:18;;;;;25011:10;;;1355:25496;25011:10;;;:::i;:::-;;1355:25496;;24987:35;;;;;;;;;;:::i;:::-;1355:25496;24977:46;;4520:68:121;1355:25496:38;24902:13;;24917:18;;;;;;24776:318::o","linkReferences":{},"immutableReferences":{"6424":[{"start":1367,"length":32},{"start":5189,"length":32}],"6427":[{"start":505,"length":32},{"start":7681,"length":32}],"6430":[{"start":3251,"length":32},{"start":8581,"length":32}],"6433":[{"start":672,"length":32},{"start":2753,"length":32}],"6437":[{"start":3192,"length":32},{"start":6682,"length":32}]}},"methodIdentifiers":{"ALLOWED_SP1_CLOCK_DRIFT()":"2c3ee474","DEFAULT_ADMIN_ROLE()":"a217fddf","MEMBERSHIP_PROGRAM_VKEY()":"e45a6d0d","MISBEHAVIOUR_PROGRAM_VKEY()":"314d4dff","PROOF_SUBMITTER_ROLE()":"5972185a","UPDATE_CLIENT_AND_MEMBERSHIP_PROGRAM_VKEY()":"0225293e","UPDATE_CLIENT_PROGRAM_VKEY()":"ca7242f9","VERIFIER()":"08c84e70","clientState()":"bd3ce6b0","getClientState()":"ef913a4b","getConsensusStateHash(uint64)":"23842fb8","getRoleAdmin(bytes32)":"248a9ca3","grantRole(bytes32,address)":"2f2ff15d","hasRole(bytes32,address)":"91d14854","misbehaviour(bytes)":"ddba6537","multicall(bytes[])":"ac9650d8","renounceRole(bytes32,address)":"36568abe","revokeRole(bytes32,address)":"d547741f","supportsInterface(bytes4)":"01ffc9a7","updateClient(bytes)":"0bece356","verifyMembership((bytes,(uint64,uint64),bytes[],bytes))":"682ed5f0","verifyNonMembership((bytes,(uint64,uint64),bytes[]))":"4d6d9ffb"},"rawMetadata":"{\"compiler\":{\"version\":\"0.8.28+commit.7893614a\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"updateClientProgramVkey\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"membershipProgramVkey\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"updateClientAndMembershipProgramVkey\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"misbehaviourProgramVkey\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"sp1Verifier\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"_clientState\",\"type\":\"bytes\"},{\"internalType\":\"bytes32\",\"name\":\"_consensusState\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"roleManager\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"AccessControlBadConfirmation\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"internalType\":\"bytes32\",\"name\":\"neededRole\",\"type\":\"bytes32\"}],\"name\":\"AccessControlUnauthorizedAccount\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"target\",\"type\":\"address\"}],\"name\":\"AddressEmptyCode\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"CannotHandleMisbehavior\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"expected\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"actual\",\"type\":\"string\"}],\"name\":\"ChainIdMismatch\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"expected\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"actual\",\"type\":\"bytes\"}],\"name\":\"ClientStateMismatch\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"expected\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"actual\",\"type\":\"bytes32\"}],\"name\":\"ConsensusStateHashMismatch\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ConsensusStateNotFound\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"expected\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"actual\",\"type\":\"bytes32\"}],\"name\":\"ConsensusStateRootMismatch\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"EmptyValue\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"FailedCall\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"FeatureNotSupported\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"FrozenClientState\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidMembershipProof\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes[]\",\"name\":\"path\",\"type\":\"bytes[]\"},{\"internalType\":\"bytes\",\"name\":\"value\",\"type\":\"bytes\"}],\"name\":\"KeyValuePairNotInCache\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"length\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"min\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"max\",\"type\":\"uint256\"}],\"name\":\"LengthIsOutOfRange\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes[]\",\"name\":\"path\",\"type\":\"bytes[]\"}],\"name\":\"MembershipProofKeyNotFound\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"expected\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"actual\",\"type\":\"bytes\"}],\"name\":\"MembershipProofValueMismatch\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"expectedRevisionNumber\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"expectedRevisionHeight\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"actualRevisionNumber\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"actualRevisionHeight\",\"type\":\"uint64\"}],\"name\":\"ProofHeightMismatch\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"now\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"proofTimestamp\",\"type\":\"uint256\"}],\"name\":\"ProofIsInTheFuture\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"now\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"proofTimestamp\",\"type\":\"uint256\"}],\"name\":\"ProofIsTooOld\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"expectedNumerator\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"expectedDenominator\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"actualNumerator\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"actualDenominator\",\"type\":\"uint256\"}],\"name\":\"TrustThresholdMismatch\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"expected\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"actual\",\"type\":\"uint256\"}],\"name\":\"TrustingPeriodMismatch\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"trustingPeriod\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"unbondingPeriod\",\"type\":\"uint256\"}],\"name\":\"TrustingPeriodTooLong\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"expected\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"actual\",\"type\":\"uint256\"}],\"name\":\"UnbondingPeriodMismatch\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint8\",\"name\":\"proofType\",\"type\":\"uint8\"}],\"name\":\"UnknownMembershipProofType\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint8\",\"name\":\"algorithm\",\"type\":\"uint8\"}],\"name\":\"UnknownZkAlgorithm\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"expected\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"actual\",\"type\":\"bytes32\"}],\"name\":\"VerificationKeyMismatch\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"previousAdminRole\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"newAdminRole\",\"type\":\"bytes32\"}],\"name\":\"RoleAdminChanged\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"RoleGranted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"RoleRevoked\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"ALLOWED_SP1_CLOCK_DRIFT\",\"outputs\":[{\"internalType\":\"uint16\",\"name\":\"\",\"type\":\"uint16\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"DEFAULT_ADMIN_ROLE\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"MEMBERSHIP_PROGRAM_VKEY\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"MISBEHAVIOUR_PROGRAM_VKEY\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"PROOF_SUBMITTER_ROLE\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"UPDATE_CLIENT_AND_MEMBERSHIP_PROGRAM_VKEY\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"UPDATE_CLIENT_PROGRAM_VKEY\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"VERIFIER\",\"outputs\":[{\"internalType\":\"contract ISP1Verifier\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"clientState\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"chainId\",\"type\":\"string\"},{\"components\":[{\"internalType\":\"uint8\",\"name\":\"numerator\",\"type\":\"uint8\"},{\"internalType\":\"uint8\",\"name\":\"denominator\",\"type\":\"uint8\"}],\"internalType\":\"struct IICS07TendermintMsgs.TrustThreshold\",\"name\":\"trustLevel\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint64\",\"name\":\"revisionNumber\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"revisionHeight\",\"type\":\"uint64\"}],\"internalType\":\"struct IICS02ClientMsgs.Height\",\"name\":\"latestHeight\",\"type\":\"tuple\"},{\"internalType\":\"uint32\",\"name\":\"trustingPeriod\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"unbondingPeriod\",\"type\":\"uint32\"},{\"internalType\":\"bool\",\"name\":\"isFrozen\",\"type\":\"bool\"},{\"internalType\":\"enum IICS07TendermintMsgs.SupportedZkAlgorithm\",\"name\":\"zkAlgorithm\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getClientState\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"revisionHeight\",\"type\":\"uint64\"}],\"name\":\"getConsensusStateHash\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"}],\"name\":\"getRoleAdmin\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"grantRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"hasRole\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"misbehaviourMsg\",\"type\":\"bytes\"}],\"name\":\"misbehaviour\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes[]\",\"name\":\"data\",\"type\":\"bytes[]\"}],\"name\":\"multicall\",\"outputs\":[{\"internalType\":\"bytes[]\",\"name\":\"results\",\"type\":\"bytes[]\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"callerConfirmation\",\"type\":\"address\"}],\"name\":\"renounceRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"revokeRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes4\",\"name\":\"interfaceId\",\"type\":\"bytes4\"}],\"name\":\"supportsInterface\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"updateMsg\",\"type\":\"bytes\"}],\"name\":\"updateClient\",\"outputs\":[{\"internalType\":\"enum ILightClientMsgs.UpdateResult\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes\",\"name\":\"proof\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"uint64\",\"name\":\"revisionNumber\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"revisionHeight\",\"type\":\"uint64\"}],\"internalType\":\"struct IICS02ClientMsgs.Height\",\"name\":\"proofHeight\",\"type\":\"tuple\"},{\"internalType\":\"bytes[]\",\"name\":\"path\",\"type\":\"bytes[]\"},{\"internalType\":\"bytes\",\"name\":\"value\",\"type\":\"bytes\"}],\"internalType\":\"struct ILightClientMsgs.MsgVerifyMembership\",\"name\":\"msg_\",\"type\":\"tuple\"}],\"name\":\"verifyMembership\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes\",\"name\":\"proof\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"uint64\",\"name\":\"revisionNumber\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"revisionHeight\",\"type\":\"uint64\"}],\"internalType\":\"struct IICS02ClientMsgs.Height\",\"name\":\"proofHeight\",\"type\":\"tuple\"},{\"internalType\":\"bytes[]\",\"name\":\"path\",\"type\":\"bytes[]\"}],\"internalType\":\"struct ILightClientMsgs.MsgVerifyNonMembership\",\"name\":\"msg_\",\"type\":\"tuple\"}],\"name\":\"verifyNonMembership\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"author\":\"srdtrk\",\"errors\":{\"AccessControlBadConfirmation()\":[{\"details\":\"The caller of a function is not the expected one. NOTE: Don't confuse with {AccessControlUnauthorizedAccount}.\"}],\"AccessControlUnauthorizedAccount(address,bytes32)\":[{\"details\":\"The `account` is missing a role.\"}],\"AddressEmptyCode(address)\":[{\"details\":\"There's no code at `target` (it is not a contract).\"}],\"CannotHandleMisbehavior()\":[{\"details\":\"Misbehavior cannot be handled in membership handler, so it is returned as an error.\"}],\"ChainIdMismatch(string,string)\":[{\"params\":{\"actual\":\"The actual chain ID.\",\"expected\":\"The expected chain ID.\"}}],\"ClientStateMismatch(bytes,bytes)\":[{\"params\":{\"actual\":\"The actual client state.\",\"expected\":\"The expected client state.\"}}],\"ConsensusStateHashMismatch(bytes32,bytes32)\":[{\"params\":{\"actual\":\"The actual consensus state hash.\",\"expected\":\"The expected consensus state hash.\"}}],\"ConsensusStateRootMismatch(bytes32,bytes32)\":[{\"params\":{\"actual\":\"The actual consensus state root.\",\"expected\":\"The expected consensus state root.\"}}],\"FailedCall()\":[{\"details\":\"A call to an address target failed. The target may have reverted.\"}],\"KeyValuePairNotInCache(bytes[],bytes)\":[{\"params\":{\"path\":\"The path of the key-value pair.\",\"value\":\"The value of the key-value pair.\"}}],\"LengthIsOutOfRange(uint256,uint256,uint256)\":[{\"params\":{\"length\":\"The length of the value.\",\"max\":\"The maximum length of the value.\",\"min\":\"The minimum length of the value.\"}}],\"MembershipProofKeyNotFound(bytes[])\":[{\"params\":{\"path\":\"The path of the key-value pair.\"}}],\"MembershipProofValueMismatch(bytes,bytes)\":[{\"params\":{\"actual\":\"The actual value.\",\"expected\":\"The expected value.\"}}],\"ProofHeightMismatch(uint64,uint64,uint64,uint64)\":[{\"params\":{\"actualRevisionHeight\":\"The actual revision height.\",\"actualRevisionNumber\":\"The actual revision number.\",\"expectedRevisionHeight\":\"The expected revision height.\",\"expectedRevisionNumber\":\"The expected revision number.\"}}],\"ProofIsInTheFuture(uint256,uint256)\":[{\"params\":{\"now\":\"The current timestamp in seconds.\",\"proofTimestamp\":\"The timestamp in the proof in seconds.\"}}],\"ProofIsTooOld(uint256,uint256)\":[{\"params\":{\"now\":\"The current timestamp in seconds.\",\"proofTimestamp\":\"The timestamp in the proof in seconds.\"}}],\"TrustThresholdMismatch(uint256,uint256,uint256,uint256)\":[{\"params\":{\"actualDenominator\":\"The actual denominator of the trust threshold.\",\"actualNumerator\":\"The actual numerator of the trust threshold.\",\"expectedDenominator\":\"The expected denominator of the trust threshold.\",\"expectedNumerator\":\"The expected numerator of the trust threshold.\"}}],\"TrustingPeriodMismatch(uint256,uint256)\":[{\"params\":{\"actual\":\"The actual trusting period in seconds.\",\"expected\":\"The expected trusting period in seconds.\"}}],\"TrustingPeriodTooLong(uint256,uint256)\":[{\"params\":{\"trustingPeriod\":\"The trusting period in seconds.\",\"unbondingPeriod\":\"The unbonding period in seconds.\"}}],\"UnbondingPeriodMismatch(uint256,uint256)\":[{\"params\":{\"actual\":\"The actual unbonding period in seconds.\",\"expected\":\"The expected unbonding period in seconds.\"}}],\"UnknownMembershipProofType(uint8)\":[{\"params\":{\"proofType\":\"The unknown membership proof type.\"}}],\"UnknownZkAlgorithm(uint8)\":[{\"params\":{\"algorithm\":\"The unknown zk algorithm.\"}}],\"VerificationKeyMismatch(bytes32,bytes32)\":[{\"params\":{\"actual\":\"The actual verification key.\",\"expected\":\"The expected verification key.\"}}]},\"events\":{\"RoleAdminChanged(bytes32,bytes32,bytes32)\":{\"details\":\"Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite {RoleAdminChanged} not being emitted to signal this.\"},\"RoleGranted(bytes32,address,address)\":{\"details\":\"Emitted when `account` is granted `role`. `sender` is the account that originated the contract call. This account bears the admin role (for the granted role). Expected in cases where the role was granted using the internal {AccessControl-_grantRole}.\"},\"RoleRevoked(bytes32,address,address)\":{\"details\":\"Emitted when `account` is revoked `role`. `sender` is the account that originated the contract call: - if using `revokeRole`, it is the admin role bearer - if using `renounceRole`, it is the role bearer (i.e. `account`)\"}},\"kind\":\"dev\",\"methods\":{\"constructor\":{\"params\":{\"_clientState\":\"The encoded initial client state.\",\"_consensusState\":\"The encoded initial consensus state.\",\"membershipProgramVkey\":\"The verification key for the verify (non)membership program.\",\"misbehaviourProgramVkey\":\"The verification key for the misbehaviour program.\",\"roleManager\":\"Manages the proof submitters and can submit proofs. Should be the ICS26Router if used in IBC.\",\"sp1Verifier\":\"The address of the SP1 verifier contract.\",\"updateClientAndMembershipProgramVkey\":\"The verification key for the update client and membership program.\",\"updateClientProgramVkey\":\"The verification key for the update client program.\"}},\"getClientState()\":{\"returns\":{\"_0\":\"The client state.\"}},\"getConsensusStateHash(uint64)\":{\"params\":{\"revisionHeight\":\"The revision height.\"},\"returns\":{\"_0\":\"The consensus state at the given revision height.\"}},\"getRoleAdmin(bytes32)\":{\"details\":\"Returns the admin role that controls `role`. See {grantRole} and {revokeRole}. To change a role's admin, use {_setRoleAdmin}.\"},\"grantRole(bytes32,address)\":{\"details\":\"Grants `role` to `account`. If `account` had not been already granted `role`, emits a {RoleGranted} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleGranted} event.\"},\"hasRole(bytes32,address)\":{\"details\":\"Returns `true` if `account` has been granted `role`.\"},\"misbehaviour(bytes)\":{\"details\":\"The misbehavior is verfied in the sp1 program. Here we only check the public values which contain the trusted headers.\",\"params\":{\"misbehaviourMsg\":\"The misbehaviour message\"}},\"multicall(bytes[])\":{\"custom:oz-upgrades-unsafe-allow-reachable\":\"delegatecall\",\"details\":\"Receives and executes a batch of function calls on this contract.\"},\"renounceRole(bytes32,address)\":{\"details\":\"Revokes `role` from the calling account. Roles are often managed via {grantRole} and {revokeRole}: this function's purpose is to provide a mechanism for accounts to lose their privileges if they are compromised (such as when a trusted device is misplaced). If the calling account had been revoked `role`, emits a {RoleRevoked} event. Requirements: - the caller must be `callerConfirmation`. May emit a {RoleRevoked} event.\"},\"revokeRole(bytes32,address)\":{\"details\":\"Revokes `role` from `account`. If `account` had been granted `role`, emits a {RoleRevoked} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleRevoked} event.\"},\"supportsInterface(bytes4)\":{\"details\":\"Returns true if this contract implements the interface defined by `interfaceId`. See the corresponding https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[ERC section] to learn more about how these ids are created. This function call must use less than 30 000 gas.\"},\"updateClient(bytes)\":{\"details\":\"This function verifies the public values and forwards the proof to the SP1 verifier.\",\"params\":{\"updateMsg\":\"The encoded update message e.g., an SP1 proof.\"},\"returns\":{\"_0\":\"The result of the update operation\"}},\"verifyMembership((bytes,(uint64,uint64),bytes[],bytes))\":{\"details\":\"Notice that this message is not view, as it may update the client state for caching purposes.\",\"params\":{\"msg_\":\"The membership message\"},\"returns\":{\"_0\":\"The unix timestamp of the verification height in the counterparty chain in seconds.\"}},\"verifyNonMembership((bytes,(uint64,uint64),bytes[]))\":{\"details\":\"Notice that this message is not view, as it may update the client state for caching purposes.\",\"params\":{\"msg_\":\"The membership message\"},\"returns\":{\"_0\":\"The unix timestamp of the verification height in the counterparty chain in seconds.\"}}},\"stateVariables\":{\"ALLOWED_SP1_CLOCK_DRIFT\":{\"return\":\"The allowed prover clock drift in seconds.\",\"returns\":{\"_0\":\"The allowed prover clock drift in seconds.\"}},\"MEMBERSHIP_PROGRAM_VKEY\":{\"return\":\"The verification key for the membership program.\",\"returns\":{\"_0\":\"The verification key for the membership program.\"}},\"MISBEHAVIOUR_PROGRAM_VKEY\":{\"return\":\"The verification key for the misbehaviour program.\",\"returns\":{\"_0\":\"The verification key for the misbehaviour program.\"}},\"PROOF_SUBMITTER_ROLE\":{\"details\":\"The proof submitter role is used to whitelist addresses that can submit proofsIf `address(0)` has this role, then anyone can submit proofsIf this client is hooked up to ICS26Router, the router must be given this role\",\"return\":\"The role identifier\",\"returns\":{\"_0\":\"The role identifier\"}},\"UPDATE_CLIENT_AND_MEMBERSHIP_PROGRAM_VKEY\":{\"return\":\"The verification key for the update client and membership program.\",\"returns\":{\"_0\":\"The verification key for the update client and membership program.\"}},\"UPDATE_CLIENT_PROGRAM_VKEY\":{\"return\":\"The verification key for the update client program.\",\"returns\":{\"_0\":\"The verification key for the update client program.\"}},\"VERIFIER\":{\"return\":\"The SP1 verifier contract.\",\"returns\":{\"_0\":\"The SP1 verifier contract.\"}},\"_consensusStateHashes\":{\"details\":\"Revision number need not be keyed as it is not allowed to change.\"}},\"title\":\"SP1 ICS07 Tendermint Light Client\",\"version\":1},\"userdoc\":{\"errors\":{\"CannotHandleMisbehavior()\":[{\"notice\":\"The error that is returned when the update client and membership program contains misbehavior.\"}],\"ChainIdMismatch(string,string)\":[{\"notice\":\"The error that is returned when the chain ID does not match the expected value.\"}],\"ClientStateMismatch(bytes,bytes)\":[{\"notice\":\"The error that is returned when the client state does not match the expected value.\"}],\"ConsensusStateHashMismatch(bytes32,bytes32)\":[{\"notice\":\"The error that is returned when the consensus state hash does not match the expected value.\"}],\"ConsensusStateNotFound()\":[{\"notice\":\"The error that is returned when the consensus state is not found.\"}],\"ConsensusStateRootMismatch(bytes32,bytes32)\":[{\"notice\":\"The error that is returned when the consensus state root does not match the expected value.\"}],\"EmptyValue()\":[{\"notice\":\"Returned when the membership value is empty.\"}],\"FeatureNotSupported()\":[{\"notice\":\"Returned when the feature is not supported.\"}],\"FrozenClientState()\":[{\"notice\":\"The error that is returned when the client state is frozen.\"}],\"InvalidMembershipProof()\":[{\"notice\":\"Returned when the membership proof is invalid.\"}],\"KeyValuePairNotInCache(bytes[],bytes)\":[{\"notice\":\"Returned when a key-value pair is not in the cache.\"}],\"LengthIsOutOfRange(uint256,uint256,uint256)\":[{\"notice\":\"The error that is returned when the length of a value is out of range.\"}],\"MembershipProofKeyNotFound(bytes[])\":[{\"notice\":\"The error that is returned when the key-value pair's path is not contained in the proof.\"}],\"MembershipProofValueMismatch(bytes,bytes)\":[{\"notice\":\"The error that is returned when the key-value pair's value does not match the expected value.\"}],\"ProofHeightMismatch(uint64,uint64,uint64,uint64)\":[{\"notice\":\"The error that is returned when the proof height does not match the expected value.\"}],\"ProofIsInTheFuture(uint256,uint256)\":[{\"notice\":\"The error that is returned when a proof is in the future.\"}],\"ProofIsTooOld(uint256,uint256)\":[{\"notice\":\"The error that is returned when a proof is too old.\"}],\"TrustThresholdMismatch(uint256,uint256,uint256,uint256)\":[{\"notice\":\"The error that is returned when the trust threshold does not match the expected value.\"}],\"TrustingPeriodMismatch(uint256,uint256)\":[{\"notice\":\"The error that is returned when the trusting period does not match the expected value.\"}],\"TrustingPeriodTooLong(uint256,uint256)\":[{\"notice\":\"The error that is returned when the trusting period is longer than the unbonding period.\"}],\"UnbondingPeriodMismatch(uint256,uint256)\":[{\"notice\":\"The error that is returned when the unbonding period does not match the expected value.\"}],\"UnknownMembershipProofType(uint8)\":[{\"notice\":\"The error that is returned when the membership proof type is unknown.\"}],\"UnknownZkAlgorithm(uint8)\":[{\"notice\":\"The error that is returned when the zk algorithm is unknown.\"}],\"VerificationKeyMismatch(bytes32,bytes32)\":[{\"notice\":\"The error that is returned when the verification key does not match the expected value.\"}]},\"kind\":\"user\",\"methods\":{\"ALLOWED_SP1_CLOCK_DRIFT()\":{\"notice\":\"Constant allowed prover clock drift in seconds.\"},\"MEMBERSHIP_PROGRAM_VKEY()\":{\"notice\":\"Immutable membership program verification key.\"},\"MISBEHAVIOUR_PROGRAM_VKEY()\":{\"notice\":\"Immutable misbehaviour program verification key.\"},\"PROOF_SUBMITTER_ROLE()\":{\"notice\":\"The role identifier for the proof submitter role\"},\"UPDATE_CLIENT_AND_MEMBERSHIP_PROGRAM_VKEY()\":{\"notice\":\"Immutable update client and membership program verification key.\"},\"UPDATE_CLIENT_PROGRAM_VKEY()\":{\"notice\":\"Immutable update client program verification key.\"},\"VERIFIER()\":{\"notice\":\"Immutable SP1 verifier contract address.\"},\"clientState()\":{\"notice\":\"The ICS07Tendermint client state\"},\"constructor\":{\"notice\":\"The constructor sets the program verification key and the initial client and consensus states.\"},\"getClientState()\":{\"notice\":\"Returns the client state.\"},\"getConsensusStateHash(uint64)\":{\"notice\":\"Returns the consensus state keccak256 hash at the given revision height.\"},\"misbehaviour(bytes)\":{\"notice\":\"Misbehaviour handling, moves the light client to the frozen state if misbehaviour is detected\"},\"updateClient(bytes)\":{\"notice\":\"Updating the client and consensus state\"},\"verifyMembership((bytes,(uint64,uint64),bytes[],bytes))\":{\"notice\":\"Querying the membership of a key-value pair\"},\"verifyNonMembership((bytes,(uint64,uint64),bytes[]))\":{\"notice\":\"Querying the non-membership of a key\"}},\"notice\":\"This contract implements an ICS07 IBC tendermint light client using SP1.\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/light-clients/sp1-ics07/SP1ICS07Tendermint.sol\":\"SP1ICS07Tendermint\"},\"evmVersion\":\"cancun\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"none\"},\"optimizer\":{\"enabled\":true,\"runs\":10000},\"remappings\":[\":@openzeppelin-contracts/=node_modules/@openzeppelin/contracts/\",\":@openzeppelin-upgradeable/=node_modules/@openzeppelin/contracts-upgradeable/\",\":@openzeppelin/=node_modules/@openzeppelin/\",\":@sp1-contracts/=node_modules/sp1-contracts/contracts/src/\",\":@uniswap/permit2/=node_modules/@uniswap/permit2/\",\":forge-std/=node_modules/forge-std/src/\",\":sp1-contracts/=node_modules/sp1-contracts/\"],\"viaIR\":true},\"sources\":{\"contracts/interfaces/ILightClient.sol\":{\"keccak256\":\"0x1caae9e4f741a86c0056d5f7713a35f3bd96db7a9fd52fc9f1cf79aad76a442f\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://4a536db3b926560f69547c17e4f451a2631ddea0f42bd224c7fd8382d74429f6\",\"dweb:/ipfs/QmcQ33kxcmmowXgMbQGTBgiKBjF7v8UiP4y73bB9hhDizC\"]},\"contracts/light-clients/sp1-ics07/SP1ICS07Tendermint.sol\":{\"keccak256\":\"0x2e03f0f1e058e7184ea70dc2a423a3d32a609620b6a1e8b764ec9c287b0b6187\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://9e3c0b2f3b3af9cfc8a3ab085e0decffcd40230a27530142293f0b79a4aefe51\",\"dweb:/ipfs/Qmf3qEAMWdiGAMEXSae6mzZ7Sncsbr4QzDC4JzMeiNwgei\"]},\"contracts/light-clients/sp1-ics07/errors/ISP1ICS07TendermintErrors.sol\":{\"keccak256\":\"0xe1a0526f9913308f761af480ef7d87091d6038659b9058f89c50083d49768db1\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://a31d6d4a059182b3dfd3e99595d82a134963c448c9152ef35b42c62ccca87635\",\"dweb:/ipfs/QmfQ2Cfa4kxWem3f88o9UnFQgL8oRU6vKkDFWSGmLsVLqN\"]},\"contracts/light-clients/sp1-ics07/interfaces/ISP1ICS07Tendermint.sol\":{\"keccak256\":\"0x0f00aea96b194d1a9db14f708f0de1fe7723fedc7b72bb8ea182e768ffc0a731\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://3111a76ebabf4b57917e93669892df895a54a93a4963e384d8c13a1c47877b44\",\"dweb:/ipfs/QmPCZ7Z4dJpowkzMhizUAW1j8QdJLD3DDjMbYq8G5VeXc1\"]},\"contracts/light-clients/sp1-ics07/msgs/IICS07TendermintMsgs.sol\":{\"keccak256\":\"0xae0ae6ff2742192ebaaee297c7d7473a1e1b4dc73393d45a944b0b7a8a647703\",\"license\":\"UNLICENSED\",\"urls\":[\"bzz-raw://43b2f6492a1f727416bbcf55876d9c08ac1f66f4724efc75b935c5022555be20\",\"dweb:/ipfs/QmfTaPFNSFuUEsEBgJjnF2Jr2knayS7YwatfjP7dgdcAyH\"]},\"contracts/light-clients/sp1-ics07/msgs/IMembershipMsgs.sol\":{\"keccak256\":\"0x9dff6833fddbc11caf27387c9f8cba5dca9d1e430c9643d4e4a2e8eb09924d96\",\"license\":\"UNLICENSED\",\"urls\":[\"bzz-raw://efa6cfc654510dfcef6f4286e3e66446082bcd5671662ae6e1c6fd0f893a5a4a\",\"dweb:/ipfs/QmRWAg1kHvmRtXgDm4ajVC7tEWQnzTWmHeHMYQJfyFuDGq\"]},\"contracts/light-clients/sp1-ics07/msgs/IMisbehaviourMsgs.sol\":{\"keccak256\":\"0x165b37d890b06eccd47558bf1efd6495e18541627758736a1f5b9c33d0333832\",\"license\":\"UNLICENSED\",\"urls\":[\"bzz-raw://15ab15cd5439147abed697bc9644b0175754845608bf3d57c81c2c864d31ce46\",\"dweb:/ipfs/QmYcV88YsM1sZCmhP8LKUFHq3hJ6bsvd66W5axBnsBBoUM\"]},\"contracts/light-clients/sp1-ics07/msgs/ISP1Msgs.sol\":{\"keccak256\":\"0x8ede29b02182df4be9c075b3b48083277e5dd93bb3e7ce1eecfea9728db49aed\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://48edb4bbcd440454fffceb4f85b83c08c3973a212239d7da07c079634fe413dd\",\"dweb:/ipfs/Qmf7ma1nXWghfZKrJJvLpPuY5aN2xZZjHY7kWP3KVFCoDJ\"]},\"contracts/light-clients/sp1-ics07/msgs/IUcAndMembershipMsgs.sol\":{\"keccak256\":\"0xef3619c79de37cabe95d9d8af9d145fc2ea2dd55137407fb4b0082b0491170d0\",\"license\":\"UNLICENSED\",\"urls\":[\"bzz-raw://93646d813cdacf5e38e609e54baa67c60d749f0f111d00cd18b003c3cb328204\",\"dweb:/ipfs/QmVcuwPujbiZ644a4jRw2V1LZxhhGsm2HKMXweVqndwUnZ\"]},\"contracts/light-clients/sp1-ics07/msgs/IUpdateClientMsgs.sol\":{\"keccak256\":\"0x370cdfca1c65f1898c7da80507e66972a6fe51a5d5c4e7aeabdd7060ce875aed\",\"license\":\"UNLICENSED\",\"urls\":[\"bzz-raw://ff34288a142b6f40d6843818b9ec0a542db016bc0d4a7be582eb2e255655c43e\",\"dweb:/ipfs/QmXwbJHDbqZdw3JTT48Le1ZWGqmKAG7omf2ePvDfBHomzj\"]},\"contracts/light-clients/sp1-ics07/utils/Paths.sol\":{\"keccak256\":\"0x0e4eec6cd6cd0ef684383946419a2bf53c8f800033acfc298db81688e5aa178b\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://824b58c13ff96b6ee38b5d25435fcc1305c45735f52df6347dba3dacdc144ffa\",\"dweb:/ipfs/QmT7qomKM46ChfVVwfBQHwjpoHW9vrG9nXkGXsPeZRLJ7w\"]},\"contracts/msgs/IICS02ClientMsgs.sol\":{\"keccak256\":\"0xb5fdb25319d5c32b3f527982d45ec1e9bec5215515581aee034d853006ea01a0\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://6b8939bf552c62c952a491008bcd9b59ab7dda20a9482bf93438e05793881542\",\"dweb:/ipfs/QmfWmzNCp8bd4pP26Lfw5HHp4dSZnCDqZDjVN7SD8P7eDh\"]},\"contracts/msgs/ILightClientMsgs.sol\":{\"keccak256\":\"0xa0565e7748b8b3284d72e1aa6ef4cc8264fcaa5f4e0761d22d64686953db6378\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://c4476010d7090bfaa74127526f2051c6bc82ff42a09b936e848880a1f15a6065\",\"dweb:/ipfs/QmY87JgRsFQXSZdGXNjNHEJCkdTHzFXH4vZEJ3q7MnHuP8\"]},\"node_modules/@openzeppelin/contracts/access/AccessControl.sol\":{\"keccak256\":\"0x1a6b4f6b7798ab80929d491b89d5427a9b3338c0fd1acd0ba325f69c6f1646af\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://7bb7f346c12a14dc622bc105ce3c47202fbc89f4b153a28a63bb68193297330c\",\"dweb:/ipfs/QmagwF8P3bUBXwdo159ueEnY9dLSvEWwK24kk2op58egwG\"]},\"node_modules/@openzeppelin/contracts/access/IAccessControl.sol\":{\"keccak256\":\"0xbff9f59c84e5337689161ce7641c0ef8e872d6a7536fbc1f5133f128887aba3c\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://b308f882e796f7b79c9502deacb0a62983035c6f6f4e962b319ba6a1f4a77d3d\",\"dweb:/ipfs/QmaWCW7ahEQqFjwhSUhV7Ae7WhfNvzSpE7DQ58hvEooqPL\"]},\"node_modules/@openzeppelin/contracts/utils/Address.sol\":{\"keccak256\":\"0x0fa9e0d3a859900b5a46f70a03c73adf259603d5e05027a37fe0b45529d85346\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://c2add4da0240c9f2ce47649c8bb6b11b40e98cf6f88b8bdc76b2704e89391710\",\"dweb:/ipfs/QmNQTwF2uVzu4CRtNxr8bxyP9XuW6VsZuo2Nr4KR2bZr3d\"]},\"node_modules/@openzeppelin/contracts/utils/Context.sol\":{\"keccak256\":\"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://6a708e8a5bdb1011c2c381c9a5cfd8a9a956d7d0a9dc1bd8bcdaf52f76ef2f12\",\"dweb:/ipfs/Qmax9WHBnVsZP46ZxEMNRQpLQnrdE4dK8LehML1Py8FowF\"]},\"node_modules/@openzeppelin/contracts/utils/Errors.sol\":{\"keccak256\":\"0x6afa713bfd42cf0f7656efa91201007ac465e42049d7de1d50753a373648c123\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://ba1d02f4847670a1b83dec9f7d37f0b0418d6043447b69f3a29a5f9efc547fcf\",\"dweb:/ipfs/QmQ7iH2keLNUKgq2xSWcRmuBE5eZ3F5whYAkAGzCNNoEWB\"]},\"node_modules/@openzeppelin/contracts/utils/LowLevelCall.sol\":{\"keccak256\":\"0x5b4802a4352474792df3107e961d1cc593e47b820c14f69d3505cb28f5a6a583\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://a6f86fd01f829499fe0545ff5dda07d4521988e88bfe0bf801fc15650921ed56\",\"dweb:/ipfs/QmUUKu4ZDffHAmfkf3asuQfmLTyfpuy2Amdncc3SqfzKPG\"]},\"node_modules/@openzeppelin/contracts/utils/Multicall.sol\":{\"keccak256\":\"0x72a5499dfae7676e4298a7299bccd3b27438ba1a4c72df5cd69c1c343c7ea20d\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://de0fb51ccae3a0ff377ed185d187440fc612a71bf8e42fdb0e032ce747fa3eef\",\"dweb:/ipfs/QmPNBaiVsAiUhz8qfXcSy27S7CqBbtSd8rPqmaykKBhw7Q\"]},\"node_modules/@openzeppelin/contracts/utils/TransientSlot.sol\":{\"keccak256\":\"0xac673fa1e374d9e6107504af363333e3e5f6344d2e83faf57d9bfd41d77cc946\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://5982478dbbb218e9dd5a6e83f5c0e8d1654ddf20178484b43ef21dd2246809de\",\"dweb:/ipfs/QmaB1hS68n2kG8vTbt7EPEzmrGhkUbfiFyykGGLsAr9X22\"]},\"node_modules/@openzeppelin/contracts/utils/introspection/ERC165.sol\":{\"keccak256\":\"0x2d9dc2fe26180f74c11c13663647d38e259e45f95eb88f57b61d2160b0109d3e\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://81233d1f98060113d9922180bb0f14f8335856fe9f339134b09335e9f678c377\",\"dweb:/ipfs/QmWh6R35SarhAn4z2wH8SU456jJSYL2FgucfTFgbHJJN4E\"]},\"node_modules/@openzeppelin/contracts/utils/introspection/IERC165.sol\":{\"keccak256\":\"0x8891738ffe910f0cf2da09566928589bf5d63f4524dd734fd9cedbac3274dd5c\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://971f954442df5c2ef5b5ebf1eb245d7105d9fbacc7386ee5c796df1d45b21617\",\"dweb:/ipfs/QmadRjHbkicwqwwh61raUEapaVEtaLMcYbQZWs9gUkgj3u\"]},\"node_modules/sp1-contracts/contracts/src/ISP1Verifier.sol\":{\"keccak256\":\"0x9e3ba64860bea920772dcf16be7946de2a2900d80bd51e9c0771184138f4f4d3\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://0ec7230ca1fdd74edc6ab597d80bb345282aed3f0db4788ed96b4cc373ff46a3\",\"dweb:/ipfs/QmXPuSS5gzxMhFKWr1gsxBVu6WHh53ZZEvWkGgzrkM6Y7Q\"]}},\"version\":1}","metadata":{"compiler":{"version":"0.8.28+commit.7893614a"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"bytes32","name":"updateClientProgramVkey","type":"bytes32"},{"internalType":"bytes32","name":"membershipProgramVkey","type":"bytes32"},{"internalType":"bytes32","name":"updateClientAndMembershipProgramVkey","type":"bytes32"},{"internalType":"bytes32","name":"misbehaviourProgramVkey","type":"bytes32"},{"internalType":"address","name":"sp1Verifier","type":"address"},{"internalType":"bytes","name":"_clientState","type":"bytes"},{"internalType":"bytes32","name":"_consensusState","type":"bytes32"},{"internalType":"address","name":"roleManager","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"type":"error","name":"AccessControlBadConfirmation"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bytes32","name":"neededRole","type":"bytes32"}],"type":"error","name":"AccessControlUnauthorizedAccount"},{"inputs":[{"internalType":"address","name":"target","type":"address"}],"type":"error","name":"AddressEmptyCode"},{"inputs":[],"type":"error","name":"CannotHandleMisbehavior"},{"inputs":[{"internalType":"string","name":"expected","type":"string"},{"internalType":"string","name":"actual","type":"string"}],"type":"error","name":"ChainIdMismatch"},{"inputs":[{"internalType":"bytes","name":"expected","type":"bytes"},{"internalType":"bytes","name":"actual","type":"bytes"}],"type":"error","name":"ClientStateMismatch"},{"inputs":[{"internalType":"bytes32","name":"expected","type":"bytes32"},{"internalType":"bytes32","name":"actual","type":"bytes32"}],"type":"error","name":"ConsensusStateHashMismatch"},{"inputs":[],"type":"error","name":"ConsensusStateNotFound"},{"inputs":[{"internalType":"bytes32","name":"expected","type":"bytes32"},{"internalType":"bytes32","name":"actual","type":"bytes32"}],"type":"error","name":"ConsensusStateRootMismatch"},{"inputs":[],"type":"error","name":"EmptyValue"},{"inputs":[],"type":"error","name":"FailedCall"},{"inputs":[],"type":"error","name":"FeatureNotSupported"},{"inputs":[],"type":"error","name":"FrozenClientState"},{"inputs":[],"type":"error","name":"InvalidMembershipProof"},{"inputs":[{"internalType":"bytes[]","name":"path","type":"bytes[]"},{"internalType":"bytes","name":"value","type":"bytes"}],"type":"error","name":"KeyValuePairNotInCache"},{"inputs":[{"internalType":"uint256","name":"length","type":"uint256"},{"internalType":"uint256","name":"min","type":"uint256"},{"internalType":"uint256","name":"max","type":"uint256"}],"type":"error","name":"LengthIsOutOfRange"},{"inputs":[{"internalType":"bytes[]","name":"path","type":"bytes[]"}],"type":"error","name":"MembershipProofKeyNotFound"},{"inputs":[{"internalType":"bytes","name":"expected","type":"bytes"},{"internalType":"bytes","name":"actual","type":"bytes"}],"type":"error","name":"MembershipProofValueMismatch"},{"inputs":[{"internalType":"uint64","name":"expectedRevisionNumber","type":"uint64"},{"internalType":"uint64","name":"expectedRevisionHeight","type":"uint64"},{"internalType":"uint64","name":"actualRevisionNumber","type":"uint64"},{"internalType":"uint64","name":"actualRevisionHeight","type":"uint64"}],"type":"error","name":"ProofHeightMismatch"},{"inputs":[{"internalType":"uint256","name":"now","type":"uint256"},{"internalType":"uint256","name":"proofTimestamp","type":"uint256"}],"type":"error","name":"ProofIsInTheFuture"},{"inputs":[{"internalType":"uint256","name":"now","type":"uint256"},{"internalType":"uint256","name":"proofTimestamp","type":"uint256"}],"type":"error","name":"ProofIsTooOld"},{"inputs":[{"internalType":"uint256","name":"expectedNumerator","type":"uint256"},{"internalType":"uint256","name":"expectedDenominator","type":"uint256"},{"internalType":"uint256","name":"actualNumerator","type":"uint256"},{"internalType":"uint256","name":"actualDenominator","type":"uint256"}],"type":"error","name":"TrustThresholdMismatch"},{"inputs":[{"internalType":"uint256","name":"expected","type":"uint256"},{"internalType":"uint256","name":"actual","type":"uint256"}],"type":"error","name":"TrustingPeriodMismatch"},{"inputs":[{"internalType":"uint256","name":"trustingPeriod","type":"uint256"},{"internalType":"uint256","name":"unbondingPeriod","type":"uint256"}],"type":"error","name":"TrustingPeriodTooLong"},{"inputs":[{"internalType":"uint256","name":"expected","type":"uint256"},{"internalType":"uint256","name":"actual","type":"uint256"}],"type":"error","name":"UnbondingPeriodMismatch"},{"inputs":[{"internalType":"uint8","name":"proofType","type":"uint8"}],"type":"error","name":"UnknownMembershipProofType"},{"inputs":[{"internalType":"uint8","name":"algorithm","type":"uint8"}],"type":"error","name":"UnknownZkAlgorithm"},{"inputs":[{"internalType":"bytes32","name":"expected","type":"bytes32"},{"internalType":"bytes32","name":"actual","type":"bytes32"}],"type":"error","name":"VerificationKeyMismatch"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32","indexed":true},{"internalType":"bytes32","name":"previousAdminRole","type":"bytes32","indexed":true},{"internalType":"bytes32","name":"newAdminRole","type":"bytes32","indexed":true}],"type":"event","name":"RoleAdminChanged","anonymous":false},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32","indexed":true},{"internalType":"address","name":"account","type":"address","indexed":true},{"internalType":"address","name":"sender","type":"address","indexed":true}],"type":"event","name":"RoleGranted","anonymous":false},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32","indexed":true},{"internalType":"address","name":"account","type":"address","indexed":true},{"internalType":"address","name":"sender","type":"address","indexed":true}],"type":"event","name":"RoleRevoked","anonymous":false},{"inputs":[],"stateMutability":"view","type":"function","name":"ALLOWED_SP1_CLOCK_DRIFT","outputs":[{"internalType":"uint16","name":"","type":"uint16"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"MEMBERSHIP_PROGRAM_VKEY","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"MISBEHAVIOUR_PROGRAM_VKEY","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"PROOF_SUBMITTER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"UPDATE_CLIENT_AND_MEMBERSHIP_PROGRAM_VKEY","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"UPDATE_CLIENT_PROGRAM_VKEY","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"VERIFIER","outputs":[{"internalType":"contract ISP1Verifier","name":"","type":"address"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"clientState","outputs":[{"internalType":"string","name":"chainId","type":"string"},{"internalType":"struct IICS07TendermintMsgs.TrustThreshold","name":"trustLevel","type":"tuple","components":[{"internalType":"uint8","name":"numerator","type":"uint8"},{"internalType":"uint8","name":"denominator","type":"uint8"}]},{"internalType":"struct IICS02ClientMsgs.Height","name":"latestHeight","type":"tuple","components":[{"internalType":"uint64","name":"revisionNumber","type":"uint64"},{"internalType":"uint64","name":"revisionHeight","type":"uint64"}]},{"internalType":"uint32","name":"trustingPeriod","type":"uint32"},{"internalType":"uint32","name":"unbondingPeriod","type":"uint32"},{"internalType":"bool","name":"isFrozen","type":"bool"},{"internalType":"enum IICS07TendermintMsgs.SupportedZkAlgorithm","name":"zkAlgorithm","type":"uint8"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"getClientState","outputs":[{"internalType":"bytes","name":"","type":"bytes"}]},{"inputs":[{"internalType":"uint64","name":"revisionHeight","type":"uint64"}],"stateMutability":"view","type":"function","name":"getConsensusStateHash","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}]},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"stateMutability":"view","type":"function","name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}]},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"stateMutability":"nonpayable","type":"function","name":"grantRole"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"stateMutability":"view","type":"function","name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}]},{"inputs":[{"internalType":"bytes","name":"misbehaviourMsg","type":"bytes"}],"stateMutability":"nonpayable","type":"function","name":"misbehaviour"},{"inputs":[{"internalType":"bytes[]","name":"data","type":"bytes[]"}],"stateMutability":"nonpayable","type":"function","name":"multicall","outputs":[{"internalType":"bytes[]","name":"results","type":"bytes[]"}]},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"callerConfirmation","type":"address"}],"stateMutability":"nonpayable","type":"function","name":"renounceRole"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"stateMutability":"nonpayable","type":"function","name":"revokeRole"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"stateMutability":"view","type":"function","name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}]},{"inputs":[{"internalType":"bytes","name":"updateMsg","type":"bytes"}],"stateMutability":"nonpayable","type":"function","name":"updateClient","outputs":[{"internalType":"enum ILightClientMsgs.UpdateResult","name":"","type":"uint8"}]},{"inputs":[{"internalType":"struct ILightClientMsgs.MsgVerifyMembership","name":"msg_","type":"tuple","components":[{"internalType":"bytes","name":"proof","type":"bytes"},{"internalType":"struct IICS02ClientMsgs.Height","name":"proofHeight","type":"tuple","components":[{"internalType":"uint64","name":"revisionNumber","type":"uint64"},{"internalType":"uint64","name":"revisionHeight","type":"uint64"}]},{"internalType":"bytes[]","name":"path","type":"bytes[]"},{"internalType":"bytes","name":"value","type":"bytes"}]}],"stateMutability":"nonpayable","type":"function","name":"verifyMembership","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[{"internalType":"struct ILightClientMsgs.MsgVerifyNonMembership","name":"msg_","type":"tuple","components":[{"internalType":"bytes","name":"proof","type":"bytes"},{"internalType":"struct IICS02ClientMsgs.Height","name":"proofHeight","type":"tuple","components":[{"internalType":"uint64","name":"revisionNumber","type":"uint64"},{"internalType":"uint64","name":"revisionHeight","type":"uint64"}]},{"internalType":"bytes[]","name":"path","type":"bytes[]"}]}],"stateMutability":"nonpayable","type":"function","name":"verifyNonMembership","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]}],"devdoc":{"kind":"dev","methods":{"constructor":{"params":{"_clientState":"The encoded initial client state.","_consensusState":"The encoded initial consensus state.","membershipProgramVkey":"The verification key for the verify (non)membership program.","misbehaviourProgramVkey":"The verification key for the misbehaviour program.","roleManager":"Manages the proof submitters and can submit proofs. Should be the ICS26Router if used in IBC.","sp1Verifier":"The address of the SP1 verifier contract.","updateClientAndMembershipProgramVkey":"The verification key for the update client and membership program.","updateClientProgramVkey":"The verification key for the update client program."}},"getClientState()":{"returns":{"_0":"The client state."}},"getConsensusStateHash(uint64)":{"params":{"revisionHeight":"The revision height."},"returns":{"_0":"The consensus state at the given revision height."}},"getRoleAdmin(bytes32)":{"details":"Returns the admin role that controls `role`. See {grantRole} and {revokeRole}. To change a role's admin, use {_setRoleAdmin}."},"grantRole(bytes32,address)":{"details":"Grants `role` to `account`. If `account` had not been already granted `role`, emits a {RoleGranted} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleGranted} event."},"hasRole(bytes32,address)":{"details":"Returns `true` if `account` has been granted `role`."},"misbehaviour(bytes)":{"details":"The misbehavior is verfied in the sp1 program. Here we only check the public values which contain the trusted headers.","params":{"misbehaviourMsg":"The misbehaviour message"}},"multicall(bytes[])":{"custom:oz-upgrades-unsafe-allow-reachable":"delegatecall","details":"Receives and executes a batch of function calls on this contract."},"renounceRole(bytes32,address)":{"details":"Revokes `role` from the calling account. Roles are often managed via {grantRole} and {revokeRole}: this function's purpose is to provide a mechanism for accounts to lose their privileges if they are compromised (such as when a trusted device is misplaced). If the calling account had been revoked `role`, emits a {RoleRevoked} event. Requirements: - the caller must be `callerConfirmation`. May emit a {RoleRevoked} event."},"revokeRole(bytes32,address)":{"details":"Revokes `role` from `account`. If `account` had been granted `role`, emits a {RoleRevoked} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleRevoked} event."},"supportsInterface(bytes4)":{"details":"Returns true if this contract implements the interface defined by `interfaceId`. See the corresponding https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[ERC section] to learn more about how these ids are created. This function call must use less than 30 000 gas."},"updateClient(bytes)":{"details":"This function verifies the public values and forwards the proof to the SP1 verifier.","params":{"updateMsg":"The encoded update message e.g., an SP1 proof."},"returns":{"_0":"The result of the update operation"}},"verifyMembership((bytes,(uint64,uint64),bytes[],bytes))":{"details":"Notice that this message is not view, as it may update the client state for caching purposes.","params":{"msg_":"The membership message"},"returns":{"_0":"The unix timestamp of the verification height in the counterparty chain in seconds."}},"verifyNonMembership((bytes,(uint64,uint64),bytes[]))":{"details":"Notice that this message is not view, as it may update the client state for caching purposes.","params":{"msg_":"The membership message"},"returns":{"_0":"The unix timestamp of the verification height in the counterparty chain in seconds."}}},"version":1},"userdoc":{"kind":"user","methods":{"ALLOWED_SP1_CLOCK_DRIFT()":{"notice":"Constant allowed prover clock drift in seconds."},"MEMBERSHIP_PROGRAM_VKEY()":{"notice":"Immutable membership program verification key."},"MISBEHAVIOUR_PROGRAM_VKEY()":{"notice":"Immutable misbehaviour program verification key."},"PROOF_SUBMITTER_ROLE()":{"notice":"The role identifier for the proof submitter role"},"UPDATE_CLIENT_AND_MEMBERSHIP_PROGRAM_VKEY()":{"notice":"Immutable update client and membership program verification key."},"UPDATE_CLIENT_PROGRAM_VKEY()":{"notice":"Immutable update client program verification key."},"VERIFIER()":{"notice":"Immutable SP1 verifier contract address."},"clientState()":{"notice":"The ICS07Tendermint client state"},"constructor":{"notice":"The constructor sets the program verification key and the initial client and consensus states."},"getClientState()":{"notice":"Returns the client state."},"getConsensusStateHash(uint64)":{"notice":"Returns the consensus state keccak256 hash at the given revision height."},"misbehaviour(bytes)":{"notice":"Misbehaviour handling, moves the light client to the frozen state if misbehaviour is detected"},"updateClient(bytes)":{"notice":"Updating the client and consensus state"},"verifyMembership((bytes,(uint64,uint64),bytes[],bytes))":{"notice":"Querying the membership of a key-value pair"},"verifyNonMembership((bytes,(uint64,uint64),bytes[]))":{"notice":"Querying the non-membership of a key"}},"version":1}},"settings":{"remappings":["@openzeppelin-contracts/=node_modules/@openzeppelin/contracts/","@openzeppelin-upgradeable/=node_modules/@openzeppelin/contracts-upgradeable/","@openzeppelin/=node_modules/@openzeppelin/","@sp1-contracts/=node_modules/sp1-contracts/contracts/src/","@uniswap/permit2/=node_modules/@uniswap/permit2/","forge-std/=node_modules/forge-std/src/","sp1-contracts/=node_modules/sp1-contracts/"],"optimizer":{"enabled":true,"runs":10000},"metadata":{"bytecodeHash":"none"},"compilationTarget":{"contracts/light-clients/sp1-ics07/SP1ICS07Tendermint.sol":"SP1ICS07Tendermint"},"evmVersion":"cancun","libraries":{},"viaIR":true},"sources":{"contracts/interfaces/ILightClient.sol":{"keccak256":"0x1caae9e4f741a86c0056d5f7713a35f3bd96db7a9fd52fc9f1cf79aad76a442f","urls":["bzz-raw://4a536db3b926560f69547c17e4f451a2631ddea0f42bd224c7fd8382d74429f6","dweb:/ipfs/QmcQ33kxcmmowXgMbQGTBgiKBjF7v8UiP4y73bB9hhDizC"],"license":"MIT"},"contracts/light-clients/sp1-ics07/SP1ICS07Tendermint.sol":{"keccak256":"0x2e03f0f1e058e7184ea70dc2a423a3d32a609620b6a1e8b764ec9c287b0b6187","urls":["bzz-raw://9e3c0b2f3b3af9cfc8a3ab085e0decffcd40230a27530142293f0b79a4aefe51","dweb:/ipfs/Qmf3qEAMWdiGAMEXSae6mzZ7Sncsbr4QzDC4JzMeiNwgei"],"license":"MIT"},"contracts/light-clients/sp1-ics07/errors/ISP1ICS07TendermintErrors.sol":{"keccak256":"0xe1a0526f9913308f761af480ef7d87091d6038659b9058f89c50083d49768db1","urls":["bzz-raw://a31d6d4a059182b3dfd3e99595d82a134963c448c9152ef35b42c62ccca87635","dweb:/ipfs/QmfQ2Cfa4kxWem3f88o9UnFQgL8oRU6vKkDFWSGmLsVLqN"],"license":"MIT"},"contracts/light-clients/sp1-ics07/interfaces/ISP1ICS07Tendermint.sol":{"keccak256":"0x0f00aea96b194d1a9db14f708f0de1fe7723fedc7b72bb8ea182e768ffc0a731","urls":["bzz-raw://3111a76ebabf4b57917e93669892df895a54a93a4963e384d8c13a1c47877b44","dweb:/ipfs/QmPCZ7Z4dJpowkzMhizUAW1j8QdJLD3DDjMbYq8G5VeXc1"],"license":"MIT"},"contracts/light-clients/sp1-ics07/msgs/IICS07TendermintMsgs.sol":{"keccak256":"0xae0ae6ff2742192ebaaee297c7d7473a1e1b4dc73393d45a944b0b7a8a647703","urls":["bzz-raw://43b2f6492a1f727416bbcf55876d9c08ac1f66f4724efc75b935c5022555be20","dweb:/ipfs/QmfTaPFNSFuUEsEBgJjnF2Jr2knayS7YwatfjP7dgdcAyH"],"license":"UNLICENSED"},"contracts/light-clients/sp1-ics07/msgs/IMembershipMsgs.sol":{"keccak256":"0x9dff6833fddbc11caf27387c9f8cba5dca9d1e430c9643d4e4a2e8eb09924d96","urls":["bzz-raw://efa6cfc654510dfcef6f4286e3e66446082bcd5671662ae6e1c6fd0f893a5a4a","dweb:/ipfs/QmRWAg1kHvmRtXgDm4ajVC7tEWQnzTWmHeHMYQJfyFuDGq"],"license":"UNLICENSED"},"contracts/light-clients/sp1-ics07/msgs/IMisbehaviourMsgs.sol":{"keccak256":"0x165b37d890b06eccd47558bf1efd6495e18541627758736a1f5b9c33d0333832","urls":["bzz-raw://15ab15cd5439147abed697bc9644b0175754845608bf3d57c81c2c864d31ce46","dweb:/ipfs/QmYcV88YsM1sZCmhP8LKUFHq3hJ6bsvd66W5axBnsBBoUM"],"license":"UNLICENSED"},"contracts/light-clients/sp1-ics07/msgs/ISP1Msgs.sol":{"keccak256":"0x8ede29b02182df4be9c075b3b48083277e5dd93bb3e7ce1eecfea9728db49aed","urls":["bzz-raw://48edb4bbcd440454fffceb4f85b83c08c3973a212239d7da07c079634fe413dd","dweb:/ipfs/Qmf7ma1nXWghfZKrJJvLpPuY5aN2xZZjHY7kWP3KVFCoDJ"],"license":"MIT"},"contracts/light-clients/sp1-ics07/msgs/IUcAndMembershipMsgs.sol":{"keccak256":"0xef3619c79de37cabe95d9d8af9d145fc2ea2dd55137407fb4b0082b0491170d0","urls":["bzz-raw://93646d813cdacf5e38e609e54baa67c60d749f0f111d00cd18b003c3cb328204","dweb:/ipfs/QmVcuwPujbiZ644a4jRw2V1LZxhhGsm2HKMXweVqndwUnZ"],"license":"UNLICENSED"},"contracts/light-clients/sp1-ics07/msgs/IUpdateClientMsgs.sol":{"keccak256":"0x370cdfca1c65f1898c7da80507e66972a6fe51a5d5c4e7aeabdd7060ce875aed","urls":["bzz-raw://ff34288a142b6f40d6843818b9ec0a542db016bc0d4a7be582eb2e255655c43e","dweb:/ipfs/QmXwbJHDbqZdw3JTT48Le1ZWGqmKAG7omf2ePvDfBHomzj"],"license":"UNLICENSED"},"contracts/light-clients/sp1-ics07/utils/Paths.sol":{"keccak256":"0x0e4eec6cd6cd0ef684383946419a2bf53c8f800033acfc298db81688e5aa178b","urls":["bzz-raw://824b58c13ff96b6ee38b5d25435fcc1305c45735f52df6347dba3dacdc144ffa","dweb:/ipfs/QmT7qomKM46ChfVVwfBQHwjpoHW9vrG9nXkGXsPeZRLJ7w"],"license":"MIT"},"contracts/msgs/IICS02ClientMsgs.sol":{"keccak256":"0xb5fdb25319d5c32b3f527982d45ec1e9bec5215515581aee034d853006ea01a0","urls":["bzz-raw://6b8939bf552c62c952a491008bcd9b59ab7dda20a9482bf93438e05793881542","dweb:/ipfs/QmfWmzNCp8bd4pP26Lfw5HHp4dSZnCDqZDjVN7SD8P7eDh"],"license":"MIT"},"contracts/msgs/ILightClientMsgs.sol":{"keccak256":"0xa0565e7748b8b3284d72e1aa6ef4cc8264fcaa5f4e0761d22d64686953db6378","urls":["bzz-raw://c4476010d7090bfaa74127526f2051c6bc82ff42a09b936e848880a1f15a6065","dweb:/ipfs/QmY87JgRsFQXSZdGXNjNHEJCkdTHzFXH4vZEJ3q7MnHuP8"],"license":"MIT"},"node_modules/@openzeppelin/contracts/access/AccessControl.sol":{"keccak256":"0x1a6b4f6b7798ab80929d491b89d5427a9b3338c0fd1acd0ba325f69c6f1646af","urls":["bzz-raw://7bb7f346c12a14dc622bc105ce3c47202fbc89f4b153a28a63bb68193297330c","dweb:/ipfs/QmagwF8P3bUBXwdo159ueEnY9dLSvEWwK24kk2op58egwG"],"license":"MIT"},"node_modules/@openzeppelin/contracts/access/IAccessControl.sol":{"keccak256":"0xbff9f59c84e5337689161ce7641c0ef8e872d6a7536fbc1f5133f128887aba3c","urls":["bzz-raw://b308f882e796f7b79c9502deacb0a62983035c6f6f4e962b319ba6a1f4a77d3d","dweb:/ipfs/QmaWCW7ahEQqFjwhSUhV7Ae7WhfNvzSpE7DQ58hvEooqPL"],"license":"MIT"},"node_modules/@openzeppelin/contracts/utils/Address.sol":{"keccak256":"0x0fa9e0d3a859900b5a46f70a03c73adf259603d5e05027a37fe0b45529d85346","urls":["bzz-raw://c2add4da0240c9f2ce47649c8bb6b11b40e98cf6f88b8bdc76b2704e89391710","dweb:/ipfs/QmNQTwF2uVzu4CRtNxr8bxyP9XuW6VsZuo2Nr4KR2bZr3d"],"license":"MIT"},"node_modules/@openzeppelin/contracts/utils/Context.sol":{"keccak256":"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2","urls":["bzz-raw://6a708e8a5bdb1011c2c381c9a5cfd8a9a956d7d0a9dc1bd8bcdaf52f76ef2f12","dweb:/ipfs/Qmax9WHBnVsZP46ZxEMNRQpLQnrdE4dK8LehML1Py8FowF"],"license":"MIT"},"node_modules/@openzeppelin/contracts/utils/Errors.sol":{"keccak256":"0x6afa713bfd42cf0f7656efa91201007ac465e42049d7de1d50753a373648c123","urls":["bzz-raw://ba1d02f4847670a1b83dec9f7d37f0b0418d6043447b69f3a29a5f9efc547fcf","dweb:/ipfs/QmQ7iH2keLNUKgq2xSWcRmuBE5eZ3F5whYAkAGzCNNoEWB"],"license":"MIT"},"node_modules/@openzeppelin/contracts/utils/LowLevelCall.sol":{"keccak256":"0x5b4802a4352474792df3107e961d1cc593e47b820c14f69d3505cb28f5a6a583","urls":["bzz-raw://a6f86fd01f829499fe0545ff5dda07d4521988e88bfe0bf801fc15650921ed56","dweb:/ipfs/QmUUKu4ZDffHAmfkf3asuQfmLTyfpuy2Amdncc3SqfzKPG"],"license":"MIT"},"node_modules/@openzeppelin/contracts/utils/Multicall.sol":{"keccak256":"0x72a5499dfae7676e4298a7299bccd3b27438ba1a4c72df5cd69c1c343c7ea20d","urls":["bzz-raw://de0fb51ccae3a0ff377ed185d187440fc612a71bf8e42fdb0e032ce747fa3eef","dweb:/ipfs/QmPNBaiVsAiUhz8qfXcSy27S7CqBbtSd8rPqmaykKBhw7Q"],"license":"MIT"},"node_modules/@openzeppelin/contracts/utils/TransientSlot.sol":{"keccak256":"0xac673fa1e374d9e6107504af363333e3e5f6344d2e83faf57d9bfd41d77cc946","urls":["bzz-raw://5982478dbbb218e9dd5a6e83f5c0e8d1654ddf20178484b43ef21dd2246809de","dweb:/ipfs/QmaB1hS68n2kG8vTbt7EPEzmrGhkUbfiFyykGGLsAr9X22"],"license":"MIT"},"node_modules/@openzeppelin/contracts/utils/introspection/ERC165.sol":{"keccak256":"0x2d9dc2fe26180f74c11c13663647d38e259e45f95eb88f57b61d2160b0109d3e","urls":["bzz-raw://81233d1f98060113d9922180bb0f14f8335856fe9f339134b09335e9f678c377","dweb:/ipfs/QmWh6R35SarhAn4z2wH8SU456jJSYL2FgucfTFgbHJJN4E"],"license":"MIT"},"node_modules/@openzeppelin/contracts/utils/introspection/IERC165.sol":{"keccak256":"0x8891738ffe910f0cf2da09566928589bf5d63f4524dd734fd9cedbac3274dd5c","urls":["bzz-raw://971f954442df5c2ef5b5ebf1eb245d7105d9fbacc7386ee5c796df1d45b21617","dweb:/ipfs/QmadRjHbkicwqwwh61raUEapaVEtaLMcYbQZWs9gUkgj3u"],"license":"MIT"},"node_modules/sp1-contracts/contracts/src/ISP1Verifier.sol":{"keccak256":"0x9e3ba64860bea920772dcf16be7946de2a2900d80bd51e9c0771184138f4f4d3","urls":["bzz-raw://0ec7230ca1fdd74edc6ab597d80bb345282aed3f0db4788ed96b4cc373ff46a3","dweb:/ipfs/QmXPuSS5gzxMhFKWr1gsxBVu6WHh53ZZEvWkGgzrkM6Y7Q"],"license":"MIT"}},"version":1},"id":38} \ No newline at end of file +{"abi":[{"type":"constructor","inputs":[{"name":"updateClientProgramVkey","type":"bytes32","internalType":"bytes32"},{"name":"membershipProgramVkey","type":"bytes32","internalType":"bytes32"},{"name":"updateClientAndMembershipProgramVkey","type":"bytes32","internalType":"bytes32"},{"name":"misbehaviourProgramVkey","type":"bytes32","internalType":"bytes32"},{"name":"sp1Verifier","type":"address","internalType":"address"},{"name":"_clientState","type":"bytes","internalType":"bytes"},{"name":"_consensusState","type":"bytes32","internalType":"bytes32"},{"name":"roleManager","type":"address","internalType":"address"}],"stateMutability":"nonpayable"},{"type":"function","name":"ALLOWED_SP1_CLOCK_DRIFT","inputs":[],"outputs":[{"name":"","type":"uint16","internalType":"uint16"}],"stateMutability":"view"},{"type":"function","name":"DEFAULT_ADMIN_ROLE","inputs":[],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"type":"function","name":"MEMBERSHIP_PROGRAM_VKEY","inputs":[],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"type":"function","name":"MISBEHAVIOUR_PROGRAM_VKEY","inputs":[],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"type":"function","name":"PROOF_SUBMITTER_ROLE","inputs":[],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"type":"function","name":"UPDATE_CLIENT_AND_MEMBERSHIP_PROGRAM_VKEY","inputs":[],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"type":"function","name":"UPDATE_CLIENT_PROGRAM_VKEY","inputs":[],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"type":"function","name":"VERIFIER","inputs":[],"outputs":[{"name":"","type":"address","internalType":"contract ISP1Verifier"}],"stateMutability":"view"},{"type":"function","name":"clientState","inputs":[],"outputs":[{"name":"chainId","type":"string","internalType":"string"},{"name":"trustLevel","type":"tuple","internalType":"struct IICS07TendermintMsgs.TrustThreshold","components":[{"name":"numerator","type":"uint8","internalType":"uint8"},{"name":"denominator","type":"uint8","internalType":"uint8"}]},{"name":"latestHeight","type":"tuple","internalType":"struct IICS02ClientMsgs.Height","components":[{"name":"revisionNumber","type":"uint64","internalType":"uint64"},{"name":"revisionHeight","type":"uint64","internalType":"uint64"}]},{"name":"trustingPeriod","type":"uint32","internalType":"uint32"},{"name":"unbondingPeriod","type":"uint32","internalType":"uint32"},{"name":"isFrozen","type":"bool","internalType":"bool"},{"name":"zkAlgorithm","type":"uint8","internalType":"enum IICS07TendermintMsgs.SupportedZkAlgorithm"}],"stateMutability":"view"},{"type":"function","name":"getClientState","inputs":[],"outputs":[{"name":"","type":"bytes","internalType":"bytes"}],"stateMutability":"view"},{"type":"function","name":"getConsensusStateHash","inputs":[{"name":"revisionHeight","type":"uint64","internalType":"uint64"}],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"type":"function","name":"getRoleAdmin","inputs":[{"name":"role","type":"bytes32","internalType":"bytes32"}],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"type":"function","name":"grantRole","inputs":[{"name":"role","type":"bytes32","internalType":"bytes32"},{"name":"account","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"hasRole","inputs":[{"name":"role","type":"bytes32","internalType":"bytes32"},{"name":"account","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"misbehaviour","inputs":[{"name":"misbehaviourMsg","type":"bytes","internalType":"bytes"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"multicall","inputs":[{"name":"data","type":"bytes[]","internalType":"bytes[]"}],"outputs":[{"name":"results","type":"bytes[]","internalType":"bytes[]"}],"stateMutability":"nonpayable"},{"type":"function","name":"renounceRole","inputs":[{"name":"role","type":"bytes32","internalType":"bytes32"},{"name":"callerConfirmation","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"revokeRole","inputs":[{"name":"role","type":"bytes32","internalType":"bytes32"},{"name":"account","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"supportsInterface","inputs":[{"name":"interfaceId","type":"bytes4","internalType":"bytes4"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"updateClient","inputs":[{"name":"updateMsg","type":"bytes","internalType":"bytes"}],"outputs":[{"name":"","type":"uint8","internalType":"enum ILightClientMsgs.UpdateResult"}],"stateMutability":"nonpayable"},{"type":"function","name":"verifyMembership","inputs":[{"name":"msg_","type":"tuple","internalType":"struct ILightClientMsgs.MsgVerifyMembership","components":[{"name":"proof","type":"bytes","internalType":"bytes"},{"name":"proofHeight","type":"tuple","internalType":"struct IICS02ClientMsgs.Height","components":[{"name":"revisionNumber","type":"uint64","internalType":"uint64"},{"name":"revisionHeight","type":"uint64","internalType":"uint64"}]},{"name":"path","type":"bytes[]","internalType":"bytes[]"},{"name":"value","type":"bytes","internalType":"bytes"}]}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"nonpayable"},{"type":"function","name":"verifyNonMembership","inputs":[{"name":"msg_","type":"tuple","internalType":"struct ILightClientMsgs.MsgVerifyNonMembership","components":[{"name":"proof","type":"bytes","internalType":"bytes"},{"name":"proofHeight","type":"tuple","internalType":"struct IICS02ClientMsgs.Height","components":[{"name":"revisionNumber","type":"uint64","internalType":"uint64"},{"name":"revisionHeight","type":"uint64","internalType":"uint64"}]},{"name":"path","type":"bytes[]","internalType":"bytes[]"}]}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"nonpayable"},{"type":"event","name":"RoleAdminChanged","inputs":[{"name":"role","type":"bytes32","indexed":true,"internalType":"bytes32"},{"name":"previousAdminRole","type":"bytes32","indexed":true,"internalType":"bytes32"},{"name":"newAdminRole","type":"bytes32","indexed":true,"internalType":"bytes32"}],"anonymous":false},{"type":"event","name":"RoleGranted","inputs":[{"name":"role","type":"bytes32","indexed":true,"internalType":"bytes32"},{"name":"account","type":"address","indexed":true,"internalType":"address"},{"name":"sender","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"type":"event","name":"RoleRevoked","inputs":[{"name":"role","type":"bytes32","indexed":true,"internalType":"bytes32"},{"name":"account","type":"address","indexed":true,"internalType":"address"},{"name":"sender","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"type":"error","name":"AccessControlBadConfirmation","inputs":[]},{"type":"error","name":"AccessControlUnauthorizedAccount","inputs":[{"name":"account","type":"address","internalType":"address"},{"name":"neededRole","type":"bytes32","internalType":"bytes32"}]},{"type":"error","name":"AddressEmptyCode","inputs":[{"name":"target","type":"address","internalType":"address"}]},{"type":"error","name":"CannotHandleMisbehavior","inputs":[]},{"type":"error","name":"ChainIdMismatch","inputs":[{"name":"expected","type":"string","internalType":"string"},{"name":"actual","type":"string","internalType":"string"}]},{"type":"error","name":"ClientStateMismatch","inputs":[{"name":"expected","type":"bytes","internalType":"bytes"},{"name":"actual","type":"bytes","internalType":"bytes"}]},{"type":"error","name":"ConsensusStateHashMismatch","inputs":[{"name":"expected","type":"bytes32","internalType":"bytes32"},{"name":"actual","type":"bytes32","internalType":"bytes32"}]},{"type":"error","name":"ConsensusStateNotFound","inputs":[]},{"type":"error","name":"ConsensusStateRootMismatch","inputs":[{"name":"expected","type":"bytes32","internalType":"bytes32"},{"name":"actual","type":"bytes32","internalType":"bytes32"}]},{"type":"error","name":"EmptyValue","inputs":[]},{"type":"error","name":"FailedCall","inputs":[]},{"type":"error","name":"FeatureNotSupported","inputs":[]},{"type":"error","name":"FrozenClientState","inputs":[]},{"type":"error","name":"InvalidMembershipProof","inputs":[]},{"type":"error","name":"KeyValuePairNotInCache","inputs":[{"name":"path","type":"bytes[]","internalType":"bytes[]"},{"name":"value","type":"bytes","internalType":"bytes"}]},{"type":"error","name":"LengthIsOutOfRange","inputs":[{"name":"length","type":"uint256","internalType":"uint256"},{"name":"min","type":"uint256","internalType":"uint256"},{"name":"max","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"MembershipProofKeyNotFound","inputs":[{"name":"path","type":"bytes[]","internalType":"bytes[]"}]},{"type":"error","name":"MembershipProofValueMismatch","inputs":[{"name":"expected","type":"bytes","internalType":"bytes"},{"name":"actual","type":"bytes","internalType":"bytes"}]},{"type":"error","name":"ProofHeightMismatch","inputs":[{"name":"expectedRevisionNumber","type":"uint64","internalType":"uint64"},{"name":"expectedRevisionHeight","type":"uint64","internalType":"uint64"},{"name":"actualRevisionNumber","type":"uint64","internalType":"uint64"},{"name":"actualRevisionHeight","type":"uint64","internalType":"uint64"}]},{"type":"error","name":"ProofIsInTheFuture","inputs":[{"name":"now","type":"uint256","internalType":"uint256"},{"name":"proofTimestamp","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"ProofIsTooOld","inputs":[{"name":"now","type":"uint256","internalType":"uint256"},{"name":"proofTimestamp","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"TrustThresholdMismatch","inputs":[{"name":"expectedNumerator","type":"uint256","internalType":"uint256"},{"name":"expectedDenominator","type":"uint256","internalType":"uint256"},{"name":"actualNumerator","type":"uint256","internalType":"uint256"},{"name":"actualDenominator","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"TrustingPeriodMismatch","inputs":[{"name":"expected","type":"uint256","internalType":"uint256"},{"name":"actual","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"TrustingPeriodTooLong","inputs":[{"name":"trustingPeriod","type":"uint256","internalType":"uint256"},{"name":"unbondingPeriod","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"UnbondingPeriodMismatch","inputs":[{"name":"expected","type":"uint256","internalType":"uint256"},{"name":"actual","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"UnknownMembershipProofType","inputs":[{"name":"proofType","type":"uint8","internalType":"uint8"}]},{"type":"error","name":"UnknownZkAlgorithm","inputs":[{"name":"algorithm","type":"uint8","internalType":"uint8"}]},{"type":"error","name":"VerificationKeyMismatch","inputs":[{"name":"expected","type":"bytes32","internalType":"bytes32"},{"name":"actual","type":"bytes32","internalType":"bytes32"}]}],"bytecode":{"object":"0x61012060405234610541576137358038038061001a81610564565b928339810161010082820312610541578151916020810151604082015160608301519061004960808501610589565b60a08501519095906001600160401b0381116105415785019080601f8301121561054157815161007b9260200161059d565b9261008d60e060c08701519601610589565b9660805260a05260c05260e05280518101906020820190602081840312610541576020810151906001600160401b038211610541570191829003601f1981019061012013610541576040519160e083016001600160401b0381118482101761052d5760405260208401516001600160401b038111610541576020908501019080601f830112156105415781516101259260200161059d565b825260408112610541576040610139610545565b916101458286016105dd565b8352610153606086016105dd565b602084015260208401928352603f19011261054157610170610545565b61017c608085016105eb565b815261018a60a085016105eb565b6020820152604083019081526101a260c085016105ff565b90606084019182526101b660e086016105ff565b92608085019384526101008601519586151587036105415760a0860196875261012001519460028610156105415760c08101958652518051906001600160401b03821161052d57600154600181811c91168015610523575b602082101461050f57601f81116104ac575b50602090601f831160011461043f5763ffffffff95949392915f9183610434575b50508160011b915f199060031b1c1916176001555b5160ff81511661ff00602060025493015160081b169161ffff191617176002555160018060401b0381511660035491602068010000000000000000600160801b0391015160401b169160018060801b031916171760035551169267ffffffff00000000600454925160201b169051151560401b92519160028310156104205769ff00000000000000000068ff00000000000000009360481b169469ff000000000000000000199160018060481b0319161716179116171760045560018060401b0360035460401c165f52600560205260405f205560018060a01b03166101005260045463ffffffff8116610708810163ffffffff811161040c5763ffffffff809360201c1692839116116103f757826001600160a01b0381166103de575061037c610706565b505b604051612f0c908161078982396080518181816105570152611482015260a0518181816101f90152611e3e015260c051818181610cf001526121c2015260e0518181816102a00152610afe015261010051818181610cb50152611a570152f35b806103eb6103f192610610565b50610686565b5061037e565b6333fae18560e21b5f5260045260245260445ffd5b634e487b7160e01b5f52601160045260245ffd5b634e487b7160e01b5f52602160045260245ffd5b015190505f80610241565b90601f1983169160015f52815f20925f5b818110610494575091600193918563ffffffff99989796941061047c575b505050811b01600155610256565b01515f1960f88460031b161c191690555f808061046e565b92936020600181928786015181550195019301610450565b60015f527fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf6601f840160051c81019160208510610505575b601f0160051c01905b8181106104fa5750610220565b5f81556001016104ed565b90915081906104e4565b634e487b7160e01b5f52602260045260245ffd5b90607f169061020e565b634e487b7160e01b5f52604160045260245ffd5b5f80fd5b60408051919082016001600160401b0381118382101761052d57604052565b6040519190601f01601f191682016001600160401b0381118382101761052d57604052565b51906001600160a01b038216820361054157565b9192916001600160401b03821161052d576105c1601f8301601f1916602001610564565b938285528282011161054157815f926020928387015e84010152565b519060ff8216820361054157565b51906001600160401b038216820361054157565b519063ffffffff8216820361054157565b6001600160a01b0381165f9081525f5160206137155f395f51905f52602052604090205460ff16610681576001600160a01b03165f8181525f5160206137155f395f51905f5260205260408120805460ff191660011790553391905f5160206136955f395f51905f528180a4600190565b505f90565b6001600160a01b0381165f9081525f5160206136b55f395f51905f52602052604090205460ff16610681576001600160a01b03165f8181525f5160206136b55f395f51905f5260205260408120805460ff191660011790553391905f5160206136f55f395f51905f52905f5160206136955f395f51905f529080a4600190565b5f80525f5160206136b55f395f51905f526020525f5160206136d55f395f51905f525460ff16610784575f8080525f5160206136b55f395f51905f526020525f5160206136d55f395f51905f52805460ff1916600117905533905f5160206136f55f395f51905f525f5160206136955f395f51905f528280a4600190565b5f9056fe6080806040526004361015610012575f80fd5b5f3560e01c90816301ffc9a714610d13575080630225293e14610cd957806308c84e7014610c895780630bece35614610bc657806323842fb814610b96578063248a9ca314610b6c5780632c3ee47414610b505780632f2ff15d14610b21578063314d4dff14610ae757806336568abe14610a8b5780634d6d9ffb146109a95780635972185a1461096f578063682ed5f01461084b57806391d1485414610802578063a217fddf146107e8578063ac9650d81461066a578063bd3ce6b01461057a578063ca7242f914610540578063d547741f1461050a578063ddba65371461021c578063e45a6d0d146101e25763ef913a4b1461010e575f80fd5b346101de575f6003193601126101de576101da60405160208082015261012060408201526101c6816101436101608201610f03565b60ff600254818116606085015260081c16608083015267ffffffffffffffff60035481811660a085015260401c1660c083015260ff60045463ffffffff811660e085015263ffffffff8160201c16610100850152818160401c16151561012085015260481c166101b28161109c565b61014083015203601f198101835282611079565b604051918291602083526020830190610e35565b0390f35b5f80fd5b346101de575f6003193601126101de5760206040517f00000000000000000000000000000000000000000000000000000000000000008152f35b346101de5761022a36610db1565b6004549160ff8360401c166104e2575f80527f4c48d1d2b0f4f7485fc28e3db22341d96a20aa29e6efa8149da9751603abd4e06020527f6e0c24a6e293ff9b755263dbaa15ba3796b0b8d3fe17cfb4ddf8143b268eac4754610298929060ff16156104d5575b810190611116565b6102c78151517f00000000000000000000000000000000000000000000000000000000000000008082146111c6565b6020815101518051810160208101916020818303126101de57602081015167ffffffffffffffff81116101de57019061018090829003126101de576040519061030f82611009565b602081015167ffffffffffffffff81116101de5783908201602001906103349161129d565b825261034260408201611385565b60208301908152906103578460608301611256565b604084019081529161036c8560a08401611256565b60608501908152946103818160e085016113a2565b92608086019384526101400190610397916113a2565b9360a081019485525190516fffffffffffffffffffffffffffffffff166103bd9161265e565b516040805182516fffffffffffffffffffffffffffffffff166020808301918252840151828401529190920151606080840191909152825290610401608082611079565b51902090516020015167ffffffffffffffff1661041d90611686565b61042a91908181146118b9565b516040805182516fffffffffffffffffffffffffffffffff16602080830191825284015182840152919092015160608084019190915282529061046e608082611079565b51902090516020015167ffffffffffffffff1661048a90611686565b61049791908181146118b9565b516104a190611a40565b7fffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffff1668010000000000000000176004555f80f35b6104dd6117cb565b610290565b7f928b1233000000000000000000000000000000000000000000000000000000005f5260045ffd5b346101de5761053e61051b36610e02565b90610539610534825f525f602052600160405f20015490565b611853565b611be2565b005b346101de575f6003193601126101de5760206040517f00000000000000000000000000000000000000000000000000000000000000008152f35b346101de575f6003193601126101de576040516105a18161059a81610f03565b0382611079565b6101206040516105b081610fc0565b60025460ff8116825260ff602083019160081c16815260ff6040516105d481610fc0565b67ffffffffffffffff600354818116835281602084019160401c168152816004549385808660481c1697816106146040519d8d8f9e8f9081520190610e35565b9a511660208c0152511660408a0152511660608801525116608086015263ffffffff811660a086015263ffffffff8160201c1660c086015260401c16151560e08401526106608161109c565b6101008301520390f35b346101de5760206003193601126101de5760043567ffffffffffffffff81116101de57366023820112156101de57806004013567ffffffffffffffff81116101de57602482013660248360051b850101116101de576020906040516106cf8382611079565b5f815282810191601f1984013684376106e785611772565b956106f56040519788611079565b858752601f1961070487611772565b01855f5b8281106107d8575050505f5b868110156107c5576001906107a15f8061076e8861073a60248760051b8a01018a6116cd565b8d8d6040959395519483869484860198893784019083820190898252519283915e010185815203601f198101835282611079565b5190305af43d156107bd573d90610784826110a6565b916107926040519384611079565b82523d5f8b84013e5b30612d1f565b6107ab828b61178a565b526107b6818a61178a565b5001610714565b60609061079b565b604051868152806101da8189018b610e5a565b606082828c010152018690610708565b346101de575f6003193601126101de5760206040515f8152f35b346101de5761081036610e02565b905f525f60205273ffffffffffffffffffffffffffffffffffffffff60405f2091165f52602052602060ff60405f2054166040519015158152f35b346101de5760206003193601126101de5760043567ffffffffffffffff81116101de578060040160a060031983360301126101de5760ff60045460401c166104e2575f80527f4c48d1d2b0f4f7485fc28e3db22341d96a20aa29e6efa8149da9751603abd4e06020527f6e0c24a6e293ff9b755263dbaa15ba3796b0b8d3fe17cfb4ddf8143b268eac475460ff1615610962575b60848201916108ee83836116cd565b90501561093a576020928261090681610932956116cd565b602461092a61092361091b606489018761171e565b9790966116cd565b36916110c2565b950191611d2b565b604051908152f35b7f1208b21b000000000000000000000000000000000000000000000000000000005f5260045ffd5b61096a6117cb565b6108df565b346101de575f6003193601126101de5760206040517fbd893629a699470e4ec82a5715bb4981fdaacc5d0a728bf5f55b801d8f4ef10b8152f35b346101de5760206003193601126101de5760043567ffffffffffffffff81116101de5780600401608060031983360301126101de5760ff60045460401c166104e2575f80527f4c48d1d2b0f4f7485fc28e3db22341d96a20aa29e6efa8149da9751603abd4e060209081527f6e0c24a6e293ff9b755263dbaa15ba3796b0b8d3fe17cfb4ddf8143b268eac4754909261093292909160ff1615610a7e575b610a61610a5482806116cd565b919092606485019061171e565b929091602460405195610a748988611079565b5f87520191611d2b565b610a866117cb565b610a47565b346101de57610a9936610e02565b3373ffffffffffffffffffffffffffffffffffffffff821603610abf5761053e91611be2565b7f6697b232000000000000000000000000000000000000000000000000000000005f5260045ffd5b346101de575f6003193601126101de5760206040517f00000000000000000000000000000000000000000000000000000000000000008152f35b346101de5761053e610b3236610e02565b90610b4b610534825f525f602052600160405f20015490565b611b10565b346101de575f6003193601126101de5760206040516107088152f35b346101de5760206003193601126101de5760206109326004355f525f602052600160405f20015490565b346101de5760206003193601126101de5760043567ffffffffffffffff811681036101de57610932602091611686565b346101de57610bd436610db1565b60ff60045460401c166104e2575f80527f4c48d1d2b0f4f7485fc28e3db22341d96a20aa29e6efa8149da9751603abd4e06020527f6e0c24a6e293ff9b755263dbaa15ba3796b0b8d3fe17cfb4ddf8143b268eac4754610c3c929060ff1615610c7c5761146e565b6040516003821015610c4f576020918152f35b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b610c846117cb565b61146e565b346101de575f6003193601126101de57602060405173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b346101de575f6003193601126101de5760206040517f00000000000000000000000000000000000000000000000000000000000000008152f35b346101de5760206003193601126101de57600435907fffffffff0000000000000000000000000000000000000000000000000000000082168092036101de57817f7965db0b0000000000000000000000000000000000000000000000000000000060209314908115610d87575b5015158152f35b7f01ffc9a70000000000000000000000000000000000000000000000000000000091501483610d80565b9060206003198301126101de5760043567ffffffffffffffff81116101de57826023820112156101de5780600401359267ffffffffffffffff84116101de57602484830101116101de576024019190565b60031960409101126101de576004359060243573ffffffffffffffffffffffffffffffffffffffff811681036101de5790565b90601f19601f602080948051918291828752018686015e5f8582860101520116010190565b9080602083519182815201916020808360051b8301019401925f915b838310610e8557505050505090565b9091929394602080610ea383601f1986600196030187528951610e35565b97019301930191939290610e76565b90600182811c92168015610ef9575b6020831014610ecc57565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b91607f1691610ec1565b6001545f9291610f1282610eb2565b8082529160018116908115610f865750600114610f2d575050565b60015f9081529293509091907fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf65b838310610f6c575060209250010190565b600181602092949394548385870101520191019190610f5b565b60209495507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0091509291921683830152151560051b010190565b6040810190811067ffffffffffffffff821117610fdc57604052565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b60c0810190811067ffffffffffffffff821117610fdc57604052565b6020810190811067ffffffffffffffff821117610fdc57604052565b6060810190811067ffffffffffffffff821117610fdc57604052565b60e0810190811067ffffffffffffffff821117610fdc57604052565b90601f601f19910116810190811067ffffffffffffffff821117610fdc57604052565b60021115610c4f57565b67ffffffffffffffff8111610fdc57601f01601f191660200190565b9291926110ce826110a6565b916110dc6040519384611079565b8294818452818301116101de578281602093845f960137010152565b9080601f830112156101de57816020611113933591016110c2565b90565b6020818303126101de5780359067ffffffffffffffff82116101de5701906020828203126101de576040519161114b83611025565b80359067ffffffffffffffff82116101de57016060818303126101de576040519161117583611041565b81358352602082013567ffffffffffffffff81116101de57816111999184016110f8565b6020840152604082013567ffffffffffffffff81116101de576111bc92016110f8565b6040820152815290565b156111cf575050565b7fd56bdc26000000000000000000000000000000000000000000000000000000005f5260045260245260445ffd5b929192611209826110a6565b916112176040519384611079565b8294818452818301116101de578281602093845f96015e010152565b519060ff821682036101de57565b519067ffffffffffffffff821682036101de57565b91908260409103126101de5760405161126e81610fc0565b602061128781839561127f81611241565b855201611241565b910152565b519063ffffffff821682036101de57565b91908281039261012084126101de57604051916112b98361105d565b8294825167ffffffffffffffff81116101de57830182601f820112156101de576040916112ef84836020601f19955191016111fd565b865201126101de576113349060405161130781610fc0565b61131360208501611233565b815261132160408501611233565b6020820152602085015260608301611256565b604083015261134560a0820161128c565b606083015261135660c0820161128c565b608083015260e08101519081151582036101de576101009160a084015201519060028210156101de5760c00152565b51906fffffffffffffffffffffffffffffffff821682036101de57565b91908260609103126101de576040516113ba81611041565b60408082946113c881611385565b8452602081015160208501520151910152565b9190610180838203126101de57604051906113f582611009565b819380519167ffffffffffffffff83116101de576101408261141e8360a096611287960161129d565b865261142d83602083016113a2565b602087015261143f83608083016113a2565b604087015261145060e08201611385565b6060870152611463836101008301611256565b608087015201611256565b61147a91810190611116565b6114a98151517f00000000000000000000000000000000000000000000000000000000000000008082146111c6565b60208151015180518101906020818303126101de5760208101519167ffffffffffffffff83116101de576114e49260208092019201016113db565b906114ee826118f0565b6114f782611983565b916003831015610c4f578261162957908167ffffffffffffffff6020604060a0611113960193845184848201511685600354851c1681116115a1575b5050015160405161158681611578858201948591909160408060608301946fffffffffffffffffffffffffffffffff8151168452602081015160208501520151910152565b03601f198101835282611079565b51902092510151165f52600560205260405f20555b51611a40565b6115e08661162293511667ffffffffffffffff167fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000006003541617600355565b7fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff6fffffffffffffffff00000000000000006003549260401b16911617600355565b5f80611533565b506001820361166e5761111390680100000000000000007fffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffff600454161760045561159b565b6002821461167f576111139061159b565b5050600290565b67ffffffffffffffff165f52600560205260405f205480156116a55790565b7f5b48b457000000000000000000000000000000000000000000000000000000005f5260045ffd5b9035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1813603018212156101de570180359067ffffffffffffffff82116101de576020019181360383136101de57565b9035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1813603018212156101de570180359067ffffffffffffffff82116101de57602001918160051b360383136101de57565b67ffffffffffffffff8111610fdc5760051b60200190565b805182101561179e5760209160051b010190565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b335f9081527f4c48d1d2b0f4f7485fc28e3db22341d96a20aa29e6efa8149da9751603abd4e0602052604090205460ff161561180357565b7fe2517d3f000000000000000000000000000000000000000000000000000000005f52336004527fbd893629a699470e4ec82a5715bb4981fdaacc5d0a728bf5f55b801d8f4ef10b60245260445ffd5b805f525f60205260405f2073ffffffffffffffffffffffffffffffffffffffff33165f5260205260ff60405f2054161561188a5750565b7fe2517d3f000000000000000000000000000000000000000000000000000000005f523360045260245260445ffd5b156118c2575050565b7f6d23e8a3000000000000000000000000000000000000000000000000000000005f5260045260245260445ffd5b6119819061191681516fffffffffffffffffffffffffffffffff6060840151169061265e565b61197967ffffffffffffffff602060808185015160405161196b81611578868201948591909160408060608301946fffffffffffffffffffffffffffffffff8151168452602081015160208501520151910152565b519020940151015116611686565b8082146118b9565b565b67ffffffffffffffff602060a08301510151165f52600560205260405f205480155f146119b05750505f90565b604082019081516040516119f98161157860208201948591909160408060608301946fffffffffffffffffffffffffffffffff8151168452602081015160208501520151910152565b5190201491821592611a17575b505015611a1257600190565b600290565b6fffffffffffffffffffffffffffffffff91925060208291015151169151511611155f80611a06565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169080516040602083015192015192803b156101de575f92611ad892611aea604051968795869485947f41493c600000000000000000000000000000000000000000000000000000000086526004860152606060248601526064850190610e35565b90600319848303016044850152610e35565b03915afa8015611b0557611afb5750565b5f61198191611079565b6040513d5f823e3d90fd5b805f525f60205260405f2073ffffffffffffffffffffffffffffffffffffffff83165f5260205260ff60405f205416155f14611bdc57805f525f60205260405f2073ffffffffffffffffffffffffffffffffffffffff83165f5260205260405f2060017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0082541617905573ffffffffffffffffffffffffffffffffffffffff339216907f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d5f80a4600190565b50505f90565b805f525f60205260405f2073ffffffffffffffffffffffffffffffffffffffff83165f5260205260ff60405f2054165f14611bdc57805f525f60205260405f2073ffffffffffffffffffffffffffffffffffffffff83165f5260205260405f207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00815416905573ffffffffffffffffffffffffffffffffffffffff339216907ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b5f80a4600190565b3567ffffffffffffffff811681036101de5790565b929190611ccb81611772565b93611cd96040519586611079565b602085838152019160051b8101918383116101de5781905b838210611cff575050505050565b813567ffffffffffffffff81116101de57602091611d2087849387016110f8565b815201910190611cf1565b90949291939480156125a5578101906020818303126101de5780359067ffffffffffffffff82116101de57016040818303126101de5760405191611d6e83610fc0565b813560028110156101de578352602082013567ffffffffffffffff81116101de57611d9992016110f8565b90602081019182528051611dac8161109c565b611db58161109c565b612022575051908151820160208101926020818303126101de57602081015167ffffffffffffffff81116101de570190608090829003126101de5760405192611dfd84610fc0565b602082015167ffffffffffffffff81116101de5782611e26836020604094611e2e9701016129d0565b8652016113a2565b9460208301958652611e658351517f00000000000000000000000000000000000000000000000000000000000000008082146111c6565b6020835101519182518301926020818503126101de5760208101519067ffffffffffffffff82116101de5701926040848203126101de5760405193611ea985610fc0565b6020810151855260408101519167ffffffffffffffff83116101de57611ed6926020809201920101612a36565b94611ef06020850196808852518015158061201657612b83565b5f805b87518051831015611fe357611f0b83611f1e9261178a565b5151611f18368888611cbf565b90612db8565b15611fd957508694611f7d611f92956fffffffffffffffffffffffffffffffff9a9895611f7661159b966020633b9aca009f9d8198611f5d915161178a565b51015190815181518082149182611fc5575b5050612bc1565b6001612c0f565b51950194611f8a86611caa565b875191612e2a565b516001815111611fa6575b50505151160490565b611fb2611fbe92611caa565b90848451511691612eba565b5f80611f9d565b909150898401209089830120145f80611f6f565b9060010190611ef3565b5061159b92506020915094611f7d611f92956fffffffffffffffffffffffffffffffff9a9895633b9aca009c9a98612c0f565b5061ffff811115612b83565b949060018695939495516120358161109c565b61203e8161109c565b146120855760ff86516120508161109c565b6120598161109c565b7fd3a2e6c9000000000000000000000000000000000000000000000000000000005f521660045260245ffd5b90919293945051926060602060405161209d81610fc0565b6040516120a981611009565b6040516120b58161105d565b8481526040516120c481610fc0565b5f81525f85820152848201526040516120dc81610fc0565b5f81525f8582015260408201525f858201525f60808201525f60a08201525f60c0820152815261210a612998565b83820152612116612998565b60408201525f8482015260405161212c81610fc0565b5f81525f84820152608082015260405161214581610fc0565b5f81525f8482015260a08201528152015283518401936020818603126101de5760208101519067ffffffffffffffff82116101de5701936020858203126101de576040519461219386611025565b60208101519067ffffffffffffffff82116101de5760206121bc92816121e995019201016129d0565b808652517f00000000000000000000000000000000000000000000000000000000000000008082146111c6565b602084510151948551860160208101966020818303126101de57602081015167ffffffffffffffff81116101de570190604090829003126101de576040519661223188610fc0565b602082015167ffffffffffffffff81116101de57816020612254928501016113db565b885260408201519167ffffffffffffffff83116101de576122789201602001612a36565b936122926020880195808752518015158061201657612b83565b60208101956122a087611caa565b67ffffffffffffffff60a08a5101519181602084015116918291161480612586575b6122cb85611caa565b9267ffffffffffffffff6122de8c611caa565b915116911561253857505050506122f99061159b89516118f0565b6123038751611983565b6003811015610c4f5780612507575061231b86611caa565b67ffffffffffffffff8060035460401c169116116124b4575b5060408651015160405161237d8161157860208201948591909160408060608301946fffffffffffffffffffffffffffffffff8151168452602081015160208501520151910152565b51902067ffffffffffffffff61239287611caa565b165f52600560205260405f20555b5f805b8551805183101561248957611f0b836123bb9261178a565b1561247f5750633b9aca0096936fffffffffffffffffffffffffffffffff9693611f76879460206123f261240a9660409b5161178a565b51015190815181518082149182612469575050612bc1565b6124318351858101519067ffffffffffffffff602060a08185015193015101511690612e2a565b516001815111612447575b505051015151160490565b61245361246292611caa565b90858585510151511691612eba565b5f8061243c565b9091506020840120906020830120145f80611f6f565b90600101906123a3565b50604095925061240a9150936fffffffffffffffffffffffffffffffff9693633b9aca009895612c0f565b6124c06124f591611caa565b67ffffffffffffffff167fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000006003541617600355565b6125016115e086611caa565b5f612334565b60019150036123a0577f59bc8fd3000000000000000000000000000000000000000000000000000000005f5260045ffd5b6084945067ffffffffffffffff9081604051957fb8d8167e00000000000000000000000000000000000000000000000000000000875216600486015216602484015260448301526064820152fd5b5061259084611caa565b67ffffffffffffffff808451169116146122c2565b505090916125b860206125cd9201611caa565b91604051946125c686610fc0565b3691611cbf565b8352602083019182526040516125ec81611578866020830195866128ca565b5190205c915190518215612606575050633b9aca00900490565b9061265a612648926040519384937ff06fc33b000000000000000000000000000000000000000000000000000000008552604060048601526044850190610e5a565b90600319848303016024850152610e35565b0390fd5b906fffffffffffffffffffffffffffffffff633b9aca0091160442811161289b5780420342811161286e576107081061283f57508051516126a0600154610eb2565b1480612818575b815190156127d85750602081015160ff815116906002549160ff83169283821492836127bf575b6020015160ff169215612777575050505063ffffffff606082015116906004549163ffffffff831680820361274957505063ffffffff608081920151169160201c1680820361271b575050565b7f1eb5c1eb000000000000000000000000000000000000000000000000000000005f5260045260245260445ffd5b7f73b1bde3000000000000000000000000000000000000000000000000000000005f5260045260245260445ffd5b6084945060ff90604051947fd382033a000000000000000000000000000000000000000000000000000000008652600486015260081c16602484015260448301526064820152fd5b6020810151600883901c60ff90811691161493506126ce565b61265a906040519182917ff6b6676b0000000000000000000000000000000000000000000000000000000083526040600484015261264860448401610f03565b508051602081519101206040516128328161059a81610f03565b60208151910120146126a7565b7f12e74add000000000000000000000000000000000000000000000000000000005f524260045260245260445ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b7f20daedb6000000000000000000000000000000000000000000000000000000005f524260045260245260445ffd5b9067ffffffffffffffff90939293168152604060208201526080810190835191604080830152825180915260a0820190602060a08260051b8501019401915f905b82821061294f57505050506020611113939401519060607fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc082850301910152610e35565b9091929460208061298a837fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6089600196030186528951610e35565b97019201920190929161290b565b604051906129a582611041565b5f6040838281528260208201520152565b9080601f830112156101de578151611113926020016111fd565b91906060838203126101de57604051906129e982611041565b819380518352602081015167ffffffffffffffff81116101de5782612a0f9183016129b6565b602084015260408101519167ffffffffffffffff83116101de5760409261128792016129b6565b9080601f830112156101de57815191612a4e83611772565b92612a5c6040519485611079565b80845260208085019160051b830101918383116101de5760208101915b838310612a8857505050505090565b825167ffffffffffffffff81116101de578201906040601f1983880301126101de5760405190612ab782610fc0565b602083015167ffffffffffffffff81116101de5760209084010187601f820112156101de578051612ae781611772565b91612af56040519384611079565b81835260208084019260051b820101918a83116101de5760208201905b838210612b555750505050825260408301519167ffffffffffffffff83116101de57612b46886020809695819601016129b6565b83820152815201920191612a79565b815167ffffffffffffffff81116101de57602091612b788e8480948801016129b6565b815201910190612b12565b15612b8b5750565b7fb0369c31000000000000000000000000000000000000000000000000000000005f52600452600160245261ffff60445260645ffd5b91909115612bcd575050565b9061265a612648926040519384937f5f1ca381000000000000000000000000000000000000000000000000000000008552604060048601526044850190610e35565b91909115612c1b575050565b604051907ffef760c700000000000000000000000000000000000000000000000000000000825280602483016020600485015252604482019260448260051b84010191815f907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1813603015b838310612c945786860387fd5b90919293947fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbc8782030188528535828112156101de578301906020823592019167ffffffffffffffff81116101de5780360383136101de57602082601f19601f8480600198869897879852868601375f85828601015201160101970198019301919096939296612c87565b90612d5c5750805115612d3457602081519101fd5b7fd6bda275000000000000000000000000000000000000000000000000000000005f5260045ffd5b81511580612daf575b612d6d575090565b73ffffffffffffffffffffffffffffffffffffffff907f9996b315000000000000000000000000000000000000000000000000000000005f521660045260245ffd5b50803b15612d65565b908151815103611bdc575f5b8251811015612e2257612dd7818461178a565b5151612de3828461178a565b515103612e1b57612df4818461178a565b5160208151910120612e06828461178a565b516020815191012003612e1b57600101612dc4565b5050505f90565b505050600190565b91612e7f60209261197960405185810190612e7681611578888591909160408060608301946fffffffffffffffffffffffffffffffff8151168452602081015160208501520151910152565b51902091611686565b0151808203612e8c575050565b7f4b2dfe98000000000000000000000000000000000000000000000000000000005f5260045260245260445ffd5b929190925f5b8451811015612ef8578083612ed76001938861178a565b51604051612eee81611578602082019489866128ca565b5190205d01612ec0565b505050905056fea164736f6c634300081c000a2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d4c48d1d2b0f4f7485fc28e3db22341d96a20aa29e6efa8149da9751603abd4e06e0c24a6e293ff9b755263dbaa15ba3796b0b8d3fe17cfb4ddf8143b268eac47bd893629a699470e4ec82a5715bb4981fdaacc5d0a728bf5f55b801d8f4ef10bad3228b676f7d3cd4284a5443f17f1962b36e491b30a40b2405849e597ba5fb5","sourceMap":"1355:25496:45:-:0;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;-1:-1:-1;;;;;1355:25496:45;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;:::i;:::-;3774:52;1355:25496;3774:52;1355:25496;3836:47;1355:25496;3893:80;1355:25496;3983:51;1355:25496;;4059:60;;;1355:25496;4059:60;;1355:25496;;;;;;;;;4059:60;;1355:25496;;-1:-1:-1;;;;;1355:25496:45;;;;;;;;;-1:-1:-1;;1355:25496:45;;;;-1:-1:-1;1355:25496:45;;;;;;;;-1:-1:-1;;;;;1355:25496:45;;;;;;;;;;;;;;-1:-1:-1;;;;;1355:25496:45;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;1355:25496:45;;;;;;;;;;;;;;;;-1:-1:-1;1355:25496:45;;;;;;;;;;;-1:-1:-1;1355:25496:45;;;;;;;;;;;;;;;;-1:-1:-1;;1355:25496:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1355:25496:45;4129:21;1355:25496;;;-1:-1:-1;1355:25496:45;;;;;;;;;4220:36;1355:25496;;;;;2472:10;;;1355:25496;2472:10;;;;1355:25496;2472:10;;1355:25496;2472:10;1355:25496;;;;;4288:83;2472:10;;1355:25496;-1:-1:-1;;;;;1355:25496:45;;;;4529:44;;;:::i;:::-;;4484:351;1355:25496;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4484:351;4637:43;;4736:45;4637:43;;:::i;:::-;;4736:45;:::i;:::-;;4484:351;;2472:10;;;;-1:-1:-1;2472:10:45;1355:25496;2472:10;;;;-1:-1:-1;2472:10:45;;1355:25496;;;-1:-1:-1;2472:10:45;;1355:25496;2472:10;;-1:-1:-1;2472:10:45;1355:25496;;;;-1:-1:-1;1355:25496:45;;;;;-1:-1:-1;1355:25496:45;;;;;-1:-1:-1;1355:25496:45;;;;;;;;;;;;-1:-1:-1;1355:25496:45;;-1:-1:-1;1355:25496:45;;-1:-1:-1;1355:25496:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1355:25496:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1355:25496:45;;;;;;;;;-1:-1:-1;1355:25496:45;;;;;;;;-1:-1:-1;1355:25496:45;;;;;-1:-1:-1;1355:25496:45;;;;;;;;;;;;-1:-1:-1;1355:25496:45;;;;;-1:-1:-1;1355:25496:45;;-1:-1:-1;1355:25496:45;;;;;;;;;;-1:-1:-1;;;;;1355:25496:45;;;;;;;;;;:::o;:::-;;;;;;;-1:-1:-1;;1355:25496:45;;;-1:-1:-1;;;;;1355:25496:45;;;;;;;;;;:::o;:::-;;;-1:-1:-1;;;;;1355:25496:45;;;;;;:::o;:::-;;;;-1:-1:-1;;;;;1355:25496:45;;;;;;;;-1:-1:-1;;1355:25496:45;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;:::o;:::-;;;-1:-1:-1;;;;;1355:25496:45;;;;;;:::o;:::-;;;;;;;;;;:::o;6155:316:92:-;-1:-1:-1;;;;;1355:25496:45;;;;;;-1:-1:-1;;;;;;;;;;;1355:25496:45;;;;;;;;;;-1:-1:-1;;;;;1355:25496:45;;;;;-1:-1:-1;;;;;;;;;;;1355:25496:45;;;;;;;-1:-1:-1;;1355:25496:45;;;;;735:10:120;;1355:25496:45;-1:-1:-1;;;;;;;;;;;1355:25496:45;;6346:40:92;6323:4;6400:11;:::o;6248:217::-;6442:12;1355:25496:45;6442:12:92;:::o;6155:316::-;-1:-1:-1;;;;;1355:25496:45;;;;;;-1:-1:-1;;;;;;;;;;;1355:25496:45;;;;;;;;;;-1:-1:-1;;;;;1355:25496:45;;;;;-1:-1:-1;;;;;;;;;;;1355:25496:45;;;;;;;-1:-1:-1;;1355:25496:45;;;;;735:10:120;;1355:25496:45;-1:-1:-1;;;;;;;;;;;2576:33:45;-1:-1:-1;;;;;;;;;;;6346:40:92;1355:25496:45;6346:40:92;6323:4;6400:11;:::o;6155:316::-;1355:25496:45;;;-1:-1:-1;;;;;;;;;;;1355:25496:45;;-1:-1:-1;;;;;;;;;;;1355:25496:45;;;;;;;;;-1:-1:-1;;;;;;;;;;;1355:25496:45;;-1:-1:-1;;;;;;;;;;;1355:25496:45;;-1:-1:-1;;1355:25496:45;6323:4:92;1355:25496:45;;;735:10:120;;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;1355:25496:45;;6346:40:92;6323:4;6400:11;:::o;6248:217::-;1355:25496:45;6442:12:92;:::o","linkReferences":{}},"deployedBytecode":{"object":"0x6080806040526004361015610012575f80fd5b5f3560e01c90816301ffc9a714610d13575080630225293e14610cd957806308c84e7014610c895780630bece35614610bc657806323842fb814610b96578063248a9ca314610b6c5780632c3ee47414610b505780632f2ff15d14610b21578063314d4dff14610ae757806336568abe14610a8b5780634d6d9ffb146109a95780635972185a1461096f578063682ed5f01461084b57806391d1485414610802578063a217fddf146107e8578063ac9650d81461066a578063bd3ce6b01461057a578063ca7242f914610540578063d547741f1461050a578063ddba65371461021c578063e45a6d0d146101e25763ef913a4b1461010e575f80fd5b346101de575f6003193601126101de576101da60405160208082015261012060408201526101c6816101436101608201610f03565b60ff600254818116606085015260081c16608083015267ffffffffffffffff60035481811660a085015260401c1660c083015260ff60045463ffffffff811660e085015263ffffffff8160201c16610100850152818160401c16151561012085015260481c166101b28161109c565b61014083015203601f198101835282611079565b604051918291602083526020830190610e35565b0390f35b5f80fd5b346101de575f6003193601126101de5760206040517f00000000000000000000000000000000000000000000000000000000000000008152f35b346101de5761022a36610db1565b6004549160ff8360401c166104e2575f80527f4c48d1d2b0f4f7485fc28e3db22341d96a20aa29e6efa8149da9751603abd4e06020527f6e0c24a6e293ff9b755263dbaa15ba3796b0b8d3fe17cfb4ddf8143b268eac4754610298929060ff16156104d5575b810190611116565b6102c78151517f00000000000000000000000000000000000000000000000000000000000000008082146111c6565b6020815101518051810160208101916020818303126101de57602081015167ffffffffffffffff81116101de57019061018090829003126101de576040519061030f82611009565b602081015167ffffffffffffffff81116101de5783908201602001906103349161129d565b825261034260408201611385565b60208301908152906103578460608301611256565b604084019081529161036c8560a08401611256565b60608501908152946103818160e085016113a2565b92608086019384526101400190610397916113a2565b9360a081019485525190516fffffffffffffffffffffffffffffffff166103bd9161265e565b516040805182516fffffffffffffffffffffffffffffffff166020808301918252840151828401529190920151606080840191909152825290610401608082611079565b51902090516020015167ffffffffffffffff1661041d90611686565b61042a91908181146118b9565b516040805182516fffffffffffffffffffffffffffffffff16602080830191825284015182840152919092015160608084019190915282529061046e608082611079565b51902090516020015167ffffffffffffffff1661048a90611686565b61049791908181146118b9565b516104a190611a40565b7fffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffff1668010000000000000000176004555f80f35b6104dd6117cb565b610290565b7f928b1233000000000000000000000000000000000000000000000000000000005f5260045ffd5b346101de5761053e61051b36610e02565b90610539610534825f525f602052600160405f20015490565b611853565b611be2565b005b346101de575f6003193601126101de5760206040517f00000000000000000000000000000000000000000000000000000000000000008152f35b346101de575f6003193601126101de576040516105a18161059a81610f03565b0382611079565b6101206040516105b081610fc0565b60025460ff8116825260ff602083019160081c16815260ff6040516105d481610fc0565b67ffffffffffffffff600354818116835281602084019160401c168152816004549385808660481c1697816106146040519d8d8f9e8f9081520190610e35565b9a511660208c0152511660408a0152511660608801525116608086015263ffffffff811660a086015263ffffffff8160201c1660c086015260401c16151560e08401526106608161109c565b6101008301520390f35b346101de5760206003193601126101de5760043567ffffffffffffffff81116101de57366023820112156101de57806004013567ffffffffffffffff81116101de57602482013660248360051b850101116101de576020906040516106cf8382611079565b5f815282810191601f1984013684376106e785611772565b956106f56040519788611079565b858752601f1961070487611772565b01855f5b8281106107d8575050505f5b868110156107c5576001906107a15f8061076e8861073a60248760051b8a01018a6116cd565b8d8d6040959395519483869484860198893784019083820190898252519283915e010185815203601f198101835282611079565b5190305af43d156107bd573d90610784826110a6565b916107926040519384611079565b82523d5f8b84013e5b30612d1f565b6107ab828b61178a565b526107b6818a61178a565b5001610714565b60609061079b565b604051868152806101da8189018b610e5a565b606082828c010152018690610708565b346101de575f6003193601126101de5760206040515f8152f35b346101de5761081036610e02565b905f525f60205273ffffffffffffffffffffffffffffffffffffffff60405f2091165f52602052602060ff60405f2054166040519015158152f35b346101de5760206003193601126101de5760043567ffffffffffffffff81116101de578060040160a060031983360301126101de5760ff60045460401c166104e2575f80527f4c48d1d2b0f4f7485fc28e3db22341d96a20aa29e6efa8149da9751603abd4e06020527f6e0c24a6e293ff9b755263dbaa15ba3796b0b8d3fe17cfb4ddf8143b268eac475460ff1615610962575b60848201916108ee83836116cd565b90501561093a576020928261090681610932956116cd565b602461092a61092361091b606489018761171e565b9790966116cd565b36916110c2565b950191611d2b565b604051908152f35b7f1208b21b000000000000000000000000000000000000000000000000000000005f5260045ffd5b61096a6117cb565b6108df565b346101de575f6003193601126101de5760206040517fbd893629a699470e4ec82a5715bb4981fdaacc5d0a728bf5f55b801d8f4ef10b8152f35b346101de5760206003193601126101de5760043567ffffffffffffffff81116101de5780600401608060031983360301126101de5760ff60045460401c166104e2575f80527f4c48d1d2b0f4f7485fc28e3db22341d96a20aa29e6efa8149da9751603abd4e060209081527f6e0c24a6e293ff9b755263dbaa15ba3796b0b8d3fe17cfb4ddf8143b268eac4754909261093292909160ff1615610a7e575b610a61610a5482806116cd565b919092606485019061171e565b929091602460405195610a748988611079565b5f87520191611d2b565b610a866117cb565b610a47565b346101de57610a9936610e02565b3373ffffffffffffffffffffffffffffffffffffffff821603610abf5761053e91611be2565b7f6697b232000000000000000000000000000000000000000000000000000000005f5260045ffd5b346101de575f6003193601126101de5760206040517f00000000000000000000000000000000000000000000000000000000000000008152f35b346101de5761053e610b3236610e02565b90610b4b610534825f525f602052600160405f20015490565b611b10565b346101de575f6003193601126101de5760206040516107088152f35b346101de5760206003193601126101de5760206109326004355f525f602052600160405f20015490565b346101de5760206003193601126101de5760043567ffffffffffffffff811681036101de57610932602091611686565b346101de57610bd436610db1565b60ff60045460401c166104e2575f80527f4c48d1d2b0f4f7485fc28e3db22341d96a20aa29e6efa8149da9751603abd4e06020527f6e0c24a6e293ff9b755263dbaa15ba3796b0b8d3fe17cfb4ddf8143b268eac4754610c3c929060ff1615610c7c5761146e565b6040516003821015610c4f576020918152f35b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b610c846117cb565b61146e565b346101de575f6003193601126101de57602060405173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b346101de575f6003193601126101de5760206040517f00000000000000000000000000000000000000000000000000000000000000008152f35b346101de5760206003193601126101de57600435907fffffffff0000000000000000000000000000000000000000000000000000000082168092036101de57817f7965db0b0000000000000000000000000000000000000000000000000000000060209314908115610d87575b5015158152f35b7f01ffc9a70000000000000000000000000000000000000000000000000000000091501483610d80565b9060206003198301126101de5760043567ffffffffffffffff81116101de57826023820112156101de5780600401359267ffffffffffffffff84116101de57602484830101116101de576024019190565b60031960409101126101de576004359060243573ffffffffffffffffffffffffffffffffffffffff811681036101de5790565b90601f19601f602080948051918291828752018686015e5f8582860101520116010190565b9080602083519182815201916020808360051b8301019401925f915b838310610e8557505050505090565b9091929394602080610ea383601f1986600196030187528951610e35565b97019301930191939290610e76565b90600182811c92168015610ef9575b6020831014610ecc57565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b91607f1691610ec1565b6001545f9291610f1282610eb2565b8082529160018116908115610f865750600114610f2d575050565b60015f9081529293509091907fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf65b838310610f6c575060209250010190565b600181602092949394548385870101520191019190610f5b565b60209495507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0091509291921683830152151560051b010190565b6040810190811067ffffffffffffffff821117610fdc57604052565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b60c0810190811067ffffffffffffffff821117610fdc57604052565b6020810190811067ffffffffffffffff821117610fdc57604052565b6060810190811067ffffffffffffffff821117610fdc57604052565b60e0810190811067ffffffffffffffff821117610fdc57604052565b90601f601f19910116810190811067ffffffffffffffff821117610fdc57604052565b60021115610c4f57565b67ffffffffffffffff8111610fdc57601f01601f191660200190565b9291926110ce826110a6565b916110dc6040519384611079565b8294818452818301116101de578281602093845f960137010152565b9080601f830112156101de57816020611113933591016110c2565b90565b6020818303126101de5780359067ffffffffffffffff82116101de5701906020828203126101de576040519161114b83611025565b80359067ffffffffffffffff82116101de57016060818303126101de576040519161117583611041565b81358352602082013567ffffffffffffffff81116101de57816111999184016110f8565b6020840152604082013567ffffffffffffffff81116101de576111bc92016110f8565b6040820152815290565b156111cf575050565b7fd56bdc26000000000000000000000000000000000000000000000000000000005f5260045260245260445ffd5b929192611209826110a6565b916112176040519384611079565b8294818452818301116101de578281602093845f96015e010152565b519060ff821682036101de57565b519067ffffffffffffffff821682036101de57565b91908260409103126101de5760405161126e81610fc0565b602061128781839561127f81611241565b855201611241565b910152565b519063ffffffff821682036101de57565b91908281039261012084126101de57604051916112b98361105d565b8294825167ffffffffffffffff81116101de57830182601f820112156101de576040916112ef84836020601f19955191016111fd565b865201126101de576113349060405161130781610fc0565b61131360208501611233565b815261132160408501611233565b6020820152602085015260608301611256565b604083015261134560a0820161128c565b606083015261135660c0820161128c565b608083015260e08101519081151582036101de576101009160a084015201519060028210156101de5760c00152565b51906fffffffffffffffffffffffffffffffff821682036101de57565b91908260609103126101de576040516113ba81611041565b60408082946113c881611385565b8452602081015160208501520151910152565b9190610180838203126101de57604051906113f582611009565b819380519167ffffffffffffffff83116101de576101408261141e8360a096611287960161129d565b865261142d83602083016113a2565b602087015261143f83608083016113a2565b604087015261145060e08201611385565b6060870152611463836101008301611256565b608087015201611256565b61147a91810190611116565b6114a98151517f00000000000000000000000000000000000000000000000000000000000000008082146111c6565b60208151015180518101906020818303126101de5760208101519167ffffffffffffffff83116101de576114e49260208092019201016113db565b906114ee826118f0565b6114f782611983565b916003831015610c4f578261162957908167ffffffffffffffff6020604060a0611113960193845184848201511685600354851c1681116115a1575b5050015160405161158681611578858201948591909160408060608301946fffffffffffffffffffffffffffffffff8151168452602081015160208501520151910152565b03601f198101835282611079565b51902092510151165f52600560205260405f20555b51611a40565b6115e08661162293511667ffffffffffffffff167fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000006003541617600355565b7fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff6fffffffffffffffff00000000000000006003549260401b16911617600355565b5f80611533565b506001820361166e5761111390680100000000000000007fffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffff600454161760045561159b565b6002821461167f576111139061159b565b5050600290565b67ffffffffffffffff165f52600560205260405f205480156116a55790565b7f5b48b457000000000000000000000000000000000000000000000000000000005f5260045ffd5b9035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1813603018212156101de570180359067ffffffffffffffff82116101de576020019181360383136101de57565b9035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1813603018212156101de570180359067ffffffffffffffff82116101de57602001918160051b360383136101de57565b67ffffffffffffffff8111610fdc5760051b60200190565b805182101561179e5760209160051b010190565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b335f9081527f4c48d1d2b0f4f7485fc28e3db22341d96a20aa29e6efa8149da9751603abd4e0602052604090205460ff161561180357565b7fe2517d3f000000000000000000000000000000000000000000000000000000005f52336004527fbd893629a699470e4ec82a5715bb4981fdaacc5d0a728bf5f55b801d8f4ef10b60245260445ffd5b805f525f60205260405f2073ffffffffffffffffffffffffffffffffffffffff33165f5260205260ff60405f2054161561188a5750565b7fe2517d3f000000000000000000000000000000000000000000000000000000005f523360045260245260445ffd5b156118c2575050565b7f6d23e8a3000000000000000000000000000000000000000000000000000000005f5260045260245260445ffd5b6119819061191681516fffffffffffffffffffffffffffffffff6060840151169061265e565b61197967ffffffffffffffff602060808185015160405161196b81611578868201948591909160408060608301946fffffffffffffffffffffffffffffffff8151168452602081015160208501520151910152565b519020940151015116611686565b8082146118b9565b565b67ffffffffffffffff602060a08301510151165f52600560205260405f205480155f146119b05750505f90565b604082019081516040516119f98161157860208201948591909160408060608301946fffffffffffffffffffffffffffffffff8151168452602081015160208501520151910152565b5190201491821592611a17575b505015611a1257600190565b600290565b6fffffffffffffffffffffffffffffffff91925060208291015151169151511611155f80611a06565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169080516040602083015192015192803b156101de575f92611ad892611aea604051968795869485947f41493c600000000000000000000000000000000000000000000000000000000086526004860152606060248601526064850190610e35565b90600319848303016044850152610e35565b03915afa8015611b0557611afb5750565b5f61198191611079565b6040513d5f823e3d90fd5b805f525f60205260405f2073ffffffffffffffffffffffffffffffffffffffff83165f5260205260ff60405f205416155f14611bdc57805f525f60205260405f2073ffffffffffffffffffffffffffffffffffffffff83165f5260205260405f2060017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0082541617905573ffffffffffffffffffffffffffffffffffffffff339216907f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d5f80a4600190565b50505f90565b805f525f60205260405f2073ffffffffffffffffffffffffffffffffffffffff83165f5260205260ff60405f2054165f14611bdc57805f525f60205260405f2073ffffffffffffffffffffffffffffffffffffffff83165f5260205260405f207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00815416905573ffffffffffffffffffffffffffffffffffffffff339216907ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b5f80a4600190565b3567ffffffffffffffff811681036101de5790565b929190611ccb81611772565b93611cd96040519586611079565b602085838152019160051b8101918383116101de5781905b838210611cff575050505050565b813567ffffffffffffffff81116101de57602091611d2087849387016110f8565b815201910190611cf1565b90949291939480156125a5578101906020818303126101de5780359067ffffffffffffffff82116101de57016040818303126101de5760405191611d6e83610fc0565b813560028110156101de578352602082013567ffffffffffffffff81116101de57611d9992016110f8565b90602081019182528051611dac8161109c565b611db58161109c565b612022575051908151820160208101926020818303126101de57602081015167ffffffffffffffff81116101de570190608090829003126101de5760405192611dfd84610fc0565b602082015167ffffffffffffffff81116101de5782611e26836020604094611e2e9701016129d0565b8652016113a2565b9460208301958652611e658351517f00000000000000000000000000000000000000000000000000000000000000008082146111c6565b6020835101519182518301926020818503126101de5760208101519067ffffffffffffffff82116101de5701926040848203126101de5760405193611ea985610fc0565b6020810151855260408101519167ffffffffffffffff83116101de57611ed6926020809201920101612a36565b94611ef06020850196808852518015158061201657612b83565b5f805b87518051831015611fe357611f0b83611f1e9261178a565b5151611f18368888611cbf565b90612db8565b15611fd957508694611f7d611f92956fffffffffffffffffffffffffffffffff9a9895611f7661159b966020633b9aca009f9d8198611f5d915161178a565b51015190815181518082149182611fc5575b5050612bc1565b6001612c0f565b51950194611f8a86611caa565b875191612e2a565b516001815111611fa6575b50505151160490565b611fb2611fbe92611caa565b90848451511691612eba565b5f80611f9d565b909150898401209089830120145f80611f6f565b9060010190611ef3565b5061159b92506020915094611f7d611f92956fffffffffffffffffffffffffffffffff9a9895633b9aca009c9a98612c0f565b5061ffff811115612b83565b949060018695939495516120358161109c565b61203e8161109c565b146120855760ff86516120508161109c565b6120598161109c565b7fd3a2e6c9000000000000000000000000000000000000000000000000000000005f521660045260245ffd5b90919293945051926060602060405161209d81610fc0565b6040516120a981611009565b6040516120b58161105d565b8481526040516120c481610fc0565b5f81525f85820152848201526040516120dc81610fc0565b5f81525f8582015260408201525f858201525f60808201525f60a08201525f60c0820152815261210a612998565b83820152612116612998565b60408201525f8482015260405161212c81610fc0565b5f81525f84820152608082015260405161214581610fc0565b5f81525f8482015260a08201528152015283518401936020818603126101de5760208101519067ffffffffffffffff82116101de5701936020858203126101de576040519461219386611025565b60208101519067ffffffffffffffff82116101de5760206121bc92816121e995019201016129d0565b808652517f00000000000000000000000000000000000000000000000000000000000000008082146111c6565b602084510151948551860160208101966020818303126101de57602081015167ffffffffffffffff81116101de570190604090829003126101de576040519661223188610fc0565b602082015167ffffffffffffffff81116101de57816020612254928501016113db565b885260408201519167ffffffffffffffff83116101de576122789201602001612a36565b936122926020880195808752518015158061201657612b83565b60208101956122a087611caa565b67ffffffffffffffff60a08a5101519181602084015116918291161480612586575b6122cb85611caa565b9267ffffffffffffffff6122de8c611caa565b915116911561253857505050506122f99061159b89516118f0565b6123038751611983565b6003811015610c4f5780612507575061231b86611caa565b67ffffffffffffffff8060035460401c169116116124b4575b5060408651015160405161237d8161157860208201948591909160408060608301946fffffffffffffffffffffffffffffffff8151168452602081015160208501520151910152565b51902067ffffffffffffffff61239287611caa565b165f52600560205260405f20555b5f805b8551805183101561248957611f0b836123bb9261178a565b1561247f5750633b9aca0096936fffffffffffffffffffffffffffffffff9693611f76879460206123f261240a9660409b5161178a565b51015190815181518082149182612469575050612bc1565b6124318351858101519067ffffffffffffffff602060a08185015193015101511690612e2a565b516001815111612447575b505051015151160490565b61245361246292611caa565b90858585510151511691612eba565b5f8061243c565b9091506020840120906020830120145f80611f6f565b90600101906123a3565b50604095925061240a9150936fffffffffffffffffffffffffffffffff9693633b9aca009895612c0f565b6124c06124f591611caa565b67ffffffffffffffff167fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000006003541617600355565b6125016115e086611caa565b5f612334565b60019150036123a0577f59bc8fd3000000000000000000000000000000000000000000000000000000005f5260045ffd5b6084945067ffffffffffffffff9081604051957fb8d8167e00000000000000000000000000000000000000000000000000000000875216600486015216602484015260448301526064820152fd5b5061259084611caa565b67ffffffffffffffff808451169116146122c2565b505090916125b860206125cd9201611caa565b91604051946125c686610fc0565b3691611cbf565b8352602083019182526040516125ec81611578866020830195866128ca565b5190205c915190518215612606575050633b9aca00900490565b9061265a612648926040519384937ff06fc33b000000000000000000000000000000000000000000000000000000008552604060048601526044850190610e5a565b90600319848303016024850152610e35565b0390fd5b906fffffffffffffffffffffffffffffffff633b9aca0091160442811161289b5780420342811161286e576107081061283f57508051516126a0600154610eb2565b1480612818575b815190156127d85750602081015160ff815116906002549160ff83169283821492836127bf575b6020015160ff169215612777575050505063ffffffff606082015116906004549163ffffffff831680820361274957505063ffffffff608081920151169160201c1680820361271b575050565b7f1eb5c1eb000000000000000000000000000000000000000000000000000000005f5260045260245260445ffd5b7f73b1bde3000000000000000000000000000000000000000000000000000000005f5260045260245260445ffd5b6084945060ff90604051947fd382033a000000000000000000000000000000000000000000000000000000008652600486015260081c16602484015260448301526064820152fd5b6020810151600883901c60ff90811691161493506126ce565b61265a906040519182917ff6b6676b0000000000000000000000000000000000000000000000000000000083526040600484015261264860448401610f03565b508051602081519101206040516128328161059a81610f03565b60208151910120146126a7565b7f12e74add000000000000000000000000000000000000000000000000000000005f524260045260245260445ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b7f20daedb6000000000000000000000000000000000000000000000000000000005f524260045260245260445ffd5b9067ffffffffffffffff90939293168152604060208201526080810190835191604080830152825180915260a0820190602060a08260051b8501019401915f905b82821061294f57505050506020611113939401519060607fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc082850301910152610e35565b9091929460208061298a837fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6089600196030186528951610e35565b97019201920190929161290b565b604051906129a582611041565b5f6040838281528260208201520152565b9080601f830112156101de578151611113926020016111fd565b91906060838203126101de57604051906129e982611041565b819380518352602081015167ffffffffffffffff81116101de5782612a0f9183016129b6565b602084015260408101519167ffffffffffffffff83116101de5760409261128792016129b6565b9080601f830112156101de57815191612a4e83611772565b92612a5c6040519485611079565b80845260208085019160051b830101918383116101de5760208101915b838310612a8857505050505090565b825167ffffffffffffffff81116101de578201906040601f1983880301126101de5760405190612ab782610fc0565b602083015167ffffffffffffffff81116101de5760209084010187601f820112156101de578051612ae781611772565b91612af56040519384611079565b81835260208084019260051b820101918a83116101de5760208201905b838210612b555750505050825260408301519167ffffffffffffffff83116101de57612b46886020809695819601016129b6565b83820152815201920191612a79565b815167ffffffffffffffff81116101de57602091612b788e8480948801016129b6565b815201910190612b12565b15612b8b5750565b7fb0369c31000000000000000000000000000000000000000000000000000000005f52600452600160245261ffff60445260645ffd5b91909115612bcd575050565b9061265a612648926040519384937f5f1ca381000000000000000000000000000000000000000000000000000000008552604060048601526044850190610e35565b91909115612c1b575050565b604051907ffef760c700000000000000000000000000000000000000000000000000000000825280602483016020600485015252604482019260448260051b84010191815f907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1813603015b838310612c945786860387fd5b90919293947fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbc8782030188528535828112156101de578301906020823592019167ffffffffffffffff81116101de5780360383136101de57602082601f19601f8480600198869897879852868601375f85828601015201160101970198019301919096939296612c87565b90612d5c5750805115612d3457602081519101fd5b7fd6bda275000000000000000000000000000000000000000000000000000000005f5260045ffd5b81511580612daf575b612d6d575090565b73ffffffffffffffffffffffffffffffffffffffff907f9996b315000000000000000000000000000000000000000000000000000000005f521660045260245ffd5b50803b15612d65565b908151815103611bdc575f5b8251811015612e2257612dd7818461178a565b5151612de3828461178a565b515103612e1b57612df4818461178a565b5160208151910120612e06828461178a565b516020815191012003612e1b57600101612dc4565b5050505f90565b505050600190565b91612e7f60209261197960405185810190612e7681611578888591909160408060608301946fffffffffffffffffffffffffffffffff8151168452602081015160208501520151910152565b51902091611686565b0151808203612e8c575050565b7f4b2dfe98000000000000000000000000000000000000000000000000000000005f5260045260245260445ffd5b929190925f5b8451811015612ef8578083612ed76001938861178a565b51604051612eee81611578602082019489866128ca565b5190205d01612ec0565b505050905056fea164736f6c634300081c000a","sourceMap":"1355:25496:45:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;1355:25496:45;;;;;;;;4960:23;;;;1355:25496;;;;;;4960:23;1355:25496;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4960:23;1355:25496;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;4960:23;-1:-1:-1;;4960:23:45;;;;;;:::i;:::-;1355:25496;;;;;4960:23;1355:25496;;4960:23;1355:25496;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;1355:25496:45;;;;;;;;1648:48;1355:25496;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;9619:70;;1355:25496;;;26731:42;26727:105;;1355:25496;9619:70;;;;:::i;:::-;9699:196;9720:30;;1355:25496;9759:25;9720:64;;;9699:196;:::i;:::-;1355:25496;9982:30;;:43;;1355:25496;;9971:95;;1355:25496;9971:95;;1355:25496;;;;;;;;;9971:95;;1355:25496;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;;;;;;;;19046:18;1355:25496;;;;19066:11;;;:::i;:::-;19282:29;1355:25496;;;;;;;;19271:41;;;1355:25496;;;;;;;;;;;;;;;;;;;;;;;19271:41;;;;1355:25496;;19271:41;:::i;:::-;1355:25496;19261:52;;19381:21;;1355:25496;19381:36;1355:25496;;;19359:59;;;:::i;:::-;19428:179;;19449:54;;;;19428:179;:::i;:::-;19811:29;1355:25496;;;;;;;;19800:41;;;1355:25496;;;;;;;;;;;;;;;;;;;;;;;19800:41;;;;1355:25496;;19800:41;:::i;:::-;1355:25496;19790:52;;19910:21;;1355:25496;19910:36;1355:25496;;;19888:59;;;:::i;:::-;19957:179;;19978:54;;;;19957:179;:::i;:::-;10139:30;;;;:::i;:::-;1355:25496;;;;;;;;;26727:105;26800:20;;:::i;:::-;26727:105;;1355:25496;;;;;;;;;;;4723:26:92;1355:25496:45;;;:::i;:::-;4693:18:92;2484:4;4693:18;;3877:6;1355:25496:45;3877:6:92;1355:25496:45;;3877:22:92;1355:25496:45;3877:6:92;1355:25496:45;3877:22:92;1355:25496:45;3786:120:92;;4693:18;2484:4;:::i;:::-;4723:26;:::i;:::-;1355:25496:45;;;;;;-1:-1:-1;;1355:25496:45;;;;;;;;1551:51;1355:25496;;;;;;;;-1:-1:-1;;1355:25496:45;;;;;;;;;;;;:::i;:::-;;;;:::i;:::-;;;;;;;:::i;:::-;2095:51;1355:25496;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;2095:51;1355:25496;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;1355:25496:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;-1:-1:-1;;1355:25496:45;;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;-1:-1:-1;;1355:25496:45;;;:::i;:::-;;;;;;;;;;1528:13:123;;;1355:25496:45;1560:3:123;1543:15;;;;;;1349:26;1355:25496:45;4107:55:118;1355:25496:45;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;1355:25496:45;;;;;;:::i;:::-;4065:25:118;1629:4:123;;4065:25:118;;1355:25496:45;;;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;;;1629:4:123;4107:55:118;:::i;:::-;1579:88:123;;;;:::i;:::-;;;;;;:::i;:::-;;1355:25496:45;1528:13:123;;1355:25496:45;;;;;1543:15:123;1355:25496:45;;;;;;;;;;1543:15:123;1355:25496:45;:::i;:::-;;;;;;;;;;;;;;;;;;-1:-1:-1;;1355:25496:45;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;2930:29:92;1355:25496:45;-1:-1:-1;1355:25496:45;;;;;;-1:-1:-1;1355:25496:45;;;;;;;;;;;;;;;;-1:-1:-1;;1355:25496:45;;;;;;;;;;;;;;;;-1:-1:-1;;1355:25496:45;;;;;;;;;;;;;;;;;;;;;;;;;26731:42;26727:105;;1355:25496;7188:10;;;;;;;;:::i;:::-;:21;;;1355:25496;;;7253:10;;;;7241:64;7253:10;;:::i;:::-;7265:16;1355:25496;7294:10;7283:9;;;;;;:::i;:::-;7294:10;;;;:::i;:::-;1355:25496;;;:::i;:::-;7265:16;;7241:64;;:::i;:::-;1355:25496;;;;;;;;;;;;;26727:105;26800:20;;:::i;:::-;26727:105;;1355:25496;;;;;-1:-1:-1;;1355:25496:45;;;;;;;;2576:33;1355:25496;;;;;;;;-1:-1:-1;;1355:25496:45;;;;;;;;;;;;;;;;-1:-1:-1;;1355:25496:45;;;;;;;;;;;;;;;;;;;;;;;;;;;7544:63;;1355:25496;;;;26731:42;26727:105;;1355:25496;7586:9;7556:10;;;;:::i;:::-;7586:9;;;;;;;;:::i;:::-;1355:25496;;;7568:16;1355:25496;;;;;;;:::i;:::-;;;;7568:16;7544:63;;:::i;26727:105::-;26800:20;;:::i;:::-;26727:105;;1355:25496;;;;;;;:::i;:::-;735:10:120;1355:25496:45;;;5397:34:92;5393:102;;5505:37;;;:::i;5393:102::-;5454:30;1355:25496:45;5454:30:92;1355:25496:45;;5454:30:92;1355:25496:45;;;;;-1:-1:-1;;1355:25496:45;;;;;;;;1854:50;1355:25496;;;;;;;4306:25:92;1355:25496:45;;;:::i;:::-;4276:18:92;2484:4;4276:18;;3877:6;1355:25496:45;3877:6:92;1355:25496:45;;3877:22:92;1355:25496:45;3877:6:92;1355:25496:45;3877:22:92;1355:25496:45;3786:120:92;;2484:4;4306:25;:::i;1355:25496:45:-;;;;;-1:-1:-1;;1355:25496:45;;;;;;;;2472:10;1355:25496;;;;;;;;-1:-1:-1;;1355:25496:45;;;;;;;;;3877:6:92;1355:25496:45;3877:6:92;1355:25496:45;;3877:22:92;1355:25496:45;3877:6:92;1355:25496:45;3877:22:92;1355:25496:45;3786:120:92;;1355:25496:45;;;;;-1:-1:-1;;1355:25496:45;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;5401:1560;;1355:25496;;;26731:42;26727:105;;5401:1560;:::i;:::-;1355:25496;;;;;;;;;;;;;;;;;;;;;;;26727:105;26800:20;;:::i;:::-;5401:1560;:::i;1355:25496::-;;;;;-1:-1:-1;;1355:25496:45;;;;;;;;;1950:38;1355:25496;;;;;;;;;-1:-1:-1;;1355:25496:45;;;;;;;;1742:66;1355:25496;;;;;;;;-1:-1:-1;;1355:25496:45;;;;;;;;;;;;;;;;2649:47:92;2664:32;1355:25496:45;2649:47:92;;:87;;;;;1355:25496:45;;;;;;;2649:87:92;844:25:130;829:40;;;2649:87:92;;;1355:25496:45;;;-1:-1:-1;;1355:25496:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;-1:-1:-1;;1355:25496:45;;;;;;;;;;;;;;;;;;;:::o;:::-;;-1:-1:-1;;1355:25496:45;;;;;;;;;;;;;;;;;-1:-1:-1;1355:25496:45;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1355:25496:45;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;-1:-1:-1;;1355:25496:45;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;2095:51;1355:25496;;;;;;;:::i;:::-;;;;;2095:51;1355:25496;;;2095:51;;;;1355:25496;;;;;;;:::o;:::-;2095:51;-1:-1:-1;1355:25496:45;;;;;-1:-1:-1;1355:25496:45;;-1:-1:-1;1355:25496:45;;;;;;;;;;;;;;:::o;:::-;2095:51;1355:25496;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;:::o;:::-;;-1:-1:-1;1355:25496:45;;;;;-1:-1:-1;1355:25496:45;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;:::o;:::-;;;-1:-1:-1;;1355:25496:45;;;;;;;;;;;;;;;;:::o;:::-;;-1:-1:-1;1355:25496:45;;;:::o;:::-;;;;;;;;-1:-1:-1;;1355:25496:45;;;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;-1:-1:-1;1355:25496:45;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;:::i;:::-;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;:::o;:::-;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;-1:-1:-1;1355:25496:45;;;;;;:::o;:::-;;;;;;;;;;:::o;:::-;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;:::i;:::-;;;;:::o;:::-;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;1355:25496:45;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;;;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;;;;;;;;:::i;:::-;;;;;;;:::i;5401:1560::-;5644:58;5401:1560;5644:58;;;;:::i;:::-;5712:186;5733:24;;1355:25496;5766:26;5733:59;;;5712:186;:::i;:::-;5985:37;:24;;:37;;1355:25496;;5974:89;;1355:25496;5985:37;1355:25496;;;;;;5985:37;5974:89;;1355:25496;;;;;;;;5974:89;5985:37;5974:89;;;1355:25496;;;;:::i;:::-;6108:6;;;;:::i;:::-;6171:26;;;:::i;:::-;1355:25496;;;;;;;6211:52;;;6344:16;;1355:25496;5985:37;1355:25496;6344:16;6899:24;6344:16;;;;;:31;;;;1355:25496;;;;;;;;6344:73;;6340:155;;6207:666;6586:24;;;;1355:25496;;6575:36;;;;;;;;1355:25496;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6575:36;;-1:-1:-1;;6575:36:45;;;;;;:::i;:::-;1355:25496;6565:47;;6530:16;;:31;1355:25496;;-1:-1:-1;1355:25496:45;6508:21;5985:37;1355:25496;;-1:-1:-1;1355:25496:45;;6207:666;6899:24;;:::i;6340:155::-;1355:25496;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6340:155;;;;6207:666;-1:-1:-1;1355:25496:45;6633:58;;1355:25496;;6899:24;1355:25496;;;6707:20;1355:25496;;;6707:20;1355:25496;6207:666;;6629:244;6771:34;6755:50;;6751:122;;6899:24;6629:244;6207:666;;6751:122;6821:41;;6771:34;6821:41;:::o;5036:228::-;1355:25496;;-1:-1:-1;1355:25496:45;5145:21;1355:25496;;;-1:-1:-1;1355:25496:45;;5200:9;;1355:25496;;5036:228;:::o;1355:25496::-;;-1:-1:-1;1355:25496:45;;-1:-1:-1;1355:25496:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;3175:103:92;735:10:120;2930:6:92;1355:25496:45;;;;;;;;;;;;3495:23:92;3491:108;;3175:103::o;3491:108::-;3541:47;2930:6;3541:47;735:10:120;3541:47:92;1355:25496:45;2576:33;1355:25496;;;2930:6:92;3541:47;3175:103;1355:25496:45;2930:6:92;1355:25496:45;2930:6:92;1355:25496:45;;;2930:6:92;1355:25496:45;;735:10:120;1355:25496:45;-1:-1:-1;1355:25496:45;;;;;-1:-1:-1;1355:25496:45;;;3495:23:92;3491:108;;3175:103;:::o;3491:108::-;3541:47;2930:6;3541:47;735:10:120;3541:47:92;1355:25496:45;;;;2930:6:92;3541:47;1355:25496:45;;;;;;:::o;:::-;;;;;;;;;;;18217:570;18605:175;18217:570;18383:11;18363:18;;1355:25496;18383:11;;;1355:25496;;18383:11;;:::i;:::-;18537:58;1355:25496;18462:28;18559:20;18462:28;;;;1355:25496;;18451:40;;;;;;;;1355:25496;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18451:40;1355:25496;18441:51;;18559:20;;;:35;1355:25496;;18537:58;:::i;:::-;18626:52;;;18605:175;:::i;:::-;18217:570::o;22962:1028::-;1355:25496;23184:31;:16;;;;:31;1355:25496;;;;23162:21;23184:31;1355:25496;;;;;23230:32;;23226:758;23230:32;;;23350:43;;1355:25496;23350:43;:::o;23226:758::-;1355:25496;23470:24;;;;;1355:25496;;23459:36;;;23184:31;23459:36;;;;1355:25496;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23459:36;1355:25496;23449:47;;23427:69;;;;:165;;;23226:758;-1:-1:-1;;23410:574:45;;;23768:42;23761:49;:::o;23410:574::-;23939:34;23932:41;:::o;23427:165::-;1355:25496;23516:28;;;23184:31;23516:28;;;;1355:25496;;23558:24;;1355:25496;;-1:-1:-1;23516:76:45;23427:165;;;;24151:152;1355:25496;24231:8;1355:25496;;;;24284:11;24264:18;;;;24284:11;;;24231:65;;;;;;-1:-1:-1;1355:25496:45;;;;24284:11;1355:25496;24231:65;;;;;;;1355:25496;24231:65;;;;;1355:25496;;;;;;;;;;;:::i;:::-;;-1:-1:-1;;1355:25496:45;;;;;;;;;:::i;:::-;24231:65;;;;;;;;;;24151:152;:::o;24231:65::-;-1:-1:-1;24231:65:45;;;:::i;:::-;24284:11;1355:25496;;-1:-1:-1;1355:25496:45;;;;;6155:316:92;1355:25496:45;;;;;;;;;;;;-1:-1:-1;1355:25496:45;;;;;-1:-1:-1;1355:25496:45;;;6252:23:92;6248:217;1355:25496:45;;;;;;;;;;;;;;;-1:-1:-1;1355:25496:45;;;;-1:-1:-1;1355:25496:45;6323:4:92;1355:25496:45;;;;;;;;735:10:120;1355:25496:45;;6346:40:92;;1355:25496:45;6346:40:92;;6323:4;6400:11;:::o;6248:217::-;6442:12;;1355:25496:45;6442:12:92;:::o;6708:317::-;1355:25496:45;;;;;;;;;;;;-1:-1:-1;1355:25496:45;;;;;-1:-1:-1;1355:25496:45;;;6802:217:92;1355:25496:45;;;;;;;;;;;;;;;-1:-1:-1;1355:25496:45;;;;-1:-1:-1;1355:25496:45;;;;;;;;735:10:120;1355:25496:45;;6900:40:92;;1355:25496:45;6900:40:92;;1355:25496:45;6954:11:92;:::o;1355:25496:45:-;;;;;;;;;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;8191:1064;;;;;;;8421:17;;8417:181;;8665:52;;1355:25496;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;:::i;:::-;;;;:::i;:::-;8731:83;;8876:21;;1355:25496;;;10929:60;;1355:25496;10929:60;;1355:25496;;;;;;;;;10929:60;;1355:25496;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;:::i;:::-;;;;;;;;10999:160;11020:14;;1355:25496;11043:23;11020:46;;;10999:160;:::i;:::-;1355:25496;11242:14;;:27;;1355:25496;;;11231:75;;1355:25496;;;;;;;;;11231:75;;1355:25496;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;11231:75;1355:25496;11231:75;;;1355:25496;;;;:::i;:::-;;11316:177;1355:25496;;;;;;;;11337:25;;;:70;;;11316:177;:::i;:::-;1355:25496;;11663:3;11640:14;;1355:25496;;11636:25;;;;;11703:17;;11691:43;11703:17;;:::i;:::-;;:22;1355:25496;;;;;:::i;:::-;11691:43;;:::i;:::-;11690:44;11686:99;;11824:14;;;12132:50;12335:14;11824;1355:25496;11824:14;;;11865:185;12280:27;11824:14;1355:25496;26385:3;11824:14;;;;:17;:14;;:17;:::i;:::-;;:23;;1355:25496;;;;;11894:30;;;:72;;;;11663:3;11865:185;;;:::i;:::-;1355:25496;12132:50;:::i;:::-;1355:25496;12252:26;;;;;;:::i;:::-;12280:27;;;;:::i;12335:14::-;12464;1355:25496;;;12464:25;12460:152;;11616:503;12651:27;;;1355:25496;;;8830:81;:::o;12460:152::-;12519:26;12505:96;12519:26;;:::i;:::-;12563:27;;;;1355:25496;;12505:96;;:::i;:::-;12460:152;;;;11894:72;1355:25496;;;;;;11928:16;1355:25496;;;;11948:18;11928:38;11894:72;;;;11686:99;11758:8;1355:25496;;11621:13;;;11636:25;;12280:27;11636:25;;1355:25496;11636:25;;;12132:50;12335:14;11636:25;1355:25496;11636:25;;;26385:3;11636:25;;;12132:50;:::i;11337:70::-;11366:41;1355:25496;11366:41;;;11316:177;:::i;8727:421::-;1355:25496;;;;;;;;;;;;:::i;:::-;;;;:::i;:::-;8932:98;8928:220;;1355:25496;8727:421;1355:25496;;;;:::i;:::-;;;;:::i;:::-;9188:60;1355:25496;9188:60;1355:25496;9188:60;1355:25496;;;9188:60;8928:220;9102:21;;;;;;;1355:25496;;;;;;;;:::i;:::-;;;;;;:::i;:::-;;;;;;:::i;:::-;;;;;;;;;:::i;:::-;-1:-1:-1;1355:25496:45;;-1:-1:-1;1355:25496:45;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;1355:25496:45;;-1:-1:-1;1355:25496:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;1355:25496:45;;-1:-1:-1;1355:25496:45;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;1355:25496:45;;-1:-1:-1;1355:25496:45;;;;;;;;;;;;;;13696:75;;1355:25496;;;;;;;;;13696:75;;1355:25496;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;13696:75;;13785:208;13696:75;;1355:25496;;;;:::i;:::-;;;;;13833:41;13810:64;;;13785:208;:::i;:::-;1355:25496;14028:14;;:27;;1355:25496;;;14017:95;;1355:25496;14017:95;;1355:25496;;;;;;;;;14017:95;;1355:25496;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;:::i;:::-;;14126:189;1355:25496;;;;;;;;14151:25;;;:70;;;14126:189;:::i;:::-;1355:25496;14355:26;;;;;;:::i;:::-;1355:25496;;14385:25;;:35;;:50;;1355:25496;14385:50;;1355:25496;;;;;;14355:80;:184;;;8928:220;14598:26;;;:::i;:::-;14646;1355:25496;14646:26;;;:::i;:::-;1355:25496;;;;;;;14897:25;;;;14954:14;14897:25;;;;;:::i;14954:14::-;15080:45;15099:25;;15080:45;:::i;:::-;1355:25496;;;;;;15143:52;;;15284:26;;;;:::i;:::-;1355:25496;;;;;;;;;15284:68;15280:153;;15139:599;15543:25;1355:25496;15543:25;;:43;;1355:25496;;15532:55;;;1355:25496;15532:55;;;;1355:25496;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15532:55;1355:25496;15522:66;;1355:25496;15472:26;;;:::i;:::-;1355:25496;;;15450:21;1355:25496;;;;;;15139:599;1355:25496;;15927:3;15904:14;;1355:25496;;15900:25;;;;;15967:17;;15955:43;15967:17;;:::i;15955:43::-;15954:44;15950:99;;16088:14;26385:3;16088:14;;1355:25496;16088:14;;16129:185;16088:14;;1355:25496;16088:17;16396:50;16088:14;1355:25496;16088:14;;:17;:::i;:::-;;:23;;1355:25496;;;;;16158:30;;;:72;;;;16129:185;;;:::i;16396:50::-;16632:43;16506:25;;:43;;;;:48;1355:25496;;;16506:48;;;1355:25496;16568:35;;;:50;1355:25496;;16632:43;;:::i;:::-;16799:14;1355:25496;;;16799:25;16795:198;;15880:503;17032:25;;;:43;;1355:25496;;;9046:91;:::o;16795:198::-;16871:26;16840:142;16871:26;;:::i;:::-;16915:25;;;;;:43;;1355:25496;;16840:142;;:::i;:::-;16795:198;;;;16158:72;1355:25496;;;;;;16192:16;1355:25496;;;;16212:18;16192:38;16158:72;;;;15950:99;16022:8;1355:25496;;15885:13;;;15900:25;;1355:25496;15900:25;;;16396:50;15900:25;;;1355:25496;15900:25;;26385:3;15900:25;;16396:50;:::i;15280:153::-;1355:25496;;;;:::i;:::-;;;;;;;;;;;;;;;;:::i;:::-;15280:153;;;15139:599;1355:25496;;;15613:58;15139:599;15609:129;15698:25;1355:25496;15698:25;;1355:25496;15698:25;1355:25496;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14355:184;14459:26;;;;:::i;:::-;1355:25496;;;;;;;14459:80;14355:184;;8417:181;8522:26;;;;;;1355:25496;8522:26;;;:::i;:::-;1355:25496;;;;;;;:::i;:::-;;;;:::i;:::-;;;8522:26;8550:35;;1355:25496;;;;;25522:31;;;;8522:26;25522:31;;;;;:::i;:::-;1355:25496;25512:42;;4288:69:128;25671:11:45;;25684:12;;25632:14;;1355:25496;;8489:98;;26385:3;8489:98;1355:25496;8482:105;:::o;1355:25496::-;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;-1:-1:-1;;1355:25496:45;;;;;;;;;:::i;:::-;;;;20400:2140;;1355:25496;26385:3;20400:2140;1355:25496;;20608:15;20583:40;;1355:25496;;20608:15;;1355:25496;20608:15;1355:25496;;;;2472:10;-1:-1:-1;1355:25496:45;;21386:25;;;1355:25496;;21429:11;1355:25496;;:::i;:::-;21380:76;:180;;;20400:2140;21611:25;;1355:25496;;;;21678:28;;;;;1355:25496;;;;;21720:22;1355:25496;;;;;21678:74;;;;:172;;;;20400:2140;21678:28;22062:40;1355:25496;;;;;;;22157:32;;;;1355:25496;22157:32;;;1355:25496;;;22193:26;1355:25496;;;;;22157:62;;;1355:25496;;22358:33;;1355:25496;22358:33;;;;1355:25496;;;21678:28;1355:25496;;22358:64;;;1355:25496;;20400:2140;;:::o;1355:25496::-;;-1:-1:-1;1355:25496:45;22193:26;1355:25496;;;;-1:-1:-1;1355:25496:45;;;-1:-1:-1;1355:25496:45;22193:26;1355:25496;;;;-1:-1:-1;1355:25496:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21678:172;:28;21772:40;;1355:25496;;;;;;;;;;;21772:78;;-1:-1:-1;21678:172:45;;1355:25496;;;;;;;;;;;;;;;;;;;;;:::i;21380:180::-;21492:25;;;1355:25496;;;;;21476:43;1355:25496;;;;;;;:::i;:::-;;;;;;21523:37;21476:84;21380:180;;1355:25496;;-1:-1:-1;1355:25496:45;20608:15;1355:25496;;;;;-1:-1:-1;1355:25496:45;;;-1:-1:-1;1355:25496:45;;;;;-1:-1:-1;1355:25496:45;;;-1:-1:-1;1355:25496:45;20608:15;1355:25496;;;;;-1:-1:-1;1355:25496:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;1355:25496:45;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;-1:-1:-1;;1355:25496:45;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::o;:::-;;;;;;8961:69;1355:25496;;14284:16;1355:25496;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1355:25496:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;1355:25496:45;;;;;;;;;;;;;;;-1:-1:-1;1355:25496:45;;;;;;;;;;;;;;;;;;;;;;;;4437:582:118;;4609:8;;-1:-1:-1;1355:25496:45;;5690:21:118;:17;;5815:105;;;;;;5686:301;5957:19;5710:1;5957:19;;5710:1;5957:19;4605:408;1355:25496:45;;4857:22:118;:49;;;4605:408;4853:119;;4985:17;;:::o;4853:119::-;1355:25496:45;4933:24:118;;4878:1;4933:24;1355:25496:45;4933:24:118;1355:25496:45;;4878:1:118;4933:24;4857:49;4883:18;;;:23;4857:49;;358:427:54;;1355:25496:45;;;;452:20:54;448:63;;1355:25496:45;554:3:54;1355:25496:45;;540:12:54;;;;;577:4;;;;:::i;:::-;;1355:25496:45;592:4:54;;;;:::i;:::-;;1355:25496:45;577:26:54;573:77;;677:4;;;;:::i;:::-;;1355:25496:45;;;;;667:15:54;696:4;;;;:::i;:::-;;1355:25496:45;;;;;686:15:54;667:34;663:85;;1355:25496:45;;525:13:54;;663:85;721:12;;;1355:25496:45;721:12:54;:::o;540:::-;;;;1355:25496:45;358:427:54;:::o;17339:759:45:-;;17732:177;17609:33;17339:759;17688:34;1355:25496;;17609:33;;;;;;;;;1355:25496;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17609:33;1355:25496;17599:44;;17688:34;;:::i;17732:177::-;17965:26;1355:25496;17941:50;;;1355:25496;;17339:759;;:::o;1355:25496::-;;-1:-1:-1;1355:25496:45;;;;;;-1:-1:-1;1355:25496:45;24776:318;;;;;24914:1;24937:3;1355:25496;;24917:18;;;;;25011:10;;;1355:25496;25011:10;;;:::i;:::-;;1355:25496;;24987:35;;;;;;;;;;:::i;:::-;1355:25496;24977:46;;4520:68:128;1355:25496:45;24902:13;;24917:18;;;;;;24776:318::o","linkReferences":{},"immutableReferences":{"10299":[{"start":1367,"length":32},{"start":5250,"length":32}],"10302":[{"start":505,"length":32},{"start":7742,"length":32}],"10305":[{"start":3312,"length":32},{"start":8642,"length":32}],"10308":[{"start":672,"length":32},{"start":2814,"length":32}],"10312":[{"start":3253,"length":32},{"start":6743,"length":32}]}},"methodIdentifiers":{"ALLOWED_SP1_CLOCK_DRIFT()":"2c3ee474","DEFAULT_ADMIN_ROLE()":"a217fddf","MEMBERSHIP_PROGRAM_VKEY()":"e45a6d0d","MISBEHAVIOUR_PROGRAM_VKEY()":"314d4dff","PROOF_SUBMITTER_ROLE()":"5972185a","UPDATE_CLIENT_AND_MEMBERSHIP_PROGRAM_VKEY()":"0225293e","UPDATE_CLIENT_PROGRAM_VKEY()":"ca7242f9","VERIFIER()":"08c84e70","clientState()":"bd3ce6b0","getClientState()":"ef913a4b","getConsensusStateHash(uint64)":"23842fb8","getRoleAdmin(bytes32)":"248a9ca3","grantRole(bytes32,address)":"2f2ff15d","hasRole(bytes32,address)":"91d14854","misbehaviour(bytes)":"ddba6537","multicall(bytes[])":"ac9650d8","renounceRole(bytes32,address)":"36568abe","revokeRole(bytes32,address)":"d547741f","supportsInterface(bytes4)":"01ffc9a7","updateClient(bytes)":"0bece356","verifyMembership((bytes,(uint64,uint64),bytes[],bytes))":"682ed5f0","verifyNonMembership((bytes,(uint64,uint64),bytes[]))":"4d6d9ffb"},"rawMetadata":"{\"compiler\":{\"version\":\"0.8.28+commit.7893614a\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"updateClientProgramVkey\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"membershipProgramVkey\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"updateClientAndMembershipProgramVkey\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"misbehaviourProgramVkey\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"sp1Verifier\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"_clientState\",\"type\":\"bytes\"},{\"internalType\":\"bytes32\",\"name\":\"_consensusState\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"roleManager\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"AccessControlBadConfirmation\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"internalType\":\"bytes32\",\"name\":\"neededRole\",\"type\":\"bytes32\"}],\"name\":\"AccessControlUnauthorizedAccount\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"target\",\"type\":\"address\"}],\"name\":\"AddressEmptyCode\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"CannotHandleMisbehavior\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"expected\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"actual\",\"type\":\"string\"}],\"name\":\"ChainIdMismatch\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"expected\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"actual\",\"type\":\"bytes\"}],\"name\":\"ClientStateMismatch\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"expected\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"actual\",\"type\":\"bytes32\"}],\"name\":\"ConsensusStateHashMismatch\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ConsensusStateNotFound\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"expected\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"actual\",\"type\":\"bytes32\"}],\"name\":\"ConsensusStateRootMismatch\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"EmptyValue\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"FailedCall\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"FeatureNotSupported\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"FrozenClientState\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidMembershipProof\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes[]\",\"name\":\"path\",\"type\":\"bytes[]\"},{\"internalType\":\"bytes\",\"name\":\"value\",\"type\":\"bytes\"}],\"name\":\"KeyValuePairNotInCache\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"length\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"min\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"max\",\"type\":\"uint256\"}],\"name\":\"LengthIsOutOfRange\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes[]\",\"name\":\"path\",\"type\":\"bytes[]\"}],\"name\":\"MembershipProofKeyNotFound\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"expected\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"actual\",\"type\":\"bytes\"}],\"name\":\"MembershipProofValueMismatch\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"expectedRevisionNumber\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"expectedRevisionHeight\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"actualRevisionNumber\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"actualRevisionHeight\",\"type\":\"uint64\"}],\"name\":\"ProofHeightMismatch\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"now\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"proofTimestamp\",\"type\":\"uint256\"}],\"name\":\"ProofIsInTheFuture\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"now\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"proofTimestamp\",\"type\":\"uint256\"}],\"name\":\"ProofIsTooOld\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"expectedNumerator\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"expectedDenominator\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"actualNumerator\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"actualDenominator\",\"type\":\"uint256\"}],\"name\":\"TrustThresholdMismatch\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"expected\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"actual\",\"type\":\"uint256\"}],\"name\":\"TrustingPeriodMismatch\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"trustingPeriod\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"unbondingPeriod\",\"type\":\"uint256\"}],\"name\":\"TrustingPeriodTooLong\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"expected\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"actual\",\"type\":\"uint256\"}],\"name\":\"UnbondingPeriodMismatch\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint8\",\"name\":\"proofType\",\"type\":\"uint8\"}],\"name\":\"UnknownMembershipProofType\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint8\",\"name\":\"algorithm\",\"type\":\"uint8\"}],\"name\":\"UnknownZkAlgorithm\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"expected\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"actual\",\"type\":\"bytes32\"}],\"name\":\"VerificationKeyMismatch\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"previousAdminRole\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"newAdminRole\",\"type\":\"bytes32\"}],\"name\":\"RoleAdminChanged\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"RoleGranted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"RoleRevoked\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"ALLOWED_SP1_CLOCK_DRIFT\",\"outputs\":[{\"internalType\":\"uint16\",\"name\":\"\",\"type\":\"uint16\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"DEFAULT_ADMIN_ROLE\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"MEMBERSHIP_PROGRAM_VKEY\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"MISBEHAVIOUR_PROGRAM_VKEY\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"PROOF_SUBMITTER_ROLE\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"UPDATE_CLIENT_AND_MEMBERSHIP_PROGRAM_VKEY\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"UPDATE_CLIENT_PROGRAM_VKEY\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"VERIFIER\",\"outputs\":[{\"internalType\":\"contract ISP1Verifier\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"clientState\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"chainId\",\"type\":\"string\"},{\"components\":[{\"internalType\":\"uint8\",\"name\":\"numerator\",\"type\":\"uint8\"},{\"internalType\":\"uint8\",\"name\":\"denominator\",\"type\":\"uint8\"}],\"internalType\":\"struct IICS07TendermintMsgs.TrustThreshold\",\"name\":\"trustLevel\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint64\",\"name\":\"revisionNumber\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"revisionHeight\",\"type\":\"uint64\"}],\"internalType\":\"struct IICS02ClientMsgs.Height\",\"name\":\"latestHeight\",\"type\":\"tuple\"},{\"internalType\":\"uint32\",\"name\":\"trustingPeriod\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"unbondingPeriod\",\"type\":\"uint32\"},{\"internalType\":\"bool\",\"name\":\"isFrozen\",\"type\":\"bool\"},{\"internalType\":\"enum IICS07TendermintMsgs.SupportedZkAlgorithm\",\"name\":\"zkAlgorithm\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getClientState\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"revisionHeight\",\"type\":\"uint64\"}],\"name\":\"getConsensusStateHash\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"}],\"name\":\"getRoleAdmin\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"grantRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"hasRole\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"misbehaviourMsg\",\"type\":\"bytes\"}],\"name\":\"misbehaviour\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes[]\",\"name\":\"data\",\"type\":\"bytes[]\"}],\"name\":\"multicall\",\"outputs\":[{\"internalType\":\"bytes[]\",\"name\":\"results\",\"type\":\"bytes[]\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"callerConfirmation\",\"type\":\"address\"}],\"name\":\"renounceRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"revokeRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes4\",\"name\":\"interfaceId\",\"type\":\"bytes4\"}],\"name\":\"supportsInterface\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"updateMsg\",\"type\":\"bytes\"}],\"name\":\"updateClient\",\"outputs\":[{\"internalType\":\"enum ILightClientMsgs.UpdateResult\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes\",\"name\":\"proof\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"uint64\",\"name\":\"revisionNumber\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"revisionHeight\",\"type\":\"uint64\"}],\"internalType\":\"struct IICS02ClientMsgs.Height\",\"name\":\"proofHeight\",\"type\":\"tuple\"},{\"internalType\":\"bytes[]\",\"name\":\"path\",\"type\":\"bytes[]\"},{\"internalType\":\"bytes\",\"name\":\"value\",\"type\":\"bytes\"}],\"internalType\":\"struct ILightClientMsgs.MsgVerifyMembership\",\"name\":\"msg_\",\"type\":\"tuple\"}],\"name\":\"verifyMembership\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes\",\"name\":\"proof\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"uint64\",\"name\":\"revisionNumber\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"revisionHeight\",\"type\":\"uint64\"}],\"internalType\":\"struct IICS02ClientMsgs.Height\",\"name\":\"proofHeight\",\"type\":\"tuple\"},{\"internalType\":\"bytes[]\",\"name\":\"path\",\"type\":\"bytes[]\"}],\"internalType\":\"struct ILightClientMsgs.MsgVerifyNonMembership\",\"name\":\"msg_\",\"type\":\"tuple\"}],\"name\":\"verifyNonMembership\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"author\":\"srdtrk\",\"errors\":{\"AccessControlBadConfirmation()\":[{\"details\":\"The caller of a function is not the expected one. NOTE: Don't confuse with {AccessControlUnauthorizedAccount}.\"}],\"AccessControlUnauthorizedAccount(address,bytes32)\":[{\"details\":\"The `account` is missing a role.\"}],\"AddressEmptyCode(address)\":[{\"details\":\"There's no code at `target` (it is not a contract).\"}],\"CannotHandleMisbehavior()\":[{\"details\":\"Misbehavior cannot be handled in membership handler, so it is returned as an error.\"}],\"ChainIdMismatch(string,string)\":[{\"params\":{\"actual\":\"The actual chain ID.\",\"expected\":\"The expected chain ID.\"}}],\"ClientStateMismatch(bytes,bytes)\":[{\"params\":{\"actual\":\"The actual client state.\",\"expected\":\"The expected client state.\"}}],\"ConsensusStateHashMismatch(bytes32,bytes32)\":[{\"params\":{\"actual\":\"The actual consensus state hash.\",\"expected\":\"The expected consensus state hash.\"}}],\"ConsensusStateRootMismatch(bytes32,bytes32)\":[{\"params\":{\"actual\":\"The actual consensus state root.\",\"expected\":\"The expected consensus state root.\"}}],\"FailedCall()\":[{\"details\":\"A call to an address target failed. The target may have reverted.\"}],\"KeyValuePairNotInCache(bytes[],bytes)\":[{\"params\":{\"path\":\"The path of the key-value pair.\",\"value\":\"The value of the key-value pair.\"}}],\"LengthIsOutOfRange(uint256,uint256,uint256)\":[{\"params\":{\"length\":\"The length of the value.\",\"max\":\"The maximum length of the value.\",\"min\":\"The minimum length of the value.\"}}],\"MembershipProofKeyNotFound(bytes[])\":[{\"params\":{\"path\":\"The path of the key-value pair.\"}}],\"MembershipProofValueMismatch(bytes,bytes)\":[{\"params\":{\"actual\":\"The actual value.\",\"expected\":\"The expected value.\"}}],\"ProofHeightMismatch(uint64,uint64,uint64,uint64)\":[{\"params\":{\"actualRevisionHeight\":\"The actual revision height.\",\"actualRevisionNumber\":\"The actual revision number.\",\"expectedRevisionHeight\":\"The expected revision height.\",\"expectedRevisionNumber\":\"The expected revision number.\"}}],\"ProofIsInTheFuture(uint256,uint256)\":[{\"params\":{\"now\":\"The current timestamp in seconds.\",\"proofTimestamp\":\"The timestamp in the proof in seconds.\"}}],\"ProofIsTooOld(uint256,uint256)\":[{\"params\":{\"now\":\"The current timestamp in seconds.\",\"proofTimestamp\":\"The timestamp in the proof in seconds.\"}}],\"TrustThresholdMismatch(uint256,uint256,uint256,uint256)\":[{\"params\":{\"actualDenominator\":\"The actual denominator of the trust threshold.\",\"actualNumerator\":\"The actual numerator of the trust threshold.\",\"expectedDenominator\":\"The expected denominator of the trust threshold.\",\"expectedNumerator\":\"The expected numerator of the trust threshold.\"}}],\"TrustingPeriodMismatch(uint256,uint256)\":[{\"params\":{\"actual\":\"The actual trusting period in seconds.\",\"expected\":\"The expected trusting period in seconds.\"}}],\"TrustingPeriodTooLong(uint256,uint256)\":[{\"params\":{\"trustingPeriod\":\"The trusting period in seconds.\",\"unbondingPeriod\":\"The unbonding period in seconds.\"}}],\"UnbondingPeriodMismatch(uint256,uint256)\":[{\"params\":{\"actual\":\"The actual unbonding period in seconds.\",\"expected\":\"The expected unbonding period in seconds.\"}}],\"UnknownMembershipProofType(uint8)\":[{\"params\":{\"proofType\":\"The unknown membership proof type.\"}}],\"UnknownZkAlgorithm(uint8)\":[{\"params\":{\"algorithm\":\"The unknown zk algorithm.\"}}],\"VerificationKeyMismatch(bytes32,bytes32)\":[{\"params\":{\"actual\":\"The actual verification key.\",\"expected\":\"The expected verification key.\"}}]},\"events\":{\"RoleAdminChanged(bytes32,bytes32,bytes32)\":{\"details\":\"Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite {RoleAdminChanged} not being emitted to signal this.\"},\"RoleGranted(bytes32,address,address)\":{\"details\":\"Emitted when `account` is granted `role`. `sender` is the account that originated the contract call. This account bears the admin role (for the granted role). Expected in cases where the role was granted using the internal {AccessControl-_grantRole}.\"},\"RoleRevoked(bytes32,address,address)\":{\"details\":\"Emitted when `account` is revoked `role`. `sender` is the account that originated the contract call: - if using `revokeRole`, it is the admin role bearer - if using `renounceRole`, it is the role bearer (i.e. `account`)\"}},\"kind\":\"dev\",\"methods\":{\"constructor\":{\"params\":{\"_clientState\":\"The encoded initial client state.\",\"_consensusState\":\"The encoded initial consensus state.\",\"membershipProgramVkey\":\"The verification key for the verify (non)membership program.\",\"misbehaviourProgramVkey\":\"The verification key for the misbehaviour program.\",\"roleManager\":\"Manages the proof submitters and can submit proofs. Should be the ICS26Router if used in IBC.\",\"sp1Verifier\":\"The address of the SP1 verifier contract.\",\"updateClientAndMembershipProgramVkey\":\"The verification key for the update client and membership program.\",\"updateClientProgramVkey\":\"The verification key for the update client program.\"}},\"getClientState()\":{\"returns\":{\"_0\":\"The client state.\"}},\"getConsensusStateHash(uint64)\":{\"params\":{\"revisionHeight\":\"The revision height.\"},\"returns\":{\"_0\":\"The consensus state at the given revision height.\"}},\"getRoleAdmin(bytes32)\":{\"details\":\"Returns the admin role that controls `role`. See {grantRole} and {revokeRole}. To change a role's admin, use {_setRoleAdmin}.\"},\"grantRole(bytes32,address)\":{\"details\":\"Grants `role` to `account`. If `account` had not been already granted `role`, emits a {RoleGranted} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleGranted} event.\"},\"hasRole(bytes32,address)\":{\"details\":\"Returns `true` if `account` has been granted `role`.\"},\"misbehaviour(bytes)\":{\"details\":\"The misbehavior is verfied in the sp1 program. Here we only check the public values which contain the trusted headers.\",\"params\":{\"misbehaviourMsg\":\"The misbehaviour message\"}},\"multicall(bytes[])\":{\"custom:oz-upgrades-unsafe-allow-reachable\":\"delegatecall\",\"details\":\"Receives and executes a batch of function calls on this contract.\"},\"renounceRole(bytes32,address)\":{\"details\":\"Revokes `role` from the calling account. Roles are often managed via {grantRole} and {revokeRole}: this function's purpose is to provide a mechanism for accounts to lose their privileges if they are compromised (such as when a trusted device is misplaced). If the calling account had been revoked `role`, emits a {RoleRevoked} event. Requirements: - the caller must be `callerConfirmation`. May emit a {RoleRevoked} event.\"},\"revokeRole(bytes32,address)\":{\"details\":\"Revokes `role` from `account`. If `account` had been granted `role`, emits a {RoleRevoked} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleRevoked} event.\"},\"supportsInterface(bytes4)\":{\"details\":\"Returns true if this contract implements the interface defined by `interfaceId`. See the corresponding https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[ERC section] to learn more about how these ids are created. This function call must use less than 30 000 gas.\"},\"updateClient(bytes)\":{\"details\":\"This function verifies the public values and forwards the proof to the SP1 verifier.\",\"params\":{\"updateMsg\":\"The encoded update message e.g., an SP1 proof.\"},\"returns\":{\"_0\":\"The result of the update operation\"}},\"verifyMembership((bytes,(uint64,uint64),bytes[],bytes))\":{\"details\":\"Notice that this message is not view, as it may update the client state for caching purposes.\",\"params\":{\"msg_\":\"The membership message\"},\"returns\":{\"_0\":\"The unix timestamp of the verification height in the counterparty chain in seconds.\"}},\"verifyNonMembership((bytes,(uint64,uint64),bytes[]))\":{\"details\":\"Notice that this message is not view, as it may update the client state for caching purposes.\",\"params\":{\"msg_\":\"The membership message\"},\"returns\":{\"_0\":\"The unix timestamp of the verification height in the counterparty chain in seconds.\"}}},\"stateVariables\":{\"ALLOWED_SP1_CLOCK_DRIFT\":{\"return\":\"The allowed prover clock drift in seconds.\",\"returns\":{\"_0\":\"The allowed prover clock drift in seconds.\"}},\"MEMBERSHIP_PROGRAM_VKEY\":{\"return\":\"The verification key for the membership program.\",\"returns\":{\"_0\":\"The verification key for the membership program.\"}},\"MISBEHAVIOUR_PROGRAM_VKEY\":{\"return\":\"The verification key for the misbehaviour program.\",\"returns\":{\"_0\":\"The verification key for the misbehaviour program.\"}},\"PROOF_SUBMITTER_ROLE\":{\"details\":\"The proof submitter role is used to whitelist addresses that can submit proofsIf `address(0)` has this role, then anyone can submit proofsIf this client is hooked up to ICS26Router, the router must be given this role\",\"return\":\"The role identifier\",\"returns\":{\"_0\":\"The role identifier\"}},\"UPDATE_CLIENT_AND_MEMBERSHIP_PROGRAM_VKEY\":{\"return\":\"The verification key for the update client and membership program.\",\"returns\":{\"_0\":\"The verification key for the update client and membership program.\"}},\"UPDATE_CLIENT_PROGRAM_VKEY\":{\"return\":\"The verification key for the update client program.\",\"returns\":{\"_0\":\"The verification key for the update client program.\"}},\"VERIFIER\":{\"return\":\"The SP1 verifier contract.\",\"returns\":{\"_0\":\"The SP1 verifier contract.\"}},\"_consensusStateHashes\":{\"details\":\"Revision number need not be keyed as it is not allowed to change.\"}},\"title\":\"SP1 ICS07 Tendermint Light Client\",\"version\":1},\"userdoc\":{\"errors\":{\"CannotHandleMisbehavior()\":[{\"notice\":\"The error that is returned when the update client and membership program contains misbehavior.\"}],\"ChainIdMismatch(string,string)\":[{\"notice\":\"The error that is returned when the chain ID does not match the expected value.\"}],\"ClientStateMismatch(bytes,bytes)\":[{\"notice\":\"The error that is returned when the client state does not match the expected value.\"}],\"ConsensusStateHashMismatch(bytes32,bytes32)\":[{\"notice\":\"The error that is returned when the consensus state hash does not match the expected value.\"}],\"ConsensusStateNotFound()\":[{\"notice\":\"The error that is returned when the consensus state is not found.\"}],\"ConsensusStateRootMismatch(bytes32,bytes32)\":[{\"notice\":\"The error that is returned when the consensus state root does not match the expected value.\"}],\"EmptyValue()\":[{\"notice\":\"Returned when the membership value is empty.\"}],\"FeatureNotSupported()\":[{\"notice\":\"Returned when the feature is not supported.\"}],\"FrozenClientState()\":[{\"notice\":\"The error that is returned when the client state is frozen.\"}],\"InvalidMembershipProof()\":[{\"notice\":\"Returned when the membership proof is invalid.\"}],\"KeyValuePairNotInCache(bytes[],bytes)\":[{\"notice\":\"Returned when a key-value pair is not in the cache.\"}],\"LengthIsOutOfRange(uint256,uint256,uint256)\":[{\"notice\":\"The error that is returned when the length of a value is out of range.\"}],\"MembershipProofKeyNotFound(bytes[])\":[{\"notice\":\"The error that is returned when the key-value pair's path is not contained in the proof.\"}],\"MembershipProofValueMismatch(bytes,bytes)\":[{\"notice\":\"The error that is returned when the key-value pair's value does not match the expected value.\"}],\"ProofHeightMismatch(uint64,uint64,uint64,uint64)\":[{\"notice\":\"The error that is returned when the proof height does not match the expected value.\"}],\"ProofIsInTheFuture(uint256,uint256)\":[{\"notice\":\"The error that is returned when a proof is in the future.\"}],\"ProofIsTooOld(uint256,uint256)\":[{\"notice\":\"The error that is returned when a proof is too old.\"}],\"TrustThresholdMismatch(uint256,uint256,uint256,uint256)\":[{\"notice\":\"The error that is returned when the trust threshold does not match the expected value.\"}],\"TrustingPeriodMismatch(uint256,uint256)\":[{\"notice\":\"The error that is returned when the trusting period does not match the expected value.\"}],\"TrustingPeriodTooLong(uint256,uint256)\":[{\"notice\":\"The error that is returned when the trusting period is longer than the unbonding period.\"}],\"UnbondingPeriodMismatch(uint256,uint256)\":[{\"notice\":\"The error that is returned when the unbonding period does not match the expected value.\"}],\"UnknownMembershipProofType(uint8)\":[{\"notice\":\"The error that is returned when the membership proof type is unknown.\"}],\"UnknownZkAlgorithm(uint8)\":[{\"notice\":\"The error that is returned when the zk algorithm is unknown.\"}],\"VerificationKeyMismatch(bytes32,bytes32)\":[{\"notice\":\"The error that is returned when the verification key does not match the expected value.\"}]},\"kind\":\"user\",\"methods\":{\"ALLOWED_SP1_CLOCK_DRIFT()\":{\"notice\":\"Constant allowed prover clock drift in seconds.\"},\"MEMBERSHIP_PROGRAM_VKEY()\":{\"notice\":\"Immutable membership program verification key.\"},\"MISBEHAVIOUR_PROGRAM_VKEY()\":{\"notice\":\"Immutable misbehaviour program verification key.\"},\"PROOF_SUBMITTER_ROLE()\":{\"notice\":\"The role identifier for the proof submitter role\"},\"UPDATE_CLIENT_AND_MEMBERSHIP_PROGRAM_VKEY()\":{\"notice\":\"Immutable update client and membership program verification key.\"},\"UPDATE_CLIENT_PROGRAM_VKEY()\":{\"notice\":\"Immutable update client program verification key.\"},\"VERIFIER()\":{\"notice\":\"Immutable SP1 verifier contract address.\"},\"clientState()\":{\"notice\":\"The ICS07Tendermint client state\"},\"constructor\":{\"notice\":\"The constructor sets the program verification key and the initial client and consensus states.\"},\"getClientState()\":{\"notice\":\"Returns the client state.\"},\"getConsensusStateHash(uint64)\":{\"notice\":\"Returns the consensus state keccak256 hash at the given revision height.\"},\"misbehaviour(bytes)\":{\"notice\":\"Misbehaviour handling, moves the light client to the frozen state if misbehaviour is detected\"},\"updateClient(bytes)\":{\"notice\":\"Updating the client and consensus state\"},\"verifyMembership((bytes,(uint64,uint64),bytes[],bytes))\":{\"notice\":\"Querying the membership of a key-value pair\"},\"verifyNonMembership((bytes,(uint64,uint64),bytes[]))\":{\"notice\":\"Querying the non-membership of a key\"}},\"notice\":\"This contract implements an ICS07 IBC tendermint light client using SP1.\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/light-clients/sp1-ics07/SP1ICS07Tendermint.sol\":\"SP1ICS07Tendermint\"},\"evmVersion\":\"cancun\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"none\"},\"optimizer\":{\"enabled\":true,\"runs\":10000},\"remappings\":[\":@openzeppelin-contracts/=node_modules/@openzeppelin/contracts/\",\":@openzeppelin-upgradeable/=node_modules/@openzeppelin/contracts-upgradeable/\",\":@openzeppelin/=node_modules/@openzeppelin/\",\":@sp1-contracts/=node_modules/sp1-contracts/contracts/src/\",\":@uniswap/permit2/=node_modules/@uniswap/permit2/\",\":forge-std/=node_modules/forge-std/src/\",\":sp1-contracts/=node_modules/sp1-contracts/\"],\"viaIR\":true},\"sources\":{\"contracts/interfaces/ILightClient.sol\":{\"keccak256\":\"0x1caae9e4f741a86c0056d5f7713a35f3bd96db7a9fd52fc9f1cf79aad76a442f\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://4a536db3b926560f69547c17e4f451a2631ddea0f42bd224c7fd8382d74429f6\",\"dweb:/ipfs/QmcQ33kxcmmowXgMbQGTBgiKBjF7v8UiP4y73bB9hhDizC\"]},\"contracts/light-clients/sp1-ics07/SP1ICS07Tendermint.sol\":{\"keccak256\":\"0x2e03f0f1e058e7184ea70dc2a423a3d32a609620b6a1e8b764ec9c287b0b6187\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://9e3c0b2f3b3af9cfc8a3ab085e0decffcd40230a27530142293f0b79a4aefe51\",\"dweb:/ipfs/Qmf3qEAMWdiGAMEXSae6mzZ7Sncsbr4QzDC4JzMeiNwgei\"]},\"contracts/light-clients/sp1-ics07/errors/ISP1ICS07TendermintErrors.sol\":{\"keccak256\":\"0xe1a0526f9913308f761af480ef7d87091d6038659b9058f89c50083d49768db1\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://a31d6d4a059182b3dfd3e99595d82a134963c448c9152ef35b42c62ccca87635\",\"dweb:/ipfs/QmfQ2Cfa4kxWem3f88o9UnFQgL8oRU6vKkDFWSGmLsVLqN\"]},\"contracts/light-clients/sp1-ics07/interfaces/ISP1ICS07Tendermint.sol\":{\"keccak256\":\"0x0f00aea96b194d1a9db14f708f0de1fe7723fedc7b72bb8ea182e768ffc0a731\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://3111a76ebabf4b57917e93669892df895a54a93a4963e384d8c13a1c47877b44\",\"dweb:/ipfs/QmPCZ7Z4dJpowkzMhizUAW1j8QdJLD3DDjMbYq8G5VeXc1\"]},\"contracts/light-clients/sp1-ics07/msgs/IICS07TendermintMsgs.sol\":{\"keccak256\":\"0xae0ae6ff2742192ebaaee297c7d7473a1e1b4dc73393d45a944b0b7a8a647703\",\"license\":\"UNLICENSED\",\"urls\":[\"bzz-raw://43b2f6492a1f727416bbcf55876d9c08ac1f66f4724efc75b935c5022555be20\",\"dweb:/ipfs/QmfTaPFNSFuUEsEBgJjnF2Jr2knayS7YwatfjP7dgdcAyH\"]},\"contracts/light-clients/sp1-ics07/msgs/IMembershipMsgs.sol\":{\"keccak256\":\"0x9dff6833fddbc11caf27387c9f8cba5dca9d1e430c9643d4e4a2e8eb09924d96\",\"license\":\"UNLICENSED\",\"urls\":[\"bzz-raw://efa6cfc654510dfcef6f4286e3e66446082bcd5671662ae6e1c6fd0f893a5a4a\",\"dweb:/ipfs/QmRWAg1kHvmRtXgDm4ajVC7tEWQnzTWmHeHMYQJfyFuDGq\"]},\"contracts/light-clients/sp1-ics07/msgs/IMisbehaviourMsgs.sol\":{\"keccak256\":\"0x165b37d890b06eccd47558bf1efd6495e18541627758736a1f5b9c33d0333832\",\"license\":\"UNLICENSED\",\"urls\":[\"bzz-raw://15ab15cd5439147abed697bc9644b0175754845608bf3d57c81c2c864d31ce46\",\"dweb:/ipfs/QmYcV88YsM1sZCmhP8LKUFHq3hJ6bsvd66W5axBnsBBoUM\"]},\"contracts/light-clients/sp1-ics07/msgs/ISP1Msgs.sol\":{\"keccak256\":\"0x8ede29b02182df4be9c075b3b48083277e5dd93bb3e7ce1eecfea9728db49aed\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://48edb4bbcd440454fffceb4f85b83c08c3973a212239d7da07c079634fe413dd\",\"dweb:/ipfs/Qmf7ma1nXWghfZKrJJvLpPuY5aN2xZZjHY7kWP3KVFCoDJ\"]},\"contracts/light-clients/sp1-ics07/msgs/IUcAndMembershipMsgs.sol\":{\"keccak256\":\"0xef3619c79de37cabe95d9d8af9d145fc2ea2dd55137407fb4b0082b0491170d0\",\"license\":\"UNLICENSED\",\"urls\":[\"bzz-raw://93646d813cdacf5e38e609e54baa67c60d749f0f111d00cd18b003c3cb328204\",\"dweb:/ipfs/QmVcuwPujbiZ644a4jRw2V1LZxhhGsm2HKMXweVqndwUnZ\"]},\"contracts/light-clients/sp1-ics07/msgs/IUpdateClientMsgs.sol\":{\"keccak256\":\"0x370cdfca1c65f1898c7da80507e66972a6fe51a5d5c4e7aeabdd7060ce875aed\",\"license\":\"UNLICENSED\",\"urls\":[\"bzz-raw://ff34288a142b6f40d6843818b9ec0a542db016bc0d4a7be582eb2e255655c43e\",\"dweb:/ipfs/QmXwbJHDbqZdw3JTT48Le1ZWGqmKAG7omf2ePvDfBHomzj\"]},\"contracts/light-clients/sp1-ics07/utils/Paths.sol\":{\"keccak256\":\"0x0e4eec6cd6cd0ef684383946419a2bf53c8f800033acfc298db81688e5aa178b\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://824b58c13ff96b6ee38b5d25435fcc1305c45735f52df6347dba3dacdc144ffa\",\"dweb:/ipfs/QmT7qomKM46ChfVVwfBQHwjpoHW9vrG9nXkGXsPeZRLJ7w\"]},\"contracts/msgs/IICS02ClientMsgs.sol\":{\"keccak256\":\"0xb5fdb25319d5c32b3f527982d45ec1e9bec5215515581aee034d853006ea01a0\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://6b8939bf552c62c952a491008bcd9b59ab7dda20a9482bf93438e05793881542\",\"dweb:/ipfs/QmfWmzNCp8bd4pP26Lfw5HHp4dSZnCDqZDjVN7SD8P7eDh\"]},\"contracts/msgs/ILightClientMsgs.sol\":{\"keccak256\":\"0xa0565e7748b8b3284d72e1aa6ef4cc8264fcaa5f4e0761d22d64686953db6378\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://c4476010d7090bfaa74127526f2051c6bc82ff42a09b936e848880a1f15a6065\",\"dweb:/ipfs/QmY87JgRsFQXSZdGXNjNHEJCkdTHzFXH4vZEJ3q7MnHuP8\"]},\"node_modules/@openzeppelin/contracts/access/AccessControl.sol\":{\"keccak256\":\"0x1a6b4f6b7798ab80929d491b89d5427a9b3338c0fd1acd0ba325f69c6f1646af\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://7bb7f346c12a14dc622bc105ce3c47202fbc89f4b153a28a63bb68193297330c\",\"dweb:/ipfs/QmagwF8P3bUBXwdo159ueEnY9dLSvEWwK24kk2op58egwG\"]},\"node_modules/@openzeppelin/contracts/access/IAccessControl.sol\":{\"keccak256\":\"0xbff9f59c84e5337689161ce7641c0ef8e872d6a7536fbc1f5133f128887aba3c\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://b308f882e796f7b79c9502deacb0a62983035c6f6f4e962b319ba6a1f4a77d3d\",\"dweb:/ipfs/QmaWCW7ahEQqFjwhSUhV7Ae7WhfNvzSpE7DQ58hvEooqPL\"]},\"node_modules/@openzeppelin/contracts/utils/Address.sol\":{\"keccak256\":\"0x6d0ae6e206645341fd122d278c2cb643dea260c190531f2f3f6a0426e77b00c0\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://032d1201d839435be2c85b72e33206b3ea980c569d6ebf7fa57d811ab580a82f\",\"dweb:/ipfs/QmeqQjAtMvdZT2tG7zm39itcRJkuwu8AEReK6WRnLJ18DD\"]},\"node_modules/@openzeppelin/contracts/utils/Context.sol\":{\"keccak256\":\"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://6a708e8a5bdb1011c2c381c9a5cfd8a9a956d7d0a9dc1bd8bcdaf52f76ef2f12\",\"dweb:/ipfs/Qmax9WHBnVsZP46ZxEMNRQpLQnrdE4dK8LehML1Py8FowF\"]},\"node_modules/@openzeppelin/contracts/utils/Errors.sol\":{\"keccak256\":\"0x6afa713bfd42cf0f7656efa91201007ac465e42049d7de1d50753a373648c123\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://ba1d02f4847670a1b83dec9f7d37f0b0418d6043447b69f3a29a5f9efc547fcf\",\"dweb:/ipfs/QmQ7iH2keLNUKgq2xSWcRmuBE5eZ3F5whYAkAGzCNNoEWB\"]},\"node_modules/@openzeppelin/contracts/utils/Multicall.sol\":{\"keccak256\":\"0xa4c645387f16eae227cd378108e8e0a8acbcf2b600e393629bbd8422241c495f\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://5e272440acfbec7f51afdb60a42597837b267de83ba7bd08d7e4dbc40171567c\",\"dweb:/ipfs/QmPYzRwXpjUJEGRBWaSnzHz8gym1AKJ8yfoCgbo7gcwmEf\"]},\"node_modules/@openzeppelin/contracts/utils/TransientSlot.sol\":{\"keccak256\":\"0xac673fa1e374d9e6107504af363333e3e5f6344d2e83faf57d9bfd41d77cc946\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://5982478dbbb218e9dd5a6e83f5c0e8d1654ddf20178484b43ef21dd2246809de\",\"dweb:/ipfs/QmaB1hS68n2kG8vTbt7EPEzmrGhkUbfiFyykGGLsAr9X22\"]},\"node_modules/@openzeppelin/contracts/utils/introspection/ERC165.sol\":{\"keccak256\":\"0x2d9dc2fe26180f74c11c13663647d38e259e45f95eb88f57b61d2160b0109d3e\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://81233d1f98060113d9922180bb0f14f8335856fe9f339134b09335e9f678c377\",\"dweb:/ipfs/QmWh6R35SarhAn4z2wH8SU456jJSYL2FgucfTFgbHJJN4E\"]},\"node_modules/@openzeppelin/contracts/utils/introspection/IERC165.sol\":{\"keccak256\":\"0x8891738ffe910f0cf2da09566928589bf5d63f4524dd734fd9cedbac3274dd5c\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://971f954442df5c2ef5b5ebf1eb245d7105d9fbacc7386ee5c796df1d45b21617\",\"dweb:/ipfs/QmadRjHbkicwqwwh61raUEapaVEtaLMcYbQZWs9gUkgj3u\"]},\"node_modules/sp1-contracts/contracts/src/ISP1Verifier.sol\":{\"keccak256\":\"0x9e3ba64860bea920772dcf16be7946de2a2900d80bd51e9c0771184138f4f4d3\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://0ec7230ca1fdd74edc6ab597d80bb345282aed3f0db4788ed96b4cc373ff46a3\",\"dweb:/ipfs/QmXPuSS5gzxMhFKWr1gsxBVu6WHh53ZZEvWkGgzrkM6Y7Q\"]}},\"version\":1}","metadata":{"compiler":{"version":"0.8.28+commit.7893614a"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"bytes32","name":"updateClientProgramVkey","type":"bytes32"},{"internalType":"bytes32","name":"membershipProgramVkey","type":"bytes32"},{"internalType":"bytes32","name":"updateClientAndMembershipProgramVkey","type":"bytes32"},{"internalType":"bytes32","name":"misbehaviourProgramVkey","type":"bytes32"},{"internalType":"address","name":"sp1Verifier","type":"address"},{"internalType":"bytes","name":"_clientState","type":"bytes"},{"internalType":"bytes32","name":"_consensusState","type":"bytes32"},{"internalType":"address","name":"roleManager","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"type":"error","name":"AccessControlBadConfirmation"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bytes32","name":"neededRole","type":"bytes32"}],"type":"error","name":"AccessControlUnauthorizedAccount"},{"inputs":[{"internalType":"address","name":"target","type":"address"}],"type":"error","name":"AddressEmptyCode"},{"inputs":[],"type":"error","name":"CannotHandleMisbehavior"},{"inputs":[{"internalType":"string","name":"expected","type":"string"},{"internalType":"string","name":"actual","type":"string"}],"type":"error","name":"ChainIdMismatch"},{"inputs":[{"internalType":"bytes","name":"expected","type":"bytes"},{"internalType":"bytes","name":"actual","type":"bytes"}],"type":"error","name":"ClientStateMismatch"},{"inputs":[{"internalType":"bytes32","name":"expected","type":"bytes32"},{"internalType":"bytes32","name":"actual","type":"bytes32"}],"type":"error","name":"ConsensusStateHashMismatch"},{"inputs":[],"type":"error","name":"ConsensusStateNotFound"},{"inputs":[{"internalType":"bytes32","name":"expected","type":"bytes32"},{"internalType":"bytes32","name":"actual","type":"bytes32"}],"type":"error","name":"ConsensusStateRootMismatch"},{"inputs":[],"type":"error","name":"EmptyValue"},{"inputs":[],"type":"error","name":"FailedCall"},{"inputs":[],"type":"error","name":"FeatureNotSupported"},{"inputs":[],"type":"error","name":"FrozenClientState"},{"inputs":[],"type":"error","name":"InvalidMembershipProof"},{"inputs":[{"internalType":"bytes[]","name":"path","type":"bytes[]"},{"internalType":"bytes","name":"value","type":"bytes"}],"type":"error","name":"KeyValuePairNotInCache"},{"inputs":[{"internalType":"uint256","name":"length","type":"uint256"},{"internalType":"uint256","name":"min","type":"uint256"},{"internalType":"uint256","name":"max","type":"uint256"}],"type":"error","name":"LengthIsOutOfRange"},{"inputs":[{"internalType":"bytes[]","name":"path","type":"bytes[]"}],"type":"error","name":"MembershipProofKeyNotFound"},{"inputs":[{"internalType":"bytes","name":"expected","type":"bytes"},{"internalType":"bytes","name":"actual","type":"bytes"}],"type":"error","name":"MembershipProofValueMismatch"},{"inputs":[{"internalType":"uint64","name":"expectedRevisionNumber","type":"uint64"},{"internalType":"uint64","name":"expectedRevisionHeight","type":"uint64"},{"internalType":"uint64","name":"actualRevisionNumber","type":"uint64"},{"internalType":"uint64","name":"actualRevisionHeight","type":"uint64"}],"type":"error","name":"ProofHeightMismatch"},{"inputs":[{"internalType":"uint256","name":"now","type":"uint256"},{"internalType":"uint256","name":"proofTimestamp","type":"uint256"}],"type":"error","name":"ProofIsInTheFuture"},{"inputs":[{"internalType":"uint256","name":"now","type":"uint256"},{"internalType":"uint256","name":"proofTimestamp","type":"uint256"}],"type":"error","name":"ProofIsTooOld"},{"inputs":[{"internalType":"uint256","name":"expectedNumerator","type":"uint256"},{"internalType":"uint256","name":"expectedDenominator","type":"uint256"},{"internalType":"uint256","name":"actualNumerator","type":"uint256"},{"internalType":"uint256","name":"actualDenominator","type":"uint256"}],"type":"error","name":"TrustThresholdMismatch"},{"inputs":[{"internalType":"uint256","name":"expected","type":"uint256"},{"internalType":"uint256","name":"actual","type":"uint256"}],"type":"error","name":"TrustingPeriodMismatch"},{"inputs":[{"internalType":"uint256","name":"trustingPeriod","type":"uint256"},{"internalType":"uint256","name":"unbondingPeriod","type":"uint256"}],"type":"error","name":"TrustingPeriodTooLong"},{"inputs":[{"internalType":"uint256","name":"expected","type":"uint256"},{"internalType":"uint256","name":"actual","type":"uint256"}],"type":"error","name":"UnbondingPeriodMismatch"},{"inputs":[{"internalType":"uint8","name":"proofType","type":"uint8"}],"type":"error","name":"UnknownMembershipProofType"},{"inputs":[{"internalType":"uint8","name":"algorithm","type":"uint8"}],"type":"error","name":"UnknownZkAlgorithm"},{"inputs":[{"internalType":"bytes32","name":"expected","type":"bytes32"},{"internalType":"bytes32","name":"actual","type":"bytes32"}],"type":"error","name":"VerificationKeyMismatch"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32","indexed":true},{"internalType":"bytes32","name":"previousAdminRole","type":"bytes32","indexed":true},{"internalType":"bytes32","name":"newAdminRole","type":"bytes32","indexed":true}],"type":"event","name":"RoleAdminChanged","anonymous":false},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32","indexed":true},{"internalType":"address","name":"account","type":"address","indexed":true},{"internalType":"address","name":"sender","type":"address","indexed":true}],"type":"event","name":"RoleGranted","anonymous":false},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32","indexed":true},{"internalType":"address","name":"account","type":"address","indexed":true},{"internalType":"address","name":"sender","type":"address","indexed":true}],"type":"event","name":"RoleRevoked","anonymous":false},{"inputs":[],"stateMutability":"view","type":"function","name":"ALLOWED_SP1_CLOCK_DRIFT","outputs":[{"internalType":"uint16","name":"","type":"uint16"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"MEMBERSHIP_PROGRAM_VKEY","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"MISBEHAVIOUR_PROGRAM_VKEY","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"PROOF_SUBMITTER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"UPDATE_CLIENT_AND_MEMBERSHIP_PROGRAM_VKEY","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"UPDATE_CLIENT_PROGRAM_VKEY","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"VERIFIER","outputs":[{"internalType":"contract ISP1Verifier","name":"","type":"address"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"clientState","outputs":[{"internalType":"string","name":"chainId","type":"string"},{"internalType":"struct IICS07TendermintMsgs.TrustThreshold","name":"trustLevel","type":"tuple","components":[{"internalType":"uint8","name":"numerator","type":"uint8"},{"internalType":"uint8","name":"denominator","type":"uint8"}]},{"internalType":"struct IICS02ClientMsgs.Height","name":"latestHeight","type":"tuple","components":[{"internalType":"uint64","name":"revisionNumber","type":"uint64"},{"internalType":"uint64","name":"revisionHeight","type":"uint64"}]},{"internalType":"uint32","name":"trustingPeriod","type":"uint32"},{"internalType":"uint32","name":"unbondingPeriod","type":"uint32"},{"internalType":"bool","name":"isFrozen","type":"bool"},{"internalType":"enum IICS07TendermintMsgs.SupportedZkAlgorithm","name":"zkAlgorithm","type":"uint8"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"getClientState","outputs":[{"internalType":"bytes","name":"","type":"bytes"}]},{"inputs":[{"internalType":"uint64","name":"revisionHeight","type":"uint64"}],"stateMutability":"view","type":"function","name":"getConsensusStateHash","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}]},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"stateMutability":"view","type":"function","name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}]},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"stateMutability":"nonpayable","type":"function","name":"grantRole"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"stateMutability":"view","type":"function","name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}]},{"inputs":[{"internalType":"bytes","name":"misbehaviourMsg","type":"bytes"}],"stateMutability":"nonpayable","type":"function","name":"misbehaviour"},{"inputs":[{"internalType":"bytes[]","name":"data","type":"bytes[]"}],"stateMutability":"nonpayable","type":"function","name":"multicall","outputs":[{"internalType":"bytes[]","name":"results","type":"bytes[]"}]},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"callerConfirmation","type":"address"}],"stateMutability":"nonpayable","type":"function","name":"renounceRole"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"stateMutability":"nonpayable","type":"function","name":"revokeRole"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"stateMutability":"view","type":"function","name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}]},{"inputs":[{"internalType":"bytes","name":"updateMsg","type":"bytes"}],"stateMutability":"nonpayable","type":"function","name":"updateClient","outputs":[{"internalType":"enum ILightClientMsgs.UpdateResult","name":"","type":"uint8"}]},{"inputs":[{"internalType":"struct ILightClientMsgs.MsgVerifyMembership","name":"msg_","type":"tuple","components":[{"internalType":"bytes","name":"proof","type":"bytes"},{"internalType":"struct IICS02ClientMsgs.Height","name":"proofHeight","type":"tuple","components":[{"internalType":"uint64","name":"revisionNumber","type":"uint64"},{"internalType":"uint64","name":"revisionHeight","type":"uint64"}]},{"internalType":"bytes[]","name":"path","type":"bytes[]"},{"internalType":"bytes","name":"value","type":"bytes"}]}],"stateMutability":"nonpayable","type":"function","name":"verifyMembership","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[{"internalType":"struct ILightClientMsgs.MsgVerifyNonMembership","name":"msg_","type":"tuple","components":[{"internalType":"bytes","name":"proof","type":"bytes"},{"internalType":"struct IICS02ClientMsgs.Height","name":"proofHeight","type":"tuple","components":[{"internalType":"uint64","name":"revisionNumber","type":"uint64"},{"internalType":"uint64","name":"revisionHeight","type":"uint64"}]},{"internalType":"bytes[]","name":"path","type":"bytes[]"}]}],"stateMutability":"nonpayable","type":"function","name":"verifyNonMembership","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]}],"devdoc":{"kind":"dev","methods":{"constructor":{"params":{"_clientState":"The encoded initial client state.","_consensusState":"The encoded initial consensus state.","membershipProgramVkey":"The verification key for the verify (non)membership program.","misbehaviourProgramVkey":"The verification key for the misbehaviour program.","roleManager":"Manages the proof submitters and can submit proofs. Should be the ICS26Router if used in IBC.","sp1Verifier":"The address of the SP1 verifier contract.","updateClientAndMembershipProgramVkey":"The verification key for the update client and membership program.","updateClientProgramVkey":"The verification key for the update client program."}},"getClientState()":{"returns":{"_0":"The client state."}},"getConsensusStateHash(uint64)":{"params":{"revisionHeight":"The revision height."},"returns":{"_0":"The consensus state at the given revision height."}},"getRoleAdmin(bytes32)":{"details":"Returns the admin role that controls `role`. See {grantRole} and {revokeRole}. To change a role's admin, use {_setRoleAdmin}."},"grantRole(bytes32,address)":{"details":"Grants `role` to `account`. If `account` had not been already granted `role`, emits a {RoleGranted} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleGranted} event."},"hasRole(bytes32,address)":{"details":"Returns `true` if `account` has been granted `role`."},"misbehaviour(bytes)":{"details":"The misbehavior is verfied in the sp1 program. Here we only check the public values which contain the trusted headers.","params":{"misbehaviourMsg":"The misbehaviour message"}},"multicall(bytes[])":{"custom:oz-upgrades-unsafe-allow-reachable":"delegatecall","details":"Receives and executes a batch of function calls on this contract."},"renounceRole(bytes32,address)":{"details":"Revokes `role` from the calling account. Roles are often managed via {grantRole} and {revokeRole}: this function's purpose is to provide a mechanism for accounts to lose their privileges if they are compromised (such as when a trusted device is misplaced). If the calling account had been revoked `role`, emits a {RoleRevoked} event. Requirements: - the caller must be `callerConfirmation`. May emit a {RoleRevoked} event."},"revokeRole(bytes32,address)":{"details":"Revokes `role` from `account`. If `account` had been granted `role`, emits a {RoleRevoked} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleRevoked} event."},"supportsInterface(bytes4)":{"details":"Returns true if this contract implements the interface defined by `interfaceId`. See the corresponding https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[ERC section] to learn more about how these ids are created. This function call must use less than 30 000 gas."},"updateClient(bytes)":{"details":"This function verifies the public values and forwards the proof to the SP1 verifier.","params":{"updateMsg":"The encoded update message e.g., an SP1 proof."},"returns":{"_0":"The result of the update operation"}},"verifyMembership((bytes,(uint64,uint64),bytes[],bytes))":{"details":"Notice that this message is not view, as it may update the client state for caching purposes.","params":{"msg_":"The membership message"},"returns":{"_0":"The unix timestamp of the verification height in the counterparty chain in seconds."}},"verifyNonMembership((bytes,(uint64,uint64),bytes[]))":{"details":"Notice that this message is not view, as it may update the client state for caching purposes.","params":{"msg_":"The membership message"},"returns":{"_0":"The unix timestamp of the verification height in the counterparty chain in seconds."}}},"version":1},"userdoc":{"kind":"user","methods":{"ALLOWED_SP1_CLOCK_DRIFT()":{"notice":"Constant allowed prover clock drift in seconds."},"MEMBERSHIP_PROGRAM_VKEY()":{"notice":"Immutable membership program verification key."},"MISBEHAVIOUR_PROGRAM_VKEY()":{"notice":"Immutable misbehaviour program verification key."},"PROOF_SUBMITTER_ROLE()":{"notice":"The role identifier for the proof submitter role"},"UPDATE_CLIENT_AND_MEMBERSHIP_PROGRAM_VKEY()":{"notice":"Immutable update client and membership program verification key."},"UPDATE_CLIENT_PROGRAM_VKEY()":{"notice":"Immutable update client program verification key."},"VERIFIER()":{"notice":"Immutable SP1 verifier contract address."},"clientState()":{"notice":"The ICS07Tendermint client state"},"constructor":{"notice":"The constructor sets the program verification key and the initial client and consensus states."},"getClientState()":{"notice":"Returns the client state."},"getConsensusStateHash(uint64)":{"notice":"Returns the consensus state keccak256 hash at the given revision height."},"misbehaviour(bytes)":{"notice":"Misbehaviour handling, moves the light client to the frozen state if misbehaviour is detected"},"updateClient(bytes)":{"notice":"Updating the client and consensus state"},"verifyMembership((bytes,(uint64,uint64),bytes[],bytes))":{"notice":"Querying the membership of a key-value pair"},"verifyNonMembership((bytes,(uint64,uint64),bytes[]))":{"notice":"Querying the non-membership of a key"}},"version":1}},"settings":{"remappings":["@openzeppelin-contracts/=node_modules/@openzeppelin/contracts/","@openzeppelin-upgradeable/=node_modules/@openzeppelin/contracts-upgradeable/","@openzeppelin/=node_modules/@openzeppelin/","@sp1-contracts/=node_modules/sp1-contracts/contracts/src/","@uniswap/permit2/=node_modules/@uniswap/permit2/","forge-std/=node_modules/forge-std/src/","sp1-contracts/=node_modules/sp1-contracts/"],"optimizer":{"enabled":true,"runs":10000},"metadata":{"bytecodeHash":"none"},"compilationTarget":{"contracts/light-clients/sp1-ics07/SP1ICS07Tendermint.sol":"SP1ICS07Tendermint"},"evmVersion":"cancun","libraries":{},"viaIR":true},"sources":{"contracts/interfaces/ILightClient.sol":{"keccak256":"0x1caae9e4f741a86c0056d5f7713a35f3bd96db7a9fd52fc9f1cf79aad76a442f","urls":["bzz-raw://4a536db3b926560f69547c17e4f451a2631ddea0f42bd224c7fd8382d74429f6","dweb:/ipfs/QmcQ33kxcmmowXgMbQGTBgiKBjF7v8UiP4y73bB9hhDizC"],"license":"MIT"},"contracts/light-clients/sp1-ics07/SP1ICS07Tendermint.sol":{"keccak256":"0x2e03f0f1e058e7184ea70dc2a423a3d32a609620b6a1e8b764ec9c287b0b6187","urls":["bzz-raw://9e3c0b2f3b3af9cfc8a3ab085e0decffcd40230a27530142293f0b79a4aefe51","dweb:/ipfs/Qmf3qEAMWdiGAMEXSae6mzZ7Sncsbr4QzDC4JzMeiNwgei"],"license":"MIT"},"contracts/light-clients/sp1-ics07/errors/ISP1ICS07TendermintErrors.sol":{"keccak256":"0xe1a0526f9913308f761af480ef7d87091d6038659b9058f89c50083d49768db1","urls":["bzz-raw://a31d6d4a059182b3dfd3e99595d82a134963c448c9152ef35b42c62ccca87635","dweb:/ipfs/QmfQ2Cfa4kxWem3f88o9UnFQgL8oRU6vKkDFWSGmLsVLqN"],"license":"MIT"},"contracts/light-clients/sp1-ics07/interfaces/ISP1ICS07Tendermint.sol":{"keccak256":"0x0f00aea96b194d1a9db14f708f0de1fe7723fedc7b72bb8ea182e768ffc0a731","urls":["bzz-raw://3111a76ebabf4b57917e93669892df895a54a93a4963e384d8c13a1c47877b44","dweb:/ipfs/QmPCZ7Z4dJpowkzMhizUAW1j8QdJLD3DDjMbYq8G5VeXc1"],"license":"MIT"},"contracts/light-clients/sp1-ics07/msgs/IICS07TendermintMsgs.sol":{"keccak256":"0xae0ae6ff2742192ebaaee297c7d7473a1e1b4dc73393d45a944b0b7a8a647703","urls":["bzz-raw://43b2f6492a1f727416bbcf55876d9c08ac1f66f4724efc75b935c5022555be20","dweb:/ipfs/QmfTaPFNSFuUEsEBgJjnF2Jr2knayS7YwatfjP7dgdcAyH"],"license":"UNLICENSED"},"contracts/light-clients/sp1-ics07/msgs/IMembershipMsgs.sol":{"keccak256":"0x9dff6833fddbc11caf27387c9f8cba5dca9d1e430c9643d4e4a2e8eb09924d96","urls":["bzz-raw://efa6cfc654510dfcef6f4286e3e66446082bcd5671662ae6e1c6fd0f893a5a4a","dweb:/ipfs/QmRWAg1kHvmRtXgDm4ajVC7tEWQnzTWmHeHMYQJfyFuDGq"],"license":"UNLICENSED"},"contracts/light-clients/sp1-ics07/msgs/IMisbehaviourMsgs.sol":{"keccak256":"0x165b37d890b06eccd47558bf1efd6495e18541627758736a1f5b9c33d0333832","urls":["bzz-raw://15ab15cd5439147abed697bc9644b0175754845608bf3d57c81c2c864d31ce46","dweb:/ipfs/QmYcV88YsM1sZCmhP8LKUFHq3hJ6bsvd66W5axBnsBBoUM"],"license":"UNLICENSED"},"contracts/light-clients/sp1-ics07/msgs/ISP1Msgs.sol":{"keccak256":"0x8ede29b02182df4be9c075b3b48083277e5dd93bb3e7ce1eecfea9728db49aed","urls":["bzz-raw://48edb4bbcd440454fffceb4f85b83c08c3973a212239d7da07c079634fe413dd","dweb:/ipfs/Qmf7ma1nXWghfZKrJJvLpPuY5aN2xZZjHY7kWP3KVFCoDJ"],"license":"MIT"},"contracts/light-clients/sp1-ics07/msgs/IUcAndMembershipMsgs.sol":{"keccak256":"0xef3619c79de37cabe95d9d8af9d145fc2ea2dd55137407fb4b0082b0491170d0","urls":["bzz-raw://93646d813cdacf5e38e609e54baa67c60d749f0f111d00cd18b003c3cb328204","dweb:/ipfs/QmVcuwPujbiZ644a4jRw2V1LZxhhGsm2HKMXweVqndwUnZ"],"license":"UNLICENSED"},"contracts/light-clients/sp1-ics07/msgs/IUpdateClientMsgs.sol":{"keccak256":"0x370cdfca1c65f1898c7da80507e66972a6fe51a5d5c4e7aeabdd7060ce875aed","urls":["bzz-raw://ff34288a142b6f40d6843818b9ec0a542db016bc0d4a7be582eb2e255655c43e","dweb:/ipfs/QmXwbJHDbqZdw3JTT48Le1ZWGqmKAG7omf2ePvDfBHomzj"],"license":"UNLICENSED"},"contracts/light-clients/sp1-ics07/utils/Paths.sol":{"keccak256":"0x0e4eec6cd6cd0ef684383946419a2bf53c8f800033acfc298db81688e5aa178b","urls":["bzz-raw://824b58c13ff96b6ee38b5d25435fcc1305c45735f52df6347dba3dacdc144ffa","dweb:/ipfs/QmT7qomKM46ChfVVwfBQHwjpoHW9vrG9nXkGXsPeZRLJ7w"],"license":"MIT"},"contracts/msgs/IICS02ClientMsgs.sol":{"keccak256":"0xb5fdb25319d5c32b3f527982d45ec1e9bec5215515581aee034d853006ea01a0","urls":["bzz-raw://6b8939bf552c62c952a491008bcd9b59ab7dda20a9482bf93438e05793881542","dweb:/ipfs/QmfWmzNCp8bd4pP26Lfw5HHp4dSZnCDqZDjVN7SD8P7eDh"],"license":"MIT"},"contracts/msgs/ILightClientMsgs.sol":{"keccak256":"0xa0565e7748b8b3284d72e1aa6ef4cc8264fcaa5f4e0761d22d64686953db6378","urls":["bzz-raw://c4476010d7090bfaa74127526f2051c6bc82ff42a09b936e848880a1f15a6065","dweb:/ipfs/QmY87JgRsFQXSZdGXNjNHEJCkdTHzFXH4vZEJ3q7MnHuP8"],"license":"MIT"},"node_modules/@openzeppelin/contracts/access/AccessControl.sol":{"keccak256":"0x1a6b4f6b7798ab80929d491b89d5427a9b3338c0fd1acd0ba325f69c6f1646af","urls":["bzz-raw://7bb7f346c12a14dc622bc105ce3c47202fbc89f4b153a28a63bb68193297330c","dweb:/ipfs/QmagwF8P3bUBXwdo159ueEnY9dLSvEWwK24kk2op58egwG"],"license":"MIT"},"node_modules/@openzeppelin/contracts/access/IAccessControl.sol":{"keccak256":"0xbff9f59c84e5337689161ce7641c0ef8e872d6a7536fbc1f5133f128887aba3c","urls":["bzz-raw://b308f882e796f7b79c9502deacb0a62983035c6f6f4e962b319ba6a1f4a77d3d","dweb:/ipfs/QmaWCW7ahEQqFjwhSUhV7Ae7WhfNvzSpE7DQ58hvEooqPL"],"license":"MIT"},"node_modules/@openzeppelin/contracts/utils/Address.sol":{"keccak256":"0x6d0ae6e206645341fd122d278c2cb643dea260c190531f2f3f6a0426e77b00c0","urls":["bzz-raw://032d1201d839435be2c85b72e33206b3ea980c569d6ebf7fa57d811ab580a82f","dweb:/ipfs/QmeqQjAtMvdZT2tG7zm39itcRJkuwu8AEReK6WRnLJ18DD"],"license":"MIT"},"node_modules/@openzeppelin/contracts/utils/Context.sol":{"keccak256":"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2","urls":["bzz-raw://6a708e8a5bdb1011c2c381c9a5cfd8a9a956d7d0a9dc1bd8bcdaf52f76ef2f12","dweb:/ipfs/Qmax9WHBnVsZP46ZxEMNRQpLQnrdE4dK8LehML1Py8FowF"],"license":"MIT"},"node_modules/@openzeppelin/contracts/utils/Errors.sol":{"keccak256":"0x6afa713bfd42cf0f7656efa91201007ac465e42049d7de1d50753a373648c123","urls":["bzz-raw://ba1d02f4847670a1b83dec9f7d37f0b0418d6043447b69f3a29a5f9efc547fcf","dweb:/ipfs/QmQ7iH2keLNUKgq2xSWcRmuBE5eZ3F5whYAkAGzCNNoEWB"],"license":"MIT"},"node_modules/@openzeppelin/contracts/utils/Multicall.sol":{"keccak256":"0xa4c645387f16eae227cd378108e8e0a8acbcf2b600e393629bbd8422241c495f","urls":["bzz-raw://5e272440acfbec7f51afdb60a42597837b267de83ba7bd08d7e4dbc40171567c","dweb:/ipfs/QmPYzRwXpjUJEGRBWaSnzHz8gym1AKJ8yfoCgbo7gcwmEf"],"license":"MIT"},"node_modules/@openzeppelin/contracts/utils/TransientSlot.sol":{"keccak256":"0xac673fa1e374d9e6107504af363333e3e5f6344d2e83faf57d9bfd41d77cc946","urls":["bzz-raw://5982478dbbb218e9dd5a6e83f5c0e8d1654ddf20178484b43ef21dd2246809de","dweb:/ipfs/QmaB1hS68n2kG8vTbt7EPEzmrGhkUbfiFyykGGLsAr9X22"],"license":"MIT"},"node_modules/@openzeppelin/contracts/utils/introspection/ERC165.sol":{"keccak256":"0x2d9dc2fe26180f74c11c13663647d38e259e45f95eb88f57b61d2160b0109d3e","urls":["bzz-raw://81233d1f98060113d9922180bb0f14f8335856fe9f339134b09335e9f678c377","dweb:/ipfs/QmWh6R35SarhAn4z2wH8SU456jJSYL2FgucfTFgbHJJN4E"],"license":"MIT"},"node_modules/@openzeppelin/contracts/utils/introspection/IERC165.sol":{"keccak256":"0x8891738ffe910f0cf2da09566928589bf5d63f4524dd734fd9cedbac3274dd5c","urls":["bzz-raw://971f954442df5c2ef5b5ebf1eb245d7105d9fbacc7386ee5c796df1d45b21617","dweb:/ipfs/QmadRjHbkicwqwwh61raUEapaVEtaLMcYbQZWs9gUkgj3u"],"license":"MIT"},"node_modules/sp1-contracts/contracts/src/ISP1Verifier.sol":{"keccak256":"0x9e3ba64860bea920772dcf16be7946de2a2900d80bd51e9c0771184138f4f4d3","urls":["bzz-raw://0ec7230ca1fdd74edc6ab597d80bb345282aed3f0db4788ed96b4cc373ff46a3","dweb:/ipfs/QmXPuSS5gzxMhFKWr1gsxBVu6WHh53ZZEvWkGgzrkM6Y7Q"],"license":"MIT"}},"version":1},"id":45} \ No newline at end of file diff --git a/ibc-solidity/contracts/README.md b/ibc-solidity/contracts/README.md index 5aba1e2eb..e0b8d897e 100644 --- a/ibc-solidity/contracts/README.md +++ b/ibc-solidity/contracts/README.md @@ -22,9 +22,22 @@ This directory implements the IBC v2 protocol stack in Solidity. Most entrypoint ## Light clients (`light-clients/`) - `attestation/AttestationLightClient.sol` – m-of-n attestor-set light client using ECDSA signatures with role-gated proof submission. +- `besu/BesuIBFT2LightClient.sol` – Besu IBFT 2.0 light client for header-validator mode. Uses weak-subjectivity / trusting-period updates, verifies Besu commit seals under the existing YUI + prover sealing-header model plus EVM account/storage proofs, and proves Eureka commitments against the tracked counterparty `ICS26Router` storage. +- `besu/BesuQBFTLightClient.sol` – Besu QBFT light client for header-validator mode with the same proof model and storage verification surface as the IBFT2 wrapper, but QBFT-specific seal-digest rules within that same YUI + prover sealing-header model. +- `dummy/DummyLightClient.sol` – Insecure development/testing light client. Updates directly populate trusted timestamps and path/value records; proofs are ignored. - `ics02-wrapper/ICS02PrecompileWrapper.sol` – Thin adapter that exposes the `ILightClient` interface over the Cosmos EVM ICS02 precompile at a fixed address. - `sp1-ics07/SP1ICS07Tendermint.sol` – Tendermint light client verified via SP1 programs and verifier contract; supports update, (non)membership proofs, and misbehaviour handling. +### Besu light-client scope +- Supported: Besu **IBFT 2.0** and **QBFT** in **header-validator mode**. +- Verification model: weak subjectivity via **trusting period** and validator-set overlap checks. +- Commit-seal verification: follows the existing **YUI Solidity client + besu-ibc-relay-prover** sealing-header reconstruction model. +- Trusted overlap threshold: requires **strictly greater than one-third** overlap with the trusted validator set, implemented as `floor(n / 3) + 1`, which is intentionally stricter than the current upstream YUI check. +- Proof surface: Besu block headers, commit seals, Ethereum account proofs, and Ethereum storage proofs. +- Counterparty storage model: Eureka `ICS26Router` / `IBCStoreUpgradeable` commitments mapping. +- Not supported in v1: QBFT validator-contract mode, mode transitions, and misbehaviour handling. +- Current fixture status: `test/besu-bft/fixtures/` are synthetic regression fixtures; real Besu-derived golden fixtures remain a follow-up interoperability-confidence improvement. + ## Interchain Fungible Tokens (IFT) - Code reference: find the `contracts` IFT contract code [here](https://github.com/cosmos/solidity-ibc-eureka/tree/mariuszzak/ift/contracts). - IFT is an issuer-controlled ERC20 that bridges via ICS27-GMP instead of ICS20. The abstract `IFTBase` burns on send, constructs a mint call for the counterparty IFT, and tracks pending transfers keyed by (clientId, sequence). diff --git a/ibc-solidity/contracts/light-clients/besu/BesuIBFT2LightClient.sol b/ibc-solidity/contracts/light-clients/besu/BesuIBFT2LightClient.sol new file mode 100644 index 000000000..af08bef04 --- /dev/null +++ b/ibc-solidity/contracts/light-clients/besu/BesuIBFT2LightClient.sol @@ -0,0 +1,55 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.28; + +import { BesuLightClientBase } from "./BesuLightClientBase.sol"; + +/// @title Besu IBFT2 Light Client +/// @notice Verifies Besu IBFT 2.0 headers and ICS26 router storage proofs. +contract BesuIBFT2LightClient is BesuLightClientBase { + /// @notice Creates a Besu IBFT2 light client from an initial trusted consensus state. + /// @param ibcRouter Counterparty ICS26 router address whose storage is proven. + /// @param initialTrustedHeight Initial trusted Besu height. + /// @param initialTrustedTimestamp Initial trusted header timestamp in seconds. + /// @param initialTrustedStorageRoot Initial trusted storage root of `ibcRouter`. + /// @param initialTrustedValidators Initial trusted validator set. + /// @param trustingPeriod Maximum age in seconds for trusted consensus states. + /// @param maxClockDrift Maximum allowed future drift in seconds for submitted headers. + /// @param roleManager Address that administers proof submission; if zero, proof submission is open. + constructor( + address ibcRouter, + uint64 initialTrustedHeight, + uint64 initialTrustedTimestamp, + bytes32 initialTrustedStorageRoot, + address[] memory initialTrustedValidators, + uint64 trustingPeriod, + uint64 maxClockDrift, + address roleManager + ) + BesuLightClientBase( + ibcRouter, + initialTrustedHeight, + initialTrustedTimestamp, + initialTrustedStorageRoot, + initialTrustedValidators, + trustingPeriod, + maxClockDrift, + roleManager + ) + { } + + /// @inheritdoc BesuLightClientBase + function _commitSealDigest(ParsedHeader memory header) internal pure override returns (bytes32) { + bytes[] memory extraItems = new bytes[](4); + extraItems[0] = _rlpItemBytes(header.extraDataItems[0]); + extraItems[1] = _rlpItemBytes(header.extraDataItems[1]); + extraItems[2] = _rlpItemBytes(header.extraDataItems[2]); + extraItems[3] = _rlpItemBytes(header.extraDataItems[3]); + + bytes memory signingExtraData = _encodeRlpList(extraItems); + bytes[] memory headerItems = new bytes[](header.headerItems.length); + for (uint256 i = 0; i < header.headerItems.length; ++i) { + headerItems[i] = i == 12 ? _encodeRlpBytes(signingExtraData) : _rlpItemBytes(header.headerItems[i]); + } + return keccak256(_encodeRlpList(headerItems)); + } +} diff --git a/ibc-solidity/contracts/light-clients/besu/BesuLightClientBase.sol b/ibc-solidity/contracts/light-clients/besu/BesuLightClientBase.sol new file mode 100644 index 000000000..20021f748 --- /dev/null +++ b/ibc-solidity/contracts/light-clients/besu/BesuLightClientBase.sol @@ -0,0 +1,559 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.28; + +// solhint-disable gas-struct-packing, named-parameters-mapping, gas-strict-inequalities, code-complexity + +import { AccessControl } from "@openzeppelin-contracts/access/AccessControl.sol"; +import { ECDSA } from "@openzeppelin-contracts/utils/cryptography/ECDSA.sol"; + +import { ILightClient } from "../../interfaces/ILightClient.sol"; +import { ILightClientMsgs } from "../../msgs/ILightClientMsgs.sol"; +import { IICS02ClientMsgs } from "../../msgs/IICS02ClientMsgs.sol"; +import { IBesuLightClientMsgs } from "./msgs/IBesuLightClientMsgs.sol"; +import { IBesuLightClientErrors } from "./errors/IBesuLightClientErrors.sol"; +import { RLPReader } from "./RLPReader.sol"; +import { MPTProof } from "./MPTProof.sol"; + +/// @title Besu Light Client Base +/// @notice Shared implementation for Besu BFT light clients that verify headers and EVM storage proofs. +abstract contract BesuLightClientBase is ILightClient, IBesuLightClientErrors, IBesuLightClientMsgs, AccessControl { + using MPTProof for bytes; + using RLPReader for RLPReader.RLPItem; + using RLPReader for bytes; + + /// @notice Decoded fields from a submitted Besu header. + /// @param headerRlp Original RLP-encoded header. + /// @param headerItems Top-level RLP header fields. + /// @param extraDataItems Decoded Besu BFT `extraData` fields. + /// @param height Header block number. + /// @param stateRoot Header state root. + /// @param timestamp Header timestamp in seconds. + /// @param validators Validator set from `extraData`. + /// @param commitSeals Commit seals from `extraData`. + struct ParsedHeader { + bytes headerRlp; + RLPReader.RLPItem[] headerItems; + RLPReader.RLPItem[] extraDataItems; + uint64 height; + bytes32 stateRoot; + uint64 timestamp; + address[] validators; + bytes[] commitSeals; + } + + /// @notice Role allowed to submit client updates and proof verifications. + // natlint-disable-next-line MissingInheritdoc + bytes32 public constant PROOF_SUBMITTER_ROLE = keccak256("PROOF_SUBMITTER_ROLE"); + + /// @notice Besu BFT sentinel mix hash. + bytes32 internal constant BESU_BFT_MIX_HASH = 0x63746963616c2062797a616e74696e65206661756c7420746f6c6572616e6365; + /// @notice Empty ommers hash required by Besu BFT headers. + bytes32 internal constant EMPTY_OMMERS_HASH = 0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347; + /// @notice ERC-7201 storage slot used by `IBCStoreUpgradeable` commitments. + bytes32 internal constant IBCSTORE_STORAGE_SLOT = + 0x1260944489272988d9df285149b5aa1b0f48f2136d6f416159f840a3e0747600; + + /// @notice Current client state. + ClientState internal clientState; + /// @notice Trusted consensus states by revision height. + mapping(uint64 revisionHeight => ConsensusState) internal consensusStates; + + /// @notice Initializes shared Besu light client state. + /// @param ibcRouter Counterparty ICS26 router address whose storage is proven. + /// @param initialTrustedHeight Initial trusted Besu height. + /// @param initialTrustedTimestamp Initial trusted header timestamp in seconds. + /// @param initialTrustedStorageRoot Initial trusted storage root of `ibcRouter`. + /// @param initialTrustedValidators Initial trusted validator set. + /// @param trustingPeriod Maximum age in seconds for trusted consensus states. + /// @param maxClockDrift Maximum allowed future drift in seconds for submitted headers. + /// @param roleManager Address that administers proof submission; if zero, proof submission is open. + constructor( + address ibcRouter, + uint64 initialTrustedHeight, + uint64 initialTrustedTimestamp, + bytes32 initialTrustedStorageRoot, + address[] memory initialTrustedValidators, + uint64 trustingPeriod, + uint64 maxClockDrift, + address roleManager + ) { + if (initialTrustedHeight == 0) { + revert InvalidHeaderHeight(); + } + + _validateValidators(initialTrustedValidators); + + clientState = ClientState({ + ibcRouter: ibcRouter, + latestHeight: IICS02ClientMsgs.Height({ revisionNumber: 0, revisionHeight: initialTrustedHeight }), + trustingPeriod: trustingPeriod, + maxClockDrift: maxClockDrift + }); + + ConsensusState storage consensusState = consensusStates[initialTrustedHeight]; + consensusState.timestamp = initialTrustedTimestamp; + consensusState.storageRoot = initialTrustedStorageRoot; + consensusState.validators = initialTrustedValidators; + + if (roleManager == address(0)) { + _grantRole(PROOF_SUBMITTER_ROLE, address(0)); + } else { + _grantRole(DEFAULT_ADMIN_ROLE, roleManager); + _grantRole(PROOF_SUBMITTER_ROLE, roleManager); + } + } + + /// @inheritdoc ILightClient + function getClientState() external view returns (bytes memory) { + return abi.encode(clientState); + } + + /// @notice Returns the encoded consensus state for a revision height. + /// @param revisionHeight The revision height to query. + /// @return The ABI-encoded consensus state. + // natlint-disable-next-line MissingInheritdoc + function getConsensusState(uint64 revisionHeight) external view returns (bytes memory) { + ConsensusState storage consensusState = _getConsensusState(revisionHeight); + return abi.encode(consensusState.timestamp, consensusState.storageRoot, consensusState.validators); + } + + /// @inheritdoc ILightClient + function updateClient(bytes calldata updateMsg) + external + onlyProofSubmitter + returns (ILightClientMsgs.UpdateResult) + { + MsgUpdateClient memory msg_ = abi.decode(updateMsg, (MsgUpdateClient)); + _requireZeroRevision(msg_.trustedHeight.revisionNumber); + + ParsedHeader memory header = _parseHeader(msg_.headerRlp); + if (header.height == 0) { + revert InvalidHeaderHeight(); + } + if (block.timestamp + clientState.maxClockDrift < header.timestamp) { + revert HeaderFromFuture(block.timestamp, header.timestamp, clientState.maxClockDrift); + } + + ConsensusState storage trustedConsensusState = _getConsensusState(msg_.trustedHeight.revisionHeight); + if ( + clientState.trustingPeriod != 0 + && uint256(trustedConsensusState.timestamp) + clientState.trustingPeriod <= block.timestamp + ) { + revert ConsensusStateExpired(trustedConsensusState.timestamp, block.timestamp, clientState.trustingPeriod); + } + + address[] memory signers = _recoverSigners(_commitSealDigest(header), header.commitSeals); + _checkTrustedValidatorOverlap(signers, trustedConsensusState.validators); + _checkValidatorQuorum(signers, header.validators); + + bytes32 storageRoot = _verifyAccountProof(clientState.ibcRouter, header.stateRoot, msg_.accountProof); + + ConsensusState storage existingConsensusState = consensusStates[header.height]; + if (existingConsensusState.timestamp != 0) { + if (_isSameConsensusState(existingConsensusState, header.timestamp, storageRoot, header.validators)) { + return ILightClientMsgs.UpdateResult.NoOp; + } + revert ConflictingConsensusState(header.height); + } + + ConsensusState storage newConsensusState = consensusStates[header.height]; + newConsensusState.timestamp = header.timestamp; + newConsensusState.storageRoot = storageRoot; + newConsensusState.validators = header.validators; + + if (header.height > clientState.latestHeight.revisionHeight) { + clientState.latestHeight.revisionHeight = header.height; + } + + return ILightClientMsgs.UpdateResult.Update; + } + + /// @inheritdoc ILightClient + function verifyMembership(ILightClientMsgs.MsgVerifyMembership calldata msg_) + external + view + onlyProofSubmitter + returns (uint256) + { + _requireZeroRevision(msg_.proofHeight.revisionNumber); + if (msg_.path.length != 1) { + revert InvalidPathLength(1, msg_.path.length); + } + if (msg_.value.length != 32) { + revert InvalidValueLength(32, msg_.value.length); + } + + ConsensusState storage consensusState = _getConsensusState(msg_.proofHeight.revisionHeight); + bytes32 storageSlot = _commitmentStorageSlot(msg_.path[0]); + bytes32 expectedValue = abi.decode(msg_.value, (bytes32)); + bytes memory valueRlp = + msg_.proof.verifyRLPProof(consensusState.storageRoot, keccak256(abi.encodePacked(storageSlot))); + if (valueRlp.length == 0) { + revert InvalidCommitmentValue(expectedValue, bytes32(0)); + } + + bytes32 actualValue = bytes32(valueRlp.toRlpItem().toUint()); + if (actualValue != expectedValue) { + revert InvalidCommitmentValue(expectedValue, actualValue); + } + return consensusState.timestamp; + } + + /// @inheritdoc ILightClient + function verifyNonMembership(ILightClientMsgs.MsgVerifyNonMembership calldata msg_) + external + view + onlyProofSubmitter + returns (uint256) + { + _requireZeroRevision(msg_.proofHeight.revisionNumber); + if (msg_.path.length != 1) { + revert InvalidPathLength(1, msg_.path.length); + } + + ConsensusState storage consensusState = _getConsensusState(msg_.proofHeight.revisionHeight); + bytes32 storageSlot = _commitmentStorageSlot(msg_.path[0]); + bytes memory valueRlp = + msg_.proof.verifyRLPProof(consensusState.storageRoot, keccak256(abi.encodePacked(storageSlot))); + if (valueRlp.length != 0) { + revert ValueExists(bytes32(valueRlp.toRlpItem().toUint())); + } + return consensusState.timestamp; + } + + /// @inheritdoc ILightClient + function misbehaviour(bytes calldata) external view onlyProofSubmitter { + revert UnsupportedMisbehaviour(); + } + + /// @notice Computes the protocol-specific commit seal digest for a parsed header. + /// @param header The parsed Besu header. + /// @return The digest signed by commit seals. + function _commitSealDigest(ParsedHeader memory header) internal pure virtual returns (bytes32); + + /// @notice Parses and validates common Besu BFT header fields. + /// @param headerRlp RLP-encoded Besu block header. + /// @return header The parsed header fields used by update and proof verification. + function _parseHeader(bytes memory headerRlp) internal pure returns (ParsedHeader memory header) { + header.headerRlp = headerRlp; + header.headerItems = headerRlp.toRlpItem().toList(); + if (header.headerItems.length < 15) { + revert InvalidHeaderFormat(header.headerItems.length); + } + + if (bytes32(header.headerItems[1].toUintStrict()) != EMPTY_OMMERS_HASH) { + revert InvalidOmmersHash(bytes32(header.headerItems[1].toUintStrict())); + } + if (header.headerItems[7].toUint() != 1) { + revert InvalidDifficulty(header.headerItems[7].toUint()); + } + if (bytes32(header.headerItems[13].toUintStrict()) != BESU_BFT_MIX_HASH) { + revert InvalidMixHash(bytes32(header.headerItems[13].toUintStrict())); + } + + bytes memory nonce = header.headerItems[14].toBytes(); + if (nonce.length != 8 || keccak256(nonce) != keccak256(hex"0000000000000000")) { + revert InvalidNonce(nonce); + } + + header.height = uint64(header.headerItems[8].toUint()); + header.stateRoot = bytes32(header.headerItems[3].toUintStrict()); + header.timestamp = uint64(header.headerItems[11].toUint()); + + bytes memory extraData = header.headerItems[12].toBytes(); + header.extraDataItems = extraData.toRlpItem().toList(); + if (header.extraDataItems.length != 5) { + revert InvalidExtraDataFormat(header.extraDataItems.length); + } + + RLPReader.RLPItem[] memory validatorItems = header.extraDataItems[1].toList(); + if (validatorItems.length == 0) { + revert EmptyValidatorSet(); + } + + header.validators = new address[](validatorItems.length); + for (uint256 i = 0; i < validatorItems.length; ++i) { + bytes memory validatorBytes = validatorItems[i].toBytes(); + if (validatorBytes.length != 20) { + revert InvalidValidatorAddressLength(validatorBytes.length); + } + + address validator = address(bytes20(validatorBytes)); + if (validator == address(0)) { + revert InvalidValidatorAddress(validator); + } + for (uint256 j = 0; j < i; ++j) { + if (header.validators[j] == validator) { + revert DuplicateValidator(validator); + } + } + header.validators[i] = validator; + } + + RLPReader.RLPItem[] memory sealItems = header.extraDataItems[4].toList(); + header.commitSeals = new bytes[](sealItems.length); + for (uint256 i = 0; i < sealItems.length; ++i) { + header.commitSeals[i] = sealItems[i].toBytes(); + } + } + + /// @notice Verifies the tracked account proof against a header state root. + /// @param account The account address being proven. + /// @param stateRoot The header state root. + /// @param accountProof RLP-encoded account proof. + /// @return The proven account storage root. + function _verifyAccountProof( + address account, + bytes32 stateRoot, + bytes memory accountProof + ) + internal + pure + returns (bytes32) + { + bytes memory accountRlp = accountProof.verifyRLPProof(stateRoot, keccak256(abi.encodePacked(account))); + RLPReader.RLPItem[] memory accountItems = accountRlp.toRlpItem().toList(); + return bytes32(accountItems[2].toUintStrict()); + } + + /// @notice Computes the storage slot used for an IBC commitment path. + /// @param rawPath Raw commitment path bytes. + /// @return The storage slot for the commitment. + function _commitmentStorageSlot(bytes memory rawPath) internal pure returns (bytes32) { + return keccak256(abi.encode(keccak256(rawPath), IBCSTORE_STORAGE_SLOT)); + } + + /// @notice Recovers unique commit seal signers for a digest. + /// @param digest The commit seal digest. + /// @param seals The commit seals to recover. + /// @return signers The recovered signer addresses. + function _recoverSigners(bytes32 digest, bytes[] memory seals) internal pure returns (address[] memory signers) { + signers = new address[](seals.length); + for (uint256 i = 0; i < seals.length; ++i) { + address signer = _recoverSigner(digest, seals[i]); + for (uint256 j = 0; j < i; ++j) { + if (signers[j] == signer) { + revert DuplicateCommitSealSigner(signer); + } + } + signers[i] = signer; + } + } + + /// @notice Recovers one commit seal signer. + /// @param digest The commit seal digest. + /// @param seal The 65-byte ECDSA commit seal. + /// @return The recovered signer address. + function _recoverSigner(bytes32 digest, bytes memory seal) internal pure returns (address) { + if (seal.length != 65) { + revert InvalidECDSASignatureLength(seal.length); + } + if (uint8(seal[64]) < 27) { + seal[64] = bytes1(uint8(seal[64]) + 27); + } + (address signer, ECDSA.RecoverError err,) = ECDSA.tryRecover(digest, seal); + if (err != ECDSA.RecoverError.NoError || signer == address(0)) { + revert InvalidCommitSeal(); + } + return signer; + } + + /// @notice Checks that signers overlap enough with the trusted validator set. + /// @param signers The recovered commit seal signers. + /// @param trustedValidators The trusted validator set. + function _checkTrustedValidatorOverlap( + address[] memory signers, + address[] storage trustedValidators + ) + internal + view + { + uint256 actual; + for (uint256 i = 0; i < signers.length; ++i) { + if (_containsStorage(trustedValidators, signers[i])) { + ++actual; + } + } + + uint256 required = trustedValidators.length / 3 + 1; + if (actual < required) { + revert InsufficientTrustedValidatorOverlap(actual, required); + } + } + + /// @notice Checks that signers meet quorum for the submitted header validator set. + /// @param signers The recovered commit seal signers. + /// @param validators The validator set from the submitted header. + function _checkValidatorQuorum(address[] memory signers, address[] memory validators) internal pure { + uint256 actual; + for (uint256 i = 0; i < signers.length; ++i) { + if (_containsMemory(validators, signers[i])) { + ++actual; + } + } + + uint256 required = validators.length * 2 / 3 + 1; + if (actual < required) { + revert InsufficientValidatorQuorum(actual, required); + } + } + + /// @notice Validates that a validator set is non-empty and unique. + /// @param validators The validator set to validate. + function _validateValidators(address[] memory validators) internal pure { + if (validators.length == 0) { + revert EmptyValidatorSet(); + } + for (uint256 i = 0; i < validators.length; ++i) { + if (validators[i] == address(0)) { + revert InvalidValidatorAddress(validators[i]); + } + for (uint256 j = 0; j < i; ++j) { + if (validators[j] == validators[i]) { + revert DuplicateValidator(validators[i]); + } + } + } + } + + /// @notice Compares a stored consensus state with proposed fields. + /// @param consensusState The stored consensus state. + /// @param timestamp The proposed timestamp. + /// @param storageRoot The proposed storage root. + /// @param validators The proposed validator set. + /// @return True if all fields match. + function _isSameConsensusState( + ConsensusState storage consensusState, + uint64 timestamp, + bytes32 storageRoot, + address[] memory validators + ) + internal + view + returns (bool) + { + if (consensusState.timestamp != timestamp || consensusState.storageRoot != storageRoot) { + return false; + } + if (consensusState.validators.length != validators.length) { + return false; + } + for (uint256 i = 0; i < validators.length; ++i) { + if (consensusState.validators[i] != validators[i]) { + return false; + } + } + return true; + } + + /// @notice Returns a stored consensus state or reverts if it is missing. + /// @param revisionHeight The consensus state revision height. + /// @return consensusState The stored consensus state. + function _getConsensusState(uint64 revisionHeight) internal view returns (ConsensusState storage consensusState) { + consensusState = consensusStates[revisionHeight]; + if (consensusState.timestamp == 0) { + revert ConsensusStateNotFound(revisionHeight); + } + } + + /// @notice Reverts unless the revision number is zero. + /// @param revisionNumber The revision number to validate. + function _requireZeroRevision(uint64 revisionNumber) internal pure { + if (revisionNumber != 0) { + revert InvalidRevisionNumber(revisionNumber); + } + } + + /// @notice Checks whether a storage validator set contains a signer. + /// @param validators The storage validator set. + /// @param signer The signer to find. + /// @return True if `signer` is present. + function _containsStorage(address[] storage validators, address signer) internal view returns (bool) { + for (uint256 i = 0; i < validators.length; ++i) { + if (validators[i] == signer) { + return true; + } + } + return false; + } + + /// @notice Checks whether a memory validator set contains a signer. + /// @param validators The memory validator set. + /// @param signer The signer to find. + /// @return True if `signer` is present. + function _containsMemory(address[] memory validators, address signer) internal pure returns (bool) { + for (uint256 i = 0; i < validators.length; ++i) { + if (validators[i] == signer) { + return true; + } + } + return false; + } + + /// @notice Returns the full RLP bytes for an item. + /// @param item The RLP item. + /// @return The RLP-encoded bytes. + function _rlpItemBytes(RLPReader.RLPItem memory item) internal pure returns (bytes memory) { + return item.toRlpBytes(); + } + + /// @notice Encodes raw bytes as an RLP string. + /// @param raw Raw bytes to encode. + /// @return The RLP-encoded string. + function _encodeRlpBytes(bytes memory raw) internal pure returns (bytes memory) { + if (raw.length == 1 && uint8(raw[0]) < 0x80) { + return raw; + } + if (raw.length < 56) { + return abi.encodePacked(bytes1(uint8(0x80 + raw.length)), raw); + } + + bytes memory lenBytes = _encodeLength(raw.length); + return abi.encodePacked(bytes1(uint8(0xb7 + lenBytes.length)), lenBytes, raw); + } + + /// @notice Encodes pre-encoded RLP items as an RLP list. + /// @param items RLP-encoded list items. + /// @return The RLP-encoded list. + function _encodeRlpList(bytes[] memory items) internal pure returns (bytes memory) { + bytes memory payload; + for (uint256 i = 0; i < items.length; ++i) { + payload = bytes.concat(payload, items[i]); + } + + if (payload.length < 56) { + return abi.encodePacked(bytes1(uint8(0xc0 + payload.length)), payload); + } + + bytes memory lenBytes = _encodeLength(payload.length); + return abi.encodePacked(bytes1(uint8(0xf7 + lenBytes.length)), lenBytes, payload); + } + + /// @notice Encodes an integer length as big-endian bytes. + /// @param value The length value. + /// @return The minimal big-endian representation. + function _encodeLength(uint256 value) internal pure returns (bytes memory) { + uint256 tmp = value; + uint256 length; + while (tmp != 0) { + ++length; + tmp >>= 8; + } + + bytes memory out = new bytes(length); + tmp = value; + for (uint256 i = length; i > 0; --i) { + out[i - 1] = bytes1(uint8(tmp)); + tmp >>= 8; + } + return out; + } + + /// @notice Restricts access to proof submitters unless submission is open to anyone. + modifier onlyProofSubmitter() { + if (!hasRole(PROOF_SUBMITTER_ROLE, address(0))) { + _checkRole(PROOF_SUBMITTER_ROLE); + } + _; + } +} diff --git a/ibc-solidity/contracts/light-clients/besu/BesuQBFTLightClient.sol b/ibc-solidity/contracts/light-clients/besu/BesuQBFTLightClient.sol new file mode 100644 index 000000000..01e0a0843 --- /dev/null +++ b/ibc-solidity/contracts/light-clients/besu/BesuQBFTLightClient.sol @@ -0,0 +1,56 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.28; + +import { BesuLightClientBase } from "./BesuLightClientBase.sol"; + +/// @title Besu QBFT Light Client +/// @notice Verifies Besu QBFT headers and ICS26 router storage proofs. +contract BesuQBFTLightClient is BesuLightClientBase { + /// @notice Creates a Besu QBFT light client from an initial trusted consensus state. + /// @param ibcRouter Counterparty ICS26 router address whose storage is proven. + /// @param initialTrustedHeight Initial trusted Besu height. + /// @param initialTrustedTimestamp Initial trusted header timestamp in seconds. + /// @param initialTrustedStorageRoot Initial trusted storage root of `ibcRouter`. + /// @param initialTrustedValidators Initial trusted validator set. + /// @param trustingPeriod Maximum age in seconds for trusted consensus states. + /// @param maxClockDrift Maximum allowed future drift in seconds for submitted headers. + /// @param roleManager Address that administers proof submission; if zero, proof submission is open. + constructor( + address ibcRouter, + uint64 initialTrustedHeight, + uint64 initialTrustedTimestamp, + bytes32 initialTrustedStorageRoot, + address[] memory initialTrustedValidators, + uint64 trustingPeriod, + uint64 maxClockDrift, + address roleManager + ) + BesuLightClientBase( + ibcRouter, + initialTrustedHeight, + initialTrustedTimestamp, + initialTrustedStorageRoot, + initialTrustedValidators, + trustingPeriod, + maxClockDrift, + roleManager + ) + { } + + /// @inheritdoc BesuLightClientBase + function _commitSealDigest(ParsedHeader memory header) internal pure override returns (bytes32) { + bytes[] memory extraItems = new bytes[](5); + extraItems[0] = _rlpItemBytes(header.extraDataItems[0]); + extraItems[1] = _rlpItemBytes(header.extraDataItems[1]); + extraItems[2] = _rlpItemBytes(header.extraDataItems[2]); + extraItems[3] = _rlpItemBytes(header.extraDataItems[3]); + extraItems[4] = hex"c0"; + + bytes memory signingExtraData = _encodeRlpList(extraItems); + bytes[] memory headerItems = new bytes[](header.headerItems.length); + for (uint256 i = 0; i < header.headerItems.length; ++i) { + headerItems[i] = i == 12 ? _encodeRlpBytes(signingExtraData) : _rlpItemBytes(header.headerItems[i]); + } + return keccak256(_encodeRlpList(headerItems)); + } +} diff --git a/ibc-solidity/contracts/light-clients/besu/MPTProof.sol b/ibc-solidity/contracts/light-clients/besu/MPTProof.sol new file mode 100644 index 000000000..3b761c0b9 --- /dev/null +++ b/ibc-solidity/contracts/light-clients/besu/MPTProof.sol @@ -0,0 +1,282 @@ +// SPDX-License-Identifier: Apache-2.0 +// This file is copied from solidity-mpt library. +// https://github.com/ibc-solidity/solidity-mpt/blob/d157b5fd0aafb0b1c23bc3a3eb5f5bc04b3fd0a3/src/MPTProof.sol +pragma solidity ^0.8.28; + +/* solhint-disable no-inline-assembly, function-max-lines, code-complexity, reason-string, gas-custom-errors, +gas-increment-by-one, gas-strict-inequalities */ + +import { RLPReader } from "./RLPReader.sol"; + +/// @title Merkle Patricia Trie Proof +/// @notice Verifies Ethereum Merkle Patricia Trie inclusion and exclusion proofs. +library MPTProof { + using RLPReader for RLPReader.RLPItem; + using RLPReader for bytes; + + /// @notice Verifies an RLP-encoded Merkle Patricia Trie proof. + /// @dev If the proof proves inclusion, the value is returned; for exclusion, an empty byte array is returned. + /// @param rlpProof is the stack of MPT nodes (starting with the root) that + /// need to be traversed during verification. It's encoded with RLP. + /// @param rootHash is the Keccak-256 hash of the root node of the MPT. + /// @param mptKey is a trie key of the node whose + /// inclusion/exclusion we are proving. + /// @return value whose inclusion is proved or an empty byte array for + /// a proof of exclusion + function verifyRLPProof( + bytes memory rlpProof, + bytes32 rootHash, + bytes32 mptKey + ) + internal + pure + returns (bytes memory value) + { + bytes memory key = new bytes(32); + assembly { + mstore(add(key, 0x20), mptKey) + } + return verify(rlpProof.toRlpItem().toList(), rootHash, decodeNibbles(key, 0)); + } + + /// @notice Verifies a decoded Merkle Patricia Trie proof. + /// @dev If the proof proves inclusion, the value is returned; for exclusion, an empty byte array is returned. + /// @param proof is the stack of MPT nodes (starting with the root) that + /// need to be traversed during verification. + /// @param rootHash is the Keccak-256 hash of the root node of the MPT. + /// @param mptKeyNibbles is the key (consisting of nibbles) of the node whose + /// inclusion/exclusion we are proving. + /// @return value whose inclusion is proved or an empty byte array for + /// a proof of exclusion + function verify( + RLPReader.RLPItem[] memory proof, + bytes32 rootHash, + bytes memory mptKeyNibbles + ) + internal + pure + returns (bytes memory value) + { + uint256 mptKeyOffset = 0; + bytes32 nodeHashHash; + RLPReader.RLPItem[] memory node; + RLPReader.RLPItem memory rlpValue; + + if (proof.length == 0) { + // Root hash of empty Merkle-Patricia-Trie + require(rootHash == 0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421); + return new bytes(0); + } + + // Traverse stack of nodes starting at root. + for (uint256 i = 0; i < proof.length; i++) { + // The root node is hashed with Keccak-256 ... + if (i == 0 && rootHash != proof[i].rlpBytesKeccak256()) { + revert(); + } + // ... whereas all other nodes are hashed with the MPT + // hash function. + if (i != 0 && nodeHashHash != mptHashHash(proof[i])) { + revert(); + } + // We verified that proof[i] has the correct hash, so we + // may safely decode it. + node = proof[i].toList(); + + if (node.length == 2) { + // Extension or Leaf node + + bool isLeaf; + bytes memory nodeKey; + (isLeaf, nodeKey) = merklePatriciaCompactDecode(node[0].toBytes()); + + uint256 prefixLength = sharedPrefixLength(mptKeyOffset, mptKeyNibbles, nodeKey); + mptKeyOffset += prefixLength; + + if (prefixLength < nodeKey.length) { + // Proof claims divergent extension or leaf. (Only + // relevant for proofs of exclusion.) + // An Extension/Leaf node is divergent iff it "skips" over + // the point at which a Branch node should have been had the + // excluded key been included in the trie. + // Example: Imagine a proof of exclusion for path [1, 4], + // where the current node is a Leaf node with + // path [1, 3, 3, 7]. For [1, 4] to be included, there + // should have been a Branch node at [1] with a child + // at 3 and a child at 4. + + // Sanity check + if (i < proof.length - 1) { + // divergent node must come last in proof + revert(); + } + + return new bytes(0); + } + + if (isLeaf) { + // Sanity check + if (i < proof.length - 1) { + // leaf node must come last in proof + revert(); + } + + if (mptKeyOffset < mptKeyNibbles.length) { + return new bytes(0); + } + + rlpValue = node[1]; + return rlpValue.toBytes(); + } else { + // extension + // Sanity check + if (i == proof.length - 1) { + // shouldn't be at last level + revert(); + } + + if (!node[1].isList()) { + // rlp(child) was at least 32 bytes. node[1] contains + // Keccak256(rlp(child)). + nodeHashHash = node[1].payloadKeccak256(); + } else { + // rlp(child) was at less than 32 bytes. node[1] contains + // rlp(child). + nodeHashHash = node[1].rlpBytesKeccak256(); + } + } + } else if (node.length == 17) { + // Branch node + + if (mptKeyOffset != mptKeyNibbles.length) { + // we haven't consumed the entire path, so we need to look at a child + uint256 nibble = uint256(uint8(mptKeyNibbles[mptKeyOffset])); + mptKeyOffset += 1; + if (nibble >= 16) { + // each element of the path has to be a nibble + revert(); + } + + if (isEmptyBytesequence(node[nibble])) { + // Sanity + if (i != proof.length - 1) { + // leaf node should be at last level + revert(); + } + + return new bytes(0); + } else if (!node[nibble].isList()) { + nodeHashHash = node[nibble].payloadKeccak256(); + } else { + nodeHashHash = node[nibble].rlpBytesKeccak256(); + } + } else { + // we have consumed the entire mptKey, so we need to look at what's contained in this node. + + // Sanity + if (i != proof.length - 1) { + // should be at last level + revert(); + } + + return node[16].toBytes(); + } + } else { + revert("invalid node length"); + } + } + // unreachable here + revert(); + } + + /// @notice Checks whether an RLP item is the empty byte sequence. + /// @param item The RLP item to check. + /// @return True if the item encodes an empty byte sequence. + function isEmptyBytesequence(RLPReader.RLPItem memory item) internal pure returns (bool) { + if (item.len != 1) { + return false; + } + uint8 b; + uint256 memPtr = item.memPtr; + assembly { + b := byte(0, mload(memPtr)) + } + return b == 0x80; /* empty byte string */ + } + + /// @notice Expands bytes into nibbles starting at an offset. + /// @param bz The bytes to expand. + /// @param offset The nibble offset. + /// @return nibbles The expanded nibbles. + function decodeNibbles(bytes memory bz, uint256 offset) internal pure returns (bytes memory nibbles) { + uint256 length = bz.length * 2; + require(bz.length > 0 && offset <= length); + + nibbles = new bytes(length - offset); + uint256 i = offset; + if (offset & 1 == 1) { + nibbles[0] = bytes1((uint8(bz[offset / 2]) >> 0) & 0xF); + i++; + } + unchecked { + for (; i < length - 1; i += 2) { + nibbles[i - offset] = bytes1((uint8(bz[i / 2]) >> 4) & 0xF); + nibbles[i - offset + 1] = bytes1((uint8(bz[i / 2]) >> 0) & 0xF); + } + } + } + + /// @notice Decodes compact Merkle Patricia Trie path encoding. + /// @param bz The compact encoded path bytes. + /// @return isLeaf True if the compact path marks a leaf node. + /// @return nibbles The decoded path nibbles. + function merklePatriciaCompactDecode(bytes memory bz) internal pure returns (bool isLeaf, bytes memory nibbles) { + require(bz.length > 0); + uint256 firstNibble = uint8(bz[0]) >> 4 & 0xF; + uint256 offset = 0; + if (firstNibble == 0) { + offset = 2; + isLeaf = false; + } else if (firstNibble == 1) { + offset = 1; + isLeaf = false; + } else if (firstNibble == 2) { + offset = 2; + isLeaf = true; + } else if (firstNibble == 3) { + offset = 1; + isLeaf = true; + } else { + // Not supposed to happen! + revert(); + } + return (isLeaf, decodeNibbles(bz, offset)); + } + + /// @notice Computes the shared prefix length between two nibble arrays. + /// @param xsOffset Offset into `xs` where comparison starts. + /// @param xs The first nibble array. + /// @param ys The second nibble array. + /// @return The number of matching nibbles. + function sharedPrefixLength(uint256 xsOffset, bytes memory xs, bytes memory ys) internal pure returns (uint256) { + uint256 i = 0; + for (; i + xsOffset < xs.length && i < ys.length; i++) { + if (xs[i + xsOffset] != ys[i]) { + return i; + } + } + return i; + } + + /// @notice Computes the keccak256 hash of the Merkle Patricia Trie hash of an item. + /// @dev MPT hashes are variable length: short inputs are inlined, long inputs are keccak256-hashed. + /// @param input The byte sequence to be hashed. + /// @return Keccak-256(MPT-hash(input)) + function mptHashHash(RLPReader.RLPItem memory input) internal pure returns (bytes32) { + if (input.len < 32) { + return input.rlpBytesKeccak256(); + } else { + return keccak256(abi.encodePacked(input.rlpBytesKeccak256())); + } + } +} diff --git a/ibc-solidity/contracts/light-clients/besu/README.md b/ibc-solidity/contracts/light-clients/besu/README.md new file mode 100644 index 000000000..88099b401 --- /dev/null +++ b/ibc-solidity/contracts/light-clients/besu/README.md @@ -0,0 +1,134 @@ +# Besu IBFT 2.0 / QBFT Light Clients + +This module contains two Solidity light clients for Besu BFT chains: + +- `BesuIBFT2LightClient.sol` +- `BesuQBFTLightClient.sol` + +Both wrappers share the same storage model and proof surface through `BesuLightClientBase.sol`. They differ only in how the commit-seal signing digest is reconstructed from the raw Besu header. + +## Verification model notes + +- Commit-seal verification follows the existing **YUI Solidity client + besu-ibc-relay-prover** model: reconstruct the sealing header by rewriting `extraData` into the protocol-specific signing form, then recover commit-seal signers from the `keccak256(RLP(header))` digest. +- This module does **not** claim to independently rederive a distinct Besu network-level consensus-message payload beyond that established YUI/prover model. +- Trusted overlap is intentionally **strictly greater than one-third** of the trusted validator set, implemented as `floor(n / 3) + 1`. This is intentionally stricter than the current upstream YUI overlap check. + +## Supported scope + +- Besu **IBFT 2.0** +- Besu **QBFT** +- **Header-validator mode only** +- Weak-subjectivity / **trusting-period** verification +- Ethereum **account proofs** and **storage proofs** +- Eureka commitment verification against the counterparty `ICS26Router` proxy account + +## Out of scope in v1 + +- QBFT validator-contract mode +- Mode transitions +- Misbehaviour evidence handling +- Frozen-client machinery + +## Constructor + +Both wrappers take the same constructor arguments: + +```solidity +constructor( + address ibcRouter, + uint64 initialTrustedHeight, + uint64 initialTrustedTimestamp, + bytes32 initialTrustedStorageRoot, + address[] memory initialTrustedValidators, + uint64 trustingPeriod, + uint64 maxClockDrift, + address roleManager +) +``` + +- `ibcRouter`: counterparty `ICS26Router` proxy address whose account/storage proofs are tracked. +- `initialTrustedHeight`: trusted Besu block number. Revision number is always `0`. +- `initialTrustedTimestamp`: trusted header timestamp in seconds. +- `initialTrustedStorageRoot`: storage root of the tracked `ICS26Router` account at `initialTrustedHeight`. +- `initialTrustedValidators`: validator set trusted at `initialTrustedHeight`. +- `trustingPeriod`: weak-subjectivity window in seconds. `0` means no expiry. +- `maxClockDrift`: allowed future drift for submitted headers in seconds. +- `roleManager`: if non-zero, receives admin and `PROOF_SUBMITTER_ROLE`; if zero, proof submission is open to anyone through the zero-address sentinel. + +## `updateClient(bytes)` ABI + +`updateClient` expects `abi.encode(IBesuLightClientMsgs.MsgUpdateClient)`: + +```solidity +struct MsgUpdateClient { + bytes headerRlp; + IICS02ClientMsgs.Height trustedHeight; + bytes accountProof; +} +``` + +- `headerRlp`: full raw Besu block header RLP, including `extraData` and commit seals. +- `trustedHeight`: must use `revisionNumber == 0`. +- `accountProof`: raw RLP-encoded Ethereum account proof for the tracked `ICS26Router` account against the submitted header's `stateRoot`. + +On update, the contract: + +1. parses and validates the Besu header, +2. reconstructs the protocol-specific commit-seal digest following the YUI + prover sealing-header model, +3. checks trusted-validator overlap and new-validator quorum, +4. verifies the tracked router account proof, +5. stores the router account `storageRoot` plus the new validator set. + +## Membership / non-membership proofs + +`verifyMembership` and `verifyNonMembership` expect the standard `ILightClientMsgs` payloads used by Eureka. + +For Besu / EVM counterparties, the expected merkle prefix is: + +```solidity +[bytes("")] +``` + +That means `msg_.path[0]` is the raw Eureka commitment path bytes. + +### Storage slot derivation + +The counterparty `ICS26Router` stores commitments in `IBCStoreUpgradeable` as: + +```solidity +mapping(bytes32 hashedPath => bytes32 commitment) commitments; +``` + +The proof key is derived as: + +```solidity +bytes32 hashedPath = keccak256(rawPath); +bytes32 storageSlot = keccak256(abi.encode(hashedPath, IBCSTORE_STORAGE_SLOT)); +``` + +where `IBCSTORE_STORAGE_SLOT` is the ERC-7201 namespace constant used by `IBCStoreUpgradeable`. + +### Membership + +- `msg_.proof` must be the raw RLP-encoded Ethereum storage proof for `storageSlot`. +- `msg_.value` must be exactly `abi.encodePacked(bytes32Commitment)`. +- The return value is the trusted consensus timestamp in seconds for `msg_.proofHeight`. + +### Non-membership + +- `msg_.proof` must be the raw RLP-encoded Ethereum storage proof for `storageSlot`. +- The proof must show that the slot is absent. +- The return value is the trusted consensus timestamp in seconds for `msg_.proofHeight`. + +## Test fixtures + +The Foundry fixtures under `test/besu-bft/fixtures/` can be regenerated from the focused Besu↔Besu e2e flow: + +```sh +GENERATE_BESU_LIGHT_CLIENT_FIXTURES=true \ +just test-e2e TestWithBesuToBesuTestSuite/Test_ICS20TransferERC20FromChainAToChainB +``` + +This writes `test/besu-bft/fixtures/qbft.json` using live Besu QBFT headers, account proofs, and storage proofs captured during the e2e transfer flow. The negative cases in that fixture are still derived by deterministic off-chain header mutation so the contract tests can keep explicit overlap / quorum / conflict coverage. + +`ibft2.json` remains synthetic until an IBFT2-focused e2e fixture path is added. diff --git a/ibc-solidity/contracts/light-clients/besu/RLPReader.sol b/ibc-solidity/contracts/light-clients/besu/RLPReader.sol new file mode 100644 index 000000000..b842bd816 --- /dev/null +++ b/ibc-solidity/contracts/light-clients/besu/RLPReader.sol @@ -0,0 +1,386 @@ +// SPDX-License-Identifier: Apache-2.0 + +/* + * @author Hamdi Allam hamdi.allam97@gmail.com + * Please reach out with any questions or concerns + */ +// This file is copied from solidity-rlp library. +// https://github.com/hamdiallam/Solidity-RLP/blob/0212f8e754471da67fc5387df7855f47f944f925/contracts/RLPReader.sol +pragma solidity ^0.8.28; + +/* solhint-disable state-visibility, no-inline-assembly, reason-string, gas-custom-errors, gas-increment-by-one, +gas-strict-inequalities */ + +/// @title RLP Reader +/// @notice Library for reading Recursive Length Prefix encoded values. +library RLPReader { + /// @notice First byte for short RLP strings. + uint8 constant STRING_SHORT_START = 0x80; + /// @notice First byte for long RLP strings. + uint8 constant STRING_LONG_START = 0xb8; + /// @notice First byte for short RLP lists. + uint8 constant LIST_SHORT_START = 0xc0; + /// @notice First byte for long RLP lists. + uint8 constant LIST_LONG_START = 0xf8; + /// @notice EVM word size in bytes. + uint8 constant WORD_SIZE = 32; + + /// @notice RLP item memory view. + /// @param len Length of the encoded item. + /// @param memPtr Memory pointer to the encoded item. + struct RLPItem { + uint256 len; + uint256 memPtr; + } + + /// @notice Iterator over an RLP list. + /// @param item List item being iterated. + /// @param nextPtr Memory pointer to the next item in the list. + struct Iterator { + RLPItem item; // Item that's being iterated over. + uint256 nextPtr; // Position of the next item in the list. + } + + /// @notice Returns the next item from an iterator. + /// @param self The iterator. + /// @return The next item in the iteration. + function next(Iterator memory self) internal pure returns (RLPItem memory) { + require(hasNext(self)); + + uint256 ptr = self.nextPtr; + uint256 itemLength = _itemLength(ptr); + self.nextPtr = ptr + itemLength; + + return RLPItem(itemLength, ptr); + } + + /// @notice Checks whether an iterator has more items. + /// @param self The iterator. + /// @return True if the iterator has another item. + function hasNext(Iterator memory self) internal pure returns (bool) { + RLPItem memory item = self.item; + return self.nextPtr < item.memPtr + item.len; + } + + /// @notice Wraps RLP-encoded bytes as an RLP item. + /// @param item RLP-encoded bytes. + /// @return The RLP item memory view. + function toRlpItem(bytes memory item) internal pure returns (RLPItem memory) { + uint256 memPtr; + assembly { + memPtr := add(item, 0x20) + } + + return RLPItem(item.length, memPtr); + } + + /// @notice Creates an iterator over an RLP list. + /// @param self The RLP list item. + /// @return An iterator over the list. + function iterator(RLPItem memory self) internal pure returns (Iterator memory) { + require(isList(self)); + + uint256 ptr = self.memPtr + _payloadOffset(self.memPtr); + return Iterator(self, ptr); + } + + /// @notice Returns the encoded length of an RLP item. + /// @param item The RLP item. + /// @return The encoded item length. + function rlpLen(RLPItem memory item) internal pure returns (uint256) { + return item.len; + } + + /// @notice Returns the payload memory location for an RLP item. + /// @param item The RLP item. + /// @return The payload memory pointer. + /// @return The payload length. + function payloadLocation(RLPItem memory item) internal pure returns (uint256, uint256) { + uint256 offset = _payloadOffset(item.memPtr); + uint256 memPtr = item.memPtr + offset; + uint256 len = item.len - offset; // data length + return (memPtr, len); + } + + /// @notice Returns the payload length for an RLP item. + /// @param item The RLP item. + /// @return The payload length. + function payloadLen(RLPItem memory item) internal pure returns (uint256) { + (, uint256 len) = payloadLocation(item); + return len; + } + + /// @notice Decodes an RLP list into item views. + /// @param item The RLP list item. + /// @return The list item views. + function toList(RLPItem memory item) internal pure returns (RLPItem[] memory) { + require(isList(item)); + + uint256 items = numItems(item); + RLPItem[] memory result = new RLPItem[](items); + + uint256 memPtr = item.memPtr + _payloadOffset(item.memPtr); + uint256 dataLen; + for (uint256 i = 0; i < items; i++) { + dataLen = _itemLength(memPtr); + result[i] = RLPItem(dataLen, memPtr); + memPtr = memPtr + dataLen; + } + + return result; + } + + /// @notice Checks whether an RLP item is a list. + /// @param item The RLP item. + /// @return True if the encoded payload is a list. + function isList(RLPItem memory item) internal pure returns (bool) { + if (item.len == 0) return false; + + uint8 byte0; + uint256 memPtr = item.memPtr; + assembly { + byte0 := byte(0, mload(memPtr)) + } + + if (byte0 < LIST_SHORT_START) return false; + return true; + } + + /// @notice Computes the keccak256 hash of the full RLP encoding without copying. + /// @param item The RLP item. + /// @return The keccak256 hash of the encoded item. + function rlpBytesKeccak256(RLPItem memory item) internal pure returns (bytes32) { + uint256 ptr = item.memPtr; + uint256 len = item.len; + bytes32 result; + assembly { + result := keccak256(ptr, len) + } + return result; + } + + /// @notice Computes the keccak256 hash of an RLP payload without copying. + /// @param item The RLP item. + /// @return The keccak256 hash of the item payload. + function payloadKeccak256(RLPItem memory item) internal pure returns (bytes32) { + (uint256 memPtr, uint256 len) = payloadLocation(item); + bytes32 result; + assembly { + result := keccak256(memPtr, len) + } + return result; + } + + /* + * RLPItem conversions into data types. + */ + + /// @notice Copies the full RLP encoding into a bytes array. + /// @param item The RLP item. + /// @return The RLP-encoded bytes. + function toRlpBytes(RLPItem memory item) internal pure returns (bytes memory) { + bytes memory result = new bytes(item.len); + if (result.length == 0) return result; + + uint256 ptr; + assembly { + ptr := add(0x20, result) + } + + copy(item.memPtr, ptr, item.len); + return result; + } + + /// @notice Converts an RLP item to a boolean. + /// @param item The RLP item. + /// @return The decoded boolean value. + function toBoolean(RLPItem memory item) internal pure returns (bool) { + require(item.len == 1); + uint256 result; + uint256 memPtr = item.memPtr; + assembly { + result := byte(0, mload(memPtr)) + } + + // SEE Github Issue #5. + // Summary: Most commonly used RLP libraries (i.e Geth) will encode + // "0" as "0x80" instead of as "0". We handle this edge case explicitly + // here. + if (result == 0 || result == STRING_SHORT_START) { + return false; + } else { + return true; + } + } + + /// @notice Converts an RLP item to an address. + /// @param item The RLP item. + /// @return The decoded address. + function toAddress(RLPItem memory item) internal pure returns (address) { + // 1 byte for the length prefix + require(item.len == 21); + + return address(uint160(toUint(item))); + } + + /// @notice Converts an RLP item to an unsigned integer. + /// @param item The RLP item. + /// @return The decoded unsigned integer. + function toUint(RLPItem memory item) internal pure returns (uint256) { + require(item.len > 0 && item.len <= 33); + + (uint256 memPtr, uint256 len) = payloadLocation(item); + + uint256 result; + assembly { + result := mload(memPtr) + + // shift to the correct location if neccesary + if lt(len, 32) { result := div(result, exp(256, sub(32, len))) } + } + + return result; + } + + /// @notice Converts an RLP item to an unsigned integer and requires a 32-byte payload. + /// @param item The RLP item. + /// @return The decoded unsigned integer. + function toUintStrict(RLPItem memory item) internal pure returns (uint256) { + // one byte prefix + require(item.len == 33); + + uint256 result; + uint256 memPtr = item.memPtr + 1; + assembly { + result := mload(memPtr) + } + + return result; + } + + /// @notice Copies an RLP item payload into a bytes array. + /// @param item The RLP item. + /// @return The decoded payload bytes. + function toBytes(RLPItem memory item) internal pure returns (bytes memory) { + require(item.len > 0); + + (uint256 memPtr, uint256 len) = payloadLocation(item); + bytes memory result = new bytes(len); + + uint256 destPtr; + assembly { + destPtr := add(0x20, result) + } + + copy(memPtr, destPtr, len); + return result; + } + + /* + * Private Helpers + */ + + /// @notice Counts the payload items inside an encoded list. + /// @param item The RLP list item. + /// @return The number of items in the list. + function numItems(RLPItem memory item) private pure returns (uint256) { + if (item.len == 0) return 0; + + uint256 count = 0; + uint256 currPtr = item.memPtr + _payloadOffset(item.memPtr); + uint256 endPtr = item.memPtr + item.len; + while (currPtr < endPtr) { + currPtr = currPtr + _itemLength(currPtr); // skip over an item + count++; + } + + return count; + } + + /// @notice Computes the full encoded byte length of an RLP item at a memory pointer. + /// @param memPtr Memory pointer to the item. + /// @return The encoded item length. + function _itemLength(uint256 memPtr) private pure returns (uint256) { + uint256 itemLen; + uint256 byte0; + assembly { + byte0 := byte(0, mload(memPtr)) + } + + if (byte0 < STRING_SHORT_START) { + itemLen = 1; + } else if (byte0 < STRING_LONG_START) { + itemLen = byte0 - STRING_SHORT_START + 1; + } else if (byte0 < LIST_SHORT_START) { + assembly { + let byteLen := sub(byte0, 0xb7) // # of bytes the actual length is + memPtr := add(memPtr, 1) // skip over the first byte + + /* 32 byte word size */ + let dataLen := div(mload(memPtr), exp(256, sub(32, byteLen))) // right shifting to get the len + itemLen := add(dataLen, add(byteLen, 1)) + } + } else if (byte0 < LIST_LONG_START) { + itemLen = byte0 - LIST_SHORT_START + 1; + } else { + assembly { + let byteLen := sub(byte0, 0xf7) + memPtr := add(memPtr, 1) + + let dataLen := div(mload(memPtr), exp(256, sub(32, byteLen))) // right shifting to the correct length + itemLen := add(dataLen, add(byteLen, 1)) + } + } + + return itemLen; + } + + /// @notice Computes the offset from an RLP item prefix to its payload. + /// @param memPtr Memory pointer to the item. + /// @return The payload offset in bytes. + function _payloadOffset(uint256 memPtr) private pure returns (uint256) { + uint256 byte0; + assembly { + byte0 := byte(0, mload(memPtr)) + } + + if (byte0 < STRING_SHORT_START) { + return 0; + } else if (byte0 < STRING_LONG_START || (byte0 >= LIST_SHORT_START && byte0 < LIST_LONG_START)) { + return 1; + } else if (byte0 < LIST_SHORT_START) { + // being explicit + return byte0 - (STRING_LONG_START - 1) + 1; + } else { + return byte0 - (LIST_LONG_START - 1) + 1; + } + } + + /// @notice Copies memory from one pointer to another. + /// @param src Pointer to the source memory. + /// @param dest Pointer to the destination memory. + /// @param len Number of bytes to copy. + function copy(uint256 src, uint256 dest, uint256 len) private pure { + if (len == 0) return; + + // copy as many word sizes as possible + for (; len >= WORD_SIZE; len -= WORD_SIZE) { + assembly { + mstore(dest, mload(src)) + } + + src += WORD_SIZE; + dest += WORD_SIZE; + } + + if (len > 0) { + // left over bytes. Mask is used to remove unwanted bytes from the word + uint256 mask = 256 ** (WORD_SIZE - len) - 1; + assembly { + let srcpart := and(mload(src), not(mask)) // zero out src + let destpart := and(mload(dest), mask) // retrieve the bytes + mstore(dest, or(destpart, srcpart)) + } + } + } +} diff --git a/ibc-solidity/contracts/light-clients/besu/errors/IBesuLightClientErrors.sol b/ibc-solidity/contracts/light-clients/besu/errors/IBesuLightClientErrors.sol new file mode 100644 index 000000000..7485ccb94 --- /dev/null +++ b/ibc-solidity/contracts/light-clients/besu/errors/IBesuLightClientErrors.sol @@ -0,0 +1,90 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.28; + +/// @title Besu Light Client Errors +/// @notice Error interface for Besu BFT light clients. +interface IBesuLightClientErrors { + /// @notice The revision number must be zero for Besu light client heights. + /// @param providedRevisionNumber The non-zero revision number. + error InvalidRevisionNumber(uint64 providedRevisionNumber); + /// @notice The submitted header has an invalid RLP item count. + /// @param itemsLength The decoded header item count. + error InvalidHeaderFormat(uint256 itemsLength); + /// @notice The submitted `extraData` field has an invalid RLP item count. + /// @param itemsLength The decoded `extraData` item count. + error InvalidExtraDataFormat(uint256 itemsLength); + /// @notice The submitted header height is zero. + error InvalidHeaderHeight(); + /// @notice The submitted header timestamp is too far in the future. + /// @param currentTimestamp The current block timestamp. + /// @param headerTimestamp The submitted header timestamp. + /// @param maxClockDrift The configured maximum clock drift. + error HeaderFromFuture(uint256 currentTimestamp, uint256 headerTimestamp, uint256 maxClockDrift); + /// @notice No consensus state exists for the requested height. + /// @param revisionHeight The requested revision height. + error ConsensusStateNotFound(uint64 revisionHeight); + /// @notice The trusted consensus state is outside the trusting period. + /// @param trustedTimestamp Timestamp of the trusted consensus state. + /// @param currentTimestamp The current block timestamp. + /// @param trustingPeriod The configured trusting period. + error ConsensusStateExpired(uint64 trustedTimestamp, uint256 currentTimestamp, uint64 trustingPeriod); + /// @notice The Besu BFT mix hash is invalid. + /// @param actualMixHash The mix hash found in the header. + error InvalidMixHash(bytes32 actualMixHash); + /// @notice The Besu BFT difficulty is invalid. + /// @param actualDifficulty The difficulty found in the header. + error InvalidDifficulty(uint256 actualDifficulty); + /// @notice The Besu BFT nonce is invalid. + /// @param actualNonce The nonce found in the header. + error InvalidNonce(bytes actualNonce); + /// @notice The ommers hash is invalid. + /// @param actualOmmersHash The ommers hash found in the header. + error InvalidOmmersHash(bytes32 actualOmmersHash); + /// @notice The validator set is empty. + error EmptyValidatorSet(); + /// @notice A validator address has an invalid byte length. + /// @param length The decoded validator address length. + error InvalidValidatorAddressLength(uint256 length); + /// @notice A validator address is invalid. + /// @param validator The invalid validator address. + error InvalidValidatorAddress(address validator); + /// @notice A validator appears more than once. + /// @param validator The duplicate validator address. + error DuplicateValidator(address validator); + /// @notice A commit seal signer appears more than once. + /// @param signer The duplicate signer address. + error DuplicateCommitSealSigner(address signer); + /// @notice An ECDSA signature has an invalid length. + /// @param length The invalid signature length. + error InvalidECDSASignatureLength(uint256 length); + /// @notice A commit seal did not recover a valid signer. + error InvalidCommitSeal(); + /// @notice The submitted signers do not overlap enough with the trusted validator set. + /// @param actual The number of trusted validators that signed. + /// @param required The minimum required trusted signer count. + error InsufficientTrustedValidatorOverlap(uint256 actual, uint256 required); + /// @notice The submitted signers do not meet quorum for the new validator set. + /// @param actual The number of new validators that signed. + /// @param required The minimum required signer count. + error InsufficientValidatorQuorum(uint256 actual, uint256 required); + /// @notice A proof path has an invalid length. + /// @param expectedLength The expected path length. + /// @param actualLength The actual path length. + error InvalidPathLength(uint256 expectedLength, uint256 actualLength); + /// @notice A membership value has an invalid length. + /// @param expectedLength The expected value length. + /// @param actualLength The actual value length. + error InvalidValueLength(uint256 expectedLength, uint256 actualLength); + /// @notice A proven commitment value does not match the expected value. + /// @param expectedValue The expected commitment value. + /// @param actualValue The proven commitment value. + error InvalidCommitmentValue(bytes32 expectedValue, bytes32 actualValue); + /// @notice A non-membership proof found an existing value. + /// @param actualValue The value found at the proven storage slot. + error ValueExists(bytes32 actualValue); + /// @notice A different consensus state already exists at the submitted height. + /// @param revisionHeight The conflicting revision height. + error ConflictingConsensusState(uint64 revisionHeight); + /// @notice Misbehaviour handling is not supported by this client. + error UnsupportedMisbehaviour(); +} diff --git a/ibc-solidity/contracts/light-clients/besu/msgs/IBesuLightClientMsgs.sol b/ibc-solidity/contracts/light-clients/besu/msgs/IBesuLightClientMsgs.sol new file mode 100644 index 000000000..84f193090 --- /dev/null +++ b/ibc-solidity/contracts/light-clients/besu/msgs/IBesuLightClientMsgs.sol @@ -0,0 +1,40 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.28; + +import { IICS02ClientMsgs } from "../../../msgs/IICS02ClientMsgs.sol"; + +/// @title Besu Light Client Messages +/// @notice Defines shared message and state types for Besu BFT light clients. +interface IBesuLightClientMsgs { + /// @notice Client state for a Besu BFT light client. + /// @param ibcRouter Counterparty ICS26 router address whose storage is proven. + /// @param latestHeight Latest trusted Besu height. + /// @param trustingPeriod Maximum age in seconds for a trusted consensus state. + /// @param maxClockDrift Maximum allowed future drift in seconds for submitted headers. + struct ClientState { + address ibcRouter; + IICS02ClientMsgs.Height latestHeight; + uint64 trustingPeriod; + uint64 maxClockDrift; + } + + /// @notice Trusted consensus state for a Besu height. + /// @param timestamp Header timestamp in seconds. + /// @param storageRoot Storage root of the tracked ICS26 router account. + /// @param validators Validator set committed in the header. + struct ConsensusState { + uint64 timestamp; + bytes32 storageRoot; + address[] validators; + } + + /// @notice Update message containing a Besu header and account proof. + /// @param headerRlp RLP-encoded Besu block header. + /// @param trustedHeight Previously trusted height used for weak-subjectivity checks. + /// @param accountProof Ethereum account proof for the tracked ICS26 router. + struct MsgUpdateClient { + bytes headerRlp; + IICS02ClientMsgs.Height trustedHeight; + bytes accountProof; + } +} diff --git a/ibc-solidity/contracts/light-clients/dummy/DummyLightClient.sol b/ibc-solidity/contracts/light-clients/dummy/DummyLightClient.sol new file mode 100644 index 000000000..a58700171 --- /dev/null +++ b/ibc-solidity/contracts/light-clients/dummy/DummyLightClient.sol @@ -0,0 +1,166 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.28; + +import { ILightClient } from "../../interfaces/ILightClient.sol"; +import { ILightClientMsgs } from "../../msgs/ILightClientMsgs.sol"; +import { IICS02ClientMsgs } from "../../msgs/IICS02ClientMsgs.sol"; + +/// @title Dummy Light Client +/// @notice Insecure light client for local development and testing; proofs are ignored. +contract DummyLightClient is ILightClient { + /// @notice A membership record exists for the queried height and path. + error MembershipExists(); + /// @notice No membership record exists for the queried height and path. + error MissingMembership(); + /// @notice No timestamp has been registered for the queried height. + error UnknownHeight(); + /// @notice The queried value does not match the stored value hash. + error ValueMismatch(); + /// @notice Consensus timestamps must be non-zero. + error ZeroTimestamp(); + + /// @notice Dummy client state returned by `getClientState`. + /// @param latestHeight Latest updated height. + /// @param latestTimestamp Timestamp for the latest updated height. + struct ClientState { + IICS02ClientMsgs.Height latestHeight; + uint64 latestTimestamp; + } + + /// @notice Membership record supplied in an update. + /// @param path Merkle path for the record. + /// @param value Value for the record. + struct Membership { + bytes[] path; + bytes value; + } + + /// @notice Update message accepted by the dummy client. + /// @param height Height whose timestamp and membership records are being set. + /// @param timestamp Consensus timestamp for the height. + /// @param memberships Membership records for the height. + struct MsgUpdateClient { + IICS02ClientMsgs.Height height; + uint64 timestamp; + Membership[] memberships; + } + + /// @notice Latest dummy client state. + ClientState private _clientState; + + /// @notice Consensus timestamps by encoded height key. + mapping(bytes32 heightKey => uint64 timestamp) private _timestamps; + /// @notice Membership value hashes by encoded height and path key. + mapping(bytes32 membershipKey => bytes32 valueHash) private _membershipValueHashes; + + /// @inheritdoc ILightClient + function updateClient(bytes calldata updateMsg) external returns (ILightClientMsgs.UpdateResult) { + MsgUpdateClient memory msg_ = abi.decode(updateMsg, (MsgUpdateClient)); + if (msg_.timestamp == 0) { + revert ZeroTimestamp(); + } + + IICS02ClientMsgs.Height memory height = msg_.height; + bytes32 heightKey = _heightKey(height.revisionNumber, height.revisionHeight); + _timestamps[heightKey] = msg_.timestamp; + _clientState = ClientState({ latestHeight: height, latestTimestamp: msg_.timestamp }); + + for (uint256 i = 0; i < msg_.memberships.length; ++i) { + Membership memory membership = msg_.memberships[i]; + + bytes32 pathHash = keccak256(abi.encode(membership.path)); + bytes32 membershipKey = _membershipKey(height.revisionNumber, height.revisionHeight, pathHash); + _membershipValueHashes[membershipKey] = keccak256(membership.value); + } + + return ILightClientMsgs.UpdateResult.Update; + } + + /// @inheritdoc ILightClient + function verifyMembership(ILightClientMsgs.MsgVerifyMembership calldata msg_) external returns (uint256) { + uint64 timestamp = _timestamp(msg_.proofHeight); + + bytes32 valueHash = _membershipValueHashes[_membershipKey(msg_.proofHeight, msg_.path)]; + if (valueHash == bytes32(0)) { + revert MissingMembership(); + } + if (valueHash != keccak256(msg_.value)) { + revert ValueMismatch(); + } + + return timestamp; + } + + /// @inheritdoc ILightClient + function verifyNonMembership(ILightClientMsgs.MsgVerifyNonMembership calldata msg_) external returns (uint256) { + uint64 timestamp = _timestamp(msg_.proofHeight); + + bytes32 valueHash = _membershipValueHashes[_membershipKey(msg_.proofHeight, msg_.path)]; + if (valueHash != bytes32(0)) { + revert MembershipExists(); + } + + return timestamp; + } + + /// @inheritdoc ILightClient + function misbehaviour(bytes calldata) external { + return; + } + + /// @inheritdoc ILightClient + function getClientState() external view returns (bytes memory) { + return abi.encode(_clientState); + } + + /// @notice Returns the registered timestamp for a height. + /// @param height Height to query. + /// @return Registered consensus timestamp. + function _timestamp(IICS02ClientMsgs.Height calldata height) private view returns (uint64) { + uint64 timestamp = _timestamps[_heightKey(height.revisionNumber, height.revisionHeight)]; + if (timestamp == 0) { + revert UnknownHeight(); + } + return timestamp; + } + + /// @notice Builds a membership storage key. + /// @param height Height for the record. + /// @param path Path for the record. + /// @return Membership storage key. + function _membershipKey( + IICS02ClientMsgs.Height calldata height, + bytes[] calldata path + ) + private + pure + returns (bytes32) + { + return _membershipKey(height.revisionNumber, height.revisionHeight, keccak256(abi.encode(path))); + } + + /// @notice Builds a height storage key. + /// @param revisionNumber Revision number of the height. + /// @param revisionHeight Revision height. + /// @return Height storage key. + function _heightKey(uint64 revisionNumber, uint64 revisionHeight) private pure returns (bytes32) { + return keccak256(abi.encode(revisionNumber, revisionHeight)); + } + + /// @notice Builds a membership storage key from height fields and path hash. + /// @param revisionNumber Revision number of the height. + /// @param revisionHeight Revision height. + /// @param pathHash Hash of the path. + /// @return Membership storage key. + function _membershipKey( + uint64 revisionNumber, + uint64 revisionHeight, + bytes32 pathHash + ) + private + pure + returns (bytes32) + { + return keccak256(abi.encode(revisionNumber, revisionHeight, pathHash)); + } +} diff --git a/ibc-solidity/contracts/light-clients/dummy/README.md b/ibc-solidity/contracts/light-clients/dummy/README.md new file mode 100644 index 000000000..ab925ef5c --- /dev/null +++ b/ibc-solidity/contracts/light-clients/dummy/README.md @@ -0,0 +1,11 @@ +# DummyLightClient + +`DummyLightClient` is an insecure `ILightClient` implementation for local development and tests only. It accepts arbitrary updates and does not verify cryptographic proofs. + +- `updateClient(bytes)` expects ABI encoding of `DummyLightClient.MsgUpdateClient`. +- Updates populate known consensus timestamps and explicit `(height, path) -> value hash` membership records. +- Membership succeeds when the queried `(height, path, value)` matches a stored record. +- Non-membership succeeds when no record exists for `(height, path)` at a known height. +- Proof bytes are ignored. + +Do not use this client for production trust assumptions. diff --git a/ibc-solidity/contracts/utils/SolanaIFTSendCallConstructor.sol b/ibc-solidity/contracts/utils/SolanaIFTSendCallConstructor.sol index d1c452e22..5cca672a0 100644 --- a/ibc-solidity/contracts/utils/SolanaIFTSendCallConstructor.sol +++ b/ibc-solidity/contracts/utils/SolanaIFTSendCallConstructor.sol @@ -4,7 +4,6 @@ pragma solidity ^0.8.28; import { IIFTSendCallConstructor } from "../interfaces/IIFTSendCallConstructor.sol"; import { ISolanaGMPMsgs } from "../msgs/ISolanaGMPMsgs.sol"; -import { Bytes } from "@openzeppelin-contracts/utils/Bytes.sol"; import { SafeCast } from "@openzeppelin-contracts/utils/math/SafeCast.sol"; import { Strings } from "@openzeppelin-contracts/utils/Strings.sol"; import { ERC165 } from "@openzeppelin-contracts/utils/introspection/ERC165.sol"; @@ -164,6 +163,15 @@ contract SolanaIFTSendCallConstructor is IIFTSendCallConstructor, ERC165 { function _buildInstructionData(bytes32 wallet, uint256 amount) private pure returns (bytes memory) { uint64 amountU64 = SafeCast.toUint64(amount); // Convert to little-endian for Borsh encoding expected by Solana - return abi.encodePacked(IFT_MINT_DISCRIMINATOR, wallet, Bytes.reverseBytes8(bytes8(amountU64))); + return abi.encodePacked(IFT_MINT_DISCRIMINATOR, wallet, _reverseBytes8(bytes8(amountU64))); + } + + /// @notice Reverse an 8-byte word. + /// @param input The big-endian bytes. + /// @return output The little-endian bytes. + function _reverseBytes8(bytes8 input) private pure returns (bytes8 output) { + for (uint256 i = 0; i < 8; ++i) { + output |= (input >> (i * 8) & bytes8(uint64(0xff))) << ((7 - i) * 8); + } } } diff --git a/ibc-solidity/solidity.just b/ibc-solidity/solidity.just index 112c9f70f..1b8f61f14 100644 --- a/ibc-solidity/solidity.just +++ b/ibc-solidity/solidity.just @@ -55,6 +55,10 @@ generate-abi: build-contracts jq -r '.bytecode.object' out/RelayerHelper.sol/RelayerHelper.json > tmp/abigen/RelayerHelper.bin jq '.abi' out/AttestationLightClient.sol/AttestationLightClient.json > abi/AttestationLightClient.json jq -r '.bytecode.object' out/AttestationLightClient.sol/AttestationLightClient.json > tmp/abigen/AttestationLightClient.bin + jq '.abi' out/BesuIBFT2LightClient.sol/BesuIBFT2LightClient.json > abi/BesuIBFT2LightClient.json + jq '.abi' out/BesuQBFTLightClient.sol/BesuQBFTLightClient.json > abi/BesuQBFTLightClient.json + jq '.abi' out/DummyLightClient.sol/DummyLightClient.json > abi/DummyLightClient.json + jq -r '.bytecode.object' out/DummyLightClient.sol/DummyLightClient.json > tmp/abigen/DummyLightClient.bin jq '.abi' out/IFTOwnable.sol/IFTOwnable.json > abi/IFTOwnable.json jq -r '.bytecode.object' out/IFTOwnable.sol/IFTOwnable.json > tmp/abigen/IFTOwnable.bin jq '.abi' out/ERC1967Proxy.sol/ERC1967Proxy.json > abi/ERC1967Proxy.json @@ -73,6 +77,8 @@ generate-abi: build-contracts abigen --abi abi/AttestationLightClient.json --bin tmp/abigen/AttestationLightClient.bin --pkg attestation --type Contract --out ../packages/go-abigen/attestation/contract.go abigen --abi abi/ERC1967Proxy.json --bin tmp/abigen/ERC1967Proxy.bin --pkg erc1967proxy --type Contract --out ../packages/go-abigen/erc1967proxy/contract.go abigen --abi abi/EVMIFTSendCallConstructor.json --bin tmp/abigen/EVMIFTSendCallConstructor.bin --pkg evmiftsendcall --type Contract --out ../packages/go-abigen/evmiftsendcall/contract.go + mkdir -p ../packages/go-abigen/dummy + abigen --abi abi/DummyLightClient.json --bin tmp/abigen/DummyLightClient.bin --pkg dummy --type Contract --out ../packages/go-abigen/dummy/contract.go rm -rf tmp/abigen # Generate the ABI files with bytecode for the required contracts @@ -80,6 +86,9 @@ generate-abi: build-contracts generate-abi-bytecode: build-contracts cp out/SP1ICS07Tendermint.sol/SP1ICS07Tendermint.json abi/bytecode cp out/AttestationLightClient.sol/AttestationLightClient.json abi/bytecode + cp out/BesuIBFT2LightClient.sol/BesuIBFT2LightClient.json abi/bytecode + cp out/BesuQBFTLightClient.sol/BesuQBFTLightClient.json abi/bytecode + cp out/DummyLightClient.sol/DummyLightClient.json abi/bytecode # Clean up the foundry cache and out directories [group('clean')] diff --git a/ibc-solidity/test/besu-bft/BesuIBFT2LightClient.t.sol b/ibc-solidity/test/besu-bft/BesuIBFT2LightClient.t.sol new file mode 100644 index 000000000..3381d339d --- /dev/null +++ b/ibc-solidity/test/besu-bft/BesuIBFT2LightClient.t.sol @@ -0,0 +1,46 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.28; + +import { BesuIBFT2LightClient } from "../../contracts/light-clients/besu/BesuIBFT2LightClient.sol"; +import { BesuQBFTLightClient } from "../../contracts/light-clients/besu/BesuQBFTLightClient.sol"; +import { BesuLightClientTestBase, IBesuTestLightClient } from "./BesuLightClientTestBase.sol"; + +contract BesuIBFT2LightClientTest is BesuLightClientTestBase { + function _fixtureFile() internal pure override returns (string memory) { + return "ibft2.json"; + } + + function _deployPrimaryClient() internal override returns (IBesuTestLightClient) { + return IBesuTestLightClient( + address( + new BesuIBFT2LightClient( + fixture.routerAddress, + fixture.initialTrustedHeight, + fixture.initialTrustedTimestamp, + fixture.initialTrustedStorageRoot, + fixture.initialTrustedValidators, + fixture.trustingPeriod, + fixture.maxClockDrift, + address(0) + ) + ) + ); + } + + function _deployWrongWrapper() internal override returns (IBesuTestLightClient) { + return IBesuTestLightClient( + address( + new BesuQBFTLightClient( + fixture.routerAddress, + fixture.initialTrustedHeight, + fixture.initialTrustedTimestamp, + fixture.initialTrustedStorageRoot, + fixture.initialTrustedValidators, + fixture.trustingPeriod, + fixture.maxClockDrift, + address(0) + ) + ) + ); + } +} diff --git a/ibc-solidity/test/besu-bft/BesuLightClientTestBase.sol b/ibc-solidity/test/besu-bft/BesuLightClientTestBase.sol new file mode 100644 index 000000000..0ed16eb0c --- /dev/null +++ b/ibc-solidity/test/besu-bft/BesuLightClientTestBase.sol @@ -0,0 +1,354 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.28; + +// solhint-disable gas-struct-packing + +import { Test } from "forge-std/Test.sol"; +import { stdJson } from "forge-std/StdJson.sol"; + +import { ILightClient } from "../../contracts/interfaces/ILightClient.sol"; +import { ILightClientMsgs } from "../../contracts/msgs/ILightClientMsgs.sol"; +import { IICS02ClientMsgs } from "../../contracts/msgs/IICS02ClientMsgs.sol"; +import { IBesuLightClientMsgs } from "../../contracts/light-clients/besu/msgs/IBesuLightClientMsgs.sol"; +import { IBesuLightClientErrors } from "../../contracts/light-clients/besu/errors/IBesuLightClientErrors.sol"; + +struct BesuUpdateFixture { + uint64 height; + bytes headerRlp; + uint64 trustedHeight; + bytes accountProof; + uint64 expectedTimestamp; + bytes32 expectedStorageRoot; + address[] expectedValidators; +} + +struct BesuProofFixture { + bytes proof; + uint64 proofHeight; + bytes path; + bytes value; + uint64 expectedTimestamp; +} + +struct BesuFixture { + address routerAddress; + uint64 initialTrustedHeight; + uint64 initialTrustedTimestamp; + bytes32 initialTrustedStorageRoot; + address[] initialTrustedValidators; + uint64 trustingPeriod; + uint64 maxClockDrift; + BesuUpdateFixture updateHeight11; + BesuUpdateFixture updateHeight12; + BesuUpdateFixture lowQuorumHeight12; + BesuUpdateFixture conflictingHeight12; + BesuUpdateFixture lowOverlapHeight13; + BesuProofFixture membership; + BesuProofFixture nonMembership; +} + +interface IBesuTestLightClient is ILightClient { + function getConsensusState(uint64 revisionHeight) external view returns (bytes memory); +} + +abstract contract BesuLightClientTestBase is Test { + using stdJson for string; + + string internal constant FIXTURE_DIR = "/test/besu-bft/fixtures/"; + + BesuFixture internal fixture; + IBesuTestLightClient internal client; + IBesuTestLightClient internal wrongWrapper; + + function setUp() public virtual { + fixture = _loadFixture(_fixtureFile()); + client = _deployPrimaryClient(); + wrongWrapper = _deployWrongWrapper(); + } + + function test_updateClient_validAdjacentUpdate() public { + vm.warp(fixture.initialTrustedTimestamp + 1); + + ILightClientMsgs.UpdateResult result = client.updateClient(_encodeUpdate(fixture.updateHeight11)); + + assertEq(uint8(result), uint8(ILightClientMsgs.UpdateResult.Update)); + _assertClientState( + fixture.updateHeight11.expectedTimestamp, + fixture.updateHeight11.expectedStorageRoot, + fixture.updateHeight11.height + ); + } + + function test_updateClient_validNonAdjacentUpdate() public { + vm.warp(fixture.initialTrustedTimestamp + 1); + + ILightClientMsgs.UpdateResult result = client.updateClient(_encodeUpdate(fixture.updateHeight12)); + + assertEq(uint8(result), uint8(ILightClientMsgs.UpdateResult.Update)); + _assertClientState( + fixture.updateHeight12.expectedTimestamp, + fixture.updateHeight12.expectedStorageRoot, + fixture.updateHeight12.height + ); + } + + function test_verifyMembership_returnsStoredTimestamp() public { + vm.warp(fixture.initialTrustedTimestamp + 1); + client.updateClient(_encodeUpdate(fixture.updateHeight12)); + + uint256 timestamp = client.verifyMembership( + ILightClientMsgs.MsgVerifyMembership({ + proof: fixture.membership.proof, + proofHeight: IICS02ClientMsgs.Height({ + revisionNumber: 0, revisionHeight: fixture.membership.proofHeight + }), + path: _singlePath(fixture.membership.path), + value: fixture.membership.value + }) + ); + + assertEq(timestamp, fixture.membership.expectedTimestamp); + } + + function test_verifyNonMembership_returnsStoredTimestamp() public { + vm.warp(fixture.initialTrustedTimestamp + 1); + client.updateClient(_encodeUpdate(fixture.updateHeight12)); + + uint256 timestamp = client.verifyNonMembership( + ILightClientMsgs.MsgVerifyNonMembership({ + proof: fixture.nonMembership.proof, + proofHeight: IICS02ClientMsgs.Height({ + revisionNumber: 0, revisionHeight: fixture.nonMembership.proofHeight + }), + path: _singlePath(fixture.nonMembership.path) + }) + ); + + assertEq(timestamp, fixture.nonMembership.expectedTimestamp); + } + + function test_updateClient_revertExpiredTrustedState() public { + vm.warp(fixture.initialTrustedTimestamp + fixture.trustingPeriod + 1); + + vm.expectRevert( + abi.encodeWithSelector( + IBesuLightClientErrors.ConsensusStateExpired.selector, + fixture.initialTrustedTimestamp, + fixture.initialTrustedTimestamp + fixture.trustingPeriod + 1, + fixture.trustingPeriod + ) + ); + client.updateClient(_encodeUpdate(fixture.updateHeight12)); + } + + function test_updateClient_revertInsufficientTrustedOverlap() public { + vm.warp(fixture.initialTrustedTimestamp + 1); + + vm.expectRevert( + abi.encodeWithSelector(IBesuLightClientErrors.InsufficientTrustedValidatorOverlap.selector, 1, 2) + ); + client.updateClient(_encodeUpdate(fixture.lowOverlapHeight13)); + } + + function test_updateClient_revertInsufficientNewValidatorQuorum() public { + vm.warp(fixture.initialTrustedTimestamp + 1); + + vm.expectRevert(abi.encodeWithSelector(IBesuLightClientErrors.InsufficientValidatorQuorum.selector, 2, 3)); + client.updateClient(_encodeUpdate(fixture.lowQuorumHeight12)); + } + + function test_updateClient_revertWrongRevisionNumber() public { + vm.warp(fixture.initialTrustedTimestamp + 1); + + IBesuLightClientMsgs.MsgUpdateClient memory update = + abi.decode(_encodeUpdate(fixture.updateHeight12), (IBesuLightClientMsgs.MsgUpdateClient)); + update.trustedHeight.revisionNumber = 1; + + vm.expectRevert(abi.encodeWithSelector(IBesuLightClientErrors.InvalidRevisionNumber.selector, 1)); + client.updateClient(abi.encode(update)); + } + + function test_verifyMembership_revertWrongRevisionNumber() public { + vm.warp(fixture.initialTrustedTimestamp + 1); + client.updateClient(_encodeUpdate(fixture.updateHeight12)); + + vm.expectRevert(abi.encodeWithSelector(IBesuLightClientErrors.InvalidRevisionNumber.selector, 1)); + client.verifyMembership( + ILightClientMsgs.MsgVerifyMembership({ + proof: fixture.membership.proof, + proofHeight: IICS02ClientMsgs.Height({ + revisionNumber: 1, revisionHeight: fixture.membership.proofHeight + }), + path: _singlePath(fixture.membership.path), + value: fixture.membership.value + }) + ); + } + + function test_verifyMembership_revertWrongPathShape() public { + vm.warp(fixture.initialTrustedTimestamp + 1); + client.updateClient(_encodeUpdate(fixture.updateHeight12)); + + bytes[] memory path = new bytes[](2); + path[0] = fixture.membership.path; + path[1] = fixture.nonMembership.path; + + vm.expectRevert(abi.encodeWithSelector(IBesuLightClientErrors.InvalidPathLength.selector, 1, 2)); + client.verifyMembership( + ILightClientMsgs.MsgVerifyMembership({ + proof: fixture.membership.proof, + proofHeight: IICS02ClientMsgs.Height({ + revisionNumber: 0, revisionHeight: fixture.membership.proofHeight + }), + path: path, + value: fixture.membership.value + }) + ); + } + + function test_verifyMembership_revertWrongCommitmentValue() public { + vm.warp(fixture.initialTrustedTimestamp + 1); + client.updateClient(_encodeUpdate(fixture.updateHeight12)); + + bytes memory wrongValue = abi.encodePacked(bytes32(uint256(1))); + vm.expectRevert( + abi.encodeWithSelector( + IBesuLightClientErrors.InvalidCommitmentValue.selector, + bytes32(uint256(1)), + abi.decode(fixture.membership.value, (bytes32)) + ) + ); + client.verifyMembership( + ILightClientMsgs.MsgVerifyMembership({ + proof: fixture.membership.proof, + proofHeight: IICS02ClientMsgs.Height({ + revisionNumber: 0, revisionHeight: fixture.membership.proofHeight + }), + path: _singlePath(fixture.membership.path), + value: wrongValue + }) + ); + } + + function test_updateClient_revertConflictingSameHeight() public { + vm.warp(fixture.initialTrustedTimestamp + 1); + client.updateClient(_encodeUpdate(fixture.updateHeight12)); + + vm.expectRevert( + abi.encodeWithSelector( + IBesuLightClientErrors.ConflictingConsensusState.selector, fixture.conflictingHeight12.height + ) + ); + client.updateClient(_encodeUpdate(fixture.conflictingHeight12)); + } + + function test_misbehaviour_reverts() public { + vm.expectRevert(abi.encodeWithSelector(IBesuLightClientErrors.UnsupportedMisbehaviour.selector)); + client.misbehaviour(bytes("")); + } + + function test_updateClient_revertThroughWrongWrapper() public { + vm.warp(fixture.initialTrustedTimestamp + 1); + + vm.expectRevert( + abi.encodeWithSelector(IBesuLightClientErrors.InsufficientTrustedValidatorOverlap.selector, 0, 2) + ); + wrongWrapper.updateClient(_encodeUpdate(fixture.updateHeight12)); + } + + function _assertClientState( + uint64 expectedTimestamp, + bytes32 expectedStorageRoot, + uint64 expectedLatestHeight + ) + internal + view + { + (address ibcRouter, IICS02ClientMsgs.Height memory latestHeight, uint64 trustingPeriod, uint64 maxClockDrift) = + abi.decode(client.getClientState(), (address, IICS02ClientMsgs.Height, uint64, uint64)); + assertEq(ibcRouter, fixture.routerAddress); + assertEq(latestHeight.revisionNumber, 0); + assertEq(latestHeight.revisionHeight, expectedLatestHeight); + assertEq(trustingPeriod, fixture.trustingPeriod); + assertEq(maxClockDrift, fixture.maxClockDrift); + + (uint64 timestamp, bytes32 storageRoot, address[] memory validators) = + abi.decode(client.getConsensusState(expectedLatestHeight), (uint64, bytes32, address[])); + assertEq(timestamp, expectedTimestamp); + assertEq(storageRoot, expectedStorageRoot); + + address[] memory expectedValidators = expectedLatestHeight == fixture.updateHeight11.height + ? fixture.updateHeight11.expectedValidators + : fixture.updateHeight12.expectedValidators; + assertEq(validators.length, expectedValidators.length); + for (uint256 i = 0; i < expectedValidators.length; ++i) { + assertEq(validators[i], expectedValidators[i]); + } + } + + function _encodeUpdate(BesuUpdateFixture memory update) internal pure returns (bytes memory) { + return abi.encode( + IBesuLightClientMsgs.MsgUpdateClient({ + headerRlp: update.headerRlp, + trustedHeight: IICS02ClientMsgs.Height({ revisionNumber: 0, revisionHeight: update.trustedHeight }), + accountProof: update.accountProof + }) + ); + } + + function _singlePath(bytes memory path) internal pure returns (bytes[] memory out) { + out = new bytes[](1); + out[0] = path; + } + + function _loadFixture(string memory fileName) internal view returns (BesuFixture memory) { + string memory root = vm.projectRoot(); + string memory path = string.concat(root, FIXTURE_DIR, fileName); + string memory json = vm.readFile(path); + + return BesuFixture({ + routerAddress: json.readAddress(".routerAddress"), + initialTrustedHeight: uint64(json.readUint(".initialTrustedHeight")), + initialTrustedTimestamp: uint64(json.readUint(".initialTrustedTimestamp")), + initialTrustedStorageRoot: json.readBytes32(".initialTrustedStorageRoot"), + initialTrustedValidators: abi.decode(json.parseRaw(".initialTrustedValidators"), (address[])), + trustingPeriod: uint64(json.readUint(".trustingPeriod")), + maxClockDrift: uint64(json.readUint(".maxClockDrift")), + updateHeight11: _readUpdate(json, ".updateHeight11"), + updateHeight12: _readUpdate(json, ".updateHeight12"), + lowQuorumHeight12: _readUpdate(json, ".lowQuorumHeight12"), + conflictingHeight12: _readUpdate(json, ".conflictingHeight12"), + lowOverlapHeight13: _readUpdate(json, ".lowOverlapHeight13"), + membership: _readProof(json, ".membership"), + nonMembership: _readProof(json, ".nonMembership") + }); + } + + function _readUpdate(string memory json, string memory path) internal view returns (BesuUpdateFixture memory) { + return BesuUpdateFixture({ + height: uint64(json.readUint(string.concat(path, ".height"))), + headerRlp: json.readBytes(string.concat(path, ".headerRlp")), + trustedHeight: uint64(json.readUint(string.concat(path, ".trustedHeight"))), + accountProof: json.readBytes(string.concat(path, ".accountProof")), + expectedTimestamp: uint64(json.readUint(string.concat(path, ".expectedTimestamp"))), + expectedStorageRoot: json.readBytes32(string.concat(path, ".expectedStorageRoot")), + expectedValidators: abi.decode(json.parseRaw(string.concat(path, ".expectedValidators")), (address[])) + }); + } + + function _readProof(string memory json, string memory path) internal view returns (BesuProofFixture memory) { + return BesuProofFixture({ + proof: json.readBytes(string.concat(path, ".proof")), + proofHeight: uint64(json.readUint(string.concat(path, ".proofHeight"))), + path: json.readBytes(string.concat(path, ".path")), + value: json.keyExists(string.concat(path, ".value")) + ? json.readBytes(string.concat(path, ".value")) + : bytes(""), + expectedTimestamp: uint64(json.readUint(string.concat(path, ".expectedTimestamp"))) + }); + } + + function _fixtureFile() internal pure virtual returns (string memory); + function _deployPrimaryClient() internal virtual returns (IBesuTestLightClient); + function _deployWrongWrapper() internal virtual returns (IBesuTestLightClient); +} diff --git a/ibc-solidity/test/besu-bft/BesuQBFTLightClient.t.sol b/ibc-solidity/test/besu-bft/BesuQBFTLightClient.t.sol new file mode 100644 index 000000000..aea974543 --- /dev/null +++ b/ibc-solidity/test/besu-bft/BesuQBFTLightClient.t.sol @@ -0,0 +1,46 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.28; + +import { BesuIBFT2LightClient } from "../../contracts/light-clients/besu/BesuIBFT2LightClient.sol"; +import { BesuQBFTLightClient } from "../../contracts/light-clients/besu/BesuQBFTLightClient.sol"; +import { BesuLightClientTestBase, IBesuTestLightClient } from "./BesuLightClientTestBase.sol"; + +contract BesuQBFTLightClientTest is BesuLightClientTestBase { + function _fixtureFile() internal pure override returns (string memory) { + return "qbft.json"; + } + + function _deployPrimaryClient() internal override returns (IBesuTestLightClient) { + return IBesuTestLightClient( + address( + new BesuQBFTLightClient( + fixture.routerAddress, + fixture.initialTrustedHeight, + fixture.initialTrustedTimestamp, + fixture.initialTrustedStorageRoot, + fixture.initialTrustedValidators, + fixture.trustingPeriod, + fixture.maxClockDrift, + address(0) + ) + ) + ); + } + + function _deployWrongWrapper() internal override returns (IBesuTestLightClient) { + return IBesuTestLightClient( + address( + new BesuIBFT2LightClient( + fixture.routerAddress, + fixture.initialTrustedHeight, + fixture.initialTrustedTimestamp, + fixture.initialTrustedStorageRoot, + fixture.initialTrustedValidators, + fixture.trustingPeriod, + fixture.maxClockDrift, + address(0) + ) + ) + ); + } +} diff --git a/ibc-solidity/test/besu-bft/fixtures/ibft2.json b/ibc-solidity/test/besu-bft/fixtures/ibft2.json new file mode 100644 index 000000000..ee31f0cfa --- /dev/null +++ b/ibc-solidity/test/besu-bft/fixtures/ibft2.json @@ -0,0 +1,97 @@ +{ + "routerAddress": "0x1234567890AbcdEF1234567890aBcdef12345678", + "initialTrustedHeight": 10, + "initialTrustedTimestamp": 1000, + "initialTrustedStorageRoot": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", + "initialTrustedValidators": [ + "0xFE3B557E8Fb62b89F4916B721be55cEb828dBd73", + "0x627306090abaB3A6e1400e9345bC60c78a8BEf57", + "0xf17f52151EbEF6C7334FAD080c5704D77216b732", + "0xa89F47C6b463f74d87572b058427dA0A13ec5425" + ], + "trustingPeriod": 1000, + "maxClockDrift": 30, + "updateHeight11": { + "height": 11, + "headerRlp": "0xf9033ca00000000000000000000000000000000000000000000000000000000000000000a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347940000000000000000000000000000000000000000a0f2081dd8c37a93ef3050951656b124dba1eb1e541e52e98c8bbbac27611bae73a00000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000000b9010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010b8401c9c380808203f2b90147f90144a00000000000000000000000000000000000000000000000000000000000000000f85494fe3b557e8fb62b89f4916b721be55ceb828dbd7394627306090abab3a6e1400e9345bc60c78a8bef5794f17f52151ebef6c7334fad080c5704d77216b73294a89f47c6b463f74d87572b058427da0a13ec54258080f8c9b8415c237229535cb5b756ac35933bd6460128d8358af7224b3d373bc1e58671b9e26ddd5f2f6318493978a02162192da231068943ef7d31f3d49a99912245c8933300b841737d327b80cc8c318cfc223a801b7d51f17a3e61a008ba796c9a8128c13f3a6f5d36764ac0aa1f4cf788d18831193962a7f4bd42e4356bc2d2cd6795d1cc29cd01b841681d75e13f57e972a3c7696b2ff358722ab0b5d0878095146fdb03a7a688975814d97fac43069952f0382aee020d77f554f4a31e502259e28c271f748e1c113e01a063746963616c2062797a616e74696e65206661756c7420746f6c6572616e6365880000000000000000", + "trustedHeight": 10, + "accountProof": "0xf86cf86aa1205f6174255b44b7ca652c5289d2546de65e4394eb6aa52a40045e01237736d023b846f8440180a01429811e8e479d4d8d3862e6da4c368715f6574d307bb0ffbea0220c2351cfd4a0c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "expectedTimestamp": 1010, + "expectedStorageRoot": "0x1429811e8e479d4d8d3862e6da4c368715f6574d307bb0ffbea0220c2351cfd4", + "expectedValidators": [ + "0xFE3B557E8Fb62b89F4916B721be55cEb828dBd73", + "0x627306090abaB3A6e1400e9345bC60c78a8BEf57", + "0xf17f52151EbEF6C7334FAD080c5704D77216b732", + "0xa89F47C6b463f74d87572b058427dA0A13ec5425" + ] + }, + "updateHeight12": { + "height": 12, + "headerRlp": "0xf9033ca00000000000000000000000000000000000000000000000000000000000000000a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347940000000000000000000000000000000000000000a0f4fb47fab37d2702f85f5562b52da4e7b5e4a677298193c9f797e467e9cc046aa00000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000000b9010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010c8401c9c380808203fcb90147f90144a00000000000000000000000000000000000000000000000000000000000000000f85494fe3b557e8fb62b89f4916b721be55ceb828dbd7394627306090abab3a6e1400e9345bc60c78a8bef5794f17f52151ebef6c7334fad080c5704d77216b73294cbed645b1c1a6254f1149df51d3591c6b38030078080f8c9b84100eaa1df128060399277424940a4cccd0ceb29052f83358f1798cf9ad95c0f0c3e858beb37cd83332935b0927d2365e439a9b1c319bf0a0adaf2f62d61dff58901b841c4bf6688b64aa46676b969e679ed39c1a0b2ae13f8c7e49ff34629f49b03bb1336a7e049716855a50a637c49dbd01d576571ef9294335623d4d42ef3b184e73601b8412df49de5d8c13913300fd9ebd1d70d76ce9f73f26e122e451c464031744f079a438762535d0e5cc031383599d8b85ae91bff81d4d10980262f70ec6ed82666f700a063746963616c2062797a616e74696e65206661756c7420746f6c6572616e6365880000000000000000", + "trustedHeight": 10, + "accountProof": "0xf86cf86aa1205f6174255b44b7ca652c5289d2546de65e4394eb6aa52a40045e01237736d023b846f8440180a04ec23ab75bd034f079225053b7f607981b27ad24a5e964743526eeccefc5f500a0c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "expectedTimestamp": 1020, + "expectedStorageRoot": "0x4ec23ab75bd034f079225053b7f607981b27ad24a5e964743526eeccefc5f500", + "expectedValidators": [ + "0xFE3B557E8Fb62b89F4916B721be55cEb828dBd73", + "0x627306090abaB3A6e1400e9345bC60c78a8BEf57", + "0xf17f52151EbEF6C7334FAD080c5704D77216b732", + "0xcBED645B1C1a6254f1149Df51d3591c6B3803007" + ] + }, + "lowQuorumHeight12": { + "height": 12, + "headerRlp": "0xf902f9a00000000000000000000000000000000000000000000000000000000000000000a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347940000000000000000000000000000000000000000a0f4fb47fab37d2702f85f5562b52da4e7b5e4a677298193c9f797e467e9cc046aa00000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000000b9010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010c8401c9c380808203fcb90104f90101a00000000000000000000000000000000000000000000000000000000000000000f85494fe3b557e8fb62b89f4916b721be55ceb828dbd7394627306090abab3a6e1400e9345bc60c78a8bef5794f17f52151ebef6c7334fad080c5704d77216b73294cbed645b1c1a6254f1149df51d3591c6b38030078080f886b84100eaa1df128060399277424940a4cccd0ceb29052f83358f1798cf9ad95c0f0c3e858beb37cd83332935b0927d2365e439a9b1c319bf0a0adaf2f62d61dff58901b841c4bf6688b64aa46676b969e679ed39c1a0b2ae13f8c7e49ff34629f49b03bb1336a7e049716855a50a637c49dbd01d576571ef9294335623d4d42ef3b184e73601a063746963616c2062797a616e74696e65206661756c7420746f6c6572616e6365880000000000000000", + "trustedHeight": 10, + "accountProof": "0xf86cf86aa1205f6174255b44b7ca652c5289d2546de65e4394eb6aa52a40045e01237736d023b846f8440180a04ec23ab75bd034f079225053b7f607981b27ad24a5e964743526eeccefc5f500a0c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "expectedTimestamp": 1020, + "expectedStorageRoot": "0x4ec23ab75bd034f079225053b7f607981b27ad24a5e964743526eeccefc5f500", + "expectedValidators": [ + "0xFE3B557E8Fb62b89F4916B721be55cEb828dBd73", + "0x627306090abaB3A6e1400e9345bC60c78a8BEf57", + "0xf17f52151EbEF6C7334FAD080c5704D77216b732", + "0xcBED645B1C1a6254f1149Df51d3591c6B3803007" + ] + }, + "conflictingHeight12": { + "height": 12, + "headerRlp": "0xf9033ca00000000000000000000000000000000000000000000000000000000000000000a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347940000000000000000000000000000000000000000a002920b43c148d62cc879e6d86a0fea5cb5f6e9d5bc65b85f012955ddcf82b134a00000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000000b9010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010c8401c9c380808203fdb90147f90144a00000000000000000000000000000000000000000000000000000000000000000f85494fe3b557e8fb62b89f4916b721be55ceb828dbd7394627306090abab3a6e1400e9345bc60c78a8bef5794f17f52151ebef6c7334fad080c5704d77216b73294cbed645b1c1a6254f1149df51d3591c6b38030078080f8c9b8416f5732f70922c0ca46fc2bd56db36c79b7cc9da2b73f56513703b8daaf75001a1907b11de095b3ba30413d17584b7d448414ea87872609d89f264d76eb3c2bd800b8411ef65e4f2a8d80933195e7b1a1451fa114e9cfb44fe6c89688a73f0a77b72f04701d0de8cb85fcc7347ba5dc6e066bb14ff77bdcc582ed1cba0cc902ba0c698d01b841464fc7ac400db011dbfe93fe8ff28dfc13f94074c5225bfd0b63827d5dc40eb335d3982bdf385f569d668844155121ce0b74d681e914d79392b492698d10611800a063746963616c2062797a616e74696e65206661756c7420746f6c6572616e6365880000000000000000", + "trustedHeight": 10, + "accountProof": "0xf86cf86aa1205f6174255b44b7ca652c5289d2546de65e4394eb6aa52a40045e01237736d023b846f8440180a05cc3ae2f35df83cafbdd6f6220a2eceb3e7ef6c9e10df3787bd8e9d5deae1f92a0c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "expectedTimestamp": 1021, + "expectedStorageRoot": "0x5cc3ae2f35df83cafbdd6f6220a2eceb3e7ef6c9e10df3787bd8e9d5deae1f92", + "expectedValidators": [ + "0xFE3B557E8Fb62b89F4916B721be55cEb828dBd73", + "0x627306090abaB3A6e1400e9345bC60c78a8BEf57", + "0xf17f52151EbEF6C7334FAD080c5704D77216b732", + "0xcBED645B1C1a6254f1149Df51d3591c6B3803007" + ] + }, + "lowOverlapHeight13": { + "height": 13, + "headerRlp": "0xf9033ca00000000000000000000000000000000000000000000000000000000000000000a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347940000000000000000000000000000000000000000a00d2546fbdd16af694bb1e7a28440bd1d56197e4eb349532dba3b0b71778ac051a00000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000000b9010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010d8401c9c38080820406b90147f90144a00000000000000000000000000000000000000000000000000000000000000000f85494fe3b557e8fb62b89f4916b721be55ceb828dbd7394cbed645b1c1a6254f1149df51d3591c6b38030079400731540cd6060991d6b9c57ce295998d9bc2fab947e5f4552091a69125d5dfcb7b8c2659029395bdf8080f8c9b841ae4e5c4cd1f82a1d962f8ffde7c51396f2ac85fe4d3cc9b9a5eb249c1c3850665faa295fa6c0444025cc66b4e7d18b4b8469f3f851e735744babc3a99a12b58201b84194c7c8462d7d74c9bfd80f0e62b76a49316f2a0075ec7df65fb207d2c0eb75801f01c30b6a4f0445cb1cb8936d9f27587575449c1e25b17338c91eba6ac6a43301b841b854f80b9675f6b1f403b0c415ea6780f46e76d7c744f2d4d93004f4cdc533420efd490dcb0a80f298e6046ce974c64a45dab9cf86022bd478588e4f405b3e3d00a063746963616c2062797a616e74696e65206661756c7420746f6c6572616e6365880000000000000000", + "trustedHeight": 10, + "accountProof": "0xf86cf86aa1205f6174255b44b7ca652c5289d2546de65e4394eb6aa52a40045e01237736d023b846f8440180a05dd23a6a8429ec8af97267494c6fa465682207585232c1ac7cd53eb9fd1b0318a0c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "expectedTimestamp": 1030, + "expectedStorageRoot": "0x5dd23a6a8429ec8af97267494c6fa465682207585232c1ac7cd53eb9fd1b0318", + "expectedValidators": [ + "0xFE3B557E8Fb62b89F4916B721be55cEb828dBd73", + "0xcBED645B1C1a6254f1149Df51d3591c6B3803007", + "0x00731540cd6060991D6B9C57CE295998d9bC2faB", + "0x7E5F4552091A69125d5DfCb7b8C2659029395Bdf" + ] + }, + "membership": { + "proof": "0xf846f844a1203bd6be3bff117383e9ac885fff068af75120fde9a2c812e23878d38cce456852a1a0ac99c4edfa8056f2d49a30515770881f02a4f118254da280fe00dbcd0f54e876", + "proofHeight": 12, + "path": "0x636c69656e742d6f6e2d62657375010000000000000007", + "value": "0xac99c4edfa8056f2d49a30515770881f02a4f118254da280fe00dbcd0f54e876", + "expectedTimestamp": 1020 + }, + "nonMembership": { + "proof": "0xf846f844a1203bd6be3bff117383e9ac885fff068af75120fde9a2c812e23878d38cce456852a1a0ac99c4edfa8056f2d49a30515770881f02a4f118254da280fe00dbcd0f54e876", + "proofHeight": 12, + "path": "0x636c69656e742d6f6e2d62657375020000000000000007", + "expectedTimestamp": 1020 + } +} diff --git a/ibc-solidity/test/besu-bft/fixtures/qbft.json b/ibc-solidity/test/besu-bft/fixtures/qbft.json new file mode 100644 index 000000000..d7d6f7856 --- /dev/null +++ b/ibc-solidity/test/besu-bft/fixtures/qbft.json @@ -0,0 +1,97 @@ +{ + "routerAddress": "0x786aaB752184e0494a34BD9BD7D001cbDcb51760", + "initialTrustedHeight": 26, + "initialTrustedTimestamp": 1776881173, + "initialTrustedStorageRoot": "0x39e8b39bf2488c61e195cae0fcb153f35079540fc3d41ce3c312b5f0e7cf1312", + "initialTrustedValidators": [ + "0x065f139d8A49E9926232Cc4435159024cb5064FC", + "0x0EB968DE631aBC65322EcDCa5DfDF9C6296e52f4", + "0x20C5eDBCf6263Cd9E30Df395A2B914F6E939B9Ba", + "0x543d3796700eE35803A1C43562a69FEc08E1e423" + ], + "trustingPeriod": 1209600, + "maxClockDrift": 15, + "updateHeight11": { + "height": 27, + "headerRlp": "0xf90341a035c5bc445cd81c61bc0aad8007aa516544feb0e1df4a14cf4814e633a3565529a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d4934794543d3796700ee35803a1c43562a69fec08e1e423a0b7639c4d45625b8b101b9db57a7c3dd480a6b4d87f05b20c0b36dbec0bd6bf39a04abda09b87c8b2c5f4d9026f4740c329505384b8abb1ad521a6e55bbb82a7fa8a0f5a30bc56f74a84f77824b92e5ac9a1e83fd2e3685f236542154b3eecbfa65a3b9010000000000000000080000000000000000000000000000000000000000080000000000000000000000800000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200200000000000000000000000000000000000000000000000000000000000000000000010000000000020000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000800000000000010000000000000000010000000000000000000000000000000000000000000011b8402faf08082b3498469e90e17b90147f90144a0000000000000000000000000000000000000000000626573752032352e342e31f85494065f139d8a49e9926232cc4435159024cb5064fc940eb968de631abc65322ecdca5dfdf9c6296e52f49420c5edbcf6263cd9e30df395a2b914f6e939b9ba94543d3796700ee35803a1c43562a69fec08e1e423c080f8c9b841a71881769fdd4ab6fc94b38a5e0575d160f60976be3ffabea13753358b1fa63859651be466e28107e85819a7c493db04c782344f7965b89f98e846018391d5ed01b841eda6db7423837da36d7e1330411093c62e809c95acd154e11eada002329e2a501329f936c901c111b85ed105a8fe4af5e01d455536aa28c5fa346197cfe84bca00b841df5eeb081556ae5fbe0b35240203c4451c8f2090b3ebe3ba556203cdcbec5678435c4fd9d3a87db14c4ea1b1c4e42949879171474d79dfd87ccbf1e08402ca4801a063746963616c2062797a616e74696e65206661756c7420746f6c6572616e636588000000000000000080", + "trustedHeight": 26, + "accountProof": "0xf902d2f90211a0de5c21ba73c9513557bec8115cfef22de5c40da75b1de113739c8536d44c26e0a0fdddfaa3686c209cf29f450b628a265bcec7322f41aece682d2783985d7c8572a0613bb9dbc25038f26fbdfe24fe22db94483a5989d10c31287f24023098f4b639a0fe624ba863bd1da723c27a7beebac3da9268c9dc3be6897eccb01b2013180adaa08a9ab7aa4d6d21b86753558d59bfc5cdf6462099fa08d2f9926f947e19efaaa3a03f3d3c226ffd088516d34893e299e8668de094e9eb6bc4d5c6702a2cdfa05f49a0a01fe57b6491d393642d78c4618cfaaba2f9e2aa194df17388c9569d5be1a477a0c904cae4342a3bcac4e1700a5f901d0879e94a7e2d1082d8990e20ce464a0541a02b3d64d2e068605ca040e9103399faaea2ea9e284b96a19b3bdf0c1ae1de2230a045cce42efa11fd4a7f95c21012c8879203778000bc38556007516cc151461a69a00577c3ce742dca1da3c9c2c542c7ec20acc55406cc404d163fa9574ca7cdeccea09ee9a7f476c1c39bcd9a50f8b231bee5eed6c5273bbe95ffc04b5b9512e3a5b2a09161fba8cdba31283ae38d8c0de3f1d6675522131a2e8726ceb3b1773759903ea0c6f5c701c23ece33240cbe3539ee4afdc5590abf087886b4ae5a29cb2523a388a0829e7c083af857745e4e54c14e16a823bc12090cdf913f952b6d5afc64f9ffe5a09a051df8aad5a6ad9a3eb241d266d61e77b318de293e4f5f3335581223fc8ff780f85180808080808080808080808080a074b0f7f831046999c3342bfcd97053d5a13a31cc36ddd65c41335a6ee5dc1548a010b1794fd0066616139058ceb6c74d1c19e630d1ed64f837c4897f10a92348d88080f869a02042d8b40f065e9e1bded8dc1a2a8c76ce8b0df1433d43d604232bdb8464f9e6b846f8440180a039e8b39bf2488c61e195cae0fcb153f35079540fc3d41ce3c312b5f0e7cf1312a07f79b8b370510aa3a9ea8536a9459c92de9493272cd5fe45c02364cfe254a9a7", + "expectedTimestamp": 1776881175, + "expectedStorageRoot": "0x39e8b39bf2488c61e195cae0fcb153f35079540fc3d41ce3c312b5f0e7cf1312", + "expectedValidators": [ + "0x065f139d8A49E9926232Cc4435159024cb5064FC", + "0x0EB968DE631aBC65322EcDCa5DfDF9C6296e52f4", + "0x20C5eDBCf6263Cd9E30Df395A2B914F6E939B9Ba", + "0x543d3796700eE35803A1C43562a69FEc08E1e423" + ] + }, + "updateHeight12": { + "height": 28, + "headerRlp": "0xf90342a0ed92bb528c7dd294ab7549dd6dac0fd5ee7154cabc6bd0c90f5fc7dc28c091eba01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d4934794065f139d8a49e9926232cc4435159024cb5064fca0b539b4896ff6a05822d22b29bb0f0c4153195183737a960eebc5e68827e8e5a0a0531d147c255cdb580ed377518263f5b6612f60e521585349b4b3ebee2cafed4ba02e6b1579393feba9511fa8bda2ab22b3b5aa0d5334a5ae88572f543b5ff68c1ab9010000000000000000088000000400000000000000000000000000000004000000400000000000000000800000000000000000000400008000040000000002040000000000000000000000000008001000000000000000040000000000020000000000000000000000000000000000000000000000080000200200000010000000000000000000001000000840000002080008000000000080000000000000000000000000000000001000000000000000000000000000000000000000000000000000800102000000000000100001000000000000000004000000800800000040000000000000000000001008000000000000000001000000000000000000000000011c8402faf08083067b0d8469e90e19b90147f90144a0000000000000000000000000000000000000000000626573752032352e342e31f85494065f139d8a49e9926232cc4435159024cb5064fc940eb968de631abc65322ecdca5dfdf9c6296e52f49420c5edbcf6263cd9e30df395a2b914f6e939b9ba94543d3796700ee35803a1c43562a69fec08e1e423c080f8c9b841b8e618346b5a5334c7fe3b652abd1493d0dc310c16cbd1f529e076ef2b1de8e63ce988e82abf4c8a6213006d38825391f1f6979492743e5046260c5a3d075b8501b84167d2015303744bb3ec25cb5b82a00964bb3ca2d5d0d7a723bff98c86abf86ebd041d20b39266a47b0de4a2faf0f2dc1930fcaee4480cd06b1e0c7cff888b72c901b8414ca7f6523abb401d701bf6c1d48d21e97fdd62df72a0c1978ec5dd20f494dd884a22dc551a8dc91439ad76ce6368e7bc2c30fcc31f132ba2c321c1c11b42cfed00a063746963616c2062797a616e74696e65206661756c7420746f6c6572616e636588000000000000000080", + "trustedHeight": 26, + "accountProof": "0xf902d2f90211a0578967a3c34ade0f095d67cc40ef701bc8a246d51705d0a6efa4ed09d63dd20aa0fdddfaa3686c209cf29f450b628a265bcec7322f41aece682d2783985d7c8572a0613bb9dbc25038f26fbdfe24fe22db94483a5989d10c31287f24023098f4b639a0fe624ba863bd1da723c27a7beebac3da9268c9dc3be6897eccb01b2013180adaa05a1a54fc2941666b81309313fbef1c25d75d0eca227dd94df58511e853907265a03f3d3c226ffd088516d34893e299e8668de094e9eb6bc4d5c6702a2cdfa05f49a0a01fe57b6491d393642d78c4618cfaaba2f9e2aa194df17388c9569d5be1a477a0c904cae4342a3bcac4e1700a5f901d0879e94a7e2d1082d8990e20ce464a0541a02b3d64d2e068605ca040e9103399faaea2ea9e284b96a19b3bdf0c1ae1de2230a045cce42efa11fd4a7f95c21012c8879203778000bc38556007516cc151461a69a00577c3ce742dca1da3c9c2c542c7ec20acc55406cc404d163fa9574ca7cdeccea0c450833b6cc6fa43152f3ec491f1613f469eb12d3d34437b4175719c63167a7fa09161fba8cdba31283ae38d8c0de3f1d6675522131a2e8726ceb3b1773759903ea0c6f5c701c23ece33240cbe3539ee4afdc5590abf087886b4ae5a29cb2523a388a0ff4fd9d6fb101fd9d0fd0b9febf52dc5ec616c5926441a7141899cbfb73dff26a09a051df8aad5a6ad9a3eb241d266d61e77b318de293e4f5f3335581223fc8ff780f85180808080808080808080808080a01629b71d649dccdf7987c5b10734677263c1a2275fc3915983f619e3c8120537a02f545c5b4c61204ae78295a00b9e7e94d794ea8e65353153970f9506365205898080f869a02042d8b40f065e9e1bded8dc1a2a8c76ce8b0df1433d43d604232bdb8464f9e6b846f8440180a0e5bbd74ef068c4956fc223d08a6623709e5d08b902032b85d59e84256349cc97a07f79b8b370510aa3a9ea8536a9459c92de9493272cd5fe45c02364cfe254a9a7", + "expectedTimestamp": 1776881177, + "expectedStorageRoot": "0xe5bbd74ef068c4956fc223d08a6623709e5d08b902032b85d59e84256349cc97", + "expectedValidators": [ + "0x065f139d8A49E9926232Cc4435159024cb5064FC", + "0x0EB968DE631aBC65322EcDCa5DfDF9C6296e52f4", + "0x20C5eDBCf6263Cd9E30Df395A2B914F6E939B9Ba", + "0x543d3796700eE35803A1C43562a69FEc08E1e423" + ] + }, + "lowQuorumHeight12": { + "height": 28, + "headerRlp": "0xf902ffa0ed92bb528c7dd294ab7549dd6dac0fd5ee7154cabc6bd0c90f5fc7dc28c091eba01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d4934794065f139d8a49e9926232cc4435159024cb5064fca0b539b4896ff6a05822d22b29bb0f0c4153195183737a960eebc5e68827e8e5a0a0531d147c255cdb580ed377518263f5b6612f60e521585349b4b3ebee2cafed4ba02e6b1579393feba9511fa8bda2ab22b3b5aa0d5334a5ae88572f543b5ff68c1ab9010000000000000000088000000400000000000000000000000000000004000000400000000000000000800000000000000000000400008000040000000002040000000000000000000000000008001000000000000000040000000000020000000000000000000000000000000000000000000000080000200200000010000000000000000000001000000840000002080008000000000080000000000000000000000000000000001000000000000000000000000000000000000000000000000000800102000000000000100001000000000000000004000000800800000040000000000000000000001008000000000000000001000000000000000000000000011c8402faf08083067b0d8469e90e19b90104f90101a0000000000000000000000000000000000000000000626573752032352e342e31f85494065f139d8a49e9926232cc4435159024cb5064fc940eb968de631abc65322ecdca5dfdf9c6296e52f49420c5edbcf6263cd9e30df395a2b914f6e939b9ba94543d3796700ee35803a1c43562a69fec08e1e423c080f886b841b8e618346b5a5334c7fe3b652abd1493d0dc310c16cbd1f529e076ef2b1de8e63ce988e82abf4c8a6213006d38825391f1f6979492743e5046260c5a3d075b8501b84167d2015303744bb3ec25cb5b82a00964bb3ca2d5d0d7a723bff98c86abf86ebd041d20b39266a47b0de4a2faf0f2dc1930fcaee4480cd06b1e0c7cff888b72c901a063746963616c2062797a616e74696e65206661756c7420746f6c6572616e636588000000000000000080", + "trustedHeight": 26, + "accountProof": "0xf902d2f90211a0578967a3c34ade0f095d67cc40ef701bc8a246d51705d0a6efa4ed09d63dd20aa0fdddfaa3686c209cf29f450b628a265bcec7322f41aece682d2783985d7c8572a0613bb9dbc25038f26fbdfe24fe22db94483a5989d10c31287f24023098f4b639a0fe624ba863bd1da723c27a7beebac3da9268c9dc3be6897eccb01b2013180adaa05a1a54fc2941666b81309313fbef1c25d75d0eca227dd94df58511e853907265a03f3d3c226ffd088516d34893e299e8668de094e9eb6bc4d5c6702a2cdfa05f49a0a01fe57b6491d393642d78c4618cfaaba2f9e2aa194df17388c9569d5be1a477a0c904cae4342a3bcac4e1700a5f901d0879e94a7e2d1082d8990e20ce464a0541a02b3d64d2e068605ca040e9103399faaea2ea9e284b96a19b3bdf0c1ae1de2230a045cce42efa11fd4a7f95c21012c8879203778000bc38556007516cc151461a69a00577c3ce742dca1da3c9c2c542c7ec20acc55406cc404d163fa9574ca7cdeccea0c450833b6cc6fa43152f3ec491f1613f469eb12d3d34437b4175719c63167a7fa09161fba8cdba31283ae38d8c0de3f1d6675522131a2e8726ceb3b1773759903ea0c6f5c701c23ece33240cbe3539ee4afdc5590abf087886b4ae5a29cb2523a388a0ff4fd9d6fb101fd9d0fd0b9febf52dc5ec616c5926441a7141899cbfb73dff26a09a051df8aad5a6ad9a3eb241d266d61e77b318de293e4f5f3335581223fc8ff780f85180808080808080808080808080a01629b71d649dccdf7987c5b10734677263c1a2275fc3915983f619e3c8120537a02f545c5b4c61204ae78295a00b9e7e94d794ea8e65353153970f9506365205898080f869a02042d8b40f065e9e1bded8dc1a2a8c76ce8b0df1433d43d604232bdb8464f9e6b846f8440180a0e5bbd74ef068c4956fc223d08a6623709e5d08b902032b85d59e84256349cc97a07f79b8b370510aa3a9ea8536a9459c92de9493272cd5fe45c02364cfe254a9a7", + "expectedTimestamp": 1776881177, + "expectedStorageRoot": "0xe5bbd74ef068c4956fc223d08a6623709e5d08b902032b85d59e84256349cc97", + "expectedValidators": [ + "0x065f139d8A49E9926232Cc4435159024cb5064FC", + "0x0EB968DE631aBC65322EcDCa5DfDF9C6296e52f4", + "0x20C5eDBCf6263Cd9E30Df395A2B914F6E939B9Ba", + "0x543d3796700eE35803A1C43562a69FEc08E1e423" + ] + }, + "conflictingHeight12": { + "height": 28, + "headerRlp": "0xf90342a0a4fea040b164e3124ce98bb10504b7e0cccb1c96d33771ad2e6cfb67c6af1ff8a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347940eb968de631abc65322ecdca5dfdf9c6296e52f4a023500982a7c26a66dc297595b6e9fbb11b233eb8845bf8d613480a1d56bf7356a0ca819893c48c0aeaf83f32239163af46319f10722b09ba3636b474a1667ff6b6a018d442f3aa613b0cd1ceb1108213283b3191746d8f34766bd6d0c46ab1fcb070b9010000000000000000000000000000000000000000000000000000000000000000400400000000000000000000000000000000000000000000040000000002040000000000000000000000000000080000000000000000040000000000020000000000000000000000000000000000000002000000000000000000000000000000000000000000001800000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000002000000000001000000000000000000000000000000000000000000000011c8402faf080830b05a98469e90e1bb90147f90144a0000000000000000000000000000000000000000000626573752032352e342e31f85494065f139d8a49e9926232cc4435159024cb5064fc940eb968de631abc65322ecdca5dfdf9c6296e52f49420c5edbcf6263cd9e30df395a2b914f6e939b9ba94543d3796700ee35803a1c43562a69fec08e1e423c080f8c9b8414e11f05453d660f69ef200e325642fa2f38d38cd8c7ce9db58c0bccf624ccc0f697c06400bfa524ef67f82e677e441fc4d8bb06d2c8234b57a10385b33fa511500b8412f87310ed3249599d4e4e2709155973c323ba2a2126168c02c758439b948084f2fdeca53315727a6a1443ca2c7effc80fb917d1d30f77538acb5bbe0868fc4ba00b841cffac71947d2446ceaba6619cf7207b644f6d18564f3120d355763d66e4ac2b74c595129a961be0e0fa09a9a1c27ca87f90adf808eb7a04cd82f0b8e8e7e196b00a063746963616c2062797a616e74696e65206661756c7420746f6c6572616e636588000000000000000080", + "trustedHeight": 26, + "accountProof": "0xf902d2f90211a091b398cc201401fbcf9753f8f6423b7cd8e19f2561d78dbf4d192953fbe3e8b7a0fdddfaa3686c209cf29f450b628a265bcec7322f41aece682d2783985d7c8572a0613bb9dbc25038f26fbdfe24fe22db94483a5989d10c31287f24023098f4b639a0fe624ba863bd1da723c27a7beebac3da9268c9dc3be6897eccb01b2013180adaa05a1a54fc2941666b81309313fbef1c25d75d0eca227dd94df58511e853907265a03f3d3c226ffd088516d34893e299e8668de094e9eb6bc4d5c6702a2cdfa05f49a0a01fe57b6491d393642d78c4618cfaaba2f9e2aa194df17388c9569d5be1a477a0c904cae4342a3bcac4e1700a5f901d0879e94a7e2d1082d8990e20ce464a0541a02b3d64d2e068605ca040e9103399faaea2ea9e284b96a19b3bdf0c1ae1de2230a045cce42efa11fd4a7f95c21012c8879203778000bc38556007516cc151461a69a00577c3ce742dca1da3c9c2c542c7ec20acc55406cc404d163fa9574ca7cdeccea0c450833b6cc6fa43152f3ec491f1613f469eb12d3d34437b4175719c63167a7fa0733fe251e04519660b9f7df9ec9ad99d19767dfee5899fde96bb8c6ff4fe52f1a0c6f5c701c23ece33240cbe3539ee4afdc5590abf087886b4ae5a29cb2523a388a0ff4fd9d6fb101fd9d0fd0b9febf52dc5ec616c5926441a7141899cbfb73dff26a085d68ac5b64bd28a195ed65c08ece7c598001ccd7eca412c62659a9a313a2f2580f85180808080808080808080808080a01629b71d649dccdf7987c5b10734677263c1a2275fc3915983f619e3c8120537a0be3bcad4d55a33322e11ceca10b68c3ff08d259de19f389fc6f542e277872d578080f869a02042d8b40f065e9e1bded8dc1a2a8c76ce8b0df1433d43d604232bdb8464f9e6b846f8440180a0b3d9c4e8c2b0e5400037dab506d23e3284286bcb3752e60811520049866f1082a07f79b8b370510aa3a9ea8536a9459c92de9493272cd5fe45c02364cfe254a9a7", + "expectedTimestamp": 1776881179, + "expectedStorageRoot": "0xb3d9c4e8c2b0e5400037dab506d23e3284286bcb3752e60811520049866f1082", + "expectedValidators": [ + "0x065f139d8A49E9926232Cc4435159024cb5064FC", + "0x0EB968DE631aBC65322EcDCa5DfDF9C6296e52f4", + "0x20C5eDBCf6263Cd9E30Df395A2B914F6E939B9Ba", + "0x543d3796700eE35803A1C43562a69FEc08E1e423" + ] + }, + "lowOverlapHeight13": { + "height": 29, + "headerRlp": "0xf90342a0a4fea040b164e3124ce98bb10504b7e0cccb1c96d33771ad2e6cfb67c6af1ff8a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347940eb968de631abc65322ecdca5dfdf9c6296e52f4a023500982a7c26a66dc297595b6e9fbb11b233eb8845bf8d613480a1d56bf7356a0ca819893c48c0aeaf83f32239163af46319f10722b09ba3636b474a1667ff6b6a018d442f3aa613b0cd1ceb1108213283b3191746d8f34766bd6d0c46ab1fcb070b9010000000000000000000000000000000000000000000000000000000000000000400400000000000000000000000000000000000000000000040000000002040000000000000000000000000000080000000000000000040000000000020000000000000000000000000000000000000002000000000000000000000000000000000000000000001800000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000002000000000001000000000000000000000000000000000000000000000011d8402faf080830b05a98469e90e1bb90147f90144a0000000000000000000000000000000000000000000626573752032352e342e31f85494065f139d8a49e9926232cc4435159024cb5064fc9446a5b7e742f9ad777ef8bb85aebc717e7433dc47946af3e238490ca4b6ae4f1efdf12c04cc160423c3941780ffe5324fe74e6f2ef012edc9bd205e74555bc080f8c9b8414af174c06abf4918523a17a4f191b958e912a0bbfa3fe0d9cd0f1a602b70467f0a28e7ec749ec23b23299e2e2f13cf4aeffd3af2ff9a9daaada88654adff435600b84150b90a3c1d4f7a0f6d803a94b1aaa4130644330a9ea6ff1e44cc3fb6f94cbc7721391f955e2d5a136403742fe21ee1a6fe0c600c1f4aa29f45385aa450990d1300b841f72ee63cc565b1fc8ecd929a023fa28d95334cb8b8344ae7e4b31d326efa77f53bd3e97e80e64a1505c80ff31d778968fa6a97b744576913022e776bc15ec06d01a063746963616c2062797a616e74696e65206661756c7420746f6c6572616e636588000000000000000080", + "trustedHeight": 26, + "accountProof": "0xf902d2f90211a091b398cc201401fbcf9753f8f6423b7cd8e19f2561d78dbf4d192953fbe3e8b7a0fdddfaa3686c209cf29f450b628a265bcec7322f41aece682d2783985d7c8572a0613bb9dbc25038f26fbdfe24fe22db94483a5989d10c31287f24023098f4b639a0fe624ba863bd1da723c27a7beebac3da9268c9dc3be6897eccb01b2013180adaa05a1a54fc2941666b81309313fbef1c25d75d0eca227dd94df58511e853907265a03f3d3c226ffd088516d34893e299e8668de094e9eb6bc4d5c6702a2cdfa05f49a0a01fe57b6491d393642d78c4618cfaaba2f9e2aa194df17388c9569d5be1a477a0c904cae4342a3bcac4e1700a5f901d0879e94a7e2d1082d8990e20ce464a0541a02b3d64d2e068605ca040e9103399faaea2ea9e284b96a19b3bdf0c1ae1de2230a045cce42efa11fd4a7f95c21012c8879203778000bc38556007516cc151461a69a00577c3ce742dca1da3c9c2c542c7ec20acc55406cc404d163fa9574ca7cdeccea0c450833b6cc6fa43152f3ec491f1613f469eb12d3d34437b4175719c63167a7fa0733fe251e04519660b9f7df9ec9ad99d19767dfee5899fde96bb8c6ff4fe52f1a0c6f5c701c23ece33240cbe3539ee4afdc5590abf087886b4ae5a29cb2523a388a0ff4fd9d6fb101fd9d0fd0b9febf52dc5ec616c5926441a7141899cbfb73dff26a085d68ac5b64bd28a195ed65c08ece7c598001ccd7eca412c62659a9a313a2f2580f85180808080808080808080808080a01629b71d649dccdf7987c5b10734677263c1a2275fc3915983f619e3c8120537a0be3bcad4d55a33322e11ceca10b68c3ff08d259de19f389fc6f542e277872d578080f869a02042d8b40f065e9e1bded8dc1a2a8c76ce8b0df1433d43d604232bdb8464f9e6b846f8440180a0b3d9c4e8c2b0e5400037dab506d23e3284286bcb3752e60811520049866f1082a07f79b8b370510aa3a9ea8536a9459c92de9493272cd5fe45c02364cfe254a9a7", + "expectedTimestamp": 1776881179, + "expectedStorageRoot": "0xb3d9c4e8c2b0e5400037dab506d23e3284286bcb3752e60811520049866f1082", + "expectedValidators": [ + "0x065f139d8A49E9926232Cc4435159024cb5064FC", + "0x46a5B7E742F9ad777EF8Bb85AEBc717E7433Dc47", + "0x6aF3E238490CA4b6aE4F1eFdF12C04CC160423c3", + "0x1780FFe5324FE74e6F2EF012EDC9bD205e74555B" + ] + }, + "membership": { + "proof": "0xf90159f90111a0e442138baf418fa0ed3a49e2d6e5cc173302db813570b4d7198669f05b8d34f780a04e510de4b9ef26070bc6f70273e868c69edbaf19a2517970a5dbd69902e1d434a0dde632f9a63c5d15111a239c3ab8e60c6ad42b937c78933d342e4b38632ecddfa078e97f4542b6ddc4349f8c953157ff559c14a6518eddf1212dbd5f15c6ec240da08bd4e17fccf748e41c20ea5e847696758313810b6e9c8c7fe02e5aefaa4b5b3580a0a1c9ae22f30d2511c9ebab94c8f089a794b16dfb0de7e544a0a608a9a247e1e0a00e8d54ce26b8005c92ece298e21e9c7d1225e884addcdfbea2ead81c551df8928080808080a028d7dc5ba83020579a12100e30fafb74f3c03531f786808a733392cd565ef0668080f843a0369632698e78112a478dabed541f773d2f5a93186d9d3b9d9774b73bf9018b08a1a012e79bf5f3d918d5d3899fe7547967eeb785697d54be29513c1695d8b82f8a5e", + "proofHeight": 28, + "path": "0x626573752d636861696e2d62010000000000000001", + "value": "0x12e79bf5f3d918d5d3899fe7547967eeb785697d54be29513c1695d8b82f8a5e", + "expectedTimestamp": 1776881177 + }, + "nonMembership": { + "proof": "0xf90167f90111a0e442138baf418fa0ed3a49e2d6e5cc173302db813570b4d7198669f05b8d34f780a04e510de4b9ef26070bc6f70273e868c69edbaf19a2517970a5dbd69902e1d434a0dde632f9a63c5d15111a239c3ab8e60c6ad42b937c78933d342e4b38632ecddfa078e97f4542b6ddc4349f8c953157ff559c14a6518eddf1212dbd5f15c6ec240da08bd4e17fccf748e41c20ea5e847696758313810b6e9c8c7fe02e5aefaa4b5b3580a0a1c9ae22f30d2511c9ebab94c8f089a794b16dfb0de7e544a0a608a9a247e1e0a00e8d54ce26b8005c92ece298e21e9c7d1225e884addcdfbea2ead81c551df8928080808080a028d7dc5ba83020579a12100e30fafb74f3c03531f786808a733392cd565ef0668080f85180808080a0875eb9f9e615bfe1bd0884f44df3e2d591dd593d8009f0580aab4465dde3c0518080808080808080a0fb85839944b1ee5c49f237497287a3daac2424acceff350845be00a6f529ffdd808080", + "proofHeight": 28, + "path": "0x626573752d636861696e2d61020000000000000001", + "expectedTimestamp": 1776881177 + } +} \ No newline at end of file diff --git a/ibc-solidity/test/dummy-lc/DummyLightClientTest.t.sol b/ibc-solidity/test/dummy-lc/DummyLightClientTest.t.sol new file mode 100644 index 000000000..347df198a --- /dev/null +++ b/ibc-solidity/test/dummy-lc/DummyLightClientTest.t.sol @@ -0,0 +1,144 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.28; + +import { Test } from "forge-std/Test.sol"; + +import { DummyLightClient } from "../../contracts/light-clients/dummy/DummyLightClient.sol"; +import { ILightClientMsgs } from "../../contracts/msgs/ILightClientMsgs.sol"; +import { IICS02ClientMsgs } from "../../contracts/msgs/IICS02ClientMsgs.sol"; + +contract DummyLightClientTest is Test { + DummyLightClient internal client; + + IICS02ClientMsgs.Height internal height = IICS02ClientMsgs.Height({ revisionNumber: 1, revisionHeight: 100 }); + uint64 internal constant TIMESTAMP = 1_700_000_000; + bytes[] internal path; + bytes internal value = bytes("value"); + + function setUp() public { + client = new DummyLightClient(); + path.push(bytes("ibc")); + path.push(bytes("commitments")); + } + + function test_updateClient_stores_state() public { + client.updateClient(_updateMsg(height, TIMESTAMP, path, value)); + + DummyLightClient.ClientState memory clientState = + abi.decode(client.getClientState(), (DummyLightClient.ClientState)); + assertEq(clientState.latestHeight.revisionNumber, height.revisionNumber); + assertEq(clientState.latestHeight.revisionHeight, height.revisionHeight); + assertEq(clientState.latestTimestamp, TIMESTAMP); + } + + function test_verifyMembership_succeeds() public { + client.updateClient(_updateMsg(height, TIMESTAMP, path, value)); + + uint256 timestamp = client.verifyMembership(_membershipMsg(height, path, value)); + + assertEq(timestamp, TIMESTAMP); + } + + function test_verifyMembership_succeeds_for_empty_value() public { + bytes memory emptyValue = bytes(""); + client.updateClient(_updateMsg(height, TIMESTAMP, path, emptyValue)); + + uint256 timestamp = client.verifyMembership(_membershipMsg(height, path, emptyValue)); + + assertEq(timestamp, TIMESTAMP); + } + + function test_verifyMembership_reverts_for_wrong_value() public { + client.updateClient(_updateMsg(height, TIMESTAMP, path, value)); + + vm.expectRevert(DummyLightClient.ValueMismatch.selector); + client.verifyMembership(_membershipMsg(height, path, bytes("wrong"))); + } + + function test_verifyMembership_reverts_for_absent_path() public { + client.updateClient(_updateMsg(height, TIMESTAMP, path, value)); + + vm.expectRevert(DummyLightClient.MissingMembership.selector); + client.verifyMembership(_membershipMsg(height, _otherPath(), value)); + } + + function test_verifyMembership_reverts_for_unknown_height() public { + vm.expectRevert(DummyLightClient.UnknownHeight.selector); + client.verifyMembership(_membershipMsg(height, path, value)); + } + + function test_verifyNonMembership_succeeds() public { + client.updateClient(_updateMsg(height, TIMESTAMP, path, value)); + + uint256 timestamp = client.verifyNonMembership(_nonMembershipMsg(height, _otherPath())); + + assertEq(timestamp, TIMESTAMP); + } + + function test_verifyNonMembership_reverts_for_present_path() public { + client.updateClient(_updateMsg(height, TIMESTAMP, path, value)); + + vm.expectRevert(DummyLightClient.MembershipExists.selector); + client.verifyNonMembership(_nonMembershipMsg(height, path)); + } + + function test_updateClient_overwrites_same_height_path() public { + bytes memory newValue = bytes("new value"); + client.updateClient(_updateMsg(height, TIMESTAMP, path, value)); + client.updateClient(_updateMsg(height, TIMESTAMP + 1, path, newValue)); + + vm.expectRevert(DummyLightClient.ValueMismatch.selector); + client.verifyMembership(_membershipMsg(height, path, value)); + + assertEq(client.verifyMembership(_membershipMsg(height, path, newValue)), TIMESTAMP + 1); + } + + function _updateMsg( + IICS02ClientMsgs.Height memory height_, + uint64 timestamp, + bytes[] memory path_, + bytes memory value_ + ) + internal + pure + returns (bytes memory) + { + DummyLightClient.Membership[] memory memberships = new DummyLightClient.Membership[](1); + memberships[0] = DummyLightClient.Membership({ path: path_, value: value_ }); + return abi.encode( + DummyLightClient.MsgUpdateClient({ height: height_, timestamp: timestamp, memberships: memberships }) + ); + } + + function _membershipMsg( + IICS02ClientMsgs.Height memory height_, + bytes[] memory path_, + bytes memory value_ + ) + internal + pure + returns (ILightClientMsgs.MsgVerifyMembership memory) + { + return ILightClientMsgs.MsgVerifyMembership({ + proof: bytes("ignored"), proofHeight: height_, path: path_, value: value_ + }); + } + + function _nonMembershipMsg( + IICS02ClientMsgs.Height memory height_, + bytes[] memory path_ + ) + internal + pure + returns (ILightClientMsgs.MsgVerifyNonMembership memory) + { + return ILightClientMsgs.MsgVerifyNonMembership({ proof: bytes("ignored"), proofHeight: height_, path: path_ }); + } + + function _otherPath() internal pure returns (bytes[] memory) { + bytes[] memory other = new bytes[](2); + other[0] = bytes("ibc"); + other[1] = bytes("other"); + return other; + } +} diff --git a/packages/go-abigen/dummy/contract.go b/packages/go-abigen/dummy/contract.go new file mode 100644 index 000000000..445d3772d --- /dev/null +++ b/packages/go-abigen/dummy/contract.go @@ -0,0 +1,317 @@ +// Code generated - DO NOT EDIT. +// This file is a generated binding and any manual changes will be lost. + +package dummy + +import ( + "errors" + "math/big" + "strings" + + ethereum "github.com/ethereum/go-ethereum" + "github.com/ethereum/go-ethereum/accounts/abi" + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/event" +) + +// Reference imports to suppress errors if they are not otherwise used. +var ( + _ = errors.New + _ = big.NewInt + _ = strings.NewReader + _ = ethereum.NotFound + _ = bind.Bind + _ = common.Big1 + _ = types.BloomLookup + _ = event.NewSubscription + _ = abi.ConvertType +) + +// IICS02ClientMsgsHeight is an auto generated low-level Go binding around an user-defined struct. +type IICS02ClientMsgsHeight struct { + RevisionNumber uint64 + RevisionHeight uint64 +} + +// ILightClientMsgsMsgVerifyMembership is an auto generated low-level Go binding around an user-defined struct. +type ILightClientMsgsMsgVerifyMembership struct { + Proof []byte + ProofHeight IICS02ClientMsgsHeight + Path [][]byte + Value []byte +} + +// ILightClientMsgsMsgVerifyNonMembership is an auto generated low-level Go binding around an user-defined struct. +type ILightClientMsgsMsgVerifyNonMembership struct { + Proof []byte + ProofHeight IICS02ClientMsgsHeight + Path [][]byte +} + +// ContractMetaData contains all meta data concerning the Contract contract. +var ContractMetaData = &bind.MetaData{ + ABI: "[{\"type\":\"function\",\"name\":\"getClientState\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"misbehaviour\",\"inputs\":[{\"name\":\"\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"updateClient\",\"inputs\":[{\"name\":\"updateMsg\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"enumILightClientMsgs.UpdateResult\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"verifyMembership\",\"inputs\":[{\"name\":\"msg_\",\"type\":\"tuple\",\"internalType\":\"structILightClientMsgs.MsgVerifyMembership\",\"components\":[{\"name\":\"proof\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"proofHeight\",\"type\":\"tuple\",\"internalType\":\"structIICS02ClientMsgs.Height\",\"components\":[{\"name\":\"revisionNumber\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"revisionHeight\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"name\":\"path\",\"type\":\"bytes[]\",\"internalType\":\"bytes[]\"},{\"name\":\"value\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"verifyNonMembership\",\"inputs\":[{\"name\":\"msg_\",\"type\":\"tuple\",\"internalType\":\"structILightClientMsgs.MsgVerifyNonMembership\",\"components\":[{\"name\":\"proof\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"proofHeight\",\"type\":\"tuple\",\"internalType\":\"structIICS02ClientMsgs.Height\",\"components\":[{\"name\":\"revisionNumber\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"revisionHeight\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"name\":\"path\",\"type\":\"bytes[]\",\"internalType\":\"bytes[]\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"error\",\"name\":\"MembershipExists\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"MissingMembership\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"UnknownHeight\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ValueMismatch\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ZeroTimestamp\",\"inputs\":[]}]", +} + +// ContractABI is the input ABI used to generate the binding from. +// Deprecated: Use ContractMetaData.ABI instead. +var ContractABI = ContractMetaData.ABI + +// Contract is an auto generated Go binding around an Ethereum contract. +type Contract struct { + ContractCaller // Read-only binding to the contract + ContractTransactor // Write-only binding to the contract + ContractFilterer // Log filterer for contract events +} + +// ContractCaller is an auto generated read-only Go binding around an Ethereum contract. +type ContractCaller struct { + contract *bind.BoundContract // Generic contract wrapper for the low level calls +} + +// ContractTransactor is an auto generated write-only Go binding around an Ethereum contract. +type ContractTransactor struct { + contract *bind.BoundContract // Generic contract wrapper for the low level calls +} + +// ContractFilterer is an auto generated log filtering Go binding around an Ethereum contract events. +type ContractFilterer struct { + contract *bind.BoundContract // Generic contract wrapper for the low level calls +} + +// ContractSession is an auto generated Go binding around an Ethereum contract, +// with pre-set call and transact options. +type ContractSession struct { + Contract *Contract // Generic contract binding to set the session for + CallOpts bind.CallOpts // Call options to use throughout this session + TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session +} + +// ContractCallerSession is an auto generated read-only Go binding around an Ethereum contract, +// with pre-set call options. +type ContractCallerSession struct { + Contract *ContractCaller // Generic contract caller binding to set the session for + CallOpts bind.CallOpts // Call options to use throughout this session +} + +// ContractTransactorSession is an auto generated write-only Go binding around an Ethereum contract, +// with pre-set transact options. +type ContractTransactorSession struct { + Contract *ContractTransactor // Generic contract transactor binding to set the session for + TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session +} + +// ContractRaw is an auto generated low-level Go binding around an Ethereum contract. +type ContractRaw struct { + Contract *Contract // Generic contract binding to access the raw methods on +} + +// ContractCallerRaw is an auto generated low-level read-only Go binding around an Ethereum contract. +type ContractCallerRaw struct { + Contract *ContractCaller // Generic read-only contract binding to access the raw methods on +} + +// ContractTransactorRaw is an auto generated low-level write-only Go binding around an Ethereum contract. +type ContractTransactorRaw struct { + Contract *ContractTransactor // Generic write-only contract binding to access the raw methods on +} + +// NewContract creates a new instance of Contract, bound to a specific deployed contract. +func NewContract(address common.Address, backend bind.ContractBackend) (*Contract, error) { + contract, err := bindContract(address, backend, backend, backend) + if err != nil { + return nil, err + } + return &Contract{ContractCaller: ContractCaller{contract: contract}, ContractTransactor: ContractTransactor{contract: contract}, ContractFilterer: ContractFilterer{contract: contract}}, nil +} + +// NewContractCaller creates a new read-only instance of Contract, bound to a specific deployed contract. +func NewContractCaller(address common.Address, caller bind.ContractCaller) (*ContractCaller, error) { + contract, err := bindContract(address, caller, nil, nil) + if err != nil { + return nil, err + } + return &ContractCaller{contract: contract}, nil +} + +// NewContractTransactor creates a new write-only instance of Contract, bound to a specific deployed contract. +func NewContractTransactor(address common.Address, transactor bind.ContractTransactor) (*ContractTransactor, error) { + contract, err := bindContract(address, nil, transactor, nil) + if err != nil { + return nil, err + } + return &ContractTransactor{contract: contract}, nil +} + +// NewContractFilterer creates a new log filterer instance of Contract, bound to a specific deployed contract. +func NewContractFilterer(address common.Address, filterer bind.ContractFilterer) (*ContractFilterer, error) { + contract, err := bindContract(address, nil, nil, filterer) + if err != nil { + return nil, err + } + return &ContractFilterer{contract: contract}, nil +} + +// bindContract binds a generic wrapper to an already deployed contract. +func bindContract(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error) { + parsed, err := ContractMetaData.GetAbi() + if err != nil { + return nil, err + } + return bind.NewBoundContract(address, *parsed, caller, transactor, filterer), nil +} + +// Call invokes the (constant) contract method with params as input values and +// sets the output to result. The result type might be a single field for simple +// returns, a slice of interfaces for anonymous returns and a struct for named +// returns. +func (_Contract *ContractRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error { + return _Contract.Contract.ContractCaller.contract.Call(opts, result, method, params...) +} + +// Transfer initiates a plain transaction to move funds to the contract, calling +// its default method if one is available. +func (_Contract *ContractRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { + return _Contract.Contract.ContractTransactor.contract.Transfer(opts) +} + +// Transact invokes the (paid) contract method with params as input values. +func (_Contract *ContractRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { + return _Contract.Contract.ContractTransactor.contract.Transact(opts, method, params...) +} + +// Call invokes the (constant) contract method with params as input values and +// sets the output to result. The result type might be a single field for simple +// returns, a slice of interfaces for anonymous returns and a struct for named +// returns. +func (_Contract *ContractCallerRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error { + return _Contract.Contract.contract.Call(opts, result, method, params...) +} + +// Transfer initiates a plain transaction to move funds to the contract, calling +// its default method if one is available. +func (_Contract *ContractTransactorRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { + return _Contract.Contract.contract.Transfer(opts) +} + +// Transact invokes the (paid) contract method with params as input values. +func (_Contract *ContractTransactorRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { + return _Contract.Contract.contract.Transact(opts, method, params...) +} + +// GetClientState is a free data retrieval call binding the contract method 0xef913a4b. +// +// Solidity: function getClientState() view returns(bytes) +func (_Contract *ContractCaller) GetClientState(opts *bind.CallOpts) ([]byte, error) { + var out []interface{} + err := _Contract.contract.Call(opts, &out, "getClientState") + + if err != nil { + return *new([]byte), err + } + + out0 := *abi.ConvertType(out[0], new([]byte)).(*[]byte) + + return out0, err + +} + +// GetClientState is a free data retrieval call binding the contract method 0xef913a4b. +// +// Solidity: function getClientState() view returns(bytes) +func (_Contract *ContractSession) GetClientState() ([]byte, error) { + return _Contract.Contract.GetClientState(&_Contract.CallOpts) +} + +// GetClientState is a free data retrieval call binding the contract method 0xef913a4b. +// +// Solidity: function getClientState() view returns(bytes) +func (_Contract *ContractCallerSession) GetClientState() ([]byte, error) { + return _Contract.Contract.GetClientState(&_Contract.CallOpts) +} + +// Misbehaviour is a paid mutator transaction binding the contract method 0xddba6537. +// +// Solidity: function misbehaviour(bytes ) returns() +func (_Contract *ContractTransactor) Misbehaviour(opts *bind.TransactOpts, arg0 []byte) (*types.Transaction, error) { + return _Contract.contract.Transact(opts, "misbehaviour", arg0) +} + +// Misbehaviour is a paid mutator transaction binding the contract method 0xddba6537. +// +// Solidity: function misbehaviour(bytes ) returns() +func (_Contract *ContractSession) Misbehaviour(arg0 []byte) (*types.Transaction, error) { + return _Contract.Contract.Misbehaviour(&_Contract.TransactOpts, arg0) +} + +// Misbehaviour is a paid mutator transaction binding the contract method 0xddba6537. +// +// Solidity: function misbehaviour(bytes ) returns() +func (_Contract *ContractTransactorSession) Misbehaviour(arg0 []byte) (*types.Transaction, error) { + return _Contract.Contract.Misbehaviour(&_Contract.TransactOpts, arg0) +} + +// UpdateClient is a paid mutator transaction binding the contract method 0x0bece356. +// +// Solidity: function updateClient(bytes updateMsg) returns(uint8) +func (_Contract *ContractTransactor) UpdateClient(opts *bind.TransactOpts, updateMsg []byte) (*types.Transaction, error) { + return _Contract.contract.Transact(opts, "updateClient", updateMsg) +} + +// UpdateClient is a paid mutator transaction binding the contract method 0x0bece356. +// +// Solidity: function updateClient(bytes updateMsg) returns(uint8) +func (_Contract *ContractSession) UpdateClient(updateMsg []byte) (*types.Transaction, error) { + return _Contract.Contract.UpdateClient(&_Contract.TransactOpts, updateMsg) +} + +// UpdateClient is a paid mutator transaction binding the contract method 0x0bece356. +// +// Solidity: function updateClient(bytes updateMsg) returns(uint8) +func (_Contract *ContractTransactorSession) UpdateClient(updateMsg []byte) (*types.Transaction, error) { + return _Contract.Contract.UpdateClient(&_Contract.TransactOpts, updateMsg) +} + +// VerifyMembership is a paid mutator transaction binding the contract method 0x682ed5f0. +// +// Solidity: function verifyMembership((bytes,(uint64,uint64),bytes[],bytes) msg_) returns(uint256) +func (_Contract *ContractTransactor) VerifyMembership(opts *bind.TransactOpts, msg_ ILightClientMsgsMsgVerifyMembership) (*types.Transaction, error) { + return _Contract.contract.Transact(opts, "verifyMembership", msg_) +} + +// VerifyMembership is a paid mutator transaction binding the contract method 0x682ed5f0. +// +// Solidity: function verifyMembership((bytes,(uint64,uint64),bytes[],bytes) msg_) returns(uint256) +func (_Contract *ContractSession) VerifyMembership(msg_ ILightClientMsgsMsgVerifyMembership) (*types.Transaction, error) { + return _Contract.Contract.VerifyMembership(&_Contract.TransactOpts, msg_) +} + +// VerifyMembership is a paid mutator transaction binding the contract method 0x682ed5f0. +// +// Solidity: function verifyMembership((bytes,(uint64,uint64),bytes[],bytes) msg_) returns(uint256) +func (_Contract *ContractTransactorSession) VerifyMembership(msg_ ILightClientMsgsMsgVerifyMembership) (*types.Transaction, error) { + return _Contract.Contract.VerifyMembership(&_Contract.TransactOpts, msg_) +} + +// VerifyNonMembership is a paid mutator transaction binding the contract method 0x4d6d9ffb. +// +// Solidity: function verifyNonMembership((bytes,(uint64,uint64),bytes[]) msg_) returns(uint256) +func (_Contract *ContractTransactor) VerifyNonMembership(opts *bind.TransactOpts, msg_ ILightClientMsgsMsgVerifyNonMembership) (*types.Transaction, error) { + return _Contract.contract.Transact(opts, "verifyNonMembership", msg_) +} + +// VerifyNonMembership is a paid mutator transaction binding the contract method 0x4d6d9ffb. +// +// Solidity: function verifyNonMembership((bytes,(uint64,uint64),bytes[]) msg_) returns(uint256) +func (_Contract *ContractSession) VerifyNonMembership(msg_ ILightClientMsgsMsgVerifyNonMembership) (*types.Transaction, error) { + return _Contract.Contract.VerifyNonMembership(&_Contract.TransactOpts, msg_) +} + +// VerifyNonMembership is a paid mutator transaction binding the contract method 0x4d6d9ffb. +// +// Solidity: function verifyNonMembership((bytes,(uint64,uint64),bytes[]) msg_) returns(uint256) +func (_Contract *ContractTransactorSession) VerifyNonMembership(msg_ ILightClientMsgsMsgVerifyNonMembership) (*types.Transaction, error) { + return _Contract.Contract.VerifyNonMembership(&_Contract.TransactOpts, msg_) +} diff --git a/packages/proof-api/modules/besu-to-besu/Cargo.toml b/packages/proof-api/modules/besu-to-besu/Cargo.toml new file mode 100644 index 000000000..4bc1b0bfd --- /dev/null +++ b/packages/proof-api/modules/besu-to-besu/Cargo.toml @@ -0,0 +1,21 @@ +[package] +name = "proof-api-besu-to-besu" +version.workspace = true +edition.workspace = true +repository.workspace = true +license.workspace = true + +[dependencies] +alloy = { workspace = true, features = ["full", "node-bindings"] } +alloy-rlp = { workspace = true } +anyhow = { workspace = true, features = ["std"] } +ethereum-apis = { workspace = true } +ethereum-light-client = { workspace = true } +proof-api-core = { workspace = true, default-features = false } +proof-api-lib = { workspace = true, default-features = false } +ibc-eureka-solidity-types = { workspace = true, features = ["rpc"] } +rlp = { workspace = true } +serde = { workspace = true, features = ["derive"] } +serde_json = { workspace = true } +tonic = { workspace = true, default-features = true } +tracing = { workspace = true, default-features = true } diff --git a/packages/proof-api/modules/besu-to-besu/src/lib.rs b/packages/proof-api/modules/besu-to-besu/src/lib.rs new file mode 100644 index 000000000..54196558a --- /dev/null +++ b/packages/proof-api/modules/besu-to-besu/src/lib.rs @@ -0,0 +1,219 @@ +//! One-sided Besu-to-Besu proof API module. + +#![deny(clippy::nursery, clippy::pedantic, warnings, unused_crate_dependencies)] +#![allow(missing_docs)] + +mod tx_builder; + +use std::collections::HashMap; + +use alloy::{ + primitives::{Address, TxHash}, + providers::{Provider, RootProvider}, +}; +use proof_api_core::{ + api::{self, proof_api_service_server::ProofApiService}, + modules::ProofApiModule, +}; +use proof_api_lib::{ + listener::{eth_eureka, ChainListenerService}, + service_utils::{parse_eth_tx_hashes, to_tonic_status}, + utils::RelayEventsParams, +}; +use tonic::{Request, Response}; +use tracing as _; +use tx_builder::TxBuilder; + +#[derive(Clone, Copy, Debug)] +pub struct BesuToBesuProofApiModule; + +struct BesuToBesuProofApiModuleService { + src_chain_id: String, + src_ics26_address: Address, + src_listener: eth_eureka::ChainListener, + dst_listener: eth_eureka::ChainListener, + tx_builder: TxBuilder, +} + +#[derive(Clone, Copy, Debug, serde::Deserialize, serde::Serialize)] +#[serde(rename_all = "snake_case")] +pub enum BesuConsensusType { + Qbft, + Ibft2, +} + +#[derive(Clone, Debug, serde::Deserialize, serde::Serialize)] +pub struct BesuToBesuConfig { + pub src_chain_id: String, + pub src_rpc_url: String, + pub src_ics26_address: Address, + pub dst_rpc_url: String, + pub dst_ics26_address: Address, + pub consensus_type: BesuConsensusType, +} + +impl BesuToBesuProofApiModuleService { + async fn new(config: BesuToBesuConfig) -> anyhow::Result { + let src_provider = RootProvider::builder() + .connect(&config.src_rpc_url) + .await + .map_err(|e| anyhow::anyhow!("failed to create source provider: {e}"))?; + let dst_provider = RootProvider::builder() + .connect(&config.dst_rpc_url) + .await + .map_err(|e| anyhow::anyhow!("failed to create destination provider: {e}"))?; + + let src_listener = + eth_eureka::ChainListener::new(config.src_ics26_address, src_provider.clone()); + let dst_listener = + eth_eureka::ChainListener::new(config.dst_ics26_address, dst_provider.clone()); + let tx_builder = TxBuilder::new( + src_provider, + dst_provider, + config.src_ics26_address, + config.dst_ics26_address, + config.consensus_type, + ); + + Ok(Self { + src_chain_id: config.src_chain_id, + src_ics26_address: config.src_ics26_address, + src_listener, + dst_listener, + tx_builder, + }) + } +} + +#[tonic::async_trait] +impl ProofApiService for BesuToBesuProofApiModuleService { + async fn info( + &self, + _request: Request, + ) -> Result, tonic::Status> { + Ok(Response::new(api::InfoResponse { + target_chain: Some(api::Chain { + chain_id: self + .dst_listener + .chain_id() + .await + .map_err(to_tonic_status)?, + ibc_version: "2".to_string(), + ibc_contract: self.tx_builder.ics26_router_address().to_string(), + }), + source_chain: Some(api::Chain { + chain_id: self.src_chain_id.clone(), + ibc_version: "2".to_string(), + ibc_contract: self.src_ics26_address.to_string(), + }), + metadata: HashMap::default(), + })) + } + + async fn relay_by_tx( + &self, + request: Request, + ) -> Result, tonic::Status> { + let inner_req = request.into_inner(); + + let src_txs = parse_eth_tx_hashes(inner_req.source_tx_ids)? + .into_iter() + .map(TxHash::from) + .collect(); + let timeout_txs = parse_eth_tx_hashes(inner_req.timeout_tx_ids)? + .into_iter() + .map(TxHash::from) + .collect(); + + let src_events = self + .src_listener + .fetch_tx_events(src_txs) + .await + .map_err(to_tonic_status)?; + let timeout_events = self + .dst_listener + .fetch_tx_events(timeout_txs) + .await + .map_err(to_tonic_status)?; + + let timeout_relay_height = if timeout_events.is_empty() { + None + } else { + Some( + self.src_listener + .get_block_number() + .await + .map_err(to_tonic_status)?, + ) + }; + + let tx = self + .tx_builder + .relay_events(RelayEventsParams { + src_events, + target_events: timeout_events, + timeout_relay_height, + src_client_id: inner_req.src_client_id, + dst_client_id: inner_req.dst_client_id, + src_packet_seqs: inner_req.src_packet_sequences, + dst_packet_seqs: inner_req.dst_packet_sequences, + }) + .await + .map_err(to_tonic_status)?; + + Ok(Response::new(api::RelayByTxResponse { + tx, + address: self.tx_builder.ics26_router_address().to_string(), + })) + } + + async fn create_client( + &self, + request: Request, + ) -> Result, tonic::Status> { + let inner_req = request.into_inner(); + let tx = self + .tx_builder + .create_client(&inner_req.parameters) + .await + .map_err(to_tonic_status)?; + + Ok(Response::new(api::CreateClientResponse { + tx, + address: String::new(), + })) + } + + async fn update_client( + &self, + request: Request, + ) -> Result, tonic::Status> { + let inner_req = request.into_inner(); + let tx = self + .tx_builder + .update_client(&inner_req.dst_client_id) + .await + .map_err(to_tonic_status)?; + + Ok(Response::new(api::UpdateClientResponse { + tx, + address: self.tx_builder.ics26_router_address().to_string(), + })) + } +} + +#[tonic::async_trait] +impl ProofApiModule for BesuToBesuProofApiModule { + fn name(&self) -> &'static str { + "besu_to_besu" + } + + async fn create_service( + &self, + config: serde_json::Value, + ) -> anyhow::Result> { + let config: BesuToBesuConfig = serde_json::from_value(config)?; + let service = BesuToBesuProofApiModuleService::new(config).await?; + Ok(Box::new(service)) + } +} diff --git a/packages/proof-api/modules/besu-to-besu/src/tx_builder.rs b/packages/proof-api/modules/besu-to-besu/src/tx_builder.rs new file mode 100644 index 000000000..bbd2ee877 --- /dev/null +++ b/packages/proof-api/modules/besu-to-besu/src/tx_builder.rs @@ -0,0 +1,616 @@ +use std::{collections::HashMap, str::FromStr, time::UNIX_EPOCH}; + +use alloy::{ + network::Ethereum, + primitives::{hex, Address, Bytes, B256, U256}, + providers::{Provider, RootProvider}, + sol_types::{SolCall, SolValue}, +}; +use alloy_rlp::Header as RlpHeader; +use anyhow::{anyhow, bail, Context, Result}; +use ethereum_apis::eth_api::client::EthApiClient; +use ethereum_light_client::membership::evm_ics26_commitment_path; +use proof_api_lib::{ + events::EurekaEventWithHeight, + utils::{ + eth_eureka::{src_events_to_recv_and_ack_msgs, target_events_to_timeout_msgs}, + RelayEventsParams, + }, +}; +use ibc_eureka_solidity_types::{ + besu::{besu_ibft2_light_client, besu_qbft_light_client}, + ics26::{ + router::{multicallCall, routerCalls, routerInstance, updateClientCall}, + IICS02ClientMsgs::Height as RouterHeight, + ICS26_IBC_STORAGE_SLOT, + }, + msgs::{IBesuLightClientMsgs, IICS02ClientMsgs::Height as MsgHeight}, +}; +use rlp::Rlp; + +use crate::BesuConsensusType; + +pub struct TxBuilder { + src_provider: RootProvider, + dst_provider: RootProvider, + src_ics26_router: routerInstance, + dst_ics26_router: routerInstance, + consensus_type: BesuConsensusType, +} + +struct CreateClientParams { + trusting_period: u64, + max_clock_drift: u64, + trusted_height: Option, + role_manager: Address, +} + +impl TxBuilder { + pub fn new( + src_provider: RootProvider, + dst_provider: RootProvider, + src_ics26_address: Address, + dst_ics26_address: Address, + consensus_type: BesuConsensusType, + ) -> Self { + Self { + src_ics26_router: routerInstance::new(src_ics26_address, src_provider.clone()), + dst_ics26_router: routerInstance::new(dst_ics26_address, dst_provider.clone()), + src_provider, + dst_provider, + consensus_type, + } + } + + pub const fn ics26_router_address(&self) -> &Address { + self.dst_ics26_router.address() + } + + pub async fn create_client(&self, parameters: &HashMap) -> Result> { + let params = parse_create_client_params(parameters)?; + let trusted_height = match params.trusted_height { + Some(height) => height, + None => self + .src_provider + .get_block_number() + .await + .context("failed to fetch latest source block number")?, + }; + + let block = EthApiClient::new(self.src_provider.clone()) + .get_block(trusted_height) + .await + .with_context(|| format!("failed to fetch source block at height {trusted_height}"))?; + let header = block.into_consensus_header(); + let header_rlp = alloy_rlp::encode(&header); + let validators = + extract_validators_from_header_extra_data(&header_rlp).with_context(|| { + format!("failed to extract validators from source block {trusted_height}") + })?; + let (storage_root, _) = self + .fetch_source_account_proof(trusted_height) + .await + .with_context(|| { + format!( + "failed to fetch account proof for source router at height {trusted_height}" + ) + })?; + + let calldata = match self.consensus_type { + BesuConsensusType::Qbft => besu_qbft_light_client::BesuQBFTLightClient::deploy_builder( + self.dst_provider.clone(), + *self.src_ics26_router.address(), + trusted_height, + header.timestamp, + storage_root, + validators, + params.trusting_period, + params.max_clock_drift, + params.role_manager, + ) + .calldata() + .to_vec(), + BesuConsensusType::Ibft2 => { + besu_ibft2_light_client::BesuIBFT2LightClient::deploy_builder( + self.dst_provider.clone(), + *self.src_ics26_router.address(), + trusted_height, + header.timestamp, + storage_root, + validators, + params.trusting_period, + params.max_clock_drift, + params.role_manager, + ) + .calldata() + .to_vec() + } + }; + + Ok(calldata) + } + + pub async fn update_client(&self, dst_client_id: &str) -> Result> { + let client_state = self + .fetch_destination_client_state(dst_client_id) + .await + .with_context(|| { + format!("failed to decode destination Besu client state for client {dst_client_id}") + })?; + let trusted_height = client_state.latestHeight.revisionHeight; + let target_height = self + .src_provider + .get_block_number() + .await + .context("failed to fetch latest source block number")?; + + self.build_update_client_calldata(dst_client_id, trusted_height, target_height) + .await + .with_context(|| { + format!("failed to build destination updateClient call for client {dst_client_id}") + }) + } + + pub async fn relay_events(&self, params: RelayEventsParams) -> Result> { + let proof_height = select_proof_height(¶ms.src_events, params.timeout_relay_height)?; + let now = std::time::SystemTime::now() + .duration_since(UNIX_EPOCH) + .context("failed to read system time")? + .as_secs(); + let proof_height_msg = RouterHeight { + revisionNumber: 0, + revisionHeight: proof_height, + }; + + let recv_and_ack_msgs = src_events_to_recv_and_ack_msgs( + params.src_events, + ¶ms.src_client_id, + ¶ms.dst_client_id, + ¶ms.src_packet_seqs, + ¶ms.dst_packet_seqs, + &proof_height_msg, + now, + ); + let timeout_msgs = target_events_to_timeout_msgs( + params.target_events, + ¶ms.src_client_id, + ¶ms.dst_client_id, + ¶ms.dst_packet_seqs, + &proof_height_msg, + now, + ); + + let mut packet_calls: Vec<_> = recv_and_ack_msgs.into_iter().chain(timeout_msgs).collect(); + if packet_calls.is_empty() { + bail!("no packets collected") + } + + let client_state = self + .fetch_destination_client_state(¶ms.dst_client_id) + .await + .with_context(|| { + format!( + "failed to decode destination Besu client state for client {}", + params.dst_client_id + ) + })?; + let update_call = self + .build_update_client_calldata( + ¶ms.dst_client_id, + client_state.latestHeight.revisionHeight, + proof_height, + ) + .await + .with_context(|| { + format!( + "failed to build destination updateClient call for client {} at height {proof_height}", + params.dst_client_id + ) + })?; + + self.attach_packet_proofs(&mut packet_calls, proof_height) + .await?; + + let all_calls: Vec = std::iter::once(update_call.into()) + .chain(packet_calls.into_iter().map(|call| match call { + routerCalls::ackPacket(call) => call.abi_encode().into(), + routerCalls::recvPacket(call) => call.abi_encode().into(), + routerCalls::timeoutPacket(call) => call.abi_encode().into(), + _ => unreachable!("only recv, ack, and timeout calls are constructed"), + })) + .collect(); + + Ok(multicallCall { data: all_calls }.abi_encode()) + } + + async fn build_update_client_calldata( + &self, + dst_client_id: &str, + trusted_height: u64, + target_height: u64, + ) -> Result> { + let header_rlp = self + .fetch_source_header_rlp(target_height) + .await + .with_context(|| format!("failed to fetch source block at height {target_height}"))?; + let (_, account_proof) = self + .fetch_source_account_proof(target_height) + .await + .with_context(|| { + format!("failed to fetch account proof for source router at height {target_height}") + })?; + + let update_msg = IBesuLightClientMsgs::MsgUpdateClient { + headerRlp: header_rlp.into(), + trustedHeight: MsgHeight { + revisionNumber: 0, + revisionHeight: trusted_height, + }, + accountProof: account_proof.into(), + }; + + Ok(updateClientCall { + clientId: dst_client_id.to_string(), + updateMsg: update_msg.abi_encode().into(), + } + .abi_encode()) + } + + async fn fetch_source_header_rlp(&self, block_height: u64) -> Result> { + let block = EthApiClient::new(self.src_provider.clone()) + .get_block(block_height) + .await + .with_context(|| format!("failed to fetch source block at height {block_height}"))?; + Ok(alloy_rlp::encode(block.into_consensus_header())) + } + + async fn attach_packet_proofs( + &self, + packet_calls: &mut [routerCalls], + proof_height: u64, + ) -> Result<()> { + for call in packet_calls { + match call { + routerCalls::recvPacket(call) => { + let path = call.msg_.packet.commitment_path(); + let proof = self + .fetch_source_storage_proof(proof_height, &path) + .await + .with_context(|| { + format!( + "failed to pack storage proof for packet sequence {}", + call.msg_.packet.sequence + ) + })?; + call.msg_.proofCommitment = proof.into(); + } + routerCalls::ackPacket(call) => { + let path = call.msg_.packet.ack_commitment_path(); + let proof = self + .fetch_source_storage_proof(proof_height, &path) + .await + .with_context(|| { + format!( + "failed to pack storage proof for packet sequence {}", + call.msg_.packet.sequence + ) + })?; + call.msg_.proofAcked = proof.into(); + } + routerCalls::timeoutPacket(call) => { + let path = call.msg_.packet.receipt_commitment_path(); + let proof = self + .fetch_source_storage_proof(proof_height, &path) + .await + .with_context(|| { + format!( + "failed to pack storage proof for packet sequence {}", + call.msg_.packet.sequence + ) + })?; + call.msg_.proofTimeout = proof.into(); + } + _ => unreachable!("only recv, ack, and timeout calls are constructed"), + } + } + + Ok(()) + } + + async fn fetch_source_account_proof(&self, block_height: u64) -> Result<(B256, Vec)> { + let proof = EthApiClient::new(self.src_provider.clone()) + .get_proof( + &self.src_ics26_router.address().to_string(), + vec![], + format!("0x{block_height:x}"), + ) + .await + .with_context(|| { + format!("failed to fetch account proof for source router at height {block_height}") + })?; + + Ok(( + proof.storage_hash, + encode_rlp_node_list(&proof.account_proof), + )) + } + + async fn fetch_source_storage_proof(&self, block_height: u64, path: &[u8]) -> Result> { + let storage_key = + evm_ics26_commitment_path(path, U256::from_be_slice(&ICS26_IBC_STORAGE_SLOT)); + let proof = EthApiClient::new(self.src_provider.clone()) + .get_proof( + &self.src_ics26_router.address().to_string(), + vec![format!( + "0x{}", + hex::encode(storage_key.to_be_bytes::<32>()) + )], + format!("0x{block_height:x}"), + ) + .await + .with_context(|| { + format!("failed to fetch storage proof for source router at height {block_height}") + })?; + let storage_proof = proof + .storage_proof + .first() + .ok_or_else(|| anyhow!("missing storage proof response"))?; + + Ok(encode_rlp_node_list(&storage_proof.proof)) + } + + async fn fetch_destination_client_state( + &self, + dst_client_id: &str, + ) -> Result { + let client_address = self + .dst_ics26_router + .getClient(dst_client_id.to_string()) + .call() + .await + .with_context(|| { + format!("failed to fetch destination client address for {dst_client_id}") + })?; + let client_state_bz: Bytes = besu_qbft_light_client::BesuQBFTLightClient::new( + client_address, + self.dst_provider.clone(), + ) + .getClientState() + .call() + .await + .with_context(|| format!("failed to fetch destination client state for {dst_client_id}"))?; + + IBesuLightClientMsgs::ClientState::abi_decode(client_state_bz.as_ref()).with_context(|| { + format!("failed to decode destination client state for {dst_client_id}") + }) + } +} + +fn parse_create_client_params(parameters: &HashMap) -> Result { + for key in parameters.keys() { + if !matches!( + key.as_str(), + "trusting_period" | "max_clock_drift" | "trusted_height" | "role_manager" + ) { + bail!( + "unexpected parameter `{key}`, only `trusting_period`, `max_clock_drift`, `trusted_height`, and `role_manager` are allowed" + ); + } + } + + Ok(CreateClientParams { + trusting_period: parameters + .get("trusting_period") + .ok_or_else(|| anyhow!("missing `trusting_period` parameter"))? + .parse() + .context("failed to parse `trusting_period` as decimal seconds")?, + max_clock_drift: parameters + .get("max_clock_drift") + .ok_or_else(|| anyhow!("missing `max_clock_drift` parameter"))? + .parse() + .context("failed to parse `max_clock_drift` as decimal seconds")?, + trusted_height: parameters + .get("trusted_height") + .map(|value| { + value + .parse() + .context("failed to parse `trusted_height` as decimal block height") + }) + .transpose()?, + role_manager: parameters + .get("role_manager") + .map_or(Ok(Address::ZERO), |value| { + Address::from_str(value).context("failed to parse `role_manager` as hex address") + })?, + }) +} + +fn encode_rlp_node_list(nodes: &[Bytes]) -> Vec { + let payload_length = nodes.iter().map(|node| node.len()).sum(); + let mut encoded = Vec::new(); + RlpHeader { + list: true, + payload_length, + } + .encode(&mut encoded); + for node in nodes { + encoded.extend_from_slice(node.as_ref()); + } + encoded +} + +fn extract_validators_from_header_extra_data(header_rlp: &[u8]) -> Result> { + let header = Rlp::new(header_rlp); + let extra_data = header + .at(12) + .context("failed to read header extraData field")? + .data() + .context("failed to decode header extraData bytes")?; + let extra_data = Rlp::new(extra_data); + let validators = extra_data + .at(1) + .context("failed to read validator list from extraData")?; + + let mut out = Vec::with_capacity( + validators + .item_count() + .context("failed to read validator count")?, + ); + for validator in &validators { + let validator = validator + .data() + .context("failed to decode validator address")?; + if validator.len() != 20 { + bail!("invalid validator address length: {}", validator.len()); + } + out.push(Address::from_slice(validator)); + } + Ok(out) +} + +fn select_proof_height( + src_events: &[EurekaEventWithHeight], + timeout_relay_height: Option, +) -> Result { + match ( + src_events.iter().map(|event| event.height).max(), + timeout_relay_height, + ) { + (Some(src_height), Some(timeout_height)) => Ok(src_height.max(timeout_height)), + (Some(src_height), None) => Ok(src_height), + (None, Some(timeout_height)) => Ok(timeout_height), + (None, None) => bail!("no packets collected"), + } +} + +#[cfg(test)] +mod tests { + use super::{ + encode_rlp_node_list, extract_validators_from_header_extra_data, select_proof_height, + }; + use alloy::primitives::{hex, Address, Bytes}; + use proof_api_lib::events::{EurekaEvent, EurekaEventWithHeight}; + use ibc_eureka_solidity_types::ics26::IICS26RouterMsgs::{Packet, Payload}; + use serde::Deserialize; + use std::str::FromStr; + + #[derive(Debug, Deserialize)] + #[serde(rename_all = "camelCase")] + struct Fixture { + update_height12: UpdateFixture, + membership: ProofFixture, + non_membership: ProofFixture, + } + + #[derive(Debug, Deserialize)] + #[serde(rename_all = "camelCase")] + struct UpdateFixture { + header_rlp: String, + account_proof: String, + expected_validators: Vec, + } + + #[derive(Debug, Deserialize)] + #[serde(rename_all = "camelCase")] + struct ProofFixture { + proof: String, + } + + fn load_fixture() -> Fixture { + serde_json::from_str(include_str!(concat!( + env!("CARGO_MANIFEST_DIR"), + "/../../../../test/besu-bft/fixtures/qbft.json" + ))) + .unwrap() + } + + fn decode_hex_bytes(hex_value: &str) -> Vec { + hex::decode(hex_value.trim_start_matches("0x")).unwrap() + } + + fn decode_proof_nodes(proof_rlp: &[u8]) -> Vec { + let proof = rlp::Rlp::new(proof_rlp); + proof + .iter() + .map(|node| Bytes::copy_from_slice(node.as_raw())) + .collect() + } + + fn packet(sequence: u64) -> Packet { + Packet { + sequence, + sourceClient: "src-client".to_string(), + destClient: "dst-client".to_string(), + timeoutTimestamp: u64::MAX, + payloads: vec![Payload { + sourcePort: "transfer".to_string(), + destPort: "transfer".to_string(), + version: "ics20-1".to_string(), + encoding: "abi".to_string(), + value: Bytes::default(), + }], + } + } + + #[test] + fn extracts_validators_from_fixture_header() { + let fixture = load_fixture(); + let header_rlp = decode_hex_bytes(&fixture.update_height12.header_rlp); + let validators = extract_validators_from_header_extra_data(&header_rlp).unwrap(); + let expected = fixture + .update_height12 + .expected_validators + .iter() + .map(|address| Address::from_str(address).unwrap()) + .collect::>(); + + assert_eq!(validators, expected); + } + + #[test] + fn packs_account_proof_nodes_without_reencoding_nodes() { + let fixture = load_fixture(); + let account_proof_rlp = decode_hex_bytes(&fixture.update_height12.account_proof); + let nodes = decode_proof_nodes(&account_proof_rlp); + + assert_eq!(encode_rlp_node_list(&nodes), account_proof_rlp); + } + + #[test] + fn packs_membership_and_non_membership_storage_proofs() { + let fixture = load_fixture(); + let membership_proof = decode_hex_bytes(&fixture.membership.proof); + let non_membership_proof = decode_hex_bytes(&fixture.non_membership.proof); + + let membership_nodes = decode_proof_nodes(&membership_proof); + let non_membership_nodes = decode_proof_nodes(&non_membership_proof); + + assert_eq!(encode_rlp_node_list(&membership_nodes), membership_proof); + assert_eq!( + encode_rlp_node_list(&non_membership_nodes), + non_membership_proof + ); + } + + #[test] + fn selects_max_proof_height() { + let src_events = vec![ + EurekaEventWithHeight { + event: EurekaEvent::SendPacket(packet(3)), + height: 10, + }, + EurekaEventWithHeight { + event: EurekaEvent::WriteAcknowledgement( + packet(4), + vec![Bytes::from(vec![b'a', b'c', b'k'])], + ), + height: 12, + }, + ]; + + assert_eq!(select_proof_height(&src_events, None).unwrap(), 12); + assert_eq!(select_proof_height(&[], Some(15)).unwrap(), 15); + assert_eq!(select_proof_height(&src_events, Some(11)).unwrap(), 12); + assert_eq!(select_proof_height(&src_events, Some(14)).unwrap(), 14); + } +} diff --git a/packages/proof-api/modules/evmdummy-to-evmdummy/Cargo.toml b/packages/proof-api/modules/evmdummy-to-evmdummy/Cargo.toml new file mode 100644 index 000000000..d6dd7c750 --- /dev/null +++ b/packages/proof-api/modules/evmdummy-to-evmdummy/Cargo.toml @@ -0,0 +1,16 @@ +[package] +name = "proof-api-evmdummy-to-evmdummy" +version.workspace = true +edition.workspace = true +repository.workspace = true +license.workspace = true + +[dependencies] +alloy = { workspace = true, features = ["full", "node-bindings"] } +anyhow = { workspace = true, features = ["std"] } +proof-api-core = { workspace = true, default-features = false } +proof-api-lib = { workspace = true, default-features = false } +ibc-eureka-solidity-types = { workspace = true, features = ["rpc"] } +serde = { workspace = true, features = ["derive"] } +serde_json = { workspace = true } +tonic = { workspace = true, default-features = true } diff --git a/packages/proof-api/modules/evmdummy-to-evmdummy/src/lib.rs b/packages/proof-api/modules/evmdummy-to-evmdummy/src/lib.rs new file mode 100644 index 000000000..cf674f12c --- /dev/null +++ b/packages/proof-api/modules/evmdummy-to-evmdummy/src/lib.rs @@ -0,0 +1,189 @@ +//! Local/dev/testing-only one-sided proof API module from EVM dummy to EVM dummy. + +#![deny(clippy::nursery, clippy::pedantic, warnings, unused_crate_dependencies)] +#![allow(missing_docs)] + +mod tx_builder; + +use std::collections::HashMap; + +use alloy::{ + primitives::{Address, TxHash}, + providers::{Provider, RootProvider}, +}; +use proof_api_core::{ + api::{self, proof_api_service_server::ProofApiService}, + modules::ProofApiModule, +}; +use proof_api_lib::{ + listener::{eth_eureka, ChainListenerService}, + utils::RelayEventsParams, +}; +use tonic::{Request, Response}; +use tx_builder::TxBuilder; + +#[derive(Clone, Debug, serde::Deserialize, serde::Serialize)] +pub struct EvmDummyToEvmDummyConfig { + pub src_chain_id: String, + pub src_rpc_url: String, + pub src_ics26_address: Address, + pub dst_rpc_url: String, + pub dst_ics26_address: Address, +} + +#[derive(Clone, Copy, Debug)] +pub struct EvmDummyToEvmDummyProofApiModule; + +struct EvmDummyToEvmDummyProofApiModuleService { + src_chain_id: String, + src_ics26_address: Address, + src_listener: eth_eureka::ChainListener, + dst_listener: eth_eureka::ChainListener, + tx_builder: TxBuilder, +} + +impl EvmDummyToEvmDummyProofApiModuleService { + async fn new(config: EvmDummyToEvmDummyConfig) -> anyhow::Result { + let src_provider = RootProvider::builder() + .connect(&config.src_rpc_url) + .await + .map_err(|e| anyhow::anyhow!("failed to create source provider: {e}"))?; + let dst_provider = RootProvider::builder() + .connect(&config.dst_rpc_url) + .await + .map_err(|e| anyhow::anyhow!("failed to create destination provider: {e}"))?; + + let src_listener = + eth_eureka::ChainListener::new(config.src_ics26_address, src_provider.clone()); + let dst_listener = + eth_eureka::ChainListener::new(config.dst_ics26_address, dst_provider.clone()); + let tx_builder = TxBuilder::new(src_provider, dst_provider, config.dst_ics26_address); + + Ok(Self { + src_chain_id: config.src_chain_id, + src_ics26_address: config.src_ics26_address, + src_listener, + dst_listener, + tx_builder, + }) + } +} + +fn to_tonic_status(e: anyhow::Error) -> tonic::Status { + tonic::Status::from_error(e.into()) +} + +#[allow(clippy::result_large_err)] +fn parse_eth_tx_hashes(tx_ids: Vec>) -> Result, tonic::Status> { + tx_ids + .into_iter() + .map(TryInto::<[u8; 32]>::try_into) + .map(|tx_hash| tx_hash.map(TxHash::from)) + .collect::, _>>() + .map_err(|tx| tonic::Status::from_error(format!("invalid tx hash: {tx:?}").into())) +} + +#[tonic::async_trait] +impl ProofApiService for EvmDummyToEvmDummyProofApiModuleService { + async fn info( + &self, + _request: Request, + ) -> Result, tonic::Status> { + Ok(Response::new(api::InfoResponse { + target_chain: Some(api::Chain { + chain_id: self + .dst_listener + .chain_id() + .await + .map_err(to_tonic_status)?, + ibc_version: "2".to_string(), + ibc_contract: self.tx_builder.ics26_router_address().to_string(), + }), + source_chain: Some(api::Chain { + chain_id: self.src_chain_id.clone(), + ibc_version: "2".to_string(), + ibc_contract: self.src_ics26_address.to_string(), + }), + metadata: HashMap::default(), + })) + } + + async fn create_client( + &self, + _request: Request, + ) -> Result, tonic::Status> { + Ok(Response::new(api::CreateClientResponse { + tx: self.tx_builder.create_client(), + address: String::new(), + })) + } + + async fn update_client( + &self, + request: Request, + ) -> Result, tonic::Status> { + let inner = request.into_inner(); + let tx = self + .tx_builder + .update_client(&inner.dst_client_id) + .await + .map_err(to_tonic_status)?; + Ok(Response::new(api::UpdateClientResponse { + tx, + address: self.tx_builder.ics26_router_address().to_string(), + })) + } + + async fn relay_by_tx( + &self, + request: Request, + ) -> Result, tonic::Status> { + let inner = request.into_inner(); + let src_txs = parse_eth_tx_hashes(inner.source_tx_ids)?; + let timeout_txs = parse_eth_tx_hashes(inner.timeout_tx_ids)?; + let src_events = self + .src_listener + .fetch_tx_events(src_txs) + .await + .map_err(to_tonic_status)?; + let target_events = self + .dst_listener + .fetch_tx_events(timeout_txs) + .await + .map_err(to_tonic_status)?; + let tx = self + .tx_builder + .relay_events(RelayEventsParams { + src_events, + target_events, + timeout_relay_height: None, + src_client_id: inner.src_client_id, + dst_client_id: inner.dst_client_id, + src_packet_seqs: inner.src_packet_sequences, + dst_packet_seqs: inner.dst_packet_sequences, + }) + .await + .map_err(to_tonic_status)?; + Ok(Response::new(api::RelayByTxResponse { + tx, + address: self.tx_builder.ics26_router_address().to_string(), + })) + } +} + +#[tonic::async_trait] +impl ProofApiModule for EvmDummyToEvmDummyProofApiModule { + fn name(&self) -> &'static str { + "evmdummy_to_evmdummy" + } + + async fn create_service( + &self, + config: serde_json::Value, + ) -> anyhow::Result> { + let config: EvmDummyToEvmDummyConfig = serde_json::from_value(config)?; + Ok(Box::new( + EvmDummyToEvmDummyProofApiModuleService::new(config).await?, + )) + } +} diff --git a/packages/proof-api/modules/evmdummy-to-evmdummy/src/tx_builder.rs b/packages/proof-api/modules/evmdummy-to-evmdummy/src/tx_builder.rs new file mode 100644 index 000000000..55ab0c16d --- /dev/null +++ b/packages/proof-api/modules/evmdummy-to-evmdummy/src/tx_builder.rs @@ -0,0 +1,262 @@ +use alloy::{ + network::Ethereum, + primitives::{Address, Bytes}, + providers::{Provider, RootProvider}, + sol_types::{SolCall, SolValue}, +}; +use anyhow::{bail, Context, Result}; +use proof_api_lib::utils::{ + eth_eureka::{src_events_to_recv_and_ack_msgs, target_events_to_timeout_msgs}, + RelayEventsParams, +}; +use ibc_eureka_solidity_types::{ + dummy::{ + dummy_light_client, + dummy_light_client_msgs::DummyLightClientMsgs::{ + Height as DummyHeight, Membership, MsgUpdateClient, + }, + }, + ics26::{ + acknowledgement_commitment, + router::{multicallCall, routerCalls, routerInstance, updateClientCall}, + IICS02ClientMsgs::Height, + }, +}; + +pub struct TxBuilder { + src_provider: RootProvider, + dst_provider: RootProvider, + dst_ics26_router: routerInstance, +} + +impl TxBuilder { + pub fn new( + src_provider: RootProvider, + dst_provider: RootProvider, + dst_ics26_address: Address, + ) -> Self { + Self { + src_provider, + dst_provider: dst_provider.clone(), + dst_ics26_router: routerInstance::new(dst_ics26_address, dst_provider), + } + } + + pub const fn ics26_router_address(&self) -> &Address { + self.dst_ics26_router.address() + } + + pub fn create_client(&self) -> Vec { + dummy_light_client::DummyLightClient::deploy_builder(self.dst_provider.clone()) + .calldata() + .to_vec() + } + + pub async fn update_client(&self, dst_client_id: &str) -> Result> { + let (latest_source_height, latest_source_timestamp) = + self.latest_source_consensus_state().await?; + Ok(update_client_call( + dst_client_id, + &dummy_update_msg(latest_source_height, latest_source_timestamp, Vec::new()), + ) + .abi_encode()) + } + + pub async fn relay_events(&self, params: RelayEventsParams) -> Result> { + let (latest_source_height, latest_source_timestamp) = + self.latest_source_consensus_state().await?; + let counterparty = self + .dst_ics26_router + .getCounterparty(params.dst_client_id.clone()) + .call() + .await?; + let proof_height = Height { + revisionNumber: 0, + revisionHeight: latest_source_height, + }; + + let recv_and_ack_msgs = src_events_to_recv_and_ack_msgs( + params.src_events, + ¶ms.src_client_id, + ¶ms.dst_client_id, + ¶ms.src_packet_seqs, + ¶ms.dst_packet_seqs, + &proof_height, + latest_source_timestamp, + ); + let timeout_msgs = target_events_to_timeout_msgs( + params.target_events, + ¶ms.src_client_id, + ¶ms.dst_client_id, + ¶ms.dst_packet_seqs, + &proof_height, + latest_source_timestamp, + ); + let packet_calls: Vec<_> = recv_and_ack_msgs.into_iter().chain(timeout_msgs).collect(); + if packet_calls.is_empty() { + bail!("no packets collected"); + } + + let memberships = memberships_for_calls(&packet_calls, &counterparty.merklePrefix); + let update_call = update_client_call( + ¶ms.dst_client_id, + &dummy_update_msg(latest_source_height, latest_source_timestamp, memberships), + ) + .abi_encode(); + let packet_calls = packet_calls.into_iter().map(|msg| match msg { + routerCalls::timeoutPacket(call) => call.abi_encode(), + routerCalls::recvPacket(call) => call.abi_encode(), + routerCalls::ackPacket(call) => call.abi_encode(), + _ => unreachable!(), + }); + Ok(multicallCall { + data: std::iter::once(update_call.into()) + .chain(packet_calls.map(Into::into)) + .collect(), + } + .abi_encode()) + } + + async fn latest_source_consensus_state(&self) -> Result<(u64, u64)> { + let height = self + .src_provider + .get_block_number() + .await + .context("failed to fetch latest source block number")?; + let block = self + .src_provider + .get_block(height.into()) + .await + .with_context(|| format!("failed to fetch source block at height {height}"))? + .with_context(|| format!("source block at height {height} not found"))?; + + Ok((height, block.header.timestamp)) + } +} + +fn update_client_call(dst_client_id: &str, msg: &MsgUpdateClient) -> updateClientCall { + updateClientCall { + clientId: dst_client_id.to_string(), + updateMsg: msg.abi_encode().into(), + } +} + +const fn dummy_update_msg( + revision_height: u64, + timestamp: u64, + memberships: Vec, +) -> MsgUpdateClient { + MsgUpdateClient { + height: DummyHeight { + revisionNumber: 0, + revisionHeight: revision_height, + }, + timestamp, + memberships, + } +} + +fn memberships_for_calls(calls: &[routerCalls], merkle_prefix: &[Bytes]) -> Vec { + calls + .iter() + .filter_map(|call| match call { + routerCalls::recvPacket(call) => Some(Membership { + path: prefixed_path(merkle_prefix, &call.msg_.packet.commitment_path()), + value: call.msg_.packet.commitment().into(), + }), + routerCalls::ackPacket(call) => Some(Membership { + path: prefixed_path(merkle_prefix, &call.msg_.packet.ack_commitment_path()), + value: acknowledgement_commitment(std::slice::from_ref(&call.msg_.acknowledgement)) + .into(), + }), + routerCalls::timeoutPacket(_) => None, + _ => unreachable!(), + }) + .collect() +} + +fn prefixed_path(merkle_prefix: &[Bytes], path: &[u8]) -> Vec { + let (last, prefix) = merkle_prefix + .split_last() + .expect("merkle prefix must be non-empty"); + let mut last = last.to_vec(); + last.extend_from_slice(path); + let mut merkle_prefix = prefix.to_vec(); + merkle_prefix.push(last.into()); + merkle_prefix +} + +#[cfg(test)] +mod tests { + use super::*; + use alloy::primitives::Bytes; + use ibc_eureka_solidity_types::ics26::{ + router::{ackPacketCall, recvPacketCall, timeoutPacketCall}, + IICS26RouterMsgs::{MsgAckPacket, MsgRecvPacket, MsgTimeoutPacket, Packet}, + }; + + fn packet() -> Packet { + Packet { + sequence: 7, + sourceClient: "src".to_string(), + destClient: "dst".to_string(), + timeoutTimestamp: u64::MAX, + payloads: Vec::new(), + } + } + + #[test] + fn prefixed_path_appends_to_last_prefix_element() { + let path = packet().commitment_path(); + let got = prefixed_path(&[Bytes::from_static(b"ibc")], &path); + let mut expected = b"ibc".to_vec(); + expected.extend_from_slice(&path); + assert_eq!(got, vec![Bytes::from(expected)]); + } + + #[test] + fn membership_generation_matches_packet_calls() { + let pkt = packet(); + let ack = Bytes::from_static(b"ack"); + let calls = vec![ + routerCalls::recvPacket(recvPacketCall { + msg_: MsgRecvPacket { + packet: pkt.clone(), + proofHeight: Height { + revisionNumber: 0, + revisionHeight: 1, + }, + proofCommitment: Bytes::new(), + }, + }), + routerCalls::ackPacket(ackPacketCall { + msg_: MsgAckPacket { + packet: pkt.clone(), + acknowledgement: ack.clone(), + proofHeight: Height { + revisionNumber: 0, + revisionHeight: 1, + }, + proofAcked: Bytes::new(), + }, + }), + routerCalls::timeoutPacket(timeoutPacketCall { + msg_: MsgTimeoutPacket { + packet: pkt.clone(), + proofHeight: Height { + revisionNumber: 0, + revisionHeight: 1, + }, + proofTimeout: Bytes::new(), + }, + }), + ]; + let memberships = memberships_for_calls(&calls, &[Bytes::from_static(b"ibc")]); + assert_eq!(memberships.len(), 2); + assert_eq!(memberships[0].value, Bytes::from(pkt.commitment())); + assert_eq!( + memberships[1].value, + Bytes::from(acknowledgement_commitment(&[ack])) + ); + } +} diff --git a/packages/solidity/src/besu.rs b/packages/solidity/src/besu.rs new file mode 100644 index 000000000..789defd4b --- /dev/null +++ b/packages/solidity/src/besu.rs @@ -0,0 +1,25 @@ +pub mod besu_ibft2_light_client { + #[cfg(feature = "rpc")] + alloy_sol_types::sol!( + #[sol(rpc)] + #[allow(clippy::nursery, clippy::too_many_arguments)] + BesuIBFT2LightClient, + "../../ibc-solidity/abi/bytecode/BesuIBFT2LightClient.json" + ); + + #[cfg(not(feature = "rpc"))] + alloy_sol_types::sol!(BesuIBFT2LightClient, "../../ibc-solidity/abi/BesuIBFT2LightClient.json"); +} + +pub mod besu_qbft_light_client { + #[cfg(feature = "rpc")] + alloy_sol_types::sol!( + #[sol(rpc)] + #[allow(clippy::nursery, clippy::too_many_arguments)] + BesuQBFTLightClient, + "../../ibc-solidity/abi/bytecode/BesuQBFTLightClient.json" + ); + + #[cfg(not(feature = "rpc"))] + alloy_sol_types::sol!(BesuQBFTLightClient, "../../ibc-solidity/abi/BesuQBFTLightClient.json"); +} diff --git a/packages/solidity/src/dummy.rs b/packages/solidity/src/dummy.rs new file mode 100644 index 000000000..2e279e74b --- /dev/null +++ b/packages/solidity/src/dummy.rs @@ -0,0 +1,37 @@ +//! Solidity types for dummy light client. + +pub mod dummy_light_client { + #[cfg(feature = "rpc")] + alloy_sol_types::sol!( + #[sol(rpc)] + #[allow(clippy::nursery, clippy::too_many_arguments)] + DummyLightClient, + "../../ibc-solidity/abi/bytecode/DummyLightClient.json" + ); + + #[cfg(not(feature = "rpc"))] + alloy_sol_types::sol!(DummyLightClient, "../../ibc-solidity/abi/DummyLightClient.json"); +} + +pub mod dummy_light_client_msgs { + alloy_sol_types::sol! { + #[derive(Debug, PartialEq, Eq)] + library DummyLightClientMsgs { + struct Height { + uint64 revisionNumber; + uint64 revisionHeight; + } + + struct Membership { + bytes[] path; + bytes value; + } + + struct MsgUpdateClient { + Height height; + uint64 timestamp; + Membership[] memberships; + } + } + } +} diff --git a/packages/solidity/src/ics26.rs b/packages/solidity/src/ics26.rs index 2d6dbd46d..49d311eb2 100644 --- a/packages/solidity/src/ics26.rs +++ b/packages/solidity/src/ics26.rs @@ -89,6 +89,16 @@ impl IICS26RouterMsgs::Packet { } } +/// Returns the acknowledgement commitment for one or more acknowledgements. +#[must_use] +pub fn acknowledgement_commitment(acks: &[alloy_primitives::Bytes]) -> Vec { + let mut buf = vec![2_u8]; + for ack in acks { + buf.extend_from_slice(&Sha256::digest(ack)); + } + Sha256::digest(&buf).to_vec() +} + impl From for IICS26RouterMsgs::Packet { fn from(packet: Packet) -> Self { Self { diff --git a/packages/solidity/src/lib.rs b/packages/solidity/src/lib.rs index 18f1cbcb8..bdec1c4e6 100644 --- a/packages/solidity/src/lib.rs +++ b/packages/solidity/src/lib.rs @@ -5,6 +5,8 @@ #![deny(clippy::nursery, clippy::pedantic, warnings, unused_crate_dependencies)] pub mod attestation; +pub mod besu; +pub mod dummy; pub mod ics26; pub mod msgs; pub mod sp1_ics07; diff --git a/packages/solidity/src/msgs.rs b/packages/solidity/src/msgs.rs index c0a867d2c..c0f79f02c 100644 --- a/packages/solidity/src/msgs.rs +++ b/packages/solidity/src/msgs.rs @@ -45,6 +45,7 @@ alloy_sol_types::sol!( alloy_sol_types::sol!( "../../ibc-solidity/contracts/light-clients/attestation/msgs/IAttestationLightClientMsgs.sol" ); +alloy_sol_types::sol!("../../ibc-solidity/contracts/light-clients/besu/msgs/IBesuLightClientMsgs.sol"); #[cfg(feature = "rpc")] impl ISP1Msgs::SP1Proof { diff --git a/programs/proof-api/Cargo.toml b/programs/proof-api/Cargo.toml index 70427d9ff..506fc92cd 100644 --- a/programs/proof-api/Cargo.toml +++ b/programs/proof-api/Cargo.toml @@ -11,6 +11,8 @@ proof-api-eth-to-cosmos = { workspace = true, default-features = false } proof-api-eth-to-cosmos-compat = { workspace = true, default-features = false } proof-api-cosmos-to-eth = { workspace = true, default-features = false } proof-api-eth-to-eth = { workspace = true, default-features = false } +proof-api-evmdummy-to-evmdummy = { workspace = true, default-features = false } +proof-api-besu-to-besu = { workspace = true, default-features = false } proof-api-cosmos-to-cosmos = { workspace = true, default-features = false } proof-api-solana-to-cosmos = { workspace = true, default-features = false } proof-api-cosmos-to-solana = { workspace = true, default-features = false } diff --git a/programs/proof-api/README.md b/programs/proof-api/README.md index 9bced7883..fa50251a5 100644 --- a/programs/proof-api/README.md +++ b/programs/proof-api/README.md @@ -23,6 +23,8 @@ Each module runs in one direction and specializes in how it builds proofs and tr | `cosmos_to_eth` | Cosmos SDK | EVM | Parse Cosmos events, build EVM IBC txs | `sp1` — ZK proofs via SP1
`attested` — multisig attestations | | `eth_to_cosmos` | EVM | Cosmos SDK | Parse EVM events, build Cosmos IBC txs | `real` — ethereum mainnet beacon API proofs
`mock` — dev/test mode
`attested` — multisig attestations | | `eth_to_eth` | EVM | EVM | Parse EVM events, build attested txs | `attested` — multisig attestations | +| `evmdummy_to_evmdummy` | EVM | EVM | Parse EVM events, build local dummy txs | insecure local/dev/testing only; dummy membership records, not real proofs | +| `besu_to_besu` | Besu BFT EVM | Besu BFT EVM | Parse EVM events, build Besu real-proof txs | direct Besu light-client updates + Besu account/storage proofs | | `cosmos_to_cosmos` | Cosmos SDK | Cosmos SDK | Parse Cosmos events, build Cosmos IBC txs | ICS-07 light client proofs only (validator signatures and merkle proofs) | | `cosmos_to_solana` | Cosmos SDK | Solana | Parse Cosmos events, build Solana IBC txs | ICS-07 light client proofs only (validator signatures and merkle proofs) | | `solana_to_cosmos` | Solana | Cosmos SDK | Parse Solana events, build Cosmos IBC txs | multisig attestations only | @@ -124,6 +126,21 @@ Module configuration varies by module type: - `mode.cache`: Optional cache config. - `mode.cache.state_cache_max_entries`. (default: 10000) - `mode.cache.packet_cache_max_entries`. (default: 10000) +- `evmdummy_to_evmdummy`: + - `src_chain_id`: Source chain ID string. + - `src_rpc_url`: Source EVM RPC endpoint. + - `src_ics26_address`: Source IBC router contract address. + - `dst_rpc_url`: Destination EVM RPC endpoint. + - `dst_ics26_address`: Destination IBC router contract address. + - Create-client returns only `DummyLightClient` deployment calldata; the caller must deploy it and register it with `ICS26Router.addClient(...)`. + - Insecure, local/dev/testing only. Relay uses dummy membership records, not real proofs. +- `besu_to_besu`: + - `src_chain_id`: Source chain ID string. + - `src_rpc_url`: Source Besu RPC endpoint. + - `src_ics26_address`: Source IBC router contract address. + - `dst_rpc_url`: Destination Besu RPC endpoint. + - `dst_ics26_address`: Destination IBC router contract address. + - `consensus_type`: Source Besu consensus type, `qbft` or `ibft2`. - `cosmos_to_cosmos`: - `src_rpc_url`: RPC endpoint for the source chain. - `target_rpc_url`: RPC endpoint for the destination chain. @@ -142,6 +159,23 @@ Module configuration varies by module type: - `signer_address`: Cosmos address used for message construction metadata. - `solana_ics26_program_id`: Solana ICS26 router program ID. +## `besu_to_besu` create-client parameters + +`besu_to_besu` `CreateClient` returns only deployment calldata for `BesuQBFTLightClient` or `BesuIBFT2LightClient`. It does not call `ICS26Router.addClient(...)`. + +Required parameters: +- `trusting_period`: Decimal seconds for the weak-subjectivity window. +- `max_clock_drift`: Decimal seconds for allowed future header drift. + +Optional parameters: +- `trusted_height`: Decimal source block height. Defaults to the latest source block. +- `role_manager`: Hex address. Defaults to the zero address. + +Operational notes: +- `consensus_type` is fixed by module config and only affects `CreateClient` wrapper selection. +- `UpdateClient` is a single direct Besu update. No catch-up or intermediate-header search is performed. +- `RelayByTx` uses real Besu proofs: full header RLP, one account proof in the client update, and storage proofs for recv/ack/timeout packet verification. + ## Using the gRPC API After the service is running, use the gRPC endpoints defined in [`proto/proofapi/proofapi.proto`](../../proto/proofapi/proofapi.proto) to submit transaction hashes and retrieve the unsigned IBC transactions plus proofs. Typical usage is: diff --git a/programs/proof-api/config.example.json b/programs/proof-api/config.example.json index effcb2fc4..35b3a322b 100644 --- a/programs/proof-api/config.example.json +++ b/programs/proof-api/config.example.json @@ -133,6 +133,19 @@ } } }, + { + "name": "evmdummy_to_evmdummy", + "src_chain": "evm-local-a", + "dst_chain": "evm-local-b", + "enabled": false, + "config": { + "src_chain_id": "evm-local-a", + "src_rpc_url": "http://127.0.0.1:8545", + "src_ics26_address": "0x4242424242424242424242424242424242424242", + "dst_rpc_url": "http://127.0.0.1:9545", + "dst_ics26_address": "0x4242424242424242424242424242424242424242" + } + }, { "name": "eth_to_cosmos_compat", "src_chain": "0x1", @@ -146,6 +159,19 @@ "mode": "real" } }, + { + "name": "besu_to_besu", + "src_chain": "besu-a", + "dst_chain": "besu-b", + "config": { + "src_chain_id": "besu-a", + "src_rpc_url": "http://127.0.0.1:8545", + "src_ics26_address": "0x4242424242424242424242424242424242424242", + "dst_rpc_url": "http://127.0.0.1:9545", + "dst_ics26_address": "0x4242424242424242424242424242424242424242", + "consensus_type": "qbft" + } + }, { "name": "cosmos_to_cosmos", "src_chain": "cosmoshub-4", diff --git a/programs/proof-api/src/bin/proof-api.rs b/programs/proof-api/src/bin/proof-api.rs index c247603c7..56b590391 100644 --- a/programs/proof-api/src/bin/proof-api.rs +++ b/programs/proof-api/src/bin/proof-api.rs @@ -5,6 +5,7 @@ use std::{net::SocketAddr, path::PathBuf}; use clap::Parser; use proof_api::cli::{Commands, ProofApiCli}; use proof_api::observability::init_observability; +use proof_api_besu_to_besu::BesuToBesuProofApiModule; use proof_api_core::{builder::ProofApiBuilder, config::ProofApiConfig}; use proof_api_cosmos_to_cosmos::CosmosToCosmosProofApiModule; use proof_api_cosmos_to_eth::CosmosToEthProofApiModule; @@ -13,6 +14,7 @@ use proof_api_eth_to_cosmos::EthToCosmosProofApiModule; use proof_api_eth_to_cosmos_compat::EthToCosmosCompatProofApiModule; use proof_api_eth_to_eth::EthToEthProofApiModule; use proof_api_eth_to_solana::EthToSolanaProofApiModule; +use proof_api_evmdummy_to_evmdummy::EvmDummyToEvmDummyProofApiModule; use proof_api_solana_to_cosmos::SolanaToCosmosProofApiModule; use proof_api_solana_to_eth::SolanaToEthProofApiModule; @@ -47,6 +49,8 @@ async fn main() -> anyhow::Result<()> { proof_api_builder.add_module(EthToCosmosProofApiModule); proof_api_builder.add_module(EthToCosmosCompatProofApiModule); proof_api_builder.add_module(EthToEthProofApiModule); + proof_api_builder.add_module(EvmDummyToEvmDummyProofApiModule); + proof_api_builder.add_module(BesuToBesuProofApiModule); proof_api_builder.add_module(SolanaToCosmosProofApiModule); proof_api_builder.add_module(CosmosToSolanaProofApiModule); proof_api_builder.add_module(EthToSolanaProofApiModule); From 7217605c5c9be245c8bd2525448bcdb8e7e982c5 Mon Sep 17 00:00:00 2001 From: Gjermund Garaba Date: Thu, 20 Aug 2026 16:29:46 +0200 Subject: [PATCH 02/22] fix(besu): correct fixture paths in proof-api tests and e2e generator The include_str! path in proof-api-besu-to-besu was missing the ibc-solidity/ segment, so the crate's test target failed to compile, breaking the root-level cargo test/clippy checks. The Go fixture generator wrote qbft.json to test/besu-bft/fixtures (relative to the repo root) while the Foundry suite reads ibc-solidity/test/besu-bft/fixtures, so fixture regeneration aborted with a missing-directory error and never updated the committed fixture. Signed-off-by: Gjermund Garaba --- e2e/interchaintestv8/testvalues/values.go | 4 +++- packages/proof-api/modules/besu-to-besu/src/tx_builder.rs | 2 +- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/e2e/interchaintestv8/testvalues/values.go b/e2e/interchaintestv8/testvalues/values.go index 9bded1c08..253d060e9 100644 --- a/e2e/interchaintestv8/testvalues/values.go +++ b/e2e/interchaintestv8/testvalues/values.go @@ -203,7 +203,9 @@ const ( // TendermintLightClientFixturesDir is the directory where the Tendermint light client fixtures are stored. TendermintLightClientFixturesDir = "packages/tendermint-light-client/fixtures/" // BesuBFTFixturesDir is the directory where the Besu BFT light client fixtures are stored. - BesuBFTFixturesDir = "test/besu-bft/fixtures" + // Relative to the repo root (e2e suites chdir there), and shared with the Foundry suite in + // ibc-solidity/test/besu-bft (which resolves it via vm.projectRoot()). + BesuBFTFixturesDir = "ibc-solidity/test/besu-bft/fixtures" // IbcCommitmentSlotHex is the storage slot in the IBC solidity contract for the IBC commitments. IbcCommitmentSlotHex = ics26router.IbcStoreStorageSlot diff --git a/packages/proof-api/modules/besu-to-besu/src/tx_builder.rs b/packages/proof-api/modules/besu-to-besu/src/tx_builder.rs index bbd2ee877..f1f208739 100644 --- a/packages/proof-api/modules/besu-to-besu/src/tx_builder.rs +++ b/packages/proof-api/modules/besu-to-besu/src/tx_builder.rs @@ -519,7 +519,7 @@ mod tests { fn load_fixture() -> Fixture { serde_json::from_str(include_str!(concat!( env!("CARGO_MANIFEST_DIR"), - "/../../../../test/besu-bft/fixtures/qbft.json" + "/../../../../ibc-solidity/test/besu-bft/fixtures/qbft.json" ))) .unwrap() } From 729a757d76d99a4130b783462543933d9ad4e546 Mon Sep 17 00:00:00 2001 From: Gjermund Garaba Date: Thu, 20 Aug 2026 17:48:23 +0200 Subject: [PATCH 03/22] fix(besu): match validator quorum calculation Signed-off-by: Gjermund Garaba --- .../abi/bytecode/BesuIBFT2LightClient.json | 2 +- .../abi/bytecode/BesuQBFTLightClient.json | 2 +- .../besu/BesuLightClientBase.sol | 3 +- .../test/besu-bft/BesuLightClientQuorum.t.sol | 45 +++++++++++++++++++ 4 files changed, 49 insertions(+), 3 deletions(-) create mode 100644 ibc-solidity/test/besu-bft/BesuLightClientQuorum.t.sol diff --git a/ibc-solidity/abi/bytecode/BesuIBFT2LightClient.json b/ibc-solidity/abi/bytecode/BesuIBFT2LightClient.json index 3fdb5bb85..1c61f4df8 100644 --- a/ibc-solidity/abi/bytecode/BesuIBFT2LightClient.json +++ b/ibc-solidity/abi/bytecode/BesuIBFT2LightClient.json @@ -1 +1 @@ -{"abi":[{"type":"constructor","inputs":[{"name":"ibcRouter","type":"address","internalType":"address"},{"name":"initialTrustedHeight","type":"uint64","internalType":"uint64"},{"name":"initialTrustedTimestamp","type":"uint64","internalType":"uint64"},{"name":"initialTrustedStorageRoot","type":"bytes32","internalType":"bytes32"},{"name":"initialTrustedValidators","type":"address[]","internalType":"address[]"},{"name":"trustingPeriod","type":"uint64","internalType":"uint64"},{"name":"maxClockDrift","type":"uint64","internalType":"uint64"},{"name":"roleManager","type":"address","internalType":"address"}],"stateMutability":"nonpayable"},{"type":"function","name":"DEFAULT_ADMIN_ROLE","inputs":[],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"type":"function","name":"PROOF_SUBMITTER_ROLE","inputs":[],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"type":"function","name":"getClientState","inputs":[],"outputs":[{"name":"","type":"bytes","internalType":"bytes"}],"stateMutability":"view"},{"type":"function","name":"getConsensusState","inputs":[{"name":"revisionHeight","type":"uint64","internalType":"uint64"}],"outputs":[{"name":"","type":"bytes","internalType":"bytes"}],"stateMutability":"view"},{"type":"function","name":"getRoleAdmin","inputs":[{"name":"role","type":"bytes32","internalType":"bytes32"}],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"type":"function","name":"grantRole","inputs":[{"name":"role","type":"bytes32","internalType":"bytes32"},{"name":"account","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"hasRole","inputs":[{"name":"role","type":"bytes32","internalType":"bytes32"},{"name":"account","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"misbehaviour","inputs":[{"name":"","type":"bytes","internalType":"bytes"}],"outputs":[],"stateMutability":"view"},{"type":"function","name":"renounceRole","inputs":[{"name":"role","type":"bytes32","internalType":"bytes32"},{"name":"callerConfirmation","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"revokeRole","inputs":[{"name":"role","type":"bytes32","internalType":"bytes32"},{"name":"account","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"supportsInterface","inputs":[{"name":"interfaceId","type":"bytes4","internalType":"bytes4"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"updateClient","inputs":[{"name":"updateMsg","type":"bytes","internalType":"bytes"}],"outputs":[{"name":"","type":"uint8","internalType":"enum ILightClientMsgs.UpdateResult"}],"stateMutability":"nonpayable"},{"type":"function","name":"verifyMembership","inputs":[{"name":"msg_","type":"tuple","internalType":"struct ILightClientMsgs.MsgVerifyMembership","components":[{"name":"proof","type":"bytes","internalType":"bytes"},{"name":"proofHeight","type":"tuple","internalType":"struct IICS02ClientMsgs.Height","components":[{"name":"revisionNumber","type":"uint64","internalType":"uint64"},{"name":"revisionHeight","type":"uint64","internalType":"uint64"}]},{"name":"path","type":"bytes[]","internalType":"bytes[]"},{"name":"value","type":"bytes","internalType":"bytes"}]}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"verifyNonMembership","inputs":[{"name":"msg_","type":"tuple","internalType":"struct ILightClientMsgs.MsgVerifyNonMembership","components":[{"name":"proof","type":"bytes","internalType":"bytes"},{"name":"proofHeight","type":"tuple","internalType":"struct IICS02ClientMsgs.Height","components":[{"name":"revisionNumber","type":"uint64","internalType":"uint64"},{"name":"revisionHeight","type":"uint64","internalType":"uint64"}]},{"name":"path","type":"bytes[]","internalType":"bytes[]"}]}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"event","name":"RoleAdminChanged","inputs":[{"name":"role","type":"bytes32","indexed":true,"internalType":"bytes32"},{"name":"previousAdminRole","type":"bytes32","indexed":true,"internalType":"bytes32"},{"name":"newAdminRole","type":"bytes32","indexed":true,"internalType":"bytes32"}],"anonymous":false},{"type":"event","name":"RoleGranted","inputs":[{"name":"role","type":"bytes32","indexed":true,"internalType":"bytes32"},{"name":"account","type":"address","indexed":true,"internalType":"address"},{"name":"sender","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"type":"event","name":"RoleRevoked","inputs":[{"name":"role","type":"bytes32","indexed":true,"internalType":"bytes32"},{"name":"account","type":"address","indexed":true,"internalType":"address"},{"name":"sender","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"type":"error","name":"AccessControlBadConfirmation","inputs":[]},{"type":"error","name":"AccessControlUnauthorizedAccount","inputs":[{"name":"account","type":"address","internalType":"address"},{"name":"neededRole","type":"bytes32","internalType":"bytes32"}]},{"type":"error","name":"ConflictingConsensusState","inputs":[{"name":"revisionHeight","type":"uint64","internalType":"uint64"}]},{"type":"error","name":"ConsensusStateExpired","inputs":[{"name":"trustedTimestamp","type":"uint64","internalType":"uint64"},{"name":"currentTimestamp","type":"uint256","internalType":"uint256"},{"name":"trustingPeriod","type":"uint64","internalType":"uint64"}]},{"type":"error","name":"ConsensusStateNotFound","inputs":[{"name":"revisionHeight","type":"uint64","internalType":"uint64"}]},{"type":"error","name":"DuplicateCommitSealSigner","inputs":[{"name":"signer","type":"address","internalType":"address"}]},{"type":"error","name":"DuplicateValidator","inputs":[{"name":"validator","type":"address","internalType":"address"}]},{"type":"error","name":"EmptyValidatorSet","inputs":[]},{"type":"error","name":"HeaderFromFuture","inputs":[{"name":"currentTimestamp","type":"uint256","internalType":"uint256"},{"name":"headerTimestamp","type":"uint256","internalType":"uint256"},{"name":"maxClockDrift","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"InsufficientTrustedValidatorOverlap","inputs":[{"name":"actual","type":"uint256","internalType":"uint256"},{"name":"required","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"InsufficientValidatorQuorum","inputs":[{"name":"actual","type":"uint256","internalType":"uint256"},{"name":"required","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"InvalidCommitSeal","inputs":[]},{"type":"error","name":"InvalidCommitmentValue","inputs":[{"name":"expectedValue","type":"bytes32","internalType":"bytes32"},{"name":"actualValue","type":"bytes32","internalType":"bytes32"}]},{"type":"error","name":"InvalidDifficulty","inputs":[{"name":"actualDifficulty","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"InvalidECDSASignatureLength","inputs":[{"name":"length","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"InvalidExtraDataFormat","inputs":[{"name":"itemsLength","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"InvalidHeaderFormat","inputs":[{"name":"itemsLength","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"InvalidHeaderHeight","inputs":[]},{"type":"error","name":"InvalidMixHash","inputs":[{"name":"actualMixHash","type":"bytes32","internalType":"bytes32"}]},{"type":"error","name":"InvalidNonce","inputs":[{"name":"actualNonce","type":"bytes","internalType":"bytes"}]},{"type":"error","name":"InvalidOmmersHash","inputs":[{"name":"actualOmmersHash","type":"bytes32","internalType":"bytes32"}]},{"type":"error","name":"InvalidPathLength","inputs":[{"name":"expectedLength","type":"uint256","internalType":"uint256"},{"name":"actualLength","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"InvalidRevisionNumber","inputs":[{"name":"providedRevisionNumber","type":"uint64","internalType":"uint64"}]},{"type":"error","name":"InvalidValidatorAddress","inputs":[{"name":"validator","type":"address","internalType":"address"}]},{"type":"error","name":"InvalidValidatorAddressLength","inputs":[{"name":"length","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"InvalidValueLength","inputs":[{"name":"expectedLength","type":"uint256","internalType":"uint256"},{"name":"actualLength","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"UnsupportedMisbehaviour","inputs":[]},{"type":"error","name":"ValueExists","inputs":[{"name":"actualValue","type":"bytes32","internalType":"bytes32"}]}],"bytecode":{"object":"0x6080604052346103c0576138e780380380610019816103c4565b928339810190610100818303126103c057610033816103e9565b61003f602083016103fd565b9061004c604084016103fd565b60608401516080850151909291906001600160401b0381116103c05785019286601f850112156103c0578351966001600160401b038811610376578760051b9460206100998188016103c4565b809a81520190602082978201019283116103c057602001905b8282106103a8575050506100c860a087016103fd565b956100e160e06100da60c084016103fd565b92016103e9565b956001600160401b03169081156103995788511561038a575f5b89518110156101b1576001600160a01b03610116828c610411565b51161561018a575f5b81811061012f57506001016100fb565b6001600160a01b03610141828d610411565b51166001600160a01b03610155848e610411565b5116146101645760010161011f565b6001600160a01b03610176838d610411565b511663107f863360e21b5f5260045260245ffd5b6001600160a01b039061019d908b610411565b51166359bff38760e01b5f5260045260245ffd5b5060408051979896978a979181016001600160401b03811182821017610376576040525f81526020810190848252604051926080840198848a1060018060401b038b1117610376576040998a526001600160a01b031680855260208086018490526001600160401b03928316868c01819052878416606090970196909652600180546001600160a01b031916909217825592516002805495516001600160801b031996871692851692909217918c1b6fffffffffffffffff000000000000000090811692909217815560038054909616909617968b1b16959095179092555f948552600490529590922080546001600160401b03191694861694909417845583019190915592519392019190831161037657680100000000000000008311610376578154838355808410610350575b50905f5260205f205f5b83811061033357846001600160a01b03811661031a575061030961052f565b505b60405161329590816105b28239f35b8061032761032d92610439565b506104af565b5061030b565b82516001600160a01b0316818301556020909201916001016102ea565b825f528360205f2091820191015b81811061036b57506102e0565b5f815560010161035e565b634e487b7160e01b5f52604160045260245ffd5b63339e1ffb60e01b5f5260045ffd5b6359d119e360e01b5f5260045ffd5b602080916103b5846103e9565b8152019101906100b2565b5f80fd5b6040519190601f01601f191682016001600160401b0381118382101761037657604052565b51906001600160a01b03821682036103c057565b51906001600160401b03821682036103c057565b80518210156104255760209160051b010190565b634e487b7160e01b5f52603260045260245ffd5b6001600160a01b0381165f9081525f5160206138c75f395f51905f52602052604090205460ff166104aa576001600160a01b03165f8181525f5160206138c75f395f51905f5260205260408120805460ff191660011790553391905f5160206138475f395f51905f528180a4600190565b505f90565b6001600160a01b0381165f9081525f5160206138675f395f51905f52602052604090205460ff166104aa576001600160a01b03165f8181525f5160206138675f395f51905f5260205260408120805460ff191660011790553391905f5160206138a75f395f51905f52905f5160206138475f395f51905f529080a4600190565b5f80525f5160206138675f395f51905f526020525f5160206138875f395f51905f525460ff166105ad575f8080525f5160206138675f395f51905f526020525f5160206138875f395f51905f52805460ff1916600117905533905f5160206138a75f395f51905f525f5160206138475f395f51905f528280a4600190565b5f9056fe60806040526004361015610011575f80fd5b5f3560e01c806301ffc9a7146100f45780630bece356146100ef578063248a9ca3146100ea5780632f2ff15d146100e557806336568abe146100e05780634d6d9ffb146100db5780635972185a146100d6578063682ed5f0146100d157806391d14854146100cc578063a217fddf146100c7578063d547741f146100c2578063ddba6537146100bd578063edce8bdc146100b85763ef913a4b146100b3575f80fd5b610a16565b61095e565b61088b565b61085c565b610842565b6107f4565b6105e6565b6105ac565b6103ac565b610350565b61031a565b6102b5565b610217565b34610195576020600319360112610195576004357fffffffff00000000000000000000000000000000000000000000000000000000811680910361019557807f7965db0b000000000000000000000000000000000000000000000000000000006020921490811561016b575b506040519015158152f35b7f01ffc9a7000000000000000000000000000000000000000000000000000000009150145f610160565b5f80fd5b9060206003198301126101955760043567ffffffffffffffff811161019557826023820112156101955780600401359267ffffffffffffffff84116101955760248483010111610195576024019190565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b346101955761028161022836610199565b5f80527f4c48d1d2b0f4f7485fc28e3db22341d96a20aa29e6efa8149da9751603abd4e06020527f6e0c24a6e293ff9b755263dbaa15ba3796b0b8d3fe17cfb4ddf8143b268eac475490919060ff161561029957610d9d565b6040516003821015610294576020918152f35b6101ea565b6102a1611287565b610d9d565b90816020910312610195573590565b346101955760206003193601126101955760206102df6004355f525f602052600160405f20015490565b604051908152f35b6003196040910112610195576004359060243573ffffffffffffffffffffffffffffffffffffffff811681036101955790565b346101955761034e61032b366102e7565b90610349610344825f525f602052600160405f20015490565b61130f565b612142565b005b346101955761035e366102e7565b3373ffffffffffffffffffffffffffffffffffffffff8216036103845761034e91612219565b7f6697b232000000000000000000000000000000000000000000000000000000005f5260045ffd5b346101955760206003193601126101955760043567ffffffffffffffff8111610195578060040160806003198336030112610195575f80527f4c48d1d2b0f4f7485fc28e3db22341d96a20aa29e6efa8149da9751603abd4e060205260ff7f6e0c24a6e293ff9b755263dbaa15ba3796b0b8d3fe17cfb4ddf8143b268eac4754161561059f575b61044761044260248401611192565b61137c565b60648201916001610458848461119c565b90500361056157906104a96104966104a261049d61049661049061048961048460446104e09a01611192565b611b30565b988761119c565b9061126e565b3691610b4d565b6122ee565b928061121d565b906001840154906040516104d7816104c960208201948560209181520190565b03601f198101835282610afd565b5190209161237c565b805161051f5761051b61050b6104fe845467ffffffffffffffff1690565b67ffffffffffffffff1690565b6040519081529081906020820190565b0390f35b61053361052e61055e926124c1565b6124ee565b7fd039601e000000000000000000000000000000000000000000000000000000005f52600452602490565b5ffd5b61055e61056e848461119c565b7f88b3170e000000000000000000000000000000000000000000000000000000005f52600160045260245250604490565b6105a7611287565b610433565b34610195575f6003193601126101955760206040517fbd893629a699470e4ec82a5715bb4981fdaacc5d0a728bf5f55b801d8f4ef10b8152f35b346101955760206003193601126101955760043567ffffffffffffffff8111610195578060040160a06003198336030112610195575f80527f4c48d1d2b0f4f7485fc28e3db22341d96a20aa29e6efa8149da9751603abd4e060205260ff7f6e0c24a6e293ff9b755263dbaa15ba3796b0b8d3fe17cfb4ddf8143b268eac475416156107e7575b61067c61044260248401611192565b6064820191600161068d848461119c565b90500361056157608481019060206106a5838561121d565b9050036107a957906106f46104966106ed6106e56106de61049d6104966104906106d761048460446107149c01611192565b9b8b61119c565b948761121d565b8101906102a6565b948061121d565b906001850154906040516104d7816104c960208201948560209181520190565b8051156107755761052e610727916124c1565b908082036107475761051b61050b6104fe855467ffffffffffffffff1690565b7f56ed1b63000000000000000000000000000000000000000000000000000000005f5260045260245260445ffd5b61055e827f56ed1b63000000000000000000000000000000000000000000000000000000005f52906044916004525f602452565b61055e6107b6838561121d565b7f24fadac8000000000000000000000000000000000000000000000000000000005f52602060045260245250604490565b6107ef611287565b61066d565b3461019557602060ff610836610809366102e7565b905f525f845260405f209073ffffffffffffffffffffffffffffffffffffffff165f5260205260405f2090565b54166040519015158152f35b34610195575f6003193601126101955760206040515f8152f35b346101955761034e61086d366102e7565b90610886610344825f525f602052600160405f20015490565b612219565b346101955761089936610199565b50505f80527f4c48d1d2b0f4f7485fc28e3db22341d96a20aa29e6efa8149da9751603abd4e06020527f6e0c24a6e293ff9b755263dbaa15ba3796b0b8d3fe17cfb4ddf8143b268eac475460ff1615610915575b7f2c1ed462000000000000000000000000000000000000000000000000000000005f5260045ffd5b61091d611287565b6108ed565b67ffffffffffffffff81160361019557565b601f19601f602060409481855280519182918282880152018686015e5f8582860101520116010190565b346101955760206003193601126101955761097e60043561048481610922565b67ffffffffffffffff8154166002600183015492019060405192608084019160208501526040840152606080840152815480915260a08301915f5260205f20905f5b8181106109ea5761051b856109de818703601f198101835282610afd565b60405191829182610934565b825473ffffffffffffffffffffffffffffffffffffffff168452602090930192600192830192016109c0565b34610195575f6003193601126101955761051b60405173ffffffffffffffffffffffffffffffffffffffff60015416602082015267ffffffffffffffff600254818116604084015260401c16606082015267ffffffffffffffff600354818116608084015260401c1660a082015260a081526109de60c082610afd565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b6060810190811067ffffffffffffffff821117610adc57604052565b610a93565b6040810190811067ffffffffffffffff821117610adc57604052565b90601f601f19910116810190811067ffffffffffffffff821117610adc57604052565b60405190610b2f604083610afd565b565b67ffffffffffffffff8111610adc57601f01601f191660200190565b929192610b5982610b31565b91610b676040519384610afd565b829481845281830111610195578281602093845f960137010152565b9080601f8301121561019557816020610b9e93359101610b4d565b90565b6020818303126101955780359067ffffffffffffffff8211610195570180820391608083126101955760405192610bd784610ac0565b823567ffffffffffffffff811161019557604091610bfa84601f19938701610b83565b8652011261019557604051610c0e81610ae1565b6020830135610c1c81610922565b81526040830135610c2c81610922565b60208201526020840152606082013567ffffffffffffffff811161019557610c549201610b83565b604082015290565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b9060018201809211610c9757565b610c5c565b60c001908160c011610c9757565b60f701908160f711610c9757565b6080019081608011610c9757565b60b701908160b711610c9757565b91908201809211610c9757565b908160011b9180830460021490151715610c9757565b81519167ffffffffffffffff8311610adc57680100000000000000008311610adc578154838355808410610d77575b506020610d389101915f5260205f2090565b5f5b838110610d475750505050565b6001906020610d6a855173ffffffffffffffffffffffffffffffffffffffff1690565b9401938184015501610d3a565b825f528360205f2091820191015b818110610d925750610d26565b5f8155600101610d85565b610da991810190610ba1565b9060208201610dc461044282515167ffffffffffffffff1690565b610dce8351611614565b92606084019367ffffffffffffffff610def865167ffffffffffffffff1690565b161561116a5760035491604083901c67ffffffffffffffff1693610e1d67ffffffffffffffff861642610cd4565b9460a0840195610e35875167ffffffffffffffff1690565b9067ffffffffffffffff82161161112b5750505160200151610e7290610e649067ffffffffffffffff16611b30565b9367ffffffffffffffff1690565b67ffffffffffffffff81168015159081611102575b506110ad575090610ef591610eb66002610eae610ea385611b87565b60e086015190611ca1565b950185611ea7565b610ec660c0830194855190611f49565b60406080610ee960015473ffffffffffffffffffffffffffffffffffffffff1690565b93015191015191611ffe565b610f22610f0a865167ffffffffffffffff1690565b67ffffffffffffffff165f52600460205260405f2090565b610f376104fe825467ffffffffffffffff1690565b61103b5750916002610fb5928694610fa8610f73610f64610f0a610fc39a9b5167ffffffffffffffff1690565b955167ffffffffffffffff1690565b859067ffffffffffffffff167fffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000825416179055565b6001840155519101610cf7565b5167ffffffffffffffff1690565b600254610fdc9060401c67ffffffffffffffff166104fe565b67ffffffffffffffff821611610ff157505f90565b611037907fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff6fffffffffffffffff00000000000000006002549260401b16911617600255565b5f90565b91611051611059945167ffffffffffffffff1690565b905192612074565b6110a75761055e611072835167ffffffffffffffff1690565b7fc1aea5f7000000000000000000000000000000000000000000000000000000005f5267ffffffffffffffff16600452602490565b60029150565b61055e906110c3855467ffffffffffffffff1690565b7feae35725000000000000000000000000000000000000000000000000000000005f5267ffffffffffffffff9081166004524260245216604452606490565b9050611123429161111e6104fe885467ffffffffffffffff1690565b610cd4565b11155f610e87565b7f9b772277000000000000000000000000000000000000000000000000000000005f524260045267ffffffffffffffff9081166024521660445260645ffd5b7f59d119e3000000000000000000000000000000000000000000000000000000005f5260045ffd5b35610b9e81610922565b9035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe181360301821215610195570180359067ffffffffffffffff821161019557602001918160051b3603831361019557565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b9035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe181360301821215610195570180359067ffffffffffffffff82116101955760200191813603831361019557565b9015611282578061127e9161121d565b9091565b6111f0565b335f9081527f4c48d1d2b0f4f7485fc28e3db22341d96a20aa29e6efa8149da9751603abd4e0602052604090205460ff16156112bf57565b7fe2517d3f000000000000000000000000000000000000000000000000000000005f52336004527fbd893629a699470e4ec82a5715bb4981fdaacc5d0a728bf5f55b801d8f4ef10b60245260445ffd5b805f525f60205260ff6113433360405f209073ffffffffffffffffffffffffffffffffffffffff165f5260205260405f2090565b54161561134d5750565b7fe2517d3f000000000000000000000000000000000000000000000000000000005f523360045260245260445ffd5b67ffffffffffffffff168061138e5750565b7f3ce598a9000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b60405190610100820182811067ffffffffffffffff821117610adc57604052606060e0838281528260208201528260408201525f838201525f60808201525f60a08201528260c08201520152565b8051600110156112825760400190565b805160071015611282576101000190565b8051600d1015611282576101c00190565b8051600e1015611282576101e00190565b805160081015611282576101200190565b8051600310156112825760800190565b8051600b1015611282576101800190565b8051600c1015611282576101a00190565b8051600410156112825760a00190565b8051156112825760200190565b8051600210156112825760600190565b805160101015611282576102200190565b80518210156112825760209160051b010190565b67ffffffffffffffff8111610adc5760051b60200190565b90611501826114df565b61150e6040519182610afd565b828152601f1961151e82946114df565b0190602036910137565b90602082519201517fffffffffffffffffffffffffffffffffffffffff00000000000000000000000081169260148110611560575050565b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000929350829060140360031b1b161690565b60405160a091906115a38382610afd565b6004815291601f1901825f5b8281106115bb57505050565b8060606020809385010152016115af565b906115d6826114df565b6115e36040519182610afd565b828152601f196115f382946114df565b01905f5b82811061160357505050565b8060606020809385010152016115f7565b61163061162b6116226113b9565b928084526124c1565b612530565b602082019080825251600f8110611b0557507f1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d493476116766116708351611407565b516125fb565b03611aca57600161169061168a8351611417565b516124ee565b03611a8f577f63746963616c2062797a616e74696e65206661756c7420746f6c6572616e63656116c36116708351611428565b03611a54576116db6116d58251611439565b51612617565b80516008811490811591611a24575b506119ea575061162b61175d6116d5836117216117106104fe61168a611762985161144a565b67ffffffffffffffff166060880152565b61172e611670825161145b565b60808701526117576117466104fe61168a845161146b565b67ffffffffffffffff1660a0880152565b5161147c565b6124c1565b90604081019180835251600581036119bf57506117886117828351611407565b51612530565b908151156119975761179a82516114f7565b9360c082019485525f5b8351811015611933576117ba6116d582866114cb565b80516014810361190857506117d16117d791611528565b60601c90565b73ffffffffffffffffffffffffffffffffffffffff811680156118c6575f5b8381106118325750509061182c600192611811838a516114cb565b9073ffffffffffffffffffffffffffffffffffffffff169052565b016117a4565b8161187761185e611844848d516114cb565b5173ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff1690565b14611884576001016117f6565b7f41fe18cc000000000000000000000000000000000000000000000000000000005f5273ffffffffffffffffffffffffffffffffffffffff831660045260245ffd5b7f59bff387000000000000000000000000000000000000000000000000000000005f5273ffffffffffffffffffffffffffffffffffffffff821660045260245ffd5b7f83e46ad2000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b509261178291945061194692505161148d565b61195081516115cc565b9260e081019384525f5b8251811015611991578061198a816119776116d5600195886114cb565b88519061198483836114cb565b526114cb565b500161195a565b50925050565b7f339e1ffb000000000000000000000000000000000000000000000000000000005f5260045ffd5b7f30c6792a000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b611a20906040519182917fd5edd2a500000000000000000000000000000000000000000000000000000000835260048301610934565b0390fd5b7f011b4d03dd8c01f1049143cf9c4c817e4b167f1d1b83e5c6f0f10d89ba1e7bce9150602083012014155f6116ea565b611a6461167061055e9251611428565b7fa19e609c000000000000000000000000000000000000000000000000000000005f52600452602490565b611a9f61168a61055e9251611417565b7ff71b722f000000000000000000000000000000000000000000000000000000005f52600452602490565b611ada61167061055e9251611407565b7fb8120dca000000000000000000000000000000000000000000000000000000005f52600452602490565b7fbc277732000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b67ffffffffffffffff1690815f52600460205260405f209167ffffffffffffffff83541615611b5c5750565b7ff761631b000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b6020611c26611b94611592565b611c0d611bab60408601611bb1611bab825161149d565b51612f9a565b611bba8561149d565b52611bc48461149d565b50611bd2611bab8251611407565b611bdb85611407565b52611be584611407565b50611bf3611bab82516114aa565b611bfc856114aa565b52611c06846114aa565b505161145b565b611c168261145b565b52611c208161145b565b506126ed565b910190611c348251516115cc565b905f5b83518051821015611c8a579080600192600c82145f14611c78575050611c5c8361279e565b611c6682866114cb565b52611c7181856114cb565b5001611c37565b611c8591611bab916114cb565b611c5c565b505050611c9791506126ed565b6020815191012090565b919091611cae83516114f7565b925f5b8151811015611e9457611cc481836114cb565b51805160418103611e69575080601b60ff611d13611d0d611ce7611d209661277d565b517fff000000000000000000000000000000000000000000000000000000000000001690565b60f81c90565b1610611e16575b84613048565b50611d2a81612818565b15801590611df8575b611dd05773ffffffffffffffffffffffffffffffffffffffff81165f5b838110611d7057505090611d6a60019261181183896114cb565b01611cb1565b81611d8161185e611844848c6114cb565b14611d8e57600101611d50565b7f33af0d5f000000000000000000000000000000000000000000000000000000005f5273ffffffffffffffffffffffffffffffffffffffff831660045260245ffd5b7f09cb44e6000000000000000000000000000000000000000000000000000000005f5260045ffd5b5073ffffffffffffffffffffffffffffffffffffffff811615611d33565b611e58611e30611e2b611d0d611ce78561277d565b612806565b60f81b7fff000000000000000000000000000000000000000000000000000000000000001690565b5f1a611e638261277d565b53611d1a565b7ff2db9ce1000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b505050565b5f198114610c975760010190565b905f915f5b8151811015611f0057611edf73ffffffffffffffffffffffffffffffffffffffff611ed783856114cb565b511684612822565b611eec575b600101611eac565b92611ef8600191611e99565b939050611ee4565b50506003611f0f915404610c89565b90818110611f1b575050565b7fe2dcb1b9000000000000000000000000000000000000000000000000000000005f5260045260245260445ffd5b905f915f5b8151811015611fa257611f8173ffffffffffffffffffffffffffffffffffffffff611f7983856114cb565b511684612879565b611f8e575b600101611f4e565b92611f9a600191611e99565b939050611f86565b5050518060011b9080820460021490151715610c97576003611fc49104610c89565b90818110611fd0575050565b7f7818f4e4000000000000000000000000000000000000000000000000000000005f5260045260245260445ffd5b6120489261162b9261175d926040517fffffffffffffffffffffffffffffffffffffffff000000000000000000000000602082019260601b168252601481526104d7603482610afd565b805160021015611282576060610b9e9101516125fb565b8054821015611282575f5260205f2001905f90565b919067ffffffffffffffff80612092855467ffffffffffffffff1690565b921691161490811591612133575b5061212d5760020190815481510361212d575f5b8151811015612125576120ea6120ca828561205f565b905473ffffffffffffffffffffffffffffffffffffffff9160031b1c1690565b73ffffffffffffffffffffffffffffffffffffffff61210f61185e61184485876114cb565b91160361211e576001016120b4565b5050505f90565b505050600190565b50505f90565b9050600182015414155f6120a0565b805f525f60205260ff6121768360405f209073ffffffffffffffffffffffffffffffffffffffff165f5260205260405f2090565b541661212d57805f525f6020526121ae8260405f209073ffffffffffffffffffffffffffffffffffffffff165f5260205260405f2090565b60017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0082541617905573ffffffffffffffffffffffffffffffffffffffff339216907f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d5f80a4600190565b805f525f60205260ff61224d8360405f209073ffffffffffffffffffffffffffffffffffffffff165f5260205260405f2090565b54161561212d57805f525f6020526122868260405f209073ffffffffffffffffffffffffffffffffffffffff165f5260205260405f2090565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00815416905573ffffffffffffffffffffffffffffffffffffffff339216907ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b5f80a4600190565b60208151910120604051602081019182527f1260944489272988d9df285149b5aa1b0f48f2136d6f416159f840a3e0747600604082015260408152612334606082610afd565b51902090565b60405190612349602083610afd565b5f808352366020840137565b9061235f82610b31565b61236c6040519182610afd565b828152601f1961151e8294610b31565b61162b6123be919493946123906020610b31565b9561239e6040519788610afd565b602087526123ac6020610b31565b601f19602089019101368237526124c1565b906123c98451610ce1565b9184511515806124a1575b6123dd906124e7565b6123ef6123ea5f85612940565b612355565b925f19015f5b818110612409575050610b9e939450612a70565b8061248b600f61244e612485611d0d611ce78d61242860029960011c90565b908d61247f8a6124778a61244e612445611d0d611ce78a8a61278d565b60041c600f1690565b1660f81b7fff000000000000000000000000000000000000000000000000000000000000001690565b5f1a9261278d565b5361278d565b60ff1690565b5f1a61249a600183018861278d565b53016123f5565b5060016123d4565b604051906124b682610ae1565b5f6020838281520152565b6124c96124a9565b506020815191604051926124dc84610ae1565b835201602082015290565b1561019557565b80518015159081612524575b50156101955761250990612d46565b90519060208110612518575090565b6020036101000a900490565b6021915011155f6124fa565b61253981612d72565b156101955761254781612d92565b612550816114df565b9161255e6040519384610afd565b818352601f1961256d836114df565b015f5b8181106125e4575050602061259091015161258a81612df3565b90610cd4565b5f905b8282106125a05750505090565b6125dc816125af600193612e5e565b906125b8610b20565b8281528160208201526125cb86896114cb565b526125d685886114cb565b50610cd4565b910190612593565b6020906125ef6124a9565b82828801015201612570565b6021815103610195576020015160018101809111610c97575190565b8051156101955761262a610b9e91612d46565b61263681939293612355565b928360200190612f27565b805191908290602001825e015f815290565b610b2f9061267561266f94936040519586936020850190612641565b90612641565b03601f198101845283610afd565b6001907fff00000000000000000000000000000000000000000000000000000000000000610b9e94931681520190612641565b916001610b9e94937fff0000000000000000000000000000000000000000000000000000000000000061266f941681520190612641565b5f9060605b815183101561271a5761271260019161270b85856114cb565b5190612653565b9201916126f2565b9150508051603881106127595750610b9e6127358251612fc6565b916104c9612749611e306124858651610caa565b91604051948593602085016126b6565b61276b611e30612485610b9e93610c9c565b6104c960405193849260208401612683565b8051604010156112825760600190565b908151811015611282570160200190565b6001815114806127eb575b610b9e578051603881106127d95750610b9e6127c58251612fc6565b916104c9612749611e306124858651610cc6565b61276b611e30612485610b9e93610cb8565b50608060ff6127ff611d0d611ce78561149d565b16106127a9565b60ff601b9116019060ff8211610c9757565b6004111561029457565b905f5b825481101561211e5773ffffffffffffffffffffffffffffffffffffffff61284d828561205f565b90549060031b1c1673ffffffffffffffffffffffffffffffffffffffff83161461212557600101612825565b905f5b825181101561211e5773ffffffffffffffffffffffffffffffffffffffff6128a482856114cb565b511673ffffffffffffffffffffffffffffffffffffffff8316146121255760010161287c565b905f198201918211610c9757565b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff408201918211610c9757565b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff808201918211610c9757565b6020039060208211610c9757565b91908203918211610c9757565b91906129598351610ce1565b908351151580612a66575b61296d906124e7565b61297a6123ea8284612940565b938192600180841614612a04575b5f19869101935b84811061299d575050505050565b836129fb60016129f1600f61244e612485611d0d611ce78b60029b6129ea6129dd8861244e8f611d0d611ce76129d66124459360011c90565b809961278d565b9b8d03809c5f1a9261278d565b538c61278d565b5f1a92018961278d565b5301859061298f565b92507f0f00000000000000000000000000000000000000000000000000000000000000612a43612485611d0d611ce7612a3d8760011c90565b8661278d565b60f81b165f1a612a528661149d565b535f19612a5e83611e99565b939050612988565b5081811115612964565b915f915f612a7c6124a9565b50845115612d0d5790935f915b81518310156101955782158080612cf7575b61019557159081612cda575b5061019557612ab961178283836114cb565b948551600281145f14612bb65750612adb612ad66116d58861149d565b6130dd565b95612af1612aea88888461314a565b8092610cd4565b965111612b985715612b285750612b0890516128ca565b11610195575111612b1f576116d5610b9e91611407565b50610b9e61233a565b919094612b3586516128ca565b82146101955780612b57612b53612b4d600194611407565b51612d72565b1590565b15612b7957612b68612b6e91611407565b516130cf565b915b01919490612a89565b612b85612b9291611407565b5160208101519051902090565b91612b70565b505091509250612ba99150516128ca565b1161019557610b9e61233a565b929491939192601103612c7b5781518314612c5d57612be7612be1612485611d0d611ce7878761278d565b93610c89565b92601081101561019557612c04612bfe82896114cb565b516130b9565b15612c265750505050612c19919250516128ca565b0361019557610b9e61233a565b86612c3e612b53612b4d84600196989a97999b6114cb565b15612c5057612b9291612b68916114cb565b612b9291612b85916114cb565b505050612c6a90516128ca565b03610195576116d5610b9e916114ba565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f696e76616c6964206e6f6465206c656e677468000000000000000000000000006044820152606490fd5b9050612cef612ce984846114cb565b51613082565b14155f612aa7565b50612d05612b8585856114cb565b871415612a9b565b509050612d3e92507f56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b4219150146124e7565b610b9e61233a565b906020820191612d568351612df3565b925190838201809211610c975751928303928311610c97579190565b805115612d8d57602060c0910151515f1a1061103757600190565b505f90565b805115612d8d575f9060208101908151612dab81612df3565b8101809111610c9757915190518101809111610c975791905b828110612dd15750905090565b612dda81612e5e565b8101809111610c9757612ded9091611e99565b90612dc4565b515f1a6080811015612e0457505f90565b60b881108015612e48575b15612e1a5750600190565b60c0811015612e3957610b9e90612e349060b75b90612940565b610c89565b610b9e90612e349060f7612e2e565b5060c08110158015612e0f575060f88110612e0f565b80515f1a906080821015612e73575050600190565b60b8821015612e895750612e34610b9e91612905565b60c0821015612eca5760010151602082900360b7016101000a9004017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff4a0190565b60f8821015612ee05750612e34610b9e916128d8565b60010151602082900360f7016101000a9004017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0a0190565b601f8111610c97576101000a90565b90918015611e94575b6020811015612f6a5780612f4357505050565b612f57612f52612f5c92612932565b612f18565b6128ca565b905182518216911916179052565b91908051825260208101809111610c97579060208101809111610c975791601f19810190811115612f3057610c5c565b612fa48151612355565b90815115612fc257806020610b9e9201519051908360200190612f27565b5090565b5f81805b6130345750612fd881612355565b91815b612fe457505090565b612fed826128ca565b61301f7fff000000000000000000000000000000000000000000000000000000000000008360f81b165f1a918561278d565b5360081c908015610c97575f19019081612fdb565b9061303e90611e99565b9060081c80612fca565b8151919060418303613078576130719250602082015190606060408401519301515f1a906131ee565b9192909190565b50505f9160029190565b8051602081101561309a575060208101519051902090565b9060200151206040516020810191825260208152612334604082610afd565b6001815103612d8d5760200151515f1a60801490565b6130d890612d46565b902090565b9081511561019557600f6130f9612445611d0d611ce78661149d565b168061310c5750610b9e60025f9361294d565b600181036131215750610b9e60015f9361294d565b600281036131375750610b9e600260019361294d565b60030361019557610b9e6001809361294d565b91905f5b838101808211610c975782518110806131e4575b156131dc576131927fff00000000000000000000000000000000000000000000000000000000000000918461278d565b51167fff000000000000000000000000000000000000000000000000000000000000006131bf838661278d565b511690036131d5576131d090611e99565b61314e565b9250505090565b509250505090565b5083518210613162565b91907f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0841161327d579160209360809260ff5f9560405194855216868401526040830152606082015282805260015afa15613272575f5173ffffffffffffffffffffffffffffffffffffffff81161561326857905f905f90565b505f906001905f90565b6040513d5f823e3d90fd5b5050505f916003919056fea164736f6c634300081c000a2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d4c48d1d2b0f4f7485fc28e3db22341d96a20aa29e6efa8149da9751603abd4e06e0c24a6e293ff9b755263dbaa15ba3796b0b8d3fe17cfb4ddf8143b268eac47bd893629a699470e4ec82a5715bb4981fdaacc5d0a728bf5f55b801d8f4ef10bad3228b676f7d3cd4284a5443f17f1962b36e491b30a40b2405849e597ba5fb5","sourceMap":"124:1474:34:-:0;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;124:1474:34;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;124:1474:34;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;:::i;:::-;;-1:-1:-1;;;;;124:1474:34;;2163:25:35;;2159:84;;124:1474:34;;13516:22:35;13512:79;;-1:-1:-1;13643:3:35;124:1474:34;;13620:21:35;;;;;-1:-1:-1;;;;;13666:13:35;;;;:::i;:::-;124:1474:34;;13666:27:35;13662:111;;-1:-1:-1;13806:5:35;;;;;;13643:3;124:1474:34;;13605:13:35;;13813:3;-1:-1:-1;;;;;13840:13:35;;;;:::i;:::-;124:1474:34;;-1:-1:-1;;;;;13857:13:35;124:1474:34;;13857:13:35;:::i;:::-;124:1474:34;;13840:30:35;13836:117;;124:1474:34;;13791:13:35;;13836:117;-1:-1:-1;;;;;13920:13:35;124:1474:34;;13920:13:35;:::i;:::-;124:1474:34;;13901:33:35;;;-1:-1:-1;13901:33:35;;124:1474:34;;-1:-1:-1;13901:33:35;13662:111;-1:-1:-1;;;;;124:1474:34;13744:13:35;;124:1474:34;13744:13:35;:::i;:::-;124:1474:34;;13720:38:35;;;-1:-1:-1;13720:38:35;;124:1474:34;;-1:-1:-1;13720:38:35;13620:21;-1:-1:-1;124:1474:34;;;13620:21:35;;;;;;;124:1474:34;;-1:-1:-1;;;;;124:1474:34;;;;;;;;;;-1:-1:-1;124:1474:34;;;2397:84:35;;124:1474:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;124:1474:34;;;;;2323:255:35;;;124:1474:34;;;-1:-1:-1;;;;;124:1474:34;;;2323:255:35;;;124:1474:34;;;;;;;2323:255:35;;;124:1474:34;;;;;;;-1:-1:-1;;;;;;124:1474:34;;;;;;;;;;;;;-1:-1:-1;;;;;;124:1474:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;124:1474:34;;;2629:15:35;124:1474:34;;;;;;;;-1:-1:-1;;;;;;124:1474:34;;;;;;;;;;2736:26:35;;124:1474:34;;;;;;;2800:25:35;;;124:1474:34;;;;;;;;;;;;;;;;;;;;13600:377:35;124:1474:34;;-1:-1:-1;124:1474:34;;-1:-1:-1;124:1474:34;-1:-1:-1;124:1474:34;;;;;;;-1:-1:-1;;;;;124:1474:34;;;;2908:44:35;;;:::i;:::-;;2863:233;124:1474:34;;;;;;;;;2863:233:35;2983:43;;3040:45;2983:43;;:::i;:::-;;3040:45;:::i;:::-;;2863:233;;124:1474:34;;;-1:-1:-1;;;;;124:1474:34;;;;;;;;;;;;;;;;-1:-1:-1;124:1474:34;;;-1:-1:-1;124:1474:34;;;;;;;;;;;;;;;;-1:-1:-1;124:1474:34;;;;;;;;;;-1:-1:-1;124:1474:34;;2629:15:35;124:1474:34;;-1:-1:-1;124:1474:34;13512:79:35;13561:19;;;-1:-1:-1;13561:19:35;;-1:-1:-1;13561:19:35;2159:84;2211:21;;;-1:-1:-1;2211:21:35;;-1:-1:-1;2211:21:35;124:1474:34;;;;;;;:::i;:::-;;;;;;;;;;-1:-1:-1;124:1474:34;;;;;;;;;-1:-1:-1;;124:1474:34;;;-1:-1:-1;;;;;124:1474:34;;;;;;;;;;:::o;:::-;;;-1:-1:-1;;;;;124:1474:34;;;;;;:::o;:::-;;;-1:-1:-1;;;;;124:1474:34;;;;;;:::o;:::-;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;6155:316:92;-1:-1:-1;;;;;124:1474:34;;2187:1:35;124:1474:34;;;-1:-1:-1;;;;;;;;;;;124:1474:34;;;;;;;;;;-1:-1:-1;;;;;124:1474:34;2187:1:35;124:1474:34;;;-1:-1:-1;;;;;;;;;;;124:1474:34;;;;;;;-1:-1:-1;;124:1474:34;;;;;735:10:120;;124:1474:34;-1:-1:-1;;;;;;;;;;;2187:1:35;;6346:40:92;6323:4;6400:11;:::o;6248:217::-;6442:12;2187:1:35;6442:12:92;:::o;6155:316::-;-1:-1:-1;;;;;124:1474:34;;;;;;-1:-1:-1;;;;;;;;;;;124:1474:34;;;;;;;;;;-1:-1:-1;;;;;124:1474:34;;;;;-1:-1:-1;;;;;;;;;;;124:1474:34;;;;;;;-1:-1:-1;;124:1474:34;;;;;735:10:120;;124:1474:34;-1:-1:-1;;;;;;;;;;;1318:33:35;-1:-1:-1;;;;;;;;;;;6346:40:92;124:1474:34;6346:40:92;6323:4;6400:11;:::o;6155:316::-;124:1474:34;;;-1:-1:-1;;;;;;;;;;;124:1474:34;;-1:-1:-1;;;;;;;;;;;124:1474:34;;;;;;;;;-1:-1:-1;;;;;;;;;;;124:1474:34;;-1:-1:-1;;;;;;;;;;;124:1474:34;;-1:-1:-1;;124:1474:34;6323:4:92;124:1474:34;;;735:10:120;;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;124:1474:34;;6346:40:92;6323:4;6400:11;:::o;6248:217::-;124:1474:34;6442:12:92;:::o","linkReferences":{}},"deployedBytecode":{"object":"0x60806040526004361015610011575f80fd5b5f3560e01c806301ffc9a7146100f45780630bece356146100ef578063248a9ca3146100ea5780632f2ff15d146100e557806336568abe146100e05780634d6d9ffb146100db5780635972185a146100d6578063682ed5f0146100d157806391d14854146100cc578063a217fddf146100c7578063d547741f146100c2578063ddba6537146100bd578063edce8bdc146100b85763ef913a4b146100b3575f80fd5b610a16565b61095e565b61088b565b61085c565b610842565b6107f4565b6105e6565b6105ac565b6103ac565b610350565b61031a565b6102b5565b610217565b34610195576020600319360112610195576004357fffffffff00000000000000000000000000000000000000000000000000000000811680910361019557807f7965db0b000000000000000000000000000000000000000000000000000000006020921490811561016b575b506040519015158152f35b7f01ffc9a7000000000000000000000000000000000000000000000000000000009150145f610160565b5f80fd5b9060206003198301126101955760043567ffffffffffffffff811161019557826023820112156101955780600401359267ffffffffffffffff84116101955760248483010111610195576024019190565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b346101955761028161022836610199565b5f80527f4c48d1d2b0f4f7485fc28e3db22341d96a20aa29e6efa8149da9751603abd4e06020527f6e0c24a6e293ff9b755263dbaa15ba3796b0b8d3fe17cfb4ddf8143b268eac475490919060ff161561029957610d9d565b6040516003821015610294576020918152f35b6101ea565b6102a1611287565b610d9d565b90816020910312610195573590565b346101955760206003193601126101955760206102df6004355f525f602052600160405f20015490565b604051908152f35b6003196040910112610195576004359060243573ffffffffffffffffffffffffffffffffffffffff811681036101955790565b346101955761034e61032b366102e7565b90610349610344825f525f602052600160405f20015490565b61130f565b612142565b005b346101955761035e366102e7565b3373ffffffffffffffffffffffffffffffffffffffff8216036103845761034e91612219565b7f6697b232000000000000000000000000000000000000000000000000000000005f5260045ffd5b346101955760206003193601126101955760043567ffffffffffffffff8111610195578060040160806003198336030112610195575f80527f4c48d1d2b0f4f7485fc28e3db22341d96a20aa29e6efa8149da9751603abd4e060205260ff7f6e0c24a6e293ff9b755263dbaa15ba3796b0b8d3fe17cfb4ddf8143b268eac4754161561059f575b61044761044260248401611192565b61137c565b60648201916001610458848461119c565b90500361056157906104a96104966104a261049d61049661049061048961048460446104e09a01611192565b611b30565b988761119c565b9061126e565b3691610b4d565b6122ee565b928061121d565b906001840154906040516104d7816104c960208201948560209181520190565b03601f198101835282610afd565b5190209161237c565b805161051f5761051b61050b6104fe845467ffffffffffffffff1690565b67ffffffffffffffff1690565b6040519081529081906020820190565b0390f35b61053361052e61055e926124c1565b6124ee565b7fd039601e000000000000000000000000000000000000000000000000000000005f52600452602490565b5ffd5b61055e61056e848461119c565b7f88b3170e000000000000000000000000000000000000000000000000000000005f52600160045260245250604490565b6105a7611287565b610433565b34610195575f6003193601126101955760206040517fbd893629a699470e4ec82a5715bb4981fdaacc5d0a728bf5f55b801d8f4ef10b8152f35b346101955760206003193601126101955760043567ffffffffffffffff8111610195578060040160a06003198336030112610195575f80527f4c48d1d2b0f4f7485fc28e3db22341d96a20aa29e6efa8149da9751603abd4e060205260ff7f6e0c24a6e293ff9b755263dbaa15ba3796b0b8d3fe17cfb4ddf8143b268eac475416156107e7575b61067c61044260248401611192565b6064820191600161068d848461119c565b90500361056157608481019060206106a5838561121d565b9050036107a957906106f46104966106ed6106e56106de61049d6104966104906106d761048460446107149c01611192565b9b8b61119c565b948761121d565b8101906102a6565b948061121d565b906001850154906040516104d7816104c960208201948560209181520190565b8051156107755761052e610727916124c1565b908082036107475761051b61050b6104fe855467ffffffffffffffff1690565b7f56ed1b63000000000000000000000000000000000000000000000000000000005f5260045260245260445ffd5b61055e827f56ed1b63000000000000000000000000000000000000000000000000000000005f52906044916004525f602452565b61055e6107b6838561121d565b7f24fadac8000000000000000000000000000000000000000000000000000000005f52602060045260245250604490565b6107ef611287565b61066d565b3461019557602060ff610836610809366102e7565b905f525f845260405f209073ffffffffffffffffffffffffffffffffffffffff165f5260205260405f2090565b54166040519015158152f35b34610195575f6003193601126101955760206040515f8152f35b346101955761034e61086d366102e7565b90610886610344825f525f602052600160405f20015490565b612219565b346101955761089936610199565b50505f80527f4c48d1d2b0f4f7485fc28e3db22341d96a20aa29e6efa8149da9751603abd4e06020527f6e0c24a6e293ff9b755263dbaa15ba3796b0b8d3fe17cfb4ddf8143b268eac475460ff1615610915575b7f2c1ed462000000000000000000000000000000000000000000000000000000005f5260045ffd5b61091d611287565b6108ed565b67ffffffffffffffff81160361019557565b601f19601f602060409481855280519182918282880152018686015e5f8582860101520116010190565b346101955760206003193601126101955761097e60043561048481610922565b67ffffffffffffffff8154166002600183015492019060405192608084019160208501526040840152606080840152815480915260a08301915f5260205f20905f5b8181106109ea5761051b856109de818703601f198101835282610afd565b60405191829182610934565b825473ffffffffffffffffffffffffffffffffffffffff168452602090930192600192830192016109c0565b34610195575f6003193601126101955761051b60405173ffffffffffffffffffffffffffffffffffffffff60015416602082015267ffffffffffffffff600254818116604084015260401c16606082015267ffffffffffffffff600354818116608084015260401c1660a082015260a081526109de60c082610afd565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b6060810190811067ffffffffffffffff821117610adc57604052565b610a93565b6040810190811067ffffffffffffffff821117610adc57604052565b90601f601f19910116810190811067ffffffffffffffff821117610adc57604052565b60405190610b2f604083610afd565b565b67ffffffffffffffff8111610adc57601f01601f191660200190565b929192610b5982610b31565b91610b676040519384610afd565b829481845281830111610195578281602093845f960137010152565b9080601f8301121561019557816020610b9e93359101610b4d565b90565b6020818303126101955780359067ffffffffffffffff8211610195570180820391608083126101955760405192610bd784610ac0565b823567ffffffffffffffff811161019557604091610bfa84601f19938701610b83565b8652011261019557604051610c0e81610ae1565b6020830135610c1c81610922565b81526040830135610c2c81610922565b60208201526020840152606082013567ffffffffffffffff811161019557610c549201610b83565b604082015290565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b9060018201809211610c9757565b610c5c565b60c001908160c011610c9757565b60f701908160f711610c9757565b6080019081608011610c9757565b60b701908160b711610c9757565b91908201809211610c9757565b908160011b9180830460021490151715610c9757565b81519167ffffffffffffffff8311610adc57680100000000000000008311610adc578154838355808410610d77575b506020610d389101915f5260205f2090565b5f5b838110610d475750505050565b6001906020610d6a855173ffffffffffffffffffffffffffffffffffffffff1690565b9401938184015501610d3a565b825f528360205f2091820191015b818110610d925750610d26565b5f8155600101610d85565b610da991810190610ba1565b9060208201610dc461044282515167ffffffffffffffff1690565b610dce8351611614565b92606084019367ffffffffffffffff610def865167ffffffffffffffff1690565b161561116a5760035491604083901c67ffffffffffffffff1693610e1d67ffffffffffffffff861642610cd4565b9460a0840195610e35875167ffffffffffffffff1690565b9067ffffffffffffffff82161161112b5750505160200151610e7290610e649067ffffffffffffffff16611b30565b9367ffffffffffffffff1690565b67ffffffffffffffff81168015159081611102575b506110ad575090610ef591610eb66002610eae610ea385611b87565b60e086015190611ca1565b950185611ea7565b610ec660c0830194855190611f49565b60406080610ee960015473ffffffffffffffffffffffffffffffffffffffff1690565b93015191015191611ffe565b610f22610f0a865167ffffffffffffffff1690565b67ffffffffffffffff165f52600460205260405f2090565b610f376104fe825467ffffffffffffffff1690565b61103b5750916002610fb5928694610fa8610f73610f64610f0a610fc39a9b5167ffffffffffffffff1690565b955167ffffffffffffffff1690565b859067ffffffffffffffff167fffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000825416179055565b6001840155519101610cf7565b5167ffffffffffffffff1690565b600254610fdc9060401c67ffffffffffffffff166104fe565b67ffffffffffffffff821611610ff157505f90565b611037907fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff6fffffffffffffffff00000000000000006002549260401b16911617600255565b5f90565b91611051611059945167ffffffffffffffff1690565b905192612074565b6110a75761055e611072835167ffffffffffffffff1690565b7fc1aea5f7000000000000000000000000000000000000000000000000000000005f5267ffffffffffffffff16600452602490565b60029150565b61055e906110c3855467ffffffffffffffff1690565b7feae35725000000000000000000000000000000000000000000000000000000005f5267ffffffffffffffff9081166004524260245216604452606490565b9050611123429161111e6104fe885467ffffffffffffffff1690565b610cd4565b11155f610e87565b7f9b772277000000000000000000000000000000000000000000000000000000005f524260045267ffffffffffffffff9081166024521660445260645ffd5b7f59d119e3000000000000000000000000000000000000000000000000000000005f5260045ffd5b35610b9e81610922565b9035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe181360301821215610195570180359067ffffffffffffffff821161019557602001918160051b3603831361019557565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b9035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe181360301821215610195570180359067ffffffffffffffff82116101955760200191813603831361019557565b9015611282578061127e9161121d565b9091565b6111f0565b335f9081527f4c48d1d2b0f4f7485fc28e3db22341d96a20aa29e6efa8149da9751603abd4e0602052604090205460ff16156112bf57565b7fe2517d3f000000000000000000000000000000000000000000000000000000005f52336004527fbd893629a699470e4ec82a5715bb4981fdaacc5d0a728bf5f55b801d8f4ef10b60245260445ffd5b805f525f60205260ff6113433360405f209073ffffffffffffffffffffffffffffffffffffffff165f5260205260405f2090565b54161561134d5750565b7fe2517d3f000000000000000000000000000000000000000000000000000000005f523360045260245260445ffd5b67ffffffffffffffff168061138e5750565b7f3ce598a9000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b60405190610100820182811067ffffffffffffffff821117610adc57604052606060e0838281528260208201528260408201525f838201525f60808201525f60a08201528260c08201520152565b8051600110156112825760400190565b805160071015611282576101000190565b8051600d1015611282576101c00190565b8051600e1015611282576101e00190565b805160081015611282576101200190565b8051600310156112825760800190565b8051600b1015611282576101800190565b8051600c1015611282576101a00190565b8051600410156112825760a00190565b8051156112825760200190565b8051600210156112825760600190565b805160101015611282576102200190565b80518210156112825760209160051b010190565b67ffffffffffffffff8111610adc5760051b60200190565b90611501826114df565b61150e6040519182610afd565b828152601f1961151e82946114df565b0190602036910137565b90602082519201517fffffffffffffffffffffffffffffffffffffffff00000000000000000000000081169260148110611560575050565b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000929350829060140360031b1b161690565b60405160a091906115a38382610afd565b6004815291601f1901825f5b8281106115bb57505050565b8060606020809385010152016115af565b906115d6826114df565b6115e36040519182610afd565b828152601f196115f382946114df565b01905f5b82811061160357505050565b8060606020809385010152016115f7565b61163061162b6116226113b9565b928084526124c1565b612530565b602082019080825251600f8110611b0557507f1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d493476116766116708351611407565b516125fb565b03611aca57600161169061168a8351611417565b516124ee565b03611a8f577f63746963616c2062797a616e74696e65206661756c7420746f6c6572616e63656116c36116708351611428565b03611a54576116db6116d58251611439565b51612617565b80516008811490811591611a24575b506119ea575061162b61175d6116d5836117216117106104fe61168a611762985161144a565b67ffffffffffffffff166060880152565b61172e611670825161145b565b60808701526117576117466104fe61168a845161146b565b67ffffffffffffffff1660a0880152565b5161147c565b6124c1565b90604081019180835251600581036119bf57506117886117828351611407565b51612530565b908151156119975761179a82516114f7565b9360c082019485525f5b8351811015611933576117ba6116d582866114cb565b80516014810361190857506117d16117d791611528565b60601c90565b73ffffffffffffffffffffffffffffffffffffffff811680156118c6575f5b8381106118325750509061182c600192611811838a516114cb565b9073ffffffffffffffffffffffffffffffffffffffff169052565b016117a4565b8161187761185e611844848d516114cb565b5173ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff1690565b14611884576001016117f6565b7f41fe18cc000000000000000000000000000000000000000000000000000000005f5273ffffffffffffffffffffffffffffffffffffffff831660045260245ffd5b7f59bff387000000000000000000000000000000000000000000000000000000005f5273ffffffffffffffffffffffffffffffffffffffff821660045260245ffd5b7f83e46ad2000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b509261178291945061194692505161148d565b61195081516115cc565b9260e081019384525f5b8251811015611991578061198a816119776116d5600195886114cb565b88519061198483836114cb565b526114cb565b500161195a565b50925050565b7f339e1ffb000000000000000000000000000000000000000000000000000000005f5260045ffd5b7f30c6792a000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b611a20906040519182917fd5edd2a500000000000000000000000000000000000000000000000000000000835260048301610934565b0390fd5b7f011b4d03dd8c01f1049143cf9c4c817e4b167f1d1b83e5c6f0f10d89ba1e7bce9150602083012014155f6116ea565b611a6461167061055e9251611428565b7fa19e609c000000000000000000000000000000000000000000000000000000005f52600452602490565b611a9f61168a61055e9251611417565b7ff71b722f000000000000000000000000000000000000000000000000000000005f52600452602490565b611ada61167061055e9251611407565b7fb8120dca000000000000000000000000000000000000000000000000000000005f52600452602490565b7fbc277732000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b67ffffffffffffffff1690815f52600460205260405f209167ffffffffffffffff83541615611b5c5750565b7ff761631b000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b6020611c26611b94611592565b611c0d611bab60408601611bb1611bab825161149d565b51612f9a565b611bba8561149d565b52611bc48461149d565b50611bd2611bab8251611407565b611bdb85611407565b52611be584611407565b50611bf3611bab82516114aa565b611bfc856114aa565b52611c06846114aa565b505161145b565b611c168261145b565b52611c208161145b565b506126ed565b910190611c348251516115cc565b905f5b83518051821015611c8a579080600192600c82145f14611c78575050611c5c8361279e565b611c6682866114cb565b52611c7181856114cb565b5001611c37565b611c8591611bab916114cb565b611c5c565b505050611c9791506126ed565b6020815191012090565b919091611cae83516114f7565b925f5b8151811015611e9457611cc481836114cb565b51805160418103611e69575080601b60ff611d13611d0d611ce7611d209661277d565b517fff000000000000000000000000000000000000000000000000000000000000001690565b60f81c90565b1610611e16575b84613048565b50611d2a81612818565b15801590611df8575b611dd05773ffffffffffffffffffffffffffffffffffffffff81165f5b838110611d7057505090611d6a60019261181183896114cb565b01611cb1565b81611d8161185e611844848c6114cb565b14611d8e57600101611d50565b7f33af0d5f000000000000000000000000000000000000000000000000000000005f5273ffffffffffffffffffffffffffffffffffffffff831660045260245ffd5b7f09cb44e6000000000000000000000000000000000000000000000000000000005f5260045ffd5b5073ffffffffffffffffffffffffffffffffffffffff811615611d33565b611e58611e30611e2b611d0d611ce78561277d565b612806565b60f81b7fff000000000000000000000000000000000000000000000000000000000000001690565b5f1a611e638261277d565b53611d1a565b7ff2db9ce1000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b505050565b5f198114610c975760010190565b905f915f5b8151811015611f0057611edf73ffffffffffffffffffffffffffffffffffffffff611ed783856114cb565b511684612822565b611eec575b600101611eac565b92611ef8600191611e99565b939050611ee4565b50506003611f0f915404610c89565b90818110611f1b575050565b7fe2dcb1b9000000000000000000000000000000000000000000000000000000005f5260045260245260445ffd5b905f915f5b8151811015611fa257611f8173ffffffffffffffffffffffffffffffffffffffff611f7983856114cb565b511684612879565b611f8e575b600101611f4e565b92611f9a600191611e99565b939050611f86565b5050518060011b9080820460021490151715610c97576003611fc49104610c89565b90818110611fd0575050565b7f7818f4e4000000000000000000000000000000000000000000000000000000005f5260045260245260445ffd5b6120489261162b9261175d926040517fffffffffffffffffffffffffffffffffffffffff000000000000000000000000602082019260601b168252601481526104d7603482610afd565b805160021015611282576060610b9e9101516125fb565b8054821015611282575f5260205f2001905f90565b919067ffffffffffffffff80612092855467ffffffffffffffff1690565b921691161490811591612133575b5061212d5760020190815481510361212d575f5b8151811015612125576120ea6120ca828561205f565b905473ffffffffffffffffffffffffffffffffffffffff9160031b1c1690565b73ffffffffffffffffffffffffffffffffffffffff61210f61185e61184485876114cb565b91160361211e576001016120b4565b5050505f90565b505050600190565b50505f90565b9050600182015414155f6120a0565b805f525f60205260ff6121768360405f209073ffffffffffffffffffffffffffffffffffffffff165f5260205260405f2090565b541661212d57805f525f6020526121ae8260405f209073ffffffffffffffffffffffffffffffffffffffff165f5260205260405f2090565b60017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0082541617905573ffffffffffffffffffffffffffffffffffffffff339216907f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d5f80a4600190565b805f525f60205260ff61224d8360405f209073ffffffffffffffffffffffffffffffffffffffff165f5260205260405f2090565b54161561212d57805f525f6020526122868260405f209073ffffffffffffffffffffffffffffffffffffffff165f5260205260405f2090565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00815416905573ffffffffffffffffffffffffffffffffffffffff339216907ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b5f80a4600190565b60208151910120604051602081019182527f1260944489272988d9df285149b5aa1b0f48f2136d6f416159f840a3e0747600604082015260408152612334606082610afd565b51902090565b60405190612349602083610afd565b5f808352366020840137565b9061235f82610b31565b61236c6040519182610afd565b828152601f1961151e8294610b31565b61162b6123be919493946123906020610b31565b9561239e6040519788610afd565b602087526123ac6020610b31565b601f19602089019101368237526124c1565b906123c98451610ce1565b9184511515806124a1575b6123dd906124e7565b6123ef6123ea5f85612940565b612355565b925f19015f5b818110612409575050610b9e939450612a70565b8061248b600f61244e612485611d0d611ce78d61242860029960011c90565b908d61247f8a6124778a61244e612445611d0d611ce78a8a61278d565b60041c600f1690565b1660f81b7fff000000000000000000000000000000000000000000000000000000000000001690565b5f1a9261278d565b5361278d565b60ff1690565b5f1a61249a600183018861278d565b53016123f5565b5060016123d4565b604051906124b682610ae1565b5f6020838281520152565b6124c96124a9565b506020815191604051926124dc84610ae1565b835201602082015290565b1561019557565b80518015159081612524575b50156101955761250990612d46565b90519060208110612518575090565b6020036101000a900490565b6021915011155f6124fa565b61253981612d72565b156101955761254781612d92565b612550816114df565b9161255e6040519384610afd565b818352601f1961256d836114df565b015f5b8181106125e4575050602061259091015161258a81612df3565b90610cd4565b5f905b8282106125a05750505090565b6125dc816125af600193612e5e565b906125b8610b20565b8281528160208201526125cb86896114cb565b526125d685886114cb565b50610cd4565b910190612593565b6020906125ef6124a9565b82828801015201612570565b6021815103610195576020015160018101809111610c97575190565b8051156101955761262a610b9e91612d46565b61263681939293612355565b928360200190612f27565b805191908290602001825e015f815290565b610b2f9061267561266f94936040519586936020850190612641565b90612641565b03601f198101845283610afd565b6001907fff00000000000000000000000000000000000000000000000000000000000000610b9e94931681520190612641565b916001610b9e94937fff0000000000000000000000000000000000000000000000000000000000000061266f941681520190612641565b5f9060605b815183101561271a5761271260019161270b85856114cb565b5190612653565b9201916126f2565b9150508051603881106127595750610b9e6127358251612fc6565b916104c9612749611e306124858651610caa565b91604051948593602085016126b6565b61276b611e30612485610b9e93610c9c565b6104c960405193849260208401612683565b8051604010156112825760600190565b908151811015611282570160200190565b6001815114806127eb575b610b9e578051603881106127d95750610b9e6127c58251612fc6565b916104c9612749611e306124858651610cc6565b61276b611e30612485610b9e93610cb8565b50608060ff6127ff611d0d611ce78561149d565b16106127a9565b60ff601b9116019060ff8211610c9757565b6004111561029457565b905f5b825481101561211e5773ffffffffffffffffffffffffffffffffffffffff61284d828561205f565b90549060031b1c1673ffffffffffffffffffffffffffffffffffffffff83161461212557600101612825565b905f5b825181101561211e5773ffffffffffffffffffffffffffffffffffffffff6128a482856114cb565b511673ffffffffffffffffffffffffffffffffffffffff8316146121255760010161287c565b905f198201918211610c9757565b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff408201918211610c9757565b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff808201918211610c9757565b6020039060208211610c9757565b91908203918211610c9757565b91906129598351610ce1565b908351151580612a66575b61296d906124e7565b61297a6123ea8284612940565b938192600180841614612a04575b5f19869101935b84811061299d575050505050565b836129fb60016129f1600f61244e612485611d0d611ce78b60029b6129ea6129dd8861244e8f611d0d611ce76129d66124459360011c90565b809961278d565b9b8d03809c5f1a9261278d565b538c61278d565b5f1a92018961278d565b5301859061298f565b92507f0f00000000000000000000000000000000000000000000000000000000000000612a43612485611d0d611ce7612a3d8760011c90565b8661278d565b60f81b165f1a612a528661149d565b535f19612a5e83611e99565b939050612988565b5081811115612964565b915f915f612a7c6124a9565b50845115612d0d5790935f915b81518310156101955782158080612cf7575b61019557159081612cda575b5061019557612ab961178283836114cb565b948551600281145f14612bb65750612adb612ad66116d58861149d565b6130dd565b95612af1612aea88888461314a565b8092610cd4565b965111612b985715612b285750612b0890516128ca565b11610195575111612b1f576116d5610b9e91611407565b50610b9e61233a565b919094612b3586516128ca565b82146101955780612b57612b53612b4d600194611407565b51612d72565b1590565b15612b7957612b68612b6e91611407565b516130cf565b915b01919490612a89565b612b85612b9291611407565b5160208101519051902090565b91612b70565b505091509250612ba99150516128ca565b1161019557610b9e61233a565b929491939192601103612c7b5781518314612c5d57612be7612be1612485611d0d611ce7878761278d565b93610c89565b92601081101561019557612c04612bfe82896114cb565b516130b9565b15612c265750505050612c19919250516128ca565b0361019557610b9e61233a565b86612c3e612b53612b4d84600196989a97999b6114cb565b15612c5057612b9291612b68916114cb565b612b9291612b85916114cb565b505050612c6a90516128ca565b03610195576116d5610b9e916114ba565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f696e76616c6964206e6f6465206c656e677468000000000000000000000000006044820152606490fd5b9050612cef612ce984846114cb565b51613082565b14155f612aa7565b50612d05612b8585856114cb565b871415612a9b565b509050612d3e92507f56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b4219150146124e7565b610b9e61233a565b906020820191612d568351612df3565b925190838201809211610c975751928303928311610c97579190565b805115612d8d57602060c0910151515f1a1061103757600190565b505f90565b805115612d8d575f9060208101908151612dab81612df3565b8101809111610c9757915190518101809111610c975791905b828110612dd15750905090565b612dda81612e5e565b8101809111610c9757612ded9091611e99565b90612dc4565b515f1a6080811015612e0457505f90565b60b881108015612e48575b15612e1a5750600190565b60c0811015612e3957610b9e90612e349060b75b90612940565b610c89565b610b9e90612e349060f7612e2e565b5060c08110158015612e0f575060f88110612e0f565b80515f1a906080821015612e73575050600190565b60b8821015612e895750612e34610b9e91612905565b60c0821015612eca5760010151602082900360b7016101000a9004017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff4a0190565b60f8821015612ee05750612e34610b9e916128d8565b60010151602082900360f7016101000a9004017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0a0190565b601f8111610c97576101000a90565b90918015611e94575b6020811015612f6a5780612f4357505050565b612f57612f52612f5c92612932565b612f18565b6128ca565b905182518216911916179052565b91908051825260208101809111610c97579060208101809111610c975791601f19810190811115612f3057610c5c565b612fa48151612355565b90815115612fc257806020610b9e9201519051908360200190612f27565b5090565b5f81805b6130345750612fd881612355565b91815b612fe457505090565b612fed826128ca565b61301f7fff000000000000000000000000000000000000000000000000000000000000008360f81b165f1a918561278d565b5360081c908015610c97575f19019081612fdb565b9061303e90611e99565b9060081c80612fca565b8151919060418303613078576130719250602082015190606060408401519301515f1a906131ee565b9192909190565b50505f9160029190565b8051602081101561309a575060208101519051902090565b9060200151206040516020810191825260208152612334604082610afd565b6001815103612d8d5760200151515f1a60801490565b6130d890612d46565b902090565b9081511561019557600f6130f9612445611d0d611ce78661149d565b168061310c5750610b9e60025f9361294d565b600181036131215750610b9e60015f9361294d565b600281036131375750610b9e600260019361294d565b60030361019557610b9e6001809361294d565b91905f5b838101808211610c975782518110806131e4575b156131dc576131927fff00000000000000000000000000000000000000000000000000000000000000918461278d565b51167fff000000000000000000000000000000000000000000000000000000000000006131bf838661278d565b511690036131d5576131d090611e99565b61314e565b9250505090565b509250505090565b5083518210613162565b91907f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0841161327d579160209360809260ff5f9560405194855216868401526040830152606082015282805260015afa15613272575f5173ffffffffffffffffffffffffffffffffffffffff81161561326857905f905f90565b505f906001905f90565b6040513d5f823e3d90fd5b5050505f916003919056fea164736f6c634300081c000a","sourceMap":"124:1474:34:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;;;;-1:-1:-1;;124:1474:34;;;;;;;;;;;;;;;2649:47:92;2664:32;124:1474:34;2649:47:92;;:87;;;;;124:1474:34;;;;;;;;;;2649:87:92;844:25:130;829:40;;;2649:87:92;;;124:1474:34;-1:-1:-1;124:1474:34;;;;;-1:-1:-1;;124:1474:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;3516:2265:35;124:1474:34;;;:::i;:::-;-1:-1:-1;124:1474:34;;;;;;;;;;;;17324:42:35;17320:105;;3516:2265;:::i;:::-;124:1474:34;;;;;;;;;;;;;;;:::i;17320:105:35:-;17393:20;;:::i;:::-;3516:2265;:::i;124:1474:34:-;;;;;;;;;;;:::o;:::-;;;;;-1:-1:-1;;124:1474:34;;;;;;;;;3877:6:92;124:1474:34;3877:6:92;124:1474:34;;3877:22:92;124:1474:34;3877:6:92;124:1474:34;3877:22:92;124:1474:34;3786:120:92;;124:1474:34;;;;;;;;-1:-1:-1;;124:1474:34;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;4306:25:92;124:1474:34;;;:::i;:::-;4276:18:92;2484:4;4276:18;;3877:6;124:1474:34;3877:6:92;124:1474:34;;3877:22:92;124:1474:34;3877:6:92;124:1474:34;3877:22:92;124:1474:34;3786:120:92;;4276:18;2484:4;:::i;:::-;4306:25;:::i;:::-;124:1474:34;;;;;;;;:::i;:::-;735:10:120;124:1474:34;;;5397:34:92;5393:102;;5505:37;;;:::i;5393:102::-;5454:30;;;124:1474:34;5454:30:92;;124:1474:34;;;;;-1:-1:-1;;124:1474:34;;;;;;;;;;;;;;;;-1:-1:-1;;124:1474:34;;;;;;;-1:-1:-1;124:1474:34;;;;;;;;;17324:42:35;17320:105;;124:1474:34;7178:31:35;;:16;;;:31;:::i;:::-;;:::i;:::-;7224:9;;;;7244:1;7224:9;;;;:::i;:::-;:21;;;7220:97;;7386:31;124:1474:34;7532:10:35;7450:36;124:1474:34;7473:12:35;:9;7367:51;7386:31;;7532:95;7386:31;;;:::i;:::-;7367:51;:::i;:::-;7473:9;;;:::i;:::-;:12;;:::i;:::-;124:1474:34;;;:::i;:::-;7450:36:35;:::i;:::-;7532:10;;;:::i;124:1474:34:-;7558:26:35;7244:1;7558:26;;124:1474:34;;;;7596:29:35;;;124:1474:34;7596:29:35;;;;124:1474:34;;;;;;;7596:29:35;;-1:-1:-1;;7596:29:35;;;;;;:::i;:::-;124:1474:34;7586:40:35;;7532:95;;:::i;:::-;124:1474:34;;7637:109:35;;124:1474:34;7755:31:35;124:1474:34;;;;;;;;;;;;7755:31:35;124:1474:34;;;;;;;;;;;;;;;;;7637:109:35;7704:29;:20;7684:51;7704:20;;:::i;:::-;:29;:::i;:::-;7684:51;-1:-1:-1;7684:51:35;124:1474:34;;;;;7684:51:35;-1:-1:-1;7684:51:35;7220:97;7268:38;7289:9;;;;:::i;:::-;7268:38;-1:-1:-1;7268:38:35;7244:1;124:1474:34;;;;-1:-1:-1;124:1474:34;;;17320:105:35;17393:20;;:::i;:::-;17320:105;;124:1474:34;;;;;-1:-1:-1;;124:1474:34;;;;;;;;1318:33:35;124:1474:34;;;;;;;;-1:-1:-1;;124:1474:34;;;;;;;;;;;;;;;;-1:-1:-1;;124:1474:34;;;;;;;-1:-1:-1;124:1474:34;;;;;;;;;17324:42:35;17320:105;;124:1474:34;5983:31:35;;:16;;;:31;:::i;:::-;6029:9;;;;6049:1;6029:9;;;;:::i;:::-;:21;;;6025:97;;6135:10;;;;124:1474:34;6135:10:35;;;;:::i;:::-;:23;;;6131:102;;6302:31;124:1474:34;6515:10:35;6436:33;6447:10;6366:36;124:1474:34;6389:12:35;:9;6283:51;6302:31;;6515:95;6302:31;;;:::i;6283:51::-;6389:9;;;:::i;6366:36::-;6447:10;;;:::i;:::-;6436:33;;;;:::i;:::-;6515:10;;;:::i;124:1474:34:-;6541:26:35;6049:1;6541:26;;124:1474:34;;;;6579:29:35;;;124:1474:34;6579:29:35;;;;124:1474:34;;;;;;;6515:95:35;124:1474:34;;6624:20:35;6620:107;;6767:20;:29;:20;;:::i;:29::-;6811:28;;;;6807:116;;124:1474:34;6932:31:35;124:1474:34;;;;;;;6807:116:35;6862:50;-1:-1:-1;6862:50:35;124:1474:34;;;;;-1:-1:-1;7684:51:35;6620:107;6667:49;;;-1:-1:-1;6667:49:35;124:1474:34;;;;;-1:-1:-1;124:1474:34;;;6131:102:35;6181:41;6204:10;;;;:::i;:::-;6181:41;-1:-1:-1;6181:41:35;124:1474:34;;;;;-1:-1:-1;124:1474:34;;;17320:105:35;17393:20;;:::i;:::-;17320:105;;124:1474:34;;;;;;2930:29:92;124:1474:34;;;:::i;:::-;;2930:6:92;124:1474:34;2930:6:92;124:1474:34;;;2930:6:92;124:1474:34;;;;;;;;;;;;;2930:29:92;124:1474:34;;;;;;;;;;;;;;;-1:-1:-1;;124:1474:34;;;;;;;;;;;;;;;;4723:26:92;124:1474:34;;;:::i;:::-;4693:18:92;2484:4;4693:18;;3877:6;124:1474:34;3877:6:92;124:1474:34;;3877:22:92;124:1474:34;3877:6:92;124:1474:34;3877:22:92;124:1474:34;3786:120:92;;2484:4;4723:26;:::i;124:1474:34:-;;;;;;;:::i;:::-;-1:-1:-1;;17363:1:35;124:1474:34;;;;;;;;;17324:42:35;17320:105;;124:1474:34;7887:25:35;17363:1;7887:25;124:1474:34;17363:1:35;7887:25;17320:105;17393:20;;:::i;:::-;17320:105;;124:1474:34;;;;;;;:::o;:::-;-1:-1:-1;;124:1474:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;-1:-1:-1;;124:1474:34;;;;;3361:34:35;124:1474:34;;;;;:::i;3361:34:35:-;124:1474:34;;;;3477:25:35;3449:26;;;124:1474:34;3477:25:35;;124:1474:34;;;;;;;3412:91:35;124:1474:34;3412:91:35;;124:1474:34;;;;;;;;;;;;;;;;;;;-1:-1:-1;124:1474:34;;-1:-1:-1;124:1474:34;;-1:-1:-1;124:1474:34;;;;;;;3412:91:35;;;;;-1:-1:-1;;3412:91:35;;;;;;:::i;:::-;124:1474:34;;;;;;;:::i;:::-;;;;;;;;;;;;3449:26:35;124:1474:34;;;;;;;;;;;;-1:-1:-1;;124:1474:34;;;;;;;;;3199:11:35;124:1474:34;;3188:23:35;;;124:1474:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3188:23:35;;;;;;:::i;124:1474:34:-;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;:::i;:::-;;;;;;;;;;;;;;;:::o;:::-;;;-1:-1:-1;;124:1474:34;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;:::i;:::-;:::o;:::-;;;;;;;;-1:-1:-1;;124:1474:34;;;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;-1:-1:-1;124:1474:34;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;:::i;:::-;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;-1:-1:-1;;124:1474:34;;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;:::o;:::-;;;;;;;;;;;;1404:66:35;124:1474:34;;;;;;;:::o;:::-;;:::i;:::-;16633:4:35;124:1474:34;;;16633:4:35;124:1474:34;;;:::o;:::-;16787:4:35;124:1474:34;;;16787:4:35;124:1474:34;;;:::o;:::-;16120:4:35;124:1474:34;;;16120:4:35;124:1474:34;;;:::o;:::-;16262:4:35;124:1474:34;;;16262:4:35;124:1474:34;;;:::o;:::-;;;;;;;;;;:::o;:::-;;;;;;;;;8355:1:37;124:1474:34;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;124:1474:34;;;-1:-1:-1;124:1474:34;;;;;;;;;;;;;;;;-1:-1:-1;124:1474:34;;;;;;3516:2265:35;3700:40;3516:2265;3700:40;;;;:::i;:::-;3771:18;;;;:33;124:1474:34;3771:18:35;;124:1474:34;;;;;3771:33:35;3845:28;3858:14;;3845:28;:::i;:::-;3887:13;;;;124:1474:34;;;;;;;;;;;3887:18:35;3883:77;;3991:25;124:1474:34;;;;;;;;3973:43:35;;124:1474:34;;;3973:15:35;:43;:::i;:::-;4019:16;;;;124:1474:34;;;;;;;;;3973:62:35;124:1474:34;;;-1:-1:-1;3969:178:35;;-1:-1:-1;;4223:18:35;3771;4223:33;124:1474:34;;;4204:53:35;;124:1474:34;;7367:51:35;:::i;4204:53::-;124:1474:34;;;;;;;;;4284:31:35;;;:139;;;;3516:2265;4267:298;;;4618:25;;4838:79;4618:25;4674:72;3991:25;4602:62;4618:25;;;:::i;:::-;4645:18;;;;4602:62;;:::i;:::-;4713:32;;4674:72;;:::i;:::-;4787:17;;;;;;;;;:::i;:::-;4899;4881:16;124:1474:34;3991:11:35;124:1474:34;;;;;;4881:16:35;;124:1474:34;4899:17:35;;;4838:79;;:::i;:::-;4976:30;124:1474:34;;;;;;;;;;;;4976:15:35;124:1474:34;;;;;;;4976:30:35;5020:37;124:1474:34;;;;;;;5020:37:35;5016:303;;124:1474:34;;3991:25:35;124:1474:34;;;;5412:46:35;124:1474:34;5372:30:35;124:1474:34;;;;;;;;;5372:30:35;124:1474:34;;;;;;;5412:46:35;124:1474:34;;;;;;;;;;;5412:46:35;3991:11;5468:29;;124:1474:34;5552:17:35;5521:28;;124:1474:34;:::i;:::-;;;;;;;3991:25:35;124:1474:34;5584:55:35;;124:1474:34;;;;;;5584:55:35;124:1474:34;;;5584:55:35;5580:141;;5731:43;3771:33;3516:2265;:::o;5580:141::-;5655:55;;124:1474:34;;3991:25:35;124:1474:34;;;;;;;;3991:25:35;124:1474:34;;5655:55:35;3771:33;3516:2265;:::o;5016:303::-;124:1474:34;;5077:95:35;124:1474:34;;;;;;;5154:17:35;;5077:95;;:::i;:::-;5073:175;;5268:40;124:1474:34;;;;;;;;5268:40:35;3771:33;5268:40;124:1474:34;;4976:15:35;124:1474:34;;;;5073:175:35;3991:25;;-1:-1:-1;5192:41:35:o;4267:298::-;4455:99;124:1474:34;;;;;;;;;4455:99:35;3771:33;4455:99;124:1474:34;;;;4455:99:35;124:1474:34;3973:15:35;124:1474:34;;;;;;;;4284:139:35;3973:15;;4335:69;3973:15;124:1474:34;4335:40:35;124:1474:34;;;;;;;4335:40:35;:69;:::i;:::-;:88;;4284:139;;;3969:178;4058:78;3771:33;4058:78;3973:15;4058:78;124:1474:34;;;;;;;;;;;-1:-1:-1;7684:51:35;3883:77;3928:21;3771:33;3928:21;;3771:33;3928:21;124:1474:34;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;:::i;:::-;;;:::o;:::-;;:::i;3175:103:92:-;735:10:120;2930:6:92;124:1474:34;;;;;;;;;;;;3495:23:92;3491:108;;3175:103::o;3491:108::-;3541:47;2930:6;3541:47;735:10:120;3541:47:92;124:1474:34;1318:33:35;124:1474:34;;;2930:6:92;3541:47;3175:103;124:1474:34;2930:6:92;124:1474:34;2930:6:92;124:1474:34;;;2930:29:92;735:10:120;124:1474:34;2930:6:92;124:1474:34;;;;;;;;;;;;;2930:29:92;124:1474:34;;3495:23:92;3491:108;;3175:103;:::o;3491:108::-;3541:47;2930:6;3541:47;735:10:120;3541:47:92;124:1474:34;;;;2930:6:92;3541:47;14970:177:35;124:1474:34;;15051:19:35;15047:94;;14970:177;:::o;15047:94::-;15093:37;15069:1;15093:37;;124:1474:34;;15069:1:35;15093:37;124:1474:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;124:1474:34;;;;-1:-1:-1;124:1474:34;;;;-1:-1:-1;124:1474:34;;;;;;;;;;;:::o;:::-;;;8387:1:35;124:1474:34;;;;;;;:::o;:::-;;;8556:1:35;124:1474:34;;;;;;;:::o;:::-;;;8695:2:35;124:1474:34;;;;;;;:::o;:::-;;;8881:2:35;124:1474:34;;;;;;;:::o;:::-;;;8924:1:35;124:1474:34;;;;;;;:::o;:::-;;;9154:1:35;124:1474:34;;;;;;;:::o;:::-;;;9227:2:35;124:1474:34;;;;;;;:::o;:::-;;;9295:2:35;124:1474:34;;;;;;;:::o;:::-;;;10526:1:35;124:1474:34;;;;;;;:::o;:::-;;;;;;;;;:::o;:::-;;;1131:1;124:1474;;;;;;;:::o;:::-;;;7692:2:37;124:1474:34;;;;;;;:::o;:::-;;;;;;;;;;;;;;;:::o;1404:66:35:-;;;;;;;;;;;:::o;:::-;;;;;:::i;:::-;124:1474:34;;;;;;:::i;:::-;1404:66:35;;;-1:-1:-1;;1404:66:35;;;;:::i;:::-;;;;;;;;:::o;:::-;;124:1474:34;;;;;1404:66:35;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;124:1474:34;1404:66:35;;;:::o;:::-;124:1474:34;;1404:66:35;;124:1474:34;;1404:66:35;124:1474:34;;:::i;:::-;937:1;1404:66:35;;;-1:-1:-1;;1404:66:35;;-1:-1:-1;1404:66:35;;;;;;;;;:::o;:::-;;124:1474:34;1404:66:35;;;;;;;;;;;;;;;:::i;:::-;124:1474:34;;;;;;:::i;:::-;1404:66:35;;;-1:-1:-1;;1404:66:35;;;;:::i;:::-;;;-1:-1:-1;1404:66:35;;;;;;;;;:::o;:::-;;124:1474:34;1404:66:35;;;;;;;;;;8026:2705;8192:30;:21;124:1474:34;;:::i;:::-;8133:28:35;;;;8192:21;:::i;:::-;:30;:::i;:::-;8171:18;;;:51;;;;124:1474:34;8264:2:35;8236:30;;8232:114;;8368:18;1522:66;8368:36;:21;:18;;:21;:::i;:::-;;:36;:::i;:::-;8360:66;8356:168;;8387:1;8537:30;:21;:18;;:21;:::i;:::-;;:30;:::i;:::-;:35;8533:122;;1404:66;8676:37;:22;:18;;:22;:::i;:37::-;8668:67;8664:167;;8862:32;:22;:18;;:22;:::i;:::-;;:32;:::i;:::-;124:1474:34;;8924:1:35;8908:17;;;;;:73;;;8026:2705;8904:130;;;9067:18;9342:21;9276:32;:22;9067:18;9044:54;9060:38;9067:30;:21;9342:30;9067:18;;:21;:::i;9060:38::-;124:1474:34;;9044:13:35;;;1404:66;;9044:54;9135:36;:21;:18;;:21;:::i;:36::-;9108:16;;;1404:66;9182:58;9201:39;9208:31;:22;:18;;:22;:::i;9201:39::-;124:1474:34;;9182:16:35;;;1404:66;;9182:58;9276:18;:22;:::i;:32::-;9342:21;:::i;:30::-;9318:21;;;;:54;;;;124:1474:34;9418:1:35;9386:33;;9382:123;;9559:21;:33;:24;:21;;:24;:::i;:::-;;:33;:::i;:::-;124:1474:34;;;9606:26:35;9602:83;;9715:36;124:1474:34;;9715:36:35;:::i;:::-;9695:17;;;;:56;;;-1:-1:-1;9808:3:35;124:1474:34;;9781:25:35;;;;;9857:27;:17;;;;:::i;:27::-;124:1474:34;;9927:2:35;9902:27;;9898:125;;10065:23;;10057:32;10065:23;;:::i;:::-;1404:66;;;;10057:32;124:1474:34;;;10107:23:35;;10103:103;;-1:-1:-1;10239:5:35;;;;;;10412:17;;;:32;8387:1;10412:17;:32;:17;;;:32;:::i;:::-;1404:66;124:1474:34;;1404:66:35;;;10412:32;1404:66;9766:13;;10246:3;10273:17;:33;:20;;:17;;;:20;:::i;:::-;124:1474:34;;;;;10273:20:35;124:1474:34;;;;10273:33:35;;10269:116;;8387:1;1404:66;10224:13;;10269:116;10337:29;-1:-1:-1;10337:29:35;124:1474:34;;;10157:34:35;124:1474:34;1404:66:35;-1:-1:-1;7684:51:35;10103:103;10157:34;-1:-1:-1;10157:34:35;124:1474:34;;;10157:34:35;124:1474:34;1404:66:35;-1:-1:-1;7684:51:35;9898:125;9956:52;-1:-1:-1;9956:52:35;124:1474:34;;;-1:-1:-1;7684:51:35;9781:25;;;10504:24;9781:25;;;10504:33;9781:25;;10504:21;:24;:::i;:33::-;10568:29;124:1474:34;;10568:29:35;:::i;:::-;10547:18;;;;:50;;;-1:-1:-1;10649:3:35;124:1474:34;;10627:20:35;;;;;10692:12;10668:46;10692:12;:22;:12;8387:1;10692:12;;;:::i;:22::-;10668:18;;:46;;;;;:::i;:::-;;;:::i;:::-;;1404:66;10612:13;;10627:20;;;;;8026:2705::o;9602:83::-;9655:19;-1:-1:-1;9655:19:35;;-1:-1:-1;9655:19:35;9382:123;9442:52;-1:-1:-1;9442:52:35;124:1474:34;;;-1:-1:-1;7684:51:35;8904:130;9004:19;124:1474:34;;;9004:19:35;;;;;;;;;;:::i;:::-;;;;8908:73;8949:32;124:1474:34;;8171:18:35;124:1474:34;;8929:16:35;:52;;8908:73;;;8664:167;8781:37;:22;8758:62;8781:18;;:22;:::i;:37::-;8758:62;-1:-1:-1;8758:62:35;124:1474:34;;;;;8533:122:35;8613:30;:21;8595:49;8613:18;;:21;:::i;:30::-;8595:49;-1:-1:-1;8595:49:35;124:1474:34;;;;;8356:168:35;8475:36;:21;8449:64;8475:18;;:21;:::i;:36::-;8449:64;-1:-1:-1;8449:64:35;124:1474:34;;;;;8232:114:35;8289:46;8133:16;8289:46;124:1474:34;;;-1:-1:-1;7684:51:35;14672:292;124:1474:34;;;;-1:-1:-1;124:1474:34;14812:15:35;124:1474:34;;;-1:-1:-1;124:1474:34;;;;;;14857:29:35;14853:105;;14672:292;:::o;14853:105::-;14909:38;-1:-1:-1;14909:38:35;14812:15;124:1474:34;;-1:-1:-1;14909:38:35;791:805:34;1319:18;1242:26;925:14;;:::i;:::-;15839:17:35;1174:24:34;979:21;;;15839:17:35;979:24:34;:21;;:24;:::i;:::-;;15839:17:35;:::i;:::-;949:55:34;;;:::i;:::-;;;;;:::i;:::-;;15839:17:35;1044:24:34;:21;;:24;:::i;15839:17:35:-;1014:55:34;;;:::i;:::-;;;;;:::i;:::-;;15839:17:35;1109:24:34;:21;;:24;:::i;15839:17:35:-;1079:55:34;;;:::i;:::-;;;;;:::i;:::-;;1174:21;:24;:::i;15839:17:35:-;1144:55:34;;;:::i;:::-;;;;;:::i;:::-;;1242:26;:::i;:::-;1319:18;;;1307:38;1319:18;;124:1474;1307:38;:::i;:::-;1360:13;1001:1;1406:3;1379:18;;124:1474;;1375:29;;;;;1442:82;;1066:1;1442:82;1447:2;1442:7;;:82;1447:2;;;1452:33;;;;;:::i;:::-;1425:99;;;;:::i;:::-;;;;;;:::i;:::-;;1404:66:35;1360:13:34;;1442:82;15839:17:35;1502:21:34;;;;:::i;15839:17:35:-;1442:82:34;;1375:29;;;;1561:27;1375:29;;1561:27;:::i;:::-;1319:18;124:1474;;;;1551:38;791:805;:::o;11363:509:35:-;;;;11495:27;124:1474:34;;11495:27:35;:::i;:::-;11537:13;11549:1;11570:3;124:1474:34;;11552:16:35;;;;;11629:8;;;;:::i;:::-;;124:1474:34;;11998:2:35;11983:17;;11979:95;;12093:8;;12105:2;124:1474:34;12087:15:35;12093:8;;12226:30;12093:8;;:::i;:::-;124:1474:34;;;;;12093:8:35;124:1474:34;;;;12087:15:35;124:1474:34;12087:20:35;12083:90;;11570:3;12226:30;;:::i;:::-;124:1474:34;;;;:::i;:::-;12270:33:35;;;:57;;;11570:3;12266:114;;124:1474:34;;;11549:1:35;11672:5;;;;;;11836:19;;;;1404:66;11836:19;;;;;:::i;:::-;1404:66;11537:13;;11679:3;11706:10;:20;:10;;;;;:::i;:20::-;;11702:107;;1404:66;;11657:13;;11702:107;11757:33;11549:1;11757:33;124:1474:34;;;10157:34:35;124:1474:34;1404:66:35;-1:-1:-1;7684:51:35;12266:114;12350:19;11549:1;12350:19;;11549:1;12350:19;12270:57;124:1474:34;;;;12307:20:35;12270:57;;12083:90;12134:28;12141:20;:15;12147:8;;;;:::i;12141:15::-;:20;:::i;:::-;124:1474:34;;;;;;12134:28:35;11549:1;12123:39;;;;:::i;:::-;;12083:90;;11979:95;12023:40;11549:1;12023:40;124:1474:34;;;-1:-1:-1;7684:51:35;11552:16;;;;11363:509::o;124:1474:34:-;-1:-1:-1;;124:1474:34;;;;;;;:::o;12415:540:35:-;;-1:-1:-1;12612:13:35;-1:-1:-1;12647:3:35;124:1474:34;;12627:18:35;;;;;12670:47;124:1474:34;12706:10:35;;;;:::i;:::-;124:1474:34;;12670:47:35;;:::i;:::-;12666:94;;12647:3;1404:66;;12612:13;;12666:94;12737:8;;1404:66;12737:8;;:::i;:::-;12666:94;;;;;12627:18;;;12826:1;12799:32;12627:18;124:1474:34;;12799:32:35;:::i;:::-;12845:17;;;;12841:108;;12415:540;;:::o;12841:108::-;12885:53;-1:-1:-1;12885:53:35;124:1474:34;;;;;-1:-1:-1;12885:53:35;12961:463;;-1:-1:-1;13100:13:35;-1:-1:-1;13135:3:35;124:1474:34;;13115:18:35;;;;;13158:39;124:1474:34;13186:10:35;;;;:::i;:::-;124:1474:34;;13158:39:35;;:::i;:::-;13154:86;;13135:3;1404:66;;13100:13;;13154:86;13217:8;;1404:66;13217:8;;:::i;:::-;13154:86;;;;;13115:18;;;124:1474:34;;1404:66:35;124:1474:34;;;;;13299:1:35;124:1474:34;;;;;;;13303:1:35;13279:29;:25;124:1474:34;13279:29:35;:::i;:::-;13322:17;;;;13318:100;;12961:463;;:::o;13318:100::-;13362:45;-1:-1:-1;13362:45:35;124:1474:34;;;;;-1:-1:-1;13362:45:35;10737:440;11083:31;10737:440;11083:22;10737:440;10955:76;10737:440;124:1474:34;;;11004:25:35;;;124:1474:34;;;;;;11004:25:35;;;;;;;:::i;11083:31::-;124:1474:34;;11152:1:35;124:1474:34;;;;;11139:30:35;124:1474:34;;11139:15:35;:30;:::i;124:1474:34:-;;;;;;;;-1:-1:-1;124:1474:34;;-1:-1:-1;124:1474:34;;;-1:-1:-1;124:1474:34;:::o;13989:677:35:-;;;124:1474:34;;;;;;;;;;;;;;14236:37:35;;;;:82;;;13989:677;14232:125;;;14370:25;;124:1474:34;;;;;14370:53:35;14366:96;;124:1474:34;14514:3:35;124:1474:34;;14491:21:35;;;;;124:1474:34;14537:28:35;;;;:::i;:::-;124:1474:34;;;;;;;;;;;;14537:45:35;14569:13;;;;;:::i;14537:45::-;124:1474:34;;14537:45:35;14533:96;;1404:66;;14476:13;;14533:96;14602:12;;;124:1474:34;14602:12:35;:::o;14491:21::-;;;;1404:66;13989:677;:::o;14366:96::-;14439:12;;124:1474:34;14439:12:35;:::o;14236:82::-;14277:26;;;;;124:1474:34;14277:41:35;;14236:82;;;6155:316:92;124:1474:34;;;;;;;2930:29:92;124:1474:34;;;;;;;;;;;;;;;;2930:29:92;124:1474:34;;;;;;;;;;6291:29:92;124:1474:34;;;;;;;;;;;;;;;;6291:29:92;6323:4;124:1474:34;;;;;;;;735:10:120;124:1474:34;;6346:40:92;;124:1474:34;6346:40:92;;6323:4;6400:11;:::o;6708:317::-;124:1474:34;;;;;;;2930:29:92;124:1474:34;;;;;;;;;;;;;;;;2930:29:92;124:1474:34;;;;;;;;;;;6844:29:92;124:1474:34;;;;;;;;;;;;;;;;6844:29:92;124:1474:34;;;;;;;735:10:120;124:1474:34;;6900:40:92;;124:1474:34;6900:40:92;;124:1474:34;6954:11:92;:::o;11183:174:35:-;124:1474:34;;;;;11307:18:35;124:1474:34;;;11296:53:35;;124:1474:34;;;1652:66:35;124:1474:34;;;;;11296:53:35;;;;;;:::i;:::-;124:1474:34;11286:64:35;;11183:174;:::o;124:1474:34:-;;;;;;;;:::i;:::-;2680:1:37;124:1474:34;;;1404:66:35;124:1474:34;;;1404:66:35;124:1474:34:o;:::-;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;-1:-1:-1;;124:1474:34;;;;:::i;1295:390:37:-;1615:20;:29;1295:390;;;;124:1474:34;1516:2:37;124:1474:34;:::i;:::-;;;;;;;;:::i;:::-;1516:2:37;124:1474:34;;;1516:2:37;124:1474:34;:::i;:::-;-1:-1:-1;;1516:2:37;124:1474:34;;;;1404:66:35;;;1529:63:37;1615:20;:::i;:29::-;1656:21;8343:13;124:1474:34;;8343:13:37;:::i;:::-;124:1474:34;;;8374:13:37;;:33;;;1295:390;8366:42;;;:::i;:::-;8429:26;8439:15;-1:-1:-1;8439:15:37;;:::i;:::-;8429:26;:::i;:::-;8465:18;-1:-1:-1;;124:1474:34;1675:1:37;8651:14;;;;;;1608:70;;;;;;;:::i;8667:6::-;8732:5;8796:37;8748:3;8804:21;:16;8810:9;;8732:5;;8355:1;8732:5;124:1474:34;;;;8732:5:37;8729:9;;8693:59;8729:9;8715:37;8729:9;8723:21;:16;8729:9;;;;;:::i;8723:16::-;124:1474:34;;;;;;8723:21:37;8722:29;124:1474:34;;;;;;8715:37:37;1675:1;8693:59;;;:::i;:::-;;8810:9;:::i;8804:16::-;124:1474:34;;;;8796:37:37;1675:1;8770:63;;8506:1;124:1474:34;;8770:63:37;;:::i;:::-;;124:1474:34;8644:204:37;;8374:33;-1:-1:-1;8391:16:37;8374:33;;124:1474:34;;;;;;;:::i;:::-;-1:-1:-1;124:1474:34;;;;;;;:::o;1812:221:38:-;124:1474:34;;:::i;:::-;;1923:58:38;124:1474:34;;;;;;;;;:::i;:::-;1404:66:35;;1923:58:38;;1998:28;;1404:66:35;1812:221:38;:::o;124:1474:34:-;;;;:::o;6361:439:38:-;124:1474:34;;6448:12:38;;;:30;;;;6361:439;124:1474:34;;;;6522:21:38;;;:::i;:::-;6554:14;6578:192;;;;;;;6780:13;6361:439;:::o;6578:192::-;;;;;;;6361:439;:::o;6448:30::-;6476:2;6464:14;;;;6448:30;;;3245:519;3341:12;;;:::i;:::-;124:1474:34;;;3381:14:38;;;:::i;:::-;1404:66:35;;;:::i;:::-;124:1474:34;;;;;;;:::i;:::-;1404:66:35;;;-1:-1:-1;;124:1474:34;;;:::i;:::-;;-1:-1:-1;124:1474:34;;;;;;3479:11:38;;124:1474:34;3479:41:38;:11;;124:1474:34;3493:27:38;;;:::i;:::-;3479:41;;:::i;:::-;-1:-1:-1;3555:179:38;3575:9;;;;;;3744:13;;;3245:519;:::o;3586:3::-;3707:16;3615:19;;1404:66:35;3615:19:38;;:::i;:::-;124:1474:34;;;:::i;:::-;1404:66:35;;;3660:24:38;124:1474:34;3660:24:38;;1404:66:35;3648:36:38;;;;:::i;:::-;;;;;;:::i;:::-;;3707:16;:::i;:::-;3586:3;1404:66:35;3560:13:38;;;124:1474:34;;;;;:::i;:::-;;;;;;;;;;6837:298:38;6969:2;124:1474:34;;6957:14:38;124:1474:34;;7024:11:38;;124:1474:34;7038:1:38;124:1474:34;;;;;;;7049:56:38;6837:298;:::o;7141:379::-;124:1474:34;;7234:12:38;124:1474:34;;7290:21:38;7486:3;7290:21;;:::i;:::-;7343:14;;;;;;:::i;:::-;7393:61;;;;7486:3;;:::i;124:1474:34:-;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;:::i;:::-;;;:::i;:::-;;-1:-1:-1;;124:1474:34;;;;;;:::i;:::-;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;16315:523:35:-;-1:-1:-1;;124:1474:34;16476:3:35;124:1474:34;;16458:16:35;;;;;16505:31;1404:66;16527:8;;;;;:::i;:::-;;16505:31;;:::i;:::-;16476:3;1404:66;16443:13;;;16458:16;;;;124:1474:34;;16578:2:35;16561:19;;16557:120;;124:1474:34;16757:74:35;16711:29;124:1474:34;;16711:29:35;:::i;:::-;124:1474:34;16757:74:35;16774:37;16781:29;16787:22;124:1474:34;;16787:22:35;:::i;16774:37::-;124:1474:34;;;16757:74:35;;;;;;;:::i;16557:120::-;16620:36;16627:28;16633:21;16603:63;16633:21;;:::i;16620:36::-;16603:63;124:1474:34;;16603:63:35;;;;;;;:::i;124:1474:34:-;;;12098:2:35;124:1474:34;;;;;;;:::o;:::-;;;;;;;;;;;;;:::o;15869:440:35:-;15977:1;124:1474:34;;15963:15:35;:39;;;15869:440;15959:80;;124:1474:34;;16065:2:35;16052:15;;16048:108;;124:1474:34;16232:70:35;16190:25;124:1474:34;;16190:25:35;:::i;:::-;124:1474:34;16232:70:35;16249:37;16256:29;16262:22;124:1474:34;;16262:22:35;:::i;16048:108::-;16107:32;16114:24;16120:17;16090:55;16120:17;;:::i;15963:39::-;15988:6;15998:4;124:1474:34;15982:13:35;15988:6;;;;:::i;15982:13::-;124:1474:34;15982:20:35;15963:39;;124:1474:34;;;;;;;;;;;;:::o;:::-;;-1:-1:-1;124:1474:34;;;:::o;15153:284:35:-;;124:1474:34;15307:3:35;124:1474:34;;15284:21:35;;;;;124:1474:34;15330:13:35;;;;:::i;:::-;124:1474:34;;;;;;;;;;15330:23:35;15326:73;;1404:66;;15269:13;;15443:282;;124:1474:34;15595:3:35;124:1474:34;;15572:21:35;;;;;124:1474:34;15618:13:35;;;;:::i;:::-;124:1474:34;;;;;15618:23:35;15614:73;;1404:66;;15557:13;;124:1474:34;;-1:-1:-1;;124:1474:34;;;;;;;:::o;:::-;;;;;;;;;;:::o;:::-;;;;;;;;;;:::o;:::-;;;;;;;;;:::o;:::-;;;;;;;;;;:::o;8215:649:37:-;;;8343:13;124:1474:34;;8343:13:37;:::i;:::-;124:1474:34;;;8374:13:37;;:33;;;8215:649;8366:42;;;:::i;:::-;8429:26;8439:15;;;;:::i;8429:26::-;8465:18;;8497:10;8506:1;8497:10;;;:15;8493:118;;8215:649;-1:-1:-1;;124:1474:34;;;8644:204:37;8651:14;;;;;;8215:649;;;;;:::o;8667:6::-;8732:5;8770:63;8506:1;8796:37;8748:3;8804:21;:16;8810:9;;8732:5;8355:1;8732:5;8693:59;8715:37;8732:5;8723:21;8732:5;8729:9;;8732:5;8723:16;8732:5;124:1474:34;;;;8732:5:37;8729:9;;;:::i;8715:37::-;124:1474:34;;;8693:59:37;;8386:1;8693:59;;;:::i;:::-;;8810:9;;:::i;8796:37::-;8386:1;8770:63;124:1474:34;;8770:63:37;;:::i;:::-;;124:1474:34;8644:204:37;;;;8493:118;8558:10;;124:1474:34;8549:26:37;:21;8555:14;;8558:10;;124:1474:34;;;;8558:10:37;8555:14;;:::i;8549:26::-;124:1474:34;;;8386:1:37;8528:55;;;;:::i;:::-;;-1:-1:-1;;8597:3:37;;;:::i;:::-;8493:118;;;;;8374:33;-1:-1:-1;8391:16:37;;;;8374:33;;2450:5418;;2680:1;2691:20;2680:1;124:1474:34;;:::i;:::-;;;;2810:17:37;2806:223;;3097:13;;2680:1;3092:4724;3130:3;124:1474:34;;3112:16:37;;;;;3212:6;;;;:50;;3130:3;3208:97;;3419:6;:47;;;;3130:3;3415:94;;;3635:17;:8;;;;:::i;:17::-;124:1474:34;;;3686:1:37;3671:16;;3667:4139;3686:1;;;3865:7;3837:46;3865:17;:7;;;:::i;:17::-;3837:46;:::i;:::-;3925:56;3999:28;3925:56;;;;;:::i;:::-;3999:28;;;:::i;:::-;124:1474:34;;-1:-1:-1;4046:994:37;;5058:1185;;;124:1474:34;5136:16:37;124:1474:34;;5136:16:37;:::i;:::-;-1:-1:-1;5128:144:37;;124:1474:34;-1:-1:-1;5294:109:37;;5436:7;5472:18;5436:7;;:::i;5294:109::-;5368:12;;;:::i;5058:1185::-;124:1474:34;;;5615:16:37;124:1474:34;;5615:16:37;:::i;:::-;5610:21;;5606:138;;5771:7;5770:17;5771:16;:7;1404:66:35;5771:7:37;;:::i;:::-;;:16;:::i;:::-;5770:17;;124:1474:34;5770:17:37;5771:7;;;5958;:26;:7;;:::i;:::-;;:26;:::i;:::-;5766:459;;1404:66:35;3097:13:37;;;;;5766:459;6175:7;:27;:7;;:::i;:::-;;4455:11:38;;;124:1474:34;;;4532:62:38;;4351:272;;6175:27:37;5766:459;;;4046:994;124:1474:34;;;;;;4839:16:37;124:1474:34;;;4839:16:37;:::i;:::-;-1:-1:-1;4831:149:37;;5009:12;;:::i;3667:4139::-;6267:17;;;;;;6282:2;6267:17;6282:2;;124:1474:34;;6340:36:37;;6356:20;;6572:17;6507:43;6515:34;6521:27;;;;;:::i;6507:43::-;6572:17;;:::i;:::-;6615:12;6625:2;6615:12;;;6611:146;;6783:33;6803:12;;;;:::i;:::-;;6783:33;:::i;:::-;6803:12;;;124:1474:34;;;;6887:16:37;124:1474:34;;;;6887:16:37;:::i;:::-;6882:21;6878:157;;7068:12;;:::i;6779:555::-;7114:12;7113:22;7114:21;:12;;1404:66:35;7114:12:37;;;;;;;:::i;7113:22::-;7114:12;;;7178:31;:12;;;;:::i;7109:225::-;7279:32;:12;;;;:::i;6336:1388::-;124:1474:34;;;7532:16:37;124:1474:34;;7532:16:37;:::i;:::-;7527:21;7523:135;;7687:8;:18;:8;;:::i;6263:1543::-;124:1474:34;;7762:29:37;;;124:1474:34;7762:29:37;;;124:1474:34;;;;;;;;;;;;;9004:19:35;3419:47:37;3457:8;;3445:21;3457:8;;;;:::i;:::-;;3445:21;:::i;:::-;3429:37;;3419:47;;;3212:50;3234:8;:28;:8;;;;:::i;:28::-;3222:40;;;3212:50;;2806:223;2906:78;;;2898:87;2906:78;;2918:66;2906:78;;;2898:87;:::i;:::-;3006:12;;:::i;2689:281:38:-;;2818:11;;;124:1474:34;2803:27:38;124:1474:34;;2803:27:38;:::i;:::-;124:1474:34;;;;;;;;;;;;;;;;;;;;2943:20:38;2689:281;:::o;3868:321::-;124:1474:34;;3948:13:38;3944:31;;4024:11;627:4;4024:11;;124:1474:34;4045:64:38;124:1474:34;4045:64:38;4123:24;4119:42;;4178:4;3868:321;:::o;3944:31::-;3963:12;124:1474:34;3963:12:38;:::o;7628:424::-;124:1474:34;;7712:13:38;7708:27;;124:1474:34;7791:11:38;;;;124:1474:34;;;7805:27:38;;;:::i;:::-;124:1474:34;;;;;;;;;;;;;;;;;;7891:132:38;;7898:16;;;;;;8033:12;;;7628:424;:::o;7891:132::-;7950:20;;;:::i;:::-;124:1474:34;;;;;;;8005:7:38;7930:40;8005:7;;:::i;:::-;7891:132;;;9416:581;9520:64;124:1474:34;9520:64:38;538:4;9598:26;;538:4;;;9640:8;124:1474:34;9640:8:38;:::o;9594:397::-;583:4;9669:25;;:83;;;;9594:397;9665:326;;;9768:8;9775:1;9768:8;:::o;9665:326::-;627:4;9797:24;;627:4;;;9874:35;;:31;;670:4;9874:31;;;:::i;:::-;:35;:::i;9793:198::-;9947:33;;:29;;670:4;9947:29;124:1474:34;9669:83:38;9699:25;627:4;9699:25;;;:52;;9669:83;9699:52;9728:23;670:4;9728:23;;9669:83;;8101:1263;8227:64;;-1:-1:-1;8227:64:38;;538:4;8305:26;;538:4;;;8347:11;;8357:1;8101:1263;:::o;8301:1032::-;583:4;8379:25;;583:4;;;8430:26;;:30;:26;;:::i;8375:958::-;627:4;8481:24;;627:4;;;8521:385;;;;;;;;;;;;;;;;124:1474:34;:::o;8477:856:38:-;670:4;8926:23;;670:4;;;8975:24;;:28;:24;;:::i;8922:411::-;9034:289;;;;;;;;;;;;;;;;124:1474:34;:::o;707:2:38:-;;;;;;;;;:::o;10155:770::-;;;10236:8;;10232:21;;10317:16;707:2;10317:16;;;;;10518:7;10514:405;;10155:770;;;:::o;10514:405::-;10640:24;10648:15;10640:28;10648:15;;:::i;:::-;10640:24;:::i;:::-;:28;:::i;:::-;10682:227;;;;;;;;;;;;10155:770::o;10335:16::-;10367:65;;;;;;707:2;124:1474:34;;;;;;;10476:17:38;707:2;124:1474:34;;;;;;;10335:16:38;-1:-1:-1;;124:1474:34;;;;;;10310:194:38;124:1474:34;;:::i;5161:337:38:-;5271:19;124:1474:34;;5271:19:38;:::i;:::-;124:1474:34;;;5304:18:38;5300:37;;5441:11;5369:57;5459:8;5441:11;;124:1474:34;;;5369:57:38;;;;5459:8;;:::i;5300:37::-;5324:13;;:::o;16844:430:35:-;-1:-1:-1;16929:19:35;;16989:8;;;17084:17;;;;:::i;:::-;17111:11;17132:116;17157:5;;;17257:10;;16844:430;:::o;17164:3::-;17187:5;;;:::i;:::-;17183:31;124:1474:34;;;;;-1:-1:-1;17183:31:35;;;;:::i;:::-;;124:1474:34;;17164:3:35;124:1474:34;;;;-1:-1:-1;;124:1474:34;17137:18:35;;;;16982:73;17013:8;;;;:::i;:::-;124:1474:34;17043:1:35;124:1474:34;16982:73:35;;;2129:778:129;124:1474:34;;;2129:778:129;2319:2;2299:22;;2319:2;;2751:25;2535:196;;;;;;;;;;;;;;;-1:-1:-1;2535:196:129;2751:25;;:::i;:::-;2744:32;;;;;:::o;2295:606::-;2807:83;;2823:1;2807:83;2827:35;2807:83;;:::o;10497:270:37:-;124:1474:34;;10608:2:37;10596:14;;10608:2;;;4455:11:38;10608:2:37;4455:11:38;;124:1474:34;;;4532:62:38;;10626:32:37;:::o;10592:169::-;4455:11:38;10608:2:37;4455:11:38;124:1474:34;4532:62:38;124:1474:34;;10608:2:37;10706:43;;124:1474:34;;;10608:2:37;10706:43;;;124:1474:34;10706:43:37;;:::i;7874:335::-;7989:1;124:1474:34;;7977:13:37;7973:56;;8072:11;;124:1474:34;8093:60:37;124:1474:34;8093:60:37;8174:4;8169:9;;7874:335::o;4781:270:38:-;4902:21;4781:270;4902:21;:::i;:::-;4957:65;;4781:270;:::o;8870:729:37:-;;124:1474:34;;9000:13:37;124:1474:34;;9066:3:37;9046:17;:12;9052:5;;;;:::i;9046:17::-;:23;9111:16;;;9143:10;9566:25;9152:1;124:1474:34;9107:434:37;9566:25;:::i;9107:434::-;9217:1;9202:16;;9217:1;;9234:10;9566:25;9217:1;124:1474:34;9198:343:37;9566:25;:::i;9198:343::-;9308:1;9293:16;;9308:1;;9325:10;9566:25;9308:1;9217;9289:252;9566:25;:::i;9289:252::-;9398:1;9383:16;9398:1;;9566:25;9217:1;9439:13;9379:162;9566:25;:::i;9605:320::-;;;124:1474:34;9800:3:37;124:1474:34;;;;;;;;;;9757:24:37;;:41;;;9800:3;9757:41;;;9823:16;124:1474:34;;9823:16:37;;:::i;:::-;124:1474:34;;;9843:5:37;;;;:::i;:::-;124:1474:34;;9823:25:37;;9819:72;;9800:3;;;:::i;:::-;9750:151;;9819:72;9868:8;;;;;:::o;9757:41::-;;;;;;9605:320;:::o;9757:41::-;124:1474:34;;;9785:13:37;;9757:41;;5203:1551:129;;;6283:66;6270:79;;6266:164;;124:1474:34;;;;;;-1:-1:-1;124:1474:34;;;;;;;;;;;;;;;;;;;6541:24:129;;;;;;;;;-1:-1:-1;6541:24:129;124:1474:34;;;6579:20:129;6575:113;;6698:49;-1:-1:-1;6698:49:129;-1:-1:-1;5203:1551:129;:::o;6575:113::-;6615:62;-1:-1:-1;6615:62:129;6541:24;6615:62;-1:-1:-1;6615:62:129;:::o;6541:24::-;124:1474:34;;;;;;;;;6266:164:129;6365:54;;;6381:1;6365:54;6385:30;6365:54;;:::o","linkReferences":{}},"methodIdentifiers":{"DEFAULT_ADMIN_ROLE()":"a217fddf","PROOF_SUBMITTER_ROLE()":"5972185a","getClientState()":"ef913a4b","getConsensusState(uint64)":"edce8bdc","getRoleAdmin(bytes32)":"248a9ca3","grantRole(bytes32,address)":"2f2ff15d","hasRole(bytes32,address)":"91d14854","misbehaviour(bytes)":"ddba6537","renounceRole(bytes32,address)":"36568abe","revokeRole(bytes32,address)":"d547741f","supportsInterface(bytes4)":"01ffc9a7","updateClient(bytes)":"0bece356","verifyMembership((bytes,(uint64,uint64),bytes[],bytes))":"682ed5f0","verifyNonMembership((bytes,(uint64,uint64),bytes[]))":"4d6d9ffb"},"rawMetadata":"{\"compiler\":{\"version\":\"0.8.28+commit.7893614a\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"ibcRouter\",\"type\":\"address\"},{\"internalType\":\"uint64\",\"name\":\"initialTrustedHeight\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"initialTrustedTimestamp\",\"type\":\"uint64\"},{\"internalType\":\"bytes32\",\"name\":\"initialTrustedStorageRoot\",\"type\":\"bytes32\"},{\"internalType\":\"address[]\",\"name\":\"initialTrustedValidators\",\"type\":\"address[]\"},{\"internalType\":\"uint64\",\"name\":\"trustingPeriod\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"maxClockDrift\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"roleManager\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"AccessControlBadConfirmation\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"internalType\":\"bytes32\",\"name\":\"neededRole\",\"type\":\"bytes32\"}],\"name\":\"AccessControlUnauthorizedAccount\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"revisionHeight\",\"type\":\"uint64\"}],\"name\":\"ConflictingConsensusState\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"trustedTimestamp\",\"type\":\"uint64\"},{\"internalType\":\"uint256\",\"name\":\"currentTimestamp\",\"type\":\"uint256\"},{\"internalType\":\"uint64\",\"name\":\"trustingPeriod\",\"type\":\"uint64\"}],\"name\":\"ConsensusStateExpired\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"revisionHeight\",\"type\":\"uint64\"}],\"name\":\"ConsensusStateNotFound\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"signer\",\"type\":\"address\"}],\"name\":\"DuplicateCommitSealSigner\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"validator\",\"type\":\"address\"}],\"name\":\"DuplicateValidator\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"EmptyValidatorSet\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"currentTimestamp\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"headerTimestamp\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxClockDrift\",\"type\":\"uint256\"}],\"name\":\"HeaderFromFuture\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"actual\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"required\",\"type\":\"uint256\"}],\"name\":\"InsufficientTrustedValidatorOverlap\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"actual\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"required\",\"type\":\"uint256\"}],\"name\":\"InsufficientValidatorQuorum\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidCommitSeal\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"expectedValue\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"actualValue\",\"type\":\"bytes32\"}],\"name\":\"InvalidCommitmentValue\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"actualDifficulty\",\"type\":\"uint256\"}],\"name\":\"InvalidDifficulty\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"length\",\"type\":\"uint256\"}],\"name\":\"InvalidECDSASignatureLength\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"itemsLength\",\"type\":\"uint256\"}],\"name\":\"InvalidExtraDataFormat\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"itemsLength\",\"type\":\"uint256\"}],\"name\":\"InvalidHeaderFormat\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidHeaderHeight\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"actualMixHash\",\"type\":\"bytes32\"}],\"name\":\"InvalidMixHash\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"actualNonce\",\"type\":\"bytes\"}],\"name\":\"InvalidNonce\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"actualOmmersHash\",\"type\":\"bytes32\"}],\"name\":\"InvalidOmmersHash\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"expectedLength\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"actualLength\",\"type\":\"uint256\"}],\"name\":\"InvalidPathLength\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"providedRevisionNumber\",\"type\":\"uint64\"}],\"name\":\"InvalidRevisionNumber\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"validator\",\"type\":\"address\"}],\"name\":\"InvalidValidatorAddress\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"length\",\"type\":\"uint256\"}],\"name\":\"InvalidValidatorAddressLength\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"expectedLength\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"actualLength\",\"type\":\"uint256\"}],\"name\":\"InvalidValueLength\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"UnsupportedMisbehaviour\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"actualValue\",\"type\":\"bytes32\"}],\"name\":\"ValueExists\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"previousAdminRole\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"newAdminRole\",\"type\":\"bytes32\"}],\"name\":\"RoleAdminChanged\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"RoleGranted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"RoleRevoked\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"DEFAULT_ADMIN_ROLE\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"PROOF_SUBMITTER_ROLE\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getClientState\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"revisionHeight\",\"type\":\"uint64\"}],\"name\":\"getConsensusState\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"}],\"name\":\"getRoleAdmin\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"grantRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"hasRole\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"name\":\"misbehaviour\",\"outputs\":[],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"callerConfirmation\",\"type\":\"address\"}],\"name\":\"renounceRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"revokeRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes4\",\"name\":\"interfaceId\",\"type\":\"bytes4\"}],\"name\":\"supportsInterface\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"updateMsg\",\"type\":\"bytes\"}],\"name\":\"updateClient\",\"outputs\":[{\"internalType\":\"enum ILightClientMsgs.UpdateResult\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes\",\"name\":\"proof\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"uint64\",\"name\":\"revisionNumber\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"revisionHeight\",\"type\":\"uint64\"}],\"internalType\":\"struct IICS02ClientMsgs.Height\",\"name\":\"proofHeight\",\"type\":\"tuple\"},{\"internalType\":\"bytes[]\",\"name\":\"path\",\"type\":\"bytes[]\"},{\"internalType\":\"bytes\",\"name\":\"value\",\"type\":\"bytes\"}],\"internalType\":\"struct ILightClientMsgs.MsgVerifyMembership\",\"name\":\"msg_\",\"type\":\"tuple\"}],\"name\":\"verifyMembership\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes\",\"name\":\"proof\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"uint64\",\"name\":\"revisionNumber\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"revisionHeight\",\"type\":\"uint64\"}],\"internalType\":\"struct IICS02ClientMsgs.Height\",\"name\":\"proofHeight\",\"type\":\"tuple\"},{\"internalType\":\"bytes[]\",\"name\":\"path\",\"type\":\"bytes[]\"}],\"internalType\":\"struct ILightClientMsgs.MsgVerifyNonMembership\",\"name\":\"msg_\",\"type\":\"tuple\"}],\"name\":\"verifyNonMembership\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"errors\":{\"AccessControlBadConfirmation()\":[{\"details\":\"The caller of a function is not the expected one. NOTE: Don't confuse with {AccessControlUnauthorizedAccount}.\"}],\"AccessControlUnauthorizedAccount(address,bytes32)\":[{\"details\":\"The `account` is missing a role.\"}]},\"events\":{\"RoleAdminChanged(bytes32,bytes32,bytes32)\":{\"details\":\"Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite {RoleAdminChanged} not being emitted to signal this.\"},\"RoleGranted(bytes32,address,address)\":{\"details\":\"Emitted when `account` is granted `role`. `sender` is the account that originated the contract call. This account bears the admin role (for the granted role). Expected in cases where the role was granted using the internal {AccessControl-_grantRole}.\"},\"RoleRevoked(bytes32,address,address)\":{\"details\":\"Emitted when `account` is revoked `role`. `sender` is the account that originated the contract call: - if using `revokeRole`, it is the admin role bearer - if using `renounceRole`, it is the role bearer (i.e. `account`)\"}},\"kind\":\"dev\",\"methods\":{\"getClientState()\":{\"returns\":{\"_0\":\"The client state.\"}},\"getRoleAdmin(bytes32)\":{\"details\":\"Returns the admin role that controls `role`. See {grantRole} and {revokeRole}. To change a role's admin, use {_setRoleAdmin}.\"},\"grantRole(bytes32,address)\":{\"details\":\"Grants `role` to `account`. If `account` had not been already granted `role`, emits a {RoleGranted} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleGranted} event.\"},\"hasRole(bytes32,address)\":{\"details\":\"Returns `true` if `account` has been granted `role`.\"},\"renounceRole(bytes32,address)\":{\"details\":\"Revokes `role` from the calling account. Roles are often managed via {grantRole} and {revokeRole}: this function's purpose is to provide a mechanism for accounts to lose their privileges if they are compromised (such as when a trusted device is misplaced). If the calling account had been revoked `role`, emits a {RoleRevoked} event. Requirements: - the caller must be `callerConfirmation`. May emit a {RoleRevoked} event.\"},\"revokeRole(bytes32,address)\":{\"details\":\"Revokes `role` from `account`. If `account` had been granted `role`, emits a {RoleRevoked} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleRevoked} event.\"},\"supportsInterface(bytes4)\":{\"details\":\"Returns true if this contract implements the interface defined by `interfaceId`. See the corresponding https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[ERC section] to learn more about how these ids are created. This function call must use less than 30 000 gas.\"},\"updateClient(bytes)\":{\"params\":{\"updateMsg\":\"The encoded update message e.g., an SP1 proof.\"},\"returns\":{\"_0\":\"The result of the update operation\"}},\"verifyMembership((bytes,(uint64,uint64),bytes[],bytes))\":{\"details\":\"Notice that this message is not view, as it may update the client state for caching purposes.\",\"params\":{\"msg_\":\"The membership message\"},\"returns\":{\"_0\":\"The unix timestamp of the verification height in the counterparty chain in seconds.\"}},\"verifyNonMembership((bytes,(uint64,uint64),bytes[]))\":{\"details\":\"Notice that this message is not view, as it may update the client state for caching purposes.\",\"params\":{\"msg_\":\"The membership message\"},\"returns\":{\"_0\":\"The unix timestamp of the verification height in the counterparty chain in seconds.\"}}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"getClientState()\":{\"notice\":\"Returns the client state.\"},\"updateClient(bytes)\":{\"notice\":\"Updating the client and consensus state\"},\"verifyMembership((bytes,(uint64,uint64),bytes[],bytes))\":{\"notice\":\"Querying the membership of a key-value pair\"},\"verifyNonMembership((bytes,(uint64,uint64),bytes[]))\":{\"notice\":\"Querying the non-membership of a key\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/light-clients/besu/BesuIBFT2LightClient.sol\":\"BesuIBFT2LightClient\"},\"evmVersion\":\"cancun\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"none\"},\"optimizer\":{\"enabled\":true,\"runs\":10000},\"remappings\":[\":@openzeppelin-contracts/=node_modules/@openzeppelin/contracts/\",\":@openzeppelin-upgradeable/=node_modules/@openzeppelin/contracts-upgradeable/\",\":@openzeppelin/=node_modules/@openzeppelin/\",\":@sp1-contracts/=node_modules/sp1-contracts/contracts/src/\",\":@uniswap/permit2/=node_modules/@uniswap/permit2/\",\":forge-std/=node_modules/forge-std/src/\",\":sp1-contracts/=node_modules/sp1-contracts/\"],\"viaIR\":true},\"sources\":{\"contracts/interfaces/ILightClient.sol\":{\"keccak256\":\"0x1caae9e4f741a86c0056d5f7713a35f3bd96db7a9fd52fc9f1cf79aad76a442f\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://4a536db3b926560f69547c17e4f451a2631ddea0f42bd224c7fd8382d74429f6\",\"dweb:/ipfs/QmcQ33kxcmmowXgMbQGTBgiKBjF7v8UiP4y73bB9hhDizC\"]},\"contracts/light-clients/besu/BesuIBFT2LightClient.sol\":{\"keccak256\":\"0x097eb9878e468b9277356596cbc1109e9f189e26b5bc44626d258c3cfa0b4c16\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://61c05c9caa8a5eade32baa598422b48f2b095a2f2adfb490c23d49b3e962e8b7\",\"dweb:/ipfs/QmQ1ksNug4KReKZuTNxpefJZ6RNh7yZc8PRVrZQBHCoLAU\"]},\"contracts/light-clients/besu/BesuLightClientBase.sol\":{\"keccak256\":\"0x44fd20d599cfed2298d6a26ec8584c5955b4c6b097d7b9f42d9ef7e462d7a4ad\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://86ce26f4e3d6b4327680d93daf5b8a795fb5e76cf566bd9328988d4b5e170c7e\",\"dweb:/ipfs/QmTkwvf1Xvasx3zpgcYVQa2VMEL1CXjrESwuV7vKNa3VhQ\"]},\"contracts/light-clients/besu/MPTProof.sol\":{\"keccak256\":\"0x232c01021016519bf2fdda5abfac7ab23f01e3c9f59c0233a5944d16a94b343a\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://17387ba08707c70bc36df9a36a7f731d63db9f183b2675b7db35b9861c24c3b7\",\"dweb:/ipfs/QmerMaj4tnVPwfdA69eVx9joJXQP72MR4KLudSpPf28NkZ\"]},\"contracts/light-clients/besu/RLPReader.sol\":{\"keccak256\":\"0xeb60cddae95fa2779d1e8f0d7a622737480ee67348ea0c6e65f13c93cfc9d5bb\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://550fcc3d1527dd6a4f3621a72d7afc5c49dd5aa4b16992934a81c17dd0386a27\",\"dweb:/ipfs/QmeF5UNemcyEeyU3y6Ru5bK4NG1v9xpWvp3J9WdXfsgkGa\"]},\"contracts/light-clients/besu/errors/IBesuLightClientErrors.sol\":{\"keccak256\":\"0x5b5fd8ec4ad07c713fb5337cfec9769e4d0fa30817bc237a98b2ce4cf155feac\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://8fc013ed01d0e08590ee92f80f8089c18c334024d4d1a77a04ce3673b5d1e103\",\"dweb:/ipfs/QmeWAn9JoVVsBin8JnvBLRP51QBCsM9m95bVrZoKFtkUfo\"]},\"contracts/light-clients/besu/msgs/IBesuLightClientMsgs.sol\":{\"keccak256\":\"0xbd6a5a6309d1076319f61820ae239848dcb4dca598240d5f9f927e02ed8b58c9\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://ef5a28164d53832a52112a91747dbe84439a8003c489116425b7fd2d631425d9\",\"dweb:/ipfs/QmbUqMt72DZFtfyupG9jQXEkQFGpVrUb4wQW3bNiUPV1AR\"]},\"contracts/msgs/IICS02ClientMsgs.sol\":{\"keccak256\":\"0xb5fdb25319d5c32b3f527982d45ec1e9bec5215515581aee034d853006ea01a0\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://6b8939bf552c62c952a491008bcd9b59ab7dda20a9482bf93438e05793881542\",\"dweb:/ipfs/QmfWmzNCp8bd4pP26Lfw5HHp4dSZnCDqZDjVN7SD8P7eDh\"]},\"contracts/msgs/ILightClientMsgs.sol\":{\"keccak256\":\"0xa0565e7748b8b3284d72e1aa6ef4cc8264fcaa5f4e0761d22d64686953db6378\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://c4476010d7090bfaa74127526f2051c6bc82ff42a09b936e848880a1f15a6065\",\"dweb:/ipfs/QmY87JgRsFQXSZdGXNjNHEJCkdTHzFXH4vZEJ3q7MnHuP8\"]},\"node_modules/@openzeppelin/contracts/access/AccessControl.sol\":{\"keccak256\":\"0x1a6b4f6b7798ab80929d491b89d5427a9b3338c0fd1acd0ba325f69c6f1646af\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://7bb7f346c12a14dc622bc105ce3c47202fbc89f4b153a28a63bb68193297330c\",\"dweb:/ipfs/QmagwF8P3bUBXwdo159ueEnY9dLSvEWwK24kk2op58egwG\"]},\"node_modules/@openzeppelin/contracts/access/IAccessControl.sol\":{\"keccak256\":\"0xbff9f59c84e5337689161ce7641c0ef8e872d6a7536fbc1f5133f128887aba3c\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://b308f882e796f7b79c9502deacb0a62983035c6f6f4e962b319ba6a1f4a77d3d\",\"dweb:/ipfs/QmaWCW7ahEQqFjwhSUhV7Ae7WhfNvzSpE7DQ58hvEooqPL\"]},\"node_modules/@openzeppelin/contracts/utils/Context.sol\":{\"keccak256\":\"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://6a708e8a5bdb1011c2c381c9a5cfd8a9a956d7d0a9dc1bd8bcdaf52f76ef2f12\",\"dweb:/ipfs/Qmax9WHBnVsZP46ZxEMNRQpLQnrdE4dK8LehML1Py8FowF\"]},\"node_modules/@openzeppelin/contracts/utils/cryptography/ECDSA.sol\":{\"keccak256\":\"0x69f54c02b7d81d505910ec198c11ed4c6a728418a868b906b4a0cf29946fda84\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://8e25e4bdb7ae1f21d23bfee996e22736fc0ab44cfabedac82a757b1edc5623b9\",\"dweb:/ipfs/QmQdWQvB6JCP9ZMbzi8EvQ1PTETqkcTWrbcVurS7DKpa5n\"]},\"node_modules/@openzeppelin/contracts/utils/introspection/ERC165.sol\":{\"keccak256\":\"0x2d9dc2fe26180f74c11c13663647d38e259e45f95eb88f57b61d2160b0109d3e\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://81233d1f98060113d9922180bb0f14f8335856fe9f339134b09335e9f678c377\",\"dweb:/ipfs/QmWh6R35SarhAn4z2wH8SU456jJSYL2FgucfTFgbHJJN4E\"]},\"node_modules/@openzeppelin/contracts/utils/introspection/IERC165.sol\":{\"keccak256\":\"0x8891738ffe910f0cf2da09566928589bf5d63f4524dd734fd9cedbac3274dd5c\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://971f954442df5c2ef5b5ebf1eb245d7105d9fbacc7386ee5c796df1d45b21617\",\"dweb:/ipfs/QmadRjHbkicwqwwh61raUEapaVEtaLMcYbQZWs9gUkgj3u\"]}},\"version\":1}","metadata":{"compiler":{"version":"0.8.28+commit.7893614a"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"address","name":"ibcRouter","type":"address"},{"internalType":"uint64","name":"initialTrustedHeight","type":"uint64"},{"internalType":"uint64","name":"initialTrustedTimestamp","type":"uint64"},{"internalType":"bytes32","name":"initialTrustedStorageRoot","type":"bytes32"},{"internalType":"address[]","name":"initialTrustedValidators","type":"address[]"},{"internalType":"uint64","name":"trustingPeriod","type":"uint64"},{"internalType":"uint64","name":"maxClockDrift","type":"uint64"},{"internalType":"address","name":"roleManager","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"type":"error","name":"AccessControlBadConfirmation"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bytes32","name":"neededRole","type":"bytes32"}],"type":"error","name":"AccessControlUnauthorizedAccount"},{"inputs":[{"internalType":"uint64","name":"revisionHeight","type":"uint64"}],"type":"error","name":"ConflictingConsensusState"},{"inputs":[{"internalType":"uint64","name":"trustedTimestamp","type":"uint64"},{"internalType":"uint256","name":"currentTimestamp","type":"uint256"},{"internalType":"uint64","name":"trustingPeriod","type":"uint64"}],"type":"error","name":"ConsensusStateExpired"},{"inputs":[{"internalType":"uint64","name":"revisionHeight","type":"uint64"}],"type":"error","name":"ConsensusStateNotFound"},{"inputs":[{"internalType":"address","name":"signer","type":"address"}],"type":"error","name":"DuplicateCommitSealSigner"},{"inputs":[{"internalType":"address","name":"validator","type":"address"}],"type":"error","name":"DuplicateValidator"},{"inputs":[],"type":"error","name":"EmptyValidatorSet"},{"inputs":[{"internalType":"uint256","name":"currentTimestamp","type":"uint256"},{"internalType":"uint256","name":"headerTimestamp","type":"uint256"},{"internalType":"uint256","name":"maxClockDrift","type":"uint256"}],"type":"error","name":"HeaderFromFuture"},{"inputs":[{"internalType":"uint256","name":"actual","type":"uint256"},{"internalType":"uint256","name":"required","type":"uint256"}],"type":"error","name":"InsufficientTrustedValidatorOverlap"},{"inputs":[{"internalType":"uint256","name":"actual","type":"uint256"},{"internalType":"uint256","name":"required","type":"uint256"}],"type":"error","name":"InsufficientValidatorQuorum"},{"inputs":[],"type":"error","name":"InvalidCommitSeal"},{"inputs":[{"internalType":"bytes32","name":"expectedValue","type":"bytes32"},{"internalType":"bytes32","name":"actualValue","type":"bytes32"}],"type":"error","name":"InvalidCommitmentValue"},{"inputs":[{"internalType":"uint256","name":"actualDifficulty","type":"uint256"}],"type":"error","name":"InvalidDifficulty"},{"inputs":[{"internalType":"uint256","name":"length","type":"uint256"}],"type":"error","name":"InvalidECDSASignatureLength"},{"inputs":[{"internalType":"uint256","name":"itemsLength","type":"uint256"}],"type":"error","name":"InvalidExtraDataFormat"},{"inputs":[{"internalType":"uint256","name":"itemsLength","type":"uint256"}],"type":"error","name":"InvalidHeaderFormat"},{"inputs":[],"type":"error","name":"InvalidHeaderHeight"},{"inputs":[{"internalType":"bytes32","name":"actualMixHash","type":"bytes32"}],"type":"error","name":"InvalidMixHash"},{"inputs":[{"internalType":"bytes","name":"actualNonce","type":"bytes"}],"type":"error","name":"InvalidNonce"},{"inputs":[{"internalType":"bytes32","name":"actualOmmersHash","type":"bytes32"}],"type":"error","name":"InvalidOmmersHash"},{"inputs":[{"internalType":"uint256","name":"expectedLength","type":"uint256"},{"internalType":"uint256","name":"actualLength","type":"uint256"}],"type":"error","name":"InvalidPathLength"},{"inputs":[{"internalType":"uint64","name":"providedRevisionNumber","type":"uint64"}],"type":"error","name":"InvalidRevisionNumber"},{"inputs":[{"internalType":"address","name":"validator","type":"address"}],"type":"error","name":"InvalidValidatorAddress"},{"inputs":[{"internalType":"uint256","name":"length","type":"uint256"}],"type":"error","name":"InvalidValidatorAddressLength"},{"inputs":[{"internalType":"uint256","name":"expectedLength","type":"uint256"},{"internalType":"uint256","name":"actualLength","type":"uint256"}],"type":"error","name":"InvalidValueLength"},{"inputs":[],"type":"error","name":"UnsupportedMisbehaviour"},{"inputs":[{"internalType":"bytes32","name":"actualValue","type":"bytes32"}],"type":"error","name":"ValueExists"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32","indexed":true},{"internalType":"bytes32","name":"previousAdminRole","type":"bytes32","indexed":true},{"internalType":"bytes32","name":"newAdminRole","type":"bytes32","indexed":true}],"type":"event","name":"RoleAdminChanged","anonymous":false},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32","indexed":true},{"internalType":"address","name":"account","type":"address","indexed":true},{"internalType":"address","name":"sender","type":"address","indexed":true}],"type":"event","name":"RoleGranted","anonymous":false},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32","indexed":true},{"internalType":"address","name":"account","type":"address","indexed":true},{"internalType":"address","name":"sender","type":"address","indexed":true}],"type":"event","name":"RoleRevoked","anonymous":false},{"inputs":[],"stateMutability":"view","type":"function","name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"PROOF_SUBMITTER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"getClientState","outputs":[{"internalType":"bytes","name":"","type":"bytes"}]},{"inputs":[{"internalType":"uint64","name":"revisionHeight","type":"uint64"}],"stateMutability":"view","type":"function","name":"getConsensusState","outputs":[{"internalType":"bytes","name":"","type":"bytes"}]},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"stateMutability":"view","type":"function","name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}]},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"stateMutability":"nonpayable","type":"function","name":"grantRole"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"stateMutability":"view","type":"function","name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}]},{"inputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function","name":"misbehaviour"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"callerConfirmation","type":"address"}],"stateMutability":"nonpayable","type":"function","name":"renounceRole"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"stateMutability":"nonpayable","type":"function","name":"revokeRole"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"stateMutability":"view","type":"function","name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}]},{"inputs":[{"internalType":"bytes","name":"updateMsg","type":"bytes"}],"stateMutability":"nonpayable","type":"function","name":"updateClient","outputs":[{"internalType":"enum ILightClientMsgs.UpdateResult","name":"","type":"uint8"}]},{"inputs":[{"internalType":"struct ILightClientMsgs.MsgVerifyMembership","name":"msg_","type":"tuple","components":[{"internalType":"bytes","name":"proof","type":"bytes"},{"internalType":"struct IICS02ClientMsgs.Height","name":"proofHeight","type":"tuple","components":[{"internalType":"uint64","name":"revisionNumber","type":"uint64"},{"internalType":"uint64","name":"revisionHeight","type":"uint64"}]},{"internalType":"bytes[]","name":"path","type":"bytes[]"},{"internalType":"bytes","name":"value","type":"bytes"}]}],"stateMutability":"view","type":"function","name":"verifyMembership","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[{"internalType":"struct ILightClientMsgs.MsgVerifyNonMembership","name":"msg_","type":"tuple","components":[{"internalType":"bytes","name":"proof","type":"bytes"},{"internalType":"struct IICS02ClientMsgs.Height","name":"proofHeight","type":"tuple","components":[{"internalType":"uint64","name":"revisionNumber","type":"uint64"},{"internalType":"uint64","name":"revisionHeight","type":"uint64"}]},{"internalType":"bytes[]","name":"path","type":"bytes[]"}]}],"stateMutability":"view","type":"function","name":"verifyNonMembership","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]}],"devdoc":{"kind":"dev","methods":{"getClientState()":{"returns":{"_0":"The client state."}},"getRoleAdmin(bytes32)":{"details":"Returns the admin role that controls `role`. See {grantRole} and {revokeRole}. To change a role's admin, use {_setRoleAdmin}."},"grantRole(bytes32,address)":{"details":"Grants `role` to `account`. If `account` had not been already granted `role`, emits a {RoleGranted} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleGranted} event."},"hasRole(bytes32,address)":{"details":"Returns `true` if `account` has been granted `role`."},"renounceRole(bytes32,address)":{"details":"Revokes `role` from the calling account. Roles are often managed via {grantRole} and {revokeRole}: this function's purpose is to provide a mechanism for accounts to lose their privileges if they are compromised (such as when a trusted device is misplaced). If the calling account had been revoked `role`, emits a {RoleRevoked} event. Requirements: - the caller must be `callerConfirmation`. May emit a {RoleRevoked} event."},"revokeRole(bytes32,address)":{"details":"Revokes `role` from `account`. If `account` had been granted `role`, emits a {RoleRevoked} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleRevoked} event."},"supportsInterface(bytes4)":{"details":"Returns true if this contract implements the interface defined by `interfaceId`. See the corresponding https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[ERC section] to learn more about how these ids are created. This function call must use less than 30 000 gas."},"updateClient(bytes)":{"params":{"updateMsg":"The encoded update message e.g., an SP1 proof."},"returns":{"_0":"The result of the update operation"}},"verifyMembership((bytes,(uint64,uint64),bytes[],bytes))":{"details":"Notice that this message is not view, as it may update the client state for caching purposes.","params":{"msg_":"The membership message"},"returns":{"_0":"The unix timestamp of the verification height in the counterparty chain in seconds."}},"verifyNonMembership((bytes,(uint64,uint64),bytes[]))":{"details":"Notice that this message is not view, as it may update the client state for caching purposes.","params":{"msg_":"The membership message"},"returns":{"_0":"The unix timestamp of the verification height in the counterparty chain in seconds."}}},"version":1},"userdoc":{"kind":"user","methods":{"getClientState()":{"notice":"Returns the client state."},"updateClient(bytes)":{"notice":"Updating the client and consensus state"},"verifyMembership((bytes,(uint64,uint64),bytes[],bytes))":{"notice":"Querying the membership of a key-value pair"},"verifyNonMembership((bytes,(uint64,uint64),bytes[]))":{"notice":"Querying the non-membership of a key"}},"version":1}},"settings":{"remappings":["@openzeppelin-contracts/=node_modules/@openzeppelin/contracts/","@openzeppelin-upgradeable/=node_modules/@openzeppelin/contracts-upgradeable/","@openzeppelin/=node_modules/@openzeppelin/","@sp1-contracts/=node_modules/sp1-contracts/contracts/src/","@uniswap/permit2/=node_modules/@uniswap/permit2/","forge-std/=node_modules/forge-std/src/","sp1-contracts/=node_modules/sp1-contracts/"],"optimizer":{"enabled":true,"runs":10000},"metadata":{"bytecodeHash":"none"},"compilationTarget":{"contracts/light-clients/besu/BesuIBFT2LightClient.sol":"BesuIBFT2LightClient"},"evmVersion":"cancun","libraries":{},"viaIR":true},"sources":{"contracts/interfaces/ILightClient.sol":{"keccak256":"0x1caae9e4f741a86c0056d5f7713a35f3bd96db7a9fd52fc9f1cf79aad76a442f","urls":["bzz-raw://4a536db3b926560f69547c17e4f451a2631ddea0f42bd224c7fd8382d74429f6","dweb:/ipfs/QmcQ33kxcmmowXgMbQGTBgiKBjF7v8UiP4y73bB9hhDizC"],"license":"MIT"},"contracts/light-clients/besu/BesuIBFT2LightClient.sol":{"keccak256":"0x097eb9878e468b9277356596cbc1109e9f189e26b5bc44626d258c3cfa0b4c16","urls":["bzz-raw://61c05c9caa8a5eade32baa598422b48f2b095a2f2adfb490c23d49b3e962e8b7","dweb:/ipfs/QmQ1ksNug4KReKZuTNxpefJZ6RNh7yZc8PRVrZQBHCoLAU"],"license":"MIT"},"contracts/light-clients/besu/BesuLightClientBase.sol":{"keccak256":"0x44fd20d599cfed2298d6a26ec8584c5955b4c6b097d7b9f42d9ef7e462d7a4ad","urls":["bzz-raw://86ce26f4e3d6b4327680d93daf5b8a795fb5e76cf566bd9328988d4b5e170c7e","dweb:/ipfs/QmTkwvf1Xvasx3zpgcYVQa2VMEL1CXjrESwuV7vKNa3VhQ"],"license":"MIT"},"contracts/light-clients/besu/MPTProof.sol":{"keccak256":"0x232c01021016519bf2fdda5abfac7ab23f01e3c9f59c0233a5944d16a94b343a","urls":["bzz-raw://17387ba08707c70bc36df9a36a7f731d63db9f183b2675b7db35b9861c24c3b7","dweb:/ipfs/QmerMaj4tnVPwfdA69eVx9joJXQP72MR4KLudSpPf28NkZ"],"license":"Apache-2.0"},"contracts/light-clients/besu/RLPReader.sol":{"keccak256":"0xeb60cddae95fa2779d1e8f0d7a622737480ee67348ea0c6e65f13c93cfc9d5bb","urls":["bzz-raw://550fcc3d1527dd6a4f3621a72d7afc5c49dd5aa4b16992934a81c17dd0386a27","dweb:/ipfs/QmeF5UNemcyEeyU3y6Ru5bK4NG1v9xpWvp3J9WdXfsgkGa"],"license":"Apache-2.0"},"contracts/light-clients/besu/errors/IBesuLightClientErrors.sol":{"keccak256":"0x5b5fd8ec4ad07c713fb5337cfec9769e4d0fa30817bc237a98b2ce4cf155feac","urls":["bzz-raw://8fc013ed01d0e08590ee92f80f8089c18c334024d4d1a77a04ce3673b5d1e103","dweb:/ipfs/QmeWAn9JoVVsBin8JnvBLRP51QBCsM9m95bVrZoKFtkUfo"],"license":"MIT"},"contracts/light-clients/besu/msgs/IBesuLightClientMsgs.sol":{"keccak256":"0xbd6a5a6309d1076319f61820ae239848dcb4dca598240d5f9f927e02ed8b58c9","urls":["bzz-raw://ef5a28164d53832a52112a91747dbe84439a8003c489116425b7fd2d631425d9","dweb:/ipfs/QmbUqMt72DZFtfyupG9jQXEkQFGpVrUb4wQW3bNiUPV1AR"],"license":"MIT"},"contracts/msgs/IICS02ClientMsgs.sol":{"keccak256":"0xb5fdb25319d5c32b3f527982d45ec1e9bec5215515581aee034d853006ea01a0","urls":["bzz-raw://6b8939bf552c62c952a491008bcd9b59ab7dda20a9482bf93438e05793881542","dweb:/ipfs/QmfWmzNCp8bd4pP26Lfw5HHp4dSZnCDqZDjVN7SD8P7eDh"],"license":"MIT"},"contracts/msgs/ILightClientMsgs.sol":{"keccak256":"0xa0565e7748b8b3284d72e1aa6ef4cc8264fcaa5f4e0761d22d64686953db6378","urls":["bzz-raw://c4476010d7090bfaa74127526f2051c6bc82ff42a09b936e848880a1f15a6065","dweb:/ipfs/QmY87JgRsFQXSZdGXNjNHEJCkdTHzFXH4vZEJ3q7MnHuP8"],"license":"MIT"},"node_modules/@openzeppelin/contracts/access/AccessControl.sol":{"keccak256":"0x1a6b4f6b7798ab80929d491b89d5427a9b3338c0fd1acd0ba325f69c6f1646af","urls":["bzz-raw://7bb7f346c12a14dc622bc105ce3c47202fbc89f4b153a28a63bb68193297330c","dweb:/ipfs/QmagwF8P3bUBXwdo159ueEnY9dLSvEWwK24kk2op58egwG"],"license":"MIT"},"node_modules/@openzeppelin/contracts/access/IAccessControl.sol":{"keccak256":"0xbff9f59c84e5337689161ce7641c0ef8e872d6a7536fbc1f5133f128887aba3c","urls":["bzz-raw://b308f882e796f7b79c9502deacb0a62983035c6f6f4e962b319ba6a1f4a77d3d","dweb:/ipfs/QmaWCW7ahEQqFjwhSUhV7Ae7WhfNvzSpE7DQ58hvEooqPL"],"license":"MIT"},"node_modules/@openzeppelin/contracts/utils/Context.sol":{"keccak256":"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2","urls":["bzz-raw://6a708e8a5bdb1011c2c381c9a5cfd8a9a956d7d0a9dc1bd8bcdaf52f76ef2f12","dweb:/ipfs/Qmax9WHBnVsZP46ZxEMNRQpLQnrdE4dK8LehML1Py8FowF"],"license":"MIT"},"node_modules/@openzeppelin/contracts/utils/cryptography/ECDSA.sol":{"keccak256":"0x69f54c02b7d81d505910ec198c11ed4c6a728418a868b906b4a0cf29946fda84","urls":["bzz-raw://8e25e4bdb7ae1f21d23bfee996e22736fc0ab44cfabedac82a757b1edc5623b9","dweb:/ipfs/QmQdWQvB6JCP9ZMbzi8EvQ1PTETqkcTWrbcVurS7DKpa5n"],"license":"MIT"},"node_modules/@openzeppelin/contracts/utils/introspection/ERC165.sol":{"keccak256":"0x2d9dc2fe26180f74c11c13663647d38e259e45f95eb88f57b61d2160b0109d3e","urls":["bzz-raw://81233d1f98060113d9922180bb0f14f8335856fe9f339134b09335e9f678c377","dweb:/ipfs/QmWh6R35SarhAn4z2wH8SU456jJSYL2FgucfTFgbHJJN4E"],"license":"MIT"},"node_modules/@openzeppelin/contracts/utils/introspection/IERC165.sol":{"keccak256":"0x8891738ffe910f0cf2da09566928589bf5d63f4524dd734fd9cedbac3274dd5c","urls":["bzz-raw://971f954442df5c2ef5b5ebf1eb245d7105d9fbacc7386ee5c796df1d45b21617","dweb:/ipfs/QmadRjHbkicwqwwh61raUEapaVEtaLMcYbQZWs9gUkgj3u"],"license":"MIT"}},"version":1},"id":34} \ No newline at end of file +{"abi":[{"type":"constructor","inputs":[{"name":"ibcRouter","type":"address","internalType":"address"},{"name":"initialTrustedHeight","type":"uint64","internalType":"uint64"},{"name":"initialTrustedTimestamp","type":"uint64","internalType":"uint64"},{"name":"initialTrustedStorageRoot","type":"bytes32","internalType":"bytes32"},{"name":"initialTrustedValidators","type":"address[]","internalType":"address[]"},{"name":"trustingPeriod","type":"uint64","internalType":"uint64"},{"name":"maxClockDrift","type":"uint64","internalType":"uint64"},{"name":"roleManager","type":"address","internalType":"address"}],"stateMutability":"nonpayable"},{"type":"function","name":"DEFAULT_ADMIN_ROLE","inputs":[],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"type":"function","name":"PROOF_SUBMITTER_ROLE","inputs":[],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"type":"function","name":"getClientState","inputs":[],"outputs":[{"name":"","type":"bytes","internalType":"bytes"}],"stateMutability":"view"},{"type":"function","name":"getConsensusState","inputs":[{"name":"revisionHeight","type":"uint64","internalType":"uint64"}],"outputs":[{"name":"","type":"bytes","internalType":"bytes"}],"stateMutability":"view"},{"type":"function","name":"getRoleAdmin","inputs":[{"name":"role","type":"bytes32","internalType":"bytes32"}],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"type":"function","name":"grantRole","inputs":[{"name":"role","type":"bytes32","internalType":"bytes32"},{"name":"account","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"hasRole","inputs":[{"name":"role","type":"bytes32","internalType":"bytes32"},{"name":"account","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"misbehaviour","inputs":[{"name":"","type":"bytes","internalType":"bytes"}],"outputs":[],"stateMutability":"view"},{"type":"function","name":"renounceRole","inputs":[{"name":"role","type":"bytes32","internalType":"bytes32"},{"name":"callerConfirmation","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"revokeRole","inputs":[{"name":"role","type":"bytes32","internalType":"bytes32"},{"name":"account","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"supportsInterface","inputs":[{"name":"interfaceId","type":"bytes4","internalType":"bytes4"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"updateClient","inputs":[{"name":"updateMsg","type":"bytes","internalType":"bytes"}],"outputs":[{"name":"","type":"uint8","internalType":"enum ILightClientMsgs.UpdateResult"}],"stateMutability":"nonpayable"},{"type":"function","name":"verifyMembership","inputs":[{"name":"msg_","type":"tuple","internalType":"struct ILightClientMsgs.MsgVerifyMembership","components":[{"name":"proof","type":"bytes","internalType":"bytes"},{"name":"proofHeight","type":"tuple","internalType":"struct IICS02ClientMsgs.Height","components":[{"name":"revisionNumber","type":"uint64","internalType":"uint64"},{"name":"revisionHeight","type":"uint64","internalType":"uint64"}]},{"name":"path","type":"bytes[]","internalType":"bytes[]"},{"name":"value","type":"bytes","internalType":"bytes"}]}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"verifyNonMembership","inputs":[{"name":"msg_","type":"tuple","internalType":"struct ILightClientMsgs.MsgVerifyNonMembership","components":[{"name":"proof","type":"bytes","internalType":"bytes"},{"name":"proofHeight","type":"tuple","internalType":"struct IICS02ClientMsgs.Height","components":[{"name":"revisionNumber","type":"uint64","internalType":"uint64"},{"name":"revisionHeight","type":"uint64","internalType":"uint64"}]},{"name":"path","type":"bytes[]","internalType":"bytes[]"}]}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"event","name":"RoleAdminChanged","inputs":[{"name":"role","type":"bytes32","indexed":true,"internalType":"bytes32"},{"name":"previousAdminRole","type":"bytes32","indexed":true,"internalType":"bytes32"},{"name":"newAdminRole","type":"bytes32","indexed":true,"internalType":"bytes32"}],"anonymous":false},{"type":"event","name":"RoleGranted","inputs":[{"name":"role","type":"bytes32","indexed":true,"internalType":"bytes32"},{"name":"account","type":"address","indexed":true,"internalType":"address"},{"name":"sender","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"type":"event","name":"RoleRevoked","inputs":[{"name":"role","type":"bytes32","indexed":true,"internalType":"bytes32"},{"name":"account","type":"address","indexed":true,"internalType":"address"},{"name":"sender","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"type":"error","name":"AccessControlBadConfirmation","inputs":[]},{"type":"error","name":"AccessControlUnauthorizedAccount","inputs":[{"name":"account","type":"address","internalType":"address"},{"name":"neededRole","type":"bytes32","internalType":"bytes32"}]},{"type":"error","name":"ConflictingConsensusState","inputs":[{"name":"revisionHeight","type":"uint64","internalType":"uint64"}]},{"type":"error","name":"ConsensusStateExpired","inputs":[{"name":"trustedTimestamp","type":"uint64","internalType":"uint64"},{"name":"currentTimestamp","type":"uint256","internalType":"uint256"},{"name":"trustingPeriod","type":"uint64","internalType":"uint64"}]},{"type":"error","name":"ConsensusStateNotFound","inputs":[{"name":"revisionHeight","type":"uint64","internalType":"uint64"}]},{"type":"error","name":"DuplicateCommitSealSigner","inputs":[{"name":"signer","type":"address","internalType":"address"}]},{"type":"error","name":"DuplicateValidator","inputs":[{"name":"validator","type":"address","internalType":"address"}]},{"type":"error","name":"EmptyValidatorSet","inputs":[]},{"type":"error","name":"HeaderFromFuture","inputs":[{"name":"currentTimestamp","type":"uint256","internalType":"uint256"},{"name":"headerTimestamp","type":"uint256","internalType":"uint256"},{"name":"maxClockDrift","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"InsufficientTrustedValidatorOverlap","inputs":[{"name":"actual","type":"uint256","internalType":"uint256"},{"name":"required","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"InsufficientValidatorQuorum","inputs":[{"name":"actual","type":"uint256","internalType":"uint256"},{"name":"required","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"InvalidCommitSeal","inputs":[]},{"type":"error","name":"InvalidCommitmentValue","inputs":[{"name":"expectedValue","type":"bytes32","internalType":"bytes32"},{"name":"actualValue","type":"bytes32","internalType":"bytes32"}]},{"type":"error","name":"InvalidDifficulty","inputs":[{"name":"actualDifficulty","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"InvalidECDSASignatureLength","inputs":[{"name":"length","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"InvalidExtraDataFormat","inputs":[{"name":"itemsLength","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"InvalidHeaderFormat","inputs":[{"name":"itemsLength","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"InvalidHeaderHeight","inputs":[]},{"type":"error","name":"InvalidMixHash","inputs":[{"name":"actualMixHash","type":"bytes32","internalType":"bytes32"}]},{"type":"error","name":"InvalidNonce","inputs":[{"name":"actualNonce","type":"bytes","internalType":"bytes"}]},{"type":"error","name":"InvalidOmmersHash","inputs":[{"name":"actualOmmersHash","type":"bytes32","internalType":"bytes32"}]},{"type":"error","name":"InvalidPathLength","inputs":[{"name":"expectedLength","type":"uint256","internalType":"uint256"},{"name":"actualLength","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"InvalidRevisionNumber","inputs":[{"name":"providedRevisionNumber","type":"uint64","internalType":"uint64"}]},{"type":"error","name":"InvalidValidatorAddress","inputs":[{"name":"validator","type":"address","internalType":"address"}]},{"type":"error","name":"InvalidValidatorAddressLength","inputs":[{"name":"length","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"InvalidValueLength","inputs":[{"name":"expectedLength","type":"uint256","internalType":"uint256"},{"name":"actualLength","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"UnsupportedMisbehaviour","inputs":[]},{"type":"error","name":"ValueExists","inputs":[{"name":"actualValue","type":"bytes32","internalType":"bytes32"}]}],"bytecode":{"object":"0x6080604052346103c0576138d580380380610019816103c4565b928339810190610100818303126103c057610033816103e9565b61003f602083016103fd565b9061004c604084016103fd565b60608401516080850151909291906001600160401b0381116103c05785019286601f850112156103c0578351966001600160401b038811610376578760051b9460206100998188016103c4565b809a81520190602082978201019283116103c057602001905b8282106103a8575050506100c860a087016103fd565b956100e160e06100da60c084016103fd565b92016103e9565b956001600160401b03169081156103995788511561038a575f5b89518110156101b1576001600160a01b03610116828c610411565b51161561018a575f5b81811061012f57506001016100fb565b6001600160a01b03610141828d610411565b51166001600160a01b03610155848e610411565b5116146101645760010161011f565b6001600160a01b03610176838d610411565b511663107f863360e21b5f5260045260245ffd5b6001600160a01b039061019d908b610411565b51166359bff38760e01b5f5260045260245ffd5b5060408051979896978a979181016001600160401b03811182821017610376576040525f81526020810190848252604051926080840198848a1060018060401b038b1117610376576040998a526001600160a01b031680855260208086018490526001600160401b03928316868c01819052878416606090970196909652600180546001600160a01b031916909217825592516002805495516001600160801b031996871692851692909217918c1b6fffffffffffffffff000000000000000090811692909217815560038054909616909617968b1b16959095179092555f948552600490529590922080546001600160401b03191694861694909417845583019190915592519392019190831161037657680100000000000000008311610376578154838355808410610350575b50905f5260205f205f5b83811061033357846001600160a01b03811661031a575061030961052f565b505b60405161328390816105b28239f35b8061032761032d92610439565b506104af565b5061030b565b82516001600160a01b0316818301556020909201916001016102ea565b825f528360205f2091820191015b81811061036b57506102e0565b5f815560010161035e565b634e487b7160e01b5f52604160045260245ffd5b63339e1ffb60e01b5f5260045ffd5b6359d119e360e01b5f5260045ffd5b602080916103b5846103e9565b8152019101906100b2565b5f80fd5b6040519190601f01601f191682016001600160401b0381118382101761037657604052565b51906001600160a01b03821682036103c057565b51906001600160401b03821682036103c057565b80518210156104255760209160051b010190565b634e487b7160e01b5f52603260045260245ffd5b6001600160a01b0381165f9081525f5160206138b55f395f51905f52602052604090205460ff166104aa576001600160a01b03165f8181525f5160206138b55f395f51905f5260205260408120805460ff191660011790553391905f5160206138355f395f51905f528180a4600190565b505f90565b6001600160a01b0381165f9081525f5160206138555f395f51905f52602052604090205460ff166104aa576001600160a01b03165f8181525f5160206138555f395f51905f5260205260408120805460ff191660011790553391905f5160206138955f395f51905f52905f5160206138355f395f51905f529080a4600190565b5f80525f5160206138555f395f51905f526020525f5160206138755f395f51905f525460ff166105ad575f8080525f5160206138555f395f51905f526020525f5160206138755f395f51905f52805460ff1916600117905533905f5160206138955f395f51905f525f5160206138355f395f51905f528280a4600190565b5f9056fe60806040526004361015610011575f80fd5b5f3560e01c806301ffc9a7146100f45780630bece356146100ef578063248a9ca3146100ea5780632f2ff15d146100e557806336568abe146100e05780634d6d9ffb146100db5780635972185a146100d6578063682ed5f0146100d157806391d14854146100cc578063a217fddf146100c7578063d547741f146100c2578063ddba6537146100bd578063edce8bdc146100b85763ef913a4b146100b3575f80fd5b610a16565b61095e565b61088b565b61085c565b610842565b6107f4565b6105e6565b6105ac565b6103ac565b610350565b61031a565b6102b5565b610217565b34610195576020600319360112610195576004357fffffffff00000000000000000000000000000000000000000000000000000000811680910361019557807f7965db0b000000000000000000000000000000000000000000000000000000006020921490811561016b575b506040519015158152f35b7f01ffc9a7000000000000000000000000000000000000000000000000000000009150145f610160565b5f80fd5b9060206003198301126101955760043567ffffffffffffffff811161019557826023820112156101955780600401359267ffffffffffffffff84116101955760248483010111610195576024019190565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b346101955761028161022836610199565b5f80527f4c48d1d2b0f4f7485fc28e3db22341d96a20aa29e6efa8149da9751603abd4e06020527f6e0c24a6e293ff9b755263dbaa15ba3796b0b8d3fe17cfb4ddf8143b268eac475490919060ff161561029957610d9d565b6040516003821015610294576020918152f35b6101ea565b6102a1611287565b610d9d565b90816020910312610195573590565b346101955760206003193601126101955760206102df6004355f525f602052600160405f20015490565b604051908152f35b6003196040910112610195576004359060243573ffffffffffffffffffffffffffffffffffffffff811681036101955790565b346101955761034e61032b366102e7565b90610349610344825f525f602052600160405f20015490565b61130f565b6121b3565b005b346101955761035e366102e7565b3373ffffffffffffffffffffffffffffffffffffffff8216036103845761034e9161228a565b7f6697b232000000000000000000000000000000000000000000000000000000005f5260045ffd5b346101955760206003193601126101955760043567ffffffffffffffff8111610195578060040160806003198336030112610195575f80527f4c48d1d2b0f4f7485fc28e3db22341d96a20aa29e6efa8149da9751603abd4e060205260ff7f6e0c24a6e293ff9b755263dbaa15ba3796b0b8d3fe17cfb4ddf8143b268eac4754161561059f575b61044761044260248401611192565b61137c565b60648201916001610458848461119c565b90500361056157906104a96104966104a261049d61049661049061048961048460446104e09a01611192565b611b30565b988761119c565b9061126e565b3691610b4d565b61235f565b928061121d565b906001840154906040516104d7816104c960208201948560209181520190565b03601f198101835282610afd565b519020916123ed565b805161051f5761051b61050b6104fe845467ffffffffffffffff1690565b67ffffffffffffffff1690565b6040519081529081906020820190565b0390f35b61053361052e61055e92612532565b61255f565b7fd039601e000000000000000000000000000000000000000000000000000000005f52600452602490565b5ffd5b61055e61056e848461119c565b7f88b3170e000000000000000000000000000000000000000000000000000000005f52600160045260245250604490565b6105a7611287565b610433565b34610195575f6003193601126101955760206040517fbd893629a699470e4ec82a5715bb4981fdaacc5d0a728bf5f55b801d8f4ef10b8152f35b346101955760206003193601126101955760043567ffffffffffffffff8111610195578060040160a06003198336030112610195575f80527f4c48d1d2b0f4f7485fc28e3db22341d96a20aa29e6efa8149da9751603abd4e060205260ff7f6e0c24a6e293ff9b755263dbaa15ba3796b0b8d3fe17cfb4ddf8143b268eac475416156107e7575b61067c61044260248401611192565b6064820191600161068d848461119c565b90500361056157608481019060206106a5838561121d565b9050036107a957906106f46104966106ed6106e56106de61049d6104966104906106d761048460446107149c01611192565b9b8b61119c565b948761121d565b8101906102a6565b948061121d565b906001850154906040516104d7816104c960208201948560209181520190565b8051156107755761052e61072791612532565b908082036107475761051b61050b6104fe855467ffffffffffffffff1690565b7f56ed1b63000000000000000000000000000000000000000000000000000000005f5260045260245260445ffd5b61055e827f56ed1b63000000000000000000000000000000000000000000000000000000005f52906044916004525f602452565b61055e6107b6838561121d565b7f24fadac8000000000000000000000000000000000000000000000000000000005f52602060045260245250604490565b6107ef611287565b61066d565b3461019557602060ff610836610809366102e7565b905f525f845260405f209073ffffffffffffffffffffffffffffffffffffffff165f5260205260405f2090565b54166040519015158152f35b34610195575f6003193601126101955760206040515f8152f35b346101955761034e61086d366102e7565b90610886610344825f525f602052600160405f20015490565b61228a565b346101955761089936610199565b50505f80527f4c48d1d2b0f4f7485fc28e3db22341d96a20aa29e6efa8149da9751603abd4e06020527f6e0c24a6e293ff9b755263dbaa15ba3796b0b8d3fe17cfb4ddf8143b268eac475460ff1615610915575b7f2c1ed462000000000000000000000000000000000000000000000000000000005f5260045ffd5b61091d611287565b6108ed565b67ffffffffffffffff81160361019557565b601f19601f602060409481855280519182918282880152018686015e5f8582860101520116010190565b346101955760206003193601126101955761097e60043561048481610922565b67ffffffffffffffff8154166002600183015492019060405192608084019160208501526040840152606080840152815480915260a08301915f5260205f20905f5b8181106109ea5761051b856109de818703601f198101835282610afd565b60405191829182610934565b825473ffffffffffffffffffffffffffffffffffffffff168452602090930192600192830192016109c0565b34610195575f6003193601126101955761051b60405173ffffffffffffffffffffffffffffffffffffffff60015416602082015267ffffffffffffffff600254818116604084015260401c16606082015267ffffffffffffffff600354818116608084015260401c1660a082015260a081526109de60c082610afd565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b6060810190811067ffffffffffffffff821117610adc57604052565b610a93565b6040810190811067ffffffffffffffff821117610adc57604052565b90601f601f19910116810190811067ffffffffffffffff821117610adc57604052565b60405190610b2f604083610afd565b565b67ffffffffffffffff8111610adc57601f01601f191660200190565b929192610b5982610b31565b91610b676040519384610afd565b829481845281830111610195578281602093845f960137010152565b9080601f8301121561019557816020610b9e93359101610b4d565b90565b6020818303126101955780359067ffffffffffffffff8211610195570180820391608083126101955760405192610bd784610ac0565b823567ffffffffffffffff811161019557604091610bfa84601f19938701610b83565b8652011261019557604051610c0e81610ae1565b6020830135610c1c81610922565b81526040830135610c2c81610922565b60208201526020840152606082013567ffffffffffffffff811161019557610c549201610b83565b604082015290565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b9060018201809211610c9757565b610c5c565b60c001908160c011610c9757565b60f701908160f711610c9757565b6080019081608011610c9757565b60b701908160b711610c9757565b91908201809211610c9757565b908160011b9180830460021490151715610c9757565b81519167ffffffffffffffff8311610adc57680100000000000000008311610adc578154838355808410610d77575b506020610d389101915f5260205f2090565b5f5b838110610d475750505050565b6001906020610d6a855173ffffffffffffffffffffffffffffffffffffffff1690565b9401938184015501610d3a565b825f528360205f2091820191015b818110610d925750610d26565b5f8155600101610d85565b610da991810190610ba1565b9060208201610dc461044282515167ffffffffffffffff1690565b610dce8351611614565b92606084019367ffffffffffffffff610def865167ffffffffffffffff1690565b161561116a5760035491604083901c67ffffffffffffffff1693610e1d67ffffffffffffffff861642610cd4565b9460a0840195610e35875167ffffffffffffffff1690565b9067ffffffffffffffff82161161112b5750505160200151610e7290610e649067ffffffffffffffff16611b30565b9367ffffffffffffffff1690565b67ffffffffffffffff81168015159081611102575b506110ad575090610ef591610eb66002610eae610ea385611b87565b60e086015190611ca1565b950185611ea7565b610ec660c0830194855190611fcc565b60406080610ee960015473ffffffffffffffffffffffffffffffffffffffff1690565b9301519101519161206f565b610f22610f0a865167ffffffffffffffff1690565b67ffffffffffffffff165f52600460205260405f2090565b610f376104fe825467ffffffffffffffff1690565b61103b5750916002610fb5928694610fa8610f73610f64610f0a610fc39a9b5167ffffffffffffffff1690565b955167ffffffffffffffff1690565b859067ffffffffffffffff167fffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000825416179055565b6001840155519101610cf7565b5167ffffffffffffffff1690565b600254610fdc9060401c67ffffffffffffffff166104fe565b67ffffffffffffffff821611610ff157505f90565b611037907fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff6fffffffffffffffff00000000000000006002549260401b16911617600255565b5f90565b91611051611059945167ffffffffffffffff1690565b9051926120e5565b6110a75761055e611072835167ffffffffffffffff1690565b7fc1aea5f7000000000000000000000000000000000000000000000000000000005f5267ffffffffffffffff16600452602490565b60029150565b61055e906110c3855467ffffffffffffffff1690565b7feae35725000000000000000000000000000000000000000000000000000000005f5267ffffffffffffffff9081166004524260245216604452606490565b9050611123429161111e6104fe885467ffffffffffffffff1690565b610cd4565b11155f610e87565b7f9b772277000000000000000000000000000000000000000000000000000000005f524260045267ffffffffffffffff9081166024521660445260645ffd5b7f59d119e3000000000000000000000000000000000000000000000000000000005f5260045ffd5b35610b9e81610922565b9035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe181360301821215610195570180359067ffffffffffffffff821161019557602001918160051b3603831361019557565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b9035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe181360301821215610195570180359067ffffffffffffffff82116101955760200191813603831361019557565b9015611282578061127e9161121d565b9091565b6111f0565b335f9081527f4c48d1d2b0f4f7485fc28e3db22341d96a20aa29e6efa8149da9751603abd4e0602052604090205460ff16156112bf57565b7fe2517d3f000000000000000000000000000000000000000000000000000000005f52336004527fbd893629a699470e4ec82a5715bb4981fdaacc5d0a728bf5f55b801d8f4ef10b60245260445ffd5b805f525f60205260ff6113433360405f209073ffffffffffffffffffffffffffffffffffffffff165f5260205260405f2090565b54161561134d5750565b7fe2517d3f000000000000000000000000000000000000000000000000000000005f523360045260245260445ffd5b67ffffffffffffffff168061138e5750565b7f3ce598a9000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b60405190610100820182811067ffffffffffffffff821117610adc57604052606060e0838281528260208201528260408201525f838201525f60808201525f60a08201528260c08201520152565b8051600110156112825760400190565b805160071015611282576101000190565b8051600d1015611282576101c00190565b8051600e1015611282576101e00190565b805160081015611282576101200190565b8051600310156112825760800190565b8051600b1015611282576101800190565b8051600c1015611282576101a00190565b8051600410156112825760a00190565b8051156112825760200190565b8051600210156112825760600190565b805160101015611282576102200190565b80518210156112825760209160051b010190565b67ffffffffffffffff8111610adc5760051b60200190565b90611501826114df565b61150e6040519182610afd565b828152601f1961151e82946114df565b0190602036910137565b90602082519201517fffffffffffffffffffffffffffffffffffffffff00000000000000000000000081169260148110611560575050565b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000929350829060140360031b1b161690565b60405160a091906115a38382610afd565b6004815291601f1901825f5b8281106115bb57505050565b8060606020809385010152016115af565b906115d6826114df565b6115e36040519182610afd565b828152601f196115f382946114df565b01905f5b82811061160357505050565b8060606020809385010152016115f7565b61163061162b6116226113b9565b92808452612532565b6125a1565b602082019080825251600f8110611b0557507f1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d493476116766116708351611407565b5161266c565b03611aca57600161169061168a8351611417565b5161255f565b03611a8f577f63746963616c2062797a616e74696e65206661756c7420746f6c6572616e63656116c36116708351611428565b03611a54576116db6116d58251611439565b51612688565b80516008811490811591611a24575b506119ea575061162b61175d6116d5836117216117106104fe61168a611762985161144a565b67ffffffffffffffff166060880152565b61172e611670825161145b565b60808701526117576117466104fe61168a845161146b565b67ffffffffffffffff1660a0880152565b5161147c565b612532565b90604081019180835251600581036119bf57506117886117828351611407565b516125a1565b908151156119975761179a82516114f7565b9360c082019485525f5b8351811015611933576117ba6116d582866114cb565b80516014810361190857506117d16117d791611528565b60601c90565b73ffffffffffffffffffffffffffffffffffffffff811680156118c6575f5b8381106118325750509061182c600192611811838a516114cb565b9073ffffffffffffffffffffffffffffffffffffffff169052565b016117a4565b8161187761185e611844848d516114cb565b5173ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff1690565b14611884576001016117f6565b7f41fe18cc000000000000000000000000000000000000000000000000000000005f5273ffffffffffffffffffffffffffffffffffffffff831660045260245ffd5b7f59bff387000000000000000000000000000000000000000000000000000000005f5273ffffffffffffffffffffffffffffffffffffffff821660045260245ffd5b7f83e46ad2000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b509261178291945061194692505161148d565b61195081516115cc565b9260e081019384525f5b8251811015611991578061198a816119776116d5600195886114cb565b88519061198483836114cb565b526114cb565b500161195a565b50925050565b7f339e1ffb000000000000000000000000000000000000000000000000000000005f5260045ffd5b7f30c6792a000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b611a20906040519182917fd5edd2a500000000000000000000000000000000000000000000000000000000835260048301610934565b0390fd5b7f011b4d03dd8c01f1049143cf9c4c817e4b167f1d1b83e5c6f0f10d89ba1e7bce9150602083012014155f6116ea565b611a6461167061055e9251611428565b7fa19e609c000000000000000000000000000000000000000000000000000000005f52600452602490565b611a9f61168a61055e9251611417565b7ff71b722f000000000000000000000000000000000000000000000000000000005f52600452602490565b611ada61167061055e9251611407565b7fb8120dca000000000000000000000000000000000000000000000000000000005f52600452602490565b7fbc277732000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b67ffffffffffffffff1690815f52600460205260405f209167ffffffffffffffff83541615611b5c5750565b7ff761631b000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b6020611c26611b94611592565b611c0d611bab60408601611bb1611bab825161149d565b51612f88565b611bba8561149d565b52611bc48461149d565b50611bd2611bab8251611407565b611bdb85611407565b52611be584611407565b50611bf3611bab82516114aa565b611bfc856114aa565b52611c06846114aa565b505161145b565b611c168261145b565b52611c208161145b565b5061275e565b910190611c348251516115cc565b905f5b83518051821015611c8a579080600192600c82145f14611c78575050611c5c8361280f565b611c6682866114cb565b52611c7181856114cb565b5001611c37565b611c8591611bab916114cb565b611c5c565b505050611c97915061275e565b6020815191012090565b919091611cae83516114f7565b925f5b8151811015611e9457611cc481836114cb565b51805160418103611e69575080601b60ff611d13611d0d611ce7611d20966127ee565b517fff000000000000000000000000000000000000000000000000000000000000001690565b60f81c90565b1610611e16575b84613036565b50611d2a81612889565b15801590611df8575b611dd05773ffffffffffffffffffffffffffffffffffffffff81165f5b838110611d7057505090611d6a60019261181183896114cb565b01611cb1565b81611d8161185e611844848c6114cb565b14611d8e57600101611d50565b7f33af0d5f000000000000000000000000000000000000000000000000000000005f5273ffffffffffffffffffffffffffffffffffffffff831660045260245ffd5b7f09cb44e6000000000000000000000000000000000000000000000000000000005f5260045ffd5b5073ffffffffffffffffffffffffffffffffffffffff811615611d33565b611e58611e30611e2b611d0d611ce7856127ee565b612877565b60f81b7fff000000000000000000000000000000000000000000000000000000000000001690565b5f1a611e63826127ee565b53611d1a565b7ff2db9ce1000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b505050565b5f198114610c975760010190565b905f915f5b8151811015611f0057611edf73ffffffffffffffffffffffffffffffffffffffff611ed783856114cb565b511684612893565b611eec575b600101611eac565b92611ef8600191611e99565b939050611ee4565b50506003611f0f915404610c89565b90818110611f1b575050565b7fe2dcb1b9000000000000000000000000000000000000000000000000000000005f5260045260245260445ffd5b905f198201918211610c9757565b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff408201918211610c9757565b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff808201918211610c9757565b6020039060208211610c9757565b91908203918211610c9757565b905f915f5b81518110156120255761200473ffffffffffffffffffffffffffffffffffffffff611ffc83856114cb565b5116846128ea565b612011575b600101611fd1565b9261201d600191611e99565b939050612009565b50505190600382048203918211610c9757818110612041575050565b7f7818f4e4000000000000000000000000000000000000000000000000000000005f5260045260245260445ffd5b6120b99261162b9261175d926040517fffffffffffffffffffffffffffffffffffffffff000000000000000000000000602082019260601b168252601481526104d7603482610afd565b805160021015611282576060610b9e91015161266c565b8054821015611282575f5260205f2001905f90565b919067ffffffffffffffff80612103855467ffffffffffffffff1690565b9216911614908115916121a4575b5061219e5760020190815481510361219e575f5b81518110156121965761215b61213b82856120d0565b905473ffffffffffffffffffffffffffffffffffffffff9160031b1c1690565b73ffffffffffffffffffffffffffffffffffffffff61218061185e61184485876114cb565b91160361218f57600101612125565b5050505f90565b505050600190565b50505f90565b9050600182015414155f612111565b805f525f60205260ff6121e78360405f209073ffffffffffffffffffffffffffffffffffffffff165f5260205260405f2090565b541661219e57805f525f60205261221f8260405f209073ffffffffffffffffffffffffffffffffffffffff165f5260205260405f2090565b60017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0082541617905573ffffffffffffffffffffffffffffffffffffffff339216907f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d5f80a4600190565b805f525f60205260ff6122be8360405f209073ffffffffffffffffffffffffffffffffffffffff165f5260205260405f2090565b54161561219e57805f525f6020526122f78260405f209073ffffffffffffffffffffffffffffffffffffffff165f5260205260405f2090565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00815416905573ffffffffffffffffffffffffffffffffffffffff339216907ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b5f80a4600190565b60208151910120604051602081019182527f1260944489272988d9df285149b5aa1b0f48f2136d6f416159f840a3e07476006040820152604081526123a5606082610afd565b51902090565b604051906123ba602083610afd565b5f808352366020840137565b906123d082610b31565b6123dd6040519182610afd565b828152601f1961151e8294610b31565b61162b61242f919493946124016020610b31565b9561240f6040519788610afd565b6020875261241d6020610b31565b601f1960208901910136823752612532565b9061243a8451610ce1565b918451151580612512575b61244e90612558565b61246061245b5f85611fbf565b6123c6565b925f19015f5b81811061247a575050610b9e939450612a5e565b806124fc600f6124bf6124f6611d0d611ce78d61249960029960011c90565b908d6124f08a6124e88a6124bf6124b6611d0d611ce78a8a6127fe565b60041c600f1690565b1660f81b7fff000000000000000000000000000000000000000000000000000000000000001690565b5f1a926127fe565b536127fe565b60ff1690565b5f1a61250b60018301886127fe565b5301612466565b506001612445565b6040519061252782610ae1565b5f6020838281520152565b61253a61251a565b5060208151916040519261254d84610ae1565b835201602082015290565b1561019557565b80518015159081612595575b50156101955761257a90612d34565b90519060208110612589575090565b6020036101000a900490565b6021915011155f61256b565b6125aa81612d60565b15610195576125b881612d80565b6125c1816114df565b916125cf6040519384610afd565b818352601f196125de836114df565b015f5b81811061265557505060206126019101516125fb81612de1565b90610cd4565b5f905b8282106126115750505090565b61264d81612620600193612e4c565b90612629610b20565b82815281602082015261263c86896114cb565b5261264785886114cb565b50610cd4565b910190612604565b60209061266061251a565b828288010152016125e1565b6021815103610195576020015160018101809111610c97575190565b8051156101955761269b610b9e91612d34565b6126a7819392936123c6565b928360200190612f15565b805191908290602001825e015f815290565b610b2f906126e66126e0949360405195869360208501906126b2565b906126b2565b03601f198101845283610afd565b6001907fff00000000000000000000000000000000000000000000000000000000000000610b9e949316815201906126b2565b916001610b9e94937fff000000000000000000000000000000000000000000000000000000000000006126e09416815201906126b2565b5f9060605b815183101561278b5761278360019161277c85856114cb565b51906126c4565b920191612763565b9150508051603881106127ca5750610b9e6127a68251612fb4565b916104c96127ba611e306124f68651610caa565b9160405194859360208501612727565b6127dc611e306124f6610b9e93610c9c565b6104c9604051938492602084016126f4565b8051604010156112825760600190565b908151811015611282570160200190565b60018151148061285c575b610b9e5780516038811061284a5750610b9e6128368251612fb4565b916104c96127ba611e306124f68651610cc6565b6127dc611e306124f6610b9e93610cb8565b50608060ff612870611d0d611ce78561149d565b161061281a565b60ff601b9116019060ff8211610c9757565b6004111561029457565b905f5b825481101561218f5773ffffffffffffffffffffffffffffffffffffffff6128be82856120d0565b90549060031b1c1673ffffffffffffffffffffffffffffffffffffffff83161461219657600101612896565b905f5b825181101561218f5773ffffffffffffffffffffffffffffffffffffffff61291582856114cb565b511673ffffffffffffffffffffffffffffffffffffffff831614612196576001016128ed565b91906129478351610ce1565b908351151580612a54575b61295b90612558565b61296861245b8284611fbf565b9381926001808416146129f2575b5f19869101935b84811061298b575050505050565b836129e960016129df600f6124bf6124f6611d0d611ce78b60029b6129d86129cb886124bf8f611d0d611ce76129c46124b69360011c90565b80996127fe565b9b8d03809c5f1a926127fe565b538c6127fe565b5f1a9201896127fe565b5301859061297d565b92507f0f00000000000000000000000000000000000000000000000000000000000000612a316124f6611d0d611ce7612a2b8760011c90565b866127fe565b60f81b165f1a612a408661149d565b535f19612a4c83611e99565b939050612976565b5081811115612952565b915f915f612a6a61251a565b50845115612cfb5790935f915b81518310156101955782158080612ce5575b61019557159081612cc8575b5061019557612aa761178283836114cb565b948551600281145f14612ba45750612ac9612ac46116d58861149d565b6130cb565b95612adf612ad8888884613138565b8092610cd4565b965111612b865715612b165750612af69051611f49565b11610195575111612b0d576116d5610b9e91611407565b50610b9e6123ab565b919094612b238651611f49565b82146101955780612b45612b41612b3b600194611407565b51612d60565b1590565b15612b6757612b56612b5c91611407565b516130bd565b915b01919490612a77565b612b73612b8091611407565b5160208101519051902090565b91612b5e565b505091509250612b97915051611f49565b1161019557610b9e6123ab565b929491939192601103612c695781518314612c4b57612bd5612bcf6124f6611d0d611ce787876127fe565b93610c89565b92601081101561019557612bf2612bec82896114cb565b516130a7565b15612c145750505050612c0791925051611f49565b0361019557610b9e6123ab565b86612c2c612b41612b3b84600196989a97999b6114cb565b15612c3e57612b8091612b56916114cb565b612b8091612b73916114cb565b505050612c589051611f49565b03610195576116d5610b9e916114ba565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f696e76616c6964206e6f6465206c656e677468000000000000000000000000006044820152606490fd5b9050612cdd612cd784846114cb565b51613070565b14155f612a95565b50612cf3612b7385856114cb565b871415612a89565b509050612d2c92507f56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421915014612558565b610b9e6123ab565b906020820191612d448351612de1565b925190838201809211610c975751928303928311610c97579190565b805115612d7b57602060c0910151515f1a1061103757600190565b505f90565b805115612d7b575f9060208101908151612d9981612de1565b8101809111610c9757915190518101809111610c975791905b828110612dbf5750905090565b612dc881612e4c565b8101809111610c9757612ddb9091611e99565b90612db2565b515f1a6080811015612df257505f90565b60b881108015612e36575b15612e085750600190565b60c0811015612e2757610b9e90612e229060b75b90611fbf565b610c89565b610b9e90612e229060f7612e1c565b5060c08110158015612dfd575060f88110612dfd565b80515f1a906080821015612e61575050600190565b60b8821015612e775750612e22610b9e91611f84565b60c0821015612eb85760010151602082900360b7016101000a9004017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff4a0190565b60f8821015612ece5750612e22610b9e91611f57565b60010151602082900360f7016101000a9004017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0a0190565b601f8111610c97576101000a90565b90918015611e94575b6020811015612f585780612f3157505050565b612f45612f40612f4a92611fb1565b612f06565b611f49565b905182518216911916179052565b91908051825260208101809111610c97579060208101809111610c975791601f19810190811115612f1e57610c5c565b612f9281516123c6565b90815115612fb057806020610b9e9201519051908360200190612f15565b5090565b5f81805b6130225750612fc6816123c6565b91815b612fd257505090565b612fdb82611f49565b61300d7fff000000000000000000000000000000000000000000000000000000000000008360f81b165f1a91856127fe565b5360081c908015610c97575f19019081612fc9565b9061302c90611e99565b9060081c80612fb8565b81519190604183036130665761305f9250602082015190606060408401519301515f1a906131dc565b9192909190565b50505f9160029190565b80516020811015613088575060208101519051902090565b90602001512060405160208101918252602081526123a5604082610afd565b6001815103612d7b5760200151515f1a60801490565b6130c690612d34565b902090565b9081511561019557600f6130e76124b6611d0d611ce78661149d565b16806130fa5750610b9e60025f9361293b565b6001810361310f5750610b9e60015f9361293b565b600281036131255750610b9e600260019361293b565b60030361019557610b9e6001809361293b565b91905f5b838101808211610c975782518110806131d2575b156131ca576131807fff0000000000000000000000000000000000000000000000000000000000000091846127fe565b51167fff000000000000000000000000000000000000000000000000000000000000006131ad83866127fe565b511690036131c3576131be90611e99565b61313c565b9250505090565b509250505090565b5083518210613150565b91907f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0841161326b579160209360809260ff5f9560405194855216868401526040830152606082015282805260015afa15613260575f5173ffffffffffffffffffffffffffffffffffffffff81161561325657905f905f90565b505f906001905f90565b6040513d5f823e3d90fd5b5050505f916003919056fea164736f6c634300081c000a2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d4c48d1d2b0f4f7485fc28e3db22341d96a20aa29e6efa8149da9751603abd4e06e0c24a6e293ff9b755263dbaa15ba3796b0b8d3fe17cfb4ddf8143b268eac47bd893629a699470e4ec82a5715bb4981fdaacc5d0a728bf5f55b801d8f4ef10bad3228b676f7d3cd4284a5443f17f1962b36e491b30a40b2405849e597ba5fb5","sourceMap":"235:2275:34:-:0;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;235:2275:34;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;235:2275:34;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;:::i;:::-;;-1:-1:-1;;;;;235:2275:34;;3945:25:35;;3941:84;;235:2275:34;;17599:22:35;17595:79;;-1:-1:-1;17726:3:35;235:2275:34;;17703:21:35;;;;;-1:-1:-1;;;;;17749:13:35;;;;:::i;:::-;235:2275:34;;17749:27:35;17745:111;;-1:-1:-1;17889:5:35;;;;;;17726:3;235:2275:34;;17688:13:35;;17896:3;-1:-1:-1;;;;;17923:13:35;;;;:::i;:::-;235:2275:34;;-1:-1:-1;;;;;17940:13:35;235:2275:34;;17940:13:35;:::i;:::-;235:2275:34;;17923:30:35;17919:117;;235:2275:34;;17874:13:35;;17919:117;-1:-1:-1;;;;;18003:13:35;235:2275:34;;18003:13:35;:::i;:::-;235:2275:34;;17984:33:35;;;-1:-1:-1;17984:33:35;;235:2275:34;;-1:-1:-1;17984:33:35;17745:111;-1:-1:-1;;;;;235:2275:34;17827:13:35;;235:2275:34;17827:13:35;:::i;:::-;235:2275:34;;17803:38:35;;;-1:-1:-1;17803:38:35;;235:2275:34;;-1:-1:-1;17803:38:35;17703:21;-1:-1:-1;235:2275:34;;;17703:21:35;;;;;;;235:2275:34;;-1:-1:-1;;;;;235:2275:34;;;;;;;;;;-1:-1:-1;235:2275:34;;;4179:84:35;;235:2275:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;235:2275:34;;;;;4105:255:35;;;235:2275:34;;;-1:-1:-1;;;;;235:2275:34;;;4105:255:35;;;235:2275:34;;;;;;;4105:255:35;;;235:2275:34;;;;;;;-1:-1:-1;;;;;;235:2275:34;;;;;;;;;;;;;-1:-1:-1;;;;;;235:2275:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;235:2275:34;;;4411:15:35;235:2275:34;;;;;;;;-1:-1:-1;;;;;;235:2275:34;;;;;;;;;;4518:26:35;;235:2275:34;;;;;;;4582:25:35;;;235:2275:34;;;;;;;;;;;;;;;;;;;;17683:377:35;235:2275:34;;-1:-1:-1;235:2275:34;;-1:-1:-1;235:2275:34;-1:-1:-1;235:2275:34;;;;;;;-1:-1:-1;;;;;235:2275:34;;;;4690:44:35;;;:::i;:::-;;4645:233;235:2275:34;;;;;;;;;4645:233:35;4765:43;;4822:45;4765:43;;:::i;:::-;;4822:45;:::i;:::-;;4645:233;;235:2275:34;;;-1:-1:-1;;;;;235:2275:34;;;;;;;;;;;;;;;;-1:-1:-1;235:2275:34;;;-1:-1:-1;235:2275:34;;;;;;;;;;;;;;;;-1:-1:-1;235:2275:34;;;;;;;;;;-1:-1:-1;235:2275:34;;4411:15:35;235:2275:34;;-1:-1:-1;235:2275:34;17595:79:35;17644:19;;;-1:-1:-1;17644:19:35;;-1:-1:-1;17644:19:35;3941:84;3993:21;;;-1:-1:-1;3993:21:35;;-1:-1:-1;3993:21:35;235:2275:34;;;;;;;:::i;:::-;;;;;;;;;;-1:-1:-1;235:2275:34;;;;;;;;;-1:-1:-1;;235:2275:34;;;-1:-1:-1;;;;;235:2275:34;;;;;;;;;;:::o;:::-;;;-1:-1:-1;;;;;235:2275:34;;;;;;:::o;:::-;;;-1:-1:-1;;;;;235:2275:34;;;;;;:::o;:::-;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;6145:316:93;-1:-1:-1;;;;;235:2275:34;;3969:1:35;235:2275:34;;;-1:-1:-1;;;;;;;;;;;235:2275:34;;;;;;;;;;-1:-1:-1;;;;;235:2275:34;3969:1:35;235:2275:34;;;-1:-1:-1;;;;;;;;;;;235:2275:34;;;;;;;-1:-1:-1;;235:2275:34;;;;;735:10:121;;235:2275:34;-1:-1:-1;;;;;;;;;;;3969:1:35;;6336:40:93;6313:4;6390:11;:::o;6238:217::-;6432:12;3969:1:35;6432:12:93;:::o;6145:316::-;-1:-1:-1;;;;;235:2275:34;;;;;;-1:-1:-1;;;;;;;;;;;235:2275:34;;;;;;;;;;-1:-1:-1;;;;;235:2275:34;;;;;-1:-1:-1;;;;;;;;;;;235:2275:34;;;;;;;-1:-1:-1;;235:2275:34;;;;;735:10:121;;235:2275:34;-1:-1:-1;;;;;;;;;;;2082:33:35;-1:-1:-1;;;;;;;;;;;6336:40:93;235:2275:34;6336:40:93;6313:4;6390:11;:::o;6145:316::-;235:2275:34;;;-1:-1:-1;;;;;;;;;;;235:2275:34;;-1:-1:-1;;;;;;;;;;;235:2275:34;;;;;;;;;-1:-1:-1;;;;;;;;;;;235:2275:34;;-1:-1:-1;;;;;;;;;;;235:2275:34;;-1:-1:-1;;235:2275:34;6313:4:93;235:2275:34;;;735:10:121;;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;235:2275:34;;6336:40:93;6313:4;6390:11;:::o;6238:217::-;235:2275:34;6432:12:93;:::o","linkReferences":{}},"deployedBytecode":{"object":"0x60806040526004361015610011575f80fd5b5f3560e01c806301ffc9a7146100f45780630bece356146100ef578063248a9ca3146100ea5780632f2ff15d146100e557806336568abe146100e05780634d6d9ffb146100db5780635972185a146100d6578063682ed5f0146100d157806391d14854146100cc578063a217fddf146100c7578063d547741f146100c2578063ddba6537146100bd578063edce8bdc146100b85763ef913a4b146100b3575f80fd5b610a16565b61095e565b61088b565b61085c565b610842565b6107f4565b6105e6565b6105ac565b6103ac565b610350565b61031a565b6102b5565b610217565b34610195576020600319360112610195576004357fffffffff00000000000000000000000000000000000000000000000000000000811680910361019557807f7965db0b000000000000000000000000000000000000000000000000000000006020921490811561016b575b506040519015158152f35b7f01ffc9a7000000000000000000000000000000000000000000000000000000009150145f610160565b5f80fd5b9060206003198301126101955760043567ffffffffffffffff811161019557826023820112156101955780600401359267ffffffffffffffff84116101955760248483010111610195576024019190565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b346101955761028161022836610199565b5f80527f4c48d1d2b0f4f7485fc28e3db22341d96a20aa29e6efa8149da9751603abd4e06020527f6e0c24a6e293ff9b755263dbaa15ba3796b0b8d3fe17cfb4ddf8143b268eac475490919060ff161561029957610d9d565b6040516003821015610294576020918152f35b6101ea565b6102a1611287565b610d9d565b90816020910312610195573590565b346101955760206003193601126101955760206102df6004355f525f602052600160405f20015490565b604051908152f35b6003196040910112610195576004359060243573ffffffffffffffffffffffffffffffffffffffff811681036101955790565b346101955761034e61032b366102e7565b90610349610344825f525f602052600160405f20015490565b61130f565b6121b3565b005b346101955761035e366102e7565b3373ffffffffffffffffffffffffffffffffffffffff8216036103845761034e9161228a565b7f6697b232000000000000000000000000000000000000000000000000000000005f5260045ffd5b346101955760206003193601126101955760043567ffffffffffffffff8111610195578060040160806003198336030112610195575f80527f4c48d1d2b0f4f7485fc28e3db22341d96a20aa29e6efa8149da9751603abd4e060205260ff7f6e0c24a6e293ff9b755263dbaa15ba3796b0b8d3fe17cfb4ddf8143b268eac4754161561059f575b61044761044260248401611192565b61137c565b60648201916001610458848461119c565b90500361056157906104a96104966104a261049d61049661049061048961048460446104e09a01611192565b611b30565b988761119c565b9061126e565b3691610b4d565b61235f565b928061121d565b906001840154906040516104d7816104c960208201948560209181520190565b03601f198101835282610afd565b519020916123ed565b805161051f5761051b61050b6104fe845467ffffffffffffffff1690565b67ffffffffffffffff1690565b6040519081529081906020820190565b0390f35b61053361052e61055e92612532565b61255f565b7fd039601e000000000000000000000000000000000000000000000000000000005f52600452602490565b5ffd5b61055e61056e848461119c565b7f88b3170e000000000000000000000000000000000000000000000000000000005f52600160045260245250604490565b6105a7611287565b610433565b34610195575f6003193601126101955760206040517fbd893629a699470e4ec82a5715bb4981fdaacc5d0a728bf5f55b801d8f4ef10b8152f35b346101955760206003193601126101955760043567ffffffffffffffff8111610195578060040160a06003198336030112610195575f80527f4c48d1d2b0f4f7485fc28e3db22341d96a20aa29e6efa8149da9751603abd4e060205260ff7f6e0c24a6e293ff9b755263dbaa15ba3796b0b8d3fe17cfb4ddf8143b268eac475416156107e7575b61067c61044260248401611192565b6064820191600161068d848461119c565b90500361056157608481019060206106a5838561121d565b9050036107a957906106f46104966106ed6106e56106de61049d6104966104906106d761048460446107149c01611192565b9b8b61119c565b948761121d565b8101906102a6565b948061121d565b906001850154906040516104d7816104c960208201948560209181520190565b8051156107755761052e61072791612532565b908082036107475761051b61050b6104fe855467ffffffffffffffff1690565b7f56ed1b63000000000000000000000000000000000000000000000000000000005f5260045260245260445ffd5b61055e827f56ed1b63000000000000000000000000000000000000000000000000000000005f52906044916004525f602452565b61055e6107b6838561121d565b7f24fadac8000000000000000000000000000000000000000000000000000000005f52602060045260245250604490565b6107ef611287565b61066d565b3461019557602060ff610836610809366102e7565b905f525f845260405f209073ffffffffffffffffffffffffffffffffffffffff165f5260205260405f2090565b54166040519015158152f35b34610195575f6003193601126101955760206040515f8152f35b346101955761034e61086d366102e7565b90610886610344825f525f602052600160405f20015490565b61228a565b346101955761089936610199565b50505f80527f4c48d1d2b0f4f7485fc28e3db22341d96a20aa29e6efa8149da9751603abd4e06020527f6e0c24a6e293ff9b755263dbaa15ba3796b0b8d3fe17cfb4ddf8143b268eac475460ff1615610915575b7f2c1ed462000000000000000000000000000000000000000000000000000000005f5260045ffd5b61091d611287565b6108ed565b67ffffffffffffffff81160361019557565b601f19601f602060409481855280519182918282880152018686015e5f8582860101520116010190565b346101955760206003193601126101955761097e60043561048481610922565b67ffffffffffffffff8154166002600183015492019060405192608084019160208501526040840152606080840152815480915260a08301915f5260205f20905f5b8181106109ea5761051b856109de818703601f198101835282610afd565b60405191829182610934565b825473ffffffffffffffffffffffffffffffffffffffff168452602090930192600192830192016109c0565b34610195575f6003193601126101955761051b60405173ffffffffffffffffffffffffffffffffffffffff60015416602082015267ffffffffffffffff600254818116604084015260401c16606082015267ffffffffffffffff600354818116608084015260401c1660a082015260a081526109de60c082610afd565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b6060810190811067ffffffffffffffff821117610adc57604052565b610a93565b6040810190811067ffffffffffffffff821117610adc57604052565b90601f601f19910116810190811067ffffffffffffffff821117610adc57604052565b60405190610b2f604083610afd565b565b67ffffffffffffffff8111610adc57601f01601f191660200190565b929192610b5982610b31565b91610b676040519384610afd565b829481845281830111610195578281602093845f960137010152565b9080601f8301121561019557816020610b9e93359101610b4d565b90565b6020818303126101955780359067ffffffffffffffff8211610195570180820391608083126101955760405192610bd784610ac0565b823567ffffffffffffffff811161019557604091610bfa84601f19938701610b83565b8652011261019557604051610c0e81610ae1565b6020830135610c1c81610922565b81526040830135610c2c81610922565b60208201526020840152606082013567ffffffffffffffff811161019557610c549201610b83565b604082015290565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b9060018201809211610c9757565b610c5c565b60c001908160c011610c9757565b60f701908160f711610c9757565b6080019081608011610c9757565b60b701908160b711610c9757565b91908201809211610c9757565b908160011b9180830460021490151715610c9757565b81519167ffffffffffffffff8311610adc57680100000000000000008311610adc578154838355808410610d77575b506020610d389101915f5260205f2090565b5f5b838110610d475750505050565b6001906020610d6a855173ffffffffffffffffffffffffffffffffffffffff1690565b9401938184015501610d3a565b825f528360205f2091820191015b818110610d925750610d26565b5f8155600101610d85565b610da991810190610ba1565b9060208201610dc461044282515167ffffffffffffffff1690565b610dce8351611614565b92606084019367ffffffffffffffff610def865167ffffffffffffffff1690565b161561116a5760035491604083901c67ffffffffffffffff1693610e1d67ffffffffffffffff861642610cd4565b9460a0840195610e35875167ffffffffffffffff1690565b9067ffffffffffffffff82161161112b5750505160200151610e7290610e649067ffffffffffffffff16611b30565b9367ffffffffffffffff1690565b67ffffffffffffffff81168015159081611102575b506110ad575090610ef591610eb66002610eae610ea385611b87565b60e086015190611ca1565b950185611ea7565b610ec660c0830194855190611fcc565b60406080610ee960015473ffffffffffffffffffffffffffffffffffffffff1690565b9301519101519161206f565b610f22610f0a865167ffffffffffffffff1690565b67ffffffffffffffff165f52600460205260405f2090565b610f376104fe825467ffffffffffffffff1690565b61103b5750916002610fb5928694610fa8610f73610f64610f0a610fc39a9b5167ffffffffffffffff1690565b955167ffffffffffffffff1690565b859067ffffffffffffffff167fffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000825416179055565b6001840155519101610cf7565b5167ffffffffffffffff1690565b600254610fdc9060401c67ffffffffffffffff166104fe565b67ffffffffffffffff821611610ff157505f90565b611037907fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff6fffffffffffffffff00000000000000006002549260401b16911617600255565b5f90565b91611051611059945167ffffffffffffffff1690565b9051926120e5565b6110a75761055e611072835167ffffffffffffffff1690565b7fc1aea5f7000000000000000000000000000000000000000000000000000000005f5267ffffffffffffffff16600452602490565b60029150565b61055e906110c3855467ffffffffffffffff1690565b7feae35725000000000000000000000000000000000000000000000000000000005f5267ffffffffffffffff9081166004524260245216604452606490565b9050611123429161111e6104fe885467ffffffffffffffff1690565b610cd4565b11155f610e87565b7f9b772277000000000000000000000000000000000000000000000000000000005f524260045267ffffffffffffffff9081166024521660445260645ffd5b7f59d119e3000000000000000000000000000000000000000000000000000000005f5260045ffd5b35610b9e81610922565b9035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe181360301821215610195570180359067ffffffffffffffff821161019557602001918160051b3603831361019557565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b9035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe181360301821215610195570180359067ffffffffffffffff82116101955760200191813603831361019557565b9015611282578061127e9161121d565b9091565b6111f0565b335f9081527f4c48d1d2b0f4f7485fc28e3db22341d96a20aa29e6efa8149da9751603abd4e0602052604090205460ff16156112bf57565b7fe2517d3f000000000000000000000000000000000000000000000000000000005f52336004527fbd893629a699470e4ec82a5715bb4981fdaacc5d0a728bf5f55b801d8f4ef10b60245260445ffd5b805f525f60205260ff6113433360405f209073ffffffffffffffffffffffffffffffffffffffff165f5260205260405f2090565b54161561134d5750565b7fe2517d3f000000000000000000000000000000000000000000000000000000005f523360045260245260445ffd5b67ffffffffffffffff168061138e5750565b7f3ce598a9000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b60405190610100820182811067ffffffffffffffff821117610adc57604052606060e0838281528260208201528260408201525f838201525f60808201525f60a08201528260c08201520152565b8051600110156112825760400190565b805160071015611282576101000190565b8051600d1015611282576101c00190565b8051600e1015611282576101e00190565b805160081015611282576101200190565b8051600310156112825760800190565b8051600b1015611282576101800190565b8051600c1015611282576101a00190565b8051600410156112825760a00190565b8051156112825760200190565b8051600210156112825760600190565b805160101015611282576102200190565b80518210156112825760209160051b010190565b67ffffffffffffffff8111610adc5760051b60200190565b90611501826114df565b61150e6040519182610afd565b828152601f1961151e82946114df565b0190602036910137565b90602082519201517fffffffffffffffffffffffffffffffffffffffff00000000000000000000000081169260148110611560575050565b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000929350829060140360031b1b161690565b60405160a091906115a38382610afd565b6004815291601f1901825f5b8281106115bb57505050565b8060606020809385010152016115af565b906115d6826114df565b6115e36040519182610afd565b828152601f196115f382946114df565b01905f5b82811061160357505050565b8060606020809385010152016115f7565b61163061162b6116226113b9565b92808452612532565b6125a1565b602082019080825251600f8110611b0557507f1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d493476116766116708351611407565b5161266c565b03611aca57600161169061168a8351611417565b5161255f565b03611a8f577f63746963616c2062797a616e74696e65206661756c7420746f6c6572616e63656116c36116708351611428565b03611a54576116db6116d58251611439565b51612688565b80516008811490811591611a24575b506119ea575061162b61175d6116d5836117216117106104fe61168a611762985161144a565b67ffffffffffffffff166060880152565b61172e611670825161145b565b60808701526117576117466104fe61168a845161146b565b67ffffffffffffffff1660a0880152565b5161147c565b612532565b90604081019180835251600581036119bf57506117886117828351611407565b516125a1565b908151156119975761179a82516114f7565b9360c082019485525f5b8351811015611933576117ba6116d582866114cb565b80516014810361190857506117d16117d791611528565b60601c90565b73ffffffffffffffffffffffffffffffffffffffff811680156118c6575f5b8381106118325750509061182c600192611811838a516114cb565b9073ffffffffffffffffffffffffffffffffffffffff169052565b016117a4565b8161187761185e611844848d516114cb565b5173ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff1690565b14611884576001016117f6565b7f41fe18cc000000000000000000000000000000000000000000000000000000005f5273ffffffffffffffffffffffffffffffffffffffff831660045260245ffd5b7f59bff387000000000000000000000000000000000000000000000000000000005f5273ffffffffffffffffffffffffffffffffffffffff821660045260245ffd5b7f83e46ad2000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b509261178291945061194692505161148d565b61195081516115cc565b9260e081019384525f5b8251811015611991578061198a816119776116d5600195886114cb565b88519061198483836114cb565b526114cb565b500161195a565b50925050565b7f339e1ffb000000000000000000000000000000000000000000000000000000005f5260045ffd5b7f30c6792a000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b611a20906040519182917fd5edd2a500000000000000000000000000000000000000000000000000000000835260048301610934565b0390fd5b7f011b4d03dd8c01f1049143cf9c4c817e4b167f1d1b83e5c6f0f10d89ba1e7bce9150602083012014155f6116ea565b611a6461167061055e9251611428565b7fa19e609c000000000000000000000000000000000000000000000000000000005f52600452602490565b611a9f61168a61055e9251611417565b7ff71b722f000000000000000000000000000000000000000000000000000000005f52600452602490565b611ada61167061055e9251611407565b7fb8120dca000000000000000000000000000000000000000000000000000000005f52600452602490565b7fbc277732000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b67ffffffffffffffff1690815f52600460205260405f209167ffffffffffffffff83541615611b5c5750565b7ff761631b000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b6020611c26611b94611592565b611c0d611bab60408601611bb1611bab825161149d565b51612f88565b611bba8561149d565b52611bc48461149d565b50611bd2611bab8251611407565b611bdb85611407565b52611be584611407565b50611bf3611bab82516114aa565b611bfc856114aa565b52611c06846114aa565b505161145b565b611c168261145b565b52611c208161145b565b5061275e565b910190611c348251516115cc565b905f5b83518051821015611c8a579080600192600c82145f14611c78575050611c5c8361280f565b611c6682866114cb565b52611c7181856114cb565b5001611c37565b611c8591611bab916114cb565b611c5c565b505050611c97915061275e565b6020815191012090565b919091611cae83516114f7565b925f5b8151811015611e9457611cc481836114cb565b51805160418103611e69575080601b60ff611d13611d0d611ce7611d20966127ee565b517fff000000000000000000000000000000000000000000000000000000000000001690565b60f81c90565b1610611e16575b84613036565b50611d2a81612889565b15801590611df8575b611dd05773ffffffffffffffffffffffffffffffffffffffff81165f5b838110611d7057505090611d6a60019261181183896114cb565b01611cb1565b81611d8161185e611844848c6114cb565b14611d8e57600101611d50565b7f33af0d5f000000000000000000000000000000000000000000000000000000005f5273ffffffffffffffffffffffffffffffffffffffff831660045260245ffd5b7f09cb44e6000000000000000000000000000000000000000000000000000000005f5260045ffd5b5073ffffffffffffffffffffffffffffffffffffffff811615611d33565b611e58611e30611e2b611d0d611ce7856127ee565b612877565b60f81b7fff000000000000000000000000000000000000000000000000000000000000001690565b5f1a611e63826127ee565b53611d1a565b7ff2db9ce1000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b505050565b5f198114610c975760010190565b905f915f5b8151811015611f0057611edf73ffffffffffffffffffffffffffffffffffffffff611ed783856114cb565b511684612893565b611eec575b600101611eac565b92611ef8600191611e99565b939050611ee4565b50506003611f0f915404610c89565b90818110611f1b575050565b7fe2dcb1b9000000000000000000000000000000000000000000000000000000005f5260045260245260445ffd5b905f198201918211610c9757565b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff408201918211610c9757565b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff808201918211610c9757565b6020039060208211610c9757565b91908203918211610c9757565b905f915f5b81518110156120255761200473ffffffffffffffffffffffffffffffffffffffff611ffc83856114cb565b5116846128ea565b612011575b600101611fd1565b9261201d600191611e99565b939050612009565b50505190600382048203918211610c9757818110612041575050565b7f7818f4e4000000000000000000000000000000000000000000000000000000005f5260045260245260445ffd5b6120b99261162b9261175d926040517fffffffffffffffffffffffffffffffffffffffff000000000000000000000000602082019260601b168252601481526104d7603482610afd565b805160021015611282576060610b9e91015161266c565b8054821015611282575f5260205f2001905f90565b919067ffffffffffffffff80612103855467ffffffffffffffff1690565b9216911614908115916121a4575b5061219e5760020190815481510361219e575f5b81518110156121965761215b61213b82856120d0565b905473ffffffffffffffffffffffffffffffffffffffff9160031b1c1690565b73ffffffffffffffffffffffffffffffffffffffff61218061185e61184485876114cb565b91160361218f57600101612125565b5050505f90565b505050600190565b50505f90565b9050600182015414155f612111565b805f525f60205260ff6121e78360405f209073ffffffffffffffffffffffffffffffffffffffff165f5260205260405f2090565b541661219e57805f525f60205261221f8260405f209073ffffffffffffffffffffffffffffffffffffffff165f5260205260405f2090565b60017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0082541617905573ffffffffffffffffffffffffffffffffffffffff339216907f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d5f80a4600190565b805f525f60205260ff6122be8360405f209073ffffffffffffffffffffffffffffffffffffffff165f5260205260405f2090565b54161561219e57805f525f6020526122f78260405f209073ffffffffffffffffffffffffffffffffffffffff165f5260205260405f2090565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00815416905573ffffffffffffffffffffffffffffffffffffffff339216907ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b5f80a4600190565b60208151910120604051602081019182527f1260944489272988d9df285149b5aa1b0f48f2136d6f416159f840a3e07476006040820152604081526123a5606082610afd565b51902090565b604051906123ba602083610afd565b5f808352366020840137565b906123d082610b31565b6123dd6040519182610afd565b828152601f1961151e8294610b31565b61162b61242f919493946124016020610b31565b9561240f6040519788610afd565b6020875261241d6020610b31565b601f1960208901910136823752612532565b9061243a8451610ce1565b918451151580612512575b61244e90612558565b61246061245b5f85611fbf565b6123c6565b925f19015f5b81811061247a575050610b9e939450612a5e565b806124fc600f6124bf6124f6611d0d611ce78d61249960029960011c90565b908d6124f08a6124e88a6124bf6124b6611d0d611ce78a8a6127fe565b60041c600f1690565b1660f81b7fff000000000000000000000000000000000000000000000000000000000000001690565b5f1a926127fe565b536127fe565b60ff1690565b5f1a61250b60018301886127fe565b5301612466565b506001612445565b6040519061252782610ae1565b5f6020838281520152565b61253a61251a565b5060208151916040519261254d84610ae1565b835201602082015290565b1561019557565b80518015159081612595575b50156101955761257a90612d34565b90519060208110612589575090565b6020036101000a900490565b6021915011155f61256b565b6125aa81612d60565b15610195576125b881612d80565b6125c1816114df565b916125cf6040519384610afd565b818352601f196125de836114df565b015f5b81811061265557505060206126019101516125fb81612de1565b90610cd4565b5f905b8282106126115750505090565b61264d81612620600193612e4c565b90612629610b20565b82815281602082015261263c86896114cb565b5261264785886114cb565b50610cd4565b910190612604565b60209061266061251a565b828288010152016125e1565b6021815103610195576020015160018101809111610c97575190565b8051156101955761269b610b9e91612d34565b6126a7819392936123c6565b928360200190612f15565b805191908290602001825e015f815290565b610b2f906126e66126e0949360405195869360208501906126b2565b906126b2565b03601f198101845283610afd565b6001907fff00000000000000000000000000000000000000000000000000000000000000610b9e949316815201906126b2565b916001610b9e94937fff000000000000000000000000000000000000000000000000000000000000006126e09416815201906126b2565b5f9060605b815183101561278b5761278360019161277c85856114cb565b51906126c4565b920191612763565b9150508051603881106127ca5750610b9e6127a68251612fb4565b916104c96127ba611e306124f68651610caa565b9160405194859360208501612727565b6127dc611e306124f6610b9e93610c9c565b6104c9604051938492602084016126f4565b8051604010156112825760600190565b908151811015611282570160200190565b60018151148061285c575b610b9e5780516038811061284a5750610b9e6128368251612fb4565b916104c96127ba611e306124f68651610cc6565b6127dc611e306124f6610b9e93610cb8565b50608060ff612870611d0d611ce78561149d565b161061281a565b60ff601b9116019060ff8211610c9757565b6004111561029457565b905f5b825481101561218f5773ffffffffffffffffffffffffffffffffffffffff6128be82856120d0565b90549060031b1c1673ffffffffffffffffffffffffffffffffffffffff83161461219657600101612896565b905f5b825181101561218f5773ffffffffffffffffffffffffffffffffffffffff61291582856114cb565b511673ffffffffffffffffffffffffffffffffffffffff831614612196576001016128ed565b91906129478351610ce1565b908351151580612a54575b61295b90612558565b61296861245b8284611fbf565b9381926001808416146129f2575b5f19869101935b84811061298b575050505050565b836129e960016129df600f6124bf6124f6611d0d611ce78b60029b6129d86129cb886124bf8f611d0d611ce76129c46124b69360011c90565b80996127fe565b9b8d03809c5f1a926127fe565b538c6127fe565b5f1a9201896127fe565b5301859061297d565b92507f0f00000000000000000000000000000000000000000000000000000000000000612a316124f6611d0d611ce7612a2b8760011c90565b866127fe565b60f81b165f1a612a408661149d565b535f19612a4c83611e99565b939050612976565b5081811115612952565b915f915f612a6a61251a565b50845115612cfb5790935f915b81518310156101955782158080612ce5575b61019557159081612cc8575b5061019557612aa761178283836114cb565b948551600281145f14612ba45750612ac9612ac46116d58861149d565b6130cb565b95612adf612ad8888884613138565b8092610cd4565b965111612b865715612b165750612af69051611f49565b11610195575111612b0d576116d5610b9e91611407565b50610b9e6123ab565b919094612b238651611f49565b82146101955780612b45612b41612b3b600194611407565b51612d60565b1590565b15612b6757612b56612b5c91611407565b516130bd565b915b01919490612a77565b612b73612b8091611407565b5160208101519051902090565b91612b5e565b505091509250612b97915051611f49565b1161019557610b9e6123ab565b929491939192601103612c695781518314612c4b57612bd5612bcf6124f6611d0d611ce787876127fe565b93610c89565b92601081101561019557612bf2612bec82896114cb565b516130a7565b15612c145750505050612c0791925051611f49565b0361019557610b9e6123ab565b86612c2c612b41612b3b84600196989a97999b6114cb565b15612c3e57612b8091612b56916114cb565b612b8091612b73916114cb565b505050612c589051611f49565b03610195576116d5610b9e916114ba565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f696e76616c6964206e6f6465206c656e677468000000000000000000000000006044820152606490fd5b9050612cdd612cd784846114cb565b51613070565b14155f612a95565b50612cf3612b7385856114cb565b871415612a89565b509050612d2c92507f56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421915014612558565b610b9e6123ab565b906020820191612d448351612de1565b925190838201809211610c975751928303928311610c97579190565b805115612d7b57602060c0910151515f1a1061103757600190565b505f90565b805115612d7b575f9060208101908151612d9981612de1565b8101809111610c9757915190518101809111610c975791905b828110612dbf5750905090565b612dc881612e4c565b8101809111610c9757612ddb9091611e99565b90612db2565b515f1a6080811015612df257505f90565b60b881108015612e36575b15612e085750600190565b60c0811015612e2757610b9e90612e229060b75b90611fbf565b610c89565b610b9e90612e229060f7612e1c565b5060c08110158015612dfd575060f88110612dfd565b80515f1a906080821015612e61575050600190565b60b8821015612e775750612e22610b9e91611f84565b60c0821015612eb85760010151602082900360b7016101000a9004017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff4a0190565b60f8821015612ece5750612e22610b9e91611f57565b60010151602082900360f7016101000a9004017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0a0190565b601f8111610c97576101000a90565b90918015611e94575b6020811015612f585780612f3157505050565b612f45612f40612f4a92611fb1565b612f06565b611f49565b905182518216911916179052565b91908051825260208101809111610c97579060208101809111610c975791601f19810190811115612f1e57610c5c565b612f9281516123c6565b90815115612fb057806020610b9e9201519051908360200190612f15565b5090565b5f81805b6130225750612fc6816123c6565b91815b612fd257505090565b612fdb82611f49565b61300d7fff000000000000000000000000000000000000000000000000000000000000008360f81b165f1a91856127fe565b5360081c908015610c97575f19019081612fc9565b9061302c90611e99565b9060081c80612fb8565b81519190604183036130665761305f9250602082015190606060408401519301515f1a906131dc565b9192909190565b50505f9160029190565b80516020811015613088575060208101519051902090565b90602001512060405160208101918252602081526123a5604082610afd565b6001815103612d7b5760200151515f1a60801490565b6130c690612d34565b902090565b9081511561019557600f6130e76124b6611d0d611ce78661149d565b16806130fa5750610b9e60025f9361293b565b6001810361310f5750610b9e60015f9361293b565b600281036131255750610b9e600260019361293b565b60030361019557610b9e6001809361293b565b91905f5b838101808211610c975782518110806131d2575b156131ca576131807fff0000000000000000000000000000000000000000000000000000000000000091846127fe565b51167fff000000000000000000000000000000000000000000000000000000000000006131ad83866127fe565b511690036131c3576131be90611e99565b61313c565b9250505090565b509250505090565b5083518210613150565b91907f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0841161326b579160209360809260ff5f9560405194855216868401526040830152606082015282805260015afa15613260575f5173ffffffffffffffffffffffffffffffffffffffff81161561325657905f905f90565b505f906001905f90565b6040513d5f823e3d90fd5b5050505f916003919056fea164736f6c634300081c000a","sourceMap":"235:2275:34:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;;;;-1:-1:-1;;235:2275:34;;;;;;;;;;;;;;;2639:47:93;2654:32;235:2275:34;2639:47:93;;:87;;;;;235:2275:34;;;;;;;;;;2639:87:93;844:25:133;829:40;;;2639:87:93;;;235:2275:34;-1:-1:-1;235:2275:34;;;;;-1:-1:-1;;235:2275:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;5599:2265:35;235:2275:34;;;:::i;:::-;-1:-1:-1;235:2275:34;;;;;;;;;;;;23142:42:35;23138:105;;5599:2265;:::i;:::-;235:2275:34;;;;;;;;;;;;;;;:::i;23138:105:35:-;23211:20;;:::i;:::-;5599:2265;:::i;235:2275:34:-;;;;;;;;;;;:::o;:::-;;;;;-1:-1:-1;;235:2275:34;;;;;;;;;3867:6:93;235:2275:34;3867:6:93;235:2275:34;;3867:22:93;235:2275:34;3867:6:93;235:2275:34;3867:22:93;235:2275:34;3776:120:93;;235:2275:34;;;;;;;;-1:-1:-1;;235:2275:34;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;4296:25:93;235:2275:34;;;:::i;:::-;4266:18:93;2475:4;4266:18;;3867:6;235:2275:34;3867:6:93;235:2275:34;;3867:22:93;235:2275:34;3867:6:93;235:2275:34;3867:22:93;235:2275:34;3776:120:93;;4266:18;2475:4;:::i;:::-;4296:25;:::i;:::-;235:2275:34;;;;;;;;:::i;:::-;735:10:121;235:2275:34;;;5387:34:93;5383:102;;5495:37;;;:::i;5383:102::-;5444:30;;;235:2275:34;5444:30:93;;235:2275:34;;;;;-1:-1:-1;;235:2275:34;;;;;;;;;;;;;;;;-1:-1:-1;;235:2275:34;;;;;;;-1:-1:-1;235:2275:34;;;;;;;;;23142:42:35;23138:105;;235:2275:34;9327:31:35;;:16;;;:31;:::i;:::-;;:::i;:::-;9373:9;;;;9393:1;9373:9;;;;:::i;:::-;:21;;;9369:97;;9535:31;235:2275:34;9681:10:35;9599:36;235:2275:34;9622:12:35;:9;9516:51;9535:31;;9681:95;9535:31;;;:::i;:::-;9516:51;:::i;:::-;9622:9;;;:::i;:::-;:12;;:::i;:::-;235:2275:34;;;:::i;:::-;9599:36:35;:::i;:::-;9681:10;;;:::i;235:2275:34:-;9707:26:35;9393:1;9707:26;;235:2275:34;;;;9745:29:35;;;235:2275:34;9745:29:35;;;;235:2275:34;;;;;;;9745:29:35;;-1:-1:-1;;9745:29:35;;;;;;:::i;:::-;235:2275:34;9735:40:35;;9681:95;;:::i;:::-;235:2275:34;;9786:109:35;;235:2275:34;9904:31:35;235:2275:34;;;;;;;;;;;;9904:31:35;235:2275:34;;;;;;;;;;;;;;;;;9786:109:35;9853:29;:20;9833:51;9853:20;;:::i;:::-;:29;:::i;:::-;9833:51;-1:-1:-1;9833:51:35;235:2275:34;;;;;9833:51:35;-1:-1:-1;9833:51:35;9369:97;9417:38;9438:9;;;;:::i;:::-;9417:38;-1:-1:-1;9417:38:35;9393:1;235:2275:34;;;;-1:-1:-1;235:2275:34;;;23138:105:35;23211:20;;:::i;:::-;23138:105;;235:2275:34;;;;;-1:-1:-1;;235:2275:34;;;;;;;;2082:33:35;235:2275:34;;;;;;;;-1:-1:-1;;235:2275:34;;;;;;;;;;;;;;;;-1:-1:-1;;235:2275:34;;;;;;;-1:-1:-1;235:2275:34;;;;;;;;;23142:42:35;23138:105;;235:2275:34;8099:31:35;;:16;;;:31;:::i;:::-;8145:9;;;;8165:1;8145:9;;;;:::i;:::-;:21;;;8141:97;;8251:10;;;;235:2275:34;8251:10:35;;;;:::i;:::-;:23;;;8247:102;;8418:31;235:2275:34;8631:10:35;8552:33;8563:10;8482:36;235:2275:34;8505:12:35;:9;8399:51;8418:31;;8631:95;8418:31;;;:::i;8399:51::-;8505:9;;;:::i;8482:36::-;8563:10;;;:::i;:::-;8552:33;;;;:::i;:::-;8631:10;;;:::i;235:2275:34:-;8657:26:35;8165:1;8657:26;;235:2275:34;;;;8695:29:35;;;235:2275:34;8695:29:35;;;;235:2275:34;;;;;;;8631:95:35;235:2275:34;;8740:20:35;8736:107;;8883:20;:29;:20;;:::i;:29::-;8927:28;;;;8923:116;;235:2275:34;9048:31:35;235:2275:34;;;;;;;8923:116:35;8978:50;-1:-1:-1;8978:50:35;235:2275:34;;;;;-1:-1:-1;9833:51:35;8736:107;8783:49;;;-1:-1:-1;8783:49:35;235:2275:34;;;;;-1:-1:-1;235:2275:34;;;8247:102:35;8297:41;8320:10;;;;:::i;:::-;8297:41;-1:-1:-1;8297:41:35;235:2275:34;;;;;-1:-1:-1;235:2275:34;;;23138:105:35;23211:20;;:::i;:::-;23138:105;;235:2275:34;;;;;;2920:29:93;235:2275:34;;;:::i;:::-;;2920:6:93;235:2275:34;2920:6:93;235:2275:34;;;2920:6:93;235:2275:34;;;;;;;;;;;;;2920:29:93;235:2275:34;;;;;;;;;;;;;;;-1:-1:-1;;235:2275:34;;;;;;;;;;;;;;;;4713:26:93;235:2275:34;;;:::i;:::-;4683:18:93;2475:4;4683:18;;3867:6;235:2275:34;3867:6:93;235:2275:34;;3867:22:93;235:2275:34;3867:6:93;235:2275:34;3867:22:93;235:2275:34;3776:120:93;;2475:4;4713:26;:::i;235:2275:34:-;;;;;;;:::i;:::-;-1:-1:-1;;23181:1:35;235:2275:34;;;;;;;;;23142:42:35;23138:105;;235:2275:34;10069:25:35;23181:1;10069:25;235:2275:34;23181:1:35;10069:25;23138:105;23211:20;;:::i;:::-;23138:105;;235:2275:34;;;;;;;:::o;:::-;-1:-1:-1;;235:2275:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;-1:-1:-1;;235:2275:34;;;;;5411:34:35;235:2275:34;;;;;:::i;5411:34:35:-;235:2275:34;;;;5527:25:35;5499:26;;;235:2275:34;5527:25:35;;235:2275:34;;;;;;;5462:91:35;235:2275:34;5462:91:35;;235:2275:34;;;;;;;;;;;;;;;;;;;-1:-1:-1;235:2275:34;;-1:-1:-1;235:2275:34;;-1:-1:-1;235:2275:34;;;;;;;5462:91:35;;;;;-1:-1:-1;;5462:91:35;;;;;;:::i;:::-;235:2275:34;;;;;;;:::i;:::-;;;;;;;;;;;;5499:26:35;235:2275:34;;;;;;;;;;;;-1:-1:-1;;235:2275:34;;;;;;;;;5014:11:35;235:2275:34;;5003:23:35;;;235:2275:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5003:23:35;;;;;;:::i;235:2275:34:-;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;:::i;:::-;;;;;;;;;;;;;;;:::o;:::-;;;-1:-1:-1;;235:2275:34;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;:::i;:::-;:::o;:::-;;;;;;;;-1:-1:-1;;235:2275:34;;;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;-1:-1:-1;235:2275:34;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;:::i;:::-;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;-1:-1:-1;;235:2275:34;;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;:::o;:::-;;;;;;;;;;;;2212:66:35;235:2275:34;;;;;;;:::o;:::-;;:::i;:::-;22204:4:35;235:2275:34;;;22204:4:35;235:2275:34;;;:::o;:::-;22358:4:35;235:2275:34;;;22358:4:35;235:2275:34;;;:::o;:::-;21546:4:35;235:2275:34;;;21546:4:35;235:2275:34;;;:::o;:::-;21688:4:35;235:2275:34;;;21688:4:35;235:2275:34;;;:::o;:::-;;;;;;;;;;:::o;:::-;;;;;;;;;8592:1:37;235:2275:34;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;235:2275:34;;;-1:-1:-1;235:2275:34;;;;;;;;;;;;;;;;-1:-1:-1;235:2275:34;;;;;;5599:2265:35;5783:40;5599:2265;5783:40;;;;:::i;:::-;5854:18;;;;:33;235:2275:34;5854:18:35;;235:2275:34;;;;;5854:33:35;5928:28;5941:14;;5928:28;:::i;:::-;5970:13;;;;235:2275:34;;;;;;;;;;;5970:18:35;5966:77;;6074:25;235:2275:34;;;;;;;;6056:43:35;;235:2275:34;;;6056:15:35;:43;:::i;:::-;6102:16;;;;235:2275:34;;;;;;;;;6056:62:35;235:2275:34;;;-1:-1:-1;6052:178:35;;-1:-1:-1;;6306:18:35;5854;6306:33;235:2275:34;;;6287:53:35;;235:2275:34;;9516:51:35;:::i;6287:53::-;235:2275:34;;;;;;;;;6367:31:35;;;:139;;;;5599:2265;6350:298;;;6701:25;;6921:79;6701:25;6757:72;6074:25;6685:62;6701:25;;;:::i;:::-;6728:18;;;;6685:62;;:::i;:::-;6796:32;;6757:72;;:::i;:::-;6870:17;;;;;;;;;:::i;:::-;6982;6964:16;235:2275:34;6074:11:35;235:2275:34;;;;;;6964:16:35;;235:2275:34;6982:17:35;;;6921:79;;:::i;:::-;7059:30;235:2275:34;;;;;;;;;;;;7059:15:35;235:2275:34;;;;;;;7059:30:35;7103:37;235:2275:34;;;;;;;7103:37:35;7099:303;;235:2275:34;;6074:25:35;235:2275:34;;;;7495:46:35;235:2275:34;7455:30:35;235:2275:34;;;;;;;;;7455:30:35;235:2275:34;;;;;;;7495:46:35;235:2275:34;;;;;;;;;;;7495:46:35;6074:11;7551:29;;235:2275:34;7635:17:35;7604:28;;235:2275:34;:::i;:::-;;;;;;;6074:25:35;235:2275:34;7667:55:35;;235:2275:34;;;;;;7667:55:35;235:2275:34;;;7667:55:35;7663:141;;7814:43;5854:33;5599:2265;:::o;7663:141::-;7738:55;;235:2275:34;;6074:25:35;235:2275:34;;;;;;;;6074:25:35;235:2275:34;;7738:55:35;5854:33;5599:2265;:::o;7099:303::-;235:2275:34;;7160:95:35;235:2275:34;;;;;;;7237:17:35;;7160:95;;:::i;:::-;7156:175;;7351:40;235:2275:34;;;;;;;;7351:40:35;5854:33;7351:40;235:2275:34;;7059:15:35;235:2275:34;;;;7156:175:35;6074:25;;-1:-1:-1;7275:41:35:o;6350:298::-;6538:99;235:2275:34;;;;;;;;;6538:99:35;5854:33;6538:99;235:2275:34;;;;6538:99:35;235:2275:34;6056:15:35;235:2275:34;;;;;;;;6367:139:35;6056:15;;6418:69;6056:15;235:2275:34;6418:40:35;235:2275:34;;;;;;;6418:40:35;:69;:::i;:::-;:88;;6367:139;;;6052:178;6141:78;5854:33;6141:78;6056:15;6141:78;235:2275:34;;;;;;;;;;;-1:-1:-1;9833:51:35;5966:77;6011:21;5854:33;6011:21;;5854:33;6011:21;235:2275:34;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;:::i;:::-;;;:::o;:::-;;:::i;3165:103:93:-;735:10:121;2920:6:93;235:2275:34;;;;;;;;;;;;3485:23:93;3481:108;;3165:103::o;3481:108::-;3531:47;2920:6;3531:47;735:10:121;3531:47:93;235:2275:34;2082:33:35;235:2275:34;;;2920:6:93;3531:47;3165:103;235:2275:34;2920:6:93;235:2275:34;2920:6:93;235:2275:34;;;2920:29:93;735:10:121;235:2275:34;2920:6:93;235:2275:34;;;;;;;;;;;;;2920:29:93;235:2275:34;;3485:23:93;3481:108;;3165:103;:::o;3481:108::-;3531:47;2920:6;3531:47;735:10:121;3531:47:93;235:2275:34;;;;2920:6:93;3531:47;19709:177:35;235:2275:34;;19790:19:35;19786:94;;19709:177;:::o;19786:94::-;19832:37;19808:1;19832:37;;235:2275:34;;19808:1:35;19832:37;235:2275:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;235:2275:34;;;;-1:-1:-1;235:2275:34;;;;-1:-1:-1;235:2275:34;;;;;;;;;;;:::o;:::-;;;10964:1:35;235:2275:34;;;;;;;:::o;:::-;;;11133:1:35;235:2275:34;;;;;;;:::o;:::-;;;11272:2:35;235:2275:34;;;;;;;:::o;:::-;;;11458:2:35;235:2275:34;;;;;;;:::o;:::-;;;11501:1:35;235:2275:34;;;;;;;:::o;:::-;;;11731:1:35;235:2275:34;;;;;;;:::o;:::-;;;11804:2:35;235:2275:34;;;;;;;:::o;:::-;;;11872:2:35;235:2275:34;;;;;;;:::o;:::-;;;13103:1:35;235:2275:34;;;;;;;:::o;:::-;;;;;;;;;:::o;:::-;;;2043:1;235:2275;;;;;;;:::o;:::-;;;7558:2:37;235:2275:34;;;;;;;:::o;:::-;;;;;;;;;;;;;;;:::o;2212:66:35:-;;;;;;;;;;;:::o;:::-;;;;;:::i;:::-;235:2275:34;;;;;;:::i;:::-;2212:66:35;;;-1:-1:-1;;2212:66:35;;;;:::i;:::-;;;;;;;;:::o;:::-;;235:2275:34;;;;;2212:66:35;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;235:2275:34;2212:66:35;;;:::o;:::-;235:2275:34;;2212:66:35;;235:2275:34;;2212:66:35;235:2275:34;;:::i;:::-;1849:1;2212:66:35;;;-1:-1:-1;;2212:66:35;;-1:-1:-1;2212:66:35;;;;;;;;;:::o;:::-;;235:2275:34;2212:66:35;;;;;;;;;;;;;;;:::i;:::-;235:2275:34;;;;;;:::i;:::-;2212:66:35;;;-1:-1:-1;;2212:66:35;;;;:::i;:::-;;;-1:-1:-1;2212:66:35;;;;;;;;;:::o;:::-;;235:2275:34;2212:66:35;;;;;;;;;;10603:2705;10769:30;:21;235:2275:34;;:::i;:::-;10710:28:35;;;;10769:21;:::i;:::-;:30;:::i;:::-;10748:18;;;:51;;;;235:2275:34;10841:2:35;10813:30;;10809:114;;10945:18;2394:66;10945:36;:21;:18;;:21;:::i;:::-;;:36;:::i;:::-;10937:66;10933:168;;10964:1;11114:30;:21;:18;;:21;:::i;:::-;;:30;:::i;:::-;:35;11110:122;;2212:66;11253:37;:22;:18;;:22;:::i;:37::-;11245:67;11241:167;;11439:32;:22;:18;;:22;:::i;:::-;;:32;:::i;:::-;235:2275:34;;11501:1:35;11485:17;;;;;:73;;;10603:2705;11481:130;;;11644:18;11919:21;11853:32;:22;11644:18;11621:54;11637:38;11644:30;:21;11919:30;11644:18;;:21;:::i;11637:38::-;235:2275:34;;11621:13:35;;;2212:66;;11621:54;11712:36;:21;:18;;:21;:::i;:36::-;11685:16;;;2212:66;11759:58;11778:39;11785:31;:22;:18;;:22;:::i;11778:39::-;235:2275:34;;11759:16:35;;;2212:66;;11759:58;11853:18;:22;:::i;:32::-;11919:21;:::i;:30::-;11895:21;;;;:54;;;;235:2275:34;11995:1:35;11963:33;;11959:123;;12136:21;:33;:24;:21;;:24;:::i;:::-;;:33;:::i;:::-;235:2275:34;;;12183:26:35;12179:83;;12292:36;235:2275:34;;12292:36:35;:::i;:::-;12272:17;;;;:56;;;-1:-1:-1;12385:3:35;235:2275:34;;12358:25:35;;;;;12434:27;:17;;;;:::i;:27::-;235:2275:34;;12504:2:35;12479:27;;12475:125;;12642:23;;12634:32;12642:23;;:::i;:::-;2212:66;;;;12634:32;235:2275:34;;;12684:23:35;;12680:103;;-1:-1:-1;12816:5:35;;;;;;12989:17;;;:32;10964:1;12989:17;:32;:17;;;:32;:::i;:::-;2212:66;235:2275:34;;2212:66:35;;;12989:32;2212:66;12343:13;;12823:3;12850:17;:33;:20;;:17;;;:20;:::i;:::-;235:2275:34;;;;;12850:20:35;235:2275:34;;;;12850:33:35;;12846:116;;10964:1;2212:66;12801:13;;12846:116;12914:29;-1:-1:-1;12914:29:35;235:2275:34;;;12734:34:35;235:2275:34;2212:66:35;-1:-1:-1;9833:51:35;12680:103;12734:34;-1:-1:-1;12734:34:35;235:2275:34;;;12734:34:35;235:2275:34;2212:66:35;-1:-1:-1;9833:51:35;12475:125;12533:52;-1:-1:-1;12533:52:35;235:2275:34;;;-1:-1:-1;9833:51:35;12358:25;;;13081:24;12358:25;;;13081:33;12358:25;;13081:21;:24;:::i;:33::-;13145:29;235:2275:34;;13145:29:35;:::i;:::-;13124:18;;;;:50;;;-1:-1:-1;13226:3:35;235:2275:34;;13204:20:35;;;;;13269:12;13245:46;13269:12;:22;:12;10964:1;13269:12;;;:::i;:22::-;13245:18;;:46;;;;;:::i;:::-;;;:::i;:::-;;2212:66;13189:13;;13204:20;;;;;10603:2705::o;12179:83::-;12232:19;-1:-1:-1;12232:19:35;;-1:-1:-1;12232:19:35;11959:123;12019:52;-1:-1:-1;12019:52:35;235:2275:34;;;-1:-1:-1;9833:51:35;11481:130;11581:19;235:2275:34;;;11581:19:35;;;;;;;;;;:::i;:::-;;;;11485:73;11526:32;235:2275:34;;10748:18:35;235:2275:34;;11506:16:35;:52;;11485:73;;;11241:167;11358:37;:22;11335:62;11358:18;;:22;:::i;:37::-;11335:62;-1:-1:-1;11335:62:35;235:2275:34;;;;;11110:122:35;11190:30;:21;11172:49;11190:18;;:21;:::i;:30::-;11172:49;-1:-1:-1;11172:49:35;235:2275:34;;;;;10933:168:35;11052:36;:21;11026:64;11052:18;;:21;:::i;:36::-;11026:64;-1:-1:-1;11026:64:35;235:2275:34;;;;;10809:114:35;10866:46;10710:16;10866:46;235:2275:34;;;-1:-1:-1;9833:51:35;19288:292;235:2275:34;;;;-1:-1:-1;235:2275:34;19428:15:35;235:2275:34;;;-1:-1:-1;235:2275:34;;;;;;19473:29:35;19469:105;;19288:292;:::o;19469:105::-;19525:38;-1:-1:-1;19525:38:35;19428:15;235:2275:34;;-1:-1:-1;19525:38:35;1703:805:34;2231:18;2154:26;1837:14;;:::i;:::-;21133:17:35;2086:24:34;1891:21;;;21133:17:35;1891:24:34;:21;;:24;:::i;:::-;;21133:17:35;:::i;:::-;1861:55:34;;;:::i;:::-;;;;;:::i;:::-;;21133:17:35;1956:24:34;:21;;:24;:::i;21133:17:35:-;1926:55:34;;;:::i;:::-;;;;;:::i;:::-;;21133:17:35;2021:24:34;:21;;:24;:::i;21133:17:35:-;1991:55:34;;;:::i;:::-;;;;;:::i;:::-;;2086:21;:24;:::i;21133:17:35:-;2056:55:34;;;:::i;:::-;;;;;:::i;:::-;;2154:26;:::i;:::-;2231:18;;;2219:38;2231:18;;235:2275;2219:38;:::i;:::-;2272:13;1913:1;2318:3;2291:18;;235:2275;;2287:29;;;;;2354:82;;1978:1;2354:82;2359:2;2354:7;;:82;2359:2;;;2364:33;;;;;:::i;:::-;2337:99;;;;:::i;:::-;;;;;;:::i;:::-;;2212:66:35;2272:13:34;;2354:82;21133:17:35;2414:21:34;;;;:::i;21133:17:35:-;2354:82:34;;2287:29;;;;2473:27;2287:29;;2473:27;:::i;:::-;2231:18;235:2275;;;;2463:38;1703:805;:::o;14625:509:35:-;;;;14757:27;235:2275:34;;14757:27:35;:::i;:::-;14799:13;14811:1;14832:3;235:2275:34;;14814:16:35;;;;;14891:8;;;;:::i;:::-;;235:2275:34;;15452:2:35;15437:17;;15433:95;;15547:8;;15559:2;235:2275:34;15541:15:35;15547:8;;15680:30;15547:8;;:::i;:::-;235:2275:34;;;;;15547:8:35;235:2275:34;;;;15541:15:35;235:2275:34;15541:20:35;15537:90;;14832:3;15680:30;;:::i;:::-;235:2275:34;;;;:::i;:::-;15724:33:35;;;:57;;;14832:3;15720:114;;235:2275:34;;;14811:1:35;14934:5;;;;;;15098:19;;;;2212:66;15098:19;;;;;:::i;:::-;2212:66;14799:13;;14941:3;14968:10;:20;:10;;;;;:::i;:20::-;;14964:107;;2212:66;;14919:13;;14964:107;15019:33;14811:1;15019:33;235:2275:34;;;12734:34:35;235:2275:34;2212:66:35;-1:-1:-1;9833:51:35;15720:114;15804:19;14811:1;15804:19;;14811:1;15804:19;15724:57;235:2275:34;;;;15761:20:35;15724:57;;15537:90;15588:28;15595:20;:15;15601:8;;;;:::i;15595:15::-;:20;:::i;:::-;235:2275:34;;;;;;15588:28:35;14811:1;15577:39;;;;:::i;:::-;;15537:90;;15433:95;15477:40;14811:1;15477:40;235:2275:34;;;-1:-1:-1;9833:51:35;14814:16;;;;14625:509::o;235:2275:34:-;-1:-1:-1;;235:2275:34;;;;;;;:::o;16070:540:35:-;;-1:-1:-1;16267:13:35;-1:-1:-1;16302:3:35;235:2275:34;;16282:18:35;;;;;16325:47;235:2275:34;16361:10:35;;;;:::i;:::-;235:2275:34;;16325:47:35;;:::i;:::-;16321:94;;16302:3;2212:66;;16267:13;;16321:94;16392:8;;2212:66;16392:8;;:::i;:::-;16321:94;;;;;16282:18;;;16481:1;16454:32;16282:18;235:2275:34;;16454:32:35;:::i;:::-;16500:17;;;;16496:108;;16070:540;;:::o;16496:108::-;16540:53;-1:-1:-1;16540:53:35;235:2275:34;;;;;-1:-1:-1;16540:53:35;235:2275:34;;-1:-1:-1;;235:2275:34;;;;;;;:::o;:::-;;;;;;;;;;:::o;:::-;;;;;;;;;;:::o;:::-;;;;;;;;;:::o;:::-;;;;;;;;;;:::o;16833:545:35:-;;-1:-1:-1;16972:13:35;-1:-1:-1;17007:3:35;235:2275:34;;16987:18:35;;;;;17030:39;235:2275:34;17058:10:35;;;;:::i;:::-;235:2275:34;;17030:39:35;;:::i;:::-;17026:86;;17007:3;2212:66;;16972:13;;17026:86;17089:8;;2212:66;17089:8;;:::i;:::-;17026:86;;;;;16987:18;;;235:2275:34;;17261:1:35;235:2275:34;;;;;;;;;17276:17:35;;;17272:100;;16833:545;;:::o;17272:100::-;17316:45;-1:-1:-1;17316:45:35;235:2275:34;;;;;-1:-1:-1;17316:45:35;13603:440;13949:31;13603:440;13949:22;13603:440;13821:76;13603:440;235:2275:34;;;13870:25:35;;;235:2275:34;;;;;;13870:25:35;;;;;;;:::i;13949:31::-;235:2275:34;;14018:1:35;235:2275:34;;;;;14005:30:35;235:2275:34;;14005:15:35;:30;:::i;235:2275:34:-;;;;;;;;-1:-1:-1;235:2275:34;;-1:-1:-1;235:2275:34;;;-1:-1:-1;235:2275:34;:::o;18401:677:35:-;;;235:2275:34;;;;;;;;;;;;;;18648:37:35;;;;:82;;;18401:677;18644:125;;;18782:25;;235:2275:34;;;;;18782:53:35;18778:96;;235:2275:34;18926:3:35;235:2275:34;;18903:21:35;;;;;235:2275:34;18949:28:35;;;;:::i;:::-;235:2275:34;;;;;;;;;;;;18949:45:35;18981:13;;;;;:::i;18949:45::-;235:2275:34;;18949:45:35;18945:96;;2212:66;;18888:13;;18945:96;19014:12;;;235:2275:34;19014:12:35;:::o;18903:21::-;;;;2212:66;18401:677;:::o;18778:96::-;18851:12;;235:2275:34;18851:12:35;:::o;18648:82::-;18689:26;;;;;235:2275:34;18689:41:35;;18648:82;;;6145:316:93;235:2275:34;;;;;;;2920:29:93;235:2275:34;;;;;;;;;;;;;;;;2920:29:93;235:2275:34;;;;;;;;;;6281:29:93;235:2275:34;;;;;;;;;;;;;;;;6281:29:93;6313:4;235:2275:34;;;;;;;;735:10:121;235:2275:34;;6336:40:93;;235:2275:34;6336:40:93;;6313:4;6390:11;:::o;6698:317::-;235:2275:34;;;;;;;2920:29:93;235:2275:34;;;;;;;;;;;;;;;;2920:29:93;235:2275:34;;;;;;;;;;;6834:29:93;235:2275:34;;;;;;;;;;;;;;;;6834:29:93;235:2275:34;;;;;;;735:10:121;235:2275:34;;6890:40:93;;235:2275:34;6890:40:93;;235:2275:34;6944:11:93;:::o;14227:174:35:-;235:2275:34;;;;;14351:18:35;235:2275:34;;;14340:53:35;;235:2275:34;;;2605:66:35;235:2275:34;;;;;14340:53:35;;;;;;:::i;:::-;235:2275:34;14330:64:35;;14227:174;:::o;235:2275:34:-;;;;;;;;:::i;:::-;2546:1:37;235:2275:34;;;2212:66:35;235:2275:34;;;2212:66:35;235:2275:34:o;:::-;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;-1:-1:-1;;235:2275:34;;;;:::i;1287:390:37:-;1607:20;:29;1287:390;;;;235:2275:34;1508:2:37;235:2275:34;:::i;:::-;;;;;;;;:::i;:::-;1508:2:37;235:2275:34;;;1508:2:37;235:2275:34;:::i;:::-;-1:-1:-1;;1508:2:37;235:2275:34;;;;2212:66:35;;;1521:63:37;1607:20;:::i;:29::-;1648:21;8580:13;235:2275:34;;8580:13:37;:::i;:::-;235:2275:34;;;8611:13:37;;:33;;;1287:390;8603:42;;;:::i;:::-;8666:26;8676:15;-1:-1:-1;8676:15:37;;:::i;:::-;8666:26;:::i;:::-;8702:18;-1:-1:-1;;235:2275:34;1667:1:37;8888:14;;;;;;1600:70;;;;;;;:::i;8904:6::-;8969:5;9033:37;8985:3;9041:21;:16;9047:9;;8969:5;;8592:1;8969:5;235:2275:34;;;;8969:5:37;8966:9;;8930:59;8966:9;8952:37;8966:9;8960:21;:16;8966:9;;;;;:::i;8960:16::-;235:2275:34;;;;;;8960:21:37;8959:29;235:2275:34;;;;;;8952:37:37;1667:1;8930:59;;;:::i;:::-;;9047:9;:::i;9041:16::-;235:2275:34;;;;9033:37:37;1667:1;9007:63;;8743:1;235:2275:34;;9007:63:37;;:::i;:::-;;235:2275:34;8881:204:37;;8611:33;-1:-1:-1;8628:16:37;8611:33;;235:2275:34;;;;;;;:::i;:::-;-1:-1:-1;235:2275:34;;;;;;;:::o;2457:221:38:-;235:2275:34;;:::i;:::-;;2568:58:38;235:2275:34;;;;;;;;;:::i;:::-;2212:66:35;;2568:58:38;;2643:28;;2212:66:35;2457:221:38;:::o;235:2275:34:-;;;;:::o;7796:439:38:-;235:2275:34;;7883:12:38;;;:30;;;;7796:439;235:2275:34;;;;7957:21:38;;;:::i;:::-;7989:14;8013:192;;;;;;;8215:13;7796:439;:::o;8013:192::-;;;;;;;7796:439;:::o;7883:30::-;7911:2;7899:14;;;;7883:30;;;4170:519;4266:12;;;:::i;:::-;235:2275:34;;;4306:14:38;;;:::i;:::-;2212:66:35;;;:::i;:::-;235:2275:34;;;;;;;:::i;:::-;2212:66:35;;;-1:-1:-1;;235:2275:34;;;:::i;:::-;;-1:-1:-1;235:2275:34;;;;;;4404:11:38;;235:2275:34;4404:41:38;:11;;235:2275:34;4418:27:38;;;:::i;:::-;4404:41;;:::i;:::-;-1:-1:-1;4480:179:38;4500:9;;;;;;4669:13;;;4170:519;:::o;4511:3::-;4632:16;4540:19;;2212:66:35;4540:19:38;;:::i;:::-;235:2275:34;;;:::i;:::-;2212:66:35;;;4585:24:38;235:2275:34;4585:24:38;;2212:66:35;4573:36:38;;;;:::i;:::-;;;;;;:::i;:::-;;4632:16;:::i;:::-;4511:3;2212:66:35;4485:13:38;;;235:2275:34;;;;;:::i;:::-;;;;;;;;;;8413:298:38;8545:2;235:2275:34;;8533:14:38;235:2275:34;;8600:11:38;;235:2275:34;8614:1:38;235:2275:34;;;;;;;8625:56:38;8413:298;:::o;8857:379::-;235:2275:34;;8950:12:38;235:2275:34;;9006:21:38;9202:3;9006:21;;:::i;:::-;9059:14;;;;;;:::i;:::-;9109:61;;;;9202:3;;:::i;235:2275:34:-;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;:::i;:::-;;;:::i;:::-;;-1:-1:-1;;235:2275:34;;;;;;:::i;:::-;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;21886:523:35:-;-1:-1:-1;;235:2275:34;22047:3:35;235:2275:34;;22029:16:35;;;;;22076:31;2212:66;22098:8;;;;;:::i;:::-;;22076:31;;:::i;:::-;22047:3;2212:66;22014:13;;;22029:16;;;;235:2275:34;;22149:2:35;22132:19;;22128:120;;235:2275:34;22328:74:35;22282:29;235:2275:34;;22282:29:35;:::i;:::-;235:2275:34;22328:74:35;22345:37;22352:29;22358:22;235:2275:34;;22358:22:35;:::i;22345:37::-;235:2275:34;;;22328:74:35;;;;;;;:::i;22128:120::-;22191:36;22198:28;22204:21;22174:63;22204:21;;:::i;22191:36::-;22174:63;235:2275:34;;22174:63:35;;;;;;;:::i;235:2275:34:-;;;15552:2:35;235:2275:34;;;;;;;:::o;:::-;;;;;;;;;;;;;:::o;21295:440:35:-;21403:1;235:2275:34;;21389:15:35;:39;;;21295:440;21385:80;;235:2275:34;;21491:2:35;21478:15;;21474:108;;235:2275:34;21658:70:35;21616:25;235:2275:34;;21616:25:35;:::i;:::-;235:2275:34;21658:70:35;21675:37;21682:29;21688:22;235:2275:34;;21688:22:35;:::i;21474:108::-;21533:32;21540:24;21546:17;21516:55;21546:17;;:::i;21389:39::-;21414:6;21424:4;235:2275:34;21408:13:35;21414:6;;;;:::i;21408:13::-;235:2275:34;21408:20:35;21389:39;;235:2275:34;;;;;;;;;;;;:::o;:::-;;-1:-1:-1;235:2275:34;;;:::o;20106:284:35:-;;235:2275:34;20260:3:35;235:2275:34;;20237:21:35;;;;;235:2275:34;20283:13:35;;;;:::i;:::-;235:2275:34;;;;;;;;;;20283:23:35;20279:73;;2212:66;;20222:13;;20608:282;;235:2275:34;20760:3:35;235:2275:34;;20737:21:35;;;;;235:2275:34;20783:13:35;;;;:::i;:::-;235:2275:34;;;;;20783:23:35;20779:73;;2212:66;;20722:13;;8452:649:37;;;8580:13;235:2275:34;;8580:13:37;:::i;:::-;235:2275:34;;;8611:13:37;;:33;;;8452:649;8603:42;;;:::i;:::-;8666:26;8676:15;;;;:::i;8666:26::-;8702:18;;8734:10;8743:1;8734:10;;;:15;8730:118;;8452:649;-1:-1:-1;;235:2275:34;;;8881:204:37;8888:14;;;;;;8452:649;;;;;:::o;8904:6::-;8969:5;9007:63;8743:1;9033:37;8985:3;9041:21;:16;9047:9;;8969:5;8592:1;8969:5;8930:59;8952:37;8969:5;8960:21;8969:5;8966:9;;8969:5;8960:16;8969:5;235:2275:34;;;;8969:5:37;8966:9;;;:::i;8952:37::-;235:2275:34;;;8930:59:37;;8623:1;8930:59;;;:::i;:::-;;9047:9;;:::i;9033:37::-;8623:1;9007:63;235:2275:34;;9007:63:37;;:::i;:::-;;235:2275:34;8881:204:37;;;;8730:118;8795:10;;235:2275:34;8786:26:37;:21;8792:14;;8795:10;;235:2275:34;;;;8795:10:37;8792:14;;:::i;8786:26::-;235:2275:34;;;8623:1:37;8765:55;;;;:::i;:::-;;-1:-1:-1;;8834:3:37;;;:::i;:::-;8730:118;;;;;8611:33;-1:-1:-1;8628:16:37;;;;8611:33;;2316:5418;;2546:1;2557:20;2546:1;235:2275:34;;:::i;:::-;;;;2676:17:37;2672:223;;2963:13;;2546:1;2958:4724;2996:3;235:2275:34;;2978:16:37;;;;;3078:6;;;;:50;;2996:3;3074:97;;3285:6;:47;;;;2996:3;3281:94;;;3501:17;:8;;;;:::i;:17::-;235:2275:34;;;3552:1:37;3537:16;;3533:4139;3552:1;;;3731:7;3703:46;3731:17;:7;;;:::i;:17::-;3703:46;:::i;:::-;3791:56;3865:28;3791:56;;;;;:::i;:::-;3865:28;;;:::i;:::-;235:2275:34;;-1:-1:-1;3912:994:37;;4924:1185;;;235:2275:34;5002:16:37;235:2275:34;;5002:16:37;:::i;:::-;-1:-1:-1;4994:144:37;;235:2275:34;-1:-1:-1;5160:109:37;;5302:7;5338:18;5302:7;;:::i;5160:109::-;5234:12;;;:::i;4924:1185::-;235:2275:34;;;5481:16:37;235:2275:34;;5481:16:37;:::i;:::-;5476:21;;5472:138;;5637:7;5636:17;5637:16;:7;2212:66:35;5637:7:37;;:::i;:::-;;:16;:::i;:::-;5636:17;;235:2275:34;5636:17:37;5637:7;;;5824;:26;:7;;:::i;:::-;;:26;:::i;:::-;5632:459;;2212:66:35;2963:13:37;;;;;5632:459;6041:7;:27;:7;;:::i;:::-;;5445:11:38;;;235:2275:34;;;5522:62:38;;5341:272;;6041:27:37;5632:459;;;3912:994;235:2275:34;;;;;;4705:16:37;235:2275:34;;;4705:16:37;:::i;:::-;-1:-1:-1;4697:149:37;;4875:12;;:::i;3533:4139::-;6133:17;;;;;;6148:2;6133:17;6148:2;;235:2275:34;;6206:36:37;;6222:20;;6438:17;6373:43;6381:34;6387:27;;;;;:::i;6373:43::-;6438:17;;:::i;:::-;6481:12;6491:2;6481:12;;;6477:146;;6649:33;6669:12;;;;:::i;:::-;;6649:33;:::i;:::-;6669:12;;;235:2275:34;;;;6753:16:37;235:2275:34;;;;6753:16:37;:::i;:::-;6748:21;6744:157;;6934:12;;:::i;6645:555::-;6980:12;6979:22;6980:21;:12;;2212:66:35;6980:12:37;;;;;;;:::i;6979:22::-;6980:12;;;7044:31;:12;;;;:::i;6975:225::-;7145:32;:12;;;;:::i;6202:1388::-;235:2275:34;;;7398:16:37;235:2275:34;;7398:16:37;:::i;:::-;7393:21;7389:135;;7553:8;:18;:8;;:::i;6129:1543::-;235:2275:34;;7628:29:37;;;235:2275:34;7628:29:37;;;235:2275:34;;;;;;;;;;;;;11581:19:35;3285:47:37;3323:8;;3311:21;3323:8;;;;:::i;:::-;;3311:21;:::i;:::-;3295:37;;3285:47;;;3078:50;3100:8;:28;:8;;;;:::i;:28::-;3088:40;;;3078:50;;2672:223;2772:78;;;2764:87;2772:78;;2784:66;2772:78;;;2764:87;:::i;:::-;2872:12;;:::i;3469:281:38:-;;3598:11;;;235:2275:34;3583:27:38;235:2275:34;;3583:27:38;:::i;:::-;235:2275:34;;;;;;;;;;;;;;;;;;;;3723:20:38;3469:281;:::o;4838:321::-;235:2275:34;;4918:13:38;4914:31;;4994:11;868:4;4994:11;;235:2275:34;5015:64:38;235:2275:34;5015:64:38;5093:24;5089:42;;5148:4;4838:321;:::o;4914:31::-;4933:12;235:2275:34;4933:12:38;:::o;9434:424::-;235:2275:34;;9518:13:38;9514:27;;235:2275:34;9597:11:38;;;;235:2275:34;;;9611:27:38;;;:::i;:::-;235:2275:34;;;;;;;;;;;;;;;;;;9697:132:38;;9704:16;;;;;;9839:12;;;9434:424;:::o;9697:132::-;9756:20;;;:::i;:::-;235:2275:34;;;;;;;9811:7:38;9736:40;9811:7;;:::i;:::-;9697:132;;;11485:581;11589:64;235:2275:34;11589:64:38;682:4;11667:26;;682:4;;;11709:8;235:2275:34;11709:8:38;:::o;11663:397::-;776:4;11738:25;;:83;;;;11663:397;11734:326;;;11837:8;11844:1;11837:8;:::o;11734:326::-;868:4;11866:24;;868:4;;;11943:35;;:31;;958:4;11943:31;;;:::i;:::-;:35;:::i;11862:198::-;12016:33;;:29;;958:4;12016:29;235:2275:34;11738:83:38;11768:25;868:4;11768:25;;;:52;;11738:83;11768:52;11797:23;958:4;11797:23;;11738:83;;10045:1263;10171:64;;-1:-1:-1;10171:64:38;;682:4;10249:26;;682:4;;;10291:11;;10301:1;10045:1263;:::o;10245:1032::-;776:4;10323:25;;776:4;;;10374:26;;:30;:26;;:::i;10319:958::-;868:4;10425:24;;868:4;;;10465:385;;;;;;;;;;;;;;;;235:2275:34;:::o;10421:856:38:-;958:4;10870:23;;958:4;;;10919:24;;:28;:24;;:::i;10866:411::-;10978:289;;;;;;;;;;;;;;;;235:2275:34;:::o;1035:2:38:-;;;;;;;;;:::o;12279:770::-;;;12360:8;;12356:21;;12441:16;1035:2;12441:16;;;;;12642:7;12638:405;;12279:770;;;:::o;12638:405::-;12764:24;12772:15;12764:28;12772:15;;:::i;:::-;12764:24;:::i;:::-;:28;:::i;:::-;12806:227;;;;;;;;;;;;12279:770::o;12459:16::-;12491:65;;;;;;1035:2;235:2275:34;;;;;;;12600:17:38;1035:2;235:2275:34;;;;;;;12459:16:38;-1:-1:-1;;235:2275:34;;;;;;12434:194:38;235:2275:34;;:::i;6262:337:38:-;6372:19;235:2275:34;;6372:19:38;:::i;:::-;235:2275:34;;;6405:18:38;6401:37;;6542:11;6470:57;6560:8;6542:11;;235:2275:34;;;6470:57:38;;;;6560:8;;:::i;6401:37::-;6425:13;;:::o;22572:430:35:-;-1:-1:-1;22657:19:35;;22717:8;;;22812:17;;;;:::i;:::-;22839:11;22860:116;22885:5;;;22985:10;;22572:430;:::o;22892:3::-;22915:5;;;:::i;:::-;22911:31;235:2275:34;;;;;-1:-1:-1;22911:31:35;;;;:::i;:::-;;235:2275:34;;22892:3:35;235:2275:34;;;;-1:-1:-1;;235:2275:34;22865:18:35;;;;22710:73;22741:8;;;;:::i;:::-;235:2275:34;22771:1:35;235:2275:34;22710:73:35;;;2419:778:131;235:2275:34;;;2419:778:131;2609:2;2589:22;;2609:2;;3041:25;2825:196;;;;;;;;;;;;;;;-1:-1:-1;2825:196:131;3041:25;;:::i;:::-;3034:32;;;;;:::o;2585:606::-;3097:83;;3113:1;3097:83;3117:35;3097:83;;:::o;10970:270:37:-;235:2275:34;;11081:2:37;11069:14;;11081:2;;;5445:11:38;11081:2:37;5445:11:38;;235:2275:34;;;5522:62:38;;11099:32:37;:::o;11065:169::-;5445:11:38;11081:2:37;5445:11:38;235:2275:34;5522:62:38;235:2275:34;;11081:2:37;11179:43;;235:2275:34;;;11081:2:37;11179:43;;;235:2275:34;11179:43:37;;:::i;7919:335::-;8034:1;235:2275:34;;8022:13:37;8018:56;;8117:11;;235:2275:34;8138:60:37;235:2275:34;8138:60:37;8219:4;8214:9;;7919:335::o;5788:270:38:-;5909:21;5788:270;5909:21;:::i;:::-;5964:65;;5788:270;:::o;9342:729:37:-;;235:2275:34;;9472:13:37;235:2275:34;;9538:3:37;9518:17;:12;9524:5;;;;:::i;9518:17::-;:23;9583:16;;;9615:10;10038:25;9624:1;235:2275:34;9579:434:37;10038:25;:::i;9579:434::-;9689:1;9674:16;;9689:1;;9706:10;10038:25;9689:1;235:2275:34;9670:343:37;10038:25;:::i;9670:343::-;9780:1;9765:16;;9780:1;;9797:10;10038:25;9780:1;9689;9761:252;10038:25;:::i;9761:252::-;9870:1;9855:16;9870:1;;10038:25;9689:1;9911:13;9851:162;10038:25;:::i;10353:320::-;;;235:2275:34;10548:3:37;235:2275:34;;;;;;;;;;10505:24:37;;:41;;;10548:3;10505:41;;;10571:16;235:2275:34;;10571:16:37;;:::i;:::-;235:2275:34;;;10591:5:37;;;;:::i;:::-;235:2275:34;;10571:25:37;;10567:72;;10548:3;;;:::i;:::-;10498:151;;10567:72;10616:8;;;;;:::o;10505:41::-;;;;;;10353:320;:::o;10505:41::-;235:2275:34;;;10533:13:37;;10505:41;;7129:1551:131;;;8209:66;8196:79;;8192:164;;235:2275:34;;;;;;-1:-1:-1;235:2275:34;;;;;;;;;;;;;;;;;;;8467:24:131;;;;;;;;;-1:-1:-1;8467:24:131;235:2275:34;;;8505:20:131;8501:113;;8624:49;-1:-1:-1;8624:49:131;-1:-1:-1;7129:1551:131;:::o;8501:113::-;8541:62;-1:-1:-1;8541:62:131;8467:24;8541:62;-1:-1:-1;8541:62:131;:::o;8467:24::-;235:2275:34;;;;;;;;;8192:164:131;8291:54;;;8307:1;8291:54;8311:30;8291:54;;:::o","linkReferences":{}},"methodIdentifiers":{"DEFAULT_ADMIN_ROLE()":"a217fddf","PROOF_SUBMITTER_ROLE()":"5972185a","getClientState()":"ef913a4b","getConsensusState(uint64)":"edce8bdc","getRoleAdmin(bytes32)":"248a9ca3","grantRole(bytes32,address)":"2f2ff15d","hasRole(bytes32,address)":"91d14854","misbehaviour(bytes)":"ddba6537","renounceRole(bytes32,address)":"36568abe","revokeRole(bytes32,address)":"d547741f","supportsInterface(bytes4)":"01ffc9a7","updateClient(bytes)":"0bece356","verifyMembership((bytes,(uint64,uint64),bytes[],bytes))":"682ed5f0","verifyNonMembership((bytes,(uint64,uint64),bytes[]))":"4d6d9ffb"},"rawMetadata":"{\"compiler\":{\"version\":\"0.8.28+commit.7893614a\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"ibcRouter\",\"type\":\"address\"},{\"internalType\":\"uint64\",\"name\":\"initialTrustedHeight\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"initialTrustedTimestamp\",\"type\":\"uint64\"},{\"internalType\":\"bytes32\",\"name\":\"initialTrustedStorageRoot\",\"type\":\"bytes32\"},{\"internalType\":\"address[]\",\"name\":\"initialTrustedValidators\",\"type\":\"address[]\"},{\"internalType\":\"uint64\",\"name\":\"trustingPeriod\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"maxClockDrift\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"roleManager\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"AccessControlBadConfirmation\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"internalType\":\"bytes32\",\"name\":\"neededRole\",\"type\":\"bytes32\"}],\"name\":\"AccessControlUnauthorizedAccount\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"revisionHeight\",\"type\":\"uint64\"}],\"name\":\"ConflictingConsensusState\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"trustedTimestamp\",\"type\":\"uint64\"},{\"internalType\":\"uint256\",\"name\":\"currentTimestamp\",\"type\":\"uint256\"},{\"internalType\":\"uint64\",\"name\":\"trustingPeriod\",\"type\":\"uint64\"}],\"name\":\"ConsensusStateExpired\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"revisionHeight\",\"type\":\"uint64\"}],\"name\":\"ConsensusStateNotFound\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"signer\",\"type\":\"address\"}],\"name\":\"DuplicateCommitSealSigner\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"validator\",\"type\":\"address\"}],\"name\":\"DuplicateValidator\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"EmptyValidatorSet\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"currentTimestamp\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"headerTimestamp\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxClockDrift\",\"type\":\"uint256\"}],\"name\":\"HeaderFromFuture\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"actual\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"required\",\"type\":\"uint256\"}],\"name\":\"InsufficientTrustedValidatorOverlap\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"actual\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"required\",\"type\":\"uint256\"}],\"name\":\"InsufficientValidatorQuorum\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidCommitSeal\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"expectedValue\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"actualValue\",\"type\":\"bytes32\"}],\"name\":\"InvalidCommitmentValue\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"actualDifficulty\",\"type\":\"uint256\"}],\"name\":\"InvalidDifficulty\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"length\",\"type\":\"uint256\"}],\"name\":\"InvalidECDSASignatureLength\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"itemsLength\",\"type\":\"uint256\"}],\"name\":\"InvalidExtraDataFormat\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"itemsLength\",\"type\":\"uint256\"}],\"name\":\"InvalidHeaderFormat\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidHeaderHeight\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"actualMixHash\",\"type\":\"bytes32\"}],\"name\":\"InvalidMixHash\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"actualNonce\",\"type\":\"bytes\"}],\"name\":\"InvalidNonce\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"actualOmmersHash\",\"type\":\"bytes32\"}],\"name\":\"InvalidOmmersHash\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"expectedLength\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"actualLength\",\"type\":\"uint256\"}],\"name\":\"InvalidPathLength\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"providedRevisionNumber\",\"type\":\"uint64\"}],\"name\":\"InvalidRevisionNumber\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"validator\",\"type\":\"address\"}],\"name\":\"InvalidValidatorAddress\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"length\",\"type\":\"uint256\"}],\"name\":\"InvalidValidatorAddressLength\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"expectedLength\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"actualLength\",\"type\":\"uint256\"}],\"name\":\"InvalidValueLength\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"UnsupportedMisbehaviour\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"actualValue\",\"type\":\"bytes32\"}],\"name\":\"ValueExists\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"previousAdminRole\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"newAdminRole\",\"type\":\"bytes32\"}],\"name\":\"RoleAdminChanged\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"RoleGranted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"RoleRevoked\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"DEFAULT_ADMIN_ROLE\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"PROOF_SUBMITTER_ROLE\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getClientState\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"revisionHeight\",\"type\":\"uint64\"}],\"name\":\"getConsensusState\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"}],\"name\":\"getRoleAdmin\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"grantRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"hasRole\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"name\":\"misbehaviour\",\"outputs\":[],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"callerConfirmation\",\"type\":\"address\"}],\"name\":\"renounceRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"revokeRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes4\",\"name\":\"interfaceId\",\"type\":\"bytes4\"}],\"name\":\"supportsInterface\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"updateMsg\",\"type\":\"bytes\"}],\"name\":\"updateClient\",\"outputs\":[{\"internalType\":\"enum ILightClientMsgs.UpdateResult\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes\",\"name\":\"proof\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"uint64\",\"name\":\"revisionNumber\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"revisionHeight\",\"type\":\"uint64\"}],\"internalType\":\"struct IICS02ClientMsgs.Height\",\"name\":\"proofHeight\",\"type\":\"tuple\"},{\"internalType\":\"bytes[]\",\"name\":\"path\",\"type\":\"bytes[]\"},{\"internalType\":\"bytes\",\"name\":\"value\",\"type\":\"bytes\"}],\"internalType\":\"struct ILightClientMsgs.MsgVerifyMembership\",\"name\":\"msg_\",\"type\":\"tuple\"}],\"name\":\"verifyMembership\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes\",\"name\":\"proof\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"uint64\",\"name\":\"revisionNumber\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"revisionHeight\",\"type\":\"uint64\"}],\"internalType\":\"struct IICS02ClientMsgs.Height\",\"name\":\"proofHeight\",\"type\":\"tuple\"},{\"internalType\":\"bytes[]\",\"name\":\"path\",\"type\":\"bytes[]\"}],\"internalType\":\"struct ILightClientMsgs.MsgVerifyNonMembership\",\"name\":\"msg_\",\"type\":\"tuple\"}],\"name\":\"verifyNonMembership\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"errors\":{\"AccessControlBadConfirmation()\":[{\"details\":\"The caller of a function is not the expected one. NOTE: Don't confuse with {AccessControlUnauthorizedAccount}.\"}],\"AccessControlUnauthorizedAccount(address,bytes32)\":[{\"details\":\"The `account` is missing a role.\"}],\"ConflictingConsensusState(uint64)\":[{\"params\":{\"revisionHeight\":\"The conflicting revision height.\"}}],\"ConsensusStateExpired(uint64,uint256,uint64)\":[{\"params\":{\"currentTimestamp\":\"The current block timestamp.\",\"trustedTimestamp\":\"Timestamp of the trusted consensus state.\",\"trustingPeriod\":\"The configured trusting period.\"}}],\"ConsensusStateNotFound(uint64)\":[{\"params\":{\"revisionHeight\":\"The requested revision height.\"}}],\"DuplicateCommitSealSigner(address)\":[{\"params\":{\"signer\":\"The duplicate signer address.\"}}],\"DuplicateValidator(address)\":[{\"params\":{\"validator\":\"The duplicate validator address.\"}}],\"HeaderFromFuture(uint256,uint256,uint256)\":[{\"params\":{\"currentTimestamp\":\"The current block timestamp.\",\"headerTimestamp\":\"The submitted header timestamp.\",\"maxClockDrift\":\"The configured maximum clock drift.\"}}],\"InsufficientTrustedValidatorOverlap(uint256,uint256)\":[{\"params\":{\"actual\":\"The number of trusted validators that signed.\",\"required\":\"The minimum required trusted signer count.\"}}],\"InsufficientValidatorQuorum(uint256,uint256)\":[{\"params\":{\"actual\":\"The number of new validators that signed.\",\"required\":\"The minimum required signer count.\"}}],\"InvalidCommitmentValue(bytes32,bytes32)\":[{\"params\":{\"actualValue\":\"The proven commitment value.\",\"expectedValue\":\"The expected commitment value.\"}}],\"InvalidDifficulty(uint256)\":[{\"params\":{\"actualDifficulty\":\"The difficulty found in the header.\"}}],\"InvalidECDSASignatureLength(uint256)\":[{\"params\":{\"length\":\"The invalid signature length.\"}}],\"InvalidExtraDataFormat(uint256)\":[{\"params\":{\"itemsLength\":\"The decoded `extraData` item count.\"}}],\"InvalidHeaderFormat(uint256)\":[{\"params\":{\"itemsLength\":\"The decoded header item count.\"}}],\"InvalidMixHash(bytes32)\":[{\"params\":{\"actualMixHash\":\"The mix hash found in the header.\"}}],\"InvalidNonce(bytes)\":[{\"params\":{\"actualNonce\":\"The nonce found in the header.\"}}],\"InvalidOmmersHash(bytes32)\":[{\"params\":{\"actualOmmersHash\":\"The ommers hash found in the header.\"}}],\"InvalidPathLength(uint256,uint256)\":[{\"params\":{\"actualLength\":\"The actual path length.\",\"expectedLength\":\"The expected path length.\"}}],\"InvalidRevisionNumber(uint64)\":[{\"params\":{\"providedRevisionNumber\":\"The non-zero revision number.\"}}],\"InvalidValidatorAddress(address)\":[{\"params\":{\"validator\":\"The invalid validator address.\"}}],\"InvalidValidatorAddressLength(uint256)\":[{\"params\":{\"length\":\"The decoded validator address length.\"}}],\"InvalidValueLength(uint256,uint256)\":[{\"params\":{\"actualLength\":\"The actual value length.\",\"expectedLength\":\"The expected value length.\"}}],\"ValueExists(bytes32)\":[{\"params\":{\"actualValue\":\"The value found at the proven storage slot.\"}}]},\"events\":{\"RoleAdminChanged(bytes32,bytes32,bytes32)\":{\"details\":\"Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite {RoleAdminChanged} not being emitted to signal this.\"},\"RoleGranted(bytes32,address,address)\":{\"details\":\"Emitted when `account` is granted `role`. `sender` is the account that originated the contract call. This account bears the admin role (for the granted role). Expected in cases where the role was granted using the internal {AccessControl-_grantRole}.\"},\"RoleRevoked(bytes32,address,address)\":{\"details\":\"Emitted when `account` is revoked `role`. `sender` is the account that originated the contract call: - if using `revokeRole`, it is the admin role bearer - if using `renounceRole`, it is the role bearer (i.e. `account`)\"}},\"kind\":\"dev\",\"methods\":{\"constructor\":{\"params\":{\"ibcRouter\":\"Counterparty ICS26 router address whose storage is proven.\",\"initialTrustedHeight\":\"Initial trusted Besu height.\",\"initialTrustedStorageRoot\":\"Initial trusted storage root of `ibcRouter`.\",\"initialTrustedTimestamp\":\"Initial trusted header timestamp in seconds.\",\"initialTrustedValidators\":\"Initial trusted validator set.\",\"maxClockDrift\":\"Maximum allowed future drift in seconds for submitted headers.\",\"roleManager\":\"Address that administers proof submission; if zero, proof submission is open.\",\"trustingPeriod\":\"Maximum age in seconds for trusted consensus states.\"}},\"getClientState()\":{\"returns\":{\"_0\":\"The client state.\"}},\"getConsensusState(uint64)\":{\"params\":{\"revisionHeight\":\"The revision height to query.\"},\"returns\":{\"_0\":\"The ABI-encoded consensus state.\"}},\"getRoleAdmin(bytes32)\":{\"details\":\"Returns the admin role that controls `role`. See {grantRole} and {revokeRole}. To change a role's admin, use {_setRoleAdmin}.\"},\"grantRole(bytes32,address)\":{\"details\":\"Grants `role` to `account`. If `account` had not been already granted `role`, emits a {RoleGranted} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleGranted} event.\"},\"hasRole(bytes32,address)\":{\"details\":\"Returns `true` if `account` has been granted `role`.\"},\"misbehaviour(bytes)\":{\"params\":{\"misbehaviourMsg\":\"The misbehaviour message\"}},\"renounceRole(bytes32,address)\":{\"details\":\"Revokes `role` from the calling account. Roles are often managed via {grantRole} and {revokeRole}: this function's purpose is to provide a mechanism for accounts to lose their privileges if they are compromised (such as when a trusted device is misplaced). If the calling account had been revoked `role`, emits a {RoleRevoked} event. Requirements: - the caller must be `callerConfirmation`. May emit a {RoleRevoked} event.\"},\"revokeRole(bytes32,address)\":{\"details\":\"Revokes `role` from `account`. If `account` had been granted `role`, emits a {RoleRevoked} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleRevoked} event.\"},\"supportsInterface(bytes4)\":{\"details\":\"Returns true if this contract implements the interface defined by `interfaceId`. See the corresponding https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[ERC section] to learn more about how these ids are created. This function call must use less than 30 000 gas.\"},\"updateClient(bytes)\":{\"params\":{\"updateMsg\":\"The encoded update message e.g., an SP1 proof.\"},\"returns\":{\"_0\":\"The result of the update operation\"}},\"verifyMembership((bytes,(uint64,uint64),bytes[],bytes))\":{\"details\":\"Notice that this message is not view, as it may update the client state for caching purposes.\",\"params\":{\"msg_\":\"The membership message\"},\"returns\":{\"_0\":\"The unix timestamp of the verification height in the counterparty chain in seconds.\"}},\"verifyNonMembership((bytes,(uint64,uint64),bytes[]))\":{\"details\":\"Notice that this message is not view, as it may update the client state for caching purposes.\",\"params\":{\"msg_\":\"The membership message\"},\"returns\":{\"_0\":\"The unix timestamp of the verification height in the counterparty chain in seconds.\"}}},\"title\":\"Besu IBFT2 Light Client\",\"version\":1},\"userdoc\":{\"errors\":{\"ConflictingConsensusState(uint64)\":[{\"notice\":\"A different consensus state already exists at the submitted height.\"}],\"ConsensusStateExpired(uint64,uint256,uint64)\":[{\"notice\":\"The trusted consensus state is outside the trusting period.\"}],\"ConsensusStateNotFound(uint64)\":[{\"notice\":\"No consensus state exists for the requested height.\"}],\"DuplicateCommitSealSigner(address)\":[{\"notice\":\"A commit seal signer appears more than once.\"}],\"DuplicateValidator(address)\":[{\"notice\":\"A validator appears more than once.\"}],\"EmptyValidatorSet()\":[{\"notice\":\"The validator set is empty.\"}],\"HeaderFromFuture(uint256,uint256,uint256)\":[{\"notice\":\"The submitted header timestamp is too far in the future.\"}],\"InsufficientTrustedValidatorOverlap(uint256,uint256)\":[{\"notice\":\"The submitted signers do not overlap enough with the trusted validator set.\"}],\"InsufficientValidatorQuorum(uint256,uint256)\":[{\"notice\":\"The submitted signers do not meet quorum for the new validator set.\"}],\"InvalidCommitSeal()\":[{\"notice\":\"A commit seal did not recover a valid signer.\"}],\"InvalidCommitmentValue(bytes32,bytes32)\":[{\"notice\":\"A proven commitment value does not match the expected value.\"}],\"InvalidDifficulty(uint256)\":[{\"notice\":\"The Besu BFT difficulty is invalid.\"}],\"InvalidECDSASignatureLength(uint256)\":[{\"notice\":\"An ECDSA signature has an invalid length.\"}],\"InvalidExtraDataFormat(uint256)\":[{\"notice\":\"The submitted `extraData` field has an invalid RLP item count.\"}],\"InvalidHeaderFormat(uint256)\":[{\"notice\":\"The submitted header has an invalid RLP item count.\"}],\"InvalidHeaderHeight()\":[{\"notice\":\"The submitted header height is zero.\"}],\"InvalidMixHash(bytes32)\":[{\"notice\":\"The Besu BFT mix hash is invalid.\"}],\"InvalidNonce(bytes)\":[{\"notice\":\"The Besu BFT nonce is invalid.\"}],\"InvalidOmmersHash(bytes32)\":[{\"notice\":\"The ommers hash is invalid.\"}],\"InvalidPathLength(uint256,uint256)\":[{\"notice\":\"A proof path has an invalid length.\"}],\"InvalidRevisionNumber(uint64)\":[{\"notice\":\"The revision number must be zero for Besu light client heights.\"}],\"InvalidValidatorAddress(address)\":[{\"notice\":\"A validator address is invalid.\"}],\"InvalidValidatorAddressLength(uint256)\":[{\"notice\":\"A validator address has an invalid byte length.\"}],\"InvalidValueLength(uint256,uint256)\":[{\"notice\":\"A membership value has an invalid length.\"}],\"UnsupportedMisbehaviour()\":[{\"notice\":\"Misbehaviour handling is not supported by this client.\"}],\"ValueExists(bytes32)\":[{\"notice\":\"A non-membership proof found an existing value.\"}]},\"kind\":\"user\",\"methods\":{\"PROOF_SUBMITTER_ROLE()\":{\"notice\":\"Role allowed to submit client updates and proof verifications.\"},\"constructor\":{\"notice\":\"Creates a Besu IBFT2 light client from an initial trusted consensus state.\"},\"getClientState()\":{\"notice\":\"Returns the client state.\"},\"getConsensusState(uint64)\":{\"notice\":\"Returns the encoded consensus state for a revision height.\"},\"misbehaviour(bytes)\":{\"notice\":\"Misbehaviour handling, moves the light client to the frozen state if misbehaviour is detected\"},\"updateClient(bytes)\":{\"notice\":\"Updating the client and consensus state\"},\"verifyMembership((bytes,(uint64,uint64),bytes[],bytes))\":{\"notice\":\"Querying the membership of a key-value pair\"},\"verifyNonMembership((bytes,(uint64,uint64),bytes[]))\":{\"notice\":\"Querying the non-membership of a key\"}},\"notice\":\"Verifies Besu IBFT 2.0 headers and ICS26 router storage proofs.\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/light-clients/besu/BesuIBFT2LightClient.sol\":\"BesuIBFT2LightClient\"},\"evmVersion\":\"cancun\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"none\"},\"optimizer\":{\"enabled\":true,\"runs\":10000},\"remappings\":[\":@openzeppelin-contracts/=node_modules/@openzeppelin/contracts/\",\":@openzeppelin-upgradeable/=node_modules/@openzeppelin/contracts-upgradeable/\",\":@openzeppelin/=node_modules/@openzeppelin/\",\":@sp1-contracts/=node_modules/sp1-contracts/contracts/src/\",\":@uniswap/permit2/=node_modules/@uniswap/permit2/\",\":forge-std/=node_modules/forge-std/src/\",\":sp1-contracts/=node_modules/sp1-contracts/\"],\"viaIR\":true},\"sources\":{\"contracts/interfaces/ILightClient.sol\":{\"keccak256\":\"0x3b2361546ee834a442d844c979fbad3458ee13146b093f585587a09e19a266af\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://5b5d53101bb598f14a79cb1092479736fa18e8f84945ea6ef80f4dac84466042\",\"dweb:/ipfs/QmaTCo6M3Z9aYCSX65AQtixo1sB4ymQUDAgTXSKHqJHGDh\"]},\"contracts/light-clients/besu/BesuIBFT2LightClient.sol\":{\"keccak256\":\"0xeb02b0e8e66eddd178008e1070654974249c6d194ec88f704be73d2e3cfe0aed\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://110b67cddc218a288c4a18f7c288665c4c4788cfab2e296158efc34397499b58\",\"dweb:/ipfs/QmTdY238hzZX4ok9g1o1J52FdVqQsMZXQoFgRMYoZWqq9k\"]},\"contracts/light-clients/besu/BesuLightClientBase.sol\":{\"keccak256\":\"0xd700a74d5dd85a4dc0432f9fda2e787d78670647417e54416a07af85bb42194a\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://92069fbd0993510316fb3e9eba5dde45316cc6d3fd979c75b3485253709caa88\",\"dweb:/ipfs/QmeuXFNzqe5JYwkZwLBA7LSni4LuQAWgy7t7jbfHXAKNtz\"]},\"contracts/light-clients/besu/MPTProof.sol\":{\"keccak256\":\"0xe79077eef64b0a5901e83174bb0643dd71887d3d1b75a230e3c6d98230fe61a1\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://f828f699316e27a9449c4da03471f8a228c2919e93a5575dd331dfd7278de61b\",\"dweb:/ipfs/QmNzjoyYNyuFqn7tS7HteYhyTKS77iy7QhBwMc1rDDJcPY\"]},\"contracts/light-clients/besu/RLPReader.sol\":{\"keccak256\":\"0xa64ad17e6da7fed2bd206df52189286694339a8061dc5d158e717eda982af1d9\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://7020db2fe854e90e1b791e0e587610fc26bed3073ba1811faa275a1d8bf3c2c7\",\"dweb:/ipfs/QmdXdKghNFZSX7N9qD6BsKuJQdrFoqatsVWvHRL7vJCmeP\"]},\"contracts/light-clients/besu/errors/IBesuLightClientErrors.sol\":{\"keccak256\":\"0x1124e58e906cd3dddf876757393a4e4812170e4ae41da99a1d0b734266ae021b\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://54d7d62a6ef3af5d32eb3c293499f90223a0f349b1475b3dad6af443106041d4\",\"dweb:/ipfs/QmdSJQup9PvvB3hpnWZu3YE2Rh5kTcAs9zGBHsMyAdCKCX\"]},\"contracts/light-clients/besu/msgs/IBesuLightClientMsgs.sol\":{\"keccak256\":\"0x3a903fd7635a040041b94f4e33dc2881c8992bd22acb14cce72aeab074b820be\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://25d72c46f4bf1b6335f1c62c8d55f3e3643a41f75ffba160cb137bed57d7854c\",\"dweb:/ipfs/QmepY12FQmcMned3fbMt1K3mfELZwq9uiMKxS41yLDAxV3\"]},\"contracts/msgs/IICS02ClientMsgs.sol\":{\"keccak256\":\"0x03d1265eae327c3744d774bf22a30d845233d50664921c9aa57cef2d71fd89d2\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://89900781cc5c60540a237d92d42745ea6165765ee8fb4d50e8137a717195cc75\",\"dweb:/ipfs/Qmbx5p8gZ8sEMMeZytXsLee49JUayhAaoJ2yxX93WUrvQo\"]},\"contracts/msgs/ILightClientMsgs.sol\":{\"keccak256\":\"0x8d1e56ab166a7b4aa6999708e3214a4645ebbc3835c2b2a4c255c9923eebafde\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://8bd4200dc04d950c0f050623fa9a8accdbec877fd446c039d4dd6c678bdf1513\",\"dweb:/ipfs/QmZQTViaA7N6BVNDzJ1Z6w799PrPoE4ajPueZSPwX4sGZ9\"]},\"node_modules/@openzeppelin/contracts/access/AccessControl.sol\":{\"keccak256\":\"0x4686ec784d75f95beaf2bf5b5f26e5f946d4c864aaee9c3c62bdc18381f5e017\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://26710ca191913f3c9df542079c4a6dcff02968e92d4f7357daefef9fbe72a19c\",\"dweb:/ipfs/QmanHbeWuBbVEqXySHa1zhm2rExjYpChDBubBaJNTCa2JB\"]},\"node_modules/@openzeppelin/contracts/access/IAccessControl.sol\":{\"keccak256\":\"0xbff9f59c84e5337689161ce7641c0ef8e872d6a7536fbc1f5133f128887aba3c\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://b308f882e796f7b79c9502deacb0a62983035c6f6f4e962b319ba6a1f4a77d3d\",\"dweb:/ipfs/QmaWCW7ahEQqFjwhSUhV7Ae7WhfNvzSpE7DQ58hvEooqPL\"]},\"node_modules/@openzeppelin/contracts/utils/Context.sol\":{\"keccak256\":\"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://6a708e8a5bdb1011c2c381c9a5cfd8a9a956d7d0a9dc1bd8bcdaf52f76ef2f12\",\"dweb:/ipfs/Qmax9WHBnVsZP46ZxEMNRQpLQnrdE4dK8LehML1Py8FowF\"]},\"node_modules/@openzeppelin/contracts/utils/cryptography/ECDSA.sol\":{\"keccak256\":\"0xbeb5cad8aaabe0d35d2ec1a8414d91e81e5a8ca679add4cf57e2f33476861f40\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://ebb272a5ee2da4e8bd5551334e0ce8dce4e9c56a04570d6bf046d260fab3116a\",\"dweb:/ipfs/QmNw6RyM769qcqFocDq6HJMG2WiEnQbvizpRaUXsACHho2\"]},\"node_modules/@openzeppelin/contracts/utils/introspection/ERC165.sol\":{\"keccak256\":\"0x2d9dc2fe26180f74c11c13663647d38e259e45f95eb88f57b61d2160b0109d3e\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://81233d1f98060113d9922180bb0f14f8335856fe9f339134b09335e9f678c377\",\"dweb:/ipfs/QmWh6R35SarhAn4z2wH8SU456jJSYL2FgucfTFgbHJJN4E\"]},\"node_modules/@openzeppelin/contracts/utils/introspection/IERC165.sol\":{\"keccak256\":\"0x8891738ffe910f0cf2da09566928589bf5d63f4524dd734fd9cedbac3274dd5c\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://971f954442df5c2ef5b5ebf1eb245d7105d9fbacc7386ee5c796df1d45b21617\",\"dweb:/ipfs/QmadRjHbkicwqwwh61raUEapaVEtaLMcYbQZWs9gUkgj3u\"]}},\"version\":1}","metadata":{"compiler":{"version":"0.8.28+commit.7893614a"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"address","name":"ibcRouter","type":"address"},{"internalType":"uint64","name":"initialTrustedHeight","type":"uint64"},{"internalType":"uint64","name":"initialTrustedTimestamp","type":"uint64"},{"internalType":"bytes32","name":"initialTrustedStorageRoot","type":"bytes32"},{"internalType":"address[]","name":"initialTrustedValidators","type":"address[]"},{"internalType":"uint64","name":"trustingPeriod","type":"uint64"},{"internalType":"uint64","name":"maxClockDrift","type":"uint64"},{"internalType":"address","name":"roleManager","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"type":"error","name":"AccessControlBadConfirmation"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bytes32","name":"neededRole","type":"bytes32"}],"type":"error","name":"AccessControlUnauthorizedAccount"},{"inputs":[{"internalType":"uint64","name":"revisionHeight","type":"uint64"}],"type":"error","name":"ConflictingConsensusState"},{"inputs":[{"internalType":"uint64","name":"trustedTimestamp","type":"uint64"},{"internalType":"uint256","name":"currentTimestamp","type":"uint256"},{"internalType":"uint64","name":"trustingPeriod","type":"uint64"}],"type":"error","name":"ConsensusStateExpired"},{"inputs":[{"internalType":"uint64","name":"revisionHeight","type":"uint64"}],"type":"error","name":"ConsensusStateNotFound"},{"inputs":[{"internalType":"address","name":"signer","type":"address"}],"type":"error","name":"DuplicateCommitSealSigner"},{"inputs":[{"internalType":"address","name":"validator","type":"address"}],"type":"error","name":"DuplicateValidator"},{"inputs":[],"type":"error","name":"EmptyValidatorSet"},{"inputs":[{"internalType":"uint256","name":"currentTimestamp","type":"uint256"},{"internalType":"uint256","name":"headerTimestamp","type":"uint256"},{"internalType":"uint256","name":"maxClockDrift","type":"uint256"}],"type":"error","name":"HeaderFromFuture"},{"inputs":[{"internalType":"uint256","name":"actual","type":"uint256"},{"internalType":"uint256","name":"required","type":"uint256"}],"type":"error","name":"InsufficientTrustedValidatorOverlap"},{"inputs":[{"internalType":"uint256","name":"actual","type":"uint256"},{"internalType":"uint256","name":"required","type":"uint256"}],"type":"error","name":"InsufficientValidatorQuorum"},{"inputs":[],"type":"error","name":"InvalidCommitSeal"},{"inputs":[{"internalType":"bytes32","name":"expectedValue","type":"bytes32"},{"internalType":"bytes32","name":"actualValue","type":"bytes32"}],"type":"error","name":"InvalidCommitmentValue"},{"inputs":[{"internalType":"uint256","name":"actualDifficulty","type":"uint256"}],"type":"error","name":"InvalidDifficulty"},{"inputs":[{"internalType":"uint256","name":"length","type":"uint256"}],"type":"error","name":"InvalidECDSASignatureLength"},{"inputs":[{"internalType":"uint256","name":"itemsLength","type":"uint256"}],"type":"error","name":"InvalidExtraDataFormat"},{"inputs":[{"internalType":"uint256","name":"itemsLength","type":"uint256"}],"type":"error","name":"InvalidHeaderFormat"},{"inputs":[],"type":"error","name":"InvalidHeaderHeight"},{"inputs":[{"internalType":"bytes32","name":"actualMixHash","type":"bytes32"}],"type":"error","name":"InvalidMixHash"},{"inputs":[{"internalType":"bytes","name":"actualNonce","type":"bytes"}],"type":"error","name":"InvalidNonce"},{"inputs":[{"internalType":"bytes32","name":"actualOmmersHash","type":"bytes32"}],"type":"error","name":"InvalidOmmersHash"},{"inputs":[{"internalType":"uint256","name":"expectedLength","type":"uint256"},{"internalType":"uint256","name":"actualLength","type":"uint256"}],"type":"error","name":"InvalidPathLength"},{"inputs":[{"internalType":"uint64","name":"providedRevisionNumber","type":"uint64"}],"type":"error","name":"InvalidRevisionNumber"},{"inputs":[{"internalType":"address","name":"validator","type":"address"}],"type":"error","name":"InvalidValidatorAddress"},{"inputs":[{"internalType":"uint256","name":"length","type":"uint256"}],"type":"error","name":"InvalidValidatorAddressLength"},{"inputs":[{"internalType":"uint256","name":"expectedLength","type":"uint256"},{"internalType":"uint256","name":"actualLength","type":"uint256"}],"type":"error","name":"InvalidValueLength"},{"inputs":[],"type":"error","name":"UnsupportedMisbehaviour"},{"inputs":[{"internalType":"bytes32","name":"actualValue","type":"bytes32"}],"type":"error","name":"ValueExists"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32","indexed":true},{"internalType":"bytes32","name":"previousAdminRole","type":"bytes32","indexed":true},{"internalType":"bytes32","name":"newAdminRole","type":"bytes32","indexed":true}],"type":"event","name":"RoleAdminChanged","anonymous":false},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32","indexed":true},{"internalType":"address","name":"account","type":"address","indexed":true},{"internalType":"address","name":"sender","type":"address","indexed":true}],"type":"event","name":"RoleGranted","anonymous":false},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32","indexed":true},{"internalType":"address","name":"account","type":"address","indexed":true},{"internalType":"address","name":"sender","type":"address","indexed":true}],"type":"event","name":"RoleRevoked","anonymous":false},{"inputs":[],"stateMutability":"view","type":"function","name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"PROOF_SUBMITTER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"getClientState","outputs":[{"internalType":"bytes","name":"","type":"bytes"}]},{"inputs":[{"internalType":"uint64","name":"revisionHeight","type":"uint64"}],"stateMutability":"view","type":"function","name":"getConsensusState","outputs":[{"internalType":"bytes","name":"","type":"bytes"}]},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"stateMutability":"view","type":"function","name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}]},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"stateMutability":"nonpayable","type":"function","name":"grantRole"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"stateMutability":"view","type":"function","name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}]},{"inputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function","name":"misbehaviour"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"callerConfirmation","type":"address"}],"stateMutability":"nonpayable","type":"function","name":"renounceRole"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"stateMutability":"nonpayable","type":"function","name":"revokeRole"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"stateMutability":"view","type":"function","name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}]},{"inputs":[{"internalType":"bytes","name":"updateMsg","type":"bytes"}],"stateMutability":"nonpayable","type":"function","name":"updateClient","outputs":[{"internalType":"enum ILightClientMsgs.UpdateResult","name":"","type":"uint8"}]},{"inputs":[{"internalType":"struct ILightClientMsgs.MsgVerifyMembership","name":"msg_","type":"tuple","components":[{"internalType":"bytes","name":"proof","type":"bytes"},{"internalType":"struct IICS02ClientMsgs.Height","name":"proofHeight","type":"tuple","components":[{"internalType":"uint64","name":"revisionNumber","type":"uint64"},{"internalType":"uint64","name":"revisionHeight","type":"uint64"}]},{"internalType":"bytes[]","name":"path","type":"bytes[]"},{"internalType":"bytes","name":"value","type":"bytes"}]}],"stateMutability":"view","type":"function","name":"verifyMembership","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[{"internalType":"struct ILightClientMsgs.MsgVerifyNonMembership","name":"msg_","type":"tuple","components":[{"internalType":"bytes","name":"proof","type":"bytes"},{"internalType":"struct IICS02ClientMsgs.Height","name":"proofHeight","type":"tuple","components":[{"internalType":"uint64","name":"revisionNumber","type":"uint64"},{"internalType":"uint64","name":"revisionHeight","type":"uint64"}]},{"internalType":"bytes[]","name":"path","type":"bytes[]"}]}],"stateMutability":"view","type":"function","name":"verifyNonMembership","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]}],"devdoc":{"kind":"dev","methods":{"constructor":{"params":{"ibcRouter":"Counterparty ICS26 router address whose storage is proven.","initialTrustedHeight":"Initial trusted Besu height.","initialTrustedStorageRoot":"Initial trusted storage root of `ibcRouter`.","initialTrustedTimestamp":"Initial trusted header timestamp in seconds.","initialTrustedValidators":"Initial trusted validator set.","maxClockDrift":"Maximum allowed future drift in seconds for submitted headers.","roleManager":"Address that administers proof submission; if zero, proof submission is open.","trustingPeriod":"Maximum age in seconds for trusted consensus states."}},"getClientState()":{"returns":{"_0":"The client state."}},"getConsensusState(uint64)":{"params":{"revisionHeight":"The revision height to query."},"returns":{"_0":"The ABI-encoded consensus state."}},"getRoleAdmin(bytes32)":{"details":"Returns the admin role that controls `role`. See {grantRole} and {revokeRole}. To change a role's admin, use {_setRoleAdmin}."},"grantRole(bytes32,address)":{"details":"Grants `role` to `account`. If `account` had not been already granted `role`, emits a {RoleGranted} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleGranted} event."},"hasRole(bytes32,address)":{"details":"Returns `true` if `account` has been granted `role`."},"misbehaviour(bytes)":{"params":{"misbehaviourMsg":"The misbehaviour message"}},"renounceRole(bytes32,address)":{"details":"Revokes `role` from the calling account. Roles are often managed via {grantRole} and {revokeRole}: this function's purpose is to provide a mechanism for accounts to lose their privileges if they are compromised (such as when a trusted device is misplaced). If the calling account had been revoked `role`, emits a {RoleRevoked} event. Requirements: - the caller must be `callerConfirmation`. May emit a {RoleRevoked} event."},"revokeRole(bytes32,address)":{"details":"Revokes `role` from `account`. If `account` had been granted `role`, emits a {RoleRevoked} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleRevoked} event."},"supportsInterface(bytes4)":{"details":"Returns true if this contract implements the interface defined by `interfaceId`. See the corresponding https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[ERC section] to learn more about how these ids are created. This function call must use less than 30 000 gas."},"updateClient(bytes)":{"params":{"updateMsg":"The encoded update message e.g., an SP1 proof."},"returns":{"_0":"The result of the update operation"}},"verifyMembership((bytes,(uint64,uint64),bytes[],bytes))":{"details":"Notice that this message is not view, as it may update the client state for caching purposes.","params":{"msg_":"The membership message"},"returns":{"_0":"The unix timestamp of the verification height in the counterparty chain in seconds."}},"verifyNonMembership((bytes,(uint64,uint64),bytes[]))":{"details":"Notice that this message is not view, as it may update the client state for caching purposes.","params":{"msg_":"The membership message"},"returns":{"_0":"The unix timestamp of the verification height in the counterparty chain in seconds."}}},"version":1},"userdoc":{"kind":"user","methods":{"PROOF_SUBMITTER_ROLE()":{"notice":"Role allowed to submit client updates and proof verifications."},"constructor":{"notice":"Creates a Besu IBFT2 light client from an initial trusted consensus state."},"getClientState()":{"notice":"Returns the client state."},"getConsensusState(uint64)":{"notice":"Returns the encoded consensus state for a revision height."},"misbehaviour(bytes)":{"notice":"Misbehaviour handling, moves the light client to the frozen state if misbehaviour is detected"},"updateClient(bytes)":{"notice":"Updating the client and consensus state"},"verifyMembership((bytes,(uint64,uint64),bytes[],bytes))":{"notice":"Querying the membership of a key-value pair"},"verifyNonMembership((bytes,(uint64,uint64),bytes[]))":{"notice":"Querying the non-membership of a key"}},"version":1}},"settings":{"remappings":["@openzeppelin-contracts/=node_modules/@openzeppelin/contracts/","@openzeppelin-upgradeable/=node_modules/@openzeppelin/contracts-upgradeable/","@openzeppelin/=node_modules/@openzeppelin/","@sp1-contracts/=node_modules/sp1-contracts/contracts/src/","@uniswap/permit2/=node_modules/@uniswap/permit2/","forge-std/=node_modules/forge-std/src/","sp1-contracts/=node_modules/sp1-contracts/"],"optimizer":{"enabled":true,"runs":10000},"metadata":{"bytecodeHash":"none"},"compilationTarget":{"contracts/light-clients/besu/BesuIBFT2LightClient.sol":"BesuIBFT2LightClient"},"evmVersion":"cancun","libraries":{},"viaIR":true},"sources":{"contracts/interfaces/ILightClient.sol":{"keccak256":"0x3b2361546ee834a442d844c979fbad3458ee13146b093f585587a09e19a266af","urls":["bzz-raw://5b5d53101bb598f14a79cb1092479736fa18e8f84945ea6ef80f4dac84466042","dweb:/ipfs/QmaTCo6M3Z9aYCSX65AQtixo1sB4ymQUDAgTXSKHqJHGDh"],"license":"Apache-2.0"},"contracts/light-clients/besu/BesuIBFT2LightClient.sol":{"keccak256":"0xeb02b0e8e66eddd178008e1070654974249c6d194ec88f704be73d2e3cfe0aed","urls":["bzz-raw://110b67cddc218a288c4a18f7c288665c4c4788cfab2e296158efc34397499b58","dweb:/ipfs/QmTdY238hzZX4ok9g1o1J52FdVqQsMZXQoFgRMYoZWqq9k"],"license":"MIT"},"contracts/light-clients/besu/BesuLightClientBase.sol":{"keccak256":"0xd700a74d5dd85a4dc0432f9fda2e787d78670647417e54416a07af85bb42194a","urls":["bzz-raw://92069fbd0993510316fb3e9eba5dde45316cc6d3fd979c75b3485253709caa88","dweb:/ipfs/QmeuXFNzqe5JYwkZwLBA7LSni4LuQAWgy7t7jbfHXAKNtz"],"license":"MIT"},"contracts/light-clients/besu/MPTProof.sol":{"keccak256":"0xe79077eef64b0a5901e83174bb0643dd71887d3d1b75a230e3c6d98230fe61a1","urls":["bzz-raw://f828f699316e27a9449c4da03471f8a228c2919e93a5575dd331dfd7278de61b","dweb:/ipfs/QmNzjoyYNyuFqn7tS7HteYhyTKS77iy7QhBwMc1rDDJcPY"],"license":"Apache-2.0"},"contracts/light-clients/besu/RLPReader.sol":{"keccak256":"0xa64ad17e6da7fed2bd206df52189286694339a8061dc5d158e717eda982af1d9","urls":["bzz-raw://7020db2fe854e90e1b791e0e587610fc26bed3073ba1811faa275a1d8bf3c2c7","dweb:/ipfs/QmdXdKghNFZSX7N9qD6BsKuJQdrFoqatsVWvHRL7vJCmeP"],"license":"Apache-2.0"},"contracts/light-clients/besu/errors/IBesuLightClientErrors.sol":{"keccak256":"0x1124e58e906cd3dddf876757393a4e4812170e4ae41da99a1d0b734266ae021b","urls":["bzz-raw://54d7d62a6ef3af5d32eb3c293499f90223a0f349b1475b3dad6af443106041d4","dweb:/ipfs/QmdSJQup9PvvB3hpnWZu3YE2Rh5kTcAs9zGBHsMyAdCKCX"],"license":"MIT"},"contracts/light-clients/besu/msgs/IBesuLightClientMsgs.sol":{"keccak256":"0x3a903fd7635a040041b94f4e33dc2881c8992bd22acb14cce72aeab074b820be","urls":["bzz-raw://25d72c46f4bf1b6335f1c62c8d55f3e3643a41f75ffba160cb137bed57d7854c","dweb:/ipfs/QmepY12FQmcMned3fbMt1K3mfELZwq9uiMKxS41yLDAxV3"],"license":"MIT"},"contracts/msgs/IICS02ClientMsgs.sol":{"keccak256":"0x03d1265eae327c3744d774bf22a30d845233d50664921c9aa57cef2d71fd89d2","urls":["bzz-raw://89900781cc5c60540a237d92d42745ea6165765ee8fb4d50e8137a717195cc75","dweb:/ipfs/Qmbx5p8gZ8sEMMeZytXsLee49JUayhAaoJ2yxX93WUrvQo"],"license":"Apache-2.0"},"contracts/msgs/ILightClientMsgs.sol":{"keccak256":"0x8d1e56ab166a7b4aa6999708e3214a4645ebbc3835c2b2a4c255c9923eebafde","urls":["bzz-raw://8bd4200dc04d950c0f050623fa9a8accdbec877fd446c039d4dd6c678bdf1513","dweb:/ipfs/QmZQTViaA7N6BVNDzJ1Z6w799PrPoE4ajPueZSPwX4sGZ9"],"license":"Apache-2.0"},"node_modules/@openzeppelin/contracts/access/AccessControl.sol":{"keccak256":"0x4686ec784d75f95beaf2bf5b5f26e5f946d4c864aaee9c3c62bdc18381f5e017","urls":["bzz-raw://26710ca191913f3c9df542079c4a6dcff02968e92d4f7357daefef9fbe72a19c","dweb:/ipfs/QmanHbeWuBbVEqXySHa1zhm2rExjYpChDBubBaJNTCa2JB"],"license":"MIT"},"node_modules/@openzeppelin/contracts/access/IAccessControl.sol":{"keccak256":"0xbff9f59c84e5337689161ce7641c0ef8e872d6a7536fbc1f5133f128887aba3c","urls":["bzz-raw://b308f882e796f7b79c9502deacb0a62983035c6f6f4e962b319ba6a1f4a77d3d","dweb:/ipfs/QmaWCW7ahEQqFjwhSUhV7Ae7WhfNvzSpE7DQ58hvEooqPL"],"license":"MIT"},"node_modules/@openzeppelin/contracts/utils/Context.sol":{"keccak256":"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2","urls":["bzz-raw://6a708e8a5bdb1011c2c381c9a5cfd8a9a956d7d0a9dc1bd8bcdaf52f76ef2f12","dweb:/ipfs/Qmax9WHBnVsZP46ZxEMNRQpLQnrdE4dK8LehML1Py8FowF"],"license":"MIT"},"node_modules/@openzeppelin/contracts/utils/cryptography/ECDSA.sol":{"keccak256":"0xbeb5cad8aaabe0d35d2ec1a8414d91e81e5a8ca679add4cf57e2f33476861f40","urls":["bzz-raw://ebb272a5ee2da4e8bd5551334e0ce8dce4e9c56a04570d6bf046d260fab3116a","dweb:/ipfs/QmNw6RyM769qcqFocDq6HJMG2WiEnQbvizpRaUXsACHho2"],"license":"MIT"},"node_modules/@openzeppelin/contracts/utils/introspection/ERC165.sol":{"keccak256":"0x2d9dc2fe26180f74c11c13663647d38e259e45f95eb88f57b61d2160b0109d3e","urls":["bzz-raw://81233d1f98060113d9922180bb0f14f8335856fe9f339134b09335e9f678c377","dweb:/ipfs/QmWh6R35SarhAn4z2wH8SU456jJSYL2FgucfTFgbHJJN4E"],"license":"MIT"},"node_modules/@openzeppelin/contracts/utils/introspection/IERC165.sol":{"keccak256":"0x8891738ffe910f0cf2da09566928589bf5d63f4524dd734fd9cedbac3274dd5c","urls":["bzz-raw://971f954442df5c2ef5b5ebf1eb245d7105d9fbacc7386ee5c796df1d45b21617","dweb:/ipfs/QmadRjHbkicwqwwh61raUEapaVEtaLMcYbQZWs9gUkgj3u"],"license":"MIT"}},"version":1},"id":34} \ No newline at end of file diff --git a/ibc-solidity/abi/bytecode/BesuQBFTLightClient.json b/ibc-solidity/abi/bytecode/BesuQBFTLightClient.json index c481fc3dd..a0fc021b8 100644 --- a/ibc-solidity/abi/bytecode/BesuQBFTLightClient.json +++ b/ibc-solidity/abi/bytecode/BesuQBFTLightClient.json @@ -1 +1 @@ -{"abi":[{"type":"constructor","inputs":[{"name":"ibcRouter","type":"address","internalType":"address"},{"name":"initialTrustedHeight","type":"uint64","internalType":"uint64"},{"name":"initialTrustedTimestamp","type":"uint64","internalType":"uint64"},{"name":"initialTrustedStorageRoot","type":"bytes32","internalType":"bytes32"},{"name":"initialTrustedValidators","type":"address[]","internalType":"address[]"},{"name":"trustingPeriod","type":"uint64","internalType":"uint64"},{"name":"maxClockDrift","type":"uint64","internalType":"uint64"},{"name":"roleManager","type":"address","internalType":"address"}],"stateMutability":"nonpayable"},{"type":"function","name":"DEFAULT_ADMIN_ROLE","inputs":[],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"type":"function","name":"PROOF_SUBMITTER_ROLE","inputs":[],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"type":"function","name":"getClientState","inputs":[],"outputs":[{"name":"","type":"bytes","internalType":"bytes"}],"stateMutability":"view"},{"type":"function","name":"getConsensusState","inputs":[{"name":"revisionHeight","type":"uint64","internalType":"uint64"}],"outputs":[{"name":"","type":"bytes","internalType":"bytes"}],"stateMutability":"view"},{"type":"function","name":"getRoleAdmin","inputs":[{"name":"role","type":"bytes32","internalType":"bytes32"}],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"type":"function","name":"grantRole","inputs":[{"name":"role","type":"bytes32","internalType":"bytes32"},{"name":"account","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"hasRole","inputs":[{"name":"role","type":"bytes32","internalType":"bytes32"},{"name":"account","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"misbehaviour","inputs":[{"name":"","type":"bytes","internalType":"bytes"}],"outputs":[],"stateMutability":"view"},{"type":"function","name":"renounceRole","inputs":[{"name":"role","type":"bytes32","internalType":"bytes32"},{"name":"callerConfirmation","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"revokeRole","inputs":[{"name":"role","type":"bytes32","internalType":"bytes32"},{"name":"account","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"supportsInterface","inputs":[{"name":"interfaceId","type":"bytes4","internalType":"bytes4"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"updateClient","inputs":[{"name":"updateMsg","type":"bytes","internalType":"bytes"}],"outputs":[{"name":"","type":"uint8","internalType":"enum ILightClientMsgs.UpdateResult"}],"stateMutability":"nonpayable"},{"type":"function","name":"verifyMembership","inputs":[{"name":"msg_","type":"tuple","internalType":"struct ILightClientMsgs.MsgVerifyMembership","components":[{"name":"proof","type":"bytes","internalType":"bytes"},{"name":"proofHeight","type":"tuple","internalType":"struct IICS02ClientMsgs.Height","components":[{"name":"revisionNumber","type":"uint64","internalType":"uint64"},{"name":"revisionHeight","type":"uint64","internalType":"uint64"}]},{"name":"path","type":"bytes[]","internalType":"bytes[]"},{"name":"value","type":"bytes","internalType":"bytes"}]}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"verifyNonMembership","inputs":[{"name":"msg_","type":"tuple","internalType":"struct ILightClientMsgs.MsgVerifyNonMembership","components":[{"name":"proof","type":"bytes","internalType":"bytes"},{"name":"proofHeight","type":"tuple","internalType":"struct IICS02ClientMsgs.Height","components":[{"name":"revisionNumber","type":"uint64","internalType":"uint64"},{"name":"revisionHeight","type":"uint64","internalType":"uint64"}]},{"name":"path","type":"bytes[]","internalType":"bytes[]"}]}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"event","name":"RoleAdminChanged","inputs":[{"name":"role","type":"bytes32","indexed":true,"internalType":"bytes32"},{"name":"previousAdminRole","type":"bytes32","indexed":true,"internalType":"bytes32"},{"name":"newAdminRole","type":"bytes32","indexed":true,"internalType":"bytes32"}],"anonymous":false},{"type":"event","name":"RoleGranted","inputs":[{"name":"role","type":"bytes32","indexed":true,"internalType":"bytes32"},{"name":"account","type":"address","indexed":true,"internalType":"address"},{"name":"sender","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"type":"event","name":"RoleRevoked","inputs":[{"name":"role","type":"bytes32","indexed":true,"internalType":"bytes32"},{"name":"account","type":"address","indexed":true,"internalType":"address"},{"name":"sender","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"type":"error","name":"AccessControlBadConfirmation","inputs":[]},{"type":"error","name":"AccessControlUnauthorizedAccount","inputs":[{"name":"account","type":"address","internalType":"address"},{"name":"neededRole","type":"bytes32","internalType":"bytes32"}]},{"type":"error","name":"ConflictingConsensusState","inputs":[{"name":"revisionHeight","type":"uint64","internalType":"uint64"}]},{"type":"error","name":"ConsensusStateExpired","inputs":[{"name":"trustedTimestamp","type":"uint64","internalType":"uint64"},{"name":"currentTimestamp","type":"uint256","internalType":"uint256"},{"name":"trustingPeriod","type":"uint64","internalType":"uint64"}]},{"type":"error","name":"ConsensusStateNotFound","inputs":[{"name":"revisionHeight","type":"uint64","internalType":"uint64"}]},{"type":"error","name":"DuplicateCommitSealSigner","inputs":[{"name":"signer","type":"address","internalType":"address"}]},{"type":"error","name":"DuplicateValidator","inputs":[{"name":"validator","type":"address","internalType":"address"}]},{"type":"error","name":"EmptyValidatorSet","inputs":[]},{"type":"error","name":"HeaderFromFuture","inputs":[{"name":"currentTimestamp","type":"uint256","internalType":"uint256"},{"name":"headerTimestamp","type":"uint256","internalType":"uint256"},{"name":"maxClockDrift","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"InsufficientTrustedValidatorOverlap","inputs":[{"name":"actual","type":"uint256","internalType":"uint256"},{"name":"required","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"InsufficientValidatorQuorum","inputs":[{"name":"actual","type":"uint256","internalType":"uint256"},{"name":"required","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"InvalidCommitSeal","inputs":[]},{"type":"error","name":"InvalidCommitmentValue","inputs":[{"name":"expectedValue","type":"bytes32","internalType":"bytes32"},{"name":"actualValue","type":"bytes32","internalType":"bytes32"}]},{"type":"error","name":"InvalidDifficulty","inputs":[{"name":"actualDifficulty","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"InvalidECDSASignatureLength","inputs":[{"name":"length","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"InvalidExtraDataFormat","inputs":[{"name":"itemsLength","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"InvalidHeaderFormat","inputs":[{"name":"itemsLength","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"InvalidHeaderHeight","inputs":[]},{"type":"error","name":"InvalidMixHash","inputs":[{"name":"actualMixHash","type":"bytes32","internalType":"bytes32"}]},{"type":"error","name":"InvalidNonce","inputs":[{"name":"actualNonce","type":"bytes","internalType":"bytes"}]},{"type":"error","name":"InvalidOmmersHash","inputs":[{"name":"actualOmmersHash","type":"bytes32","internalType":"bytes32"}]},{"type":"error","name":"InvalidPathLength","inputs":[{"name":"expectedLength","type":"uint256","internalType":"uint256"},{"name":"actualLength","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"InvalidRevisionNumber","inputs":[{"name":"providedRevisionNumber","type":"uint64","internalType":"uint64"}]},{"type":"error","name":"InvalidValidatorAddress","inputs":[{"name":"validator","type":"address","internalType":"address"}]},{"type":"error","name":"InvalidValidatorAddressLength","inputs":[{"name":"length","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"InvalidValueLength","inputs":[{"name":"expectedLength","type":"uint256","internalType":"uint256"},{"name":"actualLength","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"UnsupportedMisbehaviour","inputs":[]},{"type":"error","name":"ValueExists","inputs":[{"name":"actualValue","type":"bytes32","internalType":"bytes32"}]}],"bytecode":{"object":"0x6080604052346103c05761393e80380380610019816103c4565b928339810190610100818303126103c057610033816103e9565b61003f602083016103fd565b9061004c604084016103fd565b60608401516080850151909291906001600160401b0381116103c05785019286601f850112156103c0578351966001600160401b038811610376578760051b9460206100998188016103c4565b809a81520190602082978201019283116103c057602001905b8282106103a8575050506100c860a087016103fd565b956100e160e06100da60c084016103fd565b92016103e9565b956001600160401b03169081156103995788511561038a575f5b89518110156101b1576001600160a01b03610116828c610411565b51161561018a575f5b81811061012f57506001016100fb565b6001600160a01b03610141828d610411565b51166001600160a01b03610155848e610411565b5116146101645760010161011f565b6001600160a01b03610176838d610411565b511663107f863360e21b5f5260045260245ffd5b6001600160a01b039061019d908b610411565b51166359bff38760e01b5f5260045260245ffd5b5060408051979896978a979181016001600160401b03811182821017610376576040525f81526020810190848252604051926080840198848a1060018060401b038b1117610376576040998a526001600160a01b031680855260208086018490526001600160401b03928316868c01819052878416606090970196909652600180546001600160a01b031916909217825592516002805495516001600160801b031996871692851692909217918c1b6fffffffffffffffff000000000000000090811692909217815560038054909616909617968b1b16959095179092555f948552600490529590922080546001600160401b03191694861694909417845583019190915592519392019190831161037657680100000000000000008311610376578154838355808410610350575b50905f5260205f205f5b83811061033357846001600160a01b03811661031a575061030961052f565b505b6040516132ec90816105b28239f35b8061032761032d92610439565b506104af565b5061030b565b82516001600160a01b0316818301556020909201916001016102ea565b825f528360205f2091820191015b81811061036b57506102e0565b5f815560010161035e565b634e487b7160e01b5f52604160045260245ffd5b63339e1ffb60e01b5f5260045ffd5b6359d119e360e01b5f5260045ffd5b602080916103b5846103e9565b8152019101906100b2565b5f80fd5b6040519190601f01601f191682016001600160401b0381118382101761037657604052565b51906001600160a01b03821682036103c057565b51906001600160401b03821682036103c057565b80518210156104255760209160051b010190565b634e487b7160e01b5f52603260045260245ffd5b6001600160a01b0381165f9081525f51602061391e5f395f51905f52602052604090205460ff166104aa576001600160a01b03165f8181525f51602061391e5f395f51905f5260205260408120805460ff191660011790553391905f51602061389e5f395f51905f528180a4600190565b505f90565b6001600160a01b0381165f9081525f5160206138be5f395f51905f52602052604090205460ff166104aa576001600160a01b03165f8181525f5160206138be5f395f51905f5260205260408120805460ff191660011790553391905f5160206138fe5f395f51905f52905f51602061389e5f395f51905f529080a4600190565b5f80525f5160206138be5f395f51905f526020525f5160206138de5f395f51905f525460ff166105ad575f8080525f5160206138be5f395f51905f526020525f5160206138de5f395f51905f52805460ff1916600117905533905f5160206138fe5f395f51905f525f51602061389e5f395f51905f528280a4600190565b5f9056fe60806040526004361015610011575f80fd5b5f3560e01c806301ffc9a7146100f45780630bece356146100ef578063248a9ca3146100ea5780632f2ff15d146100e557806336568abe146100e05780634d6d9ffb146100db5780635972185a146100d6578063682ed5f0146100d157806391d14854146100cc578063a217fddf146100c7578063d547741f146100c2578063ddba6537146100bd578063edce8bdc146100b85763ef913a4b146100b3575f80fd5b610a16565b61095e565b61088b565b61085c565b610842565b6107f4565b6105e6565b6105ac565b6103ac565b610350565b61031a565b6102b5565b610217565b34610195576020600319360112610195576004357fffffffff00000000000000000000000000000000000000000000000000000000811680910361019557807f7965db0b000000000000000000000000000000000000000000000000000000006020921490811561016b575b506040519015158152f35b7f01ffc9a7000000000000000000000000000000000000000000000000000000009150145f610160565b5f80fd5b9060206003198301126101955760043567ffffffffffffffff811161019557826023820112156101955780600401359267ffffffffffffffff84116101955760248483010111610195576024019190565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b346101955761028161022836610199565b5f80527f4c48d1d2b0f4f7485fc28e3db22341d96a20aa29e6efa8149da9751603abd4e06020527f6e0c24a6e293ff9b755263dbaa15ba3796b0b8d3fe17cfb4ddf8143b268eac475490919060ff161561029957610d9d565b6040516003821015610294576020918152f35b6101ea565b6102a1611287565b610d9d565b90816020910312610195573590565b346101955760206003193601126101955760206102df6004355f525f602052600160405f20015490565b604051908152f35b6003196040910112610195576004359060243573ffffffffffffffffffffffffffffffffffffffff811681036101955790565b346101955761034e61032b366102e7565b90610349610344825f525f602052600160405f20015490565b61130f565b612199565b005b346101955761035e366102e7565b3373ffffffffffffffffffffffffffffffffffffffff8216036103845761034e91612270565b7f6697b232000000000000000000000000000000000000000000000000000000005f5260045ffd5b346101955760206003193601126101955760043567ffffffffffffffff8111610195578060040160806003198336030112610195575f80527f4c48d1d2b0f4f7485fc28e3db22341d96a20aa29e6efa8149da9751603abd4e060205260ff7f6e0c24a6e293ff9b755263dbaa15ba3796b0b8d3fe17cfb4ddf8143b268eac4754161561059f575b61044761044260248401611192565b61137c565b60648201916001610458848461119c565b90500361056157906104a96104966104a261049d61049661049061048961048460446104e09a01611192565b611b30565b988761119c565b9061126e565b3691610b4d565b612345565b928061121d565b906001840154906040516104d7816104c960208201948560209181520190565b03601f198101835282610afd565b519020916123d3565b805161051f5761051b61050b6104fe845467ffffffffffffffff1690565b67ffffffffffffffff1690565b6040519081529081906020820190565b0390f35b61053361052e61055e92612518565b612545565b7fd039601e000000000000000000000000000000000000000000000000000000005f52600452602490565b5ffd5b61055e61056e848461119c565b7f88b3170e000000000000000000000000000000000000000000000000000000005f52600160045260245250604490565b6105a7611287565b610433565b34610195575f6003193601126101955760206040517fbd893629a699470e4ec82a5715bb4981fdaacc5d0a728bf5f55b801d8f4ef10b8152f35b346101955760206003193601126101955760043567ffffffffffffffff8111610195578060040160a06003198336030112610195575f80527f4c48d1d2b0f4f7485fc28e3db22341d96a20aa29e6efa8149da9751603abd4e060205260ff7f6e0c24a6e293ff9b755263dbaa15ba3796b0b8d3fe17cfb4ddf8143b268eac475416156107e7575b61067c61044260248401611192565b6064820191600161068d848461119c565b90500361056157608481019060206106a5838561121d565b9050036107a957906106f46104966106ed6106e56106de61049d6104966104906106d761048460446107149c01611192565b9b8b61119c565b948761121d565b8101906102a6565b948061121d565b906001850154906040516104d7816104c960208201948560209181520190565b8051156107755761052e61072791612518565b908082036107475761051b61050b6104fe855467ffffffffffffffff1690565b7f56ed1b63000000000000000000000000000000000000000000000000000000005f5260045260245260445ffd5b61055e827f56ed1b63000000000000000000000000000000000000000000000000000000005f52906044916004525f602452565b61055e6107b6838561121d565b7f24fadac8000000000000000000000000000000000000000000000000000000005f52602060045260245250604490565b6107ef611287565b61066d565b3461019557602060ff610836610809366102e7565b905f525f845260405f209073ffffffffffffffffffffffffffffffffffffffff165f5260205260405f2090565b54166040519015158152f35b34610195575f6003193601126101955760206040515f8152f35b346101955761034e61086d366102e7565b90610886610344825f525f602052600160405f20015490565b612270565b346101955761089936610199565b50505f80527f4c48d1d2b0f4f7485fc28e3db22341d96a20aa29e6efa8149da9751603abd4e06020527f6e0c24a6e293ff9b755263dbaa15ba3796b0b8d3fe17cfb4ddf8143b268eac475460ff1615610915575b7f2c1ed462000000000000000000000000000000000000000000000000000000005f5260045ffd5b61091d611287565b6108ed565b67ffffffffffffffff81160361019557565b601f19601f602060409481855280519182918282880152018686015e5f8582860101520116010190565b346101955760206003193601126101955761097e60043561048481610922565b67ffffffffffffffff8154166002600183015492019060405192608084019160208501526040840152606080840152815480915260a08301915f5260205f20905f5b8181106109ea5761051b856109de818703601f198101835282610afd565b60405191829182610934565b825473ffffffffffffffffffffffffffffffffffffffff168452602090930192600192830192016109c0565b34610195575f6003193601126101955761051b60405173ffffffffffffffffffffffffffffffffffffffff60015416602082015267ffffffffffffffff600254818116604084015260401c16606082015267ffffffffffffffff600354818116608084015260401c1660a082015260a081526109de60c082610afd565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b6060810190811067ffffffffffffffff821117610adc57604052565b610a93565b6040810190811067ffffffffffffffff821117610adc57604052565b90601f601f19910116810190811067ffffffffffffffff821117610adc57604052565b60405190610b2f604083610afd565b565b67ffffffffffffffff8111610adc57601f01601f191660200190565b929192610b5982610b31565b91610b676040519384610afd565b829481845281830111610195578281602093845f960137010152565b9080601f8301121561019557816020610b9e93359101610b4d565b90565b6020818303126101955780359067ffffffffffffffff8211610195570180820391608083126101955760405192610bd784610ac0565b823567ffffffffffffffff811161019557604091610bfa84601f19938701610b83565b8652011261019557604051610c0e81610ae1565b6020830135610c1c81610922565b81526040830135610c2c81610922565b60208201526020840152606082013567ffffffffffffffff811161019557610c549201610b83565b604082015290565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b9060018201809211610c9757565b610c5c565b60c001908160c011610c9757565b60f701908160f711610c9757565b6080019081608011610c9757565b60b701908160b711610c9757565b91908201809211610c9757565b908160011b9180830460021490151715610c9757565b81519167ffffffffffffffff8311610adc57680100000000000000008311610adc578154838355808410610d77575b506020610d389101915f5260205f2090565b5f5b838110610d475750505050565b6001906020610d6a855173ffffffffffffffffffffffffffffffffffffffff1690565b9401938184015501610d3a565b825f528360205f2091820191015b818110610d925750610d26565b5f8155600101610d85565b610da991810190610ba1565b9060208201610dc461044282515167ffffffffffffffff1690565b610dce8351611614565b92606084019367ffffffffffffffff610def865167ffffffffffffffff1690565b161561116a5760035491604083901c67ffffffffffffffff1693610e1d67ffffffffffffffff861642610cd4565b9460a0840195610e35875167ffffffffffffffff1690565b9067ffffffffffffffff82161161112b5750505160200151610e7290610e649067ffffffffffffffff16611b30565b9367ffffffffffffffff1690565b67ffffffffffffffff81168015159081611102575b506110ad575090610ef591610eb66002610eae610ea385611bc2565b60e086015190611cf8565b950185611efe565b610ec660c0830194855190611fa0565b60406080610ee960015473ffffffffffffffffffffffffffffffffffffffff1690565b93015191015191612055565b610f22610f0a865167ffffffffffffffff1690565b67ffffffffffffffff165f52600460205260405f2090565b610f376104fe825467ffffffffffffffff1690565b61103b5750916002610fb5928694610fa8610f73610f64610f0a610fc39a9b5167ffffffffffffffff1690565b955167ffffffffffffffff1690565b859067ffffffffffffffff167fffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000825416179055565b6001840155519101610cf7565b5167ffffffffffffffff1690565b600254610fdc9060401c67ffffffffffffffff166104fe565b67ffffffffffffffff821611610ff157505f90565b611037907fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff6fffffffffffffffff00000000000000006002549260401b16911617600255565b5f90565b91611051611059945167ffffffffffffffff1690565b9051926120cb565b6110a75761055e611072835167ffffffffffffffff1690565b7fc1aea5f7000000000000000000000000000000000000000000000000000000005f5267ffffffffffffffff16600452602490565b60029150565b61055e906110c3855467ffffffffffffffff1690565b7feae35725000000000000000000000000000000000000000000000000000000005f5267ffffffffffffffff9081166004524260245216604452606490565b9050611123429161111e6104fe885467ffffffffffffffff1690565b610cd4565b11155f610e87565b7f9b772277000000000000000000000000000000000000000000000000000000005f524260045267ffffffffffffffff9081166024521660445260645ffd5b7f59d119e3000000000000000000000000000000000000000000000000000000005f5260045ffd5b35610b9e81610922565b9035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe181360301821215610195570180359067ffffffffffffffff821161019557602001918160051b3603831361019557565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b9035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe181360301821215610195570180359067ffffffffffffffff82116101955760200191813603831361019557565b9015611282578061127e9161121d565b9091565b6111f0565b335f9081527f4c48d1d2b0f4f7485fc28e3db22341d96a20aa29e6efa8149da9751603abd4e0602052604090205460ff16156112bf57565b7fe2517d3f000000000000000000000000000000000000000000000000000000005f52336004527fbd893629a699470e4ec82a5715bb4981fdaacc5d0a728bf5f55b801d8f4ef10b60245260445ffd5b805f525f60205260ff6113433360405f209073ffffffffffffffffffffffffffffffffffffffff165f5260205260405f2090565b54161561134d5750565b7fe2517d3f000000000000000000000000000000000000000000000000000000005f523360045260245260445ffd5b67ffffffffffffffff168061138e5750565b7f3ce598a9000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b60405190610100820182811067ffffffffffffffff821117610adc57604052606060e0838281528260208201528260408201525f838201525f60808201525f60a08201528260c08201520152565b8051600110156112825760400190565b805160071015611282576101000190565b8051600d1015611282576101c00190565b8051600e1015611282576101e00190565b805160081015611282576101200190565b8051600310156112825760800190565b8051600b1015611282576101800190565b8051600c1015611282576101a00190565b8051600410156112825760a00190565b8051156112825760200190565b8051600210156112825760600190565b805160101015611282576102200190565b80518210156112825760209160051b010190565b67ffffffffffffffff8111610adc5760051b60200190565b90611501826114df565b61150e6040519182610afd565b828152601f1961151e82946114df565b0190602036910137565b90602082519201517fffffffffffffffffffffffffffffffffffffffff00000000000000000000000081169260148110611560575050565b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000929350829060140360031b1b161690565b60405160c091906115a38382610afd565b6005815291601f1901825f5b8281106115bb57505050565b8060606020809385010152016115af565b906115d6826114df565b6115e36040519182610afd565b828152601f196115f382946114df565b01905f5b82811061160357505050565b8060606020809385010152016115f7565b61163061162b6116226113b9565b92808452612518565b612587565b602082019080825251600f8110611b0557507f1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d493476116766116708351611407565b51612652565b03611aca57600161169061168a8351611417565b51612545565b03611a8f577f63746963616c2062797a616e74696e65206661756c7420746f6c6572616e63656116c36116708351611428565b03611a54576116db6116d58251611439565b5161266e565b80516008811490811591611a24575b506119ea575061162b61175d6116d5836117216117106104fe61168a611762985161144a565b67ffffffffffffffff166060880152565b61172e611670825161145b565b60808701526117576117466104fe61168a845161146b565b67ffffffffffffffff1660a0880152565b5161147c565b612518565b90604081019180835251600581036119bf57506117886117828351611407565b51612587565b908151156119975761179a82516114f7565b9360c082019485525f5b8351811015611933576117ba6116d582866114cb565b80516014810361190857506117d16117d791611528565b60601c90565b73ffffffffffffffffffffffffffffffffffffffff811680156118c6575f5b8381106118325750509061182c600192611811838a516114cb565b9073ffffffffffffffffffffffffffffffffffffffff169052565b016117a4565b8161187761185e611844848d516114cb565b5173ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff1690565b14611884576001016117f6565b7f41fe18cc000000000000000000000000000000000000000000000000000000005f5273ffffffffffffffffffffffffffffffffffffffff831660045260245ffd5b7f59bff387000000000000000000000000000000000000000000000000000000005f5273ffffffffffffffffffffffffffffffffffffffff821660045260245ffd5b7f83e46ad2000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b509261178291945061194692505161148d565b61195081516115cc565b9260e081019384525f5b8251811015611991578061198a816119776116d5600195886114cb565b88519061198483836114cb565b526114cb565b500161195a565b50925050565b7f339e1ffb000000000000000000000000000000000000000000000000000000005f5260045ffd5b7f30c6792a000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b611a20906040519182917fd5edd2a500000000000000000000000000000000000000000000000000000000835260048301610934565b0390fd5b7f011b4d03dd8c01f1049143cf9c4c817e4b167f1d1b83e5c6f0f10d89ba1e7bce9150602083012014155f6116ea565b611a6461167061055e9251611428565b7fa19e609c000000000000000000000000000000000000000000000000000000005f52600452602490565b611a9f61168a61055e9251611417565b7ff71b722f000000000000000000000000000000000000000000000000000000005f52600452602490565b611ada61167061055e9251611407565b7fb8120dca000000000000000000000000000000000000000000000000000000005f52600452602490565b7fbc277732000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b67ffffffffffffffff1690815f52600460205260405f209167ffffffffffffffff83541615611b5c5750565b7ff761631b000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b60405190611b96604083610afd565b600182527fc0000000000000000000000000000000000000000000000000000000000000006020830152565b6020611c7d611bcf611592565b611c48611be660408601611bec611be6825161149d565b51612ff1565b611bf58561149d565b52611bff8461149d565b50611c0d611be68251611407565b611c1685611407565b52611c2084611407565b50611c2e611be682516114aa565b611c37856114aa565b52611c41846114aa565b505161145b565b611c518261145b565b52611c5b8161145b565b50611c64611b87565b611c6d8261148d565b52611c778161148d565b50612744565b910190611c8b8251516115cc565b905f5b83518051821015611ce1579080600192600c82145f14611ccf575050611cb3836127f5565b611cbd82866114cb565b52611cc881856114cb565b5001611c8e565b611cdc91611be6916114cb565b611cb3565b505050611cee9150612744565b6020815191012090565b919091611d0583516114f7565b925f5b8151811015611eeb57611d1b81836114cb565b51805160418103611ec0575080601b60ff611d6a611d64611d3e611d77966127d4565b517fff000000000000000000000000000000000000000000000000000000000000001690565b60f81c90565b1610611e6d575b8461309f565b50611d818161286f565b15801590611e4f575b611e275773ffffffffffffffffffffffffffffffffffffffff81165f5b838110611dc757505090611dc160019261181183896114cb565b01611d08565b81611dd861185e611844848c6114cb565b14611de557600101611da7565b7f33af0d5f000000000000000000000000000000000000000000000000000000005f5273ffffffffffffffffffffffffffffffffffffffff831660045260245ffd5b7f09cb44e6000000000000000000000000000000000000000000000000000000005f5260045ffd5b5073ffffffffffffffffffffffffffffffffffffffff811615611d8a565b611eaf611e87611e82611d64611d3e856127d4565b61285d565b60f81b7fff000000000000000000000000000000000000000000000000000000000000001690565b5f1a611eba826127d4565b53611d71565b7ff2db9ce1000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b505050565b5f198114610c975760010190565b905f915f5b8151811015611f5757611f3673ffffffffffffffffffffffffffffffffffffffff611f2e83856114cb565b511684612879565b611f43575b600101611f03565b92611f4f600191611ef0565b939050611f3b565b50506003611f66915404610c89565b90818110611f72575050565b7fe2dcb1b9000000000000000000000000000000000000000000000000000000005f5260045260245260445ffd5b905f915f5b8151811015611ff957611fd873ffffffffffffffffffffffffffffffffffffffff611fd083856114cb565b5116846128d0565b611fe5575b600101611fa5565b92611ff1600191611ef0565b939050611fdd565b5050518060011b9080820460021490151715610c9757600361201b9104610c89565b90818110612027575050565b7f7818f4e4000000000000000000000000000000000000000000000000000000005f5260045260245260445ffd5b61209f9261162b9261175d926040517fffffffffffffffffffffffffffffffffffffffff000000000000000000000000602082019260601b168252601481526104d7603482610afd565b805160021015611282576060610b9e910151612652565b8054821015611282575f5260205f2001905f90565b919067ffffffffffffffff806120e9855467ffffffffffffffff1690565b92169116149081159161218a575b5061218457600201908154815103612184575f5b815181101561217c5761214161212182856120b6565b905473ffffffffffffffffffffffffffffffffffffffff9160031b1c1690565b73ffffffffffffffffffffffffffffffffffffffff61216661185e61184485876114cb565b9116036121755760010161210b565b5050505f90565b505050600190565b50505f90565b9050600182015414155f6120f7565b805f525f60205260ff6121cd8360405f209073ffffffffffffffffffffffffffffffffffffffff165f5260205260405f2090565b541661218457805f525f6020526122058260405f209073ffffffffffffffffffffffffffffffffffffffff165f5260205260405f2090565b60017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0082541617905573ffffffffffffffffffffffffffffffffffffffff339216907f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d5f80a4600190565b805f525f60205260ff6122a48360405f209073ffffffffffffffffffffffffffffffffffffffff165f5260205260405f2090565b54161561218457805f525f6020526122dd8260405f209073ffffffffffffffffffffffffffffffffffffffff165f5260205260405f2090565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00815416905573ffffffffffffffffffffffffffffffffffffffff339216907ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b5f80a4600190565b60208151910120604051602081019182527f1260944489272988d9df285149b5aa1b0f48f2136d6f416159f840a3e074760060408201526040815261238b606082610afd565b51902090565b604051906123a0602083610afd565b5f808352366020840137565b906123b682610b31565b6123c36040519182610afd565b828152601f1961151e8294610b31565b61162b612415919493946123e76020610b31565b956123f56040519788610afd565b602087526124036020610b31565b601f1960208901910136823752612518565b906124208451610ce1565b9184511515806124f8575b6124349061253e565b6124466124415f85612997565b6123ac565b925f19015f5b818110612460575050610b9e939450612ac7565b806124e2600f6124a56124dc611d64611d3e8d61247f60029960011c90565b908d6124d68a6124ce8a6124a561249c611d64611d3e8a8a6127e4565b60041c600f1690565b1660f81b7fff000000000000000000000000000000000000000000000000000000000000001690565b5f1a926127e4565b536127e4565b60ff1690565b5f1a6124f160018301886127e4565b530161244c565b50600161242b565b6040519061250d82610ae1565b5f6020838281520152565b612520612500565b5060208151916040519261253384610ae1565b835201602082015290565b1561019557565b8051801515908161257b575b50156101955761256090612d9d565b9051906020811061256f575090565b6020036101000a900490565b6021915011155f612551565b61259081612dc9565b156101955761259e81612de9565b6125a7816114df565b916125b56040519384610afd565b818352601f196125c4836114df565b015f5b81811061263b57505060206125e79101516125e181612e4a565b90610cd4565b5f905b8282106125f75750505090565b61263381612606600193612eb5565b9061260f610b20565b82815281602082015261262286896114cb565b5261262d85886114cb565b50610cd4565b9101906125ea565b602090612646612500565b828288010152016125c7565b6021815103610195576020015160018101809111610c97575190565b80511561019557612681610b9e91612d9d565b61268d819392936123ac565b928360200190612f7e565b805191908290602001825e015f815290565b610b2f906126cc6126c694936040519586936020850190612698565b90612698565b03601f198101845283610afd565b6001907fff00000000000000000000000000000000000000000000000000000000000000610b9e94931681520190612698565b916001610b9e94937fff000000000000000000000000000000000000000000000000000000000000006126c6941681520190612698565b5f9060605b81518310156127715761276960019161276285856114cb565b51906126aa565b920191612749565b9150508051603881106127b05750610b9e61278c825161301d565b916104c96127a0611e876124dc8651610caa565b916040519485936020850161270d565b6127c2611e876124dc610b9e93610c9c565b6104c9604051938492602084016126da565b8051604010156112825760600190565b908151811015611282570160200190565b600181511480612842575b610b9e578051603881106128305750610b9e61281c825161301d565b916104c96127a0611e876124dc8651610cc6565b6127c2611e876124dc610b9e93610cb8565b50608060ff612856611d64611d3e8561149d565b1610612800565b60ff601b9116019060ff8211610c9757565b6004111561029457565b905f5b82548110156121755773ffffffffffffffffffffffffffffffffffffffff6128a482856120b6565b90549060031b1c1673ffffffffffffffffffffffffffffffffffffffff83161461217c5760010161287c565b905f5b82518110156121755773ffffffffffffffffffffffffffffffffffffffff6128fb82856114cb565b511673ffffffffffffffffffffffffffffffffffffffff83161461217c576001016128d3565b905f198201918211610c9757565b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff408201918211610c9757565b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff808201918211610c9757565b6020039060208211610c9757565b91908203918211610c9757565b91906129b08351610ce1565b908351151580612abd575b6129c49061253e565b6129d16124418284612997565b938192600180841614612a5b575b5f19869101935b8481106129f4575050505050565b83612a526001612a48600f6124a56124dc611d64611d3e8b60029b612a41612a34886124a58f611d64611d3e612a2d61249c9360011c90565b80996127e4565b9b8d03809c5f1a926127e4565b538c6127e4565b5f1a9201896127e4565b530185906129e6565b92507f0f00000000000000000000000000000000000000000000000000000000000000612a9a6124dc611d64611d3e612a948760011c90565b866127e4565b60f81b165f1a612aa98661149d565b535f19612ab583611ef0565b9390506129df565b50818111156129bb565b915f915f612ad3612500565b50845115612d645790935f915b81518310156101955782158080612d4e575b61019557159081612d31575b5061019557612b1061178283836114cb565b948551600281145f14612c0d5750612b32612b2d6116d58861149d565b613134565b95612b48612b418888846131a1565b8092610cd4565b965111612bef5715612b7f5750612b5f9051612921565b11610195575111612b76576116d5610b9e91611407565b50610b9e612391565b919094612b8c8651612921565b82146101955780612bae612baa612ba4600194611407565b51612dc9565b1590565b15612bd057612bbf612bc591611407565b51613126565b915b01919490612ae0565b612bdc612be991611407565b5160208101519051902090565b91612bc7565b505091509250612c00915051612921565b1161019557610b9e612391565b929491939192601103612cd25781518314612cb457612c3e612c386124dc611d64611d3e87876127e4565b93610c89565b92601081101561019557612c5b612c5582896114cb565b51613110565b15612c7d5750505050612c7091925051612921565b0361019557610b9e612391565b86612c95612baa612ba484600196989a97999b6114cb565b15612ca757612be991612bbf916114cb565b612be991612bdc916114cb565b505050612cc19051612921565b03610195576116d5610b9e916114ba565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f696e76616c6964206e6f6465206c656e677468000000000000000000000000006044820152606490fd5b9050612d46612d4084846114cb565b516130d9565b14155f612afe565b50612d5c612bdc85856114cb565b871415612af2565b509050612d9592507f56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b42191501461253e565b610b9e612391565b906020820191612dad8351612e4a565b925190838201809211610c975751928303928311610c97579190565b805115612de457602060c0910151515f1a1061103757600190565b505f90565b805115612de4575f9060208101908151612e0281612e4a565b8101809111610c9757915190518101809111610c975791905b828110612e285750905090565b612e3181612eb5565b8101809111610c9757612e449091611ef0565b90612e1b565b515f1a6080811015612e5b57505f90565b60b881108015612e9f575b15612e715750600190565b60c0811015612e9057610b9e90612e8b9060b75b90612997565b610c89565b610b9e90612e8b9060f7612e85565b5060c08110158015612e66575060f88110612e66565b80515f1a906080821015612eca575050600190565b60b8821015612ee05750612e8b610b9e9161295c565b60c0821015612f215760010151602082900360b7016101000a9004017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff4a0190565b60f8821015612f375750612e8b610b9e9161292f565b60010151602082900360f7016101000a9004017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0a0190565b601f8111610c97576101000a90565b90918015611eeb575b6020811015612fc15780612f9a57505050565b612fae612fa9612fb392612989565b612f6f565b612921565b905182518216911916179052565b91908051825260208101809111610c97579060208101809111610c975791601f19810190811115612f8757610c5c565b612ffb81516123ac565b9081511561301957806020610b9e9201519051908360200190612f7e565b5090565b5f81805b61308b575061302f816123ac565b91815b61303b57505090565b61304482612921565b6130767fff000000000000000000000000000000000000000000000000000000000000008360f81b165f1a91856127e4565b5360081c908015610c97575f19019081613032565b9061309590611ef0565b9060081c80613021565b81519190604183036130cf576130c89250602082015190606060408401519301515f1a90613245565b9192909190565b50505f9160029190565b805160208110156130f1575060208101519051902090565b906020015120604051602081019182526020815261238b604082610afd565b6001815103612de45760200151515f1a60801490565b61312f90612d9d565b902090565b9081511561019557600f61315061249c611d64611d3e8661149d565b16806131635750610b9e60025f936129a4565b600181036131785750610b9e60015f936129a4565b6002810361318e5750610b9e60026001936129a4565b60030361019557610b9e600180936129a4565b91905f5b838101808211610c9757825181108061323b575b15613233576131e97fff0000000000000000000000000000000000000000000000000000000000000091846127e4565b51167fff0000000000000000000000000000000000000000000000000000000000000061321683866127e4565b5116900361322c5761322790611ef0565b6131a5565b9250505090565b509250505090565b50835182106131b9565b91907f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a084116132d4579160209360809260ff5f9560405194855216868401526040830152606082015282805260015afa156132c9575f5173ffffffffffffffffffffffffffffffffffffffff8116156132bf57905f905f90565b505f906001905f90565b6040513d5f823e3d90fd5b5050505f916003919056fea164736f6c634300081c000a2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d4c48d1d2b0f4f7485fc28e3db22341d96a20aa29e6efa8149da9751603abd4e06e0c24a6e293ff9b755263dbaa15ba3796b0b8d3fe17cfb4ddf8143b268eac47bd893629a699470e4ec82a5715bb4981fdaacc5d0a728bf5f55b801d8f4ef10bad3228b676f7d3cd4284a5443f17f1962b36e491b30a40b2405849e597ba5fb5","sourceMap":"124:1506:36:-:0;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;124:1506:36;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;124:1506:36;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;:::i;:::-;;-1:-1:-1;;;;;124:1506:36;;2163:25:35;;2159:84;;124:1506:36;;13516:22:35;13512:79;;-1:-1:-1;13643:3:35;124:1506:36;;13620:21:35;;;;;-1:-1:-1;;;;;13666:13:35;;;;:::i;:::-;124:1506:36;;13666:27:35;13662:111;;-1:-1:-1;13806:5:35;;;;;;13643:3;124:1506:36;;13605:13:35;;13813:3;-1:-1:-1;;;;;13840:13:35;;;;:::i;:::-;124:1506:36;;-1:-1:-1;;;;;13857:13:35;124:1506:36;;13857:13:35;:::i;:::-;124:1506:36;;13840:30:35;13836:117;;124:1506:36;;13791:13:35;;13836:117;-1:-1:-1;;;;;13920:13:35;124:1506:36;;13920:13:35;:::i;:::-;124:1506:36;;13901:33:35;;;-1:-1:-1;13901:33:35;;124:1506:36;;-1:-1:-1;13901:33:35;13662:111;-1:-1:-1;;;;;124:1506:36;13744:13:35;;124:1506:36;13744:13:35;:::i;:::-;124:1506:36;;13720:38:35;;;-1:-1:-1;13720:38:35;;124:1506:36;;-1:-1:-1;13720:38:35;13620:21;-1:-1:-1;124:1506:36;;;13620:21:35;;;;;;;124:1506:36;;-1:-1:-1;;;;;124:1506:36;;;;;;;;;;-1:-1:-1;124:1506:36;;;2397:84:35;;124:1506:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;124:1506:36;;;;;2323:255:35;;;124:1506:36;;;-1:-1:-1;;;;;124:1506:36;;;2323:255:35;;;124:1506:36;;;;;;;2323:255:35;;;124:1506:36;;;;;;;-1:-1:-1;;;;;;124:1506:36;;;;;;;;;;;;;-1:-1:-1;;;;;;124:1506:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;124:1506:36;;;2629:15:35;124:1506:36;;;;;;;;-1:-1:-1;;;;;;124:1506:36;;;;;;;;;;2736:26:35;;124:1506:36;;;;;;;2800:25:35;;;124:1506:36;;;;;;;;;;;;;;;;;;;;13600:377:35;124:1506:36;;-1:-1:-1;124:1506:36;;-1:-1:-1;124:1506:36;-1:-1:-1;124:1506:36;;;;;;;-1:-1:-1;;;;;124:1506:36;;;;2908:44:35;;;:::i;:::-;;2863:233;124:1506:36;;;;;;;;;2863:233:35;2983:43;;3040:45;2983:43;;:::i;:::-;;3040:45;:::i;:::-;;2863:233;;124:1506:36;;;-1:-1:-1;;;;;124:1506:36;;;;;;;;;;;;;;;;-1:-1:-1;124:1506:36;;;-1:-1:-1;124:1506:36;;;;;;;;;;;;;;;;-1:-1:-1;124:1506:36;;;;;;;;;;-1:-1:-1;124:1506:36;;2629:15:35;124:1506:36;;-1:-1:-1;124:1506:36;13512:79:35;13561:19;;;-1:-1:-1;13561:19:35;;-1:-1:-1;13561:19:35;2159:84;2211:21;;;-1:-1:-1;2211:21:35;;-1:-1:-1;2211:21:35;124:1506:36;;;;;;;:::i;:::-;;;;;;;;;;-1:-1:-1;124:1506:36;;;;;;;;;-1:-1:-1;;124:1506:36;;;-1:-1:-1;;;;;124:1506:36;;;;;;;;;;:::o;:::-;;;-1:-1:-1;;;;;124:1506:36;;;;;;:::o;:::-;;;-1:-1:-1;;;;;124:1506:36;;;;;;:::o;:::-;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;6155:316:92;-1:-1:-1;;;;;124:1506:36;;2187:1:35;124:1506:36;;;-1:-1:-1;;;;;;;;;;;124:1506:36;;;;;;;;;;-1:-1:-1;;;;;124:1506:36;2187:1:35;124:1506:36;;;-1:-1:-1;;;;;;;;;;;124:1506:36;;;;;;;-1:-1:-1;;124:1506:36;;;;;735:10:120;;124:1506:36;-1:-1:-1;;;;;;;;;;;2187:1:35;;6346:40:92;6323:4;6400:11;:::o;6248:217::-;6442:12;2187:1:35;6442:12:92;:::o;6155:316::-;-1:-1:-1;;;;;124:1506:36;;;;;;-1:-1:-1;;;;;;;;;;;124:1506:36;;;;;;;;;;-1:-1:-1;;;;;124:1506:36;;;;;-1:-1:-1;;;;;;;;;;;124:1506:36;;;;;;;-1:-1:-1;;124:1506:36;;;;;735:10:120;;124:1506:36;-1:-1:-1;;;;;;;;;;;1318:33:35;-1:-1:-1;;;;;;;;;;;6346:40:92;124:1506:36;6346:40:92;6323:4;6400:11;:::o;6155:316::-;124:1506:36;;;-1:-1:-1;;;;;;;;;;;124:1506:36;;-1:-1:-1;;;;;;;;;;;124:1506:36;;;;;;;;;-1:-1:-1;;;;;;;;;;;124:1506:36;;-1:-1:-1;;;;;;;;;;;124:1506:36;;-1:-1:-1;;124:1506:36;6323:4:92;124:1506:36;;;735:10:120;;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;124:1506:36;;6346:40:92;6323:4;6400:11;:::o;6248:217::-;124:1506:36;6442:12:92;:::o","linkReferences":{}},"deployedBytecode":{"object":"0x60806040526004361015610011575f80fd5b5f3560e01c806301ffc9a7146100f45780630bece356146100ef578063248a9ca3146100ea5780632f2ff15d146100e557806336568abe146100e05780634d6d9ffb146100db5780635972185a146100d6578063682ed5f0146100d157806391d14854146100cc578063a217fddf146100c7578063d547741f146100c2578063ddba6537146100bd578063edce8bdc146100b85763ef913a4b146100b3575f80fd5b610a16565b61095e565b61088b565b61085c565b610842565b6107f4565b6105e6565b6105ac565b6103ac565b610350565b61031a565b6102b5565b610217565b34610195576020600319360112610195576004357fffffffff00000000000000000000000000000000000000000000000000000000811680910361019557807f7965db0b000000000000000000000000000000000000000000000000000000006020921490811561016b575b506040519015158152f35b7f01ffc9a7000000000000000000000000000000000000000000000000000000009150145f610160565b5f80fd5b9060206003198301126101955760043567ffffffffffffffff811161019557826023820112156101955780600401359267ffffffffffffffff84116101955760248483010111610195576024019190565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b346101955761028161022836610199565b5f80527f4c48d1d2b0f4f7485fc28e3db22341d96a20aa29e6efa8149da9751603abd4e06020527f6e0c24a6e293ff9b755263dbaa15ba3796b0b8d3fe17cfb4ddf8143b268eac475490919060ff161561029957610d9d565b6040516003821015610294576020918152f35b6101ea565b6102a1611287565b610d9d565b90816020910312610195573590565b346101955760206003193601126101955760206102df6004355f525f602052600160405f20015490565b604051908152f35b6003196040910112610195576004359060243573ffffffffffffffffffffffffffffffffffffffff811681036101955790565b346101955761034e61032b366102e7565b90610349610344825f525f602052600160405f20015490565b61130f565b612199565b005b346101955761035e366102e7565b3373ffffffffffffffffffffffffffffffffffffffff8216036103845761034e91612270565b7f6697b232000000000000000000000000000000000000000000000000000000005f5260045ffd5b346101955760206003193601126101955760043567ffffffffffffffff8111610195578060040160806003198336030112610195575f80527f4c48d1d2b0f4f7485fc28e3db22341d96a20aa29e6efa8149da9751603abd4e060205260ff7f6e0c24a6e293ff9b755263dbaa15ba3796b0b8d3fe17cfb4ddf8143b268eac4754161561059f575b61044761044260248401611192565b61137c565b60648201916001610458848461119c565b90500361056157906104a96104966104a261049d61049661049061048961048460446104e09a01611192565b611b30565b988761119c565b9061126e565b3691610b4d565b612345565b928061121d565b906001840154906040516104d7816104c960208201948560209181520190565b03601f198101835282610afd565b519020916123d3565b805161051f5761051b61050b6104fe845467ffffffffffffffff1690565b67ffffffffffffffff1690565b6040519081529081906020820190565b0390f35b61053361052e61055e92612518565b612545565b7fd039601e000000000000000000000000000000000000000000000000000000005f52600452602490565b5ffd5b61055e61056e848461119c565b7f88b3170e000000000000000000000000000000000000000000000000000000005f52600160045260245250604490565b6105a7611287565b610433565b34610195575f6003193601126101955760206040517fbd893629a699470e4ec82a5715bb4981fdaacc5d0a728bf5f55b801d8f4ef10b8152f35b346101955760206003193601126101955760043567ffffffffffffffff8111610195578060040160a06003198336030112610195575f80527f4c48d1d2b0f4f7485fc28e3db22341d96a20aa29e6efa8149da9751603abd4e060205260ff7f6e0c24a6e293ff9b755263dbaa15ba3796b0b8d3fe17cfb4ddf8143b268eac475416156107e7575b61067c61044260248401611192565b6064820191600161068d848461119c565b90500361056157608481019060206106a5838561121d565b9050036107a957906106f46104966106ed6106e56106de61049d6104966104906106d761048460446107149c01611192565b9b8b61119c565b948761121d565b8101906102a6565b948061121d565b906001850154906040516104d7816104c960208201948560209181520190565b8051156107755761052e61072791612518565b908082036107475761051b61050b6104fe855467ffffffffffffffff1690565b7f56ed1b63000000000000000000000000000000000000000000000000000000005f5260045260245260445ffd5b61055e827f56ed1b63000000000000000000000000000000000000000000000000000000005f52906044916004525f602452565b61055e6107b6838561121d565b7f24fadac8000000000000000000000000000000000000000000000000000000005f52602060045260245250604490565b6107ef611287565b61066d565b3461019557602060ff610836610809366102e7565b905f525f845260405f209073ffffffffffffffffffffffffffffffffffffffff165f5260205260405f2090565b54166040519015158152f35b34610195575f6003193601126101955760206040515f8152f35b346101955761034e61086d366102e7565b90610886610344825f525f602052600160405f20015490565b612270565b346101955761089936610199565b50505f80527f4c48d1d2b0f4f7485fc28e3db22341d96a20aa29e6efa8149da9751603abd4e06020527f6e0c24a6e293ff9b755263dbaa15ba3796b0b8d3fe17cfb4ddf8143b268eac475460ff1615610915575b7f2c1ed462000000000000000000000000000000000000000000000000000000005f5260045ffd5b61091d611287565b6108ed565b67ffffffffffffffff81160361019557565b601f19601f602060409481855280519182918282880152018686015e5f8582860101520116010190565b346101955760206003193601126101955761097e60043561048481610922565b67ffffffffffffffff8154166002600183015492019060405192608084019160208501526040840152606080840152815480915260a08301915f5260205f20905f5b8181106109ea5761051b856109de818703601f198101835282610afd565b60405191829182610934565b825473ffffffffffffffffffffffffffffffffffffffff168452602090930192600192830192016109c0565b34610195575f6003193601126101955761051b60405173ffffffffffffffffffffffffffffffffffffffff60015416602082015267ffffffffffffffff600254818116604084015260401c16606082015267ffffffffffffffff600354818116608084015260401c1660a082015260a081526109de60c082610afd565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b6060810190811067ffffffffffffffff821117610adc57604052565b610a93565b6040810190811067ffffffffffffffff821117610adc57604052565b90601f601f19910116810190811067ffffffffffffffff821117610adc57604052565b60405190610b2f604083610afd565b565b67ffffffffffffffff8111610adc57601f01601f191660200190565b929192610b5982610b31565b91610b676040519384610afd565b829481845281830111610195578281602093845f960137010152565b9080601f8301121561019557816020610b9e93359101610b4d565b90565b6020818303126101955780359067ffffffffffffffff8211610195570180820391608083126101955760405192610bd784610ac0565b823567ffffffffffffffff811161019557604091610bfa84601f19938701610b83565b8652011261019557604051610c0e81610ae1565b6020830135610c1c81610922565b81526040830135610c2c81610922565b60208201526020840152606082013567ffffffffffffffff811161019557610c549201610b83565b604082015290565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b9060018201809211610c9757565b610c5c565b60c001908160c011610c9757565b60f701908160f711610c9757565b6080019081608011610c9757565b60b701908160b711610c9757565b91908201809211610c9757565b908160011b9180830460021490151715610c9757565b81519167ffffffffffffffff8311610adc57680100000000000000008311610adc578154838355808410610d77575b506020610d389101915f5260205f2090565b5f5b838110610d475750505050565b6001906020610d6a855173ffffffffffffffffffffffffffffffffffffffff1690565b9401938184015501610d3a565b825f528360205f2091820191015b818110610d925750610d26565b5f8155600101610d85565b610da991810190610ba1565b9060208201610dc461044282515167ffffffffffffffff1690565b610dce8351611614565b92606084019367ffffffffffffffff610def865167ffffffffffffffff1690565b161561116a5760035491604083901c67ffffffffffffffff1693610e1d67ffffffffffffffff861642610cd4565b9460a0840195610e35875167ffffffffffffffff1690565b9067ffffffffffffffff82161161112b5750505160200151610e7290610e649067ffffffffffffffff16611b30565b9367ffffffffffffffff1690565b67ffffffffffffffff81168015159081611102575b506110ad575090610ef591610eb66002610eae610ea385611bc2565b60e086015190611cf8565b950185611efe565b610ec660c0830194855190611fa0565b60406080610ee960015473ffffffffffffffffffffffffffffffffffffffff1690565b93015191015191612055565b610f22610f0a865167ffffffffffffffff1690565b67ffffffffffffffff165f52600460205260405f2090565b610f376104fe825467ffffffffffffffff1690565b61103b5750916002610fb5928694610fa8610f73610f64610f0a610fc39a9b5167ffffffffffffffff1690565b955167ffffffffffffffff1690565b859067ffffffffffffffff167fffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000825416179055565b6001840155519101610cf7565b5167ffffffffffffffff1690565b600254610fdc9060401c67ffffffffffffffff166104fe565b67ffffffffffffffff821611610ff157505f90565b611037907fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff6fffffffffffffffff00000000000000006002549260401b16911617600255565b5f90565b91611051611059945167ffffffffffffffff1690565b9051926120cb565b6110a75761055e611072835167ffffffffffffffff1690565b7fc1aea5f7000000000000000000000000000000000000000000000000000000005f5267ffffffffffffffff16600452602490565b60029150565b61055e906110c3855467ffffffffffffffff1690565b7feae35725000000000000000000000000000000000000000000000000000000005f5267ffffffffffffffff9081166004524260245216604452606490565b9050611123429161111e6104fe885467ffffffffffffffff1690565b610cd4565b11155f610e87565b7f9b772277000000000000000000000000000000000000000000000000000000005f524260045267ffffffffffffffff9081166024521660445260645ffd5b7f59d119e3000000000000000000000000000000000000000000000000000000005f5260045ffd5b35610b9e81610922565b9035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe181360301821215610195570180359067ffffffffffffffff821161019557602001918160051b3603831361019557565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b9035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe181360301821215610195570180359067ffffffffffffffff82116101955760200191813603831361019557565b9015611282578061127e9161121d565b9091565b6111f0565b335f9081527f4c48d1d2b0f4f7485fc28e3db22341d96a20aa29e6efa8149da9751603abd4e0602052604090205460ff16156112bf57565b7fe2517d3f000000000000000000000000000000000000000000000000000000005f52336004527fbd893629a699470e4ec82a5715bb4981fdaacc5d0a728bf5f55b801d8f4ef10b60245260445ffd5b805f525f60205260ff6113433360405f209073ffffffffffffffffffffffffffffffffffffffff165f5260205260405f2090565b54161561134d5750565b7fe2517d3f000000000000000000000000000000000000000000000000000000005f523360045260245260445ffd5b67ffffffffffffffff168061138e5750565b7f3ce598a9000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b60405190610100820182811067ffffffffffffffff821117610adc57604052606060e0838281528260208201528260408201525f838201525f60808201525f60a08201528260c08201520152565b8051600110156112825760400190565b805160071015611282576101000190565b8051600d1015611282576101c00190565b8051600e1015611282576101e00190565b805160081015611282576101200190565b8051600310156112825760800190565b8051600b1015611282576101800190565b8051600c1015611282576101a00190565b8051600410156112825760a00190565b8051156112825760200190565b8051600210156112825760600190565b805160101015611282576102200190565b80518210156112825760209160051b010190565b67ffffffffffffffff8111610adc5760051b60200190565b90611501826114df565b61150e6040519182610afd565b828152601f1961151e82946114df565b0190602036910137565b90602082519201517fffffffffffffffffffffffffffffffffffffffff00000000000000000000000081169260148110611560575050565b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000929350829060140360031b1b161690565b60405160c091906115a38382610afd565b6005815291601f1901825f5b8281106115bb57505050565b8060606020809385010152016115af565b906115d6826114df565b6115e36040519182610afd565b828152601f196115f382946114df565b01905f5b82811061160357505050565b8060606020809385010152016115f7565b61163061162b6116226113b9565b92808452612518565b612587565b602082019080825251600f8110611b0557507f1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d493476116766116708351611407565b51612652565b03611aca57600161169061168a8351611417565b51612545565b03611a8f577f63746963616c2062797a616e74696e65206661756c7420746f6c6572616e63656116c36116708351611428565b03611a54576116db6116d58251611439565b5161266e565b80516008811490811591611a24575b506119ea575061162b61175d6116d5836117216117106104fe61168a611762985161144a565b67ffffffffffffffff166060880152565b61172e611670825161145b565b60808701526117576117466104fe61168a845161146b565b67ffffffffffffffff1660a0880152565b5161147c565b612518565b90604081019180835251600581036119bf57506117886117828351611407565b51612587565b908151156119975761179a82516114f7565b9360c082019485525f5b8351811015611933576117ba6116d582866114cb565b80516014810361190857506117d16117d791611528565b60601c90565b73ffffffffffffffffffffffffffffffffffffffff811680156118c6575f5b8381106118325750509061182c600192611811838a516114cb565b9073ffffffffffffffffffffffffffffffffffffffff169052565b016117a4565b8161187761185e611844848d516114cb565b5173ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff1690565b14611884576001016117f6565b7f41fe18cc000000000000000000000000000000000000000000000000000000005f5273ffffffffffffffffffffffffffffffffffffffff831660045260245ffd5b7f59bff387000000000000000000000000000000000000000000000000000000005f5273ffffffffffffffffffffffffffffffffffffffff821660045260245ffd5b7f83e46ad2000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b509261178291945061194692505161148d565b61195081516115cc565b9260e081019384525f5b8251811015611991578061198a816119776116d5600195886114cb565b88519061198483836114cb565b526114cb565b500161195a565b50925050565b7f339e1ffb000000000000000000000000000000000000000000000000000000005f5260045ffd5b7f30c6792a000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b611a20906040519182917fd5edd2a500000000000000000000000000000000000000000000000000000000835260048301610934565b0390fd5b7f011b4d03dd8c01f1049143cf9c4c817e4b167f1d1b83e5c6f0f10d89ba1e7bce9150602083012014155f6116ea565b611a6461167061055e9251611428565b7fa19e609c000000000000000000000000000000000000000000000000000000005f52600452602490565b611a9f61168a61055e9251611417565b7ff71b722f000000000000000000000000000000000000000000000000000000005f52600452602490565b611ada61167061055e9251611407565b7fb8120dca000000000000000000000000000000000000000000000000000000005f52600452602490565b7fbc277732000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b67ffffffffffffffff1690815f52600460205260405f209167ffffffffffffffff83541615611b5c5750565b7ff761631b000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b60405190611b96604083610afd565b600182527fc0000000000000000000000000000000000000000000000000000000000000006020830152565b6020611c7d611bcf611592565b611c48611be660408601611bec611be6825161149d565b51612ff1565b611bf58561149d565b52611bff8461149d565b50611c0d611be68251611407565b611c1685611407565b52611c2084611407565b50611c2e611be682516114aa565b611c37856114aa565b52611c41846114aa565b505161145b565b611c518261145b565b52611c5b8161145b565b50611c64611b87565b611c6d8261148d565b52611c778161148d565b50612744565b910190611c8b8251516115cc565b905f5b83518051821015611ce1579080600192600c82145f14611ccf575050611cb3836127f5565b611cbd82866114cb565b52611cc881856114cb565b5001611c8e565b611cdc91611be6916114cb565b611cb3565b505050611cee9150612744565b6020815191012090565b919091611d0583516114f7565b925f5b8151811015611eeb57611d1b81836114cb565b51805160418103611ec0575080601b60ff611d6a611d64611d3e611d77966127d4565b517fff000000000000000000000000000000000000000000000000000000000000001690565b60f81c90565b1610611e6d575b8461309f565b50611d818161286f565b15801590611e4f575b611e275773ffffffffffffffffffffffffffffffffffffffff81165f5b838110611dc757505090611dc160019261181183896114cb565b01611d08565b81611dd861185e611844848c6114cb565b14611de557600101611da7565b7f33af0d5f000000000000000000000000000000000000000000000000000000005f5273ffffffffffffffffffffffffffffffffffffffff831660045260245ffd5b7f09cb44e6000000000000000000000000000000000000000000000000000000005f5260045ffd5b5073ffffffffffffffffffffffffffffffffffffffff811615611d8a565b611eaf611e87611e82611d64611d3e856127d4565b61285d565b60f81b7fff000000000000000000000000000000000000000000000000000000000000001690565b5f1a611eba826127d4565b53611d71565b7ff2db9ce1000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b505050565b5f198114610c975760010190565b905f915f5b8151811015611f5757611f3673ffffffffffffffffffffffffffffffffffffffff611f2e83856114cb565b511684612879565b611f43575b600101611f03565b92611f4f600191611ef0565b939050611f3b565b50506003611f66915404610c89565b90818110611f72575050565b7fe2dcb1b9000000000000000000000000000000000000000000000000000000005f5260045260245260445ffd5b905f915f5b8151811015611ff957611fd873ffffffffffffffffffffffffffffffffffffffff611fd083856114cb565b5116846128d0565b611fe5575b600101611fa5565b92611ff1600191611ef0565b939050611fdd565b5050518060011b9080820460021490151715610c9757600361201b9104610c89565b90818110612027575050565b7f7818f4e4000000000000000000000000000000000000000000000000000000005f5260045260245260445ffd5b61209f9261162b9261175d926040517fffffffffffffffffffffffffffffffffffffffff000000000000000000000000602082019260601b168252601481526104d7603482610afd565b805160021015611282576060610b9e910151612652565b8054821015611282575f5260205f2001905f90565b919067ffffffffffffffff806120e9855467ffffffffffffffff1690565b92169116149081159161218a575b5061218457600201908154815103612184575f5b815181101561217c5761214161212182856120b6565b905473ffffffffffffffffffffffffffffffffffffffff9160031b1c1690565b73ffffffffffffffffffffffffffffffffffffffff61216661185e61184485876114cb565b9116036121755760010161210b565b5050505f90565b505050600190565b50505f90565b9050600182015414155f6120f7565b805f525f60205260ff6121cd8360405f209073ffffffffffffffffffffffffffffffffffffffff165f5260205260405f2090565b541661218457805f525f6020526122058260405f209073ffffffffffffffffffffffffffffffffffffffff165f5260205260405f2090565b60017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0082541617905573ffffffffffffffffffffffffffffffffffffffff339216907f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d5f80a4600190565b805f525f60205260ff6122a48360405f209073ffffffffffffffffffffffffffffffffffffffff165f5260205260405f2090565b54161561218457805f525f6020526122dd8260405f209073ffffffffffffffffffffffffffffffffffffffff165f5260205260405f2090565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00815416905573ffffffffffffffffffffffffffffffffffffffff339216907ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b5f80a4600190565b60208151910120604051602081019182527f1260944489272988d9df285149b5aa1b0f48f2136d6f416159f840a3e074760060408201526040815261238b606082610afd565b51902090565b604051906123a0602083610afd565b5f808352366020840137565b906123b682610b31565b6123c36040519182610afd565b828152601f1961151e8294610b31565b61162b612415919493946123e76020610b31565b956123f56040519788610afd565b602087526124036020610b31565b601f1960208901910136823752612518565b906124208451610ce1565b9184511515806124f8575b6124349061253e565b6124466124415f85612997565b6123ac565b925f19015f5b818110612460575050610b9e939450612ac7565b806124e2600f6124a56124dc611d64611d3e8d61247f60029960011c90565b908d6124d68a6124ce8a6124a561249c611d64611d3e8a8a6127e4565b60041c600f1690565b1660f81b7fff000000000000000000000000000000000000000000000000000000000000001690565b5f1a926127e4565b536127e4565b60ff1690565b5f1a6124f160018301886127e4565b530161244c565b50600161242b565b6040519061250d82610ae1565b5f6020838281520152565b612520612500565b5060208151916040519261253384610ae1565b835201602082015290565b1561019557565b8051801515908161257b575b50156101955761256090612d9d565b9051906020811061256f575090565b6020036101000a900490565b6021915011155f612551565b61259081612dc9565b156101955761259e81612de9565b6125a7816114df565b916125b56040519384610afd565b818352601f196125c4836114df565b015f5b81811061263b57505060206125e79101516125e181612e4a565b90610cd4565b5f905b8282106125f75750505090565b61263381612606600193612eb5565b9061260f610b20565b82815281602082015261262286896114cb565b5261262d85886114cb565b50610cd4565b9101906125ea565b602090612646612500565b828288010152016125c7565b6021815103610195576020015160018101809111610c97575190565b80511561019557612681610b9e91612d9d565b61268d819392936123ac565b928360200190612f7e565b805191908290602001825e015f815290565b610b2f906126cc6126c694936040519586936020850190612698565b90612698565b03601f198101845283610afd565b6001907fff00000000000000000000000000000000000000000000000000000000000000610b9e94931681520190612698565b916001610b9e94937fff000000000000000000000000000000000000000000000000000000000000006126c6941681520190612698565b5f9060605b81518310156127715761276960019161276285856114cb565b51906126aa565b920191612749565b9150508051603881106127b05750610b9e61278c825161301d565b916104c96127a0611e876124dc8651610caa565b916040519485936020850161270d565b6127c2611e876124dc610b9e93610c9c565b6104c9604051938492602084016126da565b8051604010156112825760600190565b908151811015611282570160200190565b600181511480612842575b610b9e578051603881106128305750610b9e61281c825161301d565b916104c96127a0611e876124dc8651610cc6565b6127c2611e876124dc610b9e93610cb8565b50608060ff612856611d64611d3e8561149d565b1610612800565b60ff601b9116019060ff8211610c9757565b6004111561029457565b905f5b82548110156121755773ffffffffffffffffffffffffffffffffffffffff6128a482856120b6565b90549060031b1c1673ffffffffffffffffffffffffffffffffffffffff83161461217c5760010161287c565b905f5b82518110156121755773ffffffffffffffffffffffffffffffffffffffff6128fb82856114cb565b511673ffffffffffffffffffffffffffffffffffffffff83161461217c576001016128d3565b905f198201918211610c9757565b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff408201918211610c9757565b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff808201918211610c9757565b6020039060208211610c9757565b91908203918211610c9757565b91906129b08351610ce1565b908351151580612abd575b6129c49061253e565b6129d16124418284612997565b938192600180841614612a5b575b5f19869101935b8481106129f4575050505050565b83612a526001612a48600f6124a56124dc611d64611d3e8b60029b612a41612a34886124a58f611d64611d3e612a2d61249c9360011c90565b80996127e4565b9b8d03809c5f1a926127e4565b538c6127e4565b5f1a9201896127e4565b530185906129e6565b92507f0f00000000000000000000000000000000000000000000000000000000000000612a9a6124dc611d64611d3e612a948760011c90565b866127e4565b60f81b165f1a612aa98661149d565b535f19612ab583611ef0565b9390506129df565b50818111156129bb565b915f915f612ad3612500565b50845115612d645790935f915b81518310156101955782158080612d4e575b61019557159081612d31575b5061019557612b1061178283836114cb565b948551600281145f14612c0d5750612b32612b2d6116d58861149d565b613134565b95612b48612b418888846131a1565b8092610cd4565b965111612bef5715612b7f5750612b5f9051612921565b11610195575111612b76576116d5610b9e91611407565b50610b9e612391565b919094612b8c8651612921565b82146101955780612bae612baa612ba4600194611407565b51612dc9565b1590565b15612bd057612bbf612bc591611407565b51613126565b915b01919490612ae0565b612bdc612be991611407565b5160208101519051902090565b91612bc7565b505091509250612c00915051612921565b1161019557610b9e612391565b929491939192601103612cd25781518314612cb457612c3e612c386124dc611d64611d3e87876127e4565b93610c89565b92601081101561019557612c5b612c5582896114cb565b51613110565b15612c7d5750505050612c7091925051612921565b0361019557610b9e612391565b86612c95612baa612ba484600196989a97999b6114cb565b15612ca757612be991612bbf916114cb565b612be991612bdc916114cb565b505050612cc19051612921565b03610195576116d5610b9e916114ba565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f696e76616c6964206e6f6465206c656e677468000000000000000000000000006044820152606490fd5b9050612d46612d4084846114cb565b516130d9565b14155f612afe565b50612d5c612bdc85856114cb565b871415612af2565b509050612d9592507f56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b42191501461253e565b610b9e612391565b906020820191612dad8351612e4a565b925190838201809211610c975751928303928311610c97579190565b805115612de457602060c0910151515f1a1061103757600190565b505f90565b805115612de4575f9060208101908151612e0281612e4a565b8101809111610c9757915190518101809111610c975791905b828110612e285750905090565b612e3181612eb5565b8101809111610c9757612e449091611ef0565b90612e1b565b515f1a6080811015612e5b57505f90565b60b881108015612e9f575b15612e715750600190565b60c0811015612e9057610b9e90612e8b9060b75b90612997565b610c89565b610b9e90612e8b9060f7612e85565b5060c08110158015612e66575060f88110612e66565b80515f1a906080821015612eca575050600190565b60b8821015612ee05750612e8b610b9e9161295c565b60c0821015612f215760010151602082900360b7016101000a9004017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff4a0190565b60f8821015612f375750612e8b610b9e9161292f565b60010151602082900360f7016101000a9004017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0a0190565b601f8111610c97576101000a90565b90918015611eeb575b6020811015612fc15780612f9a57505050565b612fae612fa9612fb392612989565b612f6f565b612921565b905182518216911916179052565b91908051825260208101809111610c97579060208101809111610c975791601f19810190811115612f8757610c5c565b612ffb81516123ac565b9081511561301957806020610b9e9201519051908360200190612f7e565b5090565b5f81805b61308b575061302f816123ac565b91815b61303b57505090565b61304482612921565b6130767fff000000000000000000000000000000000000000000000000000000000000008360f81b165f1a91856127e4565b5360081c908015610c97575f19019081613032565b9061309590611ef0565b9060081c80613021565b81519190604183036130cf576130c89250602082015190606060408401519301515f1a90613245565b9192909190565b50505f9160029190565b805160208110156130f1575060208101519051902090565b906020015120604051602081019182526020815261238b604082610afd565b6001815103612de45760200151515f1a60801490565b61312f90612d9d565b902090565b9081511561019557600f61315061249c611d64611d3e8661149d565b16806131635750610b9e60025f936129a4565b600181036131785750610b9e60015f936129a4565b6002810361318e5750610b9e60026001936129a4565b60030361019557610b9e600180936129a4565b91905f5b838101808211610c9757825181108061323b575b15613233576131e97fff0000000000000000000000000000000000000000000000000000000000000091846127e4565b51167fff0000000000000000000000000000000000000000000000000000000000000061321683866127e4565b5116900361322c5761322790611ef0565b6131a5565b9250505090565b509250505090565b50835182106131b9565b91907f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a084116132d4579160209360809260ff5f9560405194855216868401526040830152606082015282805260015afa156132c9575f5173ffffffffffffffffffffffffffffffffffffffff8116156132bf57905f905f90565b505f906001905f90565b6040513d5f823e3d90fd5b5050505f916003919056fea164736f6c634300081c000a","sourceMap":"124:1506:36:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;;;;-1:-1:-1;;124:1506:36;;;;;;;;;;;;;;;2649:47:92;2664:32;124:1506:36;2649:47:92;;:87;;;;;124:1506:36;;;;;;;;;;2649:87:92;844:25:130;829:40;;;2649:87:92;;;124:1506:36;-1:-1:-1;124:1506:36;;;;;-1:-1:-1;;124:1506:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;3516:2265:35;124:1506:36;;;:::i;:::-;-1:-1:-1;124:1506:36;;;;;;;;;;;;17324:42:35;17320:105;;3516:2265;:::i;:::-;124:1506:36;;;;;;;;;;;;;;;:::i;17320:105:35:-;17393:20;;:::i;:::-;3516:2265;:::i;124:1506:36:-;;;;;;;;;;;:::o;:::-;;;;;-1:-1:-1;;124:1506:36;;;;;;;;;3877:6:92;124:1506:36;3877:6:92;124:1506:36;;3877:22:92;124:1506:36;3877:6:92;124:1506:36;3877:22:92;124:1506:36;3786:120:92;;124:1506:36;;;;;;;;-1:-1:-1;;124:1506:36;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;4306:25:92;124:1506:36;;;:::i;:::-;4276:18:92;2484:4;4276:18;;3877:6;124:1506:36;3877:6:92;124:1506:36;;3877:22:92;124:1506:36;3877:6:92;124:1506:36;3877:22:92;124:1506:36;3786:120:92;;4276:18;2484:4;:::i;:::-;4306:25;:::i;:::-;124:1506:36;;;;;;;;:::i;:::-;735:10:120;124:1506:36;;;5397:34:92;5393:102;;5505:37;;;:::i;5393:102::-;5454:30;;;124:1506:36;5454:30:92;;124:1506:36;;;;;-1:-1:-1;;124:1506:36;;;;;;;;;;;;;;;;-1:-1:-1;;124:1506:36;;;;;;;-1:-1:-1;124:1506:36;;;;;;;;;17324:42:35;17320:105;;124:1506:36;7178:31:35;;:16;;;:31;:::i;:::-;;:::i;:::-;7224:9;;;;7244:1;7224:9;;;;:::i;:::-;:21;;;7220:97;;7386:31;124:1506:36;7532:10:35;7450:36;124:1506:36;7473:12:35;:9;7367:51;7386:31;;7532:95;7386:31;;;:::i;:::-;7367:51;:::i;:::-;7473:9;;;:::i;:::-;:12;;:::i;:::-;124:1506:36;;;:::i;:::-;7450:36:35;:::i;:::-;7532:10;;;:::i;124:1506:36:-;7558:26:35;7244:1;7558:26;;124:1506:36;;;;7596:29:35;;;124:1506:36;7596:29:35;;;;124:1506:36;;;;;;;7596:29:35;;-1:-1:-1;;7596:29:35;;;;;;:::i;:::-;124:1506:36;7586:40:35;;7532:95;;:::i;:::-;124:1506:36;;7637:109:35;;124:1506:36;7755:31:35;124:1506:36;;;;;;;;;;;;7755:31:35;124:1506:36;;;;;;;;;;;;;;;;;7637:109:35;7704:29;:20;7684:51;7704:20;;:::i;:::-;:29;:::i;:::-;7684:51;-1:-1:-1;7684:51:35;124:1506:36;;;;;7684:51:35;-1:-1:-1;7684:51:35;7220:97;7268:38;7289:9;;;;:::i;:::-;7268:38;-1:-1:-1;7268:38:35;7244:1;124:1506:36;;;;-1:-1:-1;124:1506:36;;;17320:105:35;17393:20;;:::i;:::-;17320:105;;124:1506:36;;;;;-1:-1:-1;;124:1506:36;;;;;;;;1318:33:35;124:1506:36;;;;;;;;-1:-1:-1;;124:1506:36;;;;;;;;;;;;;;;;-1:-1:-1;;124:1506:36;;;;;;;-1:-1:-1;124:1506:36;;;;;;;;;17324:42:35;17320:105;;124:1506:36;5983:31:35;;:16;;;:31;:::i;:::-;6029:9;;;;6049:1;6029:9;;;;:::i;:::-;:21;;;6025:97;;6135:10;;;;124:1506:36;6135:10:35;;;;:::i;:::-;:23;;;6131:102;;6302:31;124:1506:36;6515:10:35;6436:33;6447:10;6366:36;124:1506:36;6389:12:35;:9;6283:51;6302:31;;6515:95;6302:31;;;:::i;6283:51::-;6389:9;;;:::i;6366:36::-;6447:10;;;:::i;:::-;6436:33;;;;:::i;:::-;6515:10;;;:::i;124:1506:36:-;6541:26:35;6049:1;6541:26;;124:1506:36;;;;6579:29:35;;;124:1506:36;6579:29:35;;;;124:1506:36;;;;;;;6515:95:35;124:1506:36;;6624:20:35;6620:107;;6767:20;:29;:20;;:::i;:29::-;6811:28;;;;6807:116;;124:1506:36;6932:31:35;124:1506:36;;;;;;;6807:116:35;6862:50;-1:-1:-1;6862:50:35;124:1506:36;;;;;-1:-1:-1;7684:51:35;6620:107;6667:49;;;-1:-1:-1;6667:49:35;124:1506:36;;;;;-1:-1:-1;124:1506:36;;;6131:102:35;6181:41;6204:10;;;;:::i;:::-;6181:41;-1:-1:-1;6181:41:35;124:1506:36;;;;;-1:-1:-1;124:1506:36;;;17320:105:35;17393:20;;:::i;:::-;17320:105;;124:1506:36;;;;;;2930:29:92;124:1506:36;;;:::i;:::-;;2930:6:92;124:1506:36;2930:6:92;124:1506:36;;;2930:6:92;124:1506:36;;;;;;;;;;;;;2930:29:92;124:1506:36;;;;;;;;;;;;;;;-1:-1:-1;;124:1506:36;;;;;;;;;;;;;;;;4723:26:92;124:1506:36;;;:::i;:::-;4693:18:92;2484:4;4693:18;;3877:6;124:1506:36;3877:6:92;124:1506:36;;3877:22:92;124:1506:36;3877:6:92;124:1506:36;3877:22:92;124:1506:36;3786:120:92;;2484:4;4723:26;:::i;124:1506:36:-;;;;;;;:::i;:::-;-1:-1:-1;;17363:1:35;124:1506:36;;;;;;;;;17324:42:35;17320:105;;124:1506:36;7887:25:35;17363:1;7887:25;124:1506:36;17363:1:35;7887:25;17320:105;17393:20;;:::i;:::-;17320:105;;124:1506:36;;;;;;;:::o;:::-;-1:-1:-1;;124:1506:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;-1:-1:-1;;124:1506:36;;;;;3361:34:35;124:1506:36;;;;;:::i;3361:34:35:-;124:1506:36;;;;3477:25:35;3449:26;;;124:1506:36;3477:25:35;;124:1506:36;;;;;;;3412:91:35;124:1506:36;3412:91:35;;124:1506:36;;;;;;;;;;;;;;;;;;;-1:-1:-1;124:1506:36;;-1:-1:-1;124:1506:36;;-1:-1:-1;124:1506:36;;;;;;;3412:91:35;;;;;-1:-1:-1;;3412:91:35;;;;;;:::i;:::-;124:1506:36;;;;;;;:::i;:::-;;;;;;;;;;;;3449:26:35;124:1506:36;;;;;;;;;;;;-1:-1:-1;;124:1506:36;;;;;;;;;3199:11:35;124:1506:36;;3188:23:35;;;124:1506:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3188:23:35;;;;;;:::i;124:1506:36:-;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;:::i;:::-;;;;;;;;;;;;;;;:::o;:::-;;;-1:-1:-1;;124:1506:36;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;:::i;:::-;:::o;:::-;;;;;;;;-1:-1:-1;;124:1506:36;;;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;-1:-1:-1;124:1506:36;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;:::i;:::-;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;-1:-1:-1;;124:1506:36;;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;:::o;:::-;;;;;;;;;;;;1404:66:35;124:1506:36;;;;;;;:::o;:::-;;:::i;:::-;16633:4:35;124:1506:36;;;16633:4:35;124:1506:36;;;:::o;:::-;16787:4:35;124:1506:36;;;16787:4:35;124:1506:36;;;:::o;:::-;16120:4:35;124:1506:36;;;16120:4:35;124:1506:36;;;:::o;:::-;16262:4:35;124:1506:36;;;16262:4:35;124:1506:36;;;:::o;:::-;;;;;;;;;;:::o;:::-;;;;;;;;;8355:1:37;124:1506:36;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;124:1506:36;;;-1:-1:-1;124:1506:36;;;;;;;;;;;;;;;;-1:-1:-1;124:1506:36;;;;;;3516:2265:35;3700:40;3516:2265;3700:40;;;;:::i;:::-;3771:18;;;;:33;124:1506:36;3771:18:35;;124:1506:36;;;;;3771:33:35;3845:28;3858:14;;3845:28;:::i;:::-;3887:13;;;;124:1506:36;;;;;;;;;;;3887:18:35;3883:77;;3991:25;124:1506:36;;;;;;;;3973:43:35;;124:1506:36;;;3973:15:35;:43;:::i;:::-;4019:16;;;;124:1506:36;;;;;;;;;3973:62:35;124:1506:36;;;-1:-1:-1;3969:178:35;;-1:-1:-1;;4223:18:35;3771;4223:33;124:1506:36;;;4204:53:35;;124:1506:36;;7367:51:35;:::i;4204:53::-;124:1506:36;;;;;;;;;4284:31:35;;;:139;;;;3516:2265;4267:298;;;4618:25;;4838:79;4618:25;4674:72;3991:25;4602:62;4618:25;;;:::i;:::-;4645:18;;;;4602:62;;:::i;:::-;4713:32;;4674:72;;:::i;:::-;4787:17;;;;;;;;;:::i;:::-;4899;4881:16;124:1506:36;3991:11:35;124:1506:36;;;;;;4881:16:35;;124:1506:36;4899:17:35;;;4838:79;;:::i;:::-;4976:30;124:1506:36;;;;;;;;;;;;4976:15:35;124:1506:36;;;;;;;4976:30:35;5020:37;124:1506:36;;;;;;;5020:37:35;5016:303;;124:1506:36;;3991:25:35;124:1506:36;;;;5412:46:35;124:1506:36;5372:30:35;124:1506:36;;;;;;;;;5372:30:35;124:1506:36;;;;;;;5412:46:35;124:1506:36;;;;;;;;;;;5412:46:35;3991:11;5468:29;;124:1506:36;5552:17:35;5521:28;;124:1506:36;:::i;:::-;;;;;;;3991:25:35;124:1506:36;5584:55:35;;124:1506:36;;;;;;5584:55:35;124:1506:36;;;5584:55:35;5580:141;;5731:43;3771:33;3516:2265;:::o;5580:141::-;5655:55;;124:1506:36;;3991:25:35;124:1506:36;;;;;;;;3991:25:35;124:1506:36;;5655:55:35;3771:33;3516:2265;:::o;5016:303::-;124:1506:36;;5077:95:35;124:1506:36;;;;;;;5154:17:35;;5077:95;;:::i;:::-;5073:175;;5268:40;124:1506:36;;;;;;;;5268:40:35;3771:33;5268:40;124:1506:36;;4976:15:35;124:1506:36;;;;5073:175:35;3991:25;;-1:-1:-1;5192:41:35:o;4267:298::-;4455:99;124:1506:36;;;;;;;;;4455:99:35;3771:33;4455:99;124:1506:36;;;;4455:99:35;124:1506:36;3973:15:35;124:1506:36;;;;;;;;4284:139:35;3973:15;;4335:69;3973:15;124:1506:36;4335:40:35;124:1506:36;;;;;;;4335:40:35;:69;:::i;:::-;:88;;4284:139;;;3969:178;4058:78;3771:33;4058:78;3973:15;4058:78;124:1506:36;;;;;;;;;;;-1:-1:-1;7684:51:35;3883:77;3928:21;3771:33;3928:21;;3771:33;3928:21;124:1506:36;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;:::i;:::-;;;:::o;:::-;;:::i;3175:103:92:-;735:10:120;2930:6:92;124:1506:36;;;;;;;;;;;;3495:23:92;3491:108;;3175:103::o;3491:108::-;3541:47;2930:6;3541:47;735:10:120;3541:47:92;124:1506:36;1318:33:35;124:1506:36;;;2930:6:92;3541:47;3175:103;124:1506:36;2930:6:92;124:1506:36;2930:6:92;124:1506:36;;;2930:29:92;735:10:120;124:1506:36;2930:6:92;124:1506:36;;;;;;;;;;;;;2930:29:92;124:1506:36;;3495:23:92;3491:108;;3175:103;:::o;3491:108::-;3541:47;2930:6;3541:47;735:10:120;3541:47:92;124:1506:36;;;;2930:6:92;3541:47;14970:177:35;124:1506:36;;15051:19:35;15047:94;;14970:177;:::o;15047:94::-;15093:37;15069:1;15093:37;;124:1506:36;;15069:1:35;15093:37;124:1506:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;124:1506:36;;;;-1:-1:-1;124:1506:36;;;;-1:-1:-1;124:1506:36;;;;;;;;;;;:::o;:::-;;;8387:1:35;124:1506:36;;;;;;;:::o;:::-;;;8556:1:35;124:1506:36;;;;;;;:::o;:::-;;;8695:2:35;124:1506:36;;;;;;;:::o;:::-;;;8881:2:35;124:1506:36;;;;;;;:::o;:::-;;;8924:1:35;124:1506:36;;;;;;;:::o;:::-;;;9154:1:35;124:1506:36;;;;;;;:::o;:::-;;;9227:2:35;124:1506:36;;;;;;;:::o;:::-;;;9295:2:35;124:1506:36;;;;;;;:::o;:::-;;;10526:1:35;124:1506:36;;;;;;;:::o;:::-;;;;;;;;;:::o;:::-;;;1130:1;124:1506;;;;;;;:::o;:::-;;;7692:2:37;124:1506:36;;;;;;;:::o;:::-;;;;;;;;;;;;;;;:::o;1404:66:35:-;;;;;;;;;;;:::o;:::-;;;;;:::i;:::-;124:1506:36;;;;;;:::i;:::-;1404:66:35;;;-1:-1:-1;;1404:66:35;;;;:::i;:::-;;;;;;;;:::o;:::-;;124:1506:36;;;;;1404:66:35;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;124:1506:36;1404:66:35;;;:::o;:::-;124:1506:36;;1404:66:35;;124:1506:36;;1404:66:35;124:1506:36;;:::i;:::-;936:1;1404:66:35;;;-1:-1:-1;;1404:66:35;;-1:-1:-1;1404:66:35;;;;;;;;;:::o;:::-;;124:1506:36;1404:66:35;;;;;;;;;;;;;;;:::i;:::-;124:1506:36;;;;;;:::i;:::-;1404:66:35;;;-1:-1:-1;;1404:66:35;;;;:::i;:::-;;;-1:-1:-1;1404:66:35;;;;;;;;;:::o;:::-;;124:1506:36;1404:66:35;;;;;;;;;;8026:2705;8192:30;:21;124:1506:36;;:::i;:::-;8133:28:35;;;;8192:21;:::i;:::-;:30;:::i;:::-;8171:18;;;:51;;;;124:1506:36;8264:2:35;8236:30;;8232:114;;8368:18;1522:66;8368:36;:21;:18;;:21;:::i;:::-;;:36;:::i;:::-;8360:66;8356:168;;8387:1;8537:30;:21;:18;;:21;:::i;:::-;;:30;:::i;:::-;:35;8533:122;;1404:66;8676:37;:22;:18;;:22;:::i;:37::-;8668:67;8664:167;;8862:32;:22;:18;;:22;:::i;:::-;;:32;:::i;:::-;124:1506:36;;8924:1:35;8908:17;;;;;:73;;;8026:2705;8904:130;;;9067:18;9342:21;9276:32;:22;9067:18;9044:54;9060:38;9067:30;:21;9342:30;9067:18;;:21;:::i;9060:38::-;124:1506:36;;9044:13:35;;;1404:66;;9044:54;9135:36;:21;:18;;:21;:::i;:36::-;9108:16;;;1404:66;9182:58;9201:39;9208:31;:22;:18;;:22;:::i;9201:39::-;124:1506:36;;9182:16:35;;;1404:66;;9182:58;9276:18;:22;:::i;:32::-;9342:21;:::i;:30::-;9318:21;;;;:54;;;;124:1506:36;9418:1:35;9386:33;;9382:123;;9559:21;:33;:24;:21;;:24;:::i;:::-;;:33;:::i;:::-;124:1506:36;;;9606:26:35;9602:83;;9715:36;124:1506:36;;9715:36:35;:::i;:::-;9695:17;;;;:56;;;-1:-1:-1;9808:3:35;124:1506:36;;9781:25:35;;;;;9857:27;:17;;;;:::i;:27::-;124:1506:36;;9927:2:35;9902:27;;9898:125;;10065:23;;10057:32;10065:23;;:::i;:::-;1404:66;;;;10057:32;124:1506:36;;;10107:23:35;;10103:103;;-1:-1:-1;10239:5:35;;;;;;10412:17;;;:32;8387:1;10412:17;:32;:17;;;:32;:::i;:::-;1404:66;124:1506:36;;1404:66:35;;;10412:32;1404:66;9766:13;;10246:3;10273:17;:33;:20;;:17;;;:20;:::i;:::-;124:1506:36;;;;;10273:20:35;124:1506:36;;;;10273:33:35;;10269:116;;8387:1;1404:66;10224:13;;10269:116;10337:29;-1:-1:-1;10337:29:35;124:1506:36;;;10157:34:35;124:1506:36;1404:66:35;-1:-1:-1;7684:51:35;10103:103;10157:34;-1:-1:-1;10157:34:35;124:1506:36;;;10157:34:35;124:1506:36;1404:66:35;-1:-1:-1;7684:51:35;9898:125;9956:52;-1:-1:-1;9956:52:35;124:1506:36;;;-1:-1:-1;7684:51:35;9781:25;;;10504:24;9781:25;;;10504:33;9781:25;;10504:21;:24;:::i;:33::-;10568:29;124:1506:36;;10568:29:35;:::i;:::-;10547:18;;;;:50;;;-1:-1:-1;10649:3:35;124:1506:36;;10627:20:35;;;;;10692:12;10668:46;10692:12;:22;:12;8387:1;10692:12;;;:::i;:22::-;10668:18;;:46;;;;;:::i;:::-;;;:::i;:::-;;1404:66;10612:13;;10627:20;;;;;8026:2705::o;9602:83::-;9655:19;-1:-1:-1;9655:19:35;;-1:-1:-1;9655:19:35;9382:123;9442:52;-1:-1:-1;9442:52:35;124:1506:36;;;-1:-1:-1;7684:51:35;8904:130;9004:19;124:1506:36;;;9004:19:35;;;;;;;;;;:::i;:::-;;;;8908:73;8949:32;124:1506:36;;8171:18:35;124:1506:36;;8929:16:35;:52;;8908:73;;;8664:167;8781:37;:22;8758:62;8781:18;;:22;:::i;:37::-;8758:62;-1:-1:-1;8758:62:35;124:1506:36;;;;;8533:122:35;8613:30;:21;8595:49;8613:18;;:21;:::i;:30::-;8595:49;-1:-1:-1;8595:49:35;124:1506:36;;;;;8356:168:35;8475:36;:21;8449:64;8475:18;;:21;:::i;:36::-;8449:64;-1:-1:-1;8449:64:35;124:1506:36;;;;;8232:114:35;8289:46;8133:16;8289:46;124:1506:36;;;-1:-1:-1;7684:51:35;14672:292;124:1506:36;;;;-1:-1:-1;124:1506:36;14812:15:35;124:1506:36;;;-1:-1:-1;124:1506:36;;;;;;14857:29:35;14853:105;;14672:292;:::o;14853:105::-;14909:38;-1:-1:-1;14909:38:35;14812:15;124:1506:36;;-1:-1:-1;14909:38:35;124:1506:36;;;;;;;;:::i;:::-;;;;;;;;;:::o;790:838::-;1351:18;1274:26;924:14;;:::i;:::-;15839:17:35;1173:24:36;978:21;;;15839:17:35;978:24:36;:21;;:24;:::i;:::-;;15839:17:35;:::i;:::-;948:55:36;;;:::i;:::-;;;;;:::i;:::-;;15839:17:35;1043:24:36;:21;;:24;:::i;15839:17:35:-;1013:55:36;;;:::i;:::-;;;;;:::i;:::-;;15839:17:35;1108:24:36;:21;;:24;:::i;15839:17:35:-;1078:55:36;;;:::i;:::-;;;;;:::i;:::-;;1173:21;:24;:::i;15839:17:35:-;1143:55:36;;;:::i;:::-;;;;;:::i;:::-;;1208:23;;:::i;:::-;;;;:::i;:::-;1404:66:35;1208:23:36;;;:::i;:::-;;1274:26;:::i;:::-;1351:18;;;1339:38;1351:18;;124:1506;1339:38;:::i;:::-;1392:13;1000:1;1438:3;1411:18;;124:1506;;1407:29;;;;;1474:82;;1065:1;1474:82;1479:2;1474:7;;:82;1479:2;;;1484:33;;;;;:::i;:::-;1457:99;;;;:::i;:::-;;;;;;:::i;:::-;;1404:66:35;1392:13:36;;1474:82;15839:17:35;1534:21:36;;;;:::i;15839:17:35:-;1474:82:36;;1407:29;;;;1593:27;1407:29;;1593:27;:::i;:::-;1351:18;124:1506;;;;1583:38;790:838;:::o;11363:509:35:-;;;;11495:27;124:1506:36;;11495:27:35;:::i;:::-;11537:13;11549:1;11570:3;124:1506:36;;11552:16:35;;;;;11629:8;;;;:::i;:::-;;124:1506:36;;11998:2:35;11983:17;;11979:95;;12093:8;;12105:2;124:1506:36;12087:15:35;12093:8;;12226:30;12093:8;;:::i;:::-;124:1506:36;;;;;12093:8:35;124:1506:36;;;;12087:15:35;124:1506:36;12087:20:35;12083:90;;11570:3;12226:30;;:::i;:::-;124:1506:36;;;;:::i;:::-;12270:33:35;;;:57;;;11570:3;12266:114;;124:1506:36;;;11549:1:35;11672:5;;;;;;11836:19;;;;1404:66;11836:19;;;;;:::i;:::-;1404:66;11537:13;;11679:3;11706:10;:20;:10;;;;;:::i;:20::-;;11702:107;;1404:66;;11657:13;;11702:107;11757:33;11549:1;11757:33;124:1506:36;;;10157:34:35;124:1506:36;1404:66:35;-1:-1:-1;7684:51:35;12266:114;12350:19;11549:1;12350:19;;11549:1;12350:19;12270:57;124:1506:36;;;;12307:20:35;12270:57;;12083:90;12134:28;12141:20;:15;12147:8;;;;:::i;12141:15::-;:20;:::i;:::-;124:1506:36;;;;;;12134:28:35;11549:1;12123:39;;;;:::i;:::-;;12083:90;;11979:95;12023:40;11549:1;12023:40;124:1506:36;;;-1:-1:-1;7684:51:35;11552:16;;;;11363:509::o;124:1506:36:-;-1:-1:-1;;124:1506:36;;;;;;;:::o;12415:540:35:-;;-1:-1:-1;12612:13:35;-1:-1:-1;12647:3:35;124:1506:36;;12627:18:35;;;;;12670:47;124:1506:36;12706:10:35;;;;:::i;:::-;124:1506:36;;12670:47:35;;:::i;:::-;12666:94;;12647:3;1404:66;;12612:13;;12666:94;12737:8;;1404:66;12737:8;;:::i;:::-;12666:94;;;;;12627:18;;;12826:1;12799:32;12627:18;124:1506:36;;12799:32:35;:::i;:::-;12845:17;;;;12841:108;;12415:540;;:::o;12841:108::-;12885:53;-1:-1:-1;12885:53:35;124:1506:36;;;;;-1:-1:-1;12885:53:35;12961:463;;-1:-1:-1;13100:13:35;-1:-1:-1;13135:3:35;124:1506:36;;13115:18:35;;;;;13158:39;124:1506:36;13186:10:35;;;;:::i;:::-;124:1506:36;;13158:39:35;;:::i;:::-;13154:86;;13135:3;1404:66;;13100:13;;13154:86;13217:8;;1404:66;13217:8;;:::i;:::-;13154:86;;;;;13115:18;;;124:1506:36;;1404:66:35;124:1506:36;;;;;13299:1:35;124:1506:36;;;;;;;13303:1:35;13279:29;:25;124:1506:36;13279:29:35;:::i;:::-;13322:17;;;;13318:100;;12961:463;;:::o;13318:100::-;13362:45;-1:-1:-1;13362:45:35;124:1506:36;;;;;-1:-1:-1;13362:45:35;10737:440;11083:31;10737:440;11083:22;10737:440;10955:76;10737:440;124:1506:36;;;11004:25:35;;;124:1506:36;;;;;;11004:25:35;;;;;;;:::i;11083:31::-;124:1506:36;;11152:1:35;124:1506:36;;;;;11139:30:35;124:1506:36;;11139:15:35;:30;:::i;124:1506:36:-;;;;;;;;-1:-1:-1;124:1506:36;;-1:-1:-1;124:1506:36;;;-1:-1:-1;124:1506:36;:::o;13989:677:35:-;;;124:1506:36;;;;;;;;;;;;;;14236:37:35;;;;:82;;;13989:677;14232:125;;;14370:25;;124:1506:36;;;;;14370:53:35;14366:96;;124:1506:36;14514:3:35;124:1506:36;;14491:21:35;;;;;124:1506:36;14537:28:35;;;;:::i;:::-;124:1506:36;;;;;;;;;;;;14537:45:35;14569:13;;;;;:::i;14537:45::-;124:1506:36;;14537:45:35;14533:96;;1404:66;;14476:13;;14533:96;14602:12;;;124:1506:36;14602:12:35;:::o;14491:21::-;;;;1404:66;13989:677;:::o;14366:96::-;14439:12;;124:1506:36;14439:12:35;:::o;14236:82::-;14277:26;;;;;124:1506:36;14277:41:35;;14236:82;;;6155:316:92;124:1506:36;;;;;;;2930:29:92;124:1506:36;;;;;;;;;;;;;;;;2930:29:92;124:1506:36;;;;;;;;;;6291:29:92;124:1506:36;;;;;;;;;;;;;;;;6291:29:92;6323:4;124:1506:36;;;;;;;;735:10:120;124:1506:36;;6346:40:92;;124:1506:36;6346:40:92;;6323:4;6400:11;:::o;6708:317::-;124:1506:36;;;;;;;2930:29:92;124:1506:36;;;;;;;;;;;;;;;;2930:29:92;124:1506:36;;;;;;;;;;;6844:29:92;124:1506:36;;;;;;;;;;;;;;;;6844:29:92;124:1506:36;;;;;;;735:10:120;124:1506:36;;6900:40:92;;124:1506:36;6900:40:92;;124:1506:36;6954:11:92;:::o;11183:174:35:-;124:1506:36;;;;;11307:18:35;124:1506:36;;;11296:53:35;;124:1506:36;;;1652:66:35;124:1506:36;;;;;11296:53:35;;;;;;:::i;:::-;124:1506:36;11286:64:35;;11183:174;:::o;124:1506:36:-;;;;;;;;:::i;:::-;2680:1:37;124:1506:36;;;1404:66:35;124:1506:36;;;1404:66:35;124:1506:36:o;:::-;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;-1:-1:-1;;124:1506:36;;;;:::i;1295:390:37:-;1615:20;:29;1295:390;;;;124:1506:36;1516:2:37;124:1506:36;:::i;:::-;;;;;;;;:::i;:::-;1516:2:37;124:1506:36;;;1516:2:37;124:1506:36;:::i;:::-;-1:-1:-1;;1516:2:37;124:1506:36;;;;1404:66:35;;;1529:63:37;1615:20;:::i;:29::-;1656:21;8343:13;124:1506:36;;8343:13:37;:::i;:::-;124:1506:36;;;8374:13:37;;:33;;;1295:390;8366:42;;;:::i;:::-;8429:26;8439:15;-1:-1:-1;8439:15:37;;:::i;:::-;8429:26;:::i;:::-;8465:18;-1:-1:-1;;124:1506:36;1675:1:37;8651:14;;;;;;1608:70;;;;;;;:::i;8667:6::-;8732:5;8796:37;8748:3;8804:21;:16;8810:9;;8732:5;;8355:1;8732:5;124:1506:36;;;;8732:5:37;8729:9;;8693:59;8729:9;8715:37;8729:9;8723:21;:16;8729:9;;;;;:::i;8723:16::-;124:1506:36;;;;;;8723:21:37;8722:29;124:1506:36;;;;;;8715:37:37;1675:1;8693:59;;;:::i;:::-;;8810:9;:::i;8804:16::-;124:1506:36;;;;8796:37:37;1675:1;8770:63;;8506:1;124:1506:36;;8770:63:37;;:::i;:::-;;124:1506:36;8644:204:37;;8374:33;-1:-1:-1;8391:16:37;8374:33;;124:1506:36;;;;;;;:::i;:::-;-1:-1:-1;124:1506:36;;;;;;;:::o;1812:221:38:-;124:1506:36;;:::i;:::-;;1923:58:38;124:1506:36;;;;;;;;;:::i;:::-;1404:66:35;;1923:58:38;;1998:28;;1404:66:35;1812:221:38;:::o;124:1506:36:-;;;;:::o;6361:439:38:-;124:1506:36;;6448:12:38;;;:30;;;;6361:439;124:1506:36;;;;6522:21:38;;;:::i;:::-;6554:14;6578:192;;;;;;;6780:13;6361:439;:::o;6578:192::-;;;;;;;6361:439;:::o;6448:30::-;6476:2;6464:14;;;;6448:30;;;3245:519;3341:12;;;:::i;:::-;124:1506:36;;;3381:14:38;;;:::i;:::-;1404:66:35;;;:::i;:::-;124:1506:36;;;;;;;:::i;:::-;1404:66:35;;;-1:-1:-1;;124:1506:36;;;:::i;:::-;;-1:-1:-1;124:1506:36;;;;;;3479:11:38;;124:1506:36;3479:41:38;:11;;124:1506:36;3493:27:38;;;:::i;:::-;3479:41;;:::i;:::-;-1:-1:-1;3555:179:38;3575:9;;;;;;3744:13;;;3245:519;:::o;3586:3::-;3707:16;3615:19;;1404:66:35;3615:19:38;;:::i;:::-;124:1506:36;;;:::i;:::-;1404:66:35;;;3660:24:38;124:1506:36;3660:24:38;;1404:66:35;3648:36:38;;;;:::i;:::-;;;;;;:::i;:::-;;3707:16;:::i;:::-;3586:3;1404:66:35;3560:13:38;;;124:1506:36;;;;;:::i;:::-;;;;;;;;;;6837:298:38;6969:2;124:1506:36;;6957:14:38;124:1506:36;;7024:11:38;;124:1506:36;7038:1:38;124:1506:36;;;;;;;7049:56:38;6837:298;:::o;7141:379::-;124:1506:36;;7234:12:38;124:1506:36;;7290:21:38;7486:3;7290:21;;:::i;:::-;7343:14;;;;;;:::i;:::-;7393:61;;;;7486:3;;:::i;124:1506:36:-;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;:::i;:::-;;;:::i;:::-;;-1:-1:-1;;124:1506:36;;;;;;:::i;:::-;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;16315:523:35:-;-1:-1:-1;;124:1506:36;16476:3:35;124:1506:36;;16458:16:35;;;;;16505:31;1404:66;16527:8;;;;;:::i;:::-;;16505:31;;:::i;:::-;16476:3;1404:66;16443:13;;;16458:16;;;;124:1506:36;;16578:2:35;16561:19;;16557:120;;124:1506:36;16757:74:35;16711:29;124:1506:36;;16711:29:35;:::i;:::-;124:1506:36;16757:74:35;16774:37;16781:29;16787:22;124:1506:36;;16787:22:35;:::i;16774:37::-;124:1506:36;;;16757:74:35;;;;;;;:::i;16557:120::-;16620:36;16627:28;16633:21;16603:63;16633:21;;:::i;16620:36::-;16603:63;124:1506:36;;16603:63:35;;;;;;;:::i;124:1506:36:-;;;12098:2:35;124:1506:36;;;;;;;:::o;:::-;;;;;;;;;;;;;:::o;15869:440:35:-;15977:1;124:1506:36;;15963:15:35;:39;;;15869:440;15959:80;;124:1506:36;;16065:2:35;16052:15;;16048:108;;124:1506:36;16232:70:35;16190:25;124:1506:36;;16190:25:35;:::i;:::-;124:1506:36;16232:70:35;16249:37;16256:29;16262:22;124:1506:36;;16262:22:35;:::i;16048:108::-;16107:32;16114:24;16120:17;16090:55;16120:17;;:::i;15963:39::-;15988:6;15998:4;124:1506:36;15982:13:35;15988:6;;;;:::i;15982:13::-;124:1506:36;15982:20:35;15963:39;;124:1506:36;;;;;;;;;;;;:::o;:::-;;-1:-1:-1;124:1506:36;;;:::o;15153:284:35:-;;124:1506:36;15307:3:35;124:1506:36;;15284:21:35;;;;;124:1506:36;15330:13:35;;;;:::i;:::-;124:1506:36;;;;;;;;;;15330:23:35;15326:73;;1404:66;;15269:13;;15443:282;;124:1506:36;15595:3:35;124:1506:36;;15572:21:35;;;;;124:1506:36;15618:13:35;;;;:::i;:::-;124:1506:36;;;;;15618:23:35;15614:73;;1404:66;;15557:13;;124:1506:36;;-1:-1:-1;;124:1506:36;;;;;;;:::o;:::-;;;;;;;;;;:::o;:::-;;;;;;;;;;:::o;:::-;;;;;;;;;:::o;:::-;;;;;;;;;;:::o;8215:649:37:-;;;8343:13;124:1506:36;;8343:13:37;:::i;:::-;124:1506:36;;;8374:13:37;;:33;;;8215:649;8366:42;;;:::i;:::-;8429:26;8439:15;;;;:::i;8429:26::-;8465:18;;8497:10;8506:1;8497:10;;;:15;8493:118;;8215:649;-1:-1:-1;;124:1506:36;;;8644:204:37;8651:14;;;;;;8215:649;;;;;:::o;8667:6::-;8732:5;8770:63;8506:1;8796:37;8748:3;8804:21;:16;8810:9;;8732:5;8355:1;8732:5;8693:59;8715:37;8732:5;8723:21;8732:5;8729:9;;8732:5;8723:16;8732:5;124:1506:36;;;;8732:5:37;8729:9;;;:::i;8715:37::-;124:1506:36;;;8693:59:37;;8386:1;8693:59;;;:::i;:::-;;8810:9;;:::i;8796:37::-;8386:1;8770:63;124:1506:36;;8770:63:37;;:::i;:::-;;124:1506:36;8644:204:37;;;;8493:118;8558:10;;124:1506:36;8549:26:37;:21;8555:14;;8558:10;;124:1506:36;;;;8558:10:37;8555:14;;:::i;8549:26::-;124:1506:36;;;8386:1:37;8528:55;;;;:::i;:::-;;-1:-1:-1;;8597:3:37;;;:::i;:::-;8493:118;;;;;8374:33;-1:-1:-1;8391:16:37;;;;8374:33;;2450:5418;;2680:1;2691:20;2680:1;124:1506:36;;:::i;:::-;;;;2810:17:37;2806:223;;3097:13;;2680:1;3092:4724;3130:3;124:1506:36;;3112:16:37;;;;;3212:6;;;;:50;;3130:3;3208:97;;3419:6;:47;;;;3130:3;3415:94;;;3635:17;:8;;;;:::i;:17::-;124:1506:36;;;3686:1:37;3671:16;;3667:4139;3686:1;;;3865:7;3837:46;3865:17;:7;;;:::i;:17::-;3837:46;:::i;:::-;3925:56;3999:28;3925:56;;;;;:::i;:::-;3999:28;;;:::i;:::-;124:1506:36;;-1:-1:-1;4046:994:37;;5058:1185;;;124:1506:36;5136:16:37;124:1506:36;;5136:16:37;:::i;:::-;-1:-1:-1;5128:144:37;;124:1506:36;-1:-1:-1;5294:109:37;;5436:7;5472:18;5436:7;;:::i;5294:109::-;5368:12;;;:::i;5058:1185::-;124:1506:36;;;5615:16:37;124:1506:36;;5615:16:37;:::i;:::-;5610:21;;5606:138;;5771:7;5770:17;5771:16;:7;1404:66:35;5771:7:37;;:::i;:::-;;:16;:::i;:::-;5770:17;;124:1506:36;5770:17:37;5771:7;;;5958;:26;:7;;:::i;:::-;;:26;:::i;:::-;5766:459;;1404:66:35;3097:13:37;;;;;5766:459;6175:7;:27;:7;;:::i;:::-;;4455:11:38;;;124:1506:36;;;4532:62:38;;4351:272;;6175:27:37;5766:459;;;4046:994;124:1506:36;;;;;;4839:16:37;124:1506:36;;;4839:16:37;:::i;:::-;-1:-1:-1;4831:149:37;;5009:12;;:::i;3667:4139::-;6267:17;;;;;;6282:2;6267:17;6282:2;;124:1506:36;;6340:36:37;;6356:20;;6572:17;6507:43;6515:34;6521:27;;;;;:::i;6507:43::-;6572:17;;:::i;:::-;6615:12;6625:2;6615:12;;;6611:146;;6783:33;6803:12;;;;:::i;:::-;;6783:33;:::i;:::-;6803:12;;;124:1506:36;;;;6887:16:37;124:1506:36;;;;6887:16:37;:::i;:::-;6882:21;6878:157;;7068:12;;:::i;6779:555::-;7114:12;7113:22;7114:21;:12;;1404:66:35;7114:12:37;;;;;;;:::i;7113:22::-;7114:12;;;7178:31;:12;;;;:::i;7109:225::-;7279:32;:12;;;;:::i;6336:1388::-;124:1506:36;;;7532:16:37;124:1506:36;;7532:16:37;:::i;:::-;7527:21;7523:135;;7687:8;:18;:8;;:::i;6263:1543::-;124:1506:36;;7762:29:37;;;124:1506:36;7762:29:37;;;124:1506:36;;;;;;;;;;;;;9004:19:35;3419:47:37;3457:8;;3445:21;3457:8;;;;:::i;:::-;;3445:21;:::i;:::-;3429:37;;3419:47;;;3212:50;3234:8;:28;:8;;;;:::i;:28::-;3222:40;;;3212:50;;2806:223;2906:78;;;2898:87;2906:78;;2918:66;2906:78;;;2898:87;:::i;:::-;3006:12;;:::i;2689:281:38:-;;2818:11;;;124:1506:36;2803:27:38;124:1506:36;;2803:27:38;:::i;:::-;124:1506:36;;;;;;;;;;;;;;;;;;;;2943:20:38;2689:281;:::o;3868:321::-;124:1506:36;;3948:13:38;3944:31;;4024:11;627:4;4024:11;;124:1506:36;4045:64:38;124:1506:36;4045:64:38;4123:24;4119:42;;4178:4;3868:321;:::o;3944:31::-;3963:12;124:1506:36;3963:12:38;:::o;7628:424::-;124:1506:36;;7712:13:38;7708:27;;124:1506:36;7791:11:38;;;;124:1506:36;;;7805:27:38;;;:::i;:::-;124:1506:36;;;;;;;;;;;;;;;;;;7891:132:38;;7898:16;;;;;;8033:12;;;7628:424;:::o;7891:132::-;7950:20;;;:::i;:::-;124:1506:36;;;;;;;8005:7:38;7930:40;8005:7;;:::i;:::-;7891:132;;;9416:581;9520:64;124:1506:36;9520:64:38;538:4;9598:26;;538:4;;;9640:8;124:1506:36;9640:8:38;:::o;9594:397::-;583:4;9669:25;;:83;;;;9594:397;9665:326;;;9768:8;9775:1;9768:8;:::o;9665:326::-;627:4;9797:24;;627:4;;;9874:35;;:31;;670:4;9874:31;;;:::i;:::-;:35;:::i;9793:198::-;9947:33;;:29;;670:4;9947:29;124:1506:36;9669:83:38;9699:25;627:4;9699:25;;;:52;;9669:83;9699:52;9728:23;670:4;9728:23;;9669:83;;8101:1263;8227:64;;-1:-1:-1;8227:64:38;;538:4;8305:26;;538:4;;;8347:11;;8357:1;8101:1263;:::o;8301:1032::-;583:4;8379:25;;583:4;;;8430:26;;:30;:26;;:::i;8375:958::-;627:4;8481:24;;627:4;;;8521:385;;;;;;;;;;;;;;;;124:1506:36;:::o;8477:856:38:-;670:4;8926:23;;670:4;;;8975:24;;:28;:24;;:::i;8922:411::-;9034:289;;;;;;;;;;;;;;;;124:1506:36;:::o;707:2:38:-;;;;;;;;;:::o;10155:770::-;;;10236:8;;10232:21;;10317:16;707:2;10317:16;;;;;10518:7;10514:405;;10155:770;;;:::o;10514:405::-;10640:24;10648:15;10640:28;10648:15;;:::i;:::-;10640:24;:::i;:::-;:28;:::i;:::-;10682:227;;;;;;;;;;;;10155:770::o;10335:16::-;10367:65;;;;;;707:2;124:1506:36;;;;;;;10476:17:38;707:2;124:1506:36;;;;;;;10335:16:38;-1:-1:-1;;124:1506:36;;;;;;10310:194:38;124:1506:36;;:::i;5161:337:38:-;5271:19;124:1506:36;;5271:19:38;:::i;:::-;124:1506:36;;;5304:18:38;5300:37;;5441:11;5369:57;5459:8;5441:11;;124:1506:36;;;5369:57:38;;;;5459:8;;:::i;5300:37::-;5324:13;;:::o;16844:430:35:-;-1:-1:-1;16929:19:35;;16989:8;;;17084:17;;;;:::i;:::-;17111:11;17132:116;17157:5;;;17257:10;;16844:430;:::o;17164:3::-;17187:5;;;:::i;:::-;17183:31;124:1506:36;;;;;-1:-1:-1;17183:31:35;;;;:::i;:::-;;124:1506:36;;17164:3:35;124:1506:36;;;;-1:-1:-1;;124:1506:36;17137:18:35;;;;16982:73;17013:8;;;;:::i;:::-;124:1506:36;17043:1:35;124:1506:36;16982:73:35;;;2129:778:129;124:1506:36;;;2129:778:129;2319:2;2299:22;;2319:2;;2751:25;2535:196;;;;;;;;;;;;;;;-1:-1:-1;2535:196:129;2751:25;;:::i;:::-;2744:32;;;;;:::o;2295:606::-;2807:83;;2823:1;2807:83;2827:35;2807:83;;:::o;10497:270:37:-;124:1506:36;;10608:2:37;10596:14;;10608:2;;;4455:11:38;10608:2:37;4455:11:38;;124:1506:36;;;4532:62:38;;10626:32:37;:::o;10592:169::-;4455:11:38;10608:2:37;4455:11:38;124:1506:36;4532:62:38;124:1506:36;;10608:2:37;10706:43;;124:1506:36;;;10608:2:37;10706:43;;;124:1506:36;10706:43:37;;:::i;7874:335::-;7989:1;124:1506:36;;7977:13:37;7973:56;;8072:11;;124:1506:36;8093:60:37;124:1506:36;8093:60:37;8174:4;8169:9;;7874:335::o;4781:270:38:-;4902:21;4781:270;4902:21;:::i;:::-;4957:65;;4781:270;:::o;8870:729:37:-;;124:1506:36;;9000:13:37;124:1506:36;;9066:3:37;9046:17;:12;9052:5;;;;:::i;9046:17::-;:23;9111:16;;;9143:10;9566:25;9152:1;124:1506:36;9107:434:37;9566:25;:::i;9107:434::-;9217:1;9202:16;;9217:1;;9234:10;9566:25;9217:1;124:1506:36;9198:343:37;9566:25;:::i;9198:343::-;9308:1;9293:16;;9308:1;;9325:10;9566:25;9308:1;9217;9289:252;9566:25;:::i;9289:252::-;9398:1;9383:16;9398:1;;9566:25;9217:1;9439:13;9379:162;9566:25;:::i;9605:320::-;;;124:1506:36;9800:3:37;124:1506:36;;;;;;;;;;9757:24:37;;:41;;;9800:3;9757:41;;;9823:16;124:1506:36;;9823:16:37;;:::i;:::-;124:1506:36;;;9843:5:37;;;;:::i;:::-;124:1506:36;;9823:25:37;;9819:72;;9800:3;;;:::i;:::-;9750:151;;9819:72;9868:8;;;;;:::o;9757:41::-;;;;;;9605:320;:::o;9757:41::-;124:1506:36;;;9785:13:37;;9757:41;;5203:1551:129;;;6283:66;6270:79;;6266:164;;124:1506:36;;;;;;-1:-1:-1;124:1506:36;;;;;;;;;;;;;;;;;;;6541:24:129;;;;;;;;;-1:-1:-1;6541:24:129;124:1506:36;;;6579:20:129;6575:113;;6698:49;-1:-1:-1;6698:49:129;-1:-1:-1;5203:1551:129;:::o;6575:113::-;6615:62;-1:-1:-1;6615:62:129;6541:24;6615:62;-1:-1:-1;6615:62:129;:::o;6541:24::-;124:1506:36;;;;;;;;;6266:164:129;6365:54;;;6381:1;6365:54;6385:30;6365:54;;:::o","linkReferences":{}},"methodIdentifiers":{"DEFAULT_ADMIN_ROLE()":"a217fddf","PROOF_SUBMITTER_ROLE()":"5972185a","getClientState()":"ef913a4b","getConsensusState(uint64)":"edce8bdc","getRoleAdmin(bytes32)":"248a9ca3","grantRole(bytes32,address)":"2f2ff15d","hasRole(bytes32,address)":"91d14854","misbehaviour(bytes)":"ddba6537","renounceRole(bytes32,address)":"36568abe","revokeRole(bytes32,address)":"d547741f","supportsInterface(bytes4)":"01ffc9a7","updateClient(bytes)":"0bece356","verifyMembership((bytes,(uint64,uint64),bytes[],bytes))":"682ed5f0","verifyNonMembership((bytes,(uint64,uint64),bytes[]))":"4d6d9ffb"},"rawMetadata":"{\"compiler\":{\"version\":\"0.8.28+commit.7893614a\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"ibcRouter\",\"type\":\"address\"},{\"internalType\":\"uint64\",\"name\":\"initialTrustedHeight\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"initialTrustedTimestamp\",\"type\":\"uint64\"},{\"internalType\":\"bytes32\",\"name\":\"initialTrustedStorageRoot\",\"type\":\"bytes32\"},{\"internalType\":\"address[]\",\"name\":\"initialTrustedValidators\",\"type\":\"address[]\"},{\"internalType\":\"uint64\",\"name\":\"trustingPeriod\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"maxClockDrift\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"roleManager\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"AccessControlBadConfirmation\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"internalType\":\"bytes32\",\"name\":\"neededRole\",\"type\":\"bytes32\"}],\"name\":\"AccessControlUnauthorizedAccount\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"revisionHeight\",\"type\":\"uint64\"}],\"name\":\"ConflictingConsensusState\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"trustedTimestamp\",\"type\":\"uint64\"},{\"internalType\":\"uint256\",\"name\":\"currentTimestamp\",\"type\":\"uint256\"},{\"internalType\":\"uint64\",\"name\":\"trustingPeriod\",\"type\":\"uint64\"}],\"name\":\"ConsensusStateExpired\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"revisionHeight\",\"type\":\"uint64\"}],\"name\":\"ConsensusStateNotFound\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"signer\",\"type\":\"address\"}],\"name\":\"DuplicateCommitSealSigner\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"validator\",\"type\":\"address\"}],\"name\":\"DuplicateValidator\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"EmptyValidatorSet\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"currentTimestamp\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"headerTimestamp\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxClockDrift\",\"type\":\"uint256\"}],\"name\":\"HeaderFromFuture\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"actual\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"required\",\"type\":\"uint256\"}],\"name\":\"InsufficientTrustedValidatorOverlap\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"actual\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"required\",\"type\":\"uint256\"}],\"name\":\"InsufficientValidatorQuorum\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidCommitSeal\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"expectedValue\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"actualValue\",\"type\":\"bytes32\"}],\"name\":\"InvalidCommitmentValue\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"actualDifficulty\",\"type\":\"uint256\"}],\"name\":\"InvalidDifficulty\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"length\",\"type\":\"uint256\"}],\"name\":\"InvalidECDSASignatureLength\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"itemsLength\",\"type\":\"uint256\"}],\"name\":\"InvalidExtraDataFormat\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"itemsLength\",\"type\":\"uint256\"}],\"name\":\"InvalidHeaderFormat\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidHeaderHeight\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"actualMixHash\",\"type\":\"bytes32\"}],\"name\":\"InvalidMixHash\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"actualNonce\",\"type\":\"bytes\"}],\"name\":\"InvalidNonce\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"actualOmmersHash\",\"type\":\"bytes32\"}],\"name\":\"InvalidOmmersHash\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"expectedLength\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"actualLength\",\"type\":\"uint256\"}],\"name\":\"InvalidPathLength\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"providedRevisionNumber\",\"type\":\"uint64\"}],\"name\":\"InvalidRevisionNumber\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"validator\",\"type\":\"address\"}],\"name\":\"InvalidValidatorAddress\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"length\",\"type\":\"uint256\"}],\"name\":\"InvalidValidatorAddressLength\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"expectedLength\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"actualLength\",\"type\":\"uint256\"}],\"name\":\"InvalidValueLength\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"UnsupportedMisbehaviour\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"actualValue\",\"type\":\"bytes32\"}],\"name\":\"ValueExists\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"previousAdminRole\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"newAdminRole\",\"type\":\"bytes32\"}],\"name\":\"RoleAdminChanged\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"RoleGranted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"RoleRevoked\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"DEFAULT_ADMIN_ROLE\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"PROOF_SUBMITTER_ROLE\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getClientState\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"revisionHeight\",\"type\":\"uint64\"}],\"name\":\"getConsensusState\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"}],\"name\":\"getRoleAdmin\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"grantRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"hasRole\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"name\":\"misbehaviour\",\"outputs\":[],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"callerConfirmation\",\"type\":\"address\"}],\"name\":\"renounceRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"revokeRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes4\",\"name\":\"interfaceId\",\"type\":\"bytes4\"}],\"name\":\"supportsInterface\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"updateMsg\",\"type\":\"bytes\"}],\"name\":\"updateClient\",\"outputs\":[{\"internalType\":\"enum ILightClientMsgs.UpdateResult\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes\",\"name\":\"proof\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"uint64\",\"name\":\"revisionNumber\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"revisionHeight\",\"type\":\"uint64\"}],\"internalType\":\"struct IICS02ClientMsgs.Height\",\"name\":\"proofHeight\",\"type\":\"tuple\"},{\"internalType\":\"bytes[]\",\"name\":\"path\",\"type\":\"bytes[]\"},{\"internalType\":\"bytes\",\"name\":\"value\",\"type\":\"bytes\"}],\"internalType\":\"struct ILightClientMsgs.MsgVerifyMembership\",\"name\":\"msg_\",\"type\":\"tuple\"}],\"name\":\"verifyMembership\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes\",\"name\":\"proof\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"uint64\",\"name\":\"revisionNumber\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"revisionHeight\",\"type\":\"uint64\"}],\"internalType\":\"struct IICS02ClientMsgs.Height\",\"name\":\"proofHeight\",\"type\":\"tuple\"},{\"internalType\":\"bytes[]\",\"name\":\"path\",\"type\":\"bytes[]\"}],\"internalType\":\"struct ILightClientMsgs.MsgVerifyNonMembership\",\"name\":\"msg_\",\"type\":\"tuple\"}],\"name\":\"verifyNonMembership\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"errors\":{\"AccessControlBadConfirmation()\":[{\"details\":\"The caller of a function is not the expected one. NOTE: Don't confuse with {AccessControlUnauthorizedAccount}.\"}],\"AccessControlUnauthorizedAccount(address,bytes32)\":[{\"details\":\"The `account` is missing a role.\"}]},\"events\":{\"RoleAdminChanged(bytes32,bytes32,bytes32)\":{\"details\":\"Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite {RoleAdminChanged} not being emitted to signal this.\"},\"RoleGranted(bytes32,address,address)\":{\"details\":\"Emitted when `account` is granted `role`. `sender` is the account that originated the contract call. This account bears the admin role (for the granted role). Expected in cases where the role was granted using the internal {AccessControl-_grantRole}.\"},\"RoleRevoked(bytes32,address,address)\":{\"details\":\"Emitted when `account` is revoked `role`. `sender` is the account that originated the contract call: - if using `revokeRole`, it is the admin role bearer - if using `renounceRole`, it is the role bearer (i.e. `account`)\"}},\"kind\":\"dev\",\"methods\":{\"getClientState()\":{\"returns\":{\"_0\":\"The client state.\"}},\"getRoleAdmin(bytes32)\":{\"details\":\"Returns the admin role that controls `role`. See {grantRole} and {revokeRole}. To change a role's admin, use {_setRoleAdmin}.\"},\"grantRole(bytes32,address)\":{\"details\":\"Grants `role` to `account`. If `account` had not been already granted `role`, emits a {RoleGranted} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleGranted} event.\"},\"hasRole(bytes32,address)\":{\"details\":\"Returns `true` if `account` has been granted `role`.\"},\"renounceRole(bytes32,address)\":{\"details\":\"Revokes `role` from the calling account. Roles are often managed via {grantRole} and {revokeRole}: this function's purpose is to provide a mechanism for accounts to lose their privileges if they are compromised (such as when a trusted device is misplaced). If the calling account had been revoked `role`, emits a {RoleRevoked} event. Requirements: - the caller must be `callerConfirmation`. May emit a {RoleRevoked} event.\"},\"revokeRole(bytes32,address)\":{\"details\":\"Revokes `role` from `account`. If `account` had been granted `role`, emits a {RoleRevoked} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleRevoked} event.\"},\"supportsInterface(bytes4)\":{\"details\":\"Returns true if this contract implements the interface defined by `interfaceId`. See the corresponding https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[ERC section] to learn more about how these ids are created. This function call must use less than 30 000 gas.\"},\"updateClient(bytes)\":{\"params\":{\"updateMsg\":\"The encoded update message e.g., an SP1 proof.\"},\"returns\":{\"_0\":\"The result of the update operation\"}},\"verifyMembership((bytes,(uint64,uint64),bytes[],bytes))\":{\"details\":\"Notice that this message is not view, as it may update the client state for caching purposes.\",\"params\":{\"msg_\":\"The membership message\"},\"returns\":{\"_0\":\"The unix timestamp of the verification height in the counterparty chain in seconds.\"}},\"verifyNonMembership((bytes,(uint64,uint64),bytes[]))\":{\"details\":\"Notice that this message is not view, as it may update the client state for caching purposes.\",\"params\":{\"msg_\":\"The membership message\"},\"returns\":{\"_0\":\"The unix timestamp of the verification height in the counterparty chain in seconds.\"}}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"getClientState()\":{\"notice\":\"Returns the client state.\"},\"updateClient(bytes)\":{\"notice\":\"Updating the client and consensus state\"},\"verifyMembership((bytes,(uint64,uint64),bytes[],bytes))\":{\"notice\":\"Querying the membership of a key-value pair\"},\"verifyNonMembership((bytes,(uint64,uint64),bytes[]))\":{\"notice\":\"Querying the non-membership of a key\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/light-clients/besu/BesuQBFTLightClient.sol\":\"BesuQBFTLightClient\"},\"evmVersion\":\"cancun\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"none\"},\"optimizer\":{\"enabled\":true,\"runs\":10000},\"remappings\":[\":@openzeppelin-contracts/=node_modules/@openzeppelin/contracts/\",\":@openzeppelin-upgradeable/=node_modules/@openzeppelin/contracts-upgradeable/\",\":@openzeppelin/=node_modules/@openzeppelin/\",\":@sp1-contracts/=node_modules/sp1-contracts/contracts/src/\",\":@uniswap/permit2/=node_modules/@uniswap/permit2/\",\":forge-std/=node_modules/forge-std/src/\",\":sp1-contracts/=node_modules/sp1-contracts/\"],\"viaIR\":true},\"sources\":{\"contracts/interfaces/ILightClient.sol\":{\"keccak256\":\"0x1caae9e4f741a86c0056d5f7713a35f3bd96db7a9fd52fc9f1cf79aad76a442f\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://4a536db3b926560f69547c17e4f451a2631ddea0f42bd224c7fd8382d74429f6\",\"dweb:/ipfs/QmcQ33kxcmmowXgMbQGTBgiKBjF7v8UiP4y73bB9hhDizC\"]},\"contracts/light-clients/besu/BesuLightClientBase.sol\":{\"keccak256\":\"0x44fd20d599cfed2298d6a26ec8584c5955b4c6b097d7b9f42d9ef7e462d7a4ad\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://86ce26f4e3d6b4327680d93daf5b8a795fb5e76cf566bd9328988d4b5e170c7e\",\"dweb:/ipfs/QmTkwvf1Xvasx3zpgcYVQa2VMEL1CXjrESwuV7vKNa3VhQ\"]},\"contracts/light-clients/besu/BesuQBFTLightClient.sol\":{\"keccak256\":\"0x77a13cd3904586c9d194f6161c1893f7eabd42e0b44a63d1f3c33fce78af4442\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://3f1538090d25aa3e2b0ee9d333aab1afbd5caa10ec9df5fe7a41ecc4a14856d3\",\"dweb:/ipfs/QmbPjkkXdjzKgj2JmzMbyWqfdywfQJVXgVgvJddW636XUb\"]},\"contracts/light-clients/besu/MPTProof.sol\":{\"keccak256\":\"0x232c01021016519bf2fdda5abfac7ab23f01e3c9f59c0233a5944d16a94b343a\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://17387ba08707c70bc36df9a36a7f731d63db9f183b2675b7db35b9861c24c3b7\",\"dweb:/ipfs/QmerMaj4tnVPwfdA69eVx9joJXQP72MR4KLudSpPf28NkZ\"]},\"contracts/light-clients/besu/RLPReader.sol\":{\"keccak256\":\"0xeb60cddae95fa2779d1e8f0d7a622737480ee67348ea0c6e65f13c93cfc9d5bb\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://550fcc3d1527dd6a4f3621a72d7afc5c49dd5aa4b16992934a81c17dd0386a27\",\"dweb:/ipfs/QmeF5UNemcyEeyU3y6Ru5bK4NG1v9xpWvp3J9WdXfsgkGa\"]},\"contracts/light-clients/besu/errors/IBesuLightClientErrors.sol\":{\"keccak256\":\"0x5b5fd8ec4ad07c713fb5337cfec9769e4d0fa30817bc237a98b2ce4cf155feac\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://8fc013ed01d0e08590ee92f80f8089c18c334024d4d1a77a04ce3673b5d1e103\",\"dweb:/ipfs/QmeWAn9JoVVsBin8JnvBLRP51QBCsM9m95bVrZoKFtkUfo\"]},\"contracts/light-clients/besu/msgs/IBesuLightClientMsgs.sol\":{\"keccak256\":\"0xbd6a5a6309d1076319f61820ae239848dcb4dca598240d5f9f927e02ed8b58c9\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://ef5a28164d53832a52112a91747dbe84439a8003c489116425b7fd2d631425d9\",\"dweb:/ipfs/QmbUqMt72DZFtfyupG9jQXEkQFGpVrUb4wQW3bNiUPV1AR\"]},\"contracts/msgs/IICS02ClientMsgs.sol\":{\"keccak256\":\"0xb5fdb25319d5c32b3f527982d45ec1e9bec5215515581aee034d853006ea01a0\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://6b8939bf552c62c952a491008bcd9b59ab7dda20a9482bf93438e05793881542\",\"dweb:/ipfs/QmfWmzNCp8bd4pP26Lfw5HHp4dSZnCDqZDjVN7SD8P7eDh\"]},\"contracts/msgs/ILightClientMsgs.sol\":{\"keccak256\":\"0xa0565e7748b8b3284d72e1aa6ef4cc8264fcaa5f4e0761d22d64686953db6378\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://c4476010d7090bfaa74127526f2051c6bc82ff42a09b936e848880a1f15a6065\",\"dweb:/ipfs/QmY87JgRsFQXSZdGXNjNHEJCkdTHzFXH4vZEJ3q7MnHuP8\"]},\"node_modules/@openzeppelin/contracts/access/AccessControl.sol\":{\"keccak256\":\"0x1a6b4f6b7798ab80929d491b89d5427a9b3338c0fd1acd0ba325f69c6f1646af\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://7bb7f346c12a14dc622bc105ce3c47202fbc89f4b153a28a63bb68193297330c\",\"dweb:/ipfs/QmagwF8P3bUBXwdo159ueEnY9dLSvEWwK24kk2op58egwG\"]},\"node_modules/@openzeppelin/contracts/access/IAccessControl.sol\":{\"keccak256\":\"0xbff9f59c84e5337689161ce7641c0ef8e872d6a7536fbc1f5133f128887aba3c\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://b308f882e796f7b79c9502deacb0a62983035c6f6f4e962b319ba6a1f4a77d3d\",\"dweb:/ipfs/QmaWCW7ahEQqFjwhSUhV7Ae7WhfNvzSpE7DQ58hvEooqPL\"]},\"node_modules/@openzeppelin/contracts/utils/Context.sol\":{\"keccak256\":\"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://6a708e8a5bdb1011c2c381c9a5cfd8a9a956d7d0a9dc1bd8bcdaf52f76ef2f12\",\"dweb:/ipfs/Qmax9WHBnVsZP46ZxEMNRQpLQnrdE4dK8LehML1Py8FowF\"]},\"node_modules/@openzeppelin/contracts/utils/cryptography/ECDSA.sol\":{\"keccak256\":\"0x69f54c02b7d81d505910ec198c11ed4c6a728418a868b906b4a0cf29946fda84\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://8e25e4bdb7ae1f21d23bfee996e22736fc0ab44cfabedac82a757b1edc5623b9\",\"dweb:/ipfs/QmQdWQvB6JCP9ZMbzi8EvQ1PTETqkcTWrbcVurS7DKpa5n\"]},\"node_modules/@openzeppelin/contracts/utils/introspection/ERC165.sol\":{\"keccak256\":\"0x2d9dc2fe26180f74c11c13663647d38e259e45f95eb88f57b61d2160b0109d3e\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://81233d1f98060113d9922180bb0f14f8335856fe9f339134b09335e9f678c377\",\"dweb:/ipfs/QmWh6R35SarhAn4z2wH8SU456jJSYL2FgucfTFgbHJJN4E\"]},\"node_modules/@openzeppelin/contracts/utils/introspection/IERC165.sol\":{\"keccak256\":\"0x8891738ffe910f0cf2da09566928589bf5d63f4524dd734fd9cedbac3274dd5c\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://971f954442df5c2ef5b5ebf1eb245d7105d9fbacc7386ee5c796df1d45b21617\",\"dweb:/ipfs/QmadRjHbkicwqwwh61raUEapaVEtaLMcYbQZWs9gUkgj3u\"]}},\"version\":1}","metadata":{"compiler":{"version":"0.8.28+commit.7893614a"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"address","name":"ibcRouter","type":"address"},{"internalType":"uint64","name":"initialTrustedHeight","type":"uint64"},{"internalType":"uint64","name":"initialTrustedTimestamp","type":"uint64"},{"internalType":"bytes32","name":"initialTrustedStorageRoot","type":"bytes32"},{"internalType":"address[]","name":"initialTrustedValidators","type":"address[]"},{"internalType":"uint64","name":"trustingPeriod","type":"uint64"},{"internalType":"uint64","name":"maxClockDrift","type":"uint64"},{"internalType":"address","name":"roleManager","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"type":"error","name":"AccessControlBadConfirmation"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bytes32","name":"neededRole","type":"bytes32"}],"type":"error","name":"AccessControlUnauthorizedAccount"},{"inputs":[{"internalType":"uint64","name":"revisionHeight","type":"uint64"}],"type":"error","name":"ConflictingConsensusState"},{"inputs":[{"internalType":"uint64","name":"trustedTimestamp","type":"uint64"},{"internalType":"uint256","name":"currentTimestamp","type":"uint256"},{"internalType":"uint64","name":"trustingPeriod","type":"uint64"}],"type":"error","name":"ConsensusStateExpired"},{"inputs":[{"internalType":"uint64","name":"revisionHeight","type":"uint64"}],"type":"error","name":"ConsensusStateNotFound"},{"inputs":[{"internalType":"address","name":"signer","type":"address"}],"type":"error","name":"DuplicateCommitSealSigner"},{"inputs":[{"internalType":"address","name":"validator","type":"address"}],"type":"error","name":"DuplicateValidator"},{"inputs":[],"type":"error","name":"EmptyValidatorSet"},{"inputs":[{"internalType":"uint256","name":"currentTimestamp","type":"uint256"},{"internalType":"uint256","name":"headerTimestamp","type":"uint256"},{"internalType":"uint256","name":"maxClockDrift","type":"uint256"}],"type":"error","name":"HeaderFromFuture"},{"inputs":[{"internalType":"uint256","name":"actual","type":"uint256"},{"internalType":"uint256","name":"required","type":"uint256"}],"type":"error","name":"InsufficientTrustedValidatorOverlap"},{"inputs":[{"internalType":"uint256","name":"actual","type":"uint256"},{"internalType":"uint256","name":"required","type":"uint256"}],"type":"error","name":"InsufficientValidatorQuorum"},{"inputs":[],"type":"error","name":"InvalidCommitSeal"},{"inputs":[{"internalType":"bytes32","name":"expectedValue","type":"bytes32"},{"internalType":"bytes32","name":"actualValue","type":"bytes32"}],"type":"error","name":"InvalidCommitmentValue"},{"inputs":[{"internalType":"uint256","name":"actualDifficulty","type":"uint256"}],"type":"error","name":"InvalidDifficulty"},{"inputs":[{"internalType":"uint256","name":"length","type":"uint256"}],"type":"error","name":"InvalidECDSASignatureLength"},{"inputs":[{"internalType":"uint256","name":"itemsLength","type":"uint256"}],"type":"error","name":"InvalidExtraDataFormat"},{"inputs":[{"internalType":"uint256","name":"itemsLength","type":"uint256"}],"type":"error","name":"InvalidHeaderFormat"},{"inputs":[],"type":"error","name":"InvalidHeaderHeight"},{"inputs":[{"internalType":"bytes32","name":"actualMixHash","type":"bytes32"}],"type":"error","name":"InvalidMixHash"},{"inputs":[{"internalType":"bytes","name":"actualNonce","type":"bytes"}],"type":"error","name":"InvalidNonce"},{"inputs":[{"internalType":"bytes32","name":"actualOmmersHash","type":"bytes32"}],"type":"error","name":"InvalidOmmersHash"},{"inputs":[{"internalType":"uint256","name":"expectedLength","type":"uint256"},{"internalType":"uint256","name":"actualLength","type":"uint256"}],"type":"error","name":"InvalidPathLength"},{"inputs":[{"internalType":"uint64","name":"providedRevisionNumber","type":"uint64"}],"type":"error","name":"InvalidRevisionNumber"},{"inputs":[{"internalType":"address","name":"validator","type":"address"}],"type":"error","name":"InvalidValidatorAddress"},{"inputs":[{"internalType":"uint256","name":"length","type":"uint256"}],"type":"error","name":"InvalidValidatorAddressLength"},{"inputs":[{"internalType":"uint256","name":"expectedLength","type":"uint256"},{"internalType":"uint256","name":"actualLength","type":"uint256"}],"type":"error","name":"InvalidValueLength"},{"inputs":[],"type":"error","name":"UnsupportedMisbehaviour"},{"inputs":[{"internalType":"bytes32","name":"actualValue","type":"bytes32"}],"type":"error","name":"ValueExists"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32","indexed":true},{"internalType":"bytes32","name":"previousAdminRole","type":"bytes32","indexed":true},{"internalType":"bytes32","name":"newAdminRole","type":"bytes32","indexed":true}],"type":"event","name":"RoleAdminChanged","anonymous":false},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32","indexed":true},{"internalType":"address","name":"account","type":"address","indexed":true},{"internalType":"address","name":"sender","type":"address","indexed":true}],"type":"event","name":"RoleGranted","anonymous":false},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32","indexed":true},{"internalType":"address","name":"account","type":"address","indexed":true},{"internalType":"address","name":"sender","type":"address","indexed":true}],"type":"event","name":"RoleRevoked","anonymous":false},{"inputs":[],"stateMutability":"view","type":"function","name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"PROOF_SUBMITTER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"getClientState","outputs":[{"internalType":"bytes","name":"","type":"bytes"}]},{"inputs":[{"internalType":"uint64","name":"revisionHeight","type":"uint64"}],"stateMutability":"view","type":"function","name":"getConsensusState","outputs":[{"internalType":"bytes","name":"","type":"bytes"}]},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"stateMutability":"view","type":"function","name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}]},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"stateMutability":"nonpayable","type":"function","name":"grantRole"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"stateMutability":"view","type":"function","name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}]},{"inputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function","name":"misbehaviour"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"callerConfirmation","type":"address"}],"stateMutability":"nonpayable","type":"function","name":"renounceRole"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"stateMutability":"nonpayable","type":"function","name":"revokeRole"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"stateMutability":"view","type":"function","name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}]},{"inputs":[{"internalType":"bytes","name":"updateMsg","type":"bytes"}],"stateMutability":"nonpayable","type":"function","name":"updateClient","outputs":[{"internalType":"enum ILightClientMsgs.UpdateResult","name":"","type":"uint8"}]},{"inputs":[{"internalType":"struct ILightClientMsgs.MsgVerifyMembership","name":"msg_","type":"tuple","components":[{"internalType":"bytes","name":"proof","type":"bytes"},{"internalType":"struct IICS02ClientMsgs.Height","name":"proofHeight","type":"tuple","components":[{"internalType":"uint64","name":"revisionNumber","type":"uint64"},{"internalType":"uint64","name":"revisionHeight","type":"uint64"}]},{"internalType":"bytes[]","name":"path","type":"bytes[]"},{"internalType":"bytes","name":"value","type":"bytes"}]}],"stateMutability":"view","type":"function","name":"verifyMembership","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[{"internalType":"struct ILightClientMsgs.MsgVerifyNonMembership","name":"msg_","type":"tuple","components":[{"internalType":"bytes","name":"proof","type":"bytes"},{"internalType":"struct IICS02ClientMsgs.Height","name":"proofHeight","type":"tuple","components":[{"internalType":"uint64","name":"revisionNumber","type":"uint64"},{"internalType":"uint64","name":"revisionHeight","type":"uint64"}]},{"internalType":"bytes[]","name":"path","type":"bytes[]"}]}],"stateMutability":"view","type":"function","name":"verifyNonMembership","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]}],"devdoc":{"kind":"dev","methods":{"getClientState()":{"returns":{"_0":"The client state."}},"getRoleAdmin(bytes32)":{"details":"Returns the admin role that controls `role`. See {grantRole} and {revokeRole}. To change a role's admin, use {_setRoleAdmin}."},"grantRole(bytes32,address)":{"details":"Grants `role` to `account`. If `account` had not been already granted `role`, emits a {RoleGranted} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleGranted} event."},"hasRole(bytes32,address)":{"details":"Returns `true` if `account` has been granted `role`."},"renounceRole(bytes32,address)":{"details":"Revokes `role` from the calling account. Roles are often managed via {grantRole} and {revokeRole}: this function's purpose is to provide a mechanism for accounts to lose their privileges if they are compromised (such as when a trusted device is misplaced). If the calling account had been revoked `role`, emits a {RoleRevoked} event. Requirements: - the caller must be `callerConfirmation`. May emit a {RoleRevoked} event."},"revokeRole(bytes32,address)":{"details":"Revokes `role` from `account`. If `account` had been granted `role`, emits a {RoleRevoked} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleRevoked} event."},"supportsInterface(bytes4)":{"details":"Returns true if this contract implements the interface defined by `interfaceId`. See the corresponding https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[ERC section] to learn more about how these ids are created. This function call must use less than 30 000 gas."},"updateClient(bytes)":{"params":{"updateMsg":"The encoded update message e.g., an SP1 proof."},"returns":{"_0":"The result of the update operation"}},"verifyMembership((bytes,(uint64,uint64),bytes[],bytes))":{"details":"Notice that this message is not view, as it may update the client state for caching purposes.","params":{"msg_":"The membership message"},"returns":{"_0":"The unix timestamp of the verification height in the counterparty chain in seconds."}},"verifyNonMembership((bytes,(uint64,uint64),bytes[]))":{"details":"Notice that this message is not view, as it may update the client state for caching purposes.","params":{"msg_":"The membership message"},"returns":{"_0":"The unix timestamp of the verification height in the counterparty chain in seconds."}}},"version":1},"userdoc":{"kind":"user","methods":{"getClientState()":{"notice":"Returns the client state."},"updateClient(bytes)":{"notice":"Updating the client and consensus state"},"verifyMembership((bytes,(uint64,uint64),bytes[],bytes))":{"notice":"Querying the membership of a key-value pair"},"verifyNonMembership((bytes,(uint64,uint64),bytes[]))":{"notice":"Querying the non-membership of a key"}},"version":1}},"settings":{"remappings":["@openzeppelin-contracts/=node_modules/@openzeppelin/contracts/","@openzeppelin-upgradeable/=node_modules/@openzeppelin/contracts-upgradeable/","@openzeppelin/=node_modules/@openzeppelin/","@sp1-contracts/=node_modules/sp1-contracts/contracts/src/","@uniswap/permit2/=node_modules/@uniswap/permit2/","forge-std/=node_modules/forge-std/src/","sp1-contracts/=node_modules/sp1-contracts/"],"optimizer":{"enabled":true,"runs":10000},"metadata":{"bytecodeHash":"none"},"compilationTarget":{"contracts/light-clients/besu/BesuQBFTLightClient.sol":"BesuQBFTLightClient"},"evmVersion":"cancun","libraries":{},"viaIR":true},"sources":{"contracts/interfaces/ILightClient.sol":{"keccak256":"0x1caae9e4f741a86c0056d5f7713a35f3bd96db7a9fd52fc9f1cf79aad76a442f","urls":["bzz-raw://4a536db3b926560f69547c17e4f451a2631ddea0f42bd224c7fd8382d74429f6","dweb:/ipfs/QmcQ33kxcmmowXgMbQGTBgiKBjF7v8UiP4y73bB9hhDizC"],"license":"MIT"},"contracts/light-clients/besu/BesuLightClientBase.sol":{"keccak256":"0x44fd20d599cfed2298d6a26ec8584c5955b4c6b097d7b9f42d9ef7e462d7a4ad","urls":["bzz-raw://86ce26f4e3d6b4327680d93daf5b8a795fb5e76cf566bd9328988d4b5e170c7e","dweb:/ipfs/QmTkwvf1Xvasx3zpgcYVQa2VMEL1CXjrESwuV7vKNa3VhQ"],"license":"MIT"},"contracts/light-clients/besu/BesuQBFTLightClient.sol":{"keccak256":"0x77a13cd3904586c9d194f6161c1893f7eabd42e0b44a63d1f3c33fce78af4442","urls":["bzz-raw://3f1538090d25aa3e2b0ee9d333aab1afbd5caa10ec9df5fe7a41ecc4a14856d3","dweb:/ipfs/QmbPjkkXdjzKgj2JmzMbyWqfdywfQJVXgVgvJddW636XUb"],"license":"MIT"},"contracts/light-clients/besu/MPTProof.sol":{"keccak256":"0x232c01021016519bf2fdda5abfac7ab23f01e3c9f59c0233a5944d16a94b343a","urls":["bzz-raw://17387ba08707c70bc36df9a36a7f731d63db9f183b2675b7db35b9861c24c3b7","dweb:/ipfs/QmerMaj4tnVPwfdA69eVx9joJXQP72MR4KLudSpPf28NkZ"],"license":"Apache-2.0"},"contracts/light-clients/besu/RLPReader.sol":{"keccak256":"0xeb60cddae95fa2779d1e8f0d7a622737480ee67348ea0c6e65f13c93cfc9d5bb","urls":["bzz-raw://550fcc3d1527dd6a4f3621a72d7afc5c49dd5aa4b16992934a81c17dd0386a27","dweb:/ipfs/QmeF5UNemcyEeyU3y6Ru5bK4NG1v9xpWvp3J9WdXfsgkGa"],"license":"Apache-2.0"},"contracts/light-clients/besu/errors/IBesuLightClientErrors.sol":{"keccak256":"0x5b5fd8ec4ad07c713fb5337cfec9769e4d0fa30817bc237a98b2ce4cf155feac","urls":["bzz-raw://8fc013ed01d0e08590ee92f80f8089c18c334024d4d1a77a04ce3673b5d1e103","dweb:/ipfs/QmeWAn9JoVVsBin8JnvBLRP51QBCsM9m95bVrZoKFtkUfo"],"license":"MIT"},"contracts/light-clients/besu/msgs/IBesuLightClientMsgs.sol":{"keccak256":"0xbd6a5a6309d1076319f61820ae239848dcb4dca598240d5f9f927e02ed8b58c9","urls":["bzz-raw://ef5a28164d53832a52112a91747dbe84439a8003c489116425b7fd2d631425d9","dweb:/ipfs/QmbUqMt72DZFtfyupG9jQXEkQFGpVrUb4wQW3bNiUPV1AR"],"license":"MIT"},"contracts/msgs/IICS02ClientMsgs.sol":{"keccak256":"0xb5fdb25319d5c32b3f527982d45ec1e9bec5215515581aee034d853006ea01a0","urls":["bzz-raw://6b8939bf552c62c952a491008bcd9b59ab7dda20a9482bf93438e05793881542","dweb:/ipfs/QmfWmzNCp8bd4pP26Lfw5HHp4dSZnCDqZDjVN7SD8P7eDh"],"license":"MIT"},"contracts/msgs/ILightClientMsgs.sol":{"keccak256":"0xa0565e7748b8b3284d72e1aa6ef4cc8264fcaa5f4e0761d22d64686953db6378","urls":["bzz-raw://c4476010d7090bfaa74127526f2051c6bc82ff42a09b936e848880a1f15a6065","dweb:/ipfs/QmY87JgRsFQXSZdGXNjNHEJCkdTHzFXH4vZEJ3q7MnHuP8"],"license":"MIT"},"node_modules/@openzeppelin/contracts/access/AccessControl.sol":{"keccak256":"0x1a6b4f6b7798ab80929d491b89d5427a9b3338c0fd1acd0ba325f69c6f1646af","urls":["bzz-raw://7bb7f346c12a14dc622bc105ce3c47202fbc89f4b153a28a63bb68193297330c","dweb:/ipfs/QmagwF8P3bUBXwdo159ueEnY9dLSvEWwK24kk2op58egwG"],"license":"MIT"},"node_modules/@openzeppelin/contracts/access/IAccessControl.sol":{"keccak256":"0xbff9f59c84e5337689161ce7641c0ef8e872d6a7536fbc1f5133f128887aba3c","urls":["bzz-raw://b308f882e796f7b79c9502deacb0a62983035c6f6f4e962b319ba6a1f4a77d3d","dweb:/ipfs/QmaWCW7ahEQqFjwhSUhV7Ae7WhfNvzSpE7DQ58hvEooqPL"],"license":"MIT"},"node_modules/@openzeppelin/contracts/utils/Context.sol":{"keccak256":"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2","urls":["bzz-raw://6a708e8a5bdb1011c2c381c9a5cfd8a9a956d7d0a9dc1bd8bcdaf52f76ef2f12","dweb:/ipfs/Qmax9WHBnVsZP46ZxEMNRQpLQnrdE4dK8LehML1Py8FowF"],"license":"MIT"},"node_modules/@openzeppelin/contracts/utils/cryptography/ECDSA.sol":{"keccak256":"0x69f54c02b7d81d505910ec198c11ed4c6a728418a868b906b4a0cf29946fda84","urls":["bzz-raw://8e25e4bdb7ae1f21d23bfee996e22736fc0ab44cfabedac82a757b1edc5623b9","dweb:/ipfs/QmQdWQvB6JCP9ZMbzi8EvQ1PTETqkcTWrbcVurS7DKpa5n"],"license":"MIT"},"node_modules/@openzeppelin/contracts/utils/introspection/ERC165.sol":{"keccak256":"0x2d9dc2fe26180f74c11c13663647d38e259e45f95eb88f57b61d2160b0109d3e","urls":["bzz-raw://81233d1f98060113d9922180bb0f14f8335856fe9f339134b09335e9f678c377","dweb:/ipfs/QmWh6R35SarhAn4z2wH8SU456jJSYL2FgucfTFgbHJJN4E"],"license":"MIT"},"node_modules/@openzeppelin/contracts/utils/introspection/IERC165.sol":{"keccak256":"0x8891738ffe910f0cf2da09566928589bf5d63f4524dd734fd9cedbac3274dd5c","urls":["bzz-raw://971f954442df5c2ef5b5ebf1eb245d7105d9fbacc7386ee5c796df1d45b21617","dweb:/ipfs/QmadRjHbkicwqwwh61raUEapaVEtaLMcYbQZWs9gUkgj3u"],"license":"MIT"}},"version":1},"id":36} \ No newline at end of file +{"abi":[{"type":"constructor","inputs":[{"name":"ibcRouter","type":"address","internalType":"address"},{"name":"initialTrustedHeight","type":"uint64","internalType":"uint64"},{"name":"initialTrustedTimestamp","type":"uint64","internalType":"uint64"},{"name":"initialTrustedStorageRoot","type":"bytes32","internalType":"bytes32"},{"name":"initialTrustedValidators","type":"address[]","internalType":"address[]"},{"name":"trustingPeriod","type":"uint64","internalType":"uint64"},{"name":"maxClockDrift","type":"uint64","internalType":"uint64"},{"name":"roleManager","type":"address","internalType":"address"}],"stateMutability":"nonpayable"},{"type":"function","name":"DEFAULT_ADMIN_ROLE","inputs":[],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"type":"function","name":"PROOF_SUBMITTER_ROLE","inputs":[],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"type":"function","name":"getClientState","inputs":[],"outputs":[{"name":"","type":"bytes","internalType":"bytes"}],"stateMutability":"view"},{"type":"function","name":"getConsensusState","inputs":[{"name":"revisionHeight","type":"uint64","internalType":"uint64"}],"outputs":[{"name":"","type":"bytes","internalType":"bytes"}],"stateMutability":"view"},{"type":"function","name":"getRoleAdmin","inputs":[{"name":"role","type":"bytes32","internalType":"bytes32"}],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"type":"function","name":"grantRole","inputs":[{"name":"role","type":"bytes32","internalType":"bytes32"},{"name":"account","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"hasRole","inputs":[{"name":"role","type":"bytes32","internalType":"bytes32"},{"name":"account","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"misbehaviour","inputs":[{"name":"","type":"bytes","internalType":"bytes"}],"outputs":[],"stateMutability":"view"},{"type":"function","name":"renounceRole","inputs":[{"name":"role","type":"bytes32","internalType":"bytes32"},{"name":"callerConfirmation","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"revokeRole","inputs":[{"name":"role","type":"bytes32","internalType":"bytes32"},{"name":"account","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"supportsInterface","inputs":[{"name":"interfaceId","type":"bytes4","internalType":"bytes4"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"updateClient","inputs":[{"name":"updateMsg","type":"bytes","internalType":"bytes"}],"outputs":[{"name":"","type":"uint8","internalType":"enum ILightClientMsgs.UpdateResult"}],"stateMutability":"nonpayable"},{"type":"function","name":"verifyMembership","inputs":[{"name":"msg_","type":"tuple","internalType":"struct ILightClientMsgs.MsgVerifyMembership","components":[{"name":"proof","type":"bytes","internalType":"bytes"},{"name":"proofHeight","type":"tuple","internalType":"struct IICS02ClientMsgs.Height","components":[{"name":"revisionNumber","type":"uint64","internalType":"uint64"},{"name":"revisionHeight","type":"uint64","internalType":"uint64"}]},{"name":"path","type":"bytes[]","internalType":"bytes[]"},{"name":"value","type":"bytes","internalType":"bytes"}]}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"verifyNonMembership","inputs":[{"name":"msg_","type":"tuple","internalType":"struct ILightClientMsgs.MsgVerifyNonMembership","components":[{"name":"proof","type":"bytes","internalType":"bytes"},{"name":"proofHeight","type":"tuple","internalType":"struct IICS02ClientMsgs.Height","components":[{"name":"revisionNumber","type":"uint64","internalType":"uint64"},{"name":"revisionHeight","type":"uint64","internalType":"uint64"}]},{"name":"path","type":"bytes[]","internalType":"bytes[]"}]}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"event","name":"RoleAdminChanged","inputs":[{"name":"role","type":"bytes32","indexed":true,"internalType":"bytes32"},{"name":"previousAdminRole","type":"bytes32","indexed":true,"internalType":"bytes32"},{"name":"newAdminRole","type":"bytes32","indexed":true,"internalType":"bytes32"}],"anonymous":false},{"type":"event","name":"RoleGranted","inputs":[{"name":"role","type":"bytes32","indexed":true,"internalType":"bytes32"},{"name":"account","type":"address","indexed":true,"internalType":"address"},{"name":"sender","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"type":"event","name":"RoleRevoked","inputs":[{"name":"role","type":"bytes32","indexed":true,"internalType":"bytes32"},{"name":"account","type":"address","indexed":true,"internalType":"address"},{"name":"sender","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"type":"error","name":"AccessControlBadConfirmation","inputs":[]},{"type":"error","name":"AccessControlUnauthorizedAccount","inputs":[{"name":"account","type":"address","internalType":"address"},{"name":"neededRole","type":"bytes32","internalType":"bytes32"}]},{"type":"error","name":"ConflictingConsensusState","inputs":[{"name":"revisionHeight","type":"uint64","internalType":"uint64"}]},{"type":"error","name":"ConsensusStateExpired","inputs":[{"name":"trustedTimestamp","type":"uint64","internalType":"uint64"},{"name":"currentTimestamp","type":"uint256","internalType":"uint256"},{"name":"trustingPeriod","type":"uint64","internalType":"uint64"}]},{"type":"error","name":"ConsensusStateNotFound","inputs":[{"name":"revisionHeight","type":"uint64","internalType":"uint64"}]},{"type":"error","name":"DuplicateCommitSealSigner","inputs":[{"name":"signer","type":"address","internalType":"address"}]},{"type":"error","name":"DuplicateValidator","inputs":[{"name":"validator","type":"address","internalType":"address"}]},{"type":"error","name":"EmptyValidatorSet","inputs":[]},{"type":"error","name":"HeaderFromFuture","inputs":[{"name":"currentTimestamp","type":"uint256","internalType":"uint256"},{"name":"headerTimestamp","type":"uint256","internalType":"uint256"},{"name":"maxClockDrift","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"InsufficientTrustedValidatorOverlap","inputs":[{"name":"actual","type":"uint256","internalType":"uint256"},{"name":"required","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"InsufficientValidatorQuorum","inputs":[{"name":"actual","type":"uint256","internalType":"uint256"},{"name":"required","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"InvalidCommitSeal","inputs":[]},{"type":"error","name":"InvalidCommitmentValue","inputs":[{"name":"expectedValue","type":"bytes32","internalType":"bytes32"},{"name":"actualValue","type":"bytes32","internalType":"bytes32"}]},{"type":"error","name":"InvalidDifficulty","inputs":[{"name":"actualDifficulty","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"InvalidECDSASignatureLength","inputs":[{"name":"length","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"InvalidExtraDataFormat","inputs":[{"name":"itemsLength","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"InvalidHeaderFormat","inputs":[{"name":"itemsLength","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"InvalidHeaderHeight","inputs":[]},{"type":"error","name":"InvalidMixHash","inputs":[{"name":"actualMixHash","type":"bytes32","internalType":"bytes32"}]},{"type":"error","name":"InvalidNonce","inputs":[{"name":"actualNonce","type":"bytes","internalType":"bytes"}]},{"type":"error","name":"InvalidOmmersHash","inputs":[{"name":"actualOmmersHash","type":"bytes32","internalType":"bytes32"}]},{"type":"error","name":"InvalidPathLength","inputs":[{"name":"expectedLength","type":"uint256","internalType":"uint256"},{"name":"actualLength","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"InvalidRevisionNumber","inputs":[{"name":"providedRevisionNumber","type":"uint64","internalType":"uint64"}]},{"type":"error","name":"InvalidValidatorAddress","inputs":[{"name":"validator","type":"address","internalType":"address"}]},{"type":"error","name":"InvalidValidatorAddressLength","inputs":[{"name":"length","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"InvalidValueLength","inputs":[{"name":"expectedLength","type":"uint256","internalType":"uint256"},{"name":"actualLength","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"UnsupportedMisbehaviour","inputs":[]},{"type":"error","name":"ValueExists","inputs":[{"name":"actualValue","type":"bytes32","internalType":"bytes32"}]}],"bytecode":{"object":"0x6080604052346103c05761392c80380380610019816103c4565b928339810190610100818303126103c057610033816103e9565b61003f602083016103fd565b9061004c604084016103fd565b60608401516080850151909291906001600160401b0381116103c05785019286601f850112156103c0578351966001600160401b038811610376578760051b9460206100998188016103c4565b809a81520190602082978201019283116103c057602001905b8282106103a8575050506100c860a087016103fd565b956100e160e06100da60c084016103fd565b92016103e9565b956001600160401b03169081156103995788511561038a575f5b89518110156101b1576001600160a01b03610116828c610411565b51161561018a575f5b81811061012f57506001016100fb565b6001600160a01b03610141828d610411565b51166001600160a01b03610155848e610411565b5116146101645760010161011f565b6001600160a01b03610176838d610411565b511663107f863360e21b5f5260045260245ffd5b6001600160a01b039061019d908b610411565b51166359bff38760e01b5f5260045260245ffd5b5060408051979896978a979181016001600160401b03811182821017610376576040525f81526020810190848252604051926080840198848a1060018060401b038b1117610376576040998a526001600160a01b031680855260208086018490526001600160401b03928316868c01819052878416606090970196909652600180546001600160a01b031916909217825592516002805495516001600160801b031996871692851692909217918c1b6fffffffffffffffff000000000000000090811692909217815560038054909616909617968b1b16959095179092555f948552600490529590922080546001600160401b03191694861694909417845583019190915592519392019190831161037657680100000000000000008311610376578154838355808410610350575b50905f5260205f205f5b83811061033357846001600160a01b03811661031a575061030961052f565b505b6040516132da90816105b28239f35b8061032761032d92610439565b506104af565b5061030b565b82516001600160a01b0316818301556020909201916001016102ea565b825f528360205f2091820191015b81811061036b57506102e0565b5f815560010161035e565b634e487b7160e01b5f52604160045260245ffd5b63339e1ffb60e01b5f5260045ffd5b6359d119e360e01b5f5260045ffd5b602080916103b5846103e9565b8152019101906100b2565b5f80fd5b6040519190601f01601f191682016001600160401b0381118382101761037657604052565b51906001600160a01b03821682036103c057565b51906001600160401b03821682036103c057565b80518210156104255760209160051b010190565b634e487b7160e01b5f52603260045260245ffd5b6001600160a01b0381165f9081525f51602061390c5f395f51905f52602052604090205460ff166104aa576001600160a01b03165f8181525f51602061390c5f395f51905f5260205260408120805460ff191660011790553391905f51602061388c5f395f51905f528180a4600190565b505f90565b6001600160a01b0381165f9081525f5160206138ac5f395f51905f52602052604090205460ff166104aa576001600160a01b03165f8181525f5160206138ac5f395f51905f5260205260408120805460ff191660011790553391905f5160206138ec5f395f51905f52905f51602061388c5f395f51905f529080a4600190565b5f80525f5160206138ac5f395f51905f526020525f5160206138cc5f395f51905f525460ff166105ad575f8080525f5160206138ac5f395f51905f526020525f5160206138cc5f395f51905f52805460ff1916600117905533905f5160206138ec5f395f51905f525f51602061388c5f395f51905f528280a4600190565b5f9056fe60806040526004361015610011575f80fd5b5f3560e01c806301ffc9a7146100f45780630bece356146100ef578063248a9ca3146100ea5780632f2ff15d146100e557806336568abe146100e05780634d6d9ffb146100db5780635972185a146100d6578063682ed5f0146100d157806391d14854146100cc578063a217fddf146100c7578063d547741f146100c2578063ddba6537146100bd578063edce8bdc146100b85763ef913a4b146100b3575f80fd5b610a16565b61095e565b61088b565b61085c565b610842565b6107f4565b6105e6565b6105ac565b6103ac565b610350565b61031a565b6102b5565b610217565b34610195576020600319360112610195576004357fffffffff00000000000000000000000000000000000000000000000000000000811680910361019557807f7965db0b000000000000000000000000000000000000000000000000000000006020921490811561016b575b506040519015158152f35b7f01ffc9a7000000000000000000000000000000000000000000000000000000009150145f610160565b5f80fd5b9060206003198301126101955760043567ffffffffffffffff811161019557826023820112156101955780600401359267ffffffffffffffff84116101955760248483010111610195576024019190565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b346101955761028161022836610199565b5f80527f4c48d1d2b0f4f7485fc28e3db22341d96a20aa29e6efa8149da9751603abd4e06020527f6e0c24a6e293ff9b755263dbaa15ba3796b0b8d3fe17cfb4ddf8143b268eac475490919060ff161561029957610d9d565b6040516003821015610294576020918152f35b6101ea565b6102a1611287565b610d9d565b90816020910312610195573590565b346101955760206003193601126101955760206102df6004355f525f602052600160405f20015490565b604051908152f35b6003196040910112610195576004359060243573ffffffffffffffffffffffffffffffffffffffff811681036101955790565b346101955761034e61032b366102e7565b90610349610344825f525f602052600160405f20015490565b61130f565b61220a565b005b346101955761035e366102e7565b3373ffffffffffffffffffffffffffffffffffffffff8216036103845761034e916122e1565b7f6697b232000000000000000000000000000000000000000000000000000000005f5260045ffd5b346101955760206003193601126101955760043567ffffffffffffffff8111610195578060040160806003198336030112610195575f80527f4c48d1d2b0f4f7485fc28e3db22341d96a20aa29e6efa8149da9751603abd4e060205260ff7f6e0c24a6e293ff9b755263dbaa15ba3796b0b8d3fe17cfb4ddf8143b268eac4754161561059f575b61044761044260248401611192565b61137c565b60648201916001610458848461119c565b90500361056157906104a96104966104a261049d61049661049061048961048460446104e09a01611192565b611b30565b988761119c565b9061126e565b3691610b4d565b6123b6565b928061121d565b906001840154906040516104d7816104c960208201948560209181520190565b03601f198101835282610afd565b51902091612444565b805161051f5761051b61050b6104fe845467ffffffffffffffff1690565b67ffffffffffffffff1690565b6040519081529081906020820190565b0390f35b61053361052e61055e92612589565b6125b6565b7fd039601e000000000000000000000000000000000000000000000000000000005f52600452602490565b5ffd5b61055e61056e848461119c565b7f88b3170e000000000000000000000000000000000000000000000000000000005f52600160045260245250604490565b6105a7611287565b610433565b34610195575f6003193601126101955760206040517fbd893629a699470e4ec82a5715bb4981fdaacc5d0a728bf5f55b801d8f4ef10b8152f35b346101955760206003193601126101955760043567ffffffffffffffff8111610195578060040160a06003198336030112610195575f80527f4c48d1d2b0f4f7485fc28e3db22341d96a20aa29e6efa8149da9751603abd4e060205260ff7f6e0c24a6e293ff9b755263dbaa15ba3796b0b8d3fe17cfb4ddf8143b268eac475416156107e7575b61067c61044260248401611192565b6064820191600161068d848461119c565b90500361056157608481019060206106a5838561121d565b9050036107a957906106f46104966106ed6106e56106de61049d6104966104906106d761048460446107149c01611192565b9b8b61119c565b948761121d565b8101906102a6565b948061121d565b906001850154906040516104d7816104c960208201948560209181520190565b8051156107755761052e61072791612589565b908082036107475761051b61050b6104fe855467ffffffffffffffff1690565b7f56ed1b63000000000000000000000000000000000000000000000000000000005f5260045260245260445ffd5b61055e827f56ed1b63000000000000000000000000000000000000000000000000000000005f52906044916004525f602452565b61055e6107b6838561121d565b7f24fadac8000000000000000000000000000000000000000000000000000000005f52602060045260245250604490565b6107ef611287565b61066d565b3461019557602060ff610836610809366102e7565b905f525f845260405f209073ffffffffffffffffffffffffffffffffffffffff165f5260205260405f2090565b54166040519015158152f35b34610195575f6003193601126101955760206040515f8152f35b346101955761034e61086d366102e7565b90610886610344825f525f602052600160405f20015490565b6122e1565b346101955761089936610199565b50505f80527f4c48d1d2b0f4f7485fc28e3db22341d96a20aa29e6efa8149da9751603abd4e06020527f6e0c24a6e293ff9b755263dbaa15ba3796b0b8d3fe17cfb4ddf8143b268eac475460ff1615610915575b7f2c1ed462000000000000000000000000000000000000000000000000000000005f5260045ffd5b61091d611287565b6108ed565b67ffffffffffffffff81160361019557565b601f19601f602060409481855280519182918282880152018686015e5f8582860101520116010190565b346101955760206003193601126101955761097e60043561048481610922565b67ffffffffffffffff8154166002600183015492019060405192608084019160208501526040840152606080840152815480915260a08301915f5260205f20905f5b8181106109ea5761051b856109de818703601f198101835282610afd565b60405191829182610934565b825473ffffffffffffffffffffffffffffffffffffffff168452602090930192600192830192016109c0565b34610195575f6003193601126101955761051b60405173ffffffffffffffffffffffffffffffffffffffff60015416602082015267ffffffffffffffff600254818116604084015260401c16606082015267ffffffffffffffff600354818116608084015260401c1660a082015260a081526109de60c082610afd565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b6060810190811067ffffffffffffffff821117610adc57604052565b610a93565b6040810190811067ffffffffffffffff821117610adc57604052565b90601f601f19910116810190811067ffffffffffffffff821117610adc57604052565b60405190610b2f604083610afd565b565b67ffffffffffffffff8111610adc57601f01601f191660200190565b929192610b5982610b31565b91610b676040519384610afd565b829481845281830111610195578281602093845f960137010152565b9080601f8301121561019557816020610b9e93359101610b4d565b90565b6020818303126101955780359067ffffffffffffffff8211610195570180820391608083126101955760405192610bd784610ac0565b823567ffffffffffffffff811161019557604091610bfa84601f19938701610b83565b8652011261019557604051610c0e81610ae1565b6020830135610c1c81610922565b81526040830135610c2c81610922565b60208201526020840152606082013567ffffffffffffffff811161019557610c549201610b83565b604082015290565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b9060018201809211610c9757565b610c5c565b60c001908160c011610c9757565b60f701908160f711610c9757565b6080019081608011610c9757565b60b701908160b711610c9757565b91908201809211610c9757565b908160011b9180830460021490151715610c9757565b81519167ffffffffffffffff8311610adc57680100000000000000008311610adc578154838355808410610d77575b506020610d389101915f5260205f2090565b5f5b838110610d475750505050565b6001906020610d6a855173ffffffffffffffffffffffffffffffffffffffff1690565b9401938184015501610d3a565b825f528360205f2091820191015b818110610d925750610d26565b5f8155600101610d85565b610da991810190610ba1565b9060208201610dc461044282515167ffffffffffffffff1690565b610dce8351611614565b92606084019367ffffffffffffffff610def865167ffffffffffffffff1690565b161561116a5760035491604083901c67ffffffffffffffff1693610e1d67ffffffffffffffff861642610cd4565b9460a0840195610e35875167ffffffffffffffff1690565b9067ffffffffffffffff82161161112b5750505160200151610e7290610e649067ffffffffffffffff16611b30565b9367ffffffffffffffff1690565b67ffffffffffffffff81168015159081611102575b506110ad575090610ef591610eb66002610eae610ea385611bc2565b60e086015190611cf8565b950185611efe565b610ec660c0830194855190612023565b60406080610ee960015473ffffffffffffffffffffffffffffffffffffffff1690565b930151910151916120c6565b610f22610f0a865167ffffffffffffffff1690565b67ffffffffffffffff165f52600460205260405f2090565b610f376104fe825467ffffffffffffffff1690565b61103b5750916002610fb5928694610fa8610f73610f64610f0a610fc39a9b5167ffffffffffffffff1690565b955167ffffffffffffffff1690565b859067ffffffffffffffff167fffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000825416179055565b6001840155519101610cf7565b5167ffffffffffffffff1690565b600254610fdc9060401c67ffffffffffffffff166104fe565b67ffffffffffffffff821611610ff157505f90565b611037907fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff6fffffffffffffffff00000000000000006002549260401b16911617600255565b5f90565b91611051611059945167ffffffffffffffff1690565b90519261213c565b6110a75761055e611072835167ffffffffffffffff1690565b7fc1aea5f7000000000000000000000000000000000000000000000000000000005f5267ffffffffffffffff16600452602490565b60029150565b61055e906110c3855467ffffffffffffffff1690565b7feae35725000000000000000000000000000000000000000000000000000000005f5267ffffffffffffffff9081166004524260245216604452606490565b9050611123429161111e6104fe885467ffffffffffffffff1690565b610cd4565b11155f610e87565b7f9b772277000000000000000000000000000000000000000000000000000000005f524260045267ffffffffffffffff9081166024521660445260645ffd5b7f59d119e3000000000000000000000000000000000000000000000000000000005f5260045ffd5b35610b9e81610922565b9035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe181360301821215610195570180359067ffffffffffffffff821161019557602001918160051b3603831361019557565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b9035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe181360301821215610195570180359067ffffffffffffffff82116101955760200191813603831361019557565b9015611282578061127e9161121d565b9091565b6111f0565b335f9081527f4c48d1d2b0f4f7485fc28e3db22341d96a20aa29e6efa8149da9751603abd4e0602052604090205460ff16156112bf57565b7fe2517d3f000000000000000000000000000000000000000000000000000000005f52336004527fbd893629a699470e4ec82a5715bb4981fdaacc5d0a728bf5f55b801d8f4ef10b60245260445ffd5b805f525f60205260ff6113433360405f209073ffffffffffffffffffffffffffffffffffffffff165f5260205260405f2090565b54161561134d5750565b7fe2517d3f000000000000000000000000000000000000000000000000000000005f523360045260245260445ffd5b67ffffffffffffffff168061138e5750565b7f3ce598a9000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b60405190610100820182811067ffffffffffffffff821117610adc57604052606060e0838281528260208201528260408201525f838201525f60808201525f60a08201528260c08201520152565b8051600110156112825760400190565b805160071015611282576101000190565b8051600d1015611282576101c00190565b8051600e1015611282576101e00190565b805160081015611282576101200190565b8051600310156112825760800190565b8051600b1015611282576101800190565b8051600c1015611282576101a00190565b8051600410156112825760a00190565b8051156112825760200190565b8051600210156112825760600190565b805160101015611282576102200190565b80518210156112825760209160051b010190565b67ffffffffffffffff8111610adc5760051b60200190565b90611501826114df565b61150e6040519182610afd565b828152601f1961151e82946114df565b0190602036910137565b90602082519201517fffffffffffffffffffffffffffffffffffffffff00000000000000000000000081169260148110611560575050565b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000929350829060140360031b1b161690565b60405160c091906115a38382610afd565b6005815291601f1901825f5b8281106115bb57505050565b8060606020809385010152016115af565b906115d6826114df565b6115e36040519182610afd565b828152601f196115f382946114df565b01905f5b82811061160357505050565b8060606020809385010152016115f7565b61163061162b6116226113b9565b92808452612589565b6125f8565b602082019080825251600f8110611b0557507f1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d493476116766116708351611407565b516126c3565b03611aca57600161169061168a8351611417565b516125b6565b03611a8f577f63746963616c2062797a616e74696e65206661756c7420746f6c6572616e63656116c36116708351611428565b03611a54576116db6116d58251611439565b516126df565b80516008811490811591611a24575b506119ea575061162b61175d6116d5836117216117106104fe61168a611762985161144a565b67ffffffffffffffff166060880152565b61172e611670825161145b565b60808701526117576117466104fe61168a845161146b565b67ffffffffffffffff1660a0880152565b5161147c565b612589565b90604081019180835251600581036119bf57506117886117828351611407565b516125f8565b908151156119975761179a82516114f7565b9360c082019485525f5b8351811015611933576117ba6116d582866114cb565b80516014810361190857506117d16117d791611528565b60601c90565b73ffffffffffffffffffffffffffffffffffffffff811680156118c6575f5b8381106118325750509061182c600192611811838a516114cb565b9073ffffffffffffffffffffffffffffffffffffffff169052565b016117a4565b8161187761185e611844848d516114cb565b5173ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff1690565b14611884576001016117f6565b7f41fe18cc000000000000000000000000000000000000000000000000000000005f5273ffffffffffffffffffffffffffffffffffffffff831660045260245ffd5b7f59bff387000000000000000000000000000000000000000000000000000000005f5273ffffffffffffffffffffffffffffffffffffffff821660045260245ffd5b7f83e46ad2000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b509261178291945061194692505161148d565b61195081516115cc565b9260e081019384525f5b8251811015611991578061198a816119776116d5600195886114cb565b88519061198483836114cb565b526114cb565b500161195a565b50925050565b7f339e1ffb000000000000000000000000000000000000000000000000000000005f5260045ffd5b7f30c6792a000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b611a20906040519182917fd5edd2a500000000000000000000000000000000000000000000000000000000835260048301610934565b0390fd5b7f011b4d03dd8c01f1049143cf9c4c817e4b167f1d1b83e5c6f0f10d89ba1e7bce9150602083012014155f6116ea565b611a6461167061055e9251611428565b7fa19e609c000000000000000000000000000000000000000000000000000000005f52600452602490565b611a9f61168a61055e9251611417565b7ff71b722f000000000000000000000000000000000000000000000000000000005f52600452602490565b611ada61167061055e9251611407565b7fb8120dca000000000000000000000000000000000000000000000000000000005f52600452602490565b7fbc277732000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b67ffffffffffffffff1690815f52600460205260405f209167ffffffffffffffff83541615611b5c5750565b7ff761631b000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b60405190611b96604083610afd565b600182527fc0000000000000000000000000000000000000000000000000000000000000006020830152565b6020611c7d611bcf611592565b611c48611be660408601611bec611be6825161149d565b51612fdf565b611bf58561149d565b52611bff8461149d565b50611c0d611be68251611407565b611c1685611407565b52611c2084611407565b50611c2e611be682516114aa565b611c37856114aa565b52611c41846114aa565b505161145b565b611c518261145b565b52611c5b8161145b565b50611c64611b87565b611c6d8261148d565b52611c778161148d565b506127b5565b910190611c8b8251516115cc565b905f5b83518051821015611ce1579080600192600c82145f14611ccf575050611cb383612866565b611cbd82866114cb565b52611cc881856114cb565b5001611c8e565b611cdc91611be6916114cb565b611cb3565b505050611cee91506127b5565b6020815191012090565b919091611d0583516114f7565b925f5b8151811015611eeb57611d1b81836114cb565b51805160418103611ec0575080601b60ff611d6a611d64611d3e611d7796612845565b517fff000000000000000000000000000000000000000000000000000000000000001690565b60f81c90565b1610611e6d575b8461308d565b50611d81816128e0565b15801590611e4f575b611e275773ffffffffffffffffffffffffffffffffffffffff81165f5b838110611dc757505090611dc160019261181183896114cb565b01611d08565b81611dd861185e611844848c6114cb565b14611de557600101611da7565b7f33af0d5f000000000000000000000000000000000000000000000000000000005f5273ffffffffffffffffffffffffffffffffffffffff831660045260245ffd5b7f09cb44e6000000000000000000000000000000000000000000000000000000005f5260045ffd5b5073ffffffffffffffffffffffffffffffffffffffff811615611d8a565b611eaf611e87611e82611d64611d3e85612845565b6128ce565b60f81b7fff000000000000000000000000000000000000000000000000000000000000001690565b5f1a611eba82612845565b53611d71565b7ff2db9ce1000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b505050565b5f198114610c975760010190565b905f915f5b8151811015611f5757611f3673ffffffffffffffffffffffffffffffffffffffff611f2e83856114cb565b5116846128ea565b611f43575b600101611f03565b92611f4f600191611ef0565b939050611f3b565b50506003611f66915404610c89565b90818110611f72575050565b7fe2dcb1b9000000000000000000000000000000000000000000000000000000005f5260045260245260445ffd5b905f198201918211610c9757565b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff408201918211610c9757565b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff808201918211610c9757565b6020039060208211610c9757565b91908203918211610c9757565b905f915f5b815181101561207c5761205b73ffffffffffffffffffffffffffffffffffffffff61205383856114cb565b511684612941565b612068575b600101612028565b92612074600191611ef0565b939050612060565b50505190600382048203918211610c9757818110612098575050565b7f7818f4e4000000000000000000000000000000000000000000000000000000005f5260045260245260445ffd5b6121109261162b9261175d926040517fffffffffffffffffffffffffffffffffffffffff000000000000000000000000602082019260601b168252601481526104d7603482610afd565b805160021015611282576060610b9e9101516126c3565b8054821015611282575f5260205f2001905f90565b919067ffffffffffffffff8061215a855467ffffffffffffffff1690565b9216911614908115916121fb575b506121f5576002019081548151036121f5575f5b81518110156121ed576121b26121928285612127565b905473ffffffffffffffffffffffffffffffffffffffff9160031b1c1690565b73ffffffffffffffffffffffffffffffffffffffff6121d761185e61184485876114cb565b9116036121e65760010161217c565b5050505f90565b505050600190565b50505f90565b9050600182015414155f612168565b805f525f60205260ff61223e8360405f209073ffffffffffffffffffffffffffffffffffffffff165f5260205260405f2090565b54166121f557805f525f6020526122768260405f209073ffffffffffffffffffffffffffffffffffffffff165f5260205260405f2090565b60017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0082541617905573ffffffffffffffffffffffffffffffffffffffff339216907f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d5f80a4600190565b805f525f60205260ff6123158360405f209073ffffffffffffffffffffffffffffffffffffffff165f5260205260405f2090565b5416156121f557805f525f60205261234e8260405f209073ffffffffffffffffffffffffffffffffffffffff165f5260205260405f2090565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00815416905573ffffffffffffffffffffffffffffffffffffffff339216907ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b5f80a4600190565b60208151910120604051602081019182527f1260944489272988d9df285149b5aa1b0f48f2136d6f416159f840a3e07476006040820152604081526123fc606082610afd565b51902090565b60405190612411602083610afd565b5f808352366020840137565b9061242782610b31565b6124346040519182610afd565b828152601f1961151e8294610b31565b61162b612486919493946124586020610b31565b956124666040519788610afd565b602087526124746020610b31565b601f1960208901910136823752612589565b906124918451610ce1565b918451151580612569575b6124a5906125af565b6124b76124b25f85612016565b61241d565b925f19015f5b8181106124d1575050610b9e939450612ab5565b80612553600f61251661254d611d64611d3e8d6124f060029960011c90565b908d6125478a61253f8a61251661250d611d64611d3e8a8a612855565b60041c600f1690565b1660f81b7fff000000000000000000000000000000000000000000000000000000000000001690565b5f1a92612855565b53612855565b60ff1690565b5f1a6125626001830188612855565b53016124bd565b50600161249c565b6040519061257e82610ae1565b5f6020838281520152565b612591612571565b506020815191604051926125a484610ae1565b835201602082015290565b1561019557565b805180151590816125ec575b5015610195576125d190612d8b565b905190602081106125e0575090565b6020036101000a900490565b6021915011155f6125c2565b61260181612db7565b156101955761260f81612dd7565b612618816114df565b916126266040519384610afd565b818352601f19612635836114df565b015f5b8181106126ac575050602061265891015161265281612e38565b90610cd4565b5f905b8282106126685750505090565b6126a481612677600193612ea3565b90612680610b20565b82815281602082015261269386896114cb565b5261269e85886114cb565b50610cd4565b91019061265b565b6020906126b7612571565b82828801015201612638565b6021815103610195576020015160018101809111610c97575190565b805115610195576126f2610b9e91612d8b565b6126fe8193929361241d565b928360200190612f6c565b805191908290602001825e015f815290565b610b2f9061273d61273794936040519586936020850190612709565b90612709565b03601f198101845283610afd565b6001907fff00000000000000000000000000000000000000000000000000000000000000610b9e94931681520190612709565b916001610b9e94937fff00000000000000000000000000000000000000000000000000000000000000612737941681520190612709565b5f9060605b81518310156127e2576127da6001916127d385856114cb565b519061271b565b9201916127ba565b9150508051603881106128215750610b9e6127fd825161300b565b916104c9612811611e8761254d8651610caa565b916040519485936020850161277e565b612833611e8761254d610b9e93610c9c565b6104c96040519384926020840161274b565b8051604010156112825760600190565b908151811015611282570160200190565b6001815114806128b3575b610b9e578051603881106128a15750610b9e61288d825161300b565b916104c9612811611e8761254d8651610cc6565b612833611e8761254d610b9e93610cb8565b50608060ff6128c7611d64611d3e8561149d565b1610612871565b60ff601b9116019060ff8211610c9757565b6004111561029457565b905f5b82548110156121e65773ffffffffffffffffffffffffffffffffffffffff6129158285612127565b90549060031b1c1673ffffffffffffffffffffffffffffffffffffffff8316146121ed576001016128ed565b905f5b82518110156121e65773ffffffffffffffffffffffffffffffffffffffff61296c82856114cb565b511673ffffffffffffffffffffffffffffffffffffffff8316146121ed57600101612944565b919061299e8351610ce1565b908351151580612aab575b6129b2906125af565b6129bf6124b28284612016565b938192600180841614612a49575b5f19869101935b8481106129e2575050505050565b83612a406001612a36600f61251661254d611d64611d3e8b60029b612a2f612a22886125168f611d64611d3e612a1b61250d9360011c90565b8099612855565b9b8d03809c5f1a92612855565b538c612855565b5f1a920189612855565b530185906129d4565b92507f0f00000000000000000000000000000000000000000000000000000000000000612a8861254d611d64611d3e612a828760011c90565b86612855565b60f81b165f1a612a978661149d565b535f19612aa383611ef0565b9390506129cd565b50818111156129a9565b915f915f612ac1612571565b50845115612d525790935f915b81518310156101955782158080612d3c575b61019557159081612d1f575b5061019557612afe61178283836114cb565b948551600281145f14612bfb5750612b20612b1b6116d58861149d565b613122565b95612b36612b2f88888461318f565b8092610cd4565b965111612bdd5715612b6d5750612b4d9051611fa0565b11610195575111612b64576116d5610b9e91611407565b50610b9e612402565b919094612b7a8651611fa0565b82146101955780612b9c612b98612b92600194611407565b51612db7565b1590565b15612bbe57612bad612bb391611407565b51613114565b915b01919490612ace565b612bca612bd791611407565b5160208101519051902090565b91612bb5565b505091509250612bee915051611fa0565b1161019557610b9e612402565b929491939192601103612cc05781518314612ca257612c2c612c2661254d611d64611d3e8787612855565b93610c89565b92601081101561019557612c49612c4382896114cb565b516130fe565b15612c6b5750505050612c5e91925051611fa0565b0361019557610b9e612402565b86612c83612b98612b9284600196989a97999b6114cb565b15612c9557612bd791612bad916114cb565b612bd791612bca916114cb565b505050612caf9051611fa0565b03610195576116d5610b9e916114ba565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f696e76616c6964206e6f6465206c656e677468000000000000000000000000006044820152606490fd5b9050612d34612d2e84846114cb565b516130c7565b14155f612aec565b50612d4a612bca85856114cb565b871415612ae0565b509050612d8392507f56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b4219150146125af565b610b9e612402565b906020820191612d9b8351612e38565b925190838201809211610c975751928303928311610c97579190565b805115612dd257602060c0910151515f1a1061103757600190565b505f90565b805115612dd2575f9060208101908151612df081612e38565b8101809111610c9757915190518101809111610c975791905b828110612e165750905090565b612e1f81612ea3565b8101809111610c9757612e329091611ef0565b90612e09565b515f1a6080811015612e4957505f90565b60b881108015612e8d575b15612e5f5750600190565b60c0811015612e7e57610b9e90612e799060b75b90612016565b610c89565b610b9e90612e799060f7612e73565b5060c08110158015612e54575060f88110612e54565b80515f1a906080821015612eb8575050600190565b60b8821015612ece5750612e79610b9e91611fdb565b60c0821015612f0f5760010151602082900360b7016101000a9004017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff4a0190565b60f8821015612f255750612e79610b9e91611fae565b60010151602082900360f7016101000a9004017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0a0190565b601f8111610c97576101000a90565b90918015611eeb575b6020811015612faf5780612f8857505050565b612f9c612f97612fa192612008565b612f5d565b611fa0565b905182518216911916179052565b91908051825260208101809111610c97579060208101809111610c975791601f19810190811115612f7557610c5c565b612fe9815161241d565b9081511561300757806020610b9e9201519051908360200190612f6c565b5090565b5f81805b613079575061301d8161241d565b91815b61302957505090565b61303282611fa0565b6130647fff000000000000000000000000000000000000000000000000000000000000008360f81b165f1a9185612855565b5360081c908015610c97575f19019081613020565b9061308390611ef0565b9060081c8061300f565b81519190604183036130bd576130b69250602082015190606060408401519301515f1a90613233565b9192909190565b50505f9160029190565b805160208110156130df575060208101519051902090565b90602001512060405160208101918252602081526123fc604082610afd565b6001815103612dd25760200151515f1a60801490565b61311d90612d8b565b902090565b9081511561019557600f61313e61250d611d64611d3e8661149d565b16806131515750610b9e60025f93612992565b600181036131665750610b9e60015f93612992565b6002810361317c5750610b9e6002600193612992565b60030361019557610b9e60018093612992565b91905f5b838101808211610c97578251811080613229575b15613221576131d77fff000000000000000000000000000000000000000000000000000000000000009184612855565b51167fff000000000000000000000000000000000000000000000000000000000000006132048386612855565b5116900361321a5761321590611ef0565b613193565b9250505090565b509250505090565b50835182106131a7565b91907f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a084116132c2579160209360809260ff5f9560405194855216868401526040830152606082015282805260015afa156132b7575f5173ffffffffffffffffffffffffffffffffffffffff8116156132ad57905f905f90565b505f906001905f90565b6040513d5f823e3d90fd5b5050505f916003919056fea164736f6c634300081c000a2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d4c48d1d2b0f4f7485fc28e3db22341d96a20aa29e6efa8149da9751603abd4e06e0c24a6e293ff9b755263dbaa15ba3796b0b8d3fe17cfb4ddf8143b268eac47bd893629a699470e4ec82a5715bb4981fdaacc5d0a728bf5f55b801d8f4ef10bad3228b676f7d3cd4284a5443f17f1962b36e491b30a40b2405849e597ba5fb5","sourceMap":"230:2306:36:-:0;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;230:2306:36;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;230:2306:36;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;:::i;:::-;;-1:-1:-1;;;;;230:2306:36;;3945:25:35;;3941:84;;230:2306:36;;17599:22:35;17595:79;;-1:-1:-1;17726:3:35;230:2306:36;;17703:21:35;;;;;-1:-1:-1;;;;;17749:13:35;;;;:::i;:::-;230:2306:36;;17749:27:35;17745:111;;-1:-1:-1;17889:5:35;;;;;;17726:3;230:2306:36;;17688:13:35;;17896:3;-1:-1:-1;;;;;17923:13:35;;;;:::i;:::-;230:2306:36;;-1:-1:-1;;;;;17940:13:35;230:2306:36;;17940:13:35;:::i;:::-;230:2306:36;;17923:30:35;17919:117;;230:2306:36;;17874:13:35;;17919:117;-1:-1:-1;;;;;18003:13:35;230:2306:36;;18003:13:35;:::i;:::-;230:2306:36;;17984:33:35;;;-1:-1:-1;17984:33:35;;230:2306:36;;-1:-1:-1;17984:33:35;17745:111;-1:-1:-1;;;;;230:2306:36;17827:13:35;;230:2306:36;17827:13:35;:::i;:::-;230:2306:36;;17803:38:35;;;-1:-1:-1;17803:38:35;;230:2306:36;;-1:-1:-1;17803:38:35;17703:21;-1:-1:-1;230:2306:36;;;17703:21:35;;;;;;;230:2306:36;;-1:-1:-1;;;;;230:2306:36;;;;;;;;;;-1:-1:-1;230:2306:36;;;4179:84:35;;230:2306:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;230:2306:36;;;;;4105:255:35;;;230:2306:36;;;-1:-1:-1;;;;;230:2306:36;;;4105:255:35;;;230:2306:36;;;;;;;4105:255:35;;;230:2306:36;;;;;;;-1:-1:-1;;;;;;230:2306:36;;;;;;;;;;;;;-1:-1:-1;;;;;;230:2306:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;230:2306:36;;;4411:15:35;230:2306:36;;;;;;;;-1:-1:-1;;;;;;230:2306:36;;;;;;;;;;4518:26:35;;230:2306:36;;;;;;;4582:25:35;;;230:2306:36;;;;;;;;;;;;;;;;;;;;17683:377:35;230:2306:36;;-1:-1:-1;230:2306:36;;-1:-1:-1;230:2306:36;-1:-1:-1;230:2306:36;;;;;;;-1:-1:-1;;;;;230:2306:36;;;;4690:44:35;;;:::i;:::-;;4645:233;230:2306:36;;;;;;;;;4645:233:35;4765:43;;4822:45;4765:43;;:::i;:::-;;4822:45;:::i;:::-;;4645:233;;230:2306:36;;;-1:-1:-1;;;;;230:2306:36;;;;;;;;;;;;;;;;-1:-1:-1;230:2306:36;;;-1:-1:-1;230:2306:36;;;;;;;;;;;;;;;;-1:-1:-1;230:2306:36;;;;;;;;;;-1:-1:-1;230:2306:36;;4411:15:35;230:2306:36;;-1:-1:-1;230:2306:36;17595:79:35;17644:19;;;-1:-1:-1;17644:19:35;;-1:-1:-1;17644:19:35;3941:84;3993:21;;;-1:-1:-1;3993:21:35;;-1:-1:-1;3993:21:35;230:2306:36;;;;;;;:::i;:::-;;;;;;;;;;-1:-1:-1;230:2306:36;;;;;;;;;-1:-1:-1;;230:2306:36;;;-1:-1:-1;;;;;230:2306:36;;;;;;;;;;:::o;:::-;;;-1:-1:-1;;;;;230:2306:36;;;;;;:::o;:::-;;;-1:-1:-1;;;;;230:2306:36;;;;;;:::o;:::-;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;6145:316:93;-1:-1:-1;;;;;230:2306:36;;3969:1:35;230:2306:36;;;-1:-1:-1;;;;;;;;;;;230:2306:36;;;;;;;;;;-1:-1:-1;;;;;230:2306:36;3969:1:35;230:2306:36;;;-1:-1:-1;;;;;;;;;;;230:2306:36;;;;;;;-1:-1:-1;;230:2306:36;;;;;735:10:121;;230:2306:36;-1:-1:-1;;;;;;;;;;;3969:1:35;;6336:40:93;6313:4;6390:11;:::o;6238:217::-;6432:12;3969:1:35;6432:12:93;:::o;6145:316::-;-1:-1:-1;;;;;230:2306:36;;;;;;-1:-1:-1;;;;;;;;;;;230:2306:36;;;;;;;;;;-1:-1:-1;;;;;230:2306:36;;;;;-1:-1:-1;;;;;;;;;;;230:2306:36;;;;;;;-1:-1:-1;;230:2306:36;;;;;735:10:121;;230:2306:36;-1:-1:-1;;;;;;;;;;;2082:33:35;-1:-1:-1;;;;;;;;;;;6336:40:93;230:2306:36;6336:40:93;6313:4;6390:11;:::o;6145:316::-;230:2306:36;;;-1:-1:-1;;;;;;;;;;;230:2306:36;;-1:-1:-1;;;;;;;;;;;230:2306:36;;;;;;;;;-1:-1:-1;;;;;;;;;;;230:2306:36;;-1:-1:-1;;;;;;;;;;;230:2306:36;;-1:-1:-1;;230:2306:36;6313:4:93;230:2306:36;;;735:10:121;;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;230:2306:36;;6336:40:93;6313:4;6390:11;:::o;6238:217::-;230:2306:36;6432:12:93;:::o","linkReferences":{}},"deployedBytecode":{"object":"0x60806040526004361015610011575f80fd5b5f3560e01c806301ffc9a7146100f45780630bece356146100ef578063248a9ca3146100ea5780632f2ff15d146100e557806336568abe146100e05780634d6d9ffb146100db5780635972185a146100d6578063682ed5f0146100d157806391d14854146100cc578063a217fddf146100c7578063d547741f146100c2578063ddba6537146100bd578063edce8bdc146100b85763ef913a4b146100b3575f80fd5b610a16565b61095e565b61088b565b61085c565b610842565b6107f4565b6105e6565b6105ac565b6103ac565b610350565b61031a565b6102b5565b610217565b34610195576020600319360112610195576004357fffffffff00000000000000000000000000000000000000000000000000000000811680910361019557807f7965db0b000000000000000000000000000000000000000000000000000000006020921490811561016b575b506040519015158152f35b7f01ffc9a7000000000000000000000000000000000000000000000000000000009150145f610160565b5f80fd5b9060206003198301126101955760043567ffffffffffffffff811161019557826023820112156101955780600401359267ffffffffffffffff84116101955760248483010111610195576024019190565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b346101955761028161022836610199565b5f80527f4c48d1d2b0f4f7485fc28e3db22341d96a20aa29e6efa8149da9751603abd4e06020527f6e0c24a6e293ff9b755263dbaa15ba3796b0b8d3fe17cfb4ddf8143b268eac475490919060ff161561029957610d9d565b6040516003821015610294576020918152f35b6101ea565b6102a1611287565b610d9d565b90816020910312610195573590565b346101955760206003193601126101955760206102df6004355f525f602052600160405f20015490565b604051908152f35b6003196040910112610195576004359060243573ffffffffffffffffffffffffffffffffffffffff811681036101955790565b346101955761034e61032b366102e7565b90610349610344825f525f602052600160405f20015490565b61130f565b61220a565b005b346101955761035e366102e7565b3373ffffffffffffffffffffffffffffffffffffffff8216036103845761034e916122e1565b7f6697b232000000000000000000000000000000000000000000000000000000005f5260045ffd5b346101955760206003193601126101955760043567ffffffffffffffff8111610195578060040160806003198336030112610195575f80527f4c48d1d2b0f4f7485fc28e3db22341d96a20aa29e6efa8149da9751603abd4e060205260ff7f6e0c24a6e293ff9b755263dbaa15ba3796b0b8d3fe17cfb4ddf8143b268eac4754161561059f575b61044761044260248401611192565b61137c565b60648201916001610458848461119c565b90500361056157906104a96104966104a261049d61049661049061048961048460446104e09a01611192565b611b30565b988761119c565b9061126e565b3691610b4d565b6123b6565b928061121d565b906001840154906040516104d7816104c960208201948560209181520190565b03601f198101835282610afd565b51902091612444565b805161051f5761051b61050b6104fe845467ffffffffffffffff1690565b67ffffffffffffffff1690565b6040519081529081906020820190565b0390f35b61053361052e61055e92612589565b6125b6565b7fd039601e000000000000000000000000000000000000000000000000000000005f52600452602490565b5ffd5b61055e61056e848461119c565b7f88b3170e000000000000000000000000000000000000000000000000000000005f52600160045260245250604490565b6105a7611287565b610433565b34610195575f6003193601126101955760206040517fbd893629a699470e4ec82a5715bb4981fdaacc5d0a728bf5f55b801d8f4ef10b8152f35b346101955760206003193601126101955760043567ffffffffffffffff8111610195578060040160a06003198336030112610195575f80527f4c48d1d2b0f4f7485fc28e3db22341d96a20aa29e6efa8149da9751603abd4e060205260ff7f6e0c24a6e293ff9b755263dbaa15ba3796b0b8d3fe17cfb4ddf8143b268eac475416156107e7575b61067c61044260248401611192565b6064820191600161068d848461119c565b90500361056157608481019060206106a5838561121d565b9050036107a957906106f46104966106ed6106e56106de61049d6104966104906106d761048460446107149c01611192565b9b8b61119c565b948761121d565b8101906102a6565b948061121d565b906001850154906040516104d7816104c960208201948560209181520190565b8051156107755761052e61072791612589565b908082036107475761051b61050b6104fe855467ffffffffffffffff1690565b7f56ed1b63000000000000000000000000000000000000000000000000000000005f5260045260245260445ffd5b61055e827f56ed1b63000000000000000000000000000000000000000000000000000000005f52906044916004525f602452565b61055e6107b6838561121d565b7f24fadac8000000000000000000000000000000000000000000000000000000005f52602060045260245250604490565b6107ef611287565b61066d565b3461019557602060ff610836610809366102e7565b905f525f845260405f209073ffffffffffffffffffffffffffffffffffffffff165f5260205260405f2090565b54166040519015158152f35b34610195575f6003193601126101955760206040515f8152f35b346101955761034e61086d366102e7565b90610886610344825f525f602052600160405f20015490565b6122e1565b346101955761089936610199565b50505f80527f4c48d1d2b0f4f7485fc28e3db22341d96a20aa29e6efa8149da9751603abd4e06020527f6e0c24a6e293ff9b755263dbaa15ba3796b0b8d3fe17cfb4ddf8143b268eac475460ff1615610915575b7f2c1ed462000000000000000000000000000000000000000000000000000000005f5260045ffd5b61091d611287565b6108ed565b67ffffffffffffffff81160361019557565b601f19601f602060409481855280519182918282880152018686015e5f8582860101520116010190565b346101955760206003193601126101955761097e60043561048481610922565b67ffffffffffffffff8154166002600183015492019060405192608084019160208501526040840152606080840152815480915260a08301915f5260205f20905f5b8181106109ea5761051b856109de818703601f198101835282610afd565b60405191829182610934565b825473ffffffffffffffffffffffffffffffffffffffff168452602090930192600192830192016109c0565b34610195575f6003193601126101955761051b60405173ffffffffffffffffffffffffffffffffffffffff60015416602082015267ffffffffffffffff600254818116604084015260401c16606082015267ffffffffffffffff600354818116608084015260401c1660a082015260a081526109de60c082610afd565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b6060810190811067ffffffffffffffff821117610adc57604052565b610a93565b6040810190811067ffffffffffffffff821117610adc57604052565b90601f601f19910116810190811067ffffffffffffffff821117610adc57604052565b60405190610b2f604083610afd565b565b67ffffffffffffffff8111610adc57601f01601f191660200190565b929192610b5982610b31565b91610b676040519384610afd565b829481845281830111610195578281602093845f960137010152565b9080601f8301121561019557816020610b9e93359101610b4d565b90565b6020818303126101955780359067ffffffffffffffff8211610195570180820391608083126101955760405192610bd784610ac0565b823567ffffffffffffffff811161019557604091610bfa84601f19938701610b83565b8652011261019557604051610c0e81610ae1565b6020830135610c1c81610922565b81526040830135610c2c81610922565b60208201526020840152606082013567ffffffffffffffff811161019557610c549201610b83565b604082015290565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b9060018201809211610c9757565b610c5c565b60c001908160c011610c9757565b60f701908160f711610c9757565b6080019081608011610c9757565b60b701908160b711610c9757565b91908201809211610c9757565b908160011b9180830460021490151715610c9757565b81519167ffffffffffffffff8311610adc57680100000000000000008311610adc578154838355808410610d77575b506020610d389101915f5260205f2090565b5f5b838110610d475750505050565b6001906020610d6a855173ffffffffffffffffffffffffffffffffffffffff1690565b9401938184015501610d3a565b825f528360205f2091820191015b818110610d925750610d26565b5f8155600101610d85565b610da991810190610ba1565b9060208201610dc461044282515167ffffffffffffffff1690565b610dce8351611614565b92606084019367ffffffffffffffff610def865167ffffffffffffffff1690565b161561116a5760035491604083901c67ffffffffffffffff1693610e1d67ffffffffffffffff861642610cd4565b9460a0840195610e35875167ffffffffffffffff1690565b9067ffffffffffffffff82161161112b5750505160200151610e7290610e649067ffffffffffffffff16611b30565b9367ffffffffffffffff1690565b67ffffffffffffffff81168015159081611102575b506110ad575090610ef591610eb66002610eae610ea385611bc2565b60e086015190611cf8565b950185611efe565b610ec660c0830194855190612023565b60406080610ee960015473ffffffffffffffffffffffffffffffffffffffff1690565b930151910151916120c6565b610f22610f0a865167ffffffffffffffff1690565b67ffffffffffffffff165f52600460205260405f2090565b610f376104fe825467ffffffffffffffff1690565b61103b5750916002610fb5928694610fa8610f73610f64610f0a610fc39a9b5167ffffffffffffffff1690565b955167ffffffffffffffff1690565b859067ffffffffffffffff167fffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000825416179055565b6001840155519101610cf7565b5167ffffffffffffffff1690565b600254610fdc9060401c67ffffffffffffffff166104fe565b67ffffffffffffffff821611610ff157505f90565b611037907fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff6fffffffffffffffff00000000000000006002549260401b16911617600255565b5f90565b91611051611059945167ffffffffffffffff1690565b90519261213c565b6110a75761055e611072835167ffffffffffffffff1690565b7fc1aea5f7000000000000000000000000000000000000000000000000000000005f5267ffffffffffffffff16600452602490565b60029150565b61055e906110c3855467ffffffffffffffff1690565b7feae35725000000000000000000000000000000000000000000000000000000005f5267ffffffffffffffff9081166004524260245216604452606490565b9050611123429161111e6104fe885467ffffffffffffffff1690565b610cd4565b11155f610e87565b7f9b772277000000000000000000000000000000000000000000000000000000005f524260045267ffffffffffffffff9081166024521660445260645ffd5b7f59d119e3000000000000000000000000000000000000000000000000000000005f5260045ffd5b35610b9e81610922565b9035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe181360301821215610195570180359067ffffffffffffffff821161019557602001918160051b3603831361019557565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b9035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe181360301821215610195570180359067ffffffffffffffff82116101955760200191813603831361019557565b9015611282578061127e9161121d565b9091565b6111f0565b335f9081527f4c48d1d2b0f4f7485fc28e3db22341d96a20aa29e6efa8149da9751603abd4e0602052604090205460ff16156112bf57565b7fe2517d3f000000000000000000000000000000000000000000000000000000005f52336004527fbd893629a699470e4ec82a5715bb4981fdaacc5d0a728bf5f55b801d8f4ef10b60245260445ffd5b805f525f60205260ff6113433360405f209073ffffffffffffffffffffffffffffffffffffffff165f5260205260405f2090565b54161561134d5750565b7fe2517d3f000000000000000000000000000000000000000000000000000000005f523360045260245260445ffd5b67ffffffffffffffff168061138e5750565b7f3ce598a9000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b60405190610100820182811067ffffffffffffffff821117610adc57604052606060e0838281528260208201528260408201525f838201525f60808201525f60a08201528260c08201520152565b8051600110156112825760400190565b805160071015611282576101000190565b8051600d1015611282576101c00190565b8051600e1015611282576101e00190565b805160081015611282576101200190565b8051600310156112825760800190565b8051600b1015611282576101800190565b8051600c1015611282576101a00190565b8051600410156112825760a00190565b8051156112825760200190565b8051600210156112825760600190565b805160101015611282576102200190565b80518210156112825760209160051b010190565b67ffffffffffffffff8111610adc5760051b60200190565b90611501826114df565b61150e6040519182610afd565b828152601f1961151e82946114df565b0190602036910137565b90602082519201517fffffffffffffffffffffffffffffffffffffffff00000000000000000000000081169260148110611560575050565b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000929350829060140360031b1b161690565b60405160c091906115a38382610afd565b6005815291601f1901825f5b8281106115bb57505050565b8060606020809385010152016115af565b906115d6826114df565b6115e36040519182610afd565b828152601f196115f382946114df565b01905f5b82811061160357505050565b8060606020809385010152016115f7565b61163061162b6116226113b9565b92808452612589565b6125f8565b602082019080825251600f8110611b0557507f1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d493476116766116708351611407565b516126c3565b03611aca57600161169061168a8351611417565b516125b6565b03611a8f577f63746963616c2062797a616e74696e65206661756c7420746f6c6572616e63656116c36116708351611428565b03611a54576116db6116d58251611439565b516126df565b80516008811490811591611a24575b506119ea575061162b61175d6116d5836117216117106104fe61168a611762985161144a565b67ffffffffffffffff166060880152565b61172e611670825161145b565b60808701526117576117466104fe61168a845161146b565b67ffffffffffffffff1660a0880152565b5161147c565b612589565b90604081019180835251600581036119bf57506117886117828351611407565b516125f8565b908151156119975761179a82516114f7565b9360c082019485525f5b8351811015611933576117ba6116d582866114cb565b80516014810361190857506117d16117d791611528565b60601c90565b73ffffffffffffffffffffffffffffffffffffffff811680156118c6575f5b8381106118325750509061182c600192611811838a516114cb565b9073ffffffffffffffffffffffffffffffffffffffff169052565b016117a4565b8161187761185e611844848d516114cb565b5173ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff1690565b14611884576001016117f6565b7f41fe18cc000000000000000000000000000000000000000000000000000000005f5273ffffffffffffffffffffffffffffffffffffffff831660045260245ffd5b7f59bff387000000000000000000000000000000000000000000000000000000005f5273ffffffffffffffffffffffffffffffffffffffff821660045260245ffd5b7f83e46ad2000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b509261178291945061194692505161148d565b61195081516115cc565b9260e081019384525f5b8251811015611991578061198a816119776116d5600195886114cb565b88519061198483836114cb565b526114cb565b500161195a565b50925050565b7f339e1ffb000000000000000000000000000000000000000000000000000000005f5260045ffd5b7f30c6792a000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b611a20906040519182917fd5edd2a500000000000000000000000000000000000000000000000000000000835260048301610934565b0390fd5b7f011b4d03dd8c01f1049143cf9c4c817e4b167f1d1b83e5c6f0f10d89ba1e7bce9150602083012014155f6116ea565b611a6461167061055e9251611428565b7fa19e609c000000000000000000000000000000000000000000000000000000005f52600452602490565b611a9f61168a61055e9251611417565b7ff71b722f000000000000000000000000000000000000000000000000000000005f52600452602490565b611ada61167061055e9251611407565b7fb8120dca000000000000000000000000000000000000000000000000000000005f52600452602490565b7fbc277732000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b67ffffffffffffffff1690815f52600460205260405f209167ffffffffffffffff83541615611b5c5750565b7ff761631b000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b60405190611b96604083610afd565b600182527fc0000000000000000000000000000000000000000000000000000000000000006020830152565b6020611c7d611bcf611592565b611c48611be660408601611bec611be6825161149d565b51612fdf565b611bf58561149d565b52611bff8461149d565b50611c0d611be68251611407565b611c1685611407565b52611c2084611407565b50611c2e611be682516114aa565b611c37856114aa565b52611c41846114aa565b505161145b565b611c518261145b565b52611c5b8161145b565b50611c64611b87565b611c6d8261148d565b52611c778161148d565b506127b5565b910190611c8b8251516115cc565b905f5b83518051821015611ce1579080600192600c82145f14611ccf575050611cb383612866565b611cbd82866114cb565b52611cc881856114cb565b5001611c8e565b611cdc91611be6916114cb565b611cb3565b505050611cee91506127b5565b6020815191012090565b919091611d0583516114f7565b925f5b8151811015611eeb57611d1b81836114cb565b51805160418103611ec0575080601b60ff611d6a611d64611d3e611d7796612845565b517fff000000000000000000000000000000000000000000000000000000000000001690565b60f81c90565b1610611e6d575b8461308d565b50611d81816128e0565b15801590611e4f575b611e275773ffffffffffffffffffffffffffffffffffffffff81165f5b838110611dc757505090611dc160019261181183896114cb565b01611d08565b81611dd861185e611844848c6114cb565b14611de557600101611da7565b7f33af0d5f000000000000000000000000000000000000000000000000000000005f5273ffffffffffffffffffffffffffffffffffffffff831660045260245ffd5b7f09cb44e6000000000000000000000000000000000000000000000000000000005f5260045ffd5b5073ffffffffffffffffffffffffffffffffffffffff811615611d8a565b611eaf611e87611e82611d64611d3e85612845565b6128ce565b60f81b7fff000000000000000000000000000000000000000000000000000000000000001690565b5f1a611eba82612845565b53611d71565b7ff2db9ce1000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b505050565b5f198114610c975760010190565b905f915f5b8151811015611f5757611f3673ffffffffffffffffffffffffffffffffffffffff611f2e83856114cb565b5116846128ea565b611f43575b600101611f03565b92611f4f600191611ef0565b939050611f3b565b50506003611f66915404610c89565b90818110611f72575050565b7fe2dcb1b9000000000000000000000000000000000000000000000000000000005f5260045260245260445ffd5b905f198201918211610c9757565b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff408201918211610c9757565b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff808201918211610c9757565b6020039060208211610c9757565b91908203918211610c9757565b905f915f5b815181101561207c5761205b73ffffffffffffffffffffffffffffffffffffffff61205383856114cb565b511684612941565b612068575b600101612028565b92612074600191611ef0565b939050612060565b50505190600382048203918211610c9757818110612098575050565b7f7818f4e4000000000000000000000000000000000000000000000000000000005f5260045260245260445ffd5b6121109261162b9261175d926040517fffffffffffffffffffffffffffffffffffffffff000000000000000000000000602082019260601b168252601481526104d7603482610afd565b805160021015611282576060610b9e9101516126c3565b8054821015611282575f5260205f2001905f90565b919067ffffffffffffffff8061215a855467ffffffffffffffff1690565b9216911614908115916121fb575b506121f5576002019081548151036121f5575f5b81518110156121ed576121b26121928285612127565b905473ffffffffffffffffffffffffffffffffffffffff9160031b1c1690565b73ffffffffffffffffffffffffffffffffffffffff6121d761185e61184485876114cb565b9116036121e65760010161217c565b5050505f90565b505050600190565b50505f90565b9050600182015414155f612168565b805f525f60205260ff61223e8360405f209073ffffffffffffffffffffffffffffffffffffffff165f5260205260405f2090565b54166121f557805f525f6020526122768260405f209073ffffffffffffffffffffffffffffffffffffffff165f5260205260405f2090565b60017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0082541617905573ffffffffffffffffffffffffffffffffffffffff339216907f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d5f80a4600190565b805f525f60205260ff6123158360405f209073ffffffffffffffffffffffffffffffffffffffff165f5260205260405f2090565b5416156121f557805f525f60205261234e8260405f209073ffffffffffffffffffffffffffffffffffffffff165f5260205260405f2090565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00815416905573ffffffffffffffffffffffffffffffffffffffff339216907ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b5f80a4600190565b60208151910120604051602081019182527f1260944489272988d9df285149b5aa1b0f48f2136d6f416159f840a3e07476006040820152604081526123fc606082610afd565b51902090565b60405190612411602083610afd565b5f808352366020840137565b9061242782610b31565b6124346040519182610afd565b828152601f1961151e8294610b31565b61162b612486919493946124586020610b31565b956124666040519788610afd565b602087526124746020610b31565b601f1960208901910136823752612589565b906124918451610ce1565b918451151580612569575b6124a5906125af565b6124b76124b25f85612016565b61241d565b925f19015f5b8181106124d1575050610b9e939450612ab5565b80612553600f61251661254d611d64611d3e8d6124f060029960011c90565b908d6125478a61253f8a61251661250d611d64611d3e8a8a612855565b60041c600f1690565b1660f81b7fff000000000000000000000000000000000000000000000000000000000000001690565b5f1a92612855565b53612855565b60ff1690565b5f1a6125626001830188612855565b53016124bd565b50600161249c565b6040519061257e82610ae1565b5f6020838281520152565b612591612571565b506020815191604051926125a484610ae1565b835201602082015290565b1561019557565b805180151590816125ec575b5015610195576125d190612d8b565b905190602081106125e0575090565b6020036101000a900490565b6021915011155f6125c2565b61260181612db7565b156101955761260f81612dd7565b612618816114df565b916126266040519384610afd565b818352601f19612635836114df565b015f5b8181106126ac575050602061265891015161265281612e38565b90610cd4565b5f905b8282106126685750505090565b6126a481612677600193612ea3565b90612680610b20565b82815281602082015261269386896114cb565b5261269e85886114cb565b50610cd4565b91019061265b565b6020906126b7612571565b82828801015201612638565b6021815103610195576020015160018101809111610c97575190565b805115610195576126f2610b9e91612d8b565b6126fe8193929361241d565b928360200190612f6c565b805191908290602001825e015f815290565b610b2f9061273d61273794936040519586936020850190612709565b90612709565b03601f198101845283610afd565b6001907fff00000000000000000000000000000000000000000000000000000000000000610b9e94931681520190612709565b916001610b9e94937fff00000000000000000000000000000000000000000000000000000000000000612737941681520190612709565b5f9060605b81518310156127e2576127da6001916127d385856114cb565b519061271b565b9201916127ba565b9150508051603881106128215750610b9e6127fd825161300b565b916104c9612811611e8761254d8651610caa565b916040519485936020850161277e565b612833611e8761254d610b9e93610c9c565b6104c96040519384926020840161274b565b8051604010156112825760600190565b908151811015611282570160200190565b6001815114806128b3575b610b9e578051603881106128a15750610b9e61288d825161300b565b916104c9612811611e8761254d8651610cc6565b612833611e8761254d610b9e93610cb8565b50608060ff6128c7611d64611d3e8561149d565b1610612871565b60ff601b9116019060ff8211610c9757565b6004111561029457565b905f5b82548110156121e65773ffffffffffffffffffffffffffffffffffffffff6129158285612127565b90549060031b1c1673ffffffffffffffffffffffffffffffffffffffff8316146121ed576001016128ed565b905f5b82518110156121e65773ffffffffffffffffffffffffffffffffffffffff61296c82856114cb565b511673ffffffffffffffffffffffffffffffffffffffff8316146121ed57600101612944565b919061299e8351610ce1565b908351151580612aab575b6129b2906125af565b6129bf6124b28284612016565b938192600180841614612a49575b5f19869101935b8481106129e2575050505050565b83612a406001612a36600f61251661254d611d64611d3e8b60029b612a2f612a22886125168f611d64611d3e612a1b61250d9360011c90565b8099612855565b9b8d03809c5f1a92612855565b538c612855565b5f1a920189612855565b530185906129d4565b92507f0f00000000000000000000000000000000000000000000000000000000000000612a8861254d611d64611d3e612a828760011c90565b86612855565b60f81b165f1a612a978661149d565b535f19612aa383611ef0565b9390506129cd565b50818111156129a9565b915f915f612ac1612571565b50845115612d525790935f915b81518310156101955782158080612d3c575b61019557159081612d1f575b5061019557612afe61178283836114cb565b948551600281145f14612bfb5750612b20612b1b6116d58861149d565b613122565b95612b36612b2f88888461318f565b8092610cd4565b965111612bdd5715612b6d5750612b4d9051611fa0565b11610195575111612b64576116d5610b9e91611407565b50610b9e612402565b919094612b7a8651611fa0565b82146101955780612b9c612b98612b92600194611407565b51612db7565b1590565b15612bbe57612bad612bb391611407565b51613114565b915b01919490612ace565b612bca612bd791611407565b5160208101519051902090565b91612bb5565b505091509250612bee915051611fa0565b1161019557610b9e612402565b929491939192601103612cc05781518314612ca257612c2c612c2661254d611d64611d3e8787612855565b93610c89565b92601081101561019557612c49612c4382896114cb565b516130fe565b15612c6b5750505050612c5e91925051611fa0565b0361019557610b9e612402565b86612c83612b98612b9284600196989a97999b6114cb565b15612c9557612bd791612bad916114cb565b612bd791612bca916114cb565b505050612caf9051611fa0565b03610195576116d5610b9e916114ba565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f696e76616c6964206e6f6465206c656e677468000000000000000000000000006044820152606490fd5b9050612d34612d2e84846114cb565b516130c7565b14155f612aec565b50612d4a612bca85856114cb565b871415612ae0565b509050612d8392507f56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b4219150146125af565b610b9e612402565b906020820191612d9b8351612e38565b925190838201809211610c975751928303928311610c97579190565b805115612dd257602060c0910151515f1a1061103757600190565b505f90565b805115612dd2575f9060208101908151612df081612e38565b8101809111610c9757915190518101809111610c975791905b828110612e165750905090565b612e1f81612ea3565b8101809111610c9757612e329091611ef0565b90612e09565b515f1a6080811015612e4957505f90565b60b881108015612e8d575b15612e5f5750600190565b60c0811015612e7e57610b9e90612e799060b75b90612016565b610c89565b610b9e90612e799060f7612e73565b5060c08110158015612e54575060f88110612e54565b80515f1a906080821015612eb8575050600190565b60b8821015612ece5750612e79610b9e91611fdb565b60c0821015612f0f5760010151602082900360b7016101000a9004017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff4a0190565b60f8821015612f255750612e79610b9e91611fae565b60010151602082900360f7016101000a9004017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0a0190565b601f8111610c97576101000a90565b90918015611eeb575b6020811015612faf5780612f8857505050565b612f9c612f97612fa192612008565b612f5d565b611fa0565b905182518216911916179052565b91908051825260208101809111610c97579060208101809111610c975791601f19810190811115612f7557610c5c565b612fe9815161241d565b9081511561300757806020610b9e9201519051908360200190612f6c565b5090565b5f81805b613079575061301d8161241d565b91815b61302957505090565b61303282611fa0565b6130647fff000000000000000000000000000000000000000000000000000000000000008360f81b165f1a9185612855565b5360081c908015610c97575f19019081613020565b9061308390611ef0565b9060081c8061300f565b81519190604183036130bd576130b69250602082015190606060408401519301515f1a90613233565b9192909190565b50505f9160029190565b805160208110156130df575060208101519051902090565b90602001512060405160208101918252602081526123fc604082610afd565b6001815103612dd25760200151515f1a60801490565b61311d90612d8b565b902090565b9081511561019557600f61313e61250d611d64611d3e8661149d565b16806131515750610b9e60025f93612992565b600181036131665750610b9e60015f93612992565b6002810361317c5750610b9e6002600193612992565b60030361019557610b9e60018093612992565b91905f5b838101808211610c97578251811080613229575b15613221576131d77fff000000000000000000000000000000000000000000000000000000000000009184612855565b51167fff000000000000000000000000000000000000000000000000000000000000006132048386612855565b5116900361321a5761321590611ef0565b613193565b9250505090565b509250505090565b50835182106131a7565b91907f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a084116132c2579160209360809260ff5f9560405194855216868401526040830152606082015282805260015afa156132b7575f5173ffffffffffffffffffffffffffffffffffffffff8116156132ad57905f905f90565b505f906001905f90565b6040513d5f823e3d90fd5b5050505f916003919056fea164736f6c634300081c000a","sourceMap":"230:2306:36:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;;;;-1:-1:-1;;230:2306:36;;;;;;;;;;;;;;;2639:47:93;2654:32;230:2306:36;2639:47:93;;:87;;;;;230:2306:36;;;;;;;;;;2639:87:93;844:25:133;829:40;;;2639:87:93;;;230:2306:36;-1:-1:-1;230:2306:36;;;;;-1:-1:-1;;230:2306:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;5599:2265:35;230:2306:36;;;:::i;:::-;-1:-1:-1;230:2306:36;;;;;;;;;;;;23142:42:35;23138:105;;5599:2265;:::i;:::-;230:2306:36;;;;;;;;;;;;;;;:::i;23138:105:35:-;23211:20;;:::i;:::-;5599:2265;:::i;230:2306:36:-;;;;;;;;;;;:::o;:::-;;;;;-1:-1:-1;;230:2306:36;;;;;;;;;3867:6:93;230:2306:36;3867:6:93;230:2306:36;;3867:22:93;230:2306:36;3867:6:93;230:2306:36;3867:22:93;230:2306:36;3776:120:93;;230:2306:36;;;;;;;;-1:-1:-1;;230:2306:36;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;4296:25:93;230:2306:36;;;:::i;:::-;4266:18:93;2475:4;4266:18;;3867:6;230:2306:36;3867:6:93;230:2306:36;;3867:22:93;230:2306:36;3867:6:93;230:2306:36;3867:22:93;230:2306:36;3776:120:93;;4266:18;2475:4;:::i;:::-;4296:25;:::i;:::-;230:2306:36;;;;;;;;:::i;:::-;735:10:121;230:2306:36;;;5387:34:93;5383:102;;5495:37;;;:::i;5383:102::-;5444:30;;;230:2306:36;5444:30:93;;230:2306:36;;;;;-1:-1:-1;;230:2306:36;;;;;;;;;;;;;;;;-1:-1:-1;;230:2306:36;;;;;;;-1:-1:-1;230:2306:36;;;;;;;;;23142:42:35;23138:105;;230:2306:36;9327:31:35;;:16;;;:31;:::i;:::-;;:::i;:::-;9373:9;;;;9393:1;9373:9;;;;:::i;:::-;:21;;;9369:97;;9535:31;230:2306:36;9681:10:35;9599:36;230:2306:36;9622:12:35;:9;9516:51;9535:31;;9681:95;9535:31;;;:::i;:::-;9516:51;:::i;:::-;9622:9;;;:::i;:::-;:12;;:::i;:::-;230:2306:36;;;:::i;:::-;9599:36:35;:::i;:::-;9681:10;;;:::i;230:2306:36:-;9707:26:35;9393:1;9707:26;;230:2306:36;;;;9745:29:35;;;230:2306:36;9745:29:35;;;;230:2306:36;;;;;;;9745:29:35;;-1:-1:-1;;9745:29:35;;;;;;:::i;:::-;230:2306:36;9735:40:35;;9681:95;;:::i;:::-;230:2306:36;;9786:109:35;;230:2306:36;9904:31:35;230:2306:36;;;;;;;;;;;;9904:31:35;230:2306:36;;;;;;;;;;;;;;;;;9786:109:35;9853:29;:20;9833:51;9853:20;;:::i;:::-;:29;:::i;:::-;9833:51;-1:-1:-1;9833:51:35;230:2306:36;;;;;9833:51:35;-1:-1:-1;9833:51:35;9369:97;9417:38;9438:9;;;;:::i;:::-;9417:38;-1:-1:-1;9417:38:35;9393:1;230:2306:36;;;;-1:-1:-1;230:2306:36;;;23138:105:35;23211:20;;:::i;:::-;23138:105;;230:2306:36;;;;;-1:-1:-1;;230:2306:36;;;;;;;;2082:33:35;230:2306:36;;;;;;;;-1:-1:-1;;230:2306:36;;;;;;;;;;;;;;;;-1:-1:-1;;230:2306:36;;;;;;;-1:-1:-1;230:2306:36;;;;;;;;;23142:42:35;23138:105;;230:2306:36;8099:31:35;;:16;;;:31;:::i;:::-;8145:9;;;;8165:1;8145:9;;;;:::i;:::-;:21;;;8141:97;;8251:10;;;;230:2306:36;8251:10:35;;;;:::i;:::-;:23;;;8247:102;;8418:31;230:2306:36;8631:10:35;8552:33;8563:10;8482:36;230:2306:36;8505:12:35;:9;8399:51;8418:31;;8631:95;8418:31;;;:::i;8399:51::-;8505:9;;;:::i;8482:36::-;8563:10;;;:::i;:::-;8552:33;;;;:::i;:::-;8631:10;;;:::i;230:2306:36:-;8657:26:35;8165:1;8657:26;;230:2306:36;;;;8695:29:35;;;230:2306:36;8695:29:35;;;;230:2306:36;;;;;;;8631:95:35;230:2306:36;;8740:20:35;8736:107;;8883:20;:29;:20;;:::i;:29::-;8927:28;;;;8923:116;;230:2306:36;9048:31:35;230:2306:36;;;;;;;8923:116:35;8978:50;-1:-1:-1;8978:50:35;230:2306:36;;;;;-1:-1:-1;9833:51:35;8736:107;8783:49;;;-1:-1:-1;8783:49:35;230:2306:36;;;;;-1:-1:-1;230:2306:36;;;8247:102:35;8297:41;8320:10;;;;:::i;:::-;8297:41;-1:-1:-1;8297:41:35;230:2306:36;;;;;-1:-1:-1;230:2306:36;;;23138:105:35;23211:20;;:::i;:::-;23138:105;;230:2306:36;;;;;;2920:29:93;230:2306:36;;;:::i;:::-;;2920:6:93;230:2306:36;2920:6:93;230:2306:36;;;2920:6:93;230:2306:36;;;;;;;;;;;;;2920:29:93;230:2306:36;;;;;;;;;;;;;;;-1:-1:-1;;230:2306:36;;;;;;;;;;;;;;;;4713:26:93;230:2306:36;;;:::i;:::-;4683:18:93;2475:4;4683:18;;3867:6;230:2306:36;3867:6:93;230:2306:36;;3867:22:93;230:2306:36;3867:6:93;230:2306:36;3867:22:93;230:2306:36;3776:120:93;;2475:4;4713:26;:::i;230:2306:36:-;;;;;;;:::i;:::-;-1:-1:-1;;23181:1:35;230:2306:36;;;;;;;;;23142:42:35;23138:105;;230:2306:36;10069:25:35;23181:1;10069:25;230:2306:36;23181:1:35;10069:25;23138:105;23211:20;;:::i;:::-;23138:105;;230:2306:36;;;;;;;:::o;:::-;-1:-1:-1;;230:2306:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;-1:-1:-1;;230:2306:36;;;;;5411:34:35;230:2306:36;;;;;:::i;5411:34:35:-;230:2306:36;;;;5527:25:35;5499:26;;;230:2306:36;5527:25:35;;230:2306:36;;;;;;;5462:91:35;230:2306:36;5462:91:35;;230:2306:36;;;;;;;;;;;;;;;;;;;-1:-1:-1;230:2306:36;;-1:-1:-1;230:2306:36;;-1:-1:-1;230:2306:36;;;;;;;5462:91:35;;;;;-1:-1:-1;;5462:91:35;;;;;;:::i;:::-;230:2306:36;;;;;;;:::i;:::-;;;;;;;;;;;;5499:26:35;230:2306:36;;;;;;;;;;;;-1:-1:-1;;230:2306:36;;;;;;;;;5014:11:35;230:2306:36;;5003:23:35;;;230:2306:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5003:23:35;;;;;;:::i;230:2306:36:-;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;:::i;:::-;;;;;;;;;;;;;;;:::o;:::-;;;-1:-1:-1;;230:2306:36;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;:::i;:::-;:::o;:::-;;;;;;;;-1:-1:-1;;230:2306:36;;;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;-1:-1:-1;230:2306:36;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;:::i;:::-;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;-1:-1:-1;;230:2306:36;;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;:::o;:::-;;;;;;;;;;;;2212:66:35;230:2306:36;;;;;;;:::o;:::-;;:::i;:::-;22204:4:35;230:2306:36;;;22204:4:35;230:2306:36;;;:::o;:::-;22358:4:35;230:2306:36;;;22358:4:35;230:2306:36;;;:::o;:::-;21546:4:35;230:2306:36;;;21546:4:35;230:2306:36;;;:::o;:::-;21688:4:35;230:2306:36;;;21688:4:35;230:2306:36;;;:::o;:::-;;;;;;;;;;:::o;:::-;;;;;;;;;8592:1:37;230:2306:36;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;230:2306:36;;;-1:-1:-1;230:2306:36;;;;;;;;;;;;;;;;-1:-1:-1;230:2306:36;;;;;;5599:2265:35;5783:40;5599:2265;5783:40;;;;:::i;:::-;5854:18;;;;:33;230:2306:36;5854:18:35;;230:2306:36;;;;;5854:33:35;5928:28;5941:14;;5928:28;:::i;:::-;5970:13;;;;230:2306:36;;;;;;;;;;;5970:18:35;5966:77;;6074:25;230:2306:36;;;;;;;;6056:43:35;;230:2306:36;;;6056:15:35;:43;:::i;:::-;6102:16;;;;230:2306:36;;;;;;;;;6056:62:35;230:2306:36;;;-1:-1:-1;6052:178:35;;-1:-1:-1;;6306:18:35;5854;6306:33;230:2306:36;;;6287:53:35;;230:2306:36;;9516:51:35;:::i;6287:53::-;230:2306:36;;;;;;;;;6367:31:35;;;:139;;;;5599:2265;6350:298;;;6701:25;;6921:79;6701:25;6757:72;6074:25;6685:62;6701:25;;;:::i;:::-;6728:18;;;;6685:62;;:::i;:::-;6796:32;;6757:72;;:::i;:::-;6870:17;;;;;;;;;:::i;:::-;6982;6964:16;230:2306:36;6074:11:35;230:2306:36;;;;;;6964:16:35;;230:2306:36;6982:17:35;;;6921:79;;:::i;:::-;7059:30;230:2306:36;;;;;;;;;;;;7059:15:35;230:2306:36;;;;;;;7059:30:35;7103:37;230:2306:36;;;;;;;7103:37:35;7099:303;;230:2306:36;;6074:25:35;230:2306:36;;;;7495:46:35;230:2306:36;7455:30:35;230:2306:36;;;;;;;;;7455:30:35;230:2306:36;;;;;;;7495:46:35;230:2306:36;;;;;;;;;;;7495:46:35;6074:11;7551:29;;230:2306:36;7635:17:35;7604:28;;230:2306:36;:::i;:::-;;;;;;;6074:25:35;230:2306:36;7667:55:35;;230:2306:36;;;;;;7667:55:35;230:2306:36;;;7667:55:35;7663:141;;7814:43;5854:33;5599:2265;:::o;7663:141::-;7738:55;;230:2306:36;;6074:25:35;230:2306:36;;;;;;;;6074:25:35;230:2306:36;;7738:55:35;5854:33;5599:2265;:::o;7099:303::-;230:2306:36;;7160:95:35;230:2306:36;;;;;;;7237:17:35;;7160:95;;:::i;:::-;7156:175;;7351:40;230:2306:36;;;;;;;;7351:40:35;5854:33;7351:40;230:2306:36;;7059:15:35;230:2306:36;;;;7156:175:35;6074:25;;-1:-1:-1;7275:41:35:o;6350:298::-;6538:99;230:2306:36;;;;;;;;;6538:99:35;5854:33;6538:99;230:2306:36;;;;6538:99:35;230:2306:36;6056:15:35;230:2306:36;;;;;;;;6367:139:35;6056:15;;6418:69;6056:15;230:2306:36;6418:40:35;230:2306:36;;;;;;;6418:40:35;:69;:::i;:::-;:88;;6367:139;;;6052:178;6141:78;5854:33;6141:78;6056:15;6141:78;230:2306:36;;;;;;;;;;;-1:-1:-1;9833:51:35;5966:77;6011:21;5854:33;6011:21;;5854:33;6011:21;230:2306:36;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;:::i;:::-;;;:::o;:::-;;:::i;3165:103:93:-;735:10:121;2920:6:93;230:2306:36;;;;;;;;;;;;3485:23:93;3481:108;;3165:103::o;3481:108::-;3531:47;2920:6;3531:47;735:10:121;3531:47:93;230:2306:36;2082:33:35;230:2306:36;;;2920:6:93;3531:47;3165:103;230:2306:36;2920:6:93;230:2306:36;2920:6:93;230:2306:36;;;2920:29:93;735:10:121;230:2306:36;2920:6:93;230:2306:36;;;;;;;;;;;;;2920:29:93;230:2306:36;;3485:23:93;3481:108;;3165:103;:::o;3481:108::-;3531:47;2920:6;3531:47;735:10:121;3531:47:93;230:2306:36;;;;2920:6:93;3531:47;19709:177:35;230:2306:36;;19790:19:35;19786:94;;19709:177;:::o;19786:94::-;19832:37;19808:1;19832:37;;230:2306:36;;19808:1:35;19832:37;230:2306:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;230:2306:36;;;;-1:-1:-1;230:2306:36;;;;-1:-1:-1;230:2306:36;;;;;;;;;;;:::o;:::-;;;10964:1:35;230:2306:36;;;;;;;:::o;:::-;;;11133:1:35;230:2306:36;;;;;;;:::o;:::-;;;11272:2:35;230:2306:36;;;;;;;:::o;:::-;;;11458:2:35;230:2306:36;;;;;;;:::o;:::-;;;11501:1:35;230:2306:36;;;;;;;:::o;:::-;;;11731:1:35;230:2306:36;;;;;;;:::o;:::-;;;11804:2:35;230:2306:36;;;;;;;:::o;:::-;;;11872:2:35;230:2306:36;;;;;;;:::o;:::-;;;13103:1:35;230:2306:36;;;;;;;:::o;:::-;;;;;;;;;:::o;:::-;;;2036:1;230:2306;;;;;;;:::o;:::-;;;7558:2:37;230:2306:36;;;;;;;:::o;:::-;;;;;;;;;;;;;;;:::o;2212:66:35:-;;;;;;;;;;;:::o;:::-;;;;;:::i;:::-;230:2306:36;;;;;;:::i;:::-;2212:66:35;;;-1:-1:-1;;2212:66:35;;;;:::i;:::-;;;;;;;;:::o;:::-;;230:2306:36;;;;;2212:66:35;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;230:2306:36;2212:66:35;;;:::o;:::-;230:2306:36;;2212:66:35;;230:2306:36;;2212:66:35;230:2306:36;;:::i;:::-;1842:1;2212:66:35;;;-1:-1:-1;;2212:66:35;;-1:-1:-1;2212:66:35;;;;;;;;;:::o;:::-;;230:2306:36;2212:66:35;;;;;;;;;;;;;;;:::i;:::-;230:2306:36;;;;;;:::i;:::-;2212:66:35;;;-1:-1:-1;;2212:66:35;;;;:::i;:::-;;;-1:-1:-1;2212:66:35;;;;;;;;;:::o;:::-;;230:2306:36;2212:66:35;;;;;;;;;;10603:2705;10769:30;:21;230:2306:36;;:::i;:::-;10710:28:35;;;;10769:21;:::i;:::-;:30;:::i;:::-;10748:18;;;:51;;;;230:2306:36;10841:2:35;10813:30;;10809:114;;10945:18;2394:66;10945:36;:21;:18;;:21;:::i;:::-;;:36;:::i;:::-;10937:66;10933:168;;10964:1;11114:30;:21;:18;;:21;:::i;:::-;;:30;:::i;:::-;:35;11110:122;;2212:66;11253:37;:22;:18;;:22;:::i;:37::-;11245:67;11241:167;;11439:32;:22;:18;;:22;:::i;:::-;;:32;:::i;:::-;230:2306:36;;11501:1:35;11485:17;;;;;:73;;;10603:2705;11481:130;;;11644:18;11919:21;11853:32;:22;11644:18;11621:54;11637:38;11644:30;:21;11919:30;11644:18;;:21;:::i;11637:38::-;230:2306:36;;11621:13:35;;;2212:66;;11621:54;11712:36;:21;:18;;:21;:::i;:36::-;11685:16;;;2212:66;11759:58;11778:39;11785:31;:22;:18;;:22;:::i;11778:39::-;230:2306:36;;11759:16:35;;;2212:66;;11759:58;11853:18;:22;:::i;:32::-;11919:21;:::i;:30::-;11895:21;;;;:54;;;;230:2306:36;11995:1:35;11963:33;;11959:123;;12136:21;:33;:24;:21;;:24;:::i;:::-;;:33;:::i;:::-;230:2306:36;;;12183:26:35;12179:83;;12292:36;230:2306:36;;12292:36:35;:::i;:::-;12272:17;;;;:56;;;-1:-1:-1;12385:3:35;230:2306:36;;12358:25:35;;;;;12434:27;:17;;;;:::i;:27::-;230:2306:36;;12504:2:35;12479:27;;12475:125;;12642:23;;12634:32;12642:23;;:::i;:::-;2212:66;;;;12634:32;230:2306:36;;;12684:23:35;;12680:103;;-1:-1:-1;12816:5:35;;;;;;12989:17;;;:32;10964:1;12989:17;:32;:17;;;:32;:::i;:::-;2212:66;230:2306:36;;2212:66:35;;;12989:32;2212:66;12343:13;;12823:3;12850:17;:33;:20;;:17;;;:20;:::i;:::-;230:2306:36;;;;;12850:20:35;230:2306:36;;;;12850:33:35;;12846:116;;10964:1;2212:66;12801:13;;12846:116;12914:29;-1:-1:-1;12914:29:35;230:2306:36;;;12734:34:35;230:2306:36;2212:66:35;-1:-1:-1;9833:51:35;12680:103;12734:34;-1:-1:-1;12734:34:35;230:2306:36;;;12734:34:35;230:2306:36;2212:66:35;-1:-1:-1;9833:51:35;12475:125;12533:52;-1:-1:-1;12533:52:35;230:2306:36;;;-1:-1:-1;9833:51:35;12358:25;;;13081:24;12358:25;;;13081:33;12358:25;;13081:21;:24;:::i;:33::-;13145:29;230:2306:36;;13145:29:35;:::i;:::-;13124:18;;;;:50;;;-1:-1:-1;13226:3:35;230:2306:36;;13204:20:35;;;;;13269:12;13245:46;13269:12;:22;:12;10964:1;13269:12;;;:::i;:22::-;13245:18;;:46;;;;;:::i;:::-;;;:::i;:::-;;2212:66;13189:13;;13204:20;;;;;10603:2705::o;12179:83::-;12232:19;-1:-1:-1;12232:19:35;;-1:-1:-1;12232:19:35;11959:123;12019:52;-1:-1:-1;12019:52:35;230:2306:36;;;-1:-1:-1;9833:51:35;11481:130;11581:19;230:2306:36;;;11581:19:35;;;;;;;;;;:::i;:::-;;;;11485:73;11526:32;230:2306:36;;10748:18:35;230:2306:36;;11506:16:35;:52;;11485:73;;;11241:167;11358:37;:22;11335:62;11358:18;;:22;:::i;:37::-;11335:62;-1:-1:-1;11335:62:35;230:2306:36;;;;;11110:122:35;11190:30;:21;11172:49;11190:18;;:21;:::i;:30::-;11172:49;-1:-1:-1;11172:49:35;230:2306:36;;;;;10933:168:35;11052:36;:21;11026:64;11052:18;;:21;:::i;:36::-;11026:64;-1:-1:-1;11026:64:35;230:2306:36;;;;;10809:114:35;10866:46;10710:16;10866:46;230:2306:36;;;-1:-1:-1;9833:51:35;19288:292;230:2306:36;;;;-1:-1:-1;230:2306:36;19428:15:35;230:2306:36;;;-1:-1:-1;230:2306:36;;;;;;19473:29:35;19469:105;;19288:292;:::o;19469:105::-;19525:38;-1:-1:-1;19525:38:35;19428:15;230:2306:36;;-1:-1:-1;19525:38:35;230:2306:36;;;;;;;;:::i;:::-;;;;;;;;;:::o;1696:838::-;2257:18;2180:26;1830:14;;:::i;:::-;21133:17:35;2079:24:36;1884:21;;;21133:17:35;1884:24:36;:21;;:24;:::i;:::-;;21133:17:35;:::i;:::-;1854:55:36;;;:::i;:::-;;;;;:::i;:::-;;21133:17:35;1949:24:36;:21;;:24;:::i;21133:17:35:-;1919:55:36;;;:::i;:::-;;;;;:::i;:::-;;21133:17:35;2014:24:36;:21;;:24;:::i;21133:17:35:-;1984:55:36;;;:::i;:::-;;;;;:::i;:::-;;2079:21;:24;:::i;21133:17:35:-;2049:55:36;;;:::i;:::-;;;;;:::i;:::-;;2114:23;;:::i;:::-;;;;:::i;:::-;2212:66:35;2114:23:36;;;:::i;:::-;;2180:26;:::i;:::-;2257:18;;;2245:38;2257:18;;230:2306;2245:38;:::i;:::-;2298:13;1906:1;2344:3;2317:18;;230:2306;;2313:29;;;;;2380:82;;1971:1;2380:82;2385:2;2380:7;;:82;2385:2;;;2390:33;;;;;:::i;:::-;2363:99;;;;:::i;:::-;;;;;;:::i;:::-;;2212:66:35;2298:13:36;;2380:82;21133:17:35;2440:21:36;;;;:::i;21133:17:35:-;2380:82:36;;2313:29;;;;2499:27;2313:29;;2499:27;:::i;:::-;2257:18;230:2306;;;;2489:38;1696:838;:::o;14625:509:35:-;;;;14757:27;230:2306:36;;14757:27:35;:::i;:::-;14799:13;14811:1;14832:3;230:2306:36;;14814:16:35;;;;;14891:8;;;;:::i;:::-;;230:2306:36;;15452:2:35;15437:17;;15433:95;;15547:8;;15559:2;230:2306:36;15541:15:35;15547:8;;15680:30;15547:8;;:::i;:::-;230:2306:36;;;;;15547:8:35;230:2306:36;;;;15541:15:35;230:2306:36;15541:20:35;15537:90;;14832:3;15680:30;;:::i;:::-;230:2306:36;;;;:::i;:::-;15724:33:35;;;:57;;;14832:3;15720:114;;230:2306:36;;;14811:1:35;14934:5;;;;;;15098:19;;;;2212:66;15098:19;;;;;:::i;:::-;2212:66;14799:13;;14941:3;14968:10;:20;:10;;;;;:::i;:20::-;;14964:107;;2212:66;;14919:13;;14964:107;15019:33;14811:1;15019:33;230:2306:36;;;12734:34:35;230:2306:36;2212:66:35;-1:-1:-1;9833:51:35;15720:114;15804:19;14811:1;15804:19;;14811:1;15804:19;15724:57;230:2306:36;;;;15761:20:35;15724:57;;15537:90;15588:28;15595:20;:15;15601:8;;;;:::i;15595:15::-;:20;:::i;:::-;230:2306:36;;;;;;15588:28:35;14811:1;15577:39;;;;:::i;:::-;;15537:90;;15433:95;15477:40;14811:1;15477:40;230:2306:36;;;-1:-1:-1;9833:51:35;14814:16;;;;14625:509::o;230:2306:36:-;-1:-1:-1;;230:2306:36;;;;;;;:::o;16070:540:35:-;;-1:-1:-1;16267:13:35;-1:-1:-1;16302:3:35;230:2306:36;;16282:18:35;;;;;16325:47;230:2306:36;16361:10:35;;;;:::i;:::-;230:2306:36;;16325:47:35;;:::i;:::-;16321:94;;16302:3;2212:66;;16267:13;;16321:94;16392:8;;2212:66;16392:8;;:::i;:::-;16321:94;;;;;16282:18;;;16481:1;16454:32;16282:18;230:2306:36;;16454:32:35;:::i;:::-;16500:17;;;;16496:108;;16070:540;;:::o;16496:108::-;16540:53;-1:-1:-1;16540:53:35;230:2306:36;;;;;-1:-1:-1;16540:53:35;230:2306:36;;-1:-1:-1;;230:2306:36;;;;;;;:::o;:::-;;;;;;;;;;:::o;:::-;;;;;;;;;;:::o;:::-;;;;;;;;;:::o;:::-;;;;;;;;;;:::o;16833:545:35:-;;-1:-1:-1;16972:13:35;-1:-1:-1;17007:3:35;230:2306:36;;16987:18:35;;;;;17030:39;230:2306:36;17058:10:35;;;;:::i;:::-;230:2306:36;;17030:39:35;;:::i;:::-;17026:86;;17007:3;2212:66;;16972:13;;17026:86;17089:8;;2212:66;17089:8;;:::i;:::-;17026:86;;;;;16987:18;;;230:2306:36;;17261:1:35;230:2306:36;;;;;;;;;17276:17:35;;;17272:100;;16833:545;;:::o;17272:100::-;17316:45;-1:-1:-1;17316:45:35;230:2306:36;;;;;-1:-1:-1;17316:45:35;13603:440;13949:31;13603:440;13949:22;13603:440;13821:76;13603:440;230:2306:36;;;13870:25:35;;;230:2306:36;;;;;;13870:25:35;;;;;;;:::i;13949:31::-;230:2306:36;;14018:1:35;230:2306:36;;;;;14005:30:35;230:2306:36;;14005:15:35;:30;:::i;230:2306:36:-;;;;;;;;-1:-1:-1;230:2306:36;;-1:-1:-1;230:2306:36;;;-1:-1:-1;230:2306:36;:::o;18401:677:35:-;;;230:2306:36;;;;;;;;;;;;;;18648:37:35;;;;:82;;;18401:677;18644:125;;;18782:25;;230:2306:36;;;;;18782:53:35;18778:96;;230:2306:36;18926:3:35;230:2306:36;;18903:21:35;;;;;230:2306:36;18949:28:35;;;;:::i;:::-;230:2306:36;;;;;;;;;;;;18949:45:35;18981:13;;;;;:::i;18949:45::-;230:2306:36;;18949:45:35;18945:96;;2212:66;;18888:13;;18945:96;19014:12;;;230:2306:36;19014:12:35;:::o;18903:21::-;;;;2212:66;18401:677;:::o;18778:96::-;18851:12;;230:2306:36;18851:12:35;:::o;18648:82::-;18689:26;;;;;230:2306:36;18689:41:35;;18648:82;;;6145:316:93;230:2306:36;;;;;;;2920:29:93;230:2306:36;;;;;;;;;;;;;;;;2920:29:93;230:2306:36;;;;;;;;;;6281:29:93;230:2306:36;;;;;;;;;;;;;;;;6281:29:93;6313:4;230:2306:36;;;;;;;;735:10:121;230:2306:36;;6336:40:93;;230:2306:36;6336:40:93;;6313:4;6390:11;:::o;6698:317::-;230:2306:36;;;;;;;2920:29:93;230:2306:36;;;;;;;;;;;;;;;;2920:29:93;230:2306:36;;;;;;;;;;;6834:29:93;230:2306:36;;;;;;;;;;;;;;;;6834:29:93;230:2306:36;;;;;;;735:10:121;230:2306:36;;6890:40:93;;230:2306:36;6890:40:93;;230:2306:36;6944:11:93;:::o;14227:174:35:-;230:2306:36;;;;;14351:18:35;230:2306:36;;;14340:53:35;;230:2306:36;;;2605:66:35;230:2306:36;;;;;14340:53:35;;;;;;:::i;:::-;230:2306:36;14330:64:35;;14227:174;:::o;230:2306:36:-;;;;;;;;:::i;:::-;2546:1:37;230:2306:36;;;2212:66:35;230:2306:36;;;2212:66:35;230:2306:36:o;:::-;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;-1:-1:-1;;230:2306:36;;;;:::i;1287:390:37:-;1607:20;:29;1287:390;;;;230:2306:36;1508:2:37;230:2306:36;:::i;:::-;;;;;;;;:::i;:::-;1508:2:37;230:2306:36;;;1508:2:37;230:2306:36;:::i;:::-;-1:-1:-1;;1508:2:37;230:2306:36;;;;2212:66:35;;;1521:63:37;1607:20;:::i;:29::-;1648:21;8580:13;230:2306:36;;8580:13:37;:::i;:::-;230:2306:36;;;8611:13:37;;:33;;;1287:390;8603:42;;;:::i;:::-;8666:26;8676:15;-1:-1:-1;8676:15:37;;:::i;:::-;8666:26;:::i;:::-;8702:18;-1:-1:-1;;230:2306:36;1667:1:37;8888:14;;;;;;1600:70;;;;;;;:::i;8904:6::-;8969:5;9033:37;8985:3;9041:21;:16;9047:9;;8969:5;;8592:1;8969:5;230:2306:36;;;;8969:5:37;8966:9;;8930:59;8966:9;8952:37;8966:9;8960:21;:16;8966:9;;;;;:::i;8960:16::-;230:2306:36;;;;;;8960:21:37;8959:29;230:2306:36;;;;;;8952:37:37;1667:1;8930:59;;;:::i;:::-;;9047:9;:::i;9041:16::-;230:2306:36;;;;9033:37:37;1667:1;9007:63;;8743:1;230:2306:36;;9007:63:37;;:::i;:::-;;230:2306:36;8881:204:37;;8611:33;-1:-1:-1;8628:16:37;8611:33;;230:2306:36;;;;;;;:::i;:::-;-1:-1:-1;230:2306:36;;;;;;;:::o;2457:221:38:-;230:2306:36;;:::i;:::-;;2568:58:38;230:2306:36;;;;;;;;;:::i;:::-;2212:66:35;;2568:58:38;;2643:28;;2212:66:35;2457:221:38;:::o;230:2306:36:-;;;;:::o;7796:439:38:-;230:2306:36;;7883:12:38;;;:30;;;;7796:439;230:2306:36;;;;7957:21:38;;;:::i;:::-;7989:14;8013:192;;;;;;;8215:13;7796:439;:::o;8013:192::-;;;;;;;7796:439;:::o;7883:30::-;7911:2;7899:14;;;;7883:30;;;4170:519;4266:12;;;:::i;:::-;230:2306:36;;;4306:14:38;;;:::i;:::-;2212:66:35;;;:::i;:::-;230:2306:36;;;;;;;:::i;:::-;2212:66:35;;;-1:-1:-1;;230:2306:36;;;:::i;:::-;;-1:-1:-1;230:2306:36;;;;;;4404:11:38;;230:2306:36;4404:41:38;:11;;230:2306:36;4418:27:38;;;:::i;:::-;4404:41;;:::i;:::-;-1:-1:-1;4480:179:38;4500:9;;;;;;4669:13;;;4170:519;:::o;4511:3::-;4632:16;4540:19;;2212:66:35;4540:19:38;;:::i;:::-;230:2306:36;;;:::i;:::-;2212:66:35;;;4585:24:38;230:2306:36;4585:24:38;;2212:66:35;4573:36:38;;;;:::i;:::-;;;;;;:::i;:::-;;4632:16;:::i;:::-;4511:3;2212:66:35;4485:13:38;;;230:2306:36;;;;;:::i;:::-;;;;;;;;;;8413:298:38;8545:2;230:2306:36;;8533:14:38;230:2306:36;;8600:11:38;;230:2306:36;8614:1:38;230:2306:36;;;;;;;8625:56:38;8413:298;:::o;8857:379::-;230:2306:36;;8950:12:38;230:2306:36;;9006:21:38;9202:3;9006:21;;:::i;:::-;9059:14;;;;;;:::i;:::-;9109:61;;;;9202:3;;:::i;230:2306:36:-;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;:::i;:::-;;;:::i;:::-;;-1:-1:-1;;230:2306:36;;;;;;:::i;:::-;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;21886:523:35:-;-1:-1:-1;;230:2306:36;22047:3:35;230:2306:36;;22029:16:35;;;;;22076:31;2212:66;22098:8;;;;;:::i;:::-;;22076:31;;:::i;:::-;22047:3;2212:66;22014:13;;;22029:16;;;;230:2306:36;;22149:2:35;22132:19;;22128:120;;230:2306:36;22328:74:35;22282:29;230:2306:36;;22282:29:35;:::i;:::-;230:2306:36;22328:74:35;22345:37;22352:29;22358:22;230:2306:36;;22358:22:35;:::i;22345:37::-;230:2306:36;;;22328:74:35;;;;;;;:::i;22128:120::-;22191:36;22198:28;22204:21;22174:63;22204:21;;:::i;22191:36::-;22174:63;230:2306:36;;22174:63:35;;;;;;;:::i;230:2306:36:-;;;15552:2:35;230:2306:36;;;;;;;:::o;:::-;;;;;;;;;;;;;:::o;21295:440:35:-;21403:1;230:2306:36;;21389:15:35;:39;;;21295:440;21385:80;;230:2306:36;;21491:2:35;21478:15;;21474:108;;230:2306:36;21658:70:35;21616:25;230:2306:36;;21616:25:35;:::i;:::-;230:2306:36;21658:70:35;21675:37;21682:29;21688:22;230:2306:36;;21688:22:35;:::i;21474:108::-;21533:32;21540:24;21546:17;21516:55;21546:17;;:::i;21389:39::-;21414:6;21424:4;230:2306:36;21408:13:35;21414:6;;;;:::i;21408:13::-;230:2306:36;21408:20:35;21389:39;;230:2306:36;;;;;;;;;;;;:::o;:::-;;-1:-1:-1;230:2306:36;;;:::o;20106:284:35:-;;230:2306:36;20260:3:35;230:2306:36;;20237:21:35;;;;;230:2306:36;20283:13:35;;;;:::i;:::-;230:2306:36;;;;;;;;;;20283:23:35;20279:73;;2212:66;;20222:13;;20608:282;;230:2306:36;20760:3:35;230:2306:36;;20737:21:35;;;;;230:2306:36;20783:13:35;;;;:::i;:::-;230:2306:36;;;;;20783:23:35;20779:73;;2212:66;;20722:13;;8452:649:37;;;8580:13;230:2306:36;;8580:13:37;:::i;:::-;230:2306:36;;;8611:13:37;;:33;;;8452:649;8603:42;;;:::i;:::-;8666:26;8676:15;;;;:::i;8666:26::-;8702:18;;8734:10;8743:1;8734:10;;;:15;8730:118;;8452:649;-1:-1:-1;;230:2306:36;;;8881:204:37;8888:14;;;;;;8452:649;;;;;:::o;8904:6::-;8969:5;9007:63;8743:1;9033:37;8985:3;9041:21;:16;9047:9;;8969:5;8592:1;8969:5;8930:59;8952:37;8969:5;8960:21;8969:5;8966:9;;8969:5;8960:16;8969:5;230:2306:36;;;;8969:5:37;8966:9;;;:::i;8952:37::-;230:2306:36;;;8930:59:37;;8623:1;8930:59;;;:::i;:::-;;9047:9;;:::i;9033:37::-;8623:1;9007:63;230:2306:36;;9007:63:37;;:::i;:::-;;230:2306:36;8881:204:37;;;;8730:118;8795:10;;230:2306:36;8786:26:37;:21;8792:14;;8795:10;;230:2306:36;;;;8795:10:37;8792:14;;:::i;8786:26::-;230:2306:36;;;8623:1:37;8765:55;;;;:::i;:::-;;-1:-1:-1;;8834:3:37;;;:::i;:::-;8730:118;;;;;8611:33;-1:-1:-1;8628:16:37;;;;8611:33;;2316:5418;;2546:1;2557:20;2546:1;230:2306:36;;:::i;:::-;;;;2676:17:37;2672:223;;2963:13;;2546:1;2958:4724;2996:3;230:2306:36;;2978:16:37;;;;;3078:6;;;;:50;;2996:3;3074:97;;3285:6;:47;;;;2996:3;3281:94;;;3501:17;:8;;;;:::i;:17::-;230:2306:36;;;3552:1:37;3537:16;;3533:4139;3552:1;;;3731:7;3703:46;3731:17;:7;;;:::i;:17::-;3703:46;:::i;:::-;3791:56;3865:28;3791:56;;;;;:::i;:::-;3865:28;;;:::i;:::-;230:2306:36;;-1:-1:-1;3912:994:37;;4924:1185;;;230:2306:36;5002:16:37;230:2306:36;;5002:16:37;:::i;:::-;-1:-1:-1;4994:144:37;;230:2306:36;-1:-1:-1;5160:109:37;;5302:7;5338:18;5302:7;;:::i;5160:109::-;5234:12;;;:::i;4924:1185::-;230:2306:36;;;5481:16:37;230:2306:36;;5481:16:37;:::i;:::-;5476:21;;5472:138;;5637:7;5636:17;5637:16;:7;2212:66:35;5637:7:37;;:::i;:::-;;:16;:::i;:::-;5636:17;;230:2306:36;5636:17:37;5637:7;;;5824;:26;:7;;:::i;:::-;;:26;:::i;:::-;5632:459;;2212:66:35;2963:13:37;;;;;5632:459;6041:7;:27;:7;;:::i;:::-;;5445:11:38;;;230:2306:36;;;5522:62:38;;5341:272;;6041:27:37;5632:459;;;3912:994;230:2306:36;;;;;;4705:16:37;230:2306:36;;;4705:16:37;:::i;:::-;-1:-1:-1;4697:149:37;;4875:12;;:::i;3533:4139::-;6133:17;;;;;;6148:2;6133:17;6148:2;;230:2306:36;;6206:36:37;;6222:20;;6438:17;6373:43;6381:34;6387:27;;;;;:::i;6373:43::-;6438:17;;:::i;:::-;6481:12;6491:2;6481:12;;;6477:146;;6649:33;6669:12;;;;:::i;:::-;;6649:33;:::i;:::-;6669:12;;;230:2306:36;;;;6753:16:37;230:2306:36;;;;6753:16:37;:::i;:::-;6748:21;6744:157;;6934:12;;:::i;6645:555::-;6980:12;6979:22;6980:21;:12;;2212:66:35;6980:12:37;;;;;;;:::i;6979:22::-;6980:12;;;7044:31;:12;;;;:::i;6975:225::-;7145:32;:12;;;;:::i;6202:1388::-;230:2306:36;;;7398:16:37;230:2306:36;;7398:16:37;:::i;:::-;7393:21;7389:135;;7553:8;:18;:8;;:::i;6129:1543::-;230:2306:36;;7628:29:37;;;230:2306:36;7628:29:37;;;230:2306:36;;;;;;;;;;;;;11581:19:35;3285:47:37;3323:8;;3311:21;3323:8;;;;:::i;:::-;;3311:21;:::i;:::-;3295:37;;3285:47;;;3078:50;3100:8;:28;:8;;;;:::i;:28::-;3088:40;;;3078:50;;2672:223;2772:78;;;2764:87;2772:78;;2784:66;2772:78;;;2764:87;:::i;:::-;2872:12;;:::i;3469:281:38:-;;3598:11;;;230:2306:36;3583:27:38;230:2306:36;;3583:27:38;:::i;:::-;230:2306:36;;;;;;;;;;;;;;;;;;;;3723:20:38;3469:281;:::o;4838:321::-;230:2306:36;;4918:13:38;4914:31;;4994:11;868:4;4994:11;;230:2306:36;5015:64:38;230:2306:36;5015:64:38;5093:24;5089:42;;5148:4;4838:321;:::o;4914:31::-;4933:12;230:2306:36;4933:12:38;:::o;9434:424::-;230:2306:36;;9518:13:38;9514:27;;230:2306:36;9597:11:38;;;;230:2306:36;;;9611:27:38;;;:::i;:::-;230:2306:36;;;;;;;;;;;;;;;;;;9697:132:38;;9704:16;;;;;;9839:12;;;9434:424;:::o;9697:132::-;9756:20;;;:::i;:::-;230:2306:36;;;;;;;9811:7:38;9736:40;9811:7;;:::i;:::-;9697:132;;;11485:581;11589:64;230:2306:36;11589:64:38;682:4;11667:26;;682:4;;;11709:8;230:2306:36;11709:8:38;:::o;11663:397::-;776:4;11738:25;;:83;;;;11663:397;11734:326;;;11837:8;11844:1;11837:8;:::o;11734:326::-;868:4;11866:24;;868:4;;;11943:35;;:31;;958:4;11943:31;;;:::i;:::-;:35;:::i;11862:198::-;12016:33;;:29;;958:4;12016:29;230:2306:36;11738:83:38;11768:25;868:4;11768:25;;;:52;;11738:83;11768:52;11797:23;958:4;11797:23;;11738:83;;10045:1263;10171:64;;-1:-1:-1;10171:64:38;;682:4;10249:26;;682:4;;;10291:11;;10301:1;10045:1263;:::o;10245:1032::-;776:4;10323:25;;776:4;;;10374:26;;:30;:26;;:::i;10319:958::-;868:4;10425:24;;868:4;;;10465:385;;;;;;;;;;;;;;;;230:2306:36;:::o;10421:856:38:-;958:4;10870:23;;958:4;;;10919:24;;:28;:24;;:::i;10866:411::-;10978:289;;;;;;;;;;;;;;;;230:2306:36;:::o;1035:2:38:-;;;;;;;;;:::o;12279:770::-;;;12360:8;;12356:21;;12441:16;1035:2;12441:16;;;;;12642:7;12638:405;;12279:770;;;:::o;12638:405::-;12764:24;12772:15;12764:28;12772:15;;:::i;:::-;12764:24;:::i;:::-;:28;:::i;:::-;12806:227;;;;;;;;;;;;12279:770::o;12459:16::-;12491:65;;;;;;1035:2;230:2306:36;;;;;;;12600:17:38;1035:2;230:2306:36;;;;;;;12459:16:38;-1:-1:-1;;230:2306:36;;;;;;12434:194:38;230:2306:36;;:::i;6262:337:38:-;6372:19;230:2306:36;;6372:19:38;:::i;:::-;230:2306:36;;;6405:18:38;6401:37;;6542:11;6470:57;6560:8;6542:11;;230:2306:36;;;6470:57:38;;;;6560:8;;:::i;6401:37::-;6425:13;;:::o;22572:430:35:-;-1:-1:-1;22657:19:35;;22717:8;;;22812:17;;;;:::i;:::-;22839:11;22860:116;22885:5;;;22985:10;;22572:430;:::o;22892:3::-;22915:5;;;:::i;:::-;22911:31;230:2306:36;;;;;-1:-1:-1;22911:31:35;;;;:::i;:::-;;230:2306:36;;22892:3:35;230:2306:36;;;;-1:-1:-1;;230:2306:36;22865:18:35;;;;22710:73;22741:8;;;;:::i;:::-;230:2306:36;22771:1:35;230:2306:36;22710:73:35;;;2419:778:131;230:2306:36;;;2419:778:131;2609:2;2589:22;;2609:2;;3041:25;2825:196;;;;;;;;;;;;;;;-1:-1:-1;2825:196:131;3041:25;;:::i;:::-;3034:32;;;;;:::o;2585:606::-;3097:83;;3113:1;3097:83;3117:35;3097:83;;:::o;10970:270:37:-;230:2306:36;;11081:2:37;11069:14;;11081:2;;;5445:11:38;11081:2:37;5445:11:38;;230:2306:36;;;5522:62:38;;11099:32:37;:::o;11065:169::-;5445:11:38;11081:2:37;5445:11:38;230:2306:36;5522:62:38;230:2306:36;;11081:2:37;11179:43;;230:2306:36;;;11081:2:37;11179:43;;;230:2306:36;11179:43:37;;:::i;7919:335::-;8034:1;230:2306:36;;8022:13:37;8018:56;;8117:11;;230:2306:36;8138:60:37;230:2306:36;8138:60:37;8219:4;8214:9;;7919:335::o;5788:270:38:-;5909:21;5788:270;5909:21;:::i;:::-;5964:65;;5788:270;:::o;9342:729:37:-;;230:2306:36;;9472:13:37;230:2306:36;;9538:3:37;9518:17;:12;9524:5;;;;:::i;9518:17::-;:23;9583:16;;;9615:10;10038:25;9624:1;230:2306:36;9579:434:37;10038:25;:::i;9579:434::-;9689:1;9674:16;;9689:1;;9706:10;10038:25;9689:1;230:2306:36;9670:343:37;10038:25;:::i;9670:343::-;9780:1;9765:16;;9780:1;;9797:10;10038:25;9780:1;9689;9761:252;10038:25;:::i;9761:252::-;9870:1;9855:16;9870:1;;10038:25;9689:1;9911:13;9851:162;10038:25;:::i;10353:320::-;;;230:2306:36;10548:3:37;230:2306:36;;;;;;;;;;10505:24:37;;:41;;;10548:3;10505:41;;;10571:16;230:2306:36;;10571:16:37;;:::i;:::-;230:2306:36;;;10591:5:37;;;;:::i;:::-;230:2306:36;;10571:25:37;;10567:72;;10548:3;;;:::i;:::-;10498:151;;10567:72;10616:8;;;;;:::o;10505:41::-;;;;;;10353:320;:::o;10505:41::-;230:2306:36;;;10533:13:37;;10505:41;;7129:1551:131;;;8209:66;8196:79;;8192:164;;230:2306:36;;;;;;-1:-1:-1;230:2306:36;;;;;;;;;;;;;;;;;;;8467:24:131;;;;;;;;;-1:-1:-1;8467:24:131;230:2306:36;;;8505:20:131;8501:113;;8624:49;-1:-1:-1;8624:49:131;-1:-1:-1;7129:1551:131;:::o;8501:113::-;8541:62;-1:-1:-1;8541:62:131;8467:24;8541:62;-1:-1:-1;8541:62:131;:::o;8467:24::-;230:2306:36;;;;;;;;;8192:164:131;8291:54;;;8307:1;8291:54;8311:30;8291:54;;:::o","linkReferences":{}},"methodIdentifiers":{"DEFAULT_ADMIN_ROLE()":"a217fddf","PROOF_SUBMITTER_ROLE()":"5972185a","getClientState()":"ef913a4b","getConsensusState(uint64)":"edce8bdc","getRoleAdmin(bytes32)":"248a9ca3","grantRole(bytes32,address)":"2f2ff15d","hasRole(bytes32,address)":"91d14854","misbehaviour(bytes)":"ddba6537","renounceRole(bytes32,address)":"36568abe","revokeRole(bytes32,address)":"d547741f","supportsInterface(bytes4)":"01ffc9a7","updateClient(bytes)":"0bece356","verifyMembership((bytes,(uint64,uint64),bytes[],bytes))":"682ed5f0","verifyNonMembership((bytes,(uint64,uint64),bytes[]))":"4d6d9ffb"},"rawMetadata":"{\"compiler\":{\"version\":\"0.8.28+commit.7893614a\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"ibcRouter\",\"type\":\"address\"},{\"internalType\":\"uint64\",\"name\":\"initialTrustedHeight\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"initialTrustedTimestamp\",\"type\":\"uint64\"},{\"internalType\":\"bytes32\",\"name\":\"initialTrustedStorageRoot\",\"type\":\"bytes32\"},{\"internalType\":\"address[]\",\"name\":\"initialTrustedValidators\",\"type\":\"address[]\"},{\"internalType\":\"uint64\",\"name\":\"trustingPeriod\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"maxClockDrift\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"roleManager\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"AccessControlBadConfirmation\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"internalType\":\"bytes32\",\"name\":\"neededRole\",\"type\":\"bytes32\"}],\"name\":\"AccessControlUnauthorizedAccount\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"revisionHeight\",\"type\":\"uint64\"}],\"name\":\"ConflictingConsensusState\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"trustedTimestamp\",\"type\":\"uint64\"},{\"internalType\":\"uint256\",\"name\":\"currentTimestamp\",\"type\":\"uint256\"},{\"internalType\":\"uint64\",\"name\":\"trustingPeriod\",\"type\":\"uint64\"}],\"name\":\"ConsensusStateExpired\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"revisionHeight\",\"type\":\"uint64\"}],\"name\":\"ConsensusStateNotFound\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"signer\",\"type\":\"address\"}],\"name\":\"DuplicateCommitSealSigner\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"validator\",\"type\":\"address\"}],\"name\":\"DuplicateValidator\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"EmptyValidatorSet\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"currentTimestamp\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"headerTimestamp\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxClockDrift\",\"type\":\"uint256\"}],\"name\":\"HeaderFromFuture\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"actual\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"required\",\"type\":\"uint256\"}],\"name\":\"InsufficientTrustedValidatorOverlap\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"actual\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"required\",\"type\":\"uint256\"}],\"name\":\"InsufficientValidatorQuorum\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidCommitSeal\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"expectedValue\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"actualValue\",\"type\":\"bytes32\"}],\"name\":\"InvalidCommitmentValue\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"actualDifficulty\",\"type\":\"uint256\"}],\"name\":\"InvalidDifficulty\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"length\",\"type\":\"uint256\"}],\"name\":\"InvalidECDSASignatureLength\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"itemsLength\",\"type\":\"uint256\"}],\"name\":\"InvalidExtraDataFormat\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"itemsLength\",\"type\":\"uint256\"}],\"name\":\"InvalidHeaderFormat\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidHeaderHeight\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"actualMixHash\",\"type\":\"bytes32\"}],\"name\":\"InvalidMixHash\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"actualNonce\",\"type\":\"bytes\"}],\"name\":\"InvalidNonce\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"actualOmmersHash\",\"type\":\"bytes32\"}],\"name\":\"InvalidOmmersHash\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"expectedLength\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"actualLength\",\"type\":\"uint256\"}],\"name\":\"InvalidPathLength\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"providedRevisionNumber\",\"type\":\"uint64\"}],\"name\":\"InvalidRevisionNumber\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"validator\",\"type\":\"address\"}],\"name\":\"InvalidValidatorAddress\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"length\",\"type\":\"uint256\"}],\"name\":\"InvalidValidatorAddressLength\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"expectedLength\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"actualLength\",\"type\":\"uint256\"}],\"name\":\"InvalidValueLength\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"UnsupportedMisbehaviour\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"actualValue\",\"type\":\"bytes32\"}],\"name\":\"ValueExists\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"previousAdminRole\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"newAdminRole\",\"type\":\"bytes32\"}],\"name\":\"RoleAdminChanged\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"RoleGranted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"RoleRevoked\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"DEFAULT_ADMIN_ROLE\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"PROOF_SUBMITTER_ROLE\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getClientState\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"revisionHeight\",\"type\":\"uint64\"}],\"name\":\"getConsensusState\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"}],\"name\":\"getRoleAdmin\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"grantRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"hasRole\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"name\":\"misbehaviour\",\"outputs\":[],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"callerConfirmation\",\"type\":\"address\"}],\"name\":\"renounceRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"revokeRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes4\",\"name\":\"interfaceId\",\"type\":\"bytes4\"}],\"name\":\"supportsInterface\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"updateMsg\",\"type\":\"bytes\"}],\"name\":\"updateClient\",\"outputs\":[{\"internalType\":\"enum ILightClientMsgs.UpdateResult\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes\",\"name\":\"proof\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"uint64\",\"name\":\"revisionNumber\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"revisionHeight\",\"type\":\"uint64\"}],\"internalType\":\"struct IICS02ClientMsgs.Height\",\"name\":\"proofHeight\",\"type\":\"tuple\"},{\"internalType\":\"bytes[]\",\"name\":\"path\",\"type\":\"bytes[]\"},{\"internalType\":\"bytes\",\"name\":\"value\",\"type\":\"bytes\"}],\"internalType\":\"struct ILightClientMsgs.MsgVerifyMembership\",\"name\":\"msg_\",\"type\":\"tuple\"}],\"name\":\"verifyMembership\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes\",\"name\":\"proof\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"uint64\",\"name\":\"revisionNumber\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"revisionHeight\",\"type\":\"uint64\"}],\"internalType\":\"struct IICS02ClientMsgs.Height\",\"name\":\"proofHeight\",\"type\":\"tuple\"},{\"internalType\":\"bytes[]\",\"name\":\"path\",\"type\":\"bytes[]\"}],\"internalType\":\"struct ILightClientMsgs.MsgVerifyNonMembership\",\"name\":\"msg_\",\"type\":\"tuple\"}],\"name\":\"verifyNonMembership\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"errors\":{\"AccessControlBadConfirmation()\":[{\"details\":\"The caller of a function is not the expected one. NOTE: Don't confuse with {AccessControlUnauthorizedAccount}.\"}],\"AccessControlUnauthorizedAccount(address,bytes32)\":[{\"details\":\"The `account` is missing a role.\"}],\"ConflictingConsensusState(uint64)\":[{\"params\":{\"revisionHeight\":\"The conflicting revision height.\"}}],\"ConsensusStateExpired(uint64,uint256,uint64)\":[{\"params\":{\"currentTimestamp\":\"The current block timestamp.\",\"trustedTimestamp\":\"Timestamp of the trusted consensus state.\",\"trustingPeriod\":\"The configured trusting period.\"}}],\"ConsensusStateNotFound(uint64)\":[{\"params\":{\"revisionHeight\":\"The requested revision height.\"}}],\"DuplicateCommitSealSigner(address)\":[{\"params\":{\"signer\":\"The duplicate signer address.\"}}],\"DuplicateValidator(address)\":[{\"params\":{\"validator\":\"The duplicate validator address.\"}}],\"HeaderFromFuture(uint256,uint256,uint256)\":[{\"params\":{\"currentTimestamp\":\"The current block timestamp.\",\"headerTimestamp\":\"The submitted header timestamp.\",\"maxClockDrift\":\"The configured maximum clock drift.\"}}],\"InsufficientTrustedValidatorOverlap(uint256,uint256)\":[{\"params\":{\"actual\":\"The number of trusted validators that signed.\",\"required\":\"The minimum required trusted signer count.\"}}],\"InsufficientValidatorQuorum(uint256,uint256)\":[{\"params\":{\"actual\":\"The number of new validators that signed.\",\"required\":\"The minimum required signer count.\"}}],\"InvalidCommitmentValue(bytes32,bytes32)\":[{\"params\":{\"actualValue\":\"The proven commitment value.\",\"expectedValue\":\"The expected commitment value.\"}}],\"InvalidDifficulty(uint256)\":[{\"params\":{\"actualDifficulty\":\"The difficulty found in the header.\"}}],\"InvalidECDSASignatureLength(uint256)\":[{\"params\":{\"length\":\"The invalid signature length.\"}}],\"InvalidExtraDataFormat(uint256)\":[{\"params\":{\"itemsLength\":\"The decoded `extraData` item count.\"}}],\"InvalidHeaderFormat(uint256)\":[{\"params\":{\"itemsLength\":\"The decoded header item count.\"}}],\"InvalidMixHash(bytes32)\":[{\"params\":{\"actualMixHash\":\"The mix hash found in the header.\"}}],\"InvalidNonce(bytes)\":[{\"params\":{\"actualNonce\":\"The nonce found in the header.\"}}],\"InvalidOmmersHash(bytes32)\":[{\"params\":{\"actualOmmersHash\":\"The ommers hash found in the header.\"}}],\"InvalidPathLength(uint256,uint256)\":[{\"params\":{\"actualLength\":\"The actual path length.\",\"expectedLength\":\"The expected path length.\"}}],\"InvalidRevisionNumber(uint64)\":[{\"params\":{\"providedRevisionNumber\":\"The non-zero revision number.\"}}],\"InvalidValidatorAddress(address)\":[{\"params\":{\"validator\":\"The invalid validator address.\"}}],\"InvalidValidatorAddressLength(uint256)\":[{\"params\":{\"length\":\"The decoded validator address length.\"}}],\"InvalidValueLength(uint256,uint256)\":[{\"params\":{\"actualLength\":\"The actual value length.\",\"expectedLength\":\"The expected value length.\"}}],\"ValueExists(bytes32)\":[{\"params\":{\"actualValue\":\"The value found at the proven storage slot.\"}}]},\"events\":{\"RoleAdminChanged(bytes32,bytes32,bytes32)\":{\"details\":\"Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite {RoleAdminChanged} not being emitted to signal this.\"},\"RoleGranted(bytes32,address,address)\":{\"details\":\"Emitted when `account` is granted `role`. `sender` is the account that originated the contract call. This account bears the admin role (for the granted role). Expected in cases where the role was granted using the internal {AccessControl-_grantRole}.\"},\"RoleRevoked(bytes32,address,address)\":{\"details\":\"Emitted when `account` is revoked `role`. `sender` is the account that originated the contract call: - if using `revokeRole`, it is the admin role bearer - if using `renounceRole`, it is the role bearer (i.e. `account`)\"}},\"kind\":\"dev\",\"methods\":{\"constructor\":{\"params\":{\"ibcRouter\":\"Counterparty ICS26 router address whose storage is proven.\",\"initialTrustedHeight\":\"Initial trusted Besu height.\",\"initialTrustedStorageRoot\":\"Initial trusted storage root of `ibcRouter`.\",\"initialTrustedTimestamp\":\"Initial trusted header timestamp in seconds.\",\"initialTrustedValidators\":\"Initial trusted validator set.\",\"maxClockDrift\":\"Maximum allowed future drift in seconds for submitted headers.\",\"roleManager\":\"Address that administers proof submission; if zero, proof submission is open.\",\"trustingPeriod\":\"Maximum age in seconds for trusted consensus states.\"}},\"getClientState()\":{\"returns\":{\"_0\":\"The client state.\"}},\"getConsensusState(uint64)\":{\"params\":{\"revisionHeight\":\"The revision height to query.\"},\"returns\":{\"_0\":\"The ABI-encoded consensus state.\"}},\"getRoleAdmin(bytes32)\":{\"details\":\"Returns the admin role that controls `role`. See {grantRole} and {revokeRole}. To change a role's admin, use {_setRoleAdmin}.\"},\"grantRole(bytes32,address)\":{\"details\":\"Grants `role` to `account`. If `account` had not been already granted `role`, emits a {RoleGranted} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleGranted} event.\"},\"hasRole(bytes32,address)\":{\"details\":\"Returns `true` if `account` has been granted `role`.\"},\"misbehaviour(bytes)\":{\"params\":{\"misbehaviourMsg\":\"The misbehaviour message\"}},\"renounceRole(bytes32,address)\":{\"details\":\"Revokes `role` from the calling account. Roles are often managed via {grantRole} and {revokeRole}: this function's purpose is to provide a mechanism for accounts to lose their privileges if they are compromised (such as when a trusted device is misplaced). If the calling account had been revoked `role`, emits a {RoleRevoked} event. Requirements: - the caller must be `callerConfirmation`. May emit a {RoleRevoked} event.\"},\"revokeRole(bytes32,address)\":{\"details\":\"Revokes `role` from `account`. If `account` had been granted `role`, emits a {RoleRevoked} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleRevoked} event.\"},\"supportsInterface(bytes4)\":{\"details\":\"Returns true if this contract implements the interface defined by `interfaceId`. See the corresponding https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[ERC section] to learn more about how these ids are created. This function call must use less than 30 000 gas.\"},\"updateClient(bytes)\":{\"params\":{\"updateMsg\":\"The encoded update message e.g., an SP1 proof.\"},\"returns\":{\"_0\":\"The result of the update operation\"}},\"verifyMembership((bytes,(uint64,uint64),bytes[],bytes))\":{\"details\":\"Notice that this message is not view, as it may update the client state for caching purposes.\",\"params\":{\"msg_\":\"The membership message\"},\"returns\":{\"_0\":\"The unix timestamp of the verification height in the counterparty chain in seconds.\"}},\"verifyNonMembership((bytes,(uint64,uint64),bytes[]))\":{\"details\":\"Notice that this message is not view, as it may update the client state for caching purposes.\",\"params\":{\"msg_\":\"The membership message\"},\"returns\":{\"_0\":\"The unix timestamp of the verification height in the counterparty chain in seconds.\"}}},\"title\":\"Besu QBFT Light Client\",\"version\":1},\"userdoc\":{\"errors\":{\"ConflictingConsensusState(uint64)\":[{\"notice\":\"A different consensus state already exists at the submitted height.\"}],\"ConsensusStateExpired(uint64,uint256,uint64)\":[{\"notice\":\"The trusted consensus state is outside the trusting period.\"}],\"ConsensusStateNotFound(uint64)\":[{\"notice\":\"No consensus state exists for the requested height.\"}],\"DuplicateCommitSealSigner(address)\":[{\"notice\":\"A commit seal signer appears more than once.\"}],\"DuplicateValidator(address)\":[{\"notice\":\"A validator appears more than once.\"}],\"EmptyValidatorSet()\":[{\"notice\":\"The validator set is empty.\"}],\"HeaderFromFuture(uint256,uint256,uint256)\":[{\"notice\":\"The submitted header timestamp is too far in the future.\"}],\"InsufficientTrustedValidatorOverlap(uint256,uint256)\":[{\"notice\":\"The submitted signers do not overlap enough with the trusted validator set.\"}],\"InsufficientValidatorQuorum(uint256,uint256)\":[{\"notice\":\"The submitted signers do not meet quorum for the new validator set.\"}],\"InvalidCommitSeal()\":[{\"notice\":\"A commit seal did not recover a valid signer.\"}],\"InvalidCommitmentValue(bytes32,bytes32)\":[{\"notice\":\"A proven commitment value does not match the expected value.\"}],\"InvalidDifficulty(uint256)\":[{\"notice\":\"The Besu BFT difficulty is invalid.\"}],\"InvalidECDSASignatureLength(uint256)\":[{\"notice\":\"An ECDSA signature has an invalid length.\"}],\"InvalidExtraDataFormat(uint256)\":[{\"notice\":\"The submitted `extraData` field has an invalid RLP item count.\"}],\"InvalidHeaderFormat(uint256)\":[{\"notice\":\"The submitted header has an invalid RLP item count.\"}],\"InvalidHeaderHeight()\":[{\"notice\":\"The submitted header height is zero.\"}],\"InvalidMixHash(bytes32)\":[{\"notice\":\"The Besu BFT mix hash is invalid.\"}],\"InvalidNonce(bytes)\":[{\"notice\":\"The Besu BFT nonce is invalid.\"}],\"InvalidOmmersHash(bytes32)\":[{\"notice\":\"The ommers hash is invalid.\"}],\"InvalidPathLength(uint256,uint256)\":[{\"notice\":\"A proof path has an invalid length.\"}],\"InvalidRevisionNumber(uint64)\":[{\"notice\":\"The revision number must be zero for Besu light client heights.\"}],\"InvalidValidatorAddress(address)\":[{\"notice\":\"A validator address is invalid.\"}],\"InvalidValidatorAddressLength(uint256)\":[{\"notice\":\"A validator address has an invalid byte length.\"}],\"InvalidValueLength(uint256,uint256)\":[{\"notice\":\"A membership value has an invalid length.\"}],\"UnsupportedMisbehaviour()\":[{\"notice\":\"Misbehaviour handling is not supported by this client.\"}],\"ValueExists(bytes32)\":[{\"notice\":\"A non-membership proof found an existing value.\"}]},\"kind\":\"user\",\"methods\":{\"PROOF_SUBMITTER_ROLE()\":{\"notice\":\"Role allowed to submit client updates and proof verifications.\"},\"constructor\":{\"notice\":\"Creates a Besu QBFT light client from an initial trusted consensus state.\"},\"getClientState()\":{\"notice\":\"Returns the client state.\"},\"getConsensusState(uint64)\":{\"notice\":\"Returns the encoded consensus state for a revision height.\"},\"misbehaviour(bytes)\":{\"notice\":\"Misbehaviour handling, moves the light client to the frozen state if misbehaviour is detected\"},\"updateClient(bytes)\":{\"notice\":\"Updating the client and consensus state\"},\"verifyMembership((bytes,(uint64,uint64),bytes[],bytes))\":{\"notice\":\"Querying the membership of a key-value pair\"},\"verifyNonMembership((bytes,(uint64,uint64),bytes[]))\":{\"notice\":\"Querying the non-membership of a key\"}},\"notice\":\"Verifies Besu QBFT headers and ICS26 router storage proofs.\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/light-clients/besu/BesuQBFTLightClient.sol\":\"BesuQBFTLightClient\"},\"evmVersion\":\"cancun\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"none\"},\"optimizer\":{\"enabled\":true,\"runs\":10000},\"remappings\":[\":@openzeppelin-contracts/=node_modules/@openzeppelin/contracts/\",\":@openzeppelin-upgradeable/=node_modules/@openzeppelin/contracts-upgradeable/\",\":@openzeppelin/=node_modules/@openzeppelin/\",\":@sp1-contracts/=node_modules/sp1-contracts/contracts/src/\",\":@uniswap/permit2/=node_modules/@uniswap/permit2/\",\":forge-std/=node_modules/forge-std/src/\",\":sp1-contracts/=node_modules/sp1-contracts/\"],\"viaIR\":true},\"sources\":{\"contracts/interfaces/ILightClient.sol\":{\"keccak256\":\"0x3b2361546ee834a442d844c979fbad3458ee13146b093f585587a09e19a266af\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://5b5d53101bb598f14a79cb1092479736fa18e8f84945ea6ef80f4dac84466042\",\"dweb:/ipfs/QmaTCo6M3Z9aYCSX65AQtixo1sB4ymQUDAgTXSKHqJHGDh\"]},\"contracts/light-clients/besu/BesuLightClientBase.sol\":{\"keccak256\":\"0xd700a74d5dd85a4dc0432f9fda2e787d78670647417e54416a07af85bb42194a\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://92069fbd0993510316fb3e9eba5dde45316cc6d3fd979c75b3485253709caa88\",\"dweb:/ipfs/QmeuXFNzqe5JYwkZwLBA7LSni4LuQAWgy7t7jbfHXAKNtz\"]},\"contracts/light-clients/besu/BesuQBFTLightClient.sol\":{\"keccak256\":\"0x7fcf75573578ef5c30dfbab335b7a4a400b35f1ad0259bc2bf712d12ffc10ddc\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://623f65bad2a1caaf28e1ecb52f42a73e78d0a04cf7bf88edceea5f225d8cf24b\",\"dweb:/ipfs/QmS6fPmaTh9MmAXQUdYFLjxph5tPynmZ5DmLo2juTa3Qq6\"]},\"contracts/light-clients/besu/MPTProof.sol\":{\"keccak256\":\"0xe79077eef64b0a5901e83174bb0643dd71887d3d1b75a230e3c6d98230fe61a1\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://f828f699316e27a9449c4da03471f8a228c2919e93a5575dd331dfd7278de61b\",\"dweb:/ipfs/QmNzjoyYNyuFqn7tS7HteYhyTKS77iy7QhBwMc1rDDJcPY\"]},\"contracts/light-clients/besu/RLPReader.sol\":{\"keccak256\":\"0xa64ad17e6da7fed2bd206df52189286694339a8061dc5d158e717eda982af1d9\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://7020db2fe854e90e1b791e0e587610fc26bed3073ba1811faa275a1d8bf3c2c7\",\"dweb:/ipfs/QmdXdKghNFZSX7N9qD6BsKuJQdrFoqatsVWvHRL7vJCmeP\"]},\"contracts/light-clients/besu/errors/IBesuLightClientErrors.sol\":{\"keccak256\":\"0x1124e58e906cd3dddf876757393a4e4812170e4ae41da99a1d0b734266ae021b\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://54d7d62a6ef3af5d32eb3c293499f90223a0f349b1475b3dad6af443106041d4\",\"dweb:/ipfs/QmdSJQup9PvvB3hpnWZu3YE2Rh5kTcAs9zGBHsMyAdCKCX\"]},\"contracts/light-clients/besu/msgs/IBesuLightClientMsgs.sol\":{\"keccak256\":\"0x3a903fd7635a040041b94f4e33dc2881c8992bd22acb14cce72aeab074b820be\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://25d72c46f4bf1b6335f1c62c8d55f3e3643a41f75ffba160cb137bed57d7854c\",\"dweb:/ipfs/QmepY12FQmcMned3fbMt1K3mfELZwq9uiMKxS41yLDAxV3\"]},\"contracts/msgs/IICS02ClientMsgs.sol\":{\"keccak256\":\"0x03d1265eae327c3744d774bf22a30d845233d50664921c9aa57cef2d71fd89d2\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://89900781cc5c60540a237d92d42745ea6165765ee8fb4d50e8137a717195cc75\",\"dweb:/ipfs/Qmbx5p8gZ8sEMMeZytXsLee49JUayhAaoJ2yxX93WUrvQo\"]},\"contracts/msgs/ILightClientMsgs.sol\":{\"keccak256\":\"0x8d1e56ab166a7b4aa6999708e3214a4645ebbc3835c2b2a4c255c9923eebafde\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://8bd4200dc04d950c0f050623fa9a8accdbec877fd446c039d4dd6c678bdf1513\",\"dweb:/ipfs/QmZQTViaA7N6BVNDzJ1Z6w799PrPoE4ajPueZSPwX4sGZ9\"]},\"node_modules/@openzeppelin/contracts/access/AccessControl.sol\":{\"keccak256\":\"0x4686ec784d75f95beaf2bf5b5f26e5f946d4c864aaee9c3c62bdc18381f5e017\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://26710ca191913f3c9df542079c4a6dcff02968e92d4f7357daefef9fbe72a19c\",\"dweb:/ipfs/QmanHbeWuBbVEqXySHa1zhm2rExjYpChDBubBaJNTCa2JB\"]},\"node_modules/@openzeppelin/contracts/access/IAccessControl.sol\":{\"keccak256\":\"0xbff9f59c84e5337689161ce7641c0ef8e872d6a7536fbc1f5133f128887aba3c\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://b308f882e796f7b79c9502deacb0a62983035c6f6f4e962b319ba6a1f4a77d3d\",\"dweb:/ipfs/QmaWCW7ahEQqFjwhSUhV7Ae7WhfNvzSpE7DQ58hvEooqPL\"]},\"node_modules/@openzeppelin/contracts/utils/Context.sol\":{\"keccak256\":\"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://6a708e8a5bdb1011c2c381c9a5cfd8a9a956d7d0a9dc1bd8bcdaf52f76ef2f12\",\"dweb:/ipfs/Qmax9WHBnVsZP46ZxEMNRQpLQnrdE4dK8LehML1Py8FowF\"]},\"node_modules/@openzeppelin/contracts/utils/cryptography/ECDSA.sol\":{\"keccak256\":\"0xbeb5cad8aaabe0d35d2ec1a8414d91e81e5a8ca679add4cf57e2f33476861f40\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://ebb272a5ee2da4e8bd5551334e0ce8dce4e9c56a04570d6bf046d260fab3116a\",\"dweb:/ipfs/QmNw6RyM769qcqFocDq6HJMG2WiEnQbvizpRaUXsACHho2\"]},\"node_modules/@openzeppelin/contracts/utils/introspection/ERC165.sol\":{\"keccak256\":\"0x2d9dc2fe26180f74c11c13663647d38e259e45f95eb88f57b61d2160b0109d3e\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://81233d1f98060113d9922180bb0f14f8335856fe9f339134b09335e9f678c377\",\"dweb:/ipfs/QmWh6R35SarhAn4z2wH8SU456jJSYL2FgucfTFgbHJJN4E\"]},\"node_modules/@openzeppelin/contracts/utils/introspection/IERC165.sol\":{\"keccak256\":\"0x8891738ffe910f0cf2da09566928589bf5d63f4524dd734fd9cedbac3274dd5c\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://971f954442df5c2ef5b5ebf1eb245d7105d9fbacc7386ee5c796df1d45b21617\",\"dweb:/ipfs/QmadRjHbkicwqwwh61raUEapaVEtaLMcYbQZWs9gUkgj3u\"]}},\"version\":1}","metadata":{"compiler":{"version":"0.8.28+commit.7893614a"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"address","name":"ibcRouter","type":"address"},{"internalType":"uint64","name":"initialTrustedHeight","type":"uint64"},{"internalType":"uint64","name":"initialTrustedTimestamp","type":"uint64"},{"internalType":"bytes32","name":"initialTrustedStorageRoot","type":"bytes32"},{"internalType":"address[]","name":"initialTrustedValidators","type":"address[]"},{"internalType":"uint64","name":"trustingPeriod","type":"uint64"},{"internalType":"uint64","name":"maxClockDrift","type":"uint64"},{"internalType":"address","name":"roleManager","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"type":"error","name":"AccessControlBadConfirmation"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bytes32","name":"neededRole","type":"bytes32"}],"type":"error","name":"AccessControlUnauthorizedAccount"},{"inputs":[{"internalType":"uint64","name":"revisionHeight","type":"uint64"}],"type":"error","name":"ConflictingConsensusState"},{"inputs":[{"internalType":"uint64","name":"trustedTimestamp","type":"uint64"},{"internalType":"uint256","name":"currentTimestamp","type":"uint256"},{"internalType":"uint64","name":"trustingPeriod","type":"uint64"}],"type":"error","name":"ConsensusStateExpired"},{"inputs":[{"internalType":"uint64","name":"revisionHeight","type":"uint64"}],"type":"error","name":"ConsensusStateNotFound"},{"inputs":[{"internalType":"address","name":"signer","type":"address"}],"type":"error","name":"DuplicateCommitSealSigner"},{"inputs":[{"internalType":"address","name":"validator","type":"address"}],"type":"error","name":"DuplicateValidator"},{"inputs":[],"type":"error","name":"EmptyValidatorSet"},{"inputs":[{"internalType":"uint256","name":"currentTimestamp","type":"uint256"},{"internalType":"uint256","name":"headerTimestamp","type":"uint256"},{"internalType":"uint256","name":"maxClockDrift","type":"uint256"}],"type":"error","name":"HeaderFromFuture"},{"inputs":[{"internalType":"uint256","name":"actual","type":"uint256"},{"internalType":"uint256","name":"required","type":"uint256"}],"type":"error","name":"InsufficientTrustedValidatorOverlap"},{"inputs":[{"internalType":"uint256","name":"actual","type":"uint256"},{"internalType":"uint256","name":"required","type":"uint256"}],"type":"error","name":"InsufficientValidatorQuorum"},{"inputs":[],"type":"error","name":"InvalidCommitSeal"},{"inputs":[{"internalType":"bytes32","name":"expectedValue","type":"bytes32"},{"internalType":"bytes32","name":"actualValue","type":"bytes32"}],"type":"error","name":"InvalidCommitmentValue"},{"inputs":[{"internalType":"uint256","name":"actualDifficulty","type":"uint256"}],"type":"error","name":"InvalidDifficulty"},{"inputs":[{"internalType":"uint256","name":"length","type":"uint256"}],"type":"error","name":"InvalidECDSASignatureLength"},{"inputs":[{"internalType":"uint256","name":"itemsLength","type":"uint256"}],"type":"error","name":"InvalidExtraDataFormat"},{"inputs":[{"internalType":"uint256","name":"itemsLength","type":"uint256"}],"type":"error","name":"InvalidHeaderFormat"},{"inputs":[],"type":"error","name":"InvalidHeaderHeight"},{"inputs":[{"internalType":"bytes32","name":"actualMixHash","type":"bytes32"}],"type":"error","name":"InvalidMixHash"},{"inputs":[{"internalType":"bytes","name":"actualNonce","type":"bytes"}],"type":"error","name":"InvalidNonce"},{"inputs":[{"internalType":"bytes32","name":"actualOmmersHash","type":"bytes32"}],"type":"error","name":"InvalidOmmersHash"},{"inputs":[{"internalType":"uint256","name":"expectedLength","type":"uint256"},{"internalType":"uint256","name":"actualLength","type":"uint256"}],"type":"error","name":"InvalidPathLength"},{"inputs":[{"internalType":"uint64","name":"providedRevisionNumber","type":"uint64"}],"type":"error","name":"InvalidRevisionNumber"},{"inputs":[{"internalType":"address","name":"validator","type":"address"}],"type":"error","name":"InvalidValidatorAddress"},{"inputs":[{"internalType":"uint256","name":"length","type":"uint256"}],"type":"error","name":"InvalidValidatorAddressLength"},{"inputs":[{"internalType":"uint256","name":"expectedLength","type":"uint256"},{"internalType":"uint256","name":"actualLength","type":"uint256"}],"type":"error","name":"InvalidValueLength"},{"inputs":[],"type":"error","name":"UnsupportedMisbehaviour"},{"inputs":[{"internalType":"bytes32","name":"actualValue","type":"bytes32"}],"type":"error","name":"ValueExists"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32","indexed":true},{"internalType":"bytes32","name":"previousAdminRole","type":"bytes32","indexed":true},{"internalType":"bytes32","name":"newAdminRole","type":"bytes32","indexed":true}],"type":"event","name":"RoleAdminChanged","anonymous":false},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32","indexed":true},{"internalType":"address","name":"account","type":"address","indexed":true},{"internalType":"address","name":"sender","type":"address","indexed":true}],"type":"event","name":"RoleGranted","anonymous":false},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32","indexed":true},{"internalType":"address","name":"account","type":"address","indexed":true},{"internalType":"address","name":"sender","type":"address","indexed":true}],"type":"event","name":"RoleRevoked","anonymous":false},{"inputs":[],"stateMutability":"view","type":"function","name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"PROOF_SUBMITTER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"getClientState","outputs":[{"internalType":"bytes","name":"","type":"bytes"}]},{"inputs":[{"internalType":"uint64","name":"revisionHeight","type":"uint64"}],"stateMutability":"view","type":"function","name":"getConsensusState","outputs":[{"internalType":"bytes","name":"","type":"bytes"}]},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"stateMutability":"view","type":"function","name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}]},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"stateMutability":"nonpayable","type":"function","name":"grantRole"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"stateMutability":"view","type":"function","name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}]},{"inputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function","name":"misbehaviour"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"callerConfirmation","type":"address"}],"stateMutability":"nonpayable","type":"function","name":"renounceRole"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"stateMutability":"nonpayable","type":"function","name":"revokeRole"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"stateMutability":"view","type":"function","name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}]},{"inputs":[{"internalType":"bytes","name":"updateMsg","type":"bytes"}],"stateMutability":"nonpayable","type":"function","name":"updateClient","outputs":[{"internalType":"enum ILightClientMsgs.UpdateResult","name":"","type":"uint8"}]},{"inputs":[{"internalType":"struct ILightClientMsgs.MsgVerifyMembership","name":"msg_","type":"tuple","components":[{"internalType":"bytes","name":"proof","type":"bytes"},{"internalType":"struct IICS02ClientMsgs.Height","name":"proofHeight","type":"tuple","components":[{"internalType":"uint64","name":"revisionNumber","type":"uint64"},{"internalType":"uint64","name":"revisionHeight","type":"uint64"}]},{"internalType":"bytes[]","name":"path","type":"bytes[]"},{"internalType":"bytes","name":"value","type":"bytes"}]}],"stateMutability":"view","type":"function","name":"verifyMembership","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[{"internalType":"struct ILightClientMsgs.MsgVerifyNonMembership","name":"msg_","type":"tuple","components":[{"internalType":"bytes","name":"proof","type":"bytes"},{"internalType":"struct IICS02ClientMsgs.Height","name":"proofHeight","type":"tuple","components":[{"internalType":"uint64","name":"revisionNumber","type":"uint64"},{"internalType":"uint64","name":"revisionHeight","type":"uint64"}]},{"internalType":"bytes[]","name":"path","type":"bytes[]"}]}],"stateMutability":"view","type":"function","name":"verifyNonMembership","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]}],"devdoc":{"kind":"dev","methods":{"constructor":{"params":{"ibcRouter":"Counterparty ICS26 router address whose storage is proven.","initialTrustedHeight":"Initial trusted Besu height.","initialTrustedStorageRoot":"Initial trusted storage root of `ibcRouter`.","initialTrustedTimestamp":"Initial trusted header timestamp in seconds.","initialTrustedValidators":"Initial trusted validator set.","maxClockDrift":"Maximum allowed future drift in seconds for submitted headers.","roleManager":"Address that administers proof submission; if zero, proof submission is open.","trustingPeriod":"Maximum age in seconds for trusted consensus states."}},"getClientState()":{"returns":{"_0":"The client state."}},"getConsensusState(uint64)":{"params":{"revisionHeight":"The revision height to query."},"returns":{"_0":"The ABI-encoded consensus state."}},"getRoleAdmin(bytes32)":{"details":"Returns the admin role that controls `role`. See {grantRole} and {revokeRole}. To change a role's admin, use {_setRoleAdmin}."},"grantRole(bytes32,address)":{"details":"Grants `role` to `account`. If `account` had not been already granted `role`, emits a {RoleGranted} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleGranted} event."},"hasRole(bytes32,address)":{"details":"Returns `true` if `account` has been granted `role`."},"misbehaviour(bytes)":{"params":{"misbehaviourMsg":"The misbehaviour message"}},"renounceRole(bytes32,address)":{"details":"Revokes `role` from the calling account. Roles are often managed via {grantRole} and {revokeRole}: this function's purpose is to provide a mechanism for accounts to lose their privileges if they are compromised (such as when a trusted device is misplaced). If the calling account had been revoked `role`, emits a {RoleRevoked} event. Requirements: - the caller must be `callerConfirmation`. May emit a {RoleRevoked} event."},"revokeRole(bytes32,address)":{"details":"Revokes `role` from `account`. If `account` had been granted `role`, emits a {RoleRevoked} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleRevoked} event."},"supportsInterface(bytes4)":{"details":"Returns true if this contract implements the interface defined by `interfaceId`. See the corresponding https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[ERC section] to learn more about how these ids are created. This function call must use less than 30 000 gas."},"updateClient(bytes)":{"params":{"updateMsg":"The encoded update message e.g., an SP1 proof."},"returns":{"_0":"The result of the update operation"}},"verifyMembership((bytes,(uint64,uint64),bytes[],bytes))":{"details":"Notice that this message is not view, as it may update the client state for caching purposes.","params":{"msg_":"The membership message"},"returns":{"_0":"The unix timestamp of the verification height in the counterparty chain in seconds."}},"verifyNonMembership((bytes,(uint64,uint64),bytes[]))":{"details":"Notice that this message is not view, as it may update the client state for caching purposes.","params":{"msg_":"The membership message"},"returns":{"_0":"The unix timestamp of the verification height in the counterparty chain in seconds."}}},"version":1},"userdoc":{"kind":"user","methods":{"PROOF_SUBMITTER_ROLE()":{"notice":"Role allowed to submit client updates and proof verifications."},"constructor":{"notice":"Creates a Besu QBFT light client from an initial trusted consensus state."},"getClientState()":{"notice":"Returns the client state."},"getConsensusState(uint64)":{"notice":"Returns the encoded consensus state for a revision height."},"misbehaviour(bytes)":{"notice":"Misbehaviour handling, moves the light client to the frozen state if misbehaviour is detected"},"updateClient(bytes)":{"notice":"Updating the client and consensus state"},"verifyMembership((bytes,(uint64,uint64),bytes[],bytes))":{"notice":"Querying the membership of a key-value pair"},"verifyNonMembership((bytes,(uint64,uint64),bytes[]))":{"notice":"Querying the non-membership of a key"}},"version":1}},"settings":{"remappings":["@openzeppelin-contracts/=node_modules/@openzeppelin/contracts/","@openzeppelin-upgradeable/=node_modules/@openzeppelin/contracts-upgradeable/","@openzeppelin/=node_modules/@openzeppelin/","@sp1-contracts/=node_modules/sp1-contracts/contracts/src/","@uniswap/permit2/=node_modules/@uniswap/permit2/","forge-std/=node_modules/forge-std/src/","sp1-contracts/=node_modules/sp1-contracts/"],"optimizer":{"enabled":true,"runs":10000},"metadata":{"bytecodeHash":"none"},"compilationTarget":{"contracts/light-clients/besu/BesuQBFTLightClient.sol":"BesuQBFTLightClient"},"evmVersion":"cancun","libraries":{},"viaIR":true},"sources":{"contracts/interfaces/ILightClient.sol":{"keccak256":"0x3b2361546ee834a442d844c979fbad3458ee13146b093f585587a09e19a266af","urls":["bzz-raw://5b5d53101bb598f14a79cb1092479736fa18e8f84945ea6ef80f4dac84466042","dweb:/ipfs/QmaTCo6M3Z9aYCSX65AQtixo1sB4ymQUDAgTXSKHqJHGDh"],"license":"Apache-2.0"},"contracts/light-clients/besu/BesuLightClientBase.sol":{"keccak256":"0xd700a74d5dd85a4dc0432f9fda2e787d78670647417e54416a07af85bb42194a","urls":["bzz-raw://92069fbd0993510316fb3e9eba5dde45316cc6d3fd979c75b3485253709caa88","dweb:/ipfs/QmeuXFNzqe5JYwkZwLBA7LSni4LuQAWgy7t7jbfHXAKNtz"],"license":"MIT"},"contracts/light-clients/besu/BesuQBFTLightClient.sol":{"keccak256":"0x7fcf75573578ef5c30dfbab335b7a4a400b35f1ad0259bc2bf712d12ffc10ddc","urls":["bzz-raw://623f65bad2a1caaf28e1ecb52f42a73e78d0a04cf7bf88edceea5f225d8cf24b","dweb:/ipfs/QmS6fPmaTh9MmAXQUdYFLjxph5tPynmZ5DmLo2juTa3Qq6"],"license":"MIT"},"contracts/light-clients/besu/MPTProof.sol":{"keccak256":"0xe79077eef64b0a5901e83174bb0643dd71887d3d1b75a230e3c6d98230fe61a1","urls":["bzz-raw://f828f699316e27a9449c4da03471f8a228c2919e93a5575dd331dfd7278de61b","dweb:/ipfs/QmNzjoyYNyuFqn7tS7HteYhyTKS77iy7QhBwMc1rDDJcPY"],"license":"Apache-2.0"},"contracts/light-clients/besu/RLPReader.sol":{"keccak256":"0xa64ad17e6da7fed2bd206df52189286694339a8061dc5d158e717eda982af1d9","urls":["bzz-raw://7020db2fe854e90e1b791e0e587610fc26bed3073ba1811faa275a1d8bf3c2c7","dweb:/ipfs/QmdXdKghNFZSX7N9qD6BsKuJQdrFoqatsVWvHRL7vJCmeP"],"license":"Apache-2.0"},"contracts/light-clients/besu/errors/IBesuLightClientErrors.sol":{"keccak256":"0x1124e58e906cd3dddf876757393a4e4812170e4ae41da99a1d0b734266ae021b","urls":["bzz-raw://54d7d62a6ef3af5d32eb3c293499f90223a0f349b1475b3dad6af443106041d4","dweb:/ipfs/QmdSJQup9PvvB3hpnWZu3YE2Rh5kTcAs9zGBHsMyAdCKCX"],"license":"MIT"},"contracts/light-clients/besu/msgs/IBesuLightClientMsgs.sol":{"keccak256":"0x3a903fd7635a040041b94f4e33dc2881c8992bd22acb14cce72aeab074b820be","urls":["bzz-raw://25d72c46f4bf1b6335f1c62c8d55f3e3643a41f75ffba160cb137bed57d7854c","dweb:/ipfs/QmepY12FQmcMned3fbMt1K3mfELZwq9uiMKxS41yLDAxV3"],"license":"MIT"},"contracts/msgs/IICS02ClientMsgs.sol":{"keccak256":"0x03d1265eae327c3744d774bf22a30d845233d50664921c9aa57cef2d71fd89d2","urls":["bzz-raw://89900781cc5c60540a237d92d42745ea6165765ee8fb4d50e8137a717195cc75","dweb:/ipfs/Qmbx5p8gZ8sEMMeZytXsLee49JUayhAaoJ2yxX93WUrvQo"],"license":"Apache-2.0"},"contracts/msgs/ILightClientMsgs.sol":{"keccak256":"0x8d1e56ab166a7b4aa6999708e3214a4645ebbc3835c2b2a4c255c9923eebafde","urls":["bzz-raw://8bd4200dc04d950c0f050623fa9a8accdbec877fd446c039d4dd6c678bdf1513","dweb:/ipfs/QmZQTViaA7N6BVNDzJ1Z6w799PrPoE4ajPueZSPwX4sGZ9"],"license":"Apache-2.0"},"node_modules/@openzeppelin/contracts/access/AccessControl.sol":{"keccak256":"0x4686ec784d75f95beaf2bf5b5f26e5f946d4c864aaee9c3c62bdc18381f5e017","urls":["bzz-raw://26710ca191913f3c9df542079c4a6dcff02968e92d4f7357daefef9fbe72a19c","dweb:/ipfs/QmanHbeWuBbVEqXySHa1zhm2rExjYpChDBubBaJNTCa2JB"],"license":"MIT"},"node_modules/@openzeppelin/contracts/access/IAccessControl.sol":{"keccak256":"0xbff9f59c84e5337689161ce7641c0ef8e872d6a7536fbc1f5133f128887aba3c","urls":["bzz-raw://b308f882e796f7b79c9502deacb0a62983035c6f6f4e962b319ba6a1f4a77d3d","dweb:/ipfs/QmaWCW7ahEQqFjwhSUhV7Ae7WhfNvzSpE7DQ58hvEooqPL"],"license":"MIT"},"node_modules/@openzeppelin/contracts/utils/Context.sol":{"keccak256":"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2","urls":["bzz-raw://6a708e8a5bdb1011c2c381c9a5cfd8a9a956d7d0a9dc1bd8bcdaf52f76ef2f12","dweb:/ipfs/Qmax9WHBnVsZP46ZxEMNRQpLQnrdE4dK8LehML1Py8FowF"],"license":"MIT"},"node_modules/@openzeppelin/contracts/utils/cryptography/ECDSA.sol":{"keccak256":"0xbeb5cad8aaabe0d35d2ec1a8414d91e81e5a8ca679add4cf57e2f33476861f40","urls":["bzz-raw://ebb272a5ee2da4e8bd5551334e0ce8dce4e9c56a04570d6bf046d260fab3116a","dweb:/ipfs/QmNw6RyM769qcqFocDq6HJMG2WiEnQbvizpRaUXsACHho2"],"license":"MIT"},"node_modules/@openzeppelin/contracts/utils/introspection/ERC165.sol":{"keccak256":"0x2d9dc2fe26180f74c11c13663647d38e259e45f95eb88f57b61d2160b0109d3e","urls":["bzz-raw://81233d1f98060113d9922180bb0f14f8335856fe9f339134b09335e9f678c377","dweb:/ipfs/QmWh6R35SarhAn4z2wH8SU456jJSYL2FgucfTFgbHJJN4E"],"license":"MIT"},"node_modules/@openzeppelin/contracts/utils/introspection/IERC165.sol":{"keccak256":"0x8891738ffe910f0cf2da09566928589bf5d63f4524dd734fd9cedbac3274dd5c","urls":["bzz-raw://971f954442df5c2ef5b5ebf1eb245d7105d9fbacc7386ee5c796df1d45b21617","dweb:/ipfs/QmadRjHbkicwqwwh61raUEapaVEtaLMcYbQZWs9gUkgj3u"],"license":"MIT"}},"version":1},"id":36} \ No newline at end of file diff --git a/ibc-solidity/contracts/light-clients/besu/BesuLightClientBase.sol b/ibc-solidity/contracts/light-clients/besu/BesuLightClientBase.sol index 20021f748..898f59f97 100644 --- a/ibc-solidity/contracts/light-clients/besu/BesuLightClientBase.sol +++ b/ibc-solidity/contracts/light-clients/besu/BesuLightClientBase.sol @@ -392,7 +392,8 @@ abstract contract BesuLightClientBase is ILightClient, IBesuLightClientErrors, I } } - uint256 required = validators.length * 2 / 3 + 1; + // Besu requires ceil(2n / 3), equivalently n - floor(n / 3). + uint256 required = validators.length - validators.length / 3; if (actual < required) { revert InsufficientValidatorQuorum(actual, required); } diff --git a/ibc-solidity/test/besu-bft/BesuLightClientQuorum.t.sol b/ibc-solidity/test/besu-bft/BesuLightClientQuorum.t.sol new file mode 100644 index 000000000..a240df0ba --- /dev/null +++ b/ibc-solidity/test/besu-bft/BesuLightClientQuorum.t.sol @@ -0,0 +1,45 @@ +// SPDX-License-Identifier: Apache-2.0 +pragma solidity ^0.8.28; + +import { Test } from "forge-std/Test.sol"; + +import { BesuLightClientBase } from "../../contracts/light-clients/besu/BesuLightClientBase.sol"; +import { IBesuLightClientErrors } from "../../contracts/light-clients/besu/errors/IBesuLightClientErrors.sol"; + +contract BesuLightClientQuorumHarness is BesuLightClientBase { + constructor(address[] memory initialValidators) + BesuLightClientBase(address(1), 1, 1, bytes32(0), initialValidators, 0, 0, address(0)) + { } + + function checkValidatorQuorum(address[] calldata signers, address[] calldata validators) external pure { + _checkValidatorQuorum(signers, validators); + } + + function _commitSealDigest(ParsedHeader memory) internal pure override returns (bytes32) { + return bytes32(0); + } +} + +contract BesuLightClientQuorumTest is Test { + BesuLightClientQuorumHarness private harness; + + function setUp() public { + harness = new BesuLightClientQuorumHarness(_addresses(1)); + } + + function test_checkValidatorQuorum_acceptsBesuFourOfSixQuorum() public view { + harness.checkValidatorQuorum(_addresses(4), _addresses(6)); + } + + function test_checkValidatorQuorum_rejectsThreeOfSixValidators() public { + vm.expectRevert(abi.encodeWithSelector(IBesuLightClientErrors.InsufficientValidatorQuorum.selector, 3, 4)); + harness.checkValidatorQuorum(_addresses(3), _addresses(6)); + } + + function _addresses(uint256 length) private pure returns (address[] memory addresses) { + addresses = new address[](length); + for (uint256 i = 0; i < length; ++i) { + addresses[i] = address(uint160(i + 1)); + } + } +} From ce2f05e4e32287329a3e3c40c0c42abaebcac62b Mon Sep 17 00:00:00 2001 From: Gjermund Garaba Date: Thu, 20 Aug 2026 20:07:49 +0200 Subject: [PATCH 04/22] fix(besu): address CI validation failures Signed-off-by: Gjermund Garaba --- e2e/interchaintestv8/besu_qbft_test.go | 5 +++- e2e/interchaintestv8/besu_to_besu_test.go | 9 ++++--- e2e/interchaintestv8/chainconfig/besu_qbft.go | 24 ++++++++++------- .../testdata/besu/qbft/docker-compose.yml | 10 +++++++ e2e/interchaintestv8/ethereum/proof.go | 2 ++ e2e/interchaintestv8/types/besu_fixtures.go | 5 +++- e2e/interchaintestv8/types/erc20/contract.go | 4 +++ .../abi/bytecode/AttestationLightClient.json | 2 +- .../abi/bytecode/BesuIBFT2LightClient.json | 2 +- .../abi/bytecode/BesuQBFTLightClient.json | 2 +- .../abi/bytecode/DummyLightClient.json | 2 +- .../abi/bytecode/SP1ICS07Tendermint.json | 2 +- .../besu/BesuIBFT2LightClient.sol | 2 +- .../besu/BesuLightClientBase.sol | 12 ++++----- .../besu/BesuQBFTLightClient.sol | 2 +- .../contracts/light-clients/besu/MPTProof.sol | 2 +- .../besu/errors/IBesuLightClientErrors.sol | 2 +- .../besu/msgs/IBesuLightClientMsgs.sol | 2 +- .../light-clients/dummy/DummyLightClient.sol | 2 +- .../test/besu-bft/BesuIBFT2LightClient.t.sol | 2 +- .../test/besu-bft/BesuLightClientTestBase.sol | 2 +- .../test/besu-bft/BesuQBFTLightClient.t.sol | 2 +- .../test/dummy-lc/DummyLightClientTest.t.sol | 2 +- packages/go-abigen/attestation/contract.go | 4 +++ packages/go-abigen/dummy/contract.go | 26 +++++++++++++++++++ packages/go-abigen/erc1967proxy/contract.go | 4 +++ packages/go-abigen/evmiftsendcall/contract.go | 4 +++ packages/go-abigen/ibcerc20/contract.go | 4 +++ packages/go-abigen/ics20transfer/contract.go | 4 +++ packages/go-abigen/ics26router/contract.go | 4 +++ packages/go-abigen/ics27account/contract.go | 4 +++ packages/go-abigen/ics27gmp/contract.go | 4 +++ packages/go-abigen/ift/contract.go | 4 +++ packages/go-abigen/relayerhelper/contract.go | 4 +++ .../go-abigen/sp1ics07tendermint/contract.go | 4 +++ .../proof-api/modules/besu-to-besu/src/lib.rs | 2 ++ .../modules/besu-to-besu/src/tx_builder.rs | 18 +++++++------ .../modules/evmdummy-to-evmdummy/src/lib.rs | 2 ++ .../evmdummy-to-evmdummy/src/tx_builder.rs | 10 ++++--- packages/solidity/src/besu.rs | 12 +++++++-- packages/solidity/src/dummy.rs | 7 ++++- packages/solidity/src/msgs.rs | 4 ++- 42 files changed, 174 insertions(+), 52 deletions(-) diff --git a/e2e/interchaintestv8/besu_qbft_test.go b/e2e/interchaintestv8/besu_qbft_test.go index 26b92f169..daa132e7e 100644 --- a/e2e/interchaintestv8/besu_qbft_test.go +++ b/e2e/interchaintestv8/besu_qbft_test.go @@ -1,3 +1,5 @@ +// SPDX-License-Identifier: Apache-2.0 + package main import ( @@ -5,9 +7,10 @@ import ( "os" "testing" - ethcommon "github.com/ethereum/go-ethereum/common" "github.com/stretchr/testify/require" + ethcommon "github.com/ethereum/go-ethereum/common" + interchaintest "github.com/cosmos/interchaintest/v11" "github.com/srdtrk/solidity-ibc-eureka/e2e/v8/chainconfig" diff --git a/e2e/interchaintestv8/besu_to_besu_test.go b/e2e/interchaintestv8/besu_to_besu_test.go index dd70c3aff..9e0538528 100644 --- a/e2e/interchaintestv8/besu_to_besu_test.go +++ b/e2e/interchaintestv8/besu_to_besu_test.go @@ -1,3 +1,5 @@ +// SPDX-License-Identifier: Apache-2.0 + package main import ( @@ -12,9 +14,6 @@ import ( "testing" "time" - sdkmath "cosmossdk.io/math" - - "github.com/cosmos/interchaintest/v11/testutil" "github.com/stretchr/testify/suite" "github.com/ethereum/go-ethereum/accounts/abi/bind" @@ -22,6 +21,10 @@ import ( ethtypes "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/crypto" + sdkmath "cosmossdk.io/math" + + "github.com/cosmos/interchaintest/v11/testutil" + "github.com/cosmos/solidity-ibc-eureka/packages/go-abigen/ibcerc20" "github.com/cosmos/solidity-ibc-eureka/packages/go-abigen/ics20transfer" "github.com/cosmos/solidity-ibc-eureka/packages/go-abigen/ics26router" diff --git a/e2e/interchaintestv8/chainconfig/besu_qbft.go b/e2e/interchaintestv8/chainconfig/besu_qbft.go index 0958813a9..6d4c5afb4 100644 --- a/e2e/interchaintestv8/chainconfig/besu_qbft.go +++ b/e2e/interchaintestv8/chainconfig/besu_qbft.go @@ -1,3 +1,5 @@ +// SPDX-License-Identifier: Apache-2.0 + package chainconfig import ( @@ -16,13 +18,13 @@ import ( dockernetwork "github.com/docker/docker/api/types/network" dockerclient "github.com/moby/moby/client" + "github.com/testcontainers/testcontainers-go/modules/compose" + "github.com/testcontainers/testcontainers-go/wait" "github.com/ethereum/go-ethereum/common" ethtypes "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/crypto" "github.com/ethereum/go-ethereum/ethclient" - "github.com/testcontainers/testcontainers-go/modules/compose" - "github.com/testcontainers/testcontainers-go/wait" "github.com/cosmos/interchaintest/v11/testutil" @@ -110,6 +112,9 @@ func SpinUpBesuQBFT(ctx context.Context, params BesuQBFTParams) (chain BesuQBFTC if err := stack. WaitForService("validator1", wait.ForListeningPort("8545/tcp")). Up(ctx, compose.Wait(true)); err != nil { + if logErr := chain.DumpLogs(context.Background()); logErr != nil { + fmt.Printf("failed to dump besu qbft logs after startup error: %v\n", logErr) + } return BesuQBFTChain{}, fmt.Errorf("start besu qbft compose stack: %w", err) } @@ -210,12 +215,9 @@ func materializeBesuQBFTAssets(dst string) error { return err } - mode := os.FileMode(0o644) - if filepath.Base(path) == "key" || strings.HasPrefix(path, "keys/") { - mode = 0o600 - } - - return os.WriteFile(target, contents, mode) + // The test keys are mounted read-only and must remain readable by the + // unprivileged Besu user inside the container. + return os.WriteFile(target, contents, 0o644) //nolint:gosec }) } @@ -242,7 +244,8 @@ func patchBesuQBFTGenesis(path string, chainID uint64) error { } updated = append(updated, '\n') - return os.WriteFile(path, updated, 0o644) + // Besu reads the generated genesis file as an unprivileged container user. + return os.WriteFile(path, updated, 0o644) //nolint:gosec } func patchBesuQBFTCompose(path string, params BesuQBFTParams) error { @@ -260,7 +263,8 @@ func patchBesuQBFTCompose(path string, params BesuQBFTParams) error { defaultBesuQBFTValidatorIPs[3], params.ValidatorIPs[3], ) - return os.WriteFile(path, []byte(replacer.Replace(string(contents))), 0o644) + // Docker Compose reads this generated configuration outside the Go process. + return os.WriteFile(path, []byte(replacer.Replace(string(contents))), 0o644) //nolint:gosec } func connectBesuQBFTToInterchainNetwork(ctx context.Context, interchainNetworkID, containerID, alias string) error { diff --git a/e2e/interchaintestv8/chainconfig/testdata/besu/qbft/docker-compose.yml b/e2e/interchaintestv8/chainconfig/testdata/besu/qbft/docker-compose.yml index 39d6da379..69587a47d 100644 --- a/e2e/interchaintestv8/chainconfig/testdata/besu/qbft/docker-compose.yml +++ b/e2e/interchaintestv8/chainconfig/testdata/besu/qbft/docker-compose.yml @@ -1,6 +1,10 @@ +# SPDX-License-Identifier: Apache-2.0 + services: validator1: image: hyperledger/besu:26.4.0 + environment: + BESU_OPTS: -Xms128m -Xmx512m -XX:ActiveProcessorCount=2 command: - --config-file=/opt/besu/config.toml - --identity=validator1 @@ -19,6 +23,8 @@ services: validator2: image: hyperledger/besu:26.4.0 + environment: + BESU_OPTS: -Xms128m -Xmx512m -XX:ActiveProcessorCount=2 command: - --config-file=/opt/besu/config.toml - --identity=validator2 @@ -36,6 +42,8 @@ services: validator3: image: hyperledger/besu:26.4.0 + environment: + BESU_OPTS: -Xms128m -Xmx512m -XX:ActiveProcessorCount=2 command: - --config-file=/opt/besu/config.toml - --identity=validator3 @@ -53,6 +61,8 @@ services: validator4: image: hyperledger/besu:26.4.0 + environment: + BESU_OPTS: -Xms128m -Xmx512m -XX:ActiveProcessorCount=2 command: - --config-file=/opt/besu/config.toml - --identity=validator4 diff --git a/e2e/interchaintestv8/ethereum/proof.go b/e2e/interchaintestv8/ethereum/proof.go index da9659eaa..daad149e4 100644 --- a/e2e/interchaintestv8/ethereum/proof.go +++ b/e2e/interchaintestv8/ethereum/proof.go @@ -1,3 +1,5 @@ +// SPDX-License-Identifier: Apache-2.0 + package ethereum import ( diff --git a/e2e/interchaintestv8/types/besu_fixtures.go b/e2e/interchaintestv8/types/besu_fixtures.go index 4c6f2e197..37de22383 100644 --- a/e2e/interchaintestv8/types/besu_fixtures.go +++ b/e2e/interchaintestv8/types/besu_fixtures.go @@ -1,3 +1,5 @@ +// SPDX-License-Identifier: Apache-2.0 + package types import ( @@ -114,7 +116,8 @@ func (g *BesuFixtureGenerator) GenerateAndSaveQBFTFixture(ctx context.Context, p } fixturePath := filepath.Join(testvalues.BesuBFTFixturesDir, "qbft.json") - return os.WriteFile(fixturePath, fixtureBz, 0o644) + // The checked-in fixture is intentionally readable by all test processes. + return os.WriteFile(fixturePath, fixtureBz, 0o644) //nolint:gosec } func generateQBFTFixture(ctx context.Context, params GenerateQBFTFixtureParams) (besuFixture, error) { diff --git a/e2e/interchaintestv8/types/erc20/contract.go b/e2e/interchaintestv8/types/erc20/contract.go index bae0ad8f9..08d69b7ef 100644 --- a/e2e/interchaintestv8/types/erc20/contract.go +++ b/e2e/interchaintestv8/types/erc20/contract.go @@ -4,9 +4,11 @@ package erc20 import ( + "context" "errors" "math/big" "strings" + "time" ethereum "github.com/ethereum/go-ethereum" "github.com/ethereum/go-ethereum/accounts/abi" @@ -27,6 +29,8 @@ var ( _ = types.BloomLookup _ = event.NewSubscription _ = abi.ConvertType + _ = time.Tick + _ = context.Background ) // ContractMetaData contains all meta data concerning the Contract contract. diff --git a/ibc-solidity/abi/bytecode/AttestationLightClient.json b/ibc-solidity/abi/bytecode/AttestationLightClient.json index a0dcee21f..0931c919a 100644 --- a/ibc-solidity/abi/bytecode/AttestationLightClient.json +++ b/ibc-solidity/abi/bytecode/AttestationLightClient.json @@ -1 +1 @@ -{"abi":[{"type":"constructor","inputs":[{"name":"attestorAddresses","type":"address[]","internalType":"address[]"},{"name":"minRequiredSigs","type":"uint8","internalType":"uint8"},{"name":"initialHeight","type":"uint64","internalType":"uint64"},{"name":"initialTimestampSeconds","type":"uint64","internalType":"uint64"},{"name":"roleManager","type":"address","internalType":"address"}],"stateMutability":"nonpayable"},{"type":"function","name":"DEFAULT_ADMIN_ROLE","inputs":[],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"type":"function","name":"PROOF_SUBMITTER_ROLE","inputs":[],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"type":"function","name":"getAttestationSet","inputs":[],"outputs":[{"name":"attestorAddresses","type":"address[]","internalType":"address[]"},{"name":"minRequiredSigs","type":"uint8","internalType":"uint8"}],"stateMutability":"view"},{"type":"function","name":"getClientState","inputs":[],"outputs":[{"name":"","type":"bytes","internalType":"bytes"}],"stateMutability":"view"},{"type":"function","name":"getConsensusTimestamp","inputs":[{"name":"revisionHeight","type":"uint64","internalType":"uint64"}],"outputs":[{"name":"","type":"uint64","internalType":"uint64"}],"stateMutability":"view"},{"type":"function","name":"getRoleAdmin","inputs":[{"name":"role","type":"bytes32","internalType":"bytes32"}],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"type":"function","name":"grantRole","inputs":[{"name":"role","type":"bytes32","internalType":"bytes32"},{"name":"account","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"hasRole","inputs":[{"name":"role","type":"bytes32","internalType":"bytes32"},{"name":"account","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"misbehaviour","inputs":[{"name":"","type":"bytes","internalType":"bytes"}],"outputs":[],"stateMutability":"view"},{"type":"function","name":"renounceRole","inputs":[{"name":"role","type":"bytes32","internalType":"bytes32"},{"name":"callerConfirmation","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"revokeRole","inputs":[{"name":"role","type":"bytes32","internalType":"bytes32"},{"name":"account","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"supportsInterface","inputs":[{"name":"interfaceId","type":"bytes4","internalType":"bytes4"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"updateClient","inputs":[{"name":"updateMsg","type":"bytes","internalType":"bytes"}],"outputs":[{"name":"","type":"uint8","internalType":"enum ILightClientMsgs.UpdateResult"}],"stateMutability":"nonpayable"},{"type":"function","name":"verifyMembership","inputs":[{"name":"msg_","type":"tuple","internalType":"struct ILightClientMsgs.MsgVerifyMembership","components":[{"name":"proof","type":"bytes","internalType":"bytes"},{"name":"proofHeight","type":"tuple","internalType":"struct IICS02ClientMsgs.Height","components":[{"name":"revisionNumber","type":"uint64","internalType":"uint64"},{"name":"revisionHeight","type":"uint64","internalType":"uint64"}]},{"name":"path","type":"bytes[]","internalType":"bytes[]"},{"name":"value","type":"bytes","internalType":"bytes"}]}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"verifyNonMembership","inputs":[{"name":"msg_","type":"tuple","internalType":"struct ILightClientMsgs.MsgVerifyNonMembership","components":[{"name":"proof","type":"bytes","internalType":"bytes"},{"name":"proofHeight","type":"tuple","internalType":"struct IICS02ClientMsgs.Height","components":[{"name":"revisionNumber","type":"uint64","internalType":"uint64"},{"name":"revisionHeight","type":"uint64","internalType":"uint64"}]},{"name":"path","type":"bytes[]","internalType":"bytes[]"}]}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"event","name":"RoleAdminChanged","inputs":[{"name":"role","type":"bytes32","indexed":true,"internalType":"bytes32"},{"name":"previousAdminRole","type":"bytes32","indexed":true,"internalType":"bytes32"},{"name":"newAdminRole","type":"bytes32","indexed":true,"internalType":"bytes32"}],"anonymous":false},{"type":"event","name":"RoleGranted","inputs":[{"name":"role","type":"bytes32","indexed":true,"internalType":"bytes32"},{"name":"account","type":"address","indexed":true,"internalType":"address"},{"name":"sender","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"type":"event","name":"RoleRevoked","inputs":[{"name":"role","type":"bytes32","indexed":true,"internalType":"bytes32"},{"name":"account","type":"address","indexed":true,"internalType":"address"},{"name":"sender","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"type":"error","name":"AccessControlBadConfirmation","inputs":[]},{"type":"error","name":"AccessControlUnauthorizedAccount","inputs":[{"name":"account","type":"address","internalType":"address"},{"name":"neededRole","type":"bytes32","internalType":"bytes32"}]},{"type":"error","name":"BadQuorum","inputs":[{"name":"minRequired","type":"uint8","internalType":"uint8"},{"name":"attestationCount","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"ConsensusTimestampNotFound","inputs":[{"name":"height","type":"uint64","internalType":"uint64"}]},{"type":"error","name":"DuplicateSigner","inputs":[{"name":"signer","type":"address","internalType":"address"}]},{"type":"error","name":"ECDSAInvalidSignature","inputs":[]},{"type":"error","name":"ECDSAInvalidSignatureLength","inputs":[{"name":"length","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"ECDSAInvalidSignatureS","inputs":[{"name":"s","type":"bytes32","internalType":"bytes32"}]},{"type":"error","name":"EmptyPackets","inputs":[]},{"type":"error","name":"EmptySignatures","inputs":[]},{"type":"error","name":"EmptyValue","inputs":[]},{"type":"error","name":"FeatureNotSupported","inputs":[]},{"type":"error","name":"FrozenClientState","inputs":[]},{"type":"error","name":"HeightMismatch","inputs":[{"name":"expected","type":"uint64","internalType":"uint64"},{"name":"provided","type":"uint64","internalType":"uint64"}]},{"type":"error","name":"InvalidPathLength","inputs":[{"name":"expectedLength","type":"uint256","internalType":"uint256"},{"name":"providedLength","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"InvalidSignatureLength","inputs":[{"name":"signature","type":"bytes","internalType":"bytes"}]},{"type":"error","name":"InvalidState","inputs":[{"name":"height","type":"uint64","internalType":"uint64"},{"name":"timestamp","type":"uint64","internalType":"uint64"}]},{"type":"error","name":"NoAttestors","inputs":[]},{"type":"error","name":"NotMember","inputs":[]},{"type":"error","name":"NotNonMember","inputs":[]},{"type":"error","name":"SignatureInvalid","inputs":[{"name":"signature","type":"bytes","internalType":"bytes"}]},{"type":"error","name":"ThresholdNotMet","inputs":[{"name":"validSigners","type":"uint256","internalType":"uint256"},{"name":"minRequired","type":"uint8","internalType":"uint8"}]},{"type":"error","name":"UnknownSigner","inputs":[{"name":"signer","type":"address","internalType":"address"}]}],"bytecode":{"object":"0x60806040523461032d57611f568038038061001981610349565b928339810160a08282031261032d5781516001600160401b03811161032d57820181601f8201121561032d578051916001600160401b0383116102c8578260051b916020610068818501610349565b8095815201906020829482010192831161032d57602001905b8282106103315750505060208301519260ff841680940361032d576100a860408201610382565b6100c060806100b960608501610382565b930161036e565b9284511561031e57851515806102f2575b855190156102dc575060405195608087016001600160401b038111888210176102c857604052858752602087019081526060604088019360018060401b03169788855201915f835286519060018060401b0382116102c8576801000000000000000082116102c85760015482600155808310610284575b5060015f5260205f205f5b838110610267575050505060ff90511669ff00000000000000000060025493610100600160481b03905160081b169251151560481b169260018060501b0319161717176002555f5b83518110156101fb5760018060a01b0360208260051b8601015116805f52600360205260ff60405f2054166101e957906001915f52600360205260405f208260ff198254161790550161019b565b637010e27960e11b5f5260045260245ffd5b505f84815260046020526040902080546001600160401b0319166001600160401b039092169190911790556001600160a01b03811661024e575061023d61048c565b505b6040516119a7908161050f8239f35b8061025b61026192610396565b5061040c565b5061023f565b82516001600160a01b031681830155602090920191600101610153565b60015f527fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf69081019083015b8181106102bd5750610148565b5f81556001016102b0565b634e487b7160e01b5f52604160045260245ffd5b866365846b7f60e01b5f5260045260245260445ffd5b5084515f19870160ff811161030a5760ff16106100d1565b634e487b7160e01b5f52601160045260245ffd5b6343d0a89360e11b5f5260045ffd5b5f80fd5b6020809161033e8461036e565b815201910190610081565b6040519190601f01601f191682016001600160401b038111838210176102c857604052565b51906001600160a01b038216820361032d57565b51906001600160401b038216820361032d57565b6001600160a01b0381165f9081525f516020611f365f395f51905f52602052604090205460ff16610407576001600160a01b03165f8181525f516020611f365f395f51905f5260205260408120805460ff191660011790553391905f516020611eb65f395f51905f528180a4600190565b505f90565b6001600160a01b0381165f9081525f516020611ed65f395f51905f52602052604090205460ff16610407576001600160a01b03165f8181525f516020611ed65f395f51905f5260205260408120805460ff191660011790553391905f516020611f165f395f51905f52905f516020611eb65f395f51905f529080a4600190565b5f80525f516020611ed65f395f51905f526020525f516020611ef65f395f51905f525460ff1661050a575f8080525f516020611ed65f395f51905f526020525f516020611ef65f395f51905f52805460ff1916600117905533905f516020611f165f395f51905f525f516020611eb65f395f51905f528280a4600190565b5f9056fe6080806040526004361015610012575f80fd5b5f3560e01c90816301ffc9a7146106ab575080630bece356146105e8578063248a9ca3146105be5780632f2ff15d1461058f57806336568abe146105335780634d6d9ffb146104865780635832611b146104405780635972185a14610406578063682ed5f01461035157806391d1485414610308578063a217fddf146102ee578063a845a7f314610261578063d547741f1461022b578063ddba65371461015f5763ef913a4b146100c1575f80fd5b3461015b575f60031936011261015b576101576040516020808201526080604082015261014b816100f460c08201611228565b60ff600254818116606085015267ffffffffffffffff8160081c16608085015260481c16151560a0830152037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0810183528261085e565b604051918291826107cd565b0390f35b5f80fd5b3461015b5761016d36610749565b505060ff60025460481c16610203575f80527f4c48d1d2b0f4f7485fc28e3db22341d96a20aa29e6efa8149da9751603abd4e06020527f6e0c24a6e293ff9b755263dbaa15ba3796b0b8d3fe17cfb4ddf8143b268eac475460ff16156101f6575b7fda81d7c2000000000000000000000000000000000000000000000000000000005f5260045ffd5b6101fe611277565b6101ce565b7f928b1233000000000000000000000000000000000000000000000000000000005f5260045ffd5b3461015b5761025f61023c3661079a565b9061025a610255825f525f602052600160405f20015490565b6112ff565b61175e565b005b3461015b575f60031936011261015b5760ff6002541660405161028e8161028781611228565b038261085e565b60405190604082019260408352815180945260206060840192015f945b8086106102c057505082935060208301520390f35b909260208060019273ffffffffffffffffffffffffffffffffffffffff8751168152019401950194906102ab565b3461015b575f60031936011261015b5760206040515f8152f35b3461015b576103163661079a565b905f525f60205273ffffffffffffffffffffffffffffffffffffffff60405f2091165f52602052602060ff60405f2054166040519015158152f35b3461015b57602060031936011261015b5760043567ffffffffffffffff811161015b5760a0600319823603011261015b5760ff60025460481c16610203575f80527f4c48d1d2b0f4f7485fc28e3db22341d96a20aa29e6efa8149da9751603abd4e060209081527f6e0c24a6e293ff9b755263dbaa15ba3796b0b8d3fe17cfb4ddf8143b268eac475490916103f19160ff16156103f9575b6004016110cb565b604051908152f35b610401611277565b6103e9565b3461015b575f60031936011261015b5760206040517fbd893629a699470e4ec82a5715bb4981fdaacc5d0a728bf5f55b801d8f4ef10b8152f35b3461015b57602060031936011261015b5760043567ffffffffffffffff811680910361015b575f526004602052602067ffffffffffffffff60405f205416604051908152f35b3461015b57602060031936011261015b5760043567ffffffffffffffff811161015b576080600319823603011261015b5760ff60025460481c16610203575f80527f4c48d1d2b0f4f7485fc28e3db22341d96a20aa29e6efa8149da9751603abd4e060209081527f6e0c24a6e293ff9b755263dbaa15ba3796b0b8d3fe17cfb4ddf8143b268eac475490916103f19160ff1615610526575b600401610ef5565b61052e611277565b61051e565b3461015b576105413661079a565b3373ffffffffffffffffffffffffffffffffffffffff8216036105675761025f9161175e565b7f6697b232000000000000000000000000000000000000000000000000000000005f5260045ffd5b3461015b5761025f6105a03661079a565b906105b9610255825f525f602052600160405f20015490565b61168c565b3461015b57602060031936011261015b5760206103f16004355f525f602052600160405f20015490565b3461015b576105f636610749565b60ff60025460481c16610203575f80527f4c48d1d2b0f4f7485fc28e3db22341d96a20aa29e6efa8149da9751603abd4e06020527f6e0c24a6e293ff9b755263dbaa15ba3796b0b8d3fe17cfb4ddf8143b268eac475461065e929060ff161561069e57610a3c565b6040516003821015610671576020918152f35b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b6106a6611277565b610a3c565b3461015b57602060031936011261015b57600435907fffffffff00000000000000000000000000000000000000000000000000000000821680920361015b57817f7965db0b000000000000000000000000000000000000000000000000000000006020931490811561071f575b5015158152f35b7f01ffc9a70000000000000000000000000000000000000000000000000000000091501483610718565b90602060031983011261015b5760043567ffffffffffffffff811161015b578260238201121561015b5780600401359267ffffffffffffffff841161015b576024848301011161015b576024019190565b600319604091011261015b576004359060243573ffffffffffffffffffffffffffffffffffffffff8116810361015b5790565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f602060409481855280519182918282880152018686015e5f8582860101520116010190565b6040810190811067ffffffffffffffff82111761083157604052565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff82111761083157604052565b92919267ffffffffffffffff821161083157604051916108e760207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116018461085e565b82948184528183011161015b578281602093845f960137010152565b9080601f8301121561015b5781602061091e9335910161089f565b90565b67ffffffffffffffff81116108315760051b60200190565b60208183031261015b5780359067ffffffffffffffff821161015b57019060408282031261015b576040519161096e83610815565b803567ffffffffffffffff811161015b578261098b918301610903565b835260208101359067ffffffffffffffff821161015b57019080601f8301121561015b5781356109ba81610921565b926109c8604051948561085e565b81845260208085019260051b8201019183831161015b5760208201905b8382106109f9575050505050602082015290565b813567ffffffffffffffff811161015b57602091610a1c87848094880101610903565b8152019101906109e5565b519067ffffffffffffffff8216820361015b57565b610a4891810190610939565b60205f818351604051918183925191829101835e8101838152039060025afa15610c915760205f8051604051838101917f01000000000000000000000000000000000000000000000000000000000000008352602182015260218152610aaf60418261085e565b604051918291518091835e8101838152039060025afa15610c9157610ada5f516020830151906113eb565b5160408180518101031261015b57604051610af481610815565b610b0f6040610b0560208501610a27565b9384845201610a27565b67ffffffffffffffff60208301938285521680151580610c7e575b15610c4457505067ffffffffffffffff8151165f52600460205267ffffffffffffffff60405f20541680610bf3575067ffffffffffffffff9051918183169260025490838260081c168511610bb6575b50505116905f52600460205260405f20907fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000008254161790555f90565b68ffffffffffffffff007fffffffffffffffffffffffffffffffffffffffffffffff0000000000000000ff9160081b169116176002555f80610b7a565b9167ffffffffffffffff9150511603610c0b57600290565b69010000000000000000007fffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffff6002541617600255600190565b67ffffffffffffffff92507fdcbc5460000000000000000000000000000000000000000000000000000000005f526004521660245260445ffd5b5067ffffffffffffffff82161515610b2a565b6040513d5f823e3d90fd5b9035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18136030182121561015b570180359067ffffffffffffffff821161015b57602001918160051b3603831361015b57565b3567ffffffffffffffff8116810361015b5790565b15610d0d5750565b67ffffffffffffffff907ff7caaa5c000000000000000000000000000000000000000000000000000000005f521660045260245ffd5b9035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18136030182121561015b570180359067ffffffffffffffff821161015b5760200191813603831361015b57565b60208183031261015b5780519067ffffffffffffffff821161015b57019060408282031261015b5760405191610dc983610815565b610dd281610a27565b835260208101519067ffffffffffffffff821161015b570181601f8201121561015b57805190610e0182610921565b92610e0f604051948561085e565b82845260208085019360061b8301019181831161015b57602001925b828410610e3e5750505050602082015290565b60408483031261015b5760206040918251610e5881610815565b865181528287015183820152815201930192610e2b565b15610e78575050565b9067ffffffffffffffff80927fc7441689000000000000000000000000000000000000000000000000000000005f52166004521660245260445ffd5b8051821015610ec85760209160051b010190565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b6060810190610f048282610c9c565b90506001610f128484610c9c565b9290500361109b5750610fb8610f2a60408301610cf0565b9267ffffffffffffffff841692835f526004602052610fb367ffffffffffffffff60405f20541694610f5e87871515610d05565b610f9e610f76610f6e8580610d43565b810190610939565b610f8e610f838251611365565b6020830151906113eb565b5160208082518301019101610d94565b9667ffffffffffffffff885116918214610e6f565b610c9c565b15610ec857610fd3610fcc82602093610d43565b369161089f565b818151910120920180515115611073575f5b8151805182101561104b57610ffb828692610eb4565b51511461100a57600101610fe5565b60209293506110199151610eb4565b5101516110235790565b7f9a960b4f000000000000000000000000000000000000000000000000000000005f5260045ffd5b7f291fc442000000000000000000000000000000000000000000000000000000005f5260045ffd5b7f1e6c84da000000000000000000000000000000000000000000000000000000005f5260045ffd5b7f88b3170e000000000000000000000000000000000000000000000000000000005f52600160045260245260445ffd5b608081016110d98183610d43565b9050156112005760608201906110ef8284610c9c565b905060016110fd8486610c9c565b9290500361109b575061111260408401610cf0565b9061117467ffffffffffffffff831693845f52600460205261116e67ffffffffffffffff60405f2054169561114986881515610d05565b611159610f76610f6e8a80610d43565b9567ffffffffffffffff875116918214610e6f565b85610c9c565b15610ec85760209161118c610fcc8361119894610d43565b83815191012095610d43565b908092918101031261015b576020903591019081515115611073575f5b8251805182101561104b576111cb828792610eb4565b515114806111e8575b6111e0576001016111b5565b505050905090565b508160206111f7838651610eb4565b510151146111d4565b7f1208b21b000000000000000000000000000000000000000000000000000000005f5260045ffd5b602060015491828152019060015f5260205f20905f5b81811061124b5750505090565b825473ffffffffffffffffffffffffffffffffffffffff1684526020909301926001928301920161123e565b335f9081527f4c48d1d2b0f4f7485fc28e3db22341d96a20aa29e6efa8149da9751603abd4e0602052604090205460ff16156112af57565b7fe2517d3f000000000000000000000000000000000000000000000000000000005f52336004527fbd893629a699470e4ec82a5715bb4981fdaacc5d0a728bf5f55b801d8f4ef10b60245260445ffd5b805f525f60205260405f2073ffffffffffffffffffffffffffffffffffffffff33165f5260205260ff60405f205416156113365750565b7fe2517d3f000000000000000000000000000000000000000000000000000000005f523360045260245260445ffd5b5f60208092604051918183925191829101835e8101838152039060025afa15610c915760205f8051604051838101917f020000000000000000000000000000000000000000000000000000000000000083526021820152602181526113cb60418261085e565b604051918291518091835e8101838152039060025afa15610c91575f5190565b91909182511561166457825160ff60025416907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82019060ff82116116375760ff8651921610156116095750508251927fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe061147e61146886610921565b95611476604051978861085e565b808752610921565b013660208601375f5b81518110156116025761149a8183610eb4565b5160418151036115cc5773ffffffffffffffffffffffffffffffffffffffff6114cf6114c68387611826565b90929192611860565b169081156115925750805f52600360205260ff60405f20541615611567575f5b82811061150c5750906001916115058288610eb4565b5201611487565b8173ffffffffffffffffffffffffffffffffffffffff61152c838a610eb4565b51161461153b576001016114ef565b507fe021c4f2000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b7fd7e8a2c2000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b6115c8906040519182917f9e3c1b3d000000000000000000000000000000000000000000000000000000008352600483016107cd565b0390fd5b6115c8906040519182917f2ee17a3d000000000000000000000000000000000000000000000000000000008352600483016107cd565b5050509050565b7f378b0805000000000000000000000000000000000000000000000000000000005f5260045260245260445ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b7f301b38b6000000000000000000000000000000000000000000000000000000005f5260045ffd5b805f525f60205260405f2073ffffffffffffffffffffffffffffffffffffffff83165f5260205260ff60405f205416155f1461175857805f525f60205260405f2073ffffffffffffffffffffffffffffffffffffffff83165f5260205260405f2060017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0082541617905573ffffffffffffffffffffffffffffffffffffffff339216907f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d5f80a4600190565b50505f90565b805f525f60205260405f2073ffffffffffffffffffffffffffffffffffffffff83165f5260205260ff60405f2054165f1461175857805f525f60205260405f2073ffffffffffffffffffffffffffffffffffffffff83165f5260205260405f207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00815416905573ffffffffffffffffffffffffffffffffffffffff339216907ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b5f80a4600190565b81519190604183036118565761184f9250602082015190606060408401519301515f1a9061190b565b9192909190565b50505f9160029190565b60048110156106715780611872575050565b600181036118a2577ff645eedf000000000000000000000000000000000000000000000000000000005f5260045ffd5b600281036118d657507ffce698f7000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b6003146118e05750565b7fd78bce0c000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b91907f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0841161198f579160209360809260ff5f9560405194855216868401526040830152606082015282805260015afa15610c91575f5173ffffffffffffffffffffffffffffffffffffffff81161561198557905f905f90565b505f906001905f90565b5050505f916003919056fea164736f6c634300081c000a2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d4c48d1d2b0f4f7485fc28e3db22341d96a20aa29e6efa8149da9751603abd4e06e0c24a6e293ff9b755263dbaa15ba3796b0b8d3fe17cfb4ddf8143b268eac47bd893629a699470e4ec82a5715bb4981fdaacc5d0a728bf5f55b801d8f4ef10bad3228b676f7d3cd4284a5443f17f1962b36e491b30a40b2405849e597ba5fb5","sourceMap":"815:11749:29:-:0;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;-1:-1:-1;;;;;815:11749:29;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;815:11749:29;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;:::i;:::-;;;;2648:28;815:11749;;2723:19;;;:69;;;815:11749;;;;;;;-1:-1:-1;815:11749:29;;;;;;-1:-1:-1;;;;;815:11749:29;;;;;;;;;;;;;;2893:217;;815:11749;;;;;2893:217;;815:11749;;;;;;;;;;;2893:217;815:11749;-1:-1:-1;815:11749:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;815:11749:29;;-1:-1:-1;815:11749:29;-1:-1:-1;815:11749:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;3171:3:29;815:11749;;3141:28;;;;;815:11749;;;;;;;;;;;;;;;-1:-1:-1;815:11749:29;3251:11;815:11749;;;;-1:-1:-1;815:11749:29;;;;;;;;-1:-1:-1;815:11749:29;3251:11;815:11749;;;-1:-1:-1;815:11749:29;;;;;;;;;;;3126:13;;815:11749;;;;-1:-1:-1;815:11749:29;;;;-1:-1:-1;815:11749:29;3141:28;-1:-1:-1;;815:11749:29;;;3372:27;815:11749;;;;;;;-1:-1:-1;;;;;;815:11749:29;-1:-1:-1;;;;;815:11749:29;;;;;;;;;-1:-1:-1;;;;;815:11749:29;;;;3496:44;;;:::i;:::-;;3451:249;815:11749;;;;;;;;;3451:249;3587:43;;3644:45;3587:43;;:::i;:::-;;3644:45;:::i;:::-;;3451:249;;815:11749;;;-1:-1:-1;;;;;815:11749:29;;;;;;;;;;;;;;;;-1:-1:-1;815:11749:29;;;;;;;;;;;;;;;;;;-1:-1:-1;815:11749:29;;;;;;;;;;-1:-1:-1;815:11749:29;;;;;-1:-1:-1;815:11749:29;;;;;;-1:-1:-1;815:11749:29;;;;;;-1:-1:-1;815:11749:29;2723:69;-1:-1:-1;815:11749:29;;-1:-1:-1;;815:11749:29;;;;;;;;;-1:-1:-1;2723:69:29;;815:11749;;;;-1:-1:-1;815:11749:29;;;;;-1:-1:-1;815:11749:29;;;;;-1:-1:-1;815:11749:29;;-1:-1:-1;815:11749:29;;-1:-1:-1;815:11749:29;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;-1:-1:-1;;815:11749:29;;;-1:-1:-1;;;;;815:11749:29;;;;;;;;;;:::o;:::-;;;-1:-1:-1;;;;;815:11749:29;;;;;;:::o;:::-;;;-1:-1:-1;;;;;815:11749:29;;;;;;:::o;6155:316:92:-;-1:-1:-1;;;;;815:11749:29;;2675:1;815:11749;;;-1:-1:-1;;;;;;;;;;;815:11749:29;;;;;;;;;;-1:-1:-1;;;;;815:11749:29;2675:1;815:11749;;;-1:-1:-1;;;;;;;;;;;815:11749:29;;;;;;;-1:-1:-1;;815:11749:29;;;;;735:10:120;;815:11749:29;-1:-1:-1;;;;;;;;;;;2675:1:29;;6346:40:92;6323:4;6400:11;:::o;6248:217::-;6442:12;2675:1:29;6442:12:92;:::o;6155:316::-;-1:-1:-1;;;;;815:11749:29;;;;;;-1:-1:-1;;;;;;;;;;;815:11749:29;;;;;;;;;;-1:-1:-1;;;;;815:11749:29;;;;;-1:-1:-1;;;;;;;;;;;815:11749:29;;;;;;;-1:-1:-1;;815:11749:29;;;;;735:10:120;;815:11749:29;-1:-1:-1;;;;;;;;;;;1507:33:29;-1:-1:-1;;;;;;;;;;;6346:40:92;815:11749:29;6346:40:92;6323:4;6400:11;:::o;6155:316::-;815:11749:29;;;-1:-1:-1;;;;;;;;;;;815:11749:29;;-1:-1:-1;;;;;;;;;;;815:11749:29;;;;;;;;;-1:-1:-1;;;;;;;;;;;815:11749:29;;-1:-1:-1;;;;;;;;;;;815:11749:29;;-1:-1:-1;;815:11749:29;6323:4:92;815:11749:29;;;735:10:120;;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;815:11749:29;;6346:40:92;6323:4;6400:11;:::o;6248:217::-;815:11749:29;6442:12:92;:::o","linkReferences":{}},"deployedBytecode":{"object":"0x6080806040526004361015610012575f80fd5b5f3560e01c90816301ffc9a7146106ab575080630bece356146105e8578063248a9ca3146105be5780632f2ff15d1461058f57806336568abe146105335780634d6d9ffb146104865780635832611b146104405780635972185a14610406578063682ed5f01461035157806391d1485414610308578063a217fddf146102ee578063a845a7f314610261578063d547741f1461022b578063ddba65371461015f5763ef913a4b146100c1575f80fd5b3461015b575f60031936011261015b576101576040516020808201526080604082015261014b816100f460c08201611228565b60ff600254818116606085015267ffffffffffffffff8160081c16608085015260481c16151560a0830152037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0810183528261085e565b604051918291826107cd565b0390f35b5f80fd5b3461015b5761016d36610749565b505060ff60025460481c16610203575f80527f4c48d1d2b0f4f7485fc28e3db22341d96a20aa29e6efa8149da9751603abd4e06020527f6e0c24a6e293ff9b755263dbaa15ba3796b0b8d3fe17cfb4ddf8143b268eac475460ff16156101f6575b7fda81d7c2000000000000000000000000000000000000000000000000000000005f5260045ffd5b6101fe611277565b6101ce565b7f928b1233000000000000000000000000000000000000000000000000000000005f5260045ffd5b3461015b5761025f61023c3661079a565b9061025a610255825f525f602052600160405f20015490565b6112ff565b61175e565b005b3461015b575f60031936011261015b5760ff6002541660405161028e8161028781611228565b038261085e565b60405190604082019260408352815180945260206060840192015f945b8086106102c057505082935060208301520390f35b909260208060019273ffffffffffffffffffffffffffffffffffffffff8751168152019401950194906102ab565b3461015b575f60031936011261015b5760206040515f8152f35b3461015b576103163661079a565b905f525f60205273ffffffffffffffffffffffffffffffffffffffff60405f2091165f52602052602060ff60405f2054166040519015158152f35b3461015b57602060031936011261015b5760043567ffffffffffffffff811161015b5760a0600319823603011261015b5760ff60025460481c16610203575f80527f4c48d1d2b0f4f7485fc28e3db22341d96a20aa29e6efa8149da9751603abd4e060209081527f6e0c24a6e293ff9b755263dbaa15ba3796b0b8d3fe17cfb4ddf8143b268eac475490916103f19160ff16156103f9575b6004016110cb565b604051908152f35b610401611277565b6103e9565b3461015b575f60031936011261015b5760206040517fbd893629a699470e4ec82a5715bb4981fdaacc5d0a728bf5f55b801d8f4ef10b8152f35b3461015b57602060031936011261015b5760043567ffffffffffffffff811680910361015b575f526004602052602067ffffffffffffffff60405f205416604051908152f35b3461015b57602060031936011261015b5760043567ffffffffffffffff811161015b576080600319823603011261015b5760ff60025460481c16610203575f80527f4c48d1d2b0f4f7485fc28e3db22341d96a20aa29e6efa8149da9751603abd4e060209081527f6e0c24a6e293ff9b755263dbaa15ba3796b0b8d3fe17cfb4ddf8143b268eac475490916103f19160ff1615610526575b600401610ef5565b61052e611277565b61051e565b3461015b576105413661079a565b3373ffffffffffffffffffffffffffffffffffffffff8216036105675761025f9161175e565b7f6697b232000000000000000000000000000000000000000000000000000000005f5260045ffd5b3461015b5761025f6105a03661079a565b906105b9610255825f525f602052600160405f20015490565b61168c565b3461015b57602060031936011261015b5760206103f16004355f525f602052600160405f20015490565b3461015b576105f636610749565b60ff60025460481c16610203575f80527f4c48d1d2b0f4f7485fc28e3db22341d96a20aa29e6efa8149da9751603abd4e06020527f6e0c24a6e293ff9b755263dbaa15ba3796b0b8d3fe17cfb4ddf8143b268eac475461065e929060ff161561069e57610a3c565b6040516003821015610671576020918152f35b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b6106a6611277565b610a3c565b3461015b57602060031936011261015b57600435907fffffffff00000000000000000000000000000000000000000000000000000000821680920361015b57817f7965db0b000000000000000000000000000000000000000000000000000000006020931490811561071f575b5015158152f35b7f01ffc9a70000000000000000000000000000000000000000000000000000000091501483610718565b90602060031983011261015b5760043567ffffffffffffffff811161015b578260238201121561015b5780600401359267ffffffffffffffff841161015b576024848301011161015b576024019190565b600319604091011261015b576004359060243573ffffffffffffffffffffffffffffffffffffffff8116810361015b5790565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f602060409481855280519182918282880152018686015e5f8582860101520116010190565b6040810190811067ffffffffffffffff82111761083157604052565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff82111761083157604052565b92919267ffffffffffffffff821161083157604051916108e760207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116018461085e565b82948184528183011161015b578281602093845f960137010152565b9080601f8301121561015b5781602061091e9335910161089f565b90565b67ffffffffffffffff81116108315760051b60200190565b60208183031261015b5780359067ffffffffffffffff821161015b57019060408282031261015b576040519161096e83610815565b803567ffffffffffffffff811161015b578261098b918301610903565b835260208101359067ffffffffffffffff821161015b57019080601f8301121561015b5781356109ba81610921565b926109c8604051948561085e565b81845260208085019260051b8201019183831161015b5760208201905b8382106109f9575050505050602082015290565b813567ffffffffffffffff811161015b57602091610a1c87848094880101610903565b8152019101906109e5565b519067ffffffffffffffff8216820361015b57565b610a4891810190610939565b60205f818351604051918183925191829101835e8101838152039060025afa15610c915760205f8051604051838101917f01000000000000000000000000000000000000000000000000000000000000008352602182015260218152610aaf60418261085e565b604051918291518091835e8101838152039060025afa15610c9157610ada5f516020830151906113eb565b5160408180518101031261015b57604051610af481610815565b610b0f6040610b0560208501610a27565b9384845201610a27565b67ffffffffffffffff60208301938285521680151580610c7e575b15610c4457505067ffffffffffffffff8151165f52600460205267ffffffffffffffff60405f20541680610bf3575067ffffffffffffffff9051918183169260025490838260081c168511610bb6575b50505116905f52600460205260405f20907fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000008254161790555f90565b68ffffffffffffffff007fffffffffffffffffffffffffffffffffffffffffffffff0000000000000000ff9160081b169116176002555f80610b7a565b9167ffffffffffffffff9150511603610c0b57600290565b69010000000000000000007fffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffff6002541617600255600190565b67ffffffffffffffff92507fdcbc5460000000000000000000000000000000000000000000000000000000005f526004521660245260445ffd5b5067ffffffffffffffff82161515610b2a565b6040513d5f823e3d90fd5b9035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18136030182121561015b570180359067ffffffffffffffff821161015b57602001918160051b3603831361015b57565b3567ffffffffffffffff8116810361015b5790565b15610d0d5750565b67ffffffffffffffff907ff7caaa5c000000000000000000000000000000000000000000000000000000005f521660045260245ffd5b9035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18136030182121561015b570180359067ffffffffffffffff821161015b5760200191813603831361015b57565b60208183031261015b5780519067ffffffffffffffff821161015b57019060408282031261015b5760405191610dc983610815565b610dd281610a27565b835260208101519067ffffffffffffffff821161015b570181601f8201121561015b57805190610e0182610921565b92610e0f604051948561085e565b82845260208085019360061b8301019181831161015b57602001925b828410610e3e5750505050602082015290565b60408483031261015b5760206040918251610e5881610815565b865181528287015183820152815201930192610e2b565b15610e78575050565b9067ffffffffffffffff80927fc7441689000000000000000000000000000000000000000000000000000000005f52166004521660245260445ffd5b8051821015610ec85760209160051b010190565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b6060810190610f048282610c9c565b90506001610f128484610c9c565b9290500361109b5750610fb8610f2a60408301610cf0565b9267ffffffffffffffff841692835f526004602052610fb367ffffffffffffffff60405f20541694610f5e87871515610d05565b610f9e610f76610f6e8580610d43565b810190610939565b610f8e610f838251611365565b6020830151906113eb565b5160208082518301019101610d94565b9667ffffffffffffffff885116918214610e6f565b610c9c565b15610ec857610fd3610fcc82602093610d43565b369161089f565b818151910120920180515115611073575f5b8151805182101561104b57610ffb828692610eb4565b51511461100a57600101610fe5565b60209293506110199151610eb4565b5101516110235790565b7f9a960b4f000000000000000000000000000000000000000000000000000000005f5260045ffd5b7f291fc442000000000000000000000000000000000000000000000000000000005f5260045ffd5b7f1e6c84da000000000000000000000000000000000000000000000000000000005f5260045ffd5b7f88b3170e000000000000000000000000000000000000000000000000000000005f52600160045260245260445ffd5b608081016110d98183610d43565b9050156112005760608201906110ef8284610c9c565b905060016110fd8486610c9c565b9290500361109b575061111260408401610cf0565b9061117467ffffffffffffffff831693845f52600460205261116e67ffffffffffffffff60405f2054169561114986881515610d05565b611159610f76610f6e8a80610d43565b9567ffffffffffffffff875116918214610e6f565b85610c9c565b15610ec85760209161118c610fcc8361119894610d43565b83815191012095610d43565b908092918101031261015b576020903591019081515115611073575f5b8251805182101561104b576111cb828792610eb4565b515114806111e8575b6111e0576001016111b5565b505050905090565b508160206111f7838651610eb4565b510151146111d4565b7f1208b21b000000000000000000000000000000000000000000000000000000005f5260045ffd5b602060015491828152019060015f5260205f20905f5b81811061124b5750505090565b825473ffffffffffffffffffffffffffffffffffffffff1684526020909301926001928301920161123e565b335f9081527f4c48d1d2b0f4f7485fc28e3db22341d96a20aa29e6efa8149da9751603abd4e0602052604090205460ff16156112af57565b7fe2517d3f000000000000000000000000000000000000000000000000000000005f52336004527fbd893629a699470e4ec82a5715bb4981fdaacc5d0a728bf5f55b801d8f4ef10b60245260445ffd5b805f525f60205260405f2073ffffffffffffffffffffffffffffffffffffffff33165f5260205260ff60405f205416156113365750565b7fe2517d3f000000000000000000000000000000000000000000000000000000005f523360045260245260445ffd5b5f60208092604051918183925191829101835e8101838152039060025afa15610c915760205f8051604051838101917f020000000000000000000000000000000000000000000000000000000000000083526021820152602181526113cb60418261085e565b604051918291518091835e8101838152039060025afa15610c91575f5190565b91909182511561166457825160ff60025416907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82019060ff82116116375760ff8651921610156116095750508251927fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe061147e61146886610921565b95611476604051978861085e565b808752610921565b013660208601375f5b81518110156116025761149a8183610eb4565b5160418151036115cc5773ffffffffffffffffffffffffffffffffffffffff6114cf6114c68387611826565b90929192611860565b169081156115925750805f52600360205260ff60405f20541615611567575f5b82811061150c5750906001916115058288610eb4565b5201611487565b8173ffffffffffffffffffffffffffffffffffffffff61152c838a610eb4565b51161461153b576001016114ef565b507fe021c4f2000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b7fd7e8a2c2000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b6115c8906040519182917f9e3c1b3d000000000000000000000000000000000000000000000000000000008352600483016107cd565b0390fd5b6115c8906040519182917f2ee17a3d000000000000000000000000000000000000000000000000000000008352600483016107cd565b5050509050565b7f378b0805000000000000000000000000000000000000000000000000000000005f5260045260245260445ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b7f301b38b6000000000000000000000000000000000000000000000000000000005f5260045ffd5b805f525f60205260405f2073ffffffffffffffffffffffffffffffffffffffff83165f5260205260ff60405f205416155f1461175857805f525f60205260405f2073ffffffffffffffffffffffffffffffffffffffff83165f5260205260405f2060017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0082541617905573ffffffffffffffffffffffffffffffffffffffff339216907f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d5f80a4600190565b50505f90565b805f525f60205260405f2073ffffffffffffffffffffffffffffffffffffffff83165f5260205260ff60405f2054165f1461175857805f525f60205260405f2073ffffffffffffffffffffffffffffffffffffffff83165f5260205260405f207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00815416905573ffffffffffffffffffffffffffffffffffffffff339216907ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b5f80a4600190565b81519190604183036118565761184f9250602082015190606060408401519301515f1a9061190b565b9192909190565b50505f9160029190565b60048110156106715780611872575050565b600181036118a2577ff645eedf000000000000000000000000000000000000000000000000000000005f5260045ffd5b600281036118d657507ffce698f7000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b6003146118e05750565b7fd78bce0c000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b91907f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0841161198f579160209360809260ff5f9560405194855216868401526040830152606082015282805260015afa15610c91575f5173ffffffffffffffffffffffffffffffffffffffff81161561198557905f905f90565b505f906001905f90565b5050505f916003919056fea164736f6c634300081c000a","sourceMap":"815:11749:29:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;815:11749:29;;;;;;;;3825:23;;;;815:11749;;;;;;3825:23;815:11749;;;;;;:::i;:::-;;;;;;;;;;;;1787:4;;;815:11749;;;;;;;;;;;;;;3825:23;;;;;;;;:::i;:::-;815:11749;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;;;;12225:20;815:11749;;;;;;;;;;;;;;;;12444:42;12440:105;;815:11749;9710:21;815:11749;9710:21;815:11749;;9710:21;12440:105;12513:20;;:::i;:::-;12440:105;;815:11749;;;;;;;;;;;4723:26:92;815:11749:29;;;:::i;:::-;4693:18:92;2484:4;4693:18;;3877:6;815:11749:29;3877:6:92;815:11749:29;;3877:22:92;815:11749:29;3877:6:92;815:11749:29;3877:22:92;815:11749:29;3786:120:92;;4693:18;2484:4;:::i;:::-;4723:26;:::i;:::-;815:11749:29;;;;;;-1:-1:-1;;815:11749:29;;;;;;4065:27;815:11749;;;;;;;;;:::i;:::-;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4034:11;815:11749;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;815:11749:29;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;2930:29:92;815:11749:29;-1:-1:-1;815:11749:29;;;;;;-1:-1:-1;815:11749:29;;;;;;;;;;;;;;;;-1:-1:-1;;815:11749:29;;;;;;;;;;;;;-1:-1:-1;;815:11749:29;;;;;;;;12225:20;815:11749;;;;;;;;;;;;;;;;;;5841:1853;;815:11749;;12444:42;12440:105;;815:11749;;;5841:1853;:::i;:::-;815:11749;;;;;;12440:105;12513:20;;:::i;:::-;12440:105;;815:11749;;;;;-1:-1:-1;;815:11749:29;;;;;;;;1507:33;815:11749;;;;;;;;-1:-1:-1;;815:11749:29;;;;;;;;;;;;;;;;1787:4;815:11749;;1787:4;815:11749;;;;1787:4;;815:11749;;;;;;;;;;;;-1:-1:-1;;815:11749:29;;;;;;;;;;;;;-1:-1:-1;;815:11749:29;;;;;;;;12225:20;815:11749;;;;;;;;;;;;;;;;;;7733:1799;;815:11749;;12444:42;12440:105;;815:11749;;;7733:1799;:::i;12440:105::-;12513:20;;:::i;:::-;12440:105;;815:11749;;;;;;;:::i;:::-;735:10:120;815:11749:29;;;5397:34:92;5393:102;;5505:37;;;:::i;5393:102::-;5454:30;815:11749:29;5454:30:92;815:11749:29;;5454:30:92;815:11749:29;;;;4306:25:92;815:11749:29;;;:::i;:::-;4276:18:92;2484:4;4276:18;;3877:6;815:11749:29;3877:6:92;815:11749:29;;3877:22:92;815:11749:29;3877:6:92;815:11749:29;3877:22:92;815:11749:29;3786:120:92;;2484:4;4306:25;:::i;815:11749:29:-;;;;;-1:-1:-1;;815:11749:29;;;;;;;;;3877:6:92;815:11749:29;3877:6:92;815:11749:29;;3877:22:92;815:11749:29;3877:6:92;815:11749:29;3877:22:92;815:11749:29;3786:120:92;;815:11749:29;;;;;;;:::i;:::-;;12225:20;815:11749;;;;;;;;;;;;;;4341:1461;;815:11749;;;12444:42;12440:105;;4341:1461;:::i;:::-;815:11749;;;;;;;;;;;;;;;;;;;;;;;12440:105;12513:20;;:::i;:::-;4341:1461;:::i;815:11749::-;;;;;-1:-1:-1;;815:11749:29;;;;;;;;;;;;;;;;2649:47:92;2664:32;815:11749:29;2649:47:92;;:87;;;;;815:11749:29;;;;;;;2649:87:92;844:25:130;829:40;;;2649:87:92;;;815:11749:29;;;-1:-1:-1;;815:11749:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;-1:-1:-1;;815:11749:29;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;:::o;:::-;;-1:-1:-1;815:11749:29;;;;;-1:-1:-1;815:11749:29;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;-1:-1:-1;815:11749:29;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;:::i;:::-;;:::o;:::-;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;1787:4;;815:11749;;;;;;;;1787:4::o;4341:1461::-;4562:58;4341:1461;4562:58;;;;:::i;:::-;815:11749;-1:-1:-1;4668:21:29;;;815:11749;;;;;;;;;;;;;;;;;;10125:12;;;;;;;;815:11749;-1:-1:-1;10125:12:29;;815:11749;;10099:39;;;815:11749;;;;;;;;;10099:39;;;;;;:::i;:::-;815:11749;;;;;;;;;;;;;;;10092:47;;10125:12;10092:47;;;;;4759:16;-1:-1:-1;10092:47:29;815:11749;4759:16;;;;;:::i;:::-;4859:21;815:11749;;;;4848:70;;1787:4;;;;815:11749;;;;;:::i;:::-;1787:4;815:11749;1787:4;815:11749;4848:70;;1787:4;:::i;:::-;;;;;;;:::i;:::-;815:11749;;1787:4;;;;;;815:11749;4937:16;;;:39;;;4341:1461;1787:4;;;;;815:11749;1787:4;;815:11749;-1:-1:-1;1787:4:29;5227:27;815:11749;1787:4;815:11749;;-1:-1:-1;1787:4:29;;815:11749;5282:22;5278:276;;1787:4;815:11749;1787:4;;815:11749;;;;1787:4;10125:12;1787:4;;;;;;815:11749;5568:39;;5564:109;;4341:1461;1787:4;;;815:11749;1787:4;-1:-1:-1;1787:4:29;5227:27;815:11749;1787:4;815:11749;-1:-1:-1;1787:4:29;;;;;;;;;-1:-1:-1;4341:1461:29;:::o;5564:109::-;1787:4;;;;;;;;;10125:12;1787:4;5564:109;;;;5278:276;1787:4;815:11749;1787:4;;;815:11749;5324:36;5320:169;;10125:12;5502:41;:::o;5320:169::-;1787:4;;10125:12;1787:4;;;10125:12;1787:4;;5425:49;:::o;1787:4::-;815:11749;1787:4;;;-1:-1:-1;1787:4:29;;815:11749;;1787:4;815:11749;1787:4;-1:-1:-1;1787:4:29;4937:39;815:11749;;;;4957:19;;4937:39;;10092:47;815:11749;;;-1:-1:-1;815:11749:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;:::o;:::-;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;1910:4::-;;;;;;;;;;;;;;;;;;;;;;;;;;815:11749;;;;;:::i;:::-;1787:4;;;:::i;:::-;1910;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;815:11749;;1910:4;815:11749;;;;:::i;:::-;1910:4;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;815:11749;;;;;;:::i;:::-;1910:4;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;815:11749;1910:4;;;;;815:11749;1910:4;815:11749;;1787:4;815:11749;1787:4;1910;;;815:11749;;1910:4;;;;;;;;;;;;:::o;:::-;;;;;;;;;;7733:1799;7940:9;;;;;;;;:::i;:::-;7984;;7960:1;7984:9;;;;:::i;:::-;7940:21;;;;815:11749;;8104:31;9118:9;8104:31;;;;;:::i;:::-;815:11749;;;;1787:4;;-1:-1:-1;1787:4:29;8157:27;8104:16;1787:4;8893:103;815:11749;8104:31;-1:-1:-1;1787:4:29;;815:11749;8215:7;8207:57;8215:7;;;;8207:57;:::i;:::-;8739:71;8324:59;8335:10;;;;:::i;:::-;8324:59;;;;:::i;:::-;8522:16;8410:67;8430:21;;8410:67;:::i;:::-;8104:16;8522;;;;;:::i;:::-;8750:21;8104:16;815:11749;;;8739:71;;;;;;:::i;:::-;1787:4;815:11749;1787:4;;815:11749;8901:39;;;8893:103;:::i;:::-;9118:9;:::i;:::-;1910:4;;;;;;8104:16;1910:4;;:::i;:::-;;;;:::i;:::-;815:11749;;;;;9108:23;9149:25;;;;815:11749;9149:36;1910:4;;-1:-1:-1;9270:3:29;9236:25;;815:11749;;9232:36;;;;;9293:28;;;;;:::i;:::-;;1910:4;9293:45;9289:198;;7960:1;1910:4;9217:13;;9289:198;8104:16;9366:25;;;:28;:25;;:28;:::i;:::-;;:39;1910:4;;;9454:18;:::o;1910:4::-;;-1:-1:-1;1910:4:29;8157:27;-1:-1:-1;1910:4:29;9232:36;9514:11;-1:-1:-1;9514:11:29;8157:27;-1:-1:-1;9514:11:29;1910:4;;-1:-1:-1;1910:4:29;8157:27;-1:-1:-1;1910:4:29;815:11749;;;;7960:1;815:11749;;;;;;;5841:1853;6042:10;;;;;;;:::i;:::-;:22;;;815:11749;;6097:9;;;;;;;;:::i;:::-;6141;;6117:1;6141:9;;;;:::i;:::-;6097:21;;;;815:11749;;6261:31;;;;;;:::i;:::-;815:11749;7265:9;815:11749;;;1787:4;;6063:1;1787:4;6314:27;6261:16;1787:4;7050:103;815:11749;6261:31;6063:1;1787:4;;815:11749;6372:7;6364:57;6372:7;;;;6364:57;:::i;:::-;6896:71;6481:59;6492:10;;;;:::i;6896:71::-;1787:4;815:11749;1787:4;;815:11749;7058:39;;;7050:103;:::i;:::-;7265:9;;:::i;:::-;1910:4;;;6261:16;1910:4;;;;7315:10;1910:4;;:::i;:::-;815:11749;;;;;7255:23;7315:10;;:::i;:::-;7304:33;;;;;;815:11749;;;;6261:16;815:11749;;7355:25;;;;;815:11749;7355:36;1910:4;;6063:1;7476:3;7442:25;;815:11749;;7438:36;;;;;7499:28;;;;;:::i;:::-;;1910:4;7499:45;:97;;;7476:3;7495:154;;6117:1;1910:4;7423:13;;7495:154;7616:18;;;;;;:::o;7499:97::-;7548:25;;6261:16;7548:28;:25;;;:28;:::i;:::-;;:39;1910:4;7548:48;7499:97;;815:11749;;6063:1;815:11749;;6063:1;815:11749;;;4034:11;815:11749;;;;;;;4034:11;-1:-1:-1;815:11749:29;;-1:-1:-1;815:11749:29;;-1:-1:-1;815:11749:29;;;;;;;;;;:::o;:::-;;;;;;;;;;;;4034:11;815:11749;;;;;;;3175:103:92;735:10:120;2930:6:92;815:11749:29;;;;;;;;;;;;3495:23:92;3491:108;;3175:103::o;3491:108::-;3541:47;2930:6;3541:47;735:10:120;3541:47:92;815:11749:29;1507:33;815:11749;;;2930:6:92;3541:47;3175:103;815:11749:29;2930:6:92;815:11749:29;2930:6:92;815:11749:29;;;2930:6:92;815:11749:29;;735:10:120;815:11749:29;-1:-1:-1;815:11749:29;;;;;-1:-1:-1;815:11749:29;;;3495:23:92;3491:108;;3175:103;:::o;3491:108::-;3541:47;2930:6;3541:47;735:10:120;3541:47:92;815:11749:29;;;;2930:6:92;3541:47;9980:166:29;-1:-1:-1;815:11749:29;9980:166;;815:11749;;;;;;;;;;;;;;;;;;10125:12;;;;;;;;815:11749;-1:-1:-1;10125:12:29;;815:11749;;10099:39;;;815:11749;;;;;;;;;10099:39;;;;;;:::i;:::-;815:11749;;;;;;;;;;;;;;;10092:47;;10125:12;10092:47;;;;;-1:-1:-1;10092:47:29;9980:166;:::o;10562:773::-;;;;815:11749;;10672:21;815:11749;;;;;10765:27;815:11749;;;;;;;;;;;;;;;;;-1:-1:-1;815:11749:29;;;;;;;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;:::i;:::-;;;;;;;10692:1;11003:3;815:11749;;10980:21;;;;;11041:13;;;;:::i;:::-;;1660:2;815:11749;;11811:42;1660:2;;815:11749;3927:8:129;3871:27;;;;:::i;:::-;3927:8;;;;;:::i;:::-;815:11749:29;11970:23;;;1660:2;;815:11749;;10692:1;815:11749;12041:11;815:11749;;;;10692:1;815:11749;;;1660:2;;;10692:1;11184:5;;;;;;11299:19;;10765:11;11299:19;;;;;:::i;:::-;815:11749;1910:4;10965:13;;11191:3;11222:7;815:11749;11222:7;;;;:::i;:::-;815:11749;;11222:20;815:11749;;10765:11;1910:4;11169:13;;815:11749;;;10692:1;815:11749;;;;10692:1;815:11749;1660:2;;10692:1;1660:2;;815:11749;;10692:1;1660:2;;;815:11749;;;1660:2;;;;;;;;;;:::i;:::-;;;;;;815:11749;;;1660:2;;;;;;;;;;:::i;10980:21::-;;;;;;10562:773::o;815:11749::-;;10692:1;815:11749;;;;;;10692:1;815:11749;;;10692:1;815:11749;;;;;10692:1;815:11749;;;10692:1;815:11749;;10692:1;815:11749;6155:316:92;815:11749:29;;;;;;;;;;;;-1:-1:-1;815:11749:29;;;;;-1:-1:-1;815:11749:29;;;6252:23:92;6248:217;815:11749:29;;;;;;;;;;;;;;;-1:-1:-1;815:11749:29;;;;-1:-1:-1;815:11749:29;6323:4:92;815:11749:29;;;;;;;;735:10:120;815:11749:29;;6346:40:92;;815:11749:29;6346:40:92;;6323:4;6400:11;:::o;6248:217::-;6442:12;;815:11749:29;6442:12:92;:::o;6708:317::-;815:11749:29;;;;;;;;;;;;-1:-1:-1;815:11749:29;;;;;-1:-1:-1;815:11749:29;;;6802:217:92;815:11749:29;;;;;;;;;;;;;;;-1:-1:-1;815:11749:29;;;;-1:-1:-1;815:11749:29;;;;;;;;735:10:120;815:11749:29;;6900:40:92;;815:11749:29;6900:40:92;;815:11749:29;6954:11:92;:::o;2129:778:129:-;815:11749:29;;;2129:778:129;2319:2;2299:22;;2319:2;;2751:25;2535:196;;;;;;;;;;;;;;;-1:-1:-1;2535:196:129;2751:25;;:::i;:::-;2744:32;;;;;:::o;2295:606::-;2807:83;;2823:1;2807:83;2827:35;2807:83;;:::o;7280:532::-;815:11749:29;;;;;;7366:29:129;;;7411:7;;:::o;7362:444::-;815:11749:29;7462:38:129;;815:11749:29;;7523:23:129;7375:20;7523:23;815:11749:29;7375:20:129;7523:23;7458:348;7576:35;7567:44;;7576:35;;7634:46;;7375:20;7634:46;815:11749:29;;;7375:20:129;7634:46;7563:243;7710:30;7701:39;7697:109;;7563:243;7280:532::o;7697:109::-;7763:32;7375:20;7763:32;815:11749:29;;;7375:20:129;7763:32;5203:1551;;;6283:66;6270:79;;6266:164;;815:11749:29;;;;;;-1:-1:-1;815:11749:29;;;;;;;;;;;;;;;;;;;6541:24:129;;;;;;;;;-1:-1:-1;6541:24:129;815:11749:29;;;6579:20:129;6575:113;;6698:49;-1:-1:-1;6698:49:129;-1:-1:-1;5203:1551:129;:::o;6575:113::-;6615:62;-1:-1:-1;6615:62:129;6541:24;6615:62;-1:-1:-1;6615:62:129;:::o;6266:164::-;6365:54;;;6381:1;6365:54;6385:30;6365:54;;:::o","linkReferences":{}},"methodIdentifiers":{"DEFAULT_ADMIN_ROLE()":"a217fddf","PROOF_SUBMITTER_ROLE()":"5972185a","getAttestationSet()":"a845a7f3","getClientState()":"ef913a4b","getConsensusTimestamp(uint64)":"5832611b","getRoleAdmin(bytes32)":"248a9ca3","grantRole(bytes32,address)":"2f2ff15d","hasRole(bytes32,address)":"91d14854","misbehaviour(bytes)":"ddba6537","renounceRole(bytes32,address)":"36568abe","revokeRole(bytes32,address)":"d547741f","supportsInterface(bytes4)":"01ffc9a7","updateClient(bytes)":"0bece356","verifyMembership((bytes,(uint64,uint64),bytes[],bytes))":"682ed5f0","verifyNonMembership((bytes,(uint64,uint64),bytes[]))":"4d6d9ffb"},"rawMetadata":"{\"compiler\":{\"version\":\"0.8.28+commit.7893614a\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"attestorAddresses\",\"type\":\"address[]\"},{\"internalType\":\"uint8\",\"name\":\"minRequiredSigs\",\"type\":\"uint8\"},{\"internalType\":\"uint64\",\"name\":\"initialHeight\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"initialTimestampSeconds\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"roleManager\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"AccessControlBadConfirmation\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"internalType\":\"bytes32\",\"name\":\"neededRole\",\"type\":\"bytes32\"}],\"name\":\"AccessControlUnauthorizedAccount\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint8\",\"name\":\"minRequired\",\"type\":\"uint8\"},{\"internalType\":\"uint256\",\"name\":\"attestationCount\",\"type\":\"uint256\"}],\"name\":\"BadQuorum\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"height\",\"type\":\"uint64\"}],\"name\":\"ConsensusTimestampNotFound\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"signer\",\"type\":\"address\"}],\"name\":\"DuplicateSigner\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ECDSAInvalidSignature\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"length\",\"type\":\"uint256\"}],\"name\":\"ECDSAInvalidSignatureLength\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"s\",\"type\":\"bytes32\"}],\"name\":\"ECDSAInvalidSignatureS\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"EmptyPackets\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"EmptySignatures\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"EmptyValue\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"FeatureNotSupported\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"FrozenClientState\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"expected\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"provided\",\"type\":\"uint64\"}],\"name\":\"HeightMismatch\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"expectedLength\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"providedLength\",\"type\":\"uint256\"}],\"name\":\"InvalidPathLength\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"signature\",\"type\":\"bytes\"}],\"name\":\"InvalidSignatureLength\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"height\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"timestamp\",\"type\":\"uint64\"}],\"name\":\"InvalidState\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"NoAttestors\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"NotMember\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"NotNonMember\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"signature\",\"type\":\"bytes\"}],\"name\":\"SignatureInvalid\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"validSigners\",\"type\":\"uint256\"},{\"internalType\":\"uint8\",\"name\":\"minRequired\",\"type\":\"uint8\"}],\"name\":\"ThresholdNotMet\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"signer\",\"type\":\"address\"}],\"name\":\"UnknownSigner\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"previousAdminRole\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"newAdminRole\",\"type\":\"bytes32\"}],\"name\":\"RoleAdminChanged\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"RoleGranted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"RoleRevoked\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"DEFAULT_ADMIN_ROLE\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"PROOF_SUBMITTER_ROLE\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getAttestationSet\",\"outputs\":[{\"internalType\":\"address[]\",\"name\":\"attestorAddresses\",\"type\":\"address[]\"},{\"internalType\":\"uint8\",\"name\":\"minRequiredSigs\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getClientState\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"revisionHeight\",\"type\":\"uint64\"}],\"name\":\"getConsensusTimestamp\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"}],\"name\":\"getRoleAdmin\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"grantRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"hasRole\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"name\":\"misbehaviour\",\"outputs\":[],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"callerConfirmation\",\"type\":\"address\"}],\"name\":\"renounceRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"revokeRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes4\",\"name\":\"interfaceId\",\"type\":\"bytes4\"}],\"name\":\"supportsInterface\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"updateMsg\",\"type\":\"bytes\"}],\"name\":\"updateClient\",\"outputs\":[{\"internalType\":\"enum ILightClientMsgs.UpdateResult\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes\",\"name\":\"proof\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"uint64\",\"name\":\"revisionNumber\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"revisionHeight\",\"type\":\"uint64\"}],\"internalType\":\"struct IICS02ClientMsgs.Height\",\"name\":\"proofHeight\",\"type\":\"tuple\"},{\"internalType\":\"bytes[]\",\"name\":\"path\",\"type\":\"bytes[]\"},{\"internalType\":\"bytes\",\"name\":\"value\",\"type\":\"bytes\"}],\"internalType\":\"struct ILightClientMsgs.MsgVerifyMembership\",\"name\":\"msg_\",\"type\":\"tuple\"}],\"name\":\"verifyMembership\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes\",\"name\":\"proof\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"uint64\",\"name\":\"revisionNumber\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"revisionHeight\",\"type\":\"uint64\"}],\"internalType\":\"struct IICS02ClientMsgs.Height\",\"name\":\"proofHeight\",\"type\":\"tuple\"},{\"internalType\":\"bytes[]\",\"name\":\"path\",\"type\":\"bytes[]\"}],\"internalType\":\"struct ILightClientMsgs.MsgVerifyNonMembership\",\"name\":\"msg_\",\"type\":\"tuple\"}],\"name\":\"verifyNonMembership\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"errors\":{\"AccessControlBadConfirmation()\":[{\"details\":\"The caller of a function is not the expected one. NOTE: Don't confuse with {AccessControlUnauthorizedAccount}.\"}],\"AccessControlUnauthorizedAccount(address,bytes32)\":[{\"details\":\"The `account` is missing a role.\"}],\"BadQuorum(uint8,uint256)\":[{\"params\":{\"attestationCount\":\"The size of the configured attestation set.\",\"minRequired\":\"The provided minimum required signatures.\"}}],\"ConsensusTimestampNotFound(uint64)\":[{\"params\":{\"height\":\"The height that has no associated timestamp.\"}}],\"DuplicateSigner(address)\":[{\"params\":{\"signer\":\"Address of the duplicate signer.\"}}],\"ECDSAInvalidSignature()\":[{\"details\":\"The signature derives the `address(0)`.\"}],\"ECDSAInvalidSignatureLength(uint256)\":[{\"details\":\"The signature has an invalid length.\"}],\"ECDSAInvalidSignatureS(bytes32)\":[{\"details\":\"The signature has an S value that is in the upper half order.\"}],\"HeightMismatch(uint64,uint64)\":[{\"params\":{\"expected\":\"The expected height from the proofHeight field.\",\"provided\":\"The height that was present in the attested payload.\"}}],\"InvalidPathLength(uint256,uint256)\":[{\"params\":{\"expectedLength\":\"The expected length of the path.\",\"providedLength\":\"The length of the provided path.\"}}],\"InvalidSignatureLength(bytes)\":[{\"params\":{\"signature\":\"The invalid signature.\"}}],\"InvalidState(uint64,uint64)\":[{\"params\":{\"height\":\"The height of the attested state.\",\"timestamp\":\"The timestamp of the attested state.\"}}],\"SignatureInvalid(bytes)\":[{\"params\":{\"signature\":\"The invalid signature.\"}}],\"ThresholdNotMet(uint256,uint8)\":[{\"params\":{\"minRequired\":\"The minimum required signatures.\",\"validSigners\":\"Number of valid, unique attestation signatures.\"}}],\"UnknownSigner(address)\":[{\"params\":{\"signer\":\"Address of the unknown signer.\"}}]},\"events\":{\"RoleAdminChanged(bytes32,bytes32,bytes32)\":{\"details\":\"Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite {RoleAdminChanged} not being emitted to signal this.\"},\"RoleGranted(bytes32,address,address)\":{\"details\":\"Emitted when `account` is granted `role`. `sender` is the account that originated the contract call. This account bears the admin role (for the granted role). Expected in cases where the role was granted using the internal {AccessControl-_grantRole}.\"},\"RoleRevoked(bytes32,address,address)\":{\"details\":\"Emitted when `account` is revoked `role`. `sender` is the account that originated the contract call: - if using `revokeRole`, it is the admin role bearer - if using `renounceRole`, it is the role bearer (i.e. `account`)\"}},\"kind\":\"dev\",\"methods\":{\"constructor\":{\"params\":{\"attestorAddresses\":\"The configured attestor addresses (EOAs)\",\"initialHeight\":\"The initial known height\",\"initialTimestampSeconds\":\"The initial timestamp in seconds for the initial height\",\"minRequiredSigs\":\"The quorum threshold\",\"roleManager\":\"Address that will administer roles and be allowed to submit proofs; if zero, anyone can submit\"}},\"getAttestationSet()\":{\"details\":\"The attestation set is fixed for the initial scope; rotation is out of scope.\",\"returns\":{\"attestorAddresses\":\"The configured attestor EOA addresses\",\"minRequiredSigs\":\"The minimum number of unique valid signatures required\"}},\"getClientState()\":{\"returns\":{\"_0\":\"The client state.\"}},\"getConsensusTimestamp(uint64)\":{\"params\":{\"revisionHeight\":\"The height for which to query the timestamp\"},\"returns\":{\"_0\":\"The trusted timestamp in unix seconds\"}},\"getRoleAdmin(bytes32)\":{\"details\":\"Returns the admin role that controls `role`. See {grantRole} and {revokeRole}. To change a role's admin, use {_setRoleAdmin}.\"},\"grantRole(bytes32,address)\":{\"details\":\"Grants `role` to `account`. If `account` had not been already granted `role`, emits a {RoleGranted} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleGranted} event.\"},\"hasRole(bytes32,address)\":{\"details\":\"Returns `true` if `account` has been granted `role`.\"},\"misbehaviour(bytes)\":{\"params\":{\"misbehaviourMsg\":\"The misbehaviour message\"}},\"renounceRole(bytes32,address)\":{\"details\":\"Revokes `role` from the calling account. Roles are often managed via {grantRole} and {revokeRole}: this function's purpose is to provide a mechanism for accounts to lose their privileges if they are compromised (such as when a trusted device is misplaced). If the calling account had been revoked `role`, emits a {RoleRevoked} event. Requirements: - the caller must be `callerConfirmation`. May emit a {RoleRevoked} event.\"},\"revokeRole(bytes32,address)\":{\"details\":\"Revokes `role` from `account`. If `account` had been granted `role`, emits a {RoleRevoked} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleRevoked} event.\"},\"supportsInterface(bytes4)\":{\"details\":\"Returns true if this contract implements the interface defined by `interfaceId`. See the corresponding https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[ERC section] to learn more about how these ids are created. This function call must use less than 30 000 gas.\"},\"updateClient(bytes)\":{\"params\":{\"updateMsg\":\"The encoded update message e.g., an SP1 proof.\"},\"returns\":{\"_0\":\"The result of the update operation\"}},\"verifyMembership((bytes,(uint64,uint64),bytes[],bytes))\":{\"details\":\"Notice that this message is not view, as it may update the client state for caching purposes.\",\"params\":{\"msg_\":\"The membership message\"},\"returns\":{\"_0\":\"The unix timestamp of the verification height in the counterparty chain in seconds.\"}},\"verifyNonMembership((bytes,(uint64,uint64),bytes[]))\":{\"details\":\"Notice that this message is not view, as it may update the client state for caching purposes.\",\"params\":{\"msg_\":\"The membership message\"},\"returns\":{\"_0\":\"The unix timestamp of the verification height in the counterparty chain in seconds.\"}}},\"stateVariables\":{\"PROOF_SUBMITTER_ROLE\":{\"details\":\"If `address(0)` has this role, then anyone can submit proofs. If this client is used with `ICS26Router`, the router must be granted this role.\",\"return\":\"The role identifier\",\"returns\":{\"_0\":\"The role identifier\"}}},\"title\":\"Attestation-based IBC Light Client\",\"version\":1},\"userdoc\":{\"errors\":{\"BadQuorum(uint8,uint256)\":[{\"notice\":\"Reverts when the quorum threshold is zero or exceeds the attestation count.\"}],\"ConsensusTimestampNotFound(uint64)\":[{\"notice\":\"Missing trusted timestamp for the given height.\"}],\"DuplicateSigner(address)\":[{\"notice\":\"The recovered signer appears more than once among the signatures.\"}],\"EmptyPackets()\":[{\"notice\":\"The provided packet attestations were empty.\"}],\"EmptySignatures()\":[{\"notice\":\"The provided signatures were empty.\"}],\"EmptyValue()\":[{\"notice\":\"The provided membership value was empty.\"}],\"FeatureNotSupported()\":[{\"notice\":\"Reverts for functions that are out of scope for this implementation.\"}],\"FrozenClientState()\":[{\"notice\":\"Reverts when an action is attempted on a frozen client state.\"}],\"HeightMismatch(uint64,uint64)\":[{\"notice\":\"The attested height did not match the provided proof height.\"}],\"InvalidPathLength(uint256,uint256)\":[{\"notice\":\"The provided proof path length is invalid.\"}],\"InvalidSignatureLength(bytes)\":[{\"notice\":\"ECDSA signature has an invalid length.\"}],\"InvalidState(uint64,uint64)\":[{\"notice\":\"The attested state is invalid.\"}],\"NoAttestors()\":[{\"notice\":\"Reverts when the attestation set is empty during initialization.\"}],\"NotMember()\":[{\"notice\":\"The provided value is not a member of the attested set.\"}],\"NotNonMember()\":[{\"notice\":\"The attested commitment is not zero (receipt exists, so packet was received).\"}],\"SignatureInvalid(bytes)\":[{\"notice\":\"ECDSA signature failed to recover a valid signer.\"}],\"ThresholdNotMet(uint256,uint8)\":[{\"notice\":\"The number of valid unique signatures is below the required threshold.\"}],\"UnknownSigner(address)\":[{\"notice\":\"The recovered signer is not part of the attestation set.\"}]},\"kind\":\"user\",\"methods\":{\"PROOF_SUBMITTER_ROLE()\":{\"notice\":\"The role identifier for the proof submitter role\"},\"constructor\":{\"notice\":\"Initializes the attestor light client with its fixed attestor set and initial height/timestamp.\"},\"getAttestationSet()\":{\"notice\":\"Returns the attestation set configuration.\"},\"getClientState()\":{\"notice\":\"Returns the client state.\"},\"getConsensusTimestamp(uint64)\":{\"notice\":\"Returns the trusted consensus timestamp (in seconds) at the given revision height.\"},\"misbehaviour(bytes)\":{\"notice\":\"Misbehaviour handling, moves the light client to the frozen state if misbehaviour is detected\"},\"updateClient(bytes)\":{\"notice\":\"Updating the client and consensus state\"},\"verifyMembership((bytes,(uint64,uint64),bytes[],bytes))\":{\"notice\":\"Querying the membership of a key-value pair\"},\"verifyNonMembership((bytes,(uint64,uint64),bytes[]))\":{\"notice\":\"Querying the non-membership of a key\"}},\"notice\":\"Implements an IBC light client that trusts an off-chain m-of-n attestor set.\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/light-clients/attestation/AttestationLightClient.sol\":\"AttestationLightClient\"},\"evmVersion\":\"cancun\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"none\"},\"optimizer\":{\"enabled\":true,\"runs\":10000},\"remappings\":[\":@openzeppelin-contracts/=node_modules/@openzeppelin/contracts/\",\":@openzeppelin-upgradeable/=node_modules/@openzeppelin/contracts-upgradeable/\",\":@openzeppelin/=node_modules/@openzeppelin/\",\":@sp1-contracts/=node_modules/sp1-contracts/contracts/src/\",\":@uniswap/permit2/=node_modules/@uniswap/permit2/\",\":forge-std/=node_modules/forge-std/src/\",\":sp1-contracts/=node_modules/sp1-contracts/\"],\"viaIR\":true},\"sources\":{\"contracts/interfaces/ILightClient.sol\":{\"keccak256\":\"0x1caae9e4f741a86c0056d5f7713a35f3bd96db7a9fd52fc9f1cf79aad76a442f\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://4a536db3b926560f69547c17e4f451a2631ddea0f42bd224c7fd8382d74429f6\",\"dweb:/ipfs/QmcQ33kxcmmowXgMbQGTBgiKBjF7v8UiP4y73bB9hhDizC\"]},\"contracts/light-clients/attestation/AttestationLightClient.sol\":{\"keccak256\":\"0xb287ccfd4e7b3baa99215a62484a99117b3be10d9765899c221f3fb0d54876fd\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://752979b4fe813e9cee697e2c29c7b119f8f0f84e2a9b6b1d0db97685a4435660\",\"dweb:/ipfs/QmTxfSdTKcrfaKKKtsX5Wy8RVMYcyYfkKCaDm2brNYTLFz\"]},\"contracts/light-clients/attestation/errors/IAttestationLightClientErrors.sol\":{\"keccak256\":\"0x0d3592b3c36cfcde83e2510bb9179b41befb486cbb65f529ff68c09fad751564\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://8d9bd1170d3954f7af6bd9fe79efbeff8f943073d27eb7bbecc8b9c66a0bdc62\",\"dweb:/ipfs/QmRuorHcJVhDJdYf7y43tyZuDowoBGkeRjH2z9C939XuDa\"]},\"contracts/light-clients/attestation/interfaces/IAttestationLightClient.sol\":{\"keccak256\":\"0x115ffce5474e6127fdb1f2b9284ea6d51ec978efd47f4425ba693c6c69d8b0af\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://bebb9e7d156b1a3ec682ff9cb8c9680b718bf0ae8e217ed153811dd399e456e8\",\"dweb:/ipfs/QmcjbxSBU4jvZMxn7PYYM6fxLCovWj1rKAtZazXY2RSA8U\"]},\"contracts/light-clients/attestation/msgs/IAttestationLightClientMsgs.sol\":{\"keccak256\":\"0x08148f1409f7e3c8968916950d920b8a4352796191875a4672ad2404e3541ef5\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://94c4b12d851c5e7b581d2794c88481df658eaf55ad4e54ddef14423c90986a67\",\"dweb:/ipfs/QmZysvpbY1Xe7kNVw1iHZsPaVMUMqLauJssyrceQybBgXw\"]},\"contracts/light-clients/attestation/msgs/IAttestationMsgs.sol\":{\"keccak256\":\"0xba7901ec5fb4a4845272501a1a0b183309cd0ae37d9ec5f9e3c6ce699bfd281f\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://72d0768a801a3c70910c10a1fc48c29c62d902dc602e20d72a1388ba498e8a4b\",\"dweb:/ipfs/QmUKLdbX2NwSyHFrh2WUHLm4zdFivu3Ryw2XyjT3R9Szse\"]},\"contracts/msgs/IICS02ClientMsgs.sol\":{\"keccak256\":\"0xb5fdb25319d5c32b3f527982d45ec1e9bec5215515581aee034d853006ea01a0\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://6b8939bf552c62c952a491008bcd9b59ab7dda20a9482bf93438e05793881542\",\"dweb:/ipfs/QmfWmzNCp8bd4pP26Lfw5HHp4dSZnCDqZDjVN7SD8P7eDh\"]},\"contracts/msgs/ILightClientMsgs.sol\":{\"keccak256\":\"0xa0565e7748b8b3284d72e1aa6ef4cc8264fcaa5f4e0761d22d64686953db6378\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://c4476010d7090bfaa74127526f2051c6bc82ff42a09b936e848880a1f15a6065\",\"dweb:/ipfs/QmY87JgRsFQXSZdGXNjNHEJCkdTHzFXH4vZEJ3q7MnHuP8\"]},\"node_modules/@openzeppelin/contracts/access/AccessControl.sol\":{\"keccak256\":\"0x1a6b4f6b7798ab80929d491b89d5427a9b3338c0fd1acd0ba325f69c6f1646af\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://7bb7f346c12a14dc622bc105ce3c47202fbc89f4b153a28a63bb68193297330c\",\"dweb:/ipfs/QmagwF8P3bUBXwdo159ueEnY9dLSvEWwK24kk2op58egwG\"]},\"node_modules/@openzeppelin/contracts/access/IAccessControl.sol\":{\"keccak256\":\"0xbff9f59c84e5337689161ce7641c0ef8e872d6a7536fbc1f5133f128887aba3c\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://b308f882e796f7b79c9502deacb0a62983035c6f6f4e962b319ba6a1f4a77d3d\",\"dweb:/ipfs/QmaWCW7ahEQqFjwhSUhV7Ae7WhfNvzSpE7DQ58hvEooqPL\"]},\"node_modules/@openzeppelin/contracts/utils/Context.sol\":{\"keccak256\":\"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://6a708e8a5bdb1011c2c381c9a5cfd8a9a956d7d0a9dc1bd8bcdaf52f76ef2f12\",\"dweb:/ipfs/Qmax9WHBnVsZP46ZxEMNRQpLQnrdE4dK8LehML1Py8FowF\"]},\"node_modules/@openzeppelin/contracts/utils/cryptography/ECDSA.sol\":{\"keccak256\":\"0x69f54c02b7d81d505910ec198c11ed4c6a728418a868b906b4a0cf29946fda84\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://8e25e4bdb7ae1f21d23bfee996e22736fc0ab44cfabedac82a757b1edc5623b9\",\"dweb:/ipfs/QmQdWQvB6JCP9ZMbzi8EvQ1PTETqkcTWrbcVurS7DKpa5n\"]},\"node_modules/@openzeppelin/contracts/utils/introspection/ERC165.sol\":{\"keccak256\":\"0x2d9dc2fe26180f74c11c13663647d38e259e45f95eb88f57b61d2160b0109d3e\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://81233d1f98060113d9922180bb0f14f8335856fe9f339134b09335e9f678c377\",\"dweb:/ipfs/QmWh6R35SarhAn4z2wH8SU456jJSYL2FgucfTFgbHJJN4E\"]},\"node_modules/@openzeppelin/contracts/utils/introspection/IERC165.sol\":{\"keccak256\":\"0x8891738ffe910f0cf2da09566928589bf5d63f4524dd734fd9cedbac3274dd5c\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://971f954442df5c2ef5b5ebf1eb245d7105d9fbacc7386ee5c796df1d45b21617\",\"dweb:/ipfs/QmadRjHbkicwqwwh61raUEapaVEtaLMcYbQZWs9gUkgj3u\"]}},\"version\":1}","metadata":{"compiler":{"version":"0.8.28+commit.7893614a"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"address[]","name":"attestorAddresses","type":"address[]"},{"internalType":"uint8","name":"minRequiredSigs","type":"uint8"},{"internalType":"uint64","name":"initialHeight","type":"uint64"},{"internalType":"uint64","name":"initialTimestampSeconds","type":"uint64"},{"internalType":"address","name":"roleManager","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"type":"error","name":"AccessControlBadConfirmation"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bytes32","name":"neededRole","type":"bytes32"}],"type":"error","name":"AccessControlUnauthorizedAccount"},{"inputs":[{"internalType":"uint8","name":"minRequired","type":"uint8"},{"internalType":"uint256","name":"attestationCount","type":"uint256"}],"type":"error","name":"BadQuorum"},{"inputs":[{"internalType":"uint64","name":"height","type":"uint64"}],"type":"error","name":"ConsensusTimestampNotFound"},{"inputs":[{"internalType":"address","name":"signer","type":"address"}],"type":"error","name":"DuplicateSigner"},{"inputs":[],"type":"error","name":"ECDSAInvalidSignature"},{"inputs":[{"internalType":"uint256","name":"length","type":"uint256"}],"type":"error","name":"ECDSAInvalidSignatureLength"},{"inputs":[{"internalType":"bytes32","name":"s","type":"bytes32"}],"type":"error","name":"ECDSAInvalidSignatureS"},{"inputs":[],"type":"error","name":"EmptyPackets"},{"inputs":[],"type":"error","name":"EmptySignatures"},{"inputs":[],"type":"error","name":"EmptyValue"},{"inputs":[],"type":"error","name":"FeatureNotSupported"},{"inputs":[],"type":"error","name":"FrozenClientState"},{"inputs":[{"internalType":"uint64","name":"expected","type":"uint64"},{"internalType":"uint64","name":"provided","type":"uint64"}],"type":"error","name":"HeightMismatch"},{"inputs":[{"internalType":"uint256","name":"expectedLength","type":"uint256"},{"internalType":"uint256","name":"providedLength","type":"uint256"}],"type":"error","name":"InvalidPathLength"},{"inputs":[{"internalType":"bytes","name":"signature","type":"bytes"}],"type":"error","name":"InvalidSignatureLength"},{"inputs":[{"internalType":"uint64","name":"height","type":"uint64"},{"internalType":"uint64","name":"timestamp","type":"uint64"}],"type":"error","name":"InvalidState"},{"inputs":[],"type":"error","name":"NoAttestors"},{"inputs":[],"type":"error","name":"NotMember"},{"inputs":[],"type":"error","name":"NotNonMember"},{"inputs":[{"internalType":"bytes","name":"signature","type":"bytes"}],"type":"error","name":"SignatureInvalid"},{"inputs":[{"internalType":"uint256","name":"validSigners","type":"uint256"},{"internalType":"uint8","name":"minRequired","type":"uint8"}],"type":"error","name":"ThresholdNotMet"},{"inputs":[{"internalType":"address","name":"signer","type":"address"}],"type":"error","name":"UnknownSigner"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32","indexed":true},{"internalType":"bytes32","name":"previousAdminRole","type":"bytes32","indexed":true},{"internalType":"bytes32","name":"newAdminRole","type":"bytes32","indexed":true}],"type":"event","name":"RoleAdminChanged","anonymous":false},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32","indexed":true},{"internalType":"address","name":"account","type":"address","indexed":true},{"internalType":"address","name":"sender","type":"address","indexed":true}],"type":"event","name":"RoleGranted","anonymous":false},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32","indexed":true},{"internalType":"address","name":"account","type":"address","indexed":true},{"internalType":"address","name":"sender","type":"address","indexed":true}],"type":"event","name":"RoleRevoked","anonymous":false},{"inputs":[],"stateMutability":"view","type":"function","name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"PROOF_SUBMITTER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"getAttestationSet","outputs":[{"internalType":"address[]","name":"attestorAddresses","type":"address[]"},{"internalType":"uint8","name":"minRequiredSigs","type":"uint8"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"getClientState","outputs":[{"internalType":"bytes","name":"","type":"bytes"}]},{"inputs":[{"internalType":"uint64","name":"revisionHeight","type":"uint64"}],"stateMutability":"view","type":"function","name":"getConsensusTimestamp","outputs":[{"internalType":"uint64","name":"","type":"uint64"}]},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"stateMutability":"view","type":"function","name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}]},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"stateMutability":"nonpayable","type":"function","name":"grantRole"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"stateMutability":"view","type":"function","name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}]},{"inputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function","name":"misbehaviour"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"callerConfirmation","type":"address"}],"stateMutability":"nonpayable","type":"function","name":"renounceRole"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"stateMutability":"nonpayable","type":"function","name":"revokeRole"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"stateMutability":"view","type":"function","name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}]},{"inputs":[{"internalType":"bytes","name":"updateMsg","type":"bytes"}],"stateMutability":"nonpayable","type":"function","name":"updateClient","outputs":[{"internalType":"enum ILightClientMsgs.UpdateResult","name":"","type":"uint8"}]},{"inputs":[{"internalType":"struct ILightClientMsgs.MsgVerifyMembership","name":"msg_","type":"tuple","components":[{"internalType":"bytes","name":"proof","type":"bytes"},{"internalType":"struct IICS02ClientMsgs.Height","name":"proofHeight","type":"tuple","components":[{"internalType":"uint64","name":"revisionNumber","type":"uint64"},{"internalType":"uint64","name":"revisionHeight","type":"uint64"}]},{"internalType":"bytes[]","name":"path","type":"bytes[]"},{"internalType":"bytes","name":"value","type":"bytes"}]}],"stateMutability":"view","type":"function","name":"verifyMembership","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[{"internalType":"struct ILightClientMsgs.MsgVerifyNonMembership","name":"msg_","type":"tuple","components":[{"internalType":"bytes","name":"proof","type":"bytes"},{"internalType":"struct IICS02ClientMsgs.Height","name":"proofHeight","type":"tuple","components":[{"internalType":"uint64","name":"revisionNumber","type":"uint64"},{"internalType":"uint64","name":"revisionHeight","type":"uint64"}]},{"internalType":"bytes[]","name":"path","type":"bytes[]"}]}],"stateMutability":"view","type":"function","name":"verifyNonMembership","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]}],"devdoc":{"kind":"dev","methods":{"constructor":{"params":{"attestorAddresses":"The configured attestor addresses (EOAs)","initialHeight":"The initial known height","initialTimestampSeconds":"The initial timestamp in seconds for the initial height","minRequiredSigs":"The quorum threshold","roleManager":"Address that will administer roles and be allowed to submit proofs; if zero, anyone can submit"}},"getAttestationSet()":{"details":"The attestation set is fixed for the initial scope; rotation is out of scope.","returns":{"attestorAddresses":"The configured attestor EOA addresses","minRequiredSigs":"The minimum number of unique valid signatures required"}},"getClientState()":{"returns":{"_0":"The client state."}},"getConsensusTimestamp(uint64)":{"params":{"revisionHeight":"The height for which to query the timestamp"},"returns":{"_0":"The trusted timestamp in unix seconds"}},"getRoleAdmin(bytes32)":{"details":"Returns the admin role that controls `role`. See {grantRole} and {revokeRole}. To change a role's admin, use {_setRoleAdmin}."},"grantRole(bytes32,address)":{"details":"Grants `role` to `account`. If `account` had not been already granted `role`, emits a {RoleGranted} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleGranted} event."},"hasRole(bytes32,address)":{"details":"Returns `true` if `account` has been granted `role`."},"misbehaviour(bytes)":{"params":{"misbehaviourMsg":"The misbehaviour message"}},"renounceRole(bytes32,address)":{"details":"Revokes `role` from the calling account. Roles are often managed via {grantRole} and {revokeRole}: this function's purpose is to provide a mechanism for accounts to lose their privileges if they are compromised (such as when a trusted device is misplaced). If the calling account had been revoked `role`, emits a {RoleRevoked} event. Requirements: - the caller must be `callerConfirmation`. May emit a {RoleRevoked} event."},"revokeRole(bytes32,address)":{"details":"Revokes `role` from `account`. If `account` had been granted `role`, emits a {RoleRevoked} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleRevoked} event."},"supportsInterface(bytes4)":{"details":"Returns true if this contract implements the interface defined by `interfaceId`. See the corresponding https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[ERC section] to learn more about how these ids are created. This function call must use less than 30 000 gas."},"updateClient(bytes)":{"params":{"updateMsg":"The encoded update message e.g., an SP1 proof."},"returns":{"_0":"The result of the update operation"}},"verifyMembership((bytes,(uint64,uint64),bytes[],bytes))":{"details":"Notice that this message is not view, as it may update the client state for caching purposes.","params":{"msg_":"The membership message"},"returns":{"_0":"The unix timestamp of the verification height in the counterparty chain in seconds."}},"verifyNonMembership((bytes,(uint64,uint64),bytes[]))":{"details":"Notice that this message is not view, as it may update the client state for caching purposes.","params":{"msg_":"The membership message"},"returns":{"_0":"The unix timestamp of the verification height in the counterparty chain in seconds."}}},"version":1},"userdoc":{"kind":"user","methods":{"PROOF_SUBMITTER_ROLE()":{"notice":"The role identifier for the proof submitter role"},"constructor":{"notice":"Initializes the attestor light client with its fixed attestor set and initial height/timestamp."},"getAttestationSet()":{"notice":"Returns the attestation set configuration."},"getClientState()":{"notice":"Returns the client state."},"getConsensusTimestamp(uint64)":{"notice":"Returns the trusted consensus timestamp (in seconds) at the given revision height."},"misbehaviour(bytes)":{"notice":"Misbehaviour handling, moves the light client to the frozen state if misbehaviour is detected"},"updateClient(bytes)":{"notice":"Updating the client and consensus state"},"verifyMembership((bytes,(uint64,uint64),bytes[],bytes))":{"notice":"Querying the membership of a key-value pair"},"verifyNonMembership((bytes,(uint64,uint64),bytes[]))":{"notice":"Querying the non-membership of a key"}},"version":1}},"settings":{"remappings":["@openzeppelin-contracts/=node_modules/@openzeppelin/contracts/","@openzeppelin-upgradeable/=node_modules/@openzeppelin/contracts-upgradeable/","@openzeppelin/=node_modules/@openzeppelin/","@sp1-contracts/=node_modules/sp1-contracts/contracts/src/","@uniswap/permit2/=node_modules/@uniswap/permit2/","forge-std/=node_modules/forge-std/src/","sp1-contracts/=node_modules/sp1-contracts/"],"optimizer":{"enabled":true,"runs":10000},"metadata":{"bytecodeHash":"none"},"compilationTarget":{"contracts/light-clients/attestation/AttestationLightClient.sol":"AttestationLightClient"},"evmVersion":"cancun","libraries":{},"viaIR":true},"sources":{"contracts/interfaces/ILightClient.sol":{"keccak256":"0x1caae9e4f741a86c0056d5f7713a35f3bd96db7a9fd52fc9f1cf79aad76a442f","urls":["bzz-raw://4a536db3b926560f69547c17e4f451a2631ddea0f42bd224c7fd8382d74429f6","dweb:/ipfs/QmcQ33kxcmmowXgMbQGTBgiKBjF7v8UiP4y73bB9hhDizC"],"license":"MIT"},"contracts/light-clients/attestation/AttestationLightClient.sol":{"keccak256":"0xb287ccfd4e7b3baa99215a62484a99117b3be10d9765899c221f3fb0d54876fd","urls":["bzz-raw://752979b4fe813e9cee697e2c29c7b119f8f0f84e2a9b6b1d0db97685a4435660","dweb:/ipfs/QmTxfSdTKcrfaKKKtsX5Wy8RVMYcyYfkKCaDm2brNYTLFz"],"license":"MIT"},"contracts/light-clients/attestation/errors/IAttestationLightClientErrors.sol":{"keccak256":"0x0d3592b3c36cfcde83e2510bb9179b41befb486cbb65f529ff68c09fad751564","urls":["bzz-raw://8d9bd1170d3954f7af6bd9fe79efbeff8f943073d27eb7bbecc8b9c66a0bdc62","dweb:/ipfs/QmRuorHcJVhDJdYf7y43tyZuDowoBGkeRjH2z9C939XuDa"],"license":"MIT"},"contracts/light-clients/attestation/interfaces/IAttestationLightClient.sol":{"keccak256":"0x115ffce5474e6127fdb1f2b9284ea6d51ec978efd47f4425ba693c6c69d8b0af","urls":["bzz-raw://bebb9e7d156b1a3ec682ff9cb8c9680b718bf0ae8e217ed153811dd399e456e8","dweb:/ipfs/QmcjbxSBU4jvZMxn7PYYM6fxLCovWj1rKAtZazXY2RSA8U"],"license":"MIT"},"contracts/light-clients/attestation/msgs/IAttestationLightClientMsgs.sol":{"keccak256":"0x08148f1409f7e3c8968916950d920b8a4352796191875a4672ad2404e3541ef5","urls":["bzz-raw://94c4b12d851c5e7b581d2794c88481df658eaf55ad4e54ddef14423c90986a67","dweb:/ipfs/QmZysvpbY1Xe7kNVw1iHZsPaVMUMqLauJssyrceQybBgXw"],"license":"MIT"},"contracts/light-clients/attestation/msgs/IAttestationMsgs.sol":{"keccak256":"0xba7901ec5fb4a4845272501a1a0b183309cd0ae37d9ec5f9e3c6ce699bfd281f","urls":["bzz-raw://72d0768a801a3c70910c10a1fc48c29c62d902dc602e20d72a1388ba498e8a4b","dweb:/ipfs/QmUKLdbX2NwSyHFrh2WUHLm4zdFivu3Ryw2XyjT3R9Szse"],"license":"MIT"},"contracts/msgs/IICS02ClientMsgs.sol":{"keccak256":"0xb5fdb25319d5c32b3f527982d45ec1e9bec5215515581aee034d853006ea01a0","urls":["bzz-raw://6b8939bf552c62c952a491008bcd9b59ab7dda20a9482bf93438e05793881542","dweb:/ipfs/QmfWmzNCp8bd4pP26Lfw5HHp4dSZnCDqZDjVN7SD8P7eDh"],"license":"MIT"},"contracts/msgs/ILightClientMsgs.sol":{"keccak256":"0xa0565e7748b8b3284d72e1aa6ef4cc8264fcaa5f4e0761d22d64686953db6378","urls":["bzz-raw://c4476010d7090bfaa74127526f2051c6bc82ff42a09b936e848880a1f15a6065","dweb:/ipfs/QmY87JgRsFQXSZdGXNjNHEJCkdTHzFXH4vZEJ3q7MnHuP8"],"license":"MIT"},"node_modules/@openzeppelin/contracts/access/AccessControl.sol":{"keccak256":"0x1a6b4f6b7798ab80929d491b89d5427a9b3338c0fd1acd0ba325f69c6f1646af","urls":["bzz-raw://7bb7f346c12a14dc622bc105ce3c47202fbc89f4b153a28a63bb68193297330c","dweb:/ipfs/QmagwF8P3bUBXwdo159ueEnY9dLSvEWwK24kk2op58egwG"],"license":"MIT"},"node_modules/@openzeppelin/contracts/access/IAccessControl.sol":{"keccak256":"0xbff9f59c84e5337689161ce7641c0ef8e872d6a7536fbc1f5133f128887aba3c","urls":["bzz-raw://b308f882e796f7b79c9502deacb0a62983035c6f6f4e962b319ba6a1f4a77d3d","dweb:/ipfs/QmaWCW7ahEQqFjwhSUhV7Ae7WhfNvzSpE7DQ58hvEooqPL"],"license":"MIT"},"node_modules/@openzeppelin/contracts/utils/Context.sol":{"keccak256":"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2","urls":["bzz-raw://6a708e8a5bdb1011c2c381c9a5cfd8a9a956d7d0a9dc1bd8bcdaf52f76ef2f12","dweb:/ipfs/Qmax9WHBnVsZP46ZxEMNRQpLQnrdE4dK8LehML1Py8FowF"],"license":"MIT"},"node_modules/@openzeppelin/contracts/utils/cryptography/ECDSA.sol":{"keccak256":"0x69f54c02b7d81d505910ec198c11ed4c6a728418a868b906b4a0cf29946fda84","urls":["bzz-raw://8e25e4bdb7ae1f21d23bfee996e22736fc0ab44cfabedac82a757b1edc5623b9","dweb:/ipfs/QmQdWQvB6JCP9ZMbzi8EvQ1PTETqkcTWrbcVurS7DKpa5n"],"license":"MIT"},"node_modules/@openzeppelin/contracts/utils/introspection/ERC165.sol":{"keccak256":"0x2d9dc2fe26180f74c11c13663647d38e259e45f95eb88f57b61d2160b0109d3e","urls":["bzz-raw://81233d1f98060113d9922180bb0f14f8335856fe9f339134b09335e9f678c377","dweb:/ipfs/QmWh6R35SarhAn4z2wH8SU456jJSYL2FgucfTFgbHJJN4E"],"license":"MIT"},"node_modules/@openzeppelin/contracts/utils/introspection/IERC165.sol":{"keccak256":"0x8891738ffe910f0cf2da09566928589bf5d63f4524dd734fd9cedbac3274dd5c","urls":["bzz-raw://971f954442df5c2ef5b5ebf1eb245d7105d9fbacc7386ee5c796df1d45b21617","dweb:/ipfs/QmadRjHbkicwqwwh61raUEapaVEtaLMcYbQZWs9gUkgj3u"],"license":"MIT"}},"version":1},"id":29} \ No newline at end of file +{"abi":[{"type":"constructor","inputs":[{"name":"attestorAddresses","type":"address[]","internalType":"address[]"},{"name":"minRequiredSigs","type":"uint8","internalType":"uint8"},{"name":"initialHeight","type":"uint64","internalType":"uint64"},{"name":"initialTimestampSeconds","type":"uint64","internalType":"uint64"},{"name":"roleManager","type":"address","internalType":"address"}],"stateMutability":"nonpayable"},{"type":"function","name":"DEFAULT_ADMIN_ROLE","inputs":[],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"type":"function","name":"PROOF_SUBMITTER_ROLE","inputs":[],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"type":"function","name":"getAttestationSet","inputs":[],"outputs":[{"name":"attestorAddresses","type":"address[]","internalType":"address[]"},{"name":"minRequiredSigs","type":"uint8","internalType":"uint8"}],"stateMutability":"view"},{"type":"function","name":"getClientState","inputs":[],"outputs":[{"name":"","type":"bytes","internalType":"bytes"}],"stateMutability":"view"},{"type":"function","name":"getConsensusTimestamp","inputs":[{"name":"revisionHeight","type":"uint64","internalType":"uint64"}],"outputs":[{"name":"","type":"uint64","internalType":"uint64"}],"stateMutability":"view"},{"type":"function","name":"getRoleAdmin","inputs":[{"name":"role","type":"bytes32","internalType":"bytes32"}],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"type":"function","name":"grantRole","inputs":[{"name":"role","type":"bytes32","internalType":"bytes32"},{"name":"account","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"hasRole","inputs":[{"name":"role","type":"bytes32","internalType":"bytes32"},{"name":"account","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"misbehaviour","inputs":[{"name":"","type":"bytes","internalType":"bytes"}],"outputs":[],"stateMutability":"view"},{"type":"function","name":"renounceRole","inputs":[{"name":"role","type":"bytes32","internalType":"bytes32"},{"name":"callerConfirmation","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"revokeRole","inputs":[{"name":"role","type":"bytes32","internalType":"bytes32"},{"name":"account","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"supportsInterface","inputs":[{"name":"interfaceId","type":"bytes4","internalType":"bytes4"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"updateClient","inputs":[{"name":"updateMsg","type":"bytes","internalType":"bytes"}],"outputs":[{"name":"","type":"uint8","internalType":"enum ILightClientMsgs.UpdateResult"}],"stateMutability":"nonpayable"},{"type":"function","name":"verifyMembership","inputs":[{"name":"msg_","type":"tuple","internalType":"struct ILightClientMsgs.MsgVerifyMembership","components":[{"name":"proof","type":"bytes","internalType":"bytes"},{"name":"proofHeight","type":"tuple","internalType":"struct IICS02ClientMsgs.Height","components":[{"name":"revisionNumber","type":"uint64","internalType":"uint64"},{"name":"revisionHeight","type":"uint64","internalType":"uint64"}]},{"name":"path","type":"bytes[]","internalType":"bytes[]"},{"name":"value","type":"bytes","internalType":"bytes"}]}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"verifyNonMembership","inputs":[{"name":"msg_","type":"tuple","internalType":"struct ILightClientMsgs.MsgVerifyNonMembership","components":[{"name":"proof","type":"bytes","internalType":"bytes"},{"name":"proofHeight","type":"tuple","internalType":"struct IICS02ClientMsgs.Height","components":[{"name":"revisionNumber","type":"uint64","internalType":"uint64"},{"name":"revisionHeight","type":"uint64","internalType":"uint64"}]},{"name":"path","type":"bytes[]","internalType":"bytes[]"}]}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"event","name":"RoleAdminChanged","inputs":[{"name":"role","type":"bytes32","indexed":true,"internalType":"bytes32"},{"name":"previousAdminRole","type":"bytes32","indexed":true,"internalType":"bytes32"},{"name":"newAdminRole","type":"bytes32","indexed":true,"internalType":"bytes32"}],"anonymous":false},{"type":"event","name":"RoleGranted","inputs":[{"name":"role","type":"bytes32","indexed":true,"internalType":"bytes32"},{"name":"account","type":"address","indexed":true,"internalType":"address"},{"name":"sender","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"type":"event","name":"RoleRevoked","inputs":[{"name":"role","type":"bytes32","indexed":true,"internalType":"bytes32"},{"name":"account","type":"address","indexed":true,"internalType":"address"},{"name":"sender","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"type":"error","name":"AccessControlBadConfirmation","inputs":[]},{"type":"error","name":"AccessControlUnauthorizedAccount","inputs":[{"name":"account","type":"address","internalType":"address"},{"name":"neededRole","type":"bytes32","internalType":"bytes32"}]},{"type":"error","name":"BadQuorum","inputs":[{"name":"minRequired","type":"uint8","internalType":"uint8"},{"name":"attestationCount","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"ConsensusTimestampNotFound","inputs":[{"name":"height","type":"uint64","internalType":"uint64"}]},{"type":"error","name":"DuplicateSigner","inputs":[{"name":"signer","type":"address","internalType":"address"}]},{"type":"error","name":"ECDSAInvalidSignature","inputs":[]},{"type":"error","name":"ECDSAInvalidSignatureLength","inputs":[{"name":"length","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"ECDSAInvalidSignatureS","inputs":[{"name":"s","type":"bytes32","internalType":"bytes32"}]},{"type":"error","name":"EmptyPackets","inputs":[]},{"type":"error","name":"EmptySignatures","inputs":[]},{"type":"error","name":"EmptyValue","inputs":[]},{"type":"error","name":"FeatureNotSupported","inputs":[]},{"type":"error","name":"FrozenClientState","inputs":[]},{"type":"error","name":"HeightMismatch","inputs":[{"name":"expected","type":"uint64","internalType":"uint64"},{"name":"provided","type":"uint64","internalType":"uint64"}]},{"type":"error","name":"InvalidPathLength","inputs":[{"name":"expectedLength","type":"uint256","internalType":"uint256"},{"name":"providedLength","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"InvalidSignatureLength","inputs":[{"name":"signature","type":"bytes","internalType":"bytes"}]},{"type":"error","name":"InvalidState","inputs":[{"name":"height","type":"uint64","internalType":"uint64"},{"name":"timestamp","type":"uint64","internalType":"uint64"}]},{"type":"error","name":"NoAttestors","inputs":[]},{"type":"error","name":"NotMember","inputs":[]},{"type":"error","name":"NotNonMember","inputs":[]},{"type":"error","name":"SignatureInvalid","inputs":[{"name":"signature","type":"bytes","internalType":"bytes"}]},{"type":"error","name":"ThresholdNotMet","inputs":[{"name":"validSigners","type":"uint256","internalType":"uint256"},{"name":"minRequired","type":"uint8","internalType":"uint8"}]},{"type":"error","name":"UnknownSigner","inputs":[{"name":"signer","type":"address","internalType":"address"}]}],"bytecode":{"object":"0x60806040523461032d57611f568038038061001981610349565b928339810160a08282031261032d5781516001600160401b03811161032d57820181601f8201121561032d578051916001600160401b0383116102c8578260051b916020610068818501610349565b8095815201906020829482010192831161032d57602001905b8282106103315750505060208301519260ff841680940361032d576100a860408201610382565b6100c060806100b960608501610382565b930161036e565b9284511561031e57851515806102f2575b855190156102dc575060405195608087016001600160401b038111888210176102c857604052858752602087019081526060604088019360018060401b03169788855201915f835286519060018060401b0382116102c8576801000000000000000082116102c85760015482600155808310610284575b5060015f5260205f205f5b838110610267575050505060ff90511669ff00000000000000000060025493610100600160481b03905160081b169251151560481b169260018060501b0319161717176002555f5b83518110156101fb5760018060a01b0360208260051b8601015116805f52600360205260ff60405f2054166101e957906001915f52600360205260405f208260ff198254161790550161019b565b637010e27960e11b5f5260045260245ffd5b505f84815260046020526040902080546001600160401b0319166001600160401b039092169190911790556001600160a01b03811661024e575061023d61048c565b505b6040516119a7908161050f8239f35b8061025b61026192610396565b5061040c565b5061023f565b82516001600160a01b031681830155602090920191600101610153565b60015f527fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf69081019083015b8181106102bd5750610148565b5f81556001016102b0565b634e487b7160e01b5f52604160045260245ffd5b866365846b7f60e01b5f5260045260245260445ffd5b5084515f19870160ff811161030a5760ff16106100d1565b634e487b7160e01b5f52601160045260245ffd5b6343d0a89360e11b5f5260045ffd5b5f80fd5b6020809161033e8461036e565b815201910190610081565b6040519190601f01601f191682016001600160401b038111838210176102c857604052565b51906001600160a01b038216820361032d57565b51906001600160401b038216820361032d57565b6001600160a01b0381165f9081525f516020611f365f395f51905f52602052604090205460ff16610407576001600160a01b03165f8181525f516020611f365f395f51905f5260205260408120805460ff191660011790553391905f516020611eb65f395f51905f528180a4600190565b505f90565b6001600160a01b0381165f9081525f516020611ed65f395f51905f52602052604090205460ff16610407576001600160a01b03165f8181525f516020611ed65f395f51905f5260205260408120805460ff191660011790553391905f516020611f165f395f51905f52905f516020611eb65f395f51905f529080a4600190565b5f80525f516020611ed65f395f51905f526020525f516020611ef65f395f51905f525460ff1661050a575f8080525f516020611ed65f395f51905f526020525f516020611ef65f395f51905f52805460ff1916600117905533905f516020611f165f395f51905f525f516020611eb65f395f51905f528280a4600190565b5f9056fe6080806040526004361015610012575f80fd5b5f3560e01c90816301ffc9a7146106ab575080630bece356146105e8578063248a9ca3146105be5780632f2ff15d1461058f57806336568abe146105335780634d6d9ffb146104865780635832611b146104405780635972185a14610406578063682ed5f01461035157806391d1485414610308578063a217fddf146102ee578063a845a7f314610261578063d547741f1461022b578063ddba65371461015f5763ef913a4b146100c1575f80fd5b3461015b575f60031936011261015b576101576040516020808201526080604082015261014b816100f460c08201611228565b60ff600254818116606085015267ffffffffffffffff8160081c16608085015260481c16151560a0830152037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0810183528261085e565b604051918291826107cd565b0390f35b5f80fd5b3461015b5761016d36610749565b505060ff60025460481c16610203575f80527f4c48d1d2b0f4f7485fc28e3db22341d96a20aa29e6efa8149da9751603abd4e06020527f6e0c24a6e293ff9b755263dbaa15ba3796b0b8d3fe17cfb4ddf8143b268eac475460ff16156101f6575b7fda81d7c2000000000000000000000000000000000000000000000000000000005f5260045ffd5b6101fe611277565b6101ce565b7f928b1233000000000000000000000000000000000000000000000000000000005f5260045ffd5b3461015b5761025f61023c3661079a565b9061025a610255825f525f602052600160405f20015490565b6112ff565b61175e565b005b3461015b575f60031936011261015b5760ff6002541660405161028e8161028781611228565b038261085e565b60405190604082019260408352815180945260206060840192015f945b8086106102c057505082935060208301520390f35b909260208060019273ffffffffffffffffffffffffffffffffffffffff8751168152019401950194906102ab565b3461015b575f60031936011261015b5760206040515f8152f35b3461015b576103163661079a565b905f525f60205273ffffffffffffffffffffffffffffffffffffffff60405f2091165f52602052602060ff60405f2054166040519015158152f35b3461015b57602060031936011261015b5760043567ffffffffffffffff811161015b5760a0600319823603011261015b5760ff60025460481c16610203575f80527f4c48d1d2b0f4f7485fc28e3db22341d96a20aa29e6efa8149da9751603abd4e060209081527f6e0c24a6e293ff9b755263dbaa15ba3796b0b8d3fe17cfb4ddf8143b268eac475490916103f19160ff16156103f9575b6004016110cb565b604051908152f35b610401611277565b6103e9565b3461015b575f60031936011261015b5760206040517fbd893629a699470e4ec82a5715bb4981fdaacc5d0a728bf5f55b801d8f4ef10b8152f35b3461015b57602060031936011261015b5760043567ffffffffffffffff811680910361015b575f526004602052602067ffffffffffffffff60405f205416604051908152f35b3461015b57602060031936011261015b5760043567ffffffffffffffff811161015b576080600319823603011261015b5760ff60025460481c16610203575f80527f4c48d1d2b0f4f7485fc28e3db22341d96a20aa29e6efa8149da9751603abd4e060209081527f6e0c24a6e293ff9b755263dbaa15ba3796b0b8d3fe17cfb4ddf8143b268eac475490916103f19160ff1615610526575b600401610ef5565b61052e611277565b61051e565b3461015b576105413661079a565b3373ffffffffffffffffffffffffffffffffffffffff8216036105675761025f9161175e565b7f6697b232000000000000000000000000000000000000000000000000000000005f5260045ffd5b3461015b5761025f6105a03661079a565b906105b9610255825f525f602052600160405f20015490565b61168c565b3461015b57602060031936011261015b5760206103f16004355f525f602052600160405f20015490565b3461015b576105f636610749565b60ff60025460481c16610203575f80527f4c48d1d2b0f4f7485fc28e3db22341d96a20aa29e6efa8149da9751603abd4e06020527f6e0c24a6e293ff9b755263dbaa15ba3796b0b8d3fe17cfb4ddf8143b268eac475461065e929060ff161561069e57610a3c565b6040516003821015610671576020918152f35b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b6106a6611277565b610a3c565b3461015b57602060031936011261015b57600435907fffffffff00000000000000000000000000000000000000000000000000000000821680920361015b57817f7965db0b000000000000000000000000000000000000000000000000000000006020931490811561071f575b5015158152f35b7f01ffc9a70000000000000000000000000000000000000000000000000000000091501483610718565b90602060031983011261015b5760043567ffffffffffffffff811161015b578260238201121561015b5780600401359267ffffffffffffffff841161015b576024848301011161015b576024019190565b600319604091011261015b576004359060243573ffffffffffffffffffffffffffffffffffffffff8116810361015b5790565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f602060409481855280519182918282880152018686015e5f8582860101520116010190565b6040810190811067ffffffffffffffff82111761083157604052565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff82111761083157604052565b92919267ffffffffffffffff821161083157604051916108e760207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116018461085e565b82948184528183011161015b578281602093845f960137010152565b9080601f8301121561015b5781602061091e9335910161089f565b90565b67ffffffffffffffff81116108315760051b60200190565b60208183031261015b5780359067ffffffffffffffff821161015b57019060408282031261015b576040519161096e83610815565b803567ffffffffffffffff811161015b578261098b918301610903565b835260208101359067ffffffffffffffff821161015b57019080601f8301121561015b5781356109ba81610921565b926109c8604051948561085e565b81845260208085019260051b8201019183831161015b5760208201905b8382106109f9575050505050602082015290565b813567ffffffffffffffff811161015b57602091610a1c87848094880101610903565b8152019101906109e5565b519067ffffffffffffffff8216820361015b57565b610a4891810190610939565b60205f818351604051918183925191829101835e8101838152039060025afa15610c915760205f8051604051838101917f01000000000000000000000000000000000000000000000000000000000000008352602182015260218152610aaf60418261085e565b604051918291518091835e8101838152039060025afa15610c9157610ada5f516020830151906113eb565b5160408180518101031261015b57604051610af481610815565b610b0f6040610b0560208501610a27565b9384845201610a27565b67ffffffffffffffff60208301938285521680151580610c7e575b15610c4457505067ffffffffffffffff8151165f52600460205267ffffffffffffffff60405f20541680610bf3575067ffffffffffffffff9051918183169260025490838260081c168511610bb6575b50505116905f52600460205260405f20907fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000008254161790555f90565b68ffffffffffffffff007fffffffffffffffffffffffffffffffffffffffffffffff0000000000000000ff9160081b169116176002555f80610b7a565b9167ffffffffffffffff9150511603610c0b57600290565b69010000000000000000007fffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffff6002541617600255600190565b67ffffffffffffffff92507fdcbc5460000000000000000000000000000000000000000000000000000000005f526004521660245260445ffd5b5067ffffffffffffffff82161515610b2a565b6040513d5f823e3d90fd5b9035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18136030182121561015b570180359067ffffffffffffffff821161015b57602001918160051b3603831361015b57565b3567ffffffffffffffff8116810361015b5790565b15610d0d5750565b67ffffffffffffffff907ff7caaa5c000000000000000000000000000000000000000000000000000000005f521660045260245ffd5b9035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18136030182121561015b570180359067ffffffffffffffff821161015b5760200191813603831361015b57565b60208183031261015b5780519067ffffffffffffffff821161015b57019060408282031261015b5760405191610dc983610815565b610dd281610a27565b835260208101519067ffffffffffffffff821161015b570181601f8201121561015b57805190610e0182610921565b92610e0f604051948561085e565b82845260208085019360061b8301019181831161015b57602001925b828410610e3e5750505050602082015290565b60408483031261015b5760206040918251610e5881610815565b865181528287015183820152815201930192610e2b565b15610e78575050565b9067ffffffffffffffff80927fc7441689000000000000000000000000000000000000000000000000000000005f52166004521660245260445ffd5b8051821015610ec85760209160051b010190565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b6060810190610f048282610c9c565b90506001610f128484610c9c565b9290500361109b5750610fb8610f2a60408301610cf0565b9267ffffffffffffffff841692835f526004602052610fb367ffffffffffffffff60405f20541694610f5e87871515610d05565b610f9e610f76610f6e8580610d43565b810190610939565b610f8e610f838251611365565b6020830151906113eb565b5160208082518301019101610d94565b9667ffffffffffffffff885116918214610e6f565b610c9c565b15610ec857610fd3610fcc82602093610d43565b369161089f565b818151910120920180515115611073575f5b8151805182101561104b57610ffb828692610eb4565b51511461100a57600101610fe5565b60209293506110199151610eb4565b5101516110235790565b7f9a960b4f000000000000000000000000000000000000000000000000000000005f5260045ffd5b7f291fc442000000000000000000000000000000000000000000000000000000005f5260045ffd5b7f1e6c84da000000000000000000000000000000000000000000000000000000005f5260045ffd5b7f88b3170e000000000000000000000000000000000000000000000000000000005f52600160045260245260445ffd5b608081016110d98183610d43565b9050156112005760608201906110ef8284610c9c565b905060016110fd8486610c9c565b9290500361109b575061111260408401610cf0565b9061117467ffffffffffffffff831693845f52600460205261116e67ffffffffffffffff60405f2054169561114986881515610d05565b611159610f76610f6e8a80610d43565b9567ffffffffffffffff875116918214610e6f565b85610c9c565b15610ec85760209161118c610fcc8361119894610d43565b83815191012095610d43565b908092918101031261015b576020903591019081515115611073575f5b8251805182101561104b576111cb828792610eb4565b515114806111e8575b6111e0576001016111b5565b505050905090565b508160206111f7838651610eb4565b510151146111d4565b7f1208b21b000000000000000000000000000000000000000000000000000000005f5260045ffd5b602060015491828152019060015f5260205f20905f5b81811061124b5750505090565b825473ffffffffffffffffffffffffffffffffffffffff1684526020909301926001928301920161123e565b335f9081527f4c48d1d2b0f4f7485fc28e3db22341d96a20aa29e6efa8149da9751603abd4e0602052604090205460ff16156112af57565b7fe2517d3f000000000000000000000000000000000000000000000000000000005f52336004527fbd893629a699470e4ec82a5715bb4981fdaacc5d0a728bf5f55b801d8f4ef10b60245260445ffd5b805f525f60205260405f2073ffffffffffffffffffffffffffffffffffffffff33165f5260205260ff60405f205416156113365750565b7fe2517d3f000000000000000000000000000000000000000000000000000000005f523360045260245260445ffd5b5f60208092604051918183925191829101835e8101838152039060025afa15610c915760205f8051604051838101917f020000000000000000000000000000000000000000000000000000000000000083526021820152602181526113cb60418261085e565b604051918291518091835e8101838152039060025afa15610c91575f5190565b91909182511561166457825160ff60025416907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82019060ff82116116375760ff8651921610156116095750508251927fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe061147e61146886610921565b95611476604051978861085e565b808752610921565b013660208601375f5b81518110156116025761149a8183610eb4565b5160418151036115cc5773ffffffffffffffffffffffffffffffffffffffff6114cf6114c68387611826565b90929192611860565b169081156115925750805f52600360205260ff60405f20541615611567575f5b82811061150c5750906001916115058288610eb4565b5201611487565b8173ffffffffffffffffffffffffffffffffffffffff61152c838a610eb4565b51161461153b576001016114ef565b507fe021c4f2000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b7fd7e8a2c2000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b6115c8906040519182917f9e3c1b3d000000000000000000000000000000000000000000000000000000008352600483016107cd565b0390fd5b6115c8906040519182917f2ee17a3d000000000000000000000000000000000000000000000000000000008352600483016107cd565b5050509050565b7f378b0805000000000000000000000000000000000000000000000000000000005f5260045260245260445ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b7f301b38b6000000000000000000000000000000000000000000000000000000005f5260045ffd5b805f525f60205260405f2073ffffffffffffffffffffffffffffffffffffffff83165f5260205260ff60405f205416155f1461175857805f525f60205260405f2073ffffffffffffffffffffffffffffffffffffffff83165f5260205260405f2060017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0082541617905573ffffffffffffffffffffffffffffffffffffffff339216907f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d5f80a4600190565b50505f90565b805f525f60205260405f2073ffffffffffffffffffffffffffffffffffffffff83165f5260205260ff60405f2054165f1461175857805f525f60205260405f2073ffffffffffffffffffffffffffffffffffffffff83165f5260205260405f207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00815416905573ffffffffffffffffffffffffffffffffffffffff339216907ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b5f80a4600190565b81519190604183036118565761184f9250602082015190606060408401519301515f1a9061190b565b9192909190565b50505f9160029190565b60048110156106715780611872575050565b600181036118a2577ff645eedf000000000000000000000000000000000000000000000000000000005f5260045ffd5b600281036118d657507ffce698f7000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b6003146118e05750565b7fd78bce0c000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b91907f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0841161198f579160209360809260ff5f9560405194855216868401526040830152606082015282805260015afa15610c91575f5173ffffffffffffffffffffffffffffffffffffffff81161561198557905f905f90565b505f906001905f90565b5050505f916003919056fea164736f6c634300081c000a2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d4c48d1d2b0f4f7485fc28e3db22341d96a20aa29e6efa8149da9751603abd4e06e0c24a6e293ff9b755263dbaa15ba3796b0b8d3fe17cfb4ddf8143b268eac47bd893629a699470e4ec82a5715bb4981fdaacc5d0a728bf5f55b801d8f4ef10bad3228b676f7d3cd4284a5443f17f1962b36e491b30a40b2405849e597ba5fb5","sourceMap":"822:11749:29:-:0;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;-1:-1:-1;;;;;822:11749:29;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;822:11749:29;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;:::i;:::-;;;;2655:28;822:11749;;2730:19;;;:69;;;822:11749;;;;;;;-1:-1:-1;822:11749:29;;;;;;-1:-1:-1;;;;;822:11749:29;;;;;;;;;;;;;;2900:217;;822:11749;;;;;2900:217;;822:11749;;;;;;;;;;;2900:217;822:11749;-1:-1:-1;822:11749:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;822:11749:29;;-1:-1:-1;822:11749:29;-1:-1:-1;822:11749:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;3178:3:29;822:11749;;3148:28;;;;;822:11749;;;;;;;;;;;;;;;-1:-1:-1;822:11749:29;3258:11;822:11749;;;;-1:-1:-1;822:11749:29;;;;;;;;-1:-1:-1;822:11749:29;3258:11;822:11749;;;-1:-1:-1;822:11749:29;;;;;;;;;;;3133:13;;822:11749;;;;-1:-1:-1;822:11749:29;;;;-1:-1:-1;822:11749:29;3148:28;-1:-1:-1;;822:11749:29;;;3379:27;822:11749;;;;;;;-1:-1:-1;;;;;;822:11749:29;-1:-1:-1;;;;;822:11749:29;;;;;;;;;-1:-1:-1;;;;;822:11749:29;;;;3503:44;;;:::i;:::-;;3458:249;822:11749;;;;;;;;;3458:249;3594:43;;3651:45;3594:43;;:::i;:::-;;3651:45;:::i;:::-;;3458:249;;822:11749;;;-1:-1:-1;;;;;822:11749:29;;;;;;;;;;;;;;;;-1:-1:-1;822:11749:29;;;;;;;;;;;;;;;;;;-1:-1:-1;822:11749:29;;;;;;;;;;-1:-1:-1;822:11749:29;;;;;-1:-1:-1;822:11749:29;;;;;;-1:-1:-1;822:11749:29;;;;;;-1:-1:-1;822:11749:29;2730:69;-1:-1:-1;822:11749:29;;-1:-1:-1;;822:11749:29;;;;;;;;;-1:-1:-1;2730:69:29;;822:11749;;;;-1:-1:-1;822:11749:29;;;;;-1:-1:-1;822:11749:29;;;;;-1:-1:-1;822:11749:29;;-1:-1:-1;822:11749:29;;-1:-1:-1;822:11749:29;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;-1:-1:-1;;822:11749:29;;;-1:-1:-1;;;;;822:11749:29;;;;;;;;;;:::o;:::-;;;-1:-1:-1;;;;;822:11749:29;;;;;;:::o;:::-;;;-1:-1:-1;;;;;822:11749:29;;;;;;:::o;6145:316:93:-;-1:-1:-1;;;;;822:11749:29;;2682:1;822:11749;;;-1:-1:-1;;;;;;;;;;;822:11749:29;;;;;;;;;;-1:-1:-1;;;;;822:11749:29;2682:1;822:11749;;;-1:-1:-1;;;;;;;;;;;822:11749:29;;;;;;;-1:-1:-1;;822:11749:29;;;;;735:10:121;;822:11749:29;-1:-1:-1;;;;;;;;;;;2682:1:29;;6336:40:93;6313:4;6390:11;:::o;6238:217::-;6432:12;2682:1:29;6432:12:93;:::o;6145:316::-;-1:-1:-1;;;;;822:11749:29;;;;;;-1:-1:-1;;;;;;;;;;;822:11749:29;;;;;;;;;;-1:-1:-1;;;;;822:11749:29;;;;;-1:-1:-1;;;;;;;;;;;822:11749:29;;;;;;;-1:-1:-1;;822:11749:29;;;;;735:10:121;;822:11749:29;-1:-1:-1;;;;;;;;;;;1514:33:29;-1:-1:-1;;;;;;;;;;;6336:40:93;822:11749:29;6336:40:93;6313:4;6390:11;:::o;6145:316::-;822:11749:29;;;-1:-1:-1;;;;;;;;;;;822:11749:29;;-1:-1:-1;;;;;;;;;;;822:11749:29;;;;;;;;;-1:-1:-1;;;;;;;;;;;822:11749:29;;-1:-1:-1;;;;;;;;;;;822:11749:29;;-1:-1:-1;;822:11749:29;6313:4:93;822:11749:29;;;735:10:121;;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;822:11749:29;;6336:40:93;6313:4;6390:11;:::o;6238:217::-;822:11749:29;6432:12:93;:::o","linkReferences":{}},"deployedBytecode":{"object":"0x6080806040526004361015610012575f80fd5b5f3560e01c90816301ffc9a7146106ab575080630bece356146105e8578063248a9ca3146105be5780632f2ff15d1461058f57806336568abe146105335780634d6d9ffb146104865780635832611b146104405780635972185a14610406578063682ed5f01461035157806391d1485414610308578063a217fddf146102ee578063a845a7f314610261578063d547741f1461022b578063ddba65371461015f5763ef913a4b146100c1575f80fd5b3461015b575f60031936011261015b576101576040516020808201526080604082015261014b816100f460c08201611228565b60ff600254818116606085015267ffffffffffffffff8160081c16608085015260481c16151560a0830152037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0810183528261085e565b604051918291826107cd565b0390f35b5f80fd5b3461015b5761016d36610749565b505060ff60025460481c16610203575f80527f4c48d1d2b0f4f7485fc28e3db22341d96a20aa29e6efa8149da9751603abd4e06020527f6e0c24a6e293ff9b755263dbaa15ba3796b0b8d3fe17cfb4ddf8143b268eac475460ff16156101f6575b7fda81d7c2000000000000000000000000000000000000000000000000000000005f5260045ffd5b6101fe611277565b6101ce565b7f928b1233000000000000000000000000000000000000000000000000000000005f5260045ffd5b3461015b5761025f61023c3661079a565b9061025a610255825f525f602052600160405f20015490565b6112ff565b61175e565b005b3461015b575f60031936011261015b5760ff6002541660405161028e8161028781611228565b038261085e565b60405190604082019260408352815180945260206060840192015f945b8086106102c057505082935060208301520390f35b909260208060019273ffffffffffffffffffffffffffffffffffffffff8751168152019401950194906102ab565b3461015b575f60031936011261015b5760206040515f8152f35b3461015b576103163661079a565b905f525f60205273ffffffffffffffffffffffffffffffffffffffff60405f2091165f52602052602060ff60405f2054166040519015158152f35b3461015b57602060031936011261015b5760043567ffffffffffffffff811161015b5760a0600319823603011261015b5760ff60025460481c16610203575f80527f4c48d1d2b0f4f7485fc28e3db22341d96a20aa29e6efa8149da9751603abd4e060209081527f6e0c24a6e293ff9b755263dbaa15ba3796b0b8d3fe17cfb4ddf8143b268eac475490916103f19160ff16156103f9575b6004016110cb565b604051908152f35b610401611277565b6103e9565b3461015b575f60031936011261015b5760206040517fbd893629a699470e4ec82a5715bb4981fdaacc5d0a728bf5f55b801d8f4ef10b8152f35b3461015b57602060031936011261015b5760043567ffffffffffffffff811680910361015b575f526004602052602067ffffffffffffffff60405f205416604051908152f35b3461015b57602060031936011261015b5760043567ffffffffffffffff811161015b576080600319823603011261015b5760ff60025460481c16610203575f80527f4c48d1d2b0f4f7485fc28e3db22341d96a20aa29e6efa8149da9751603abd4e060209081527f6e0c24a6e293ff9b755263dbaa15ba3796b0b8d3fe17cfb4ddf8143b268eac475490916103f19160ff1615610526575b600401610ef5565b61052e611277565b61051e565b3461015b576105413661079a565b3373ffffffffffffffffffffffffffffffffffffffff8216036105675761025f9161175e565b7f6697b232000000000000000000000000000000000000000000000000000000005f5260045ffd5b3461015b5761025f6105a03661079a565b906105b9610255825f525f602052600160405f20015490565b61168c565b3461015b57602060031936011261015b5760206103f16004355f525f602052600160405f20015490565b3461015b576105f636610749565b60ff60025460481c16610203575f80527f4c48d1d2b0f4f7485fc28e3db22341d96a20aa29e6efa8149da9751603abd4e06020527f6e0c24a6e293ff9b755263dbaa15ba3796b0b8d3fe17cfb4ddf8143b268eac475461065e929060ff161561069e57610a3c565b6040516003821015610671576020918152f35b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b6106a6611277565b610a3c565b3461015b57602060031936011261015b57600435907fffffffff00000000000000000000000000000000000000000000000000000000821680920361015b57817f7965db0b000000000000000000000000000000000000000000000000000000006020931490811561071f575b5015158152f35b7f01ffc9a70000000000000000000000000000000000000000000000000000000091501483610718565b90602060031983011261015b5760043567ffffffffffffffff811161015b578260238201121561015b5780600401359267ffffffffffffffff841161015b576024848301011161015b576024019190565b600319604091011261015b576004359060243573ffffffffffffffffffffffffffffffffffffffff8116810361015b5790565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f602060409481855280519182918282880152018686015e5f8582860101520116010190565b6040810190811067ffffffffffffffff82111761083157604052565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff82111761083157604052565b92919267ffffffffffffffff821161083157604051916108e760207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116018461085e565b82948184528183011161015b578281602093845f960137010152565b9080601f8301121561015b5781602061091e9335910161089f565b90565b67ffffffffffffffff81116108315760051b60200190565b60208183031261015b5780359067ffffffffffffffff821161015b57019060408282031261015b576040519161096e83610815565b803567ffffffffffffffff811161015b578261098b918301610903565b835260208101359067ffffffffffffffff821161015b57019080601f8301121561015b5781356109ba81610921565b926109c8604051948561085e565b81845260208085019260051b8201019183831161015b5760208201905b8382106109f9575050505050602082015290565b813567ffffffffffffffff811161015b57602091610a1c87848094880101610903565b8152019101906109e5565b519067ffffffffffffffff8216820361015b57565b610a4891810190610939565b60205f818351604051918183925191829101835e8101838152039060025afa15610c915760205f8051604051838101917f01000000000000000000000000000000000000000000000000000000000000008352602182015260218152610aaf60418261085e565b604051918291518091835e8101838152039060025afa15610c9157610ada5f516020830151906113eb565b5160408180518101031261015b57604051610af481610815565b610b0f6040610b0560208501610a27565b9384845201610a27565b67ffffffffffffffff60208301938285521680151580610c7e575b15610c4457505067ffffffffffffffff8151165f52600460205267ffffffffffffffff60405f20541680610bf3575067ffffffffffffffff9051918183169260025490838260081c168511610bb6575b50505116905f52600460205260405f20907fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000008254161790555f90565b68ffffffffffffffff007fffffffffffffffffffffffffffffffffffffffffffffff0000000000000000ff9160081b169116176002555f80610b7a565b9167ffffffffffffffff9150511603610c0b57600290565b69010000000000000000007fffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffff6002541617600255600190565b67ffffffffffffffff92507fdcbc5460000000000000000000000000000000000000000000000000000000005f526004521660245260445ffd5b5067ffffffffffffffff82161515610b2a565b6040513d5f823e3d90fd5b9035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18136030182121561015b570180359067ffffffffffffffff821161015b57602001918160051b3603831361015b57565b3567ffffffffffffffff8116810361015b5790565b15610d0d5750565b67ffffffffffffffff907ff7caaa5c000000000000000000000000000000000000000000000000000000005f521660045260245ffd5b9035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18136030182121561015b570180359067ffffffffffffffff821161015b5760200191813603831361015b57565b60208183031261015b5780519067ffffffffffffffff821161015b57019060408282031261015b5760405191610dc983610815565b610dd281610a27565b835260208101519067ffffffffffffffff821161015b570181601f8201121561015b57805190610e0182610921565b92610e0f604051948561085e565b82845260208085019360061b8301019181831161015b57602001925b828410610e3e5750505050602082015290565b60408483031261015b5760206040918251610e5881610815565b865181528287015183820152815201930192610e2b565b15610e78575050565b9067ffffffffffffffff80927fc7441689000000000000000000000000000000000000000000000000000000005f52166004521660245260445ffd5b8051821015610ec85760209160051b010190565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b6060810190610f048282610c9c565b90506001610f128484610c9c565b9290500361109b5750610fb8610f2a60408301610cf0565b9267ffffffffffffffff841692835f526004602052610fb367ffffffffffffffff60405f20541694610f5e87871515610d05565b610f9e610f76610f6e8580610d43565b810190610939565b610f8e610f838251611365565b6020830151906113eb565b5160208082518301019101610d94565b9667ffffffffffffffff885116918214610e6f565b610c9c565b15610ec857610fd3610fcc82602093610d43565b369161089f565b818151910120920180515115611073575f5b8151805182101561104b57610ffb828692610eb4565b51511461100a57600101610fe5565b60209293506110199151610eb4565b5101516110235790565b7f9a960b4f000000000000000000000000000000000000000000000000000000005f5260045ffd5b7f291fc442000000000000000000000000000000000000000000000000000000005f5260045ffd5b7f1e6c84da000000000000000000000000000000000000000000000000000000005f5260045ffd5b7f88b3170e000000000000000000000000000000000000000000000000000000005f52600160045260245260445ffd5b608081016110d98183610d43565b9050156112005760608201906110ef8284610c9c565b905060016110fd8486610c9c565b9290500361109b575061111260408401610cf0565b9061117467ffffffffffffffff831693845f52600460205261116e67ffffffffffffffff60405f2054169561114986881515610d05565b611159610f76610f6e8a80610d43565b9567ffffffffffffffff875116918214610e6f565b85610c9c565b15610ec85760209161118c610fcc8361119894610d43565b83815191012095610d43565b908092918101031261015b576020903591019081515115611073575f5b8251805182101561104b576111cb828792610eb4565b515114806111e8575b6111e0576001016111b5565b505050905090565b508160206111f7838651610eb4565b510151146111d4565b7f1208b21b000000000000000000000000000000000000000000000000000000005f5260045ffd5b602060015491828152019060015f5260205f20905f5b81811061124b5750505090565b825473ffffffffffffffffffffffffffffffffffffffff1684526020909301926001928301920161123e565b335f9081527f4c48d1d2b0f4f7485fc28e3db22341d96a20aa29e6efa8149da9751603abd4e0602052604090205460ff16156112af57565b7fe2517d3f000000000000000000000000000000000000000000000000000000005f52336004527fbd893629a699470e4ec82a5715bb4981fdaacc5d0a728bf5f55b801d8f4ef10b60245260445ffd5b805f525f60205260405f2073ffffffffffffffffffffffffffffffffffffffff33165f5260205260ff60405f205416156113365750565b7fe2517d3f000000000000000000000000000000000000000000000000000000005f523360045260245260445ffd5b5f60208092604051918183925191829101835e8101838152039060025afa15610c915760205f8051604051838101917f020000000000000000000000000000000000000000000000000000000000000083526021820152602181526113cb60418261085e565b604051918291518091835e8101838152039060025afa15610c91575f5190565b91909182511561166457825160ff60025416907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82019060ff82116116375760ff8651921610156116095750508251927fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe061147e61146886610921565b95611476604051978861085e565b808752610921565b013660208601375f5b81518110156116025761149a8183610eb4565b5160418151036115cc5773ffffffffffffffffffffffffffffffffffffffff6114cf6114c68387611826565b90929192611860565b169081156115925750805f52600360205260ff60405f20541615611567575f5b82811061150c5750906001916115058288610eb4565b5201611487565b8173ffffffffffffffffffffffffffffffffffffffff61152c838a610eb4565b51161461153b576001016114ef565b507fe021c4f2000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b7fd7e8a2c2000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b6115c8906040519182917f9e3c1b3d000000000000000000000000000000000000000000000000000000008352600483016107cd565b0390fd5b6115c8906040519182917f2ee17a3d000000000000000000000000000000000000000000000000000000008352600483016107cd565b5050509050565b7f378b0805000000000000000000000000000000000000000000000000000000005f5260045260245260445ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b7f301b38b6000000000000000000000000000000000000000000000000000000005f5260045ffd5b805f525f60205260405f2073ffffffffffffffffffffffffffffffffffffffff83165f5260205260ff60405f205416155f1461175857805f525f60205260405f2073ffffffffffffffffffffffffffffffffffffffff83165f5260205260405f2060017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0082541617905573ffffffffffffffffffffffffffffffffffffffff339216907f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d5f80a4600190565b50505f90565b805f525f60205260405f2073ffffffffffffffffffffffffffffffffffffffff83165f5260205260ff60405f2054165f1461175857805f525f60205260405f2073ffffffffffffffffffffffffffffffffffffffff83165f5260205260405f207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00815416905573ffffffffffffffffffffffffffffffffffffffff339216907ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b5f80a4600190565b81519190604183036118565761184f9250602082015190606060408401519301515f1a9061190b565b9192909190565b50505f9160029190565b60048110156106715780611872575050565b600181036118a2577ff645eedf000000000000000000000000000000000000000000000000000000005f5260045ffd5b600281036118d657507ffce698f7000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b6003146118e05750565b7fd78bce0c000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b91907f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0841161198f579160209360809260ff5f9560405194855216868401526040830152606082015282805260015afa15610c91575f5173ffffffffffffffffffffffffffffffffffffffff81161561198557905f905f90565b505f906001905f90565b5050505f916003919056fea164736f6c634300081c000a","sourceMap":"822:11749:29:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;822:11749:29;;;;;;;;3832:23;;;;822:11749;;;;;;3832:23;822:11749;;;;;;:::i;:::-;;;;;;;;;;;;1794:4;;;822:11749;;;;;;;;;;;;;;3832:23;;;;;;;;:::i;:::-;822:11749;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;;;;12232:20;822:11749;;;;;;;;;;;;;;;;12451:42;12447:105;;822:11749;9717:21;822:11749;9717:21;822:11749;;9717:21;12447:105;12520:20;;:::i;:::-;12447:105;;822:11749;;;;;;;;;;;4713:26:93;822:11749:29;;;:::i;:::-;4683:18:93;2475:4;4683:18;;3867:6;822:11749:29;3867:6:93;822:11749:29;;3867:22:93;822:11749:29;3867:6:93;822:11749:29;3867:22:93;822:11749:29;3776:120:93;;4683:18;2475:4;:::i;:::-;4713:26;:::i;:::-;822:11749:29;;;;;;-1:-1:-1;;822:11749:29;;;;;;4072:27;822:11749;;;;;;;;;:::i;:::-;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4041:11;822:11749;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;822:11749:29;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;2920:29:93;822:11749:29;-1:-1:-1;822:11749:29;;;;;;-1:-1:-1;822:11749:29;;;;;;;;;;;;;;;;-1:-1:-1;;822:11749:29;;;;;;;;;;;;;-1:-1:-1;;822:11749:29;;;;;;;;12232:20;822:11749;;;;;;;;;;;;;;;;;;5848:1853;;822:11749;;12451:42;12447:105;;822:11749;;;5848:1853;:::i;:::-;822:11749;;;;;;12447:105;12520:20;;:::i;:::-;12447:105;;822:11749;;;;;-1:-1:-1;;822:11749:29;;;;;;;;1514:33;822:11749;;;;;;;;-1:-1:-1;;822:11749:29;;;;;;;;;;;;;;;;1794:4;822:11749;;1794:4;822:11749;;;;1794:4;;822:11749;;;;;;;;;;;;-1:-1:-1;;822:11749:29;;;;;;;;;;;;;-1:-1:-1;;822:11749:29;;;;;;;;12232:20;822:11749;;;;;;;;;;;;;;;;;;7740:1799;;822:11749;;12451:42;12447:105;;822:11749;;;7740:1799;:::i;12447:105::-;12520:20;;:::i;:::-;12447:105;;822:11749;;;;;;;:::i;:::-;735:10:121;822:11749:29;;;5387:34:93;5383:102;;5495:37;;;:::i;5383:102::-;5444:30;822:11749:29;5444:30:93;822:11749:29;;5444:30:93;822:11749:29;;;;4296:25:93;822:11749:29;;;:::i;:::-;4266:18:93;2475:4;4266:18;;3867:6;822:11749:29;3867:6:93;822:11749:29;;3867:22:93;822:11749:29;3867:6:93;822:11749:29;3867:22:93;822:11749:29;3776:120:93;;2475:4;4296:25;:::i;822:11749:29:-;;;;;-1:-1:-1;;822:11749:29;;;;;;;;;3867:6:93;822:11749:29;3867:6:93;822:11749:29;;3867:22:93;822:11749:29;3867:6:93;822:11749:29;3867:22:93;822:11749:29;3776:120:93;;822:11749:29;;;;;;;:::i;:::-;;12232:20;822:11749;;;;;;;;;;;;;;4348:1461;;822:11749;;;12451:42;12447:105;;4348:1461;:::i;:::-;822:11749;;;;;;;;;;;;;;;;;;;;;;;12447:105;12520:20;;:::i;:::-;4348:1461;:::i;822:11749::-;;;;;-1:-1:-1;;822:11749:29;;;;;;;;;;;;;;;;2639:47:93;2654:32;822:11749:29;2639:47:93;;:87;;;;;822:11749:29;;;;;;;2639:87:93;844:25:133;829:40;;;2639:87:93;;;822:11749:29;;;-1:-1:-1;;822:11749:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;-1:-1:-1;;822:11749:29;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;:::o;:::-;;-1:-1:-1;822:11749:29;;;;;-1:-1:-1;822:11749:29;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;-1:-1:-1;822:11749:29;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;:::i;:::-;;:::o;:::-;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;1794:4;;822:11749;;;;;;;;1794:4::o;4348:1461::-;4569:58;4348:1461;4569:58;;;;:::i;:::-;822:11749;-1:-1:-1;4675:21:29;;;822:11749;;;;;;;;;;;;;;;;;;10132:12;;;;;;;;822:11749;-1:-1:-1;10132:12:29;;822:11749;;10106:39;;;822:11749;;;;;;;;;10106:39;;;;;;:::i;:::-;822:11749;;;;;;;;;;;;;;;10099:47;;10132:12;10099:47;;;;;4766:16;-1:-1:-1;10099:47:29;822:11749;4766:16;;;;;:::i;:::-;4866:21;822:11749;;;;4855:70;;1794:4;;;;822:11749;;;;;:::i;:::-;1794:4;822:11749;1794:4;822:11749;4855:70;;1794:4;:::i;:::-;;;;;;;:::i;:::-;822:11749;;1794:4;;;;;;822:11749;4944:16;;;:39;;;4348:1461;1794:4;;;;;822:11749;1794:4;;822:11749;-1:-1:-1;1794:4:29;5234:27;822:11749;1794:4;822:11749;;-1:-1:-1;1794:4:29;;822:11749;5289:22;5285:276;;1794:4;822:11749;1794:4;;822:11749;;;;1794:4;10132:12;1794:4;;;;;;822:11749;5575:39;;5571:109;;4348:1461;1794:4;;;822:11749;1794:4;-1:-1:-1;1794:4:29;5234:27;822:11749;1794:4;822:11749;-1:-1:-1;1794:4:29;;;;;;;;;-1:-1:-1;4348:1461:29;:::o;5571:109::-;1794:4;;;;;;;;;10132:12;1794:4;5571:109;;;;5285:276;1794:4;822:11749;1794:4;;;822:11749;5331:36;5327:169;;10132:12;5509:41;:::o;5327:169::-;1794:4;;10132:12;1794:4;;;10132:12;1794:4;;5432:49;:::o;1794:4::-;822:11749;1794:4;;;-1:-1:-1;1794:4:29;;822:11749;;1794:4;822:11749;1794:4;-1:-1:-1;1794:4:29;4944:39;822:11749;;;;4964:19;;4944:39;;10099:47;822:11749;;;-1:-1:-1;822:11749:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;:::o;:::-;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;1917:4::-;;;;;;;;;;;;;;;;;;;;;;;;;;822:11749;;;;;:::i;:::-;1794:4;;;:::i;:::-;1917;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;822:11749;;1917:4;822:11749;;;;:::i;:::-;1917:4;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;822:11749;;;;;;:::i;:::-;1917:4;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;822:11749;1917:4;;;;;822:11749;1917:4;822:11749;;1794:4;822:11749;1794:4;1917;;;822:11749;;1917:4;;;;;;;;;;;;:::o;:::-;;;;;;;;;;7740:1799;7947:9;;;;;;;;:::i;:::-;7991;;7967:1;7991:9;;;;:::i;:::-;7947:21;;;;822:11749;;8111:31;9125:9;8111:31;;;;;:::i;:::-;822:11749;;;;1794:4;;-1:-1:-1;1794:4:29;8164:27;8111:16;1794:4;8900:103;822:11749;8111:31;-1:-1:-1;1794:4:29;;822:11749;8222:7;8214:57;8222:7;;;;8214:57;:::i;:::-;8746:71;8331:59;8342:10;;;;:::i;:::-;8331:59;;;;:::i;:::-;8529:16;8417:67;8437:21;;8417:67;:::i;:::-;8111:16;8529;;;;;:::i;:::-;8757:21;8111:16;822:11749;;;8746:71;;;;;;:::i;:::-;1794:4;822:11749;1794:4;;822:11749;8908:39;;;8900:103;:::i;:::-;9125:9;:::i;:::-;1917:4;;;;;;8111:16;1917:4;;:::i;:::-;;;;:::i;:::-;822:11749;;;;;9115:23;9156:25;;;;822:11749;9156:36;1917:4;;-1:-1:-1;9277:3:29;9243:25;;822:11749;;9239:36;;;;;9300:28;;;;;:::i;:::-;;1917:4;9300:45;9296:198;;7967:1;1917:4;9224:13;;9296:198;8111:16;9373:25;;;:28;:25;;:28;:::i;:::-;;:39;1917:4;;;9461:18;:::o;1917:4::-;;-1:-1:-1;1917:4:29;8164:27;-1:-1:-1;1917:4:29;9239:36;9521:11;-1:-1:-1;9521:11:29;8164:27;-1:-1:-1;9521:11:29;1917:4;;-1:-1:-1;1917:4:29;8164:27;-1:-1:-1;1917:4:29;822:11749;;;;7967:1;822:11749;;;;;;;5848:1853;6049:10;;;;;;;:::i;:::-;:22;;;822:11749;;6104:9;;;;;;;;:::i;:::-;6148;;6124:1;6148:9;;;;:::i;:::-;6104:21;;;;822:11749;;6268:31;;;;;;:::i;:::-;822:11749;7272:9;822:11749;;;1794:4;;6070:1;1794:4;6321:27;6268:16;1794:4;7057:103;822:11749;6268:31;6070:1;1794:4;;822:11749;6379:7;6371:57;6379:7;;;;6371:57;:::i;:::-;6903:71;6488:59;6499:10;;;;:::i;6903:71::-;1794:4;822:11749;1794:4;;822:11749;7065:39;;;7057:103;:::i;:::-;7272:9;;:::i;:::-;1917:4;;;6268:16;1917:4;;;;7322:10;1917:4;;:::i;:::-;822:11749;;;;;7262:23;7322:10;;:::i;:::-;7311:33;;;;;;822:11749;;;;6268:16;822:11749;;7362:25;;;;;822:11749;7362:36;1917:4;;6070:1;7483:3;7449:25;;822:11749;;7445:36;;;;;7506:28;;;;;:::i;:::-;;1917:4;7506:45;:97;;;7483:3;7502:154;;6124:1;1917:4;7430:13;;7502:154;7623:18;;;;;;:::o;7506:97::-;7555:25;;6268:16;7555:28;:25;;;:28;:::i;:::-;;:39;1917:4;7555:48;7506:97;;822:11749;;6070:1;822:11749;;6070:1;822:11749;;;4041:11;822:11749;;;;;;;4041:11;-1:-1:-1;822:11749:29;;-1:-1:-1;822:11749:29;;-1:-1:-1;822:11749:29;;;;;;;;;;:::o;:::-;;;;;;;;;;;;4041:11;822:11749;;;;;;;3165:103:93;735:10:121;2920:6:93;822:11749:29;;;;;;;;;;;;3485:23:93;3481:108;;3165:103::o;3481:108::-;3531:47;2920:6;3531:47;735:10:121;3531:47:93;822:11749:29;1514:33;822:11749;;;2920:6:93;3531:47;3165:103;822:11749:29;2920:6:93;822:11749:29;2920:6:93;822:11749:29;;;2920:6:93;822:11749:29;;735:10:121;822:11749:29;-1:-1:-1;822:11749:29;;;;;-1:-1:-1;822:11749:29;;;3485:23:93;3481:108;;3165:103;:::o;3481:108::-;3531:47;2920:6;3531:47;735:10:121;3531:47:93;822:11749:29;;;;2920:6:93;3531:47;9987:166:29;-1:-1:-1;822:11749:29;9987:166;;822:11749;;;;;;;;;;;;;;;;;;10132:12;;;;;;;;822:11749;-1:-1:-1;10132:12:29;;822:11749;;10106:39;;;822:11749;;;;;;;;;10106:39;;;;;;:::i;:::-;822:11749;;;;;;;;;;;;;;;10099:47;;10132:12;10099:47;;;;;-1:-1:-1;10099:47:29;9987:166;:::o;10569:773::-;;;;822:11749;;10679:21;822:11749;;;;;10772:27;822:11749;;;;;;;;;;;;;;;;;-1:-1:-1;822:11749:29;;;;;;;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;:::i;:::-;;;;;;;10699:1;11010:3;822:11749;;10987:21;;;;;11048:13;;;;:::i;:::-;;1667:2;822:11749;;11818:42;1667:2;;822:11749;5489:8:131;5433:27;;;;:::i;:::-;5489:8;;;;;:::i;:::-;822:11749:29;11977:23;;;1667:2;;822:11749;;10699:1;822:11749;12048:11;822:11749;;;;10699:1;822:11749;;;1667:2;;;10699:1;11191:5;;;;;;11306:19;;10772:11;11306:19;;;;;:::i;:::-;822:11749;1917:4;10972:13;;11198:3;11229:7;822:11749;11229:7;;;;:::i;:::-;822:11749;;11229:20;822:11749;;10772:11;1917:4;11176:13;;822:11749;;;10699:1;822:11749;;;;10699:1;822:11749;1667:2;;10699:1;1667:2;;822:11749;;10699:1;1667:2;;;822:11749;;;1667:2;;;;;;;;;;:::i;:::-;;;;;;822:11749;;;1667:2;;;;;;;;;;:::i;10987:21::-;;;;;;10569:773::o;822:11749::-;;10699:1;822:11749;;;;;;10699:1;822:11749;;;10699:1;822:11749;;;;;10699:1;822:11749;;;10699:1;822:11749;;10699:1;822:11749;6145:316:93;822:11749:29;;;;;;;;;;;;-1:-1:-1;822:11749:29;;;;;-1:-1:-1;822:11749:29;;;6242:23:93;6238:217;822:11749:29;;;;;;;;;;;;;;;-1:-1:-1;822:11749:29;;;;-1:-1:-1;822:11749:29;6313:4:93;822:11749:29;;;;;;;;735:10:121;822:11749:29;;6336:40:93;;822:11749:29;6336:40:93;;6313:4;6390:11;:::o;6238:217::-;6432:12;;822:11749:29;6432:12:93;:::o;6698:317::-;822:11749:29;;;;;;;;;;;;-1:-1:-1;822:11749:29;;;;;-1:-1:-1;822:11749:29;;;6792:217:93;822:11749:29;;;;;;;;;;;;;;;-1:-1:-1;822:11749:29;;;;-1:-1:-1;822:11749:29;;;;;;;;735:10:121;822:11749:29;;6890:40:93;;822:11749:29;6890:40:93;;822:11749:29;6944:11:93;:::o;2419:778:131:-;822:11749:29;;;2419:778:131;2609:2;2589:22;;2609:2;;3041:25;2825:196;;;;;;;;;;;;;;;-1:-1:-1;2825:196:131;3041:25;;:::i;:::-;3034:32;;;;;:::o;2585:606::-;3097:83;;3113:1;3097:83;3117:35;3097:83;;:::o;11617:532::-;822:11749:29;;;;;;11703:29:131;;;11748:7;;:::o;11699:444::-;822:11749:29;11799:38:131;;822:11749:29;;11860:23:131;11712:20;11860:23;822:11749:29;11712:20:131;11860:23;11795:348;11913:35;11904:44;;11913:35;;11971:46;;11712:20;11971:46;822:11749:29;;;11712:20:131;11971:46;11900:243;12047:30;12038:39;12034:109;;11900:243;11617:532::o;12034:109::-;12100:32;11712:20;12100:32;822:11749:29;;;11712:20:131;12100:32;7129:1551;;;8209:66;8196:79;;8192:164;;822:11749:29;;;;;;-1:-1:-1;822:11749:29;;;;;;;;;;;;;;;;;;;8467:24:131;;;;;;;;;-1:-1:-1;8467:24:131;822:11749:29;;;8505:20:131;8501:113;;8624:49;-1:-1:-1;8624:49:131;-1:-1:-1;7129:1551:131;:::o;8501:113::-;8541:62;-1:-1:-1;8541:62:131;8467:24;8541:62;-1:-1:-1;8541:62:131;:::o;8192:164::-;8291:54;;;8307:1;8291:54;8311:30;8291:54;;:::o","linkReferences":{}},"methodIdentifiers":{"DEFAULT_ADMIN_ROLE()":"a217fddf","PROOF_SUBMITTER_ROLE()":"5972185a","getAttestationSet()":"a845a7f3","getClientState()":"ef913a4b","getConsensusTimestamp(uint64)":"5832611b","getRoleAdmin(bytes32)":"248a9ca3","grantRole(bytes32,address)":"2f2ff15d","hasRole(bytes32,address)":"91d14854","misbehaviour(bytes)":"ddba6537","renounceRole(bytes32,address)":"36568abe","revokeRole(bytes32,address)":"d547741f","supportsInterface(bytes4)":"01ffc9a7","updateClient(bytes)":"0bece356","verifyMembership((bytes,(uint64,uint64),bytes[],bytes))":"682ed5f0","verifyNonMembership((bytes,(uint64,uint64),bytes[]))":"4d6d9ffb"},"rawMetadata":"{\"compiler\":{\"version\":\"0.8.28+commit.7893614a\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"attestorAddresses\",\"type\":\"address[]\"},{\"internalType\":\"uint8\",\"name\":\"minRequiredSigs\",\"type\":\"uint8\"},{\"internalType\":\"uint64\",\"name\":\"initialHeight\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"initialTimestampSeconds\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"roleManager\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"AccessControlBadConfirmation\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"internalType\":\"bytes32\",\"name\":\"neededRole\",\"type\":\"bytes32\"}],\"name\":\"AccessControlUnauthorizedAccount\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint8\",\"name\":\"minRequired\",\"type\":\"uint8\"},{\"internalType\":\"uint256\",\"name\":\"attestationCount\",\"type\":\"uint256\"}],\"name\":\"BadQuorum\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"height\",\"type\":\"uint64\"}],\"name\":\"ConsensusTimestampNotFound\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"signer\",\"type\":\"address\"}],\"name\":\"DuplicateSigner\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ECDSAInvalidSignature\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"length\",\"type\":\"uint256\"}],\"name\":\"ECDSAInvalidSignatureLength\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"s\",\"type\":\"bytes32\"}],\"name\":\"ECDSAInvalidSignatureS\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"EmptyPackets\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"EmptySignatures\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"EmptyValue\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"FeatureNotSupported\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"FrozenClientState\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"expected\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"provided\",\"type\":\"uint64\"}],\"name\":\"HeightMismatch\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"expectedLength\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"providedLength\",\"type\":\"uint256\"}],\"name\":\"InvalidPathLength\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"signature\",\"type\":\"bytes\"}],\"name\":\"InvalidSignatureLength\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"height\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"timestamp\",\"type\":\"uint64\"}],\"name\":\"InvalidState\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"NoAttestors\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"NotMember\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"NotNonMember\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"signature\",\"type\":\"bytes\"}],\"name\":\"SignatureInvalid\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"validSigners\",\"type\":\"uint256\"},{\"internalType\":\"uint8\",\"name\":\"minRequired\",\"type\":\"uint8\"}],\"name\":\"ThresholdNotMet\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"signer\",\"type\":\"address\"}],\"name\":\"UnknownSigner\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"previousAdminRole\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"newAdminRole\",\"type\":\"bytes32\"}],\"name\":\"RoleAdminChanged\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"RoleGranted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"RoleRevoked\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"DEFAULT_ADMIN_ROLE\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"PROOF_SUBMITTER_ROLE\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getAttestationSet\",\"outputs\":[{\"internalType\":\"address[]\",\"name\":\"attestorAddresses\",\"type\":\"address[]\"},{\"internalType\":\"uint8\",\"name\":\"minRequiredSigs\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getClientState\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"revisionHeight\",\"type\":\"uint64\"}],\"name\":\"getConsensusTimestamp\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"}],\"name\":\"getRoleAdmin\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"grantRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"hasRole\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"name\":\"misbehaviour\",\"outputs\":[],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"callerConfirmation\",\"type\":\"address\"}],\"name\":\"renounceRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"revokeRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes4\",\"name\":\"interfaceId\",\"type\":\"bytes4\"}],\"name\":\"supportsInterface\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"updateMsg\",\"type\":\"bytes\"}],\"name\":\"updateClient\",\"outputs\":[{\"internalType\":\"enum ILightClientMsgs.UpdateResult\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes\",\"name\":\"proof\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"uint64\",\"name\":\"revisionNumber\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"revisionHeight\",\"type\":\"uint64\"}],\"internalType\":\"struct IICS02ClientMsgs.Height\",\"name\":\"proofHeight\",\"type\":\"tuple\"},{\"internalType\":\"bytes[]\",\"name\":\"path\",\"type\":\"bytes[]\"},{\"internalType\":\"bytes\",\"name\":\"value\",\"type\":\"bytes\"}],\"internalType\":\"struct ILightClientMsgs.MsgVerifyMembership\",\"name\":\"msg_\",\"type\":\"tuple\"}],\"name\":\"verifyMembership\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes\",\"name\":\"proof\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"uint64\",\"name\":\"revisionNumber\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"revisionHeight\",\"type\":\"uint64\"}],\"internalType\":\"struct IICS02ClientMsgs.Height\",\"name\":\"proofHeight\",\"type\":\"tuple\"},{\"internalType\":\"bytes[]\",\"name\":\"path\",\"type\":\"bytes[]\"}],\"internalType\":\"struct ILightClientMsgs.MsgVerifyNonMembership\",\"name\":\"msg_\",\"type\":\"tuple\"}],\"name\":\"verifyNonMembership\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"errors\":{\"AccessControlBadConfirmation()\":[{\"details\":\"The caller of a function is not the expected one. NOTE: Don't confuse with {AccessControlUnauthorizedAccount}.\"}],\"AccessControlUnauthorizedAccount(address,bytes32)\":[{\"details\":\"The `account` is missing a role.\"}],\"BadQuorum(uint8,uint256)\":[{\"params\":{\"attestationCount\":\"The size of the configured attestation set.\",\"minRequired\":\"The provided minimum required signatures.\"}}],\"ConsensusTimestampNotFound(uint64)\":[{\"params\":{\"height\":\"The height that has no associated timestamp.\"}}],\"DuplicateSigner(address)\":[{\"params\":{\"signer\":\"Address of the duplicate signer.\"}}],\"ECDSAInvalidSignature()\":[{\"details\":\"The signature is invalid.\"}],\"ECDSAInvalidSignatureLength(uint256)\":[{\"details\":\"The signature has an invalid length.\"}],\"ECDSAInvalidSignatureS(bytes32)\":[{\"details\":\"The signature has an S value that is in the upper half order.\"}],\"HeightMismatch(uint64,uint64)\":[{\"params\":{\"expected\":\"The expected height from the proofHeight field.\",\"provided\":\"The height that was present in the attested payload.\"}}],\"InvalidPathLength(uint256,uint256)\":[{\"params\":{\"expectedLength\":\"The expected length of the path.\",\"providedLength\":\"The length of the provided path.\"}}],\"InvalidSignatureLength(bytes)\":[{\"params\":{\"signature\":\"The invalid signature.\"}}],\"InvalidState(uint64,uint64)\":[{\"params\":{\"height\":\"The height of the attested state.\",\"timestamp\":\"The timestamp of the attested state.\"}}],\"SignatureInvalid(bytes)\":[{\"params\":{\"signature\":\"The invalid signature.\"}}],\"ThresholdNotMet(uint256,uint8)\":[{\"params\":{\"minRequired\":\"The minimum required signatures.\",\"validSigners\":\"Number of valid, unique attestation signatures.\"}}],\"UnknownSigner(address)\":[{\"params\":{\"signer\":\"Address of the unknown signer.\"}}]},\"events\":{\"RoleAdminChanged(bytes32,bytes32,bytes32)\":{\"details\":\"Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite {RoleAdminChanged} not being emitted to signal this.\"},\"RoleGranted(bytes32,address,address)\":{\"details\":\"Emitted when `account` is granted `role`. `sender` is the account that originated the contract call. This account bears the admin role (for the granted role). Expected in cases where the role was granted using the internal {AccessControl-_grantRole}.\"},\"RoleRevoked(bytes32,address,address)\":{\"details\":\"Emitted when `account` is revoked `role`. `sender` is the account that originated the contract call: - if using `revokeRole`, it is the admin role bearer - if using `renounceRole`, it is the role bearer (i.e. `account`)\"}},\"kind\":\"dev\",\"methods\":{\"constructor\":{\"params\":{\"attestorAddresses\":\"The configured attestor addresses (EOAs)\",\"initialHeight\":\"The initial known height\",\"initialTimestampSeconds\":\"The initial timestamp in seconds for the initial height\",\"minRequiredSigs\":\"The quorum threshold\",\"roleManager\":\"Address that will administer roles and be allowed to submit proofs; if zero, anyone can submit\"}},\"getAttestationSet()\":{\"details\":\"The attestation set is fixed for the initial scope; rotation is out of scope.\",\"returns\":{\"attestorAddresses\":\"The configured attestor EOA addresses\",\"minRequiredSigs\":\"The minimum number of unique valid signatures required\"}},\"getClientState()\":{\"returns\":{\"_0\":\"The client state.\"}},\"getConsensusTimestamp(uint64)\":{\"params\":{\"revisionHeight\":\"The height for which to query the timestamp\"},\"returns\":{\"_0\":\"The trusted timestamp in unix seconds\"}},\"getRoleAdmin(bytes32)\":{\"details\":\"Returns the admin role that controls `role`. See {grantRole} and {revokeRole}. To change a role's admin, use {_setRoleAdmin}.\"},\"grantRole(bytes32,address)\":{\"details\":\"Grants `role` to `account`. If `account` had not been already granted `role`, emits a {RoleGranted} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleGranted} event.\"},\"hasRole(bytes32,address)\":{\"details\":\"Returns `true` if `account` has been granted `role`.\"},\"misbehaviour(bytes)\":{\"params\":{\"misbehaviourMsg\":\"The misbehaviour message\"}},\"renounceRole(bytes32,address)\":{\"details\":\"Revokes `role` from the calling account. Roles are often managed via {grantRole} and {revokeRole}: this function's purpose is to provide a mechanism for accounts to lose their privileges if they are compromised (such as when a trusted device is misplaced). If the calling account had been revoked `role`, emits a {RoleRevoked} event. Requirements: - the caller must be `callerConfirmation`. May emit a {RoleRevoked} event.\"},\"revokeRole(bytes32,address)\":{\"details\":\"Revokes `role` from `account`. If `account` had been granted `role`, emits a {RoleRevoked} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleRevoked} event.\"},\"supportsInterface(bytes4)\":{\"details\":\"Returns true if this contract implements the interface defined by `interfaceId`. See the corresponding https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[ERC section] to learn more about how these ids are created. This function call must use less than 30 000 gas.\"},\"updateClient(bytes)\":{\"params\":{\"updateMsg\":\"The encoded update message e.g., an SP1 proof.\"},\"returns\":{\"_0\":\"The result of the update operation\"}},\"verifyMembership((bytes,(uint64,uint64),bytes[],bytes))\":{\"details\":\"Notice that this message is not view, as it may update the client state for caching purposes.\",\"params\":{\"msg_\":\"The membership message\"},\"returns\":{\"_0\":\"The unix timestamp of the verification height in the counterparty chain in seconds.\"}},\"verifyNonMembership((bytes,(uint64,uint64),bytes[]))\":{\"details\":\"Notice that this message is not view, as it may update the client state for caching purposes.\",\"params\":{\"msg_\":\"The membership message\"},\"returns\":{\"_0\":\"The unix timestamp of the verification height in the counterparty chain in seconds.\"}}},\"stateVariables\":{\"PROOF_SUBMITTER_ROLE\":{\"details\":\"If `address(0)` has this role, then anyone can submit proofs. If this client is used with `ICS26Router`, the router must be granted this role.\",\"return\":\"The role identifier\",\"returns\":{\"_0\":\"The role identifier\"}}},\"title\":\"Attestation-based IBC Light Client\",\"version\":1},\"userdoc\":{\"errors\":{\"BadQuorum(uint8,uint256)\":[{\"notice\":\"Reverts when the quorum threshold is zero or exceeds the attestation count.\"}],\"ConsensusTimestampNotFound(uint64)\":[{\"notice\":\"Missing trusted timestamp for the given height.\"}],\"DuplicateSigner(address)\":[{\"notice\":\"The recovered signer appears more than once among the signatures.\"}],\"EmptyPackets()\":[{\"notice\":\"The provided packet attestations were empty.\"}],\"EmptySignatures()\":[{\"notice\":\"The provided signatures were empty.\"}],\"EmptyValue()\":[{\"notice\":\"The provided membership value was empty.\"}],\"FeatureNotSupported()\":[{\"notice\":\"Reverts for functions that are out of scope for this implementation.\"}],\"FrozenClientState()\":[{\"notice\":\"Reverts when an action is attempted on a frozen client state.\"}],\"HeightMismatch(uint64,uint64)\":[{\"notice\":\"The attested height did not match the provided proof height.\"}],\"InvalidPathLength(uint256,uint256)\":[{\"notice\":\"The provided proof path length is invalid.\"}],\"InvalidSignatureLength(bytes)\":[{\"notice\":\"ECDSA signature has an invalid length.\"}],\"InvalidState(uint64,uint64)\":[{\"notice\":\"The attested state is invalid.\"}],\"NoAttestors()\":[{\"notice\":\"Reverts when the attestation set is empty during initialization.\"}],\"NotMember()\":[{\"notice\":\"The provided value is not a member of the attested set.\"}],\"NotNonMember()\":[{\"notice\":\"The attested commitment is not zero (receipt exists, so packet was received).\"}],\"SignatureInvalid(bytes)\":[{\"notice\":\"ECDSA signature failed to recover a valid signer.\"}],\"ThresholdNotMet(uint256,uint8)\":[{\"notice\":\"The number of valid unique signatures is below the required threshold.\"}],\"UnknownSigner(address)\":[{\"notice\":\"The recovered signer is not part of the attestation set.\"}]},\"kind\":\"user\",\"methods\":{\"PROOF_SUBMITTER_ROLE()\":{\"notice\":\"The role identifier for the proof submitter role\"},\"constructor\":{\"notice\":\"Initializes the attestor light client with its fixed attestor set and initial height/timestamp.\"},\"getAttestationSet()\":{\"notice\":\"Returns the attestation set configuration.\"},\"getClientState()\":{\"notice\":\"Returns the client state.\"},\"getConsensusTimestamp(uint64)\":{\"notice\":\"Returns the trusted consensus timestamp (in seconds) at the given revision height.\"},\"misbehaviour(bytes)\":{\"notice\":\"Misbehaviour handling, moves the light client to the frozen state if misbehaviour is detected\"},\"updateClient(bytes)\":{\"notice\":\"Updating the client and consensus state\"},\"verifyMembership((bytes,(uint64,uint64),bytes[],bytes))\":{\"notice\":\"Querying the membership of a key-value pair\"},\"verifyNonMembership((bytes,(uint64,uint64),bytes[]))\":{\"notice\":\"Querying the non-membership of a key\"}},\"notice\":\"Implements an IBC light client that trusts an off-chain m-of-n attestor set.\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/light-clients/attestation/AttestationLightClient.sol\":\"AttestationLightClient\"},\"evmVersion\":\"cancun\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"none\"},\"optimizer\":{\"enabled\":true,\"runs\":10000},\"remappings\":[\":@openzeppelin-contracts/=node_modules/@openzeppelin/contracts/\",\":@openzeppelin-upgradeable/=node_modules/@openzeppelin/contracts-upgradeable/\",\":@openzeppelin/=node_modules/@openzeppelin/\",\":@sp1-contracts/=node_modules/sp1-contracts/contracts/src/\",\":@uniswap/permit2/=node_modules/@uniswap/permit2/\",\":forge-std/=node_modules/forge-std/src/\",\":sp1-contracts/=node_modules/sp1-contracts/\"],\"viaIR\":true},\"sources\":{\"contracts/interfaces/ILightClient.sol\":{\"keccak256\":\"0x3b2361546ee834a442d844c979fbad3458ee13146b093f585587a09e19a266af\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://5b5d53101bb598f14a79cb1092479736fa18e8f84945ea6ef80f4dac84466042\",\"dweb:/ipfs/QmaTCo6M3Z9aYCSX65AQtixo1sB4ymQUDAgTXSKHqJHGDh\"]},\"contracts/light-clients/attestation/AttestationLightClient.sol\":{\"keccak256\":\"0xa22d7b4b7ac4eb79940df94116687c892e0ab61eb0ea27d16f189bd94211fa61\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://94eda9d8c9c9e4dfc518b8689fbc2ab2971ef46e1841627145c3f17bce24b785\",\"dweb:/ipfs/QmXc3e5Y1WyX4ChR6vovbRV4wqSqA99UcyPmaeUxQLSSkb\"]},\"contracts/light-clients/attestation/errors/IAttestationLightClientErrors.sol\":{\"keccak256\":\"0x8361e86d47983c1d1c5302b2fa5fedd001ecd8bc923c8c6de75cc6bb45387caf\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://45d910313903ba11922d9f392e99658e84114a4390c7809504df1ada403181e5\",\"dweb:/ipfs/QmUvi8etmBDUp2sqqnH8i6VJd32BwJq8RvDXfHpR1YxL4V\"]},\"contracts/light-clients/attestation/interfaces/IAttestationLightClient.sol\":{\"keccak256\":\"0x3d8f62e4fcf89f702ae6f5365c6a99f51f838876475a46e3158a54b7a9213123\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://2fab619c37a201ae02ff1b8b16790498f6fab829670420fa88c111ad48dc8db5\",\"dweb:/ipfs/QmSGJdyQoERfSDiy7tkXnwhqLCZkEgXBB66Gukr8dWQibb\"]},\"contracts/light-clients/attestation/msgs/IAttestationLightClientMsgs.sol\":{\"keccak256\":\"0x91093113f364093b8920c98608cf79190bbd4fa25058e9dddceee7d9c9f56d58\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://8e44c63a4309991be1934af1cf2c1838efafc0873dfe59e67996307f3a54dbd3\",\"dweb:/ipfs/QmcgARCrEAgDwnAcKB2XqnZx5TxRqXmEAJn5xyv5ovBVpp\"]},\"contracts/light-clients/attestation/msgs/IAttestationMsgs.sol\":{\"keccak256\":\"0xe67373f5a46069507784bcdc89a81f131e0571812f6c1e679caec1519e973d88\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://8f87e0de527a3c3c08bc2eae5b0ce08fdb91026f3e5e3c722861d3889314aed4\",\"dweb:/ipfs/QmZtMJn6Z6NxUQCzQnX9FUjyQpV7z1vH9mDra87wNYEjjA\"]},\"contracts/msgs/IICS02ClientMsgs.sol\":{\"keccak256\":\"0x03d1265eae327c3744d774bf22a30d845233d50664921c9aa57cef2d71fd89d2\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://89900781cc5c60540a237d92d42745ea6165765ee8fb4d50e8137a717195cc75\",\"dweb:/ipfs/Qmbx5p8gZ8sEMMeZytXsLee49JUayhAaoJ2yxX93WUrvQo\"]},\"contracts/msgs/ILightClientMsgs.sol\":{\"keccak256\":\"0x8d1e56ab166a7b4aa6999708e3214a4645ebbc3835c2b2a4c255c9923eebafde\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://8bd4200dc04d950c0f050623fa9a8accdbec877fd446c039d4dd6c678bdf1513\",\"dweb:/ipfs/QmZQTViaA7N6BVNDzJ1Z6w799PrPoE4ajPueZSPwX4sGZ9\"]},\"node_modules/@openzeppelin/contracts/access/AccessControl.sol\":{\"keccak256\":\"0x4686ec784d75f95beaf2bf5b5f26e5f946d4c864aaee9c3c62bdc18381f5e017\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://26710ca191913f3c9df542079c4a6dcff02968e92d4f7357daefef9fbe72a19c\",\"dweb:/ipfs/QmanHbeWuBbVEqXySHa1zhm2rExjYpChDBubBaJNTCa2JB\"]},\"node_modules/@openzeppelin/contracts/access/IAccessControl.sol\":{\"keccak256\":\"0xbff9f59c84e5337689161ce7641c0ef8e872d6a7536fbc1f5133f128887aba3c\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://b308f882e796f7b79c9502deacb0a62983035c6f6f4e962b319ba6a1f4a77d3d\",\"dweb:/ipfs/QmaWCW7ahEQqFjwhSUhV7Ae7WhfNvzSpE7DQ58hvEooqPL\"]},\"node_modules/@openzeppelin/contracts/utils/Context.sol\":{\"keccak256\":\"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://6a708e8a5bdb1011c2c381c9a5cfd8a9a956d7d0a9dc1bd8bcdaf52f76ef2f12\",\"dweb:/ipfs/Qmax9WHBnVsZP46ZxEMNRQpLQnrdE4dK8LehML1Py8FowF\"]},\"node_modules/@openzeppelin/contracts/utils/cryptography/ECDSA.sol\":{\"keccak256\":\"0xbeb5cad8aaabe0d35d2ec1a8414d91e81e5a8ca679add4cf57e2f33476861f40\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://ebb272a5ee2da4e8bd5551334e0ce8dce4e9c56a04570d6bf046d260fab3116a\",\"dweb:/ipfs/QmNw6RyM769qcqFocDq6HJMG2WiEnQbvizpRaUXsACHho2\"]},\"node_modules/@openzeppelin/contracts/utils/introspection/ERC165.sol\":{\"keccak256\":\"0x2d9dc2fe26180f74c11c13663647d38e259e45f95eb88f57b61d2160b0109d3e\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://81233d1f98060113d9922180bb0f14f8335856fe9f339134b09335e9f678c377\",\"dweb:/ipfs/QmWh6R35SarhAn4z2wH8SU456jJSYL2FgucfTFgbHJJN4E\"]},\"node_modules/@openzeppelin/contracts/utils/introspection/IERC165.sol\":{\"keccak256\":\"0x8891738ffe910f0cf2da09566928589bf5d63f4524dd734fd9cedbac3274dd5c\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://971f954442df5c2ef5b5ebf1eb245d7105d9fbacc7386ee5c796df1d45b21617\",\"dweb:/ipfs/QmadRjHbkicwqwwh61raUEapaVEtaLMcYbQZWs9gUkgj3u\"]}},\"version\":1}","metadata":{"compiler":{"version":"0.8.28+commit.7893614a"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"address[]","name":"attestorAddresses","type":"address[]"},{"internalType":"uint8","name":"minRequiredSigs","type":"uint8"},{"internalType":"uint64","name":"initialHeight","type":"uint64"},{"internalType":"uint64","name":"initialTimestampSeconds","type":"uint64"},{"internalType":"address","name":"roleManager","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"type":"error","name":"AccessControlBadConfirmation"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bytes32","name":"neededRole","type":"bytes32"}],"type":"error","name":"AccessControlUnauthorizedAccount"},{"inputs":[{"internalType":"uint8","name":"minRequired","type":"uint8"},{"internalType":"uint256","name":"attestationCount","type":"uint256"}],"type":"error","name":"BadQuorum"},{"inputs":[{"internalType":"uint64","name":"height","type":"uint64"}],"type":"error","name":"ConsensusTimestampNotFound"},{"inputs":[{"internalType":"address","name":"signer","type":"address"}],"type":"error","name":"DuplicateSigner"},{"inputs":[],"type":"error","name":"ECDSAInvalidSignature"},{"inputs":[{"internalType":"uint256","name":"length","type":"uint256"}],"type":"error","name":"ECDSAInvalidSignatureLength"},{"inputs":[{"internalType":"bytes32","name":"s","type":"bytes32"}],"type":"error","name":"ECDSAInvalidSignatureS"},{"inputs":[],"type":"error","name":"EmptyPackets"},{"inputs":[],"type":"error","name":"EmptySignatures"},{"inputs":[],"type":"error","name":"EmptyValue"},{"inputs":[],"type":"error","name":"FeatureNotSupported"},{"inputs":[],"type":"error","name":"FrozenClientState"},{"inputs":[{"internalType":"uint64","name":"expected","type":"uint64"},{"internalType":"uint64","name":"provided","type":"uint64"}],"type":"error","name":"HeightMismatch"},{"inputs":[{"internalType":"uint256","name":"expectedLength","type":"uint256"},{"internalType":"uint256","name":"providedLength","type":"uint256"}],"type":"error","name":"InvalidPathLength"},{"inputs":[{"internalType":"bytes","name":"signature","type":"bytes"}],"type":"error","name":"InvalidSignatureLength"},{"inputs":[{"internalType":"uint64","name":"height","type":"uint64"},{"internalType":"uint64","name":"timestamp","type":"uint64"}],"type":"error","name":"InvalidState"},{"inputs":[],"type":"error","name":"NoAttestors"},{"inputs":[],"type":"error","name":"NotMember"},{"inputs":[],"type":"error","name":"NotNonMember"},{"inputs":[{"internalType":"bytes","name":"signature","type":"bytes"}],"type":"error","name":"SignatureInvalid"},{"inputs":[{"internalType":"uint256","name":"validSigners","type":"uint256"},{"internalType":"uint8","name":"minRequired","type":"uint8"}],"type":"error","name":"ThresholdNotMet"},{"inputs":[{"internalType":"address","name":"signer","type":"address"}],"type":"error","name":"UnknownSigner"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32","indexed":true},{"internalType":"bytes32","name":"previousAdminRole","type":"bytes32","indexed":true},{"internalType":"bytes32","name":"newAdminRole","type":"bytes32","indexed":true}],"type":"event","name":"RoleAdminChanged","anonymous":false},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32","indexed":true},{"internalType":"address","name":"account","type":"address","indexed":true},{"internalType":"address","name":"sender","type":"address","indexed":true}],"type":"event","name":"RoleGranted","anonymous":false},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32","indexed":true},{"internalType":"address","name":"account","type":"address","indexed":true},{"internalType":"address","name":"sender","type":"address","indexed":true}],"type":"event","name":"RoleRevoked","anonymous":false},{"inputs":[],"stateMutability":"view","type":"function","name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"PROOF_SUBMITTER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"getAttestationSet","outputs":[{"internalType":"address[]","name":"attestorAddresses","type":"address[]"},{"internalType":"uint8","name":"minRequiredSigs","type":"uint8"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"getClientState","outputs":[{"internalType":"bytes","name":"","type":"bytes"}]},{"inputs":[{"internalType":"uint64","name":"revisionHeight","type":"uint64"}],"stateMutability":"view","type":"function","name":"getConsensusTimestamp","outputs":[{"internalType":"uint64","name":"","type":"uint64"}]},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"stateMutability":"view","type":"function","name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}]},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"stateMutability":"nonpayable","type":"function","name":"grantRole"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"stateMutability":"view","type":"function","name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}]},{"inputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function","name":"misbehaviour"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"callerConfirmation","type":"address"}],"stateMutability":"nonpayable","type":"function","name":"renounceRole"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"stateMutability":"nonpayable","type":"function","name":"revokeRole"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"stateMutability":"view","type":"function","name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}]},{"inputs":[{"internalType":"bytes","name":"updateMsg","type":"bytes"}],"stateMutability":"nonpayable","type":"function","name":"updateClient","outputs":[{"internalType":"enum ILightClientMsgs.UpdateResult","name":"","type":"uint8"}]},{"inputs":[{"internalType":"struct ILightClientMsgs.MsgVerifyMembership","name":"msg_","type":"tuple","components":[{"internalType":"bytes","name":"proof","type":"bytes"},{"internalType":"struct IICS02ClientMsgs.Height","name":"proofHeight","type":"tuple","components":[{"internalType":"uint64","name":"revisionNumber","type":"uint64"},{"internalType":"uint64","name":"revisionHeight","type":"uint64"}]},{"internalType":"bytes[]","name":"path","type":"bytes[]"},{"internalType":"bytes","name":"value","type":"bytes"}]}],"stateMutability":"view","type":"function","name":"verifyMembership","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[{"internalType":"struct ILightClientMsgs.MsgVerifyNonMembership","name":"msg_","type":"tuple","components":[{"internalType":"bytes","name":"proof","type":"bytes"},{"internalType":"struct IICS02ClientMsgs.Height","name":"proofHeight","type":"tuple","components":[{"internalType":"uint64","name":"revisionNumber","type":"uint64"},{"internalType":"uint64","name":"revisionHeight","type":"uint64"}]},{"internalType":"bytes[]","name":"path","type":"bytes[]"}]}],"stateMutability":"view","type":"function","name":"verifyNonMembership","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]}],"devdoc":{"kind":"dev","methods":{"constructor":{"params":{"attestorAddresses":"The configured attestor addresses (EOAs)","initialHeight":"The initial known height","initialTimestampSeconds":"The initial timestamp in seconds for the initial height","minRequiredSigs":"The quorum threshold","roleManager":"Address that will administer roles and be allowed to submit proofs; if zero, anyone can submit"}},"getAttestationSet()":{"details":"The attestation set is fixed for the initial scope; rotation is out of scope.","returns":{"attestorAddresses":"The configured attestor EOA addresses","minRequiredSigs":"The minimum number of unique valid signatures required"}},"getClientState()":{"returns":{"_0":"The client state."}},"getConsensusTimestamp(uint64)":{"params":{"revisionHeight":"The height for which to query the timestamp"},"returns":{"_0":"The trusted timestamp in unix seconds"}},"getRoleAdmin(bytes32)":{"details":"Returns the admin role that controls `role`. See {grantRole} and {revokeRole}. To change a role's admin, use {_setRoleAdmin}."},"grantRole(bytes32,address)":{"details":"Grants `role` to `account`. If `account` had not been already granted `role`, emits a {RoleGranted} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleGranted} event."},"hasRole(bytes32,address)":{"details":"Returns `true` if `account` has been granted `role`."},"misbehaviour(bytes)":{"params":{"misbehaviourMsg":"The misbehaviour message"}},"renounceRole(bytes32,address)":{"details":"Revokes `role` from the calling account. Roles are often managed via {grantRole} and {revokeRole}: this function's purpose is to provide a mechanism for accounts to lose their privileges if they are compromised (such as when a trusted device is misplaced). If the calling account had been revoked `role`, emits a {RoleRevoked} event. Requirements: - the caller must be `callerConfirmation`. May emit a {RoleRevoked} event."},"revokeRole(bytes32,address)":{"details":"Revokes `role` from `account`. If `account` had been granted `role`, emits a {RoleRevoked} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleRevoked} event."},"supportsInterface(bytes4)":{"details":"Returns true if this contract implements the interface defined by `interfaceId`. See the corresponding https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[ERC section] to learn more about how these ids are created. This function call must use less than 30 000 gas."},"updateClient(bytes)":{"params":{"updateMsg":"The encoded update message e.g., an SP1 proof."},"returns":{"_0":"The result of the update operation"}},"verifyMembership((bytes,(uint64,uint64),bytes[],bytes))":{"details":"Notice that this message is not view, as it may update the client state for caching purposes.","params":{"msg_":"The membership message"},"returns":{"_0":"The unix timestamp of the verification height in the counterparty chain in seconds."}},"verifyNonMembership((bytes,(uint64,uint64),bytes[]))":{"details":"Notice that this message is not view, as it may update the client state for caching purposes.","params":{"msg_":"The membership message"},"returns":{"_0":"The unix timestamp of the verification height in the counterparty chain in seconds."}}},"version":1},"userdoc":{"kind":"user","methods":{"PROOF_SUBMITTER_ROLE()":{"notice":"The role identifier for the proof submitter role"},"constructor":{"notice":"Initializes the attestor light client with its fixed attestor set and initial height/timestamp."},"getAttestationSet()":{"notice":"Returns the attestation set configuration."},"getClientState()":{"notice":"Returns the client state."},"getConsensusTimestamp(uint64)":{"notice":"Returns the trusted consensus timestamp (in seconds) at the given revision height."},"misbehaviour(bytes)":{"notice":"Misbehaviour handling, moves the light client to the frozen state if misbehaviour is detected"},"updateClient(bytes)":{"notice":"Updating the client and consensus state"},"verifyMembership((bytes,(uint64,uint64),bytes[],bytes))":{"notice":"Querying the membership of a key-value pair"},"verifyNonMembership((bytes,(uint64,uint64),bytes[]))":{"notice":"Querying the non-membership of a key"}},"version":1}},"settings":{"remappings":["@openzeppelin-contracts/=node_modules/@openzeppelin/contracts/","@openzeppelin-upgradeable/=node_modules/@openzeppelin/contracts-upgradeable/","@openzeppelin/=node_modules/@openzeppelin/","@sp1-contracts/=node_modules/sp1-contracts/contracts/src/","@uniswap/permit2/=node_modules/@uniswap/permit2/","forge-std/=node_modules/forge-std/src/","sp1-contracts/=node_modules/sp1-contracts/"],"optimizer":{"enabled":true,"runs":10000},"metadata":{"bytecodeHash":"none"},"compilationTarget":{"contracts/light-clients/attestation/AttestationLightClient.sol":"AttestationLightClient"},"evmVersion":"cancun","libraries":{},"viaIR":true},"sources":{"contracts/interfaces/ILightClient.sol":{"keccak256":"0x3b2361546ee834a442d844c979fbad3458ee13146b093f585587a09e19a266af","urls":["bzz-raw://5b5d53101bb598f14a79cb1092479736fa18e8f84945ea6ef80f4dac84466042","dweb:/ipfs/QmaTCo6M3Z9aYCSX65AQtixo1sB4ymQUDAgTXSKHqJHGDh"],"license":"Apache-2.0"},"contracts/light-clients/attestation/AttestationLightClient.sol":{"keccak256":"0xa22d7b4b7ac4eb79940df94116687c892e0ab61eb0ea27d16f189bd94211fa61","urls":["bzz-raw://94eda9d8c9c9e4dfc518b8689fbc2ab2971ef46e1841627145c3f17bce24b785","dweb:/ipfs/QmXc3e5Y1WyX4ChR6vovbRV4wqSqA99UcyPmaeUxQLSSkb"],"license":"Apache-2.0"},"contracts/light-clients/attestation/errors/IAttestationLightClientErrors.sol":{"keccak256":"0x8361e86d47983c1d1c5302b2fa5fedd001ecd8bc923c8c6de75cc6bb45387caf","urls":["bzz-raw://45d910313903ba11922d9f392e99658e84114a4390c7809504df1ada403181e5","dweb:/ipfs/QmUvi8etmBDUp2sqqnH8i6VJd32BwJq8RvDXfHpR1YxL4V"],"license":"Apache-2.0"},"contracts/light-clients/attestation/interfaces/IAttestationLightClient.sol":{"keccak256":"0x3d8f62e4fcf89f702ae6f5365c6a99f51f838876475a46e3158a54b7a9213123","urls":["bzz-raw://2fab619c37a201ae02ff1b8b16790498f6fab829670420fa88c111ad48dc8db5","dweb:/ipfs/QmSGJdyQoERfSDiy7tkXnwhqLCZkEgXBB66Gukr8dWQibb"],"license":"Apache-2.0"},"contracts/light-clients/attestation/msgs/IAttestationLightClientMsgs.sol":{"keccak256":"0x91093113f364093b8920c98608cf79190bbd4fa25058e9dddceee7d9c9f56d58","urls":["bzz-raw://8e44c63a4309991be1934af1cf2c1838efafc0873dfe59e67996307f3a54dbd3","dweb:/ipfs/QmcgARCrEAgDwnAcKB2XqnZx5TxRqXmEAJn5xyv5ovBVpp"],"license":"Apache-2.0"},"contracts/light-clients/attestation/msgs/IAttestationMsgs.sol":{"keccak256":"0xe67373f5a46069507784bcdc89a81f131e0571812f6c1e679caec1519e973d88","urls":["bzz-raw://8f87e0de527a3c3c08bc2eae5b0ce08fdb91026f3e5e3c722861d3889314aed4","dweb:/ipfs/QmZtMJn6Z6NxUQCzQnX9FUjyQpV7z1vH9mDra87wNYEjjA"],"license":"Apache-2.0"},"contracts/msgs/IICS02ClientMsgs.sol":{"keccak256":"0x03d1265eae327c3744d774bf22a30d845233d50664921c9aa57cef2d71fd89d2","urls":["bzz-raw://89900781cc5c60540a237d92d42745ea6165765ee8fb4d50e8137a717195cc75","dweb:/ipfs/Qmbx5p8gZ8sEMMeZytXsLee49JUayhAaoJ2yxX93WUrvQo"],"license":"Apache-2.0"},"contracts/msgs/ILightClientMsgs.sol":{"keccak256":"0x8d1e56ab166a7b4aa6999708e3214a4645ebbc3835c2b2a4c255c9923eebafde","urls":["bzz-raw://8bd4200dc04d950c0f050623fa9a8accdbec877fd446c039d4dd6c678bdf1513","dweb:/ipfs/QmZQTViaA7N6BVNDzJ1Z6w799PrPoE4ajPueZSPwX4sGZ9"],"license":"Apache-2.0"},"node_modules/@openzeppelin/contracts/access/AccessControl.sol":{"keccak256":"0x4686ec784d75f95beaf2bf5b5f26e5f946d4c864aaee9c3c62bdc18381f5e017","urls":["bzz-raw://26710ca191913f3c9df542079c4a6dcff02968e92d4f7357daefef9fbe72a19c","dweb:/ipfs/QmanHbeWuBbVEqXySHa1zhm2rExjYpChDBubBaJNTCa2JB"],"license":"MIT"},"node_modules/@openzeppelin/contracts/access/IAccessControl.sol":{"keccak256":"0xbff9f59c84e5337689161ce7641c0ef8e872d6a7536fbc1f5133f128887aba3c","urls":["bzz-raw://b308f882e796f7b79c9502deacb0a62983035c6f6f4e962b319ba6a1f4a77d3d","dweb:/ipfs/QmaWCW7ahEQqFjwhSUhV7Ae7WhfNvzSpE7DQ58hvEooqPL"],"license":"MIT"},"node_modules/@openzeppelin/contracts/utils/Context.sol":{"keccak256":"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2","urls":["bzz-raw://6a708e8a5bdb1011c2c381c9a5cfd8a9a956d7d0a9dc1bd8bcdaf52f76ef2f12","dweb:/ipfs/Qmax9WHBnVsZP46ZxEMNRQpLQnrdE4dK8LehML1Py8FowF"],"license":"MIT"},"node_modules/@openzeppelin/contracts/utils/cryptography/ECDSA.sol":{"keccak256":"0xbeb5cad8aaabe0d35d2ec1a8414d91e81e5a8ca679add4cf57e2f33476861f40","urls":["bzz-raw://ebb272a5ee2da4e8bd5551334e0ce8dce4e9c56a04570d6bf046d260fab3116a","dweb:/ipfs/QmNw6RyM769qcqFocDq6HJMG2WiEnQbvizpRaUXsACHho2"],"license":"MIT"},"node_modules/@openzeppelin/contracts/utils/introspection/ERC165.sol":{"keccak256":"0x2d9dc2fe26180f74c11c13663647d38e259e45f95eb88f57b61d2160b0109d3e","urls":["bzz-raw://81233d1f98060113d9922180bb0f14f8335856fe9f339134b09335e9f678c377","dweb:/ipfs/QmWh6R35SarhAn4z2wH8SU456jJSYL2FgucfTFgbHJJN4E"],"license":"MIT"},"node_modules/@openzeppelin/contracts/utils/introspection/IERC165.sol":{"keccak256":"0x8891738ffe910f0cf2da09566928589bf5d63f4524dd734fd9cedbac3274dd5c","urls":["bzz-raw://971f954442df5c2ef5b5ebf1eb245d7105d9fbacc7386ee5c796df1d45b21617","dweb:/ipfs/QmadRjHbkicwqwwh61raUEapaVEtaLMcYbQZWs9gUkgj3u"],"license":"MIT"}},"version":1},"id":29} \ No newline at end of file diff --git a/ibc-solidity/abi/bytecode/BesuIBFT2LightClient.json b/ibc-solidity/abi/bytecode/BesuIBFT2LightClient.json index 1c61f4df8..690569b9d 100644 --- a/ibc-solidity/abi/bytecode/BesuIBFT2LightClient.json +++ b/ibc-solidity/abi/bytecode/BesuIBFT2LightClient.json @@ -1 +1 @@ -{"abi":[{"type":"constructor","inputs":[{"name":"ibcRouter","type":"address","internalType":"address"},{"name":"initialTrustedHeight","type":"uint64","internalType":"uint64"},{"name":"initialTrustedTimestamp","type":"uint64","internalType":"uint64"},{"name":"initialTrustedStorageRoot","type":"bytes32","internalType":"bytes32"},{"name":"initialTrustedValidators","type":"address[]","internalType":"address[]"},{"name":"trustingPeriod","type":"uint64","internalType":"uint64"},{"name":"maxClockDrift","type":"uint64","internalType":"uint64"},{"name":"roleManager","type":"address","internalType":"address"}],"stateMutability":"nonpayable"},{"type":"function","name":"DEFAULT_ADMIN_ROLE","inputs":[],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"type":"function","name":"PROOF_SUBMITTER_ROLE","inputs":[],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"type":"function","name":"getClientState","inputs":[],"outputs":[{"name":"","type":"bytes","internalType":"bytes"}],"stateMutability":"view"},{"type":"function","name":"getConsensusState","inputs":[{"name":"revisionHeight","type":"uint64","internalType":"uint64"}],"outputs":[{"name":"","type":"bytes","internalType":"bytes"}],"stateMutability":"view"},{"type":"function","name":"getRoleAdmin","inputs":[{"name":"role","type":"bytes32","internalType":"bytes32"}],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"type":"function","name":"grantRole","inputs":[{"name":"role","type":"bytes32","internalType":"bytes32"},{"name":"account","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"hasRole","inputs":[{"name":"role","type":"bytes32","internalType":"bytes32"},{"name":"account","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"misbehaviour","inputs":[{"name":"","type":"bytes","internalType":"bytes"}],"outputs":[],"stateMutability":"view"},{"type":"function","name":"renounceRole","inputs":[{"name":"role","type":"bytes32","internalType":"bytes32"},{"name":"callerConfirmation","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"revokeRole","inputs":[{"name":"role","type":"bytes32","internalType":"bytes32"},{"name":"account","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"supportsInterface","inputs":[{"name":"interfaceId","type":"bytes4","internalType":"bytes4"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"updateClient","inputs":[{"name":"updateMsg","type":"bytes","internalType":"bytes"}],"outputs":[{"name":"","type":"uint8","internalType":"enum ILightClientMsgs.UpdateResult"}],"stateMutability":"nonpayable"},{"type":"function","name":"verifyMembership","inputs":[{"name":"msg_","type":"tuple","internalType":"struct ILightClientMsgs.MsgVerifyMembership","components":[{"name":"proof","type":"bytes","internalType":"bytes"},{"name":"proofHeight","type":"tuple","internalType":"struct IICS02ClientMsgs.Height","components":[{"name":"revisionNumber","type":"uint64","internalType":"uint64"},{"name":"revisionHeight","type":"uint64","internalType":"uint64"}]},{"name":"path","type":"bytes[]","internalType":"bytes[]"},{"name":"value","type":"bytes","internalType":"bytes"}]}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"verifyNonMembership","inputs":[{"name":"msg_","type":"tuple","internalType":"struct ILightClientMsgs.MsgVerifyNonMembership","components":[{"name":"proof","type":"bytes","internalType":"bytes"},{"name":"proofHeight","type":"tuple","internalType":"struct IICS02ClientMsgs.Height","components":[{"name":"revisionNumber","type":"uint64","internalType":"uint64"},{"name":"revisionHeight","type":"uint64","internalType":"uint64"}]},{"name":"path","type":"bytes[]","internalType":"bytes[]"}]}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"event","name":"RoleAdminChanged","inputs":[{"name":"role","type":"bytes32","indexed":true,"internalType":"bytes32"},{"name":"previousAdminRole","type":"bytes32","indexed":true,"internalType":"bytes32"},{"name":"newAdminRole","type":"bytes32","indexed":true,"internalType":"bytes32"}],"anonymous":false},{"type":"event","name":"RoleGranted","inputs":[{"name":"role","type":"bytes32","indexed":true,"internalType":"bytes32"},{"name":"account","type":"address","indexed":true,"internalType":"address"},{"name":"sender","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"type":"event","name":"RoleRevoked","inputs":[{"name":"role","type":"bytes32","indexed":true,"internalType":"bytes32"},{"name":"account","type":"address","indexed":true,"internalType":"address"},{"name":"sender","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"type":"error","name":"AccessControlBadConfirmation","inputs":[]},{"type":"error","name":"AccessControlUnauthorizedAccount","inputs":[{"name":"account","type":"address","internalType":"address"},{"name":"neededRole","type":"bytes32","internalType":"bytes32"}]},{"type":"error","name":"ConflictingConsensusState","inputs":[{"name":"revisionHeight","type":"uint64","internalType":"uint64"}]},{"type":"error","name":"ConsensusStateExpired","inputs":[{"name":"trustedTimestamp","type":"uint64","internalType":"uint64"},{"name":"currentTimestamp","type":"uint256","internalType":"uint256"},{"name":"trustingPeriod","type":"uint64","internalType":"uint64"}]},{"type":"error","name":"ConsensusStateNotFound","inputs":[{"name":"revisionHeight","type":"uint64","internalType":"uint64"}]},{"type":"error","name":"DuplicateCommitSealSigner","inputs":[{"name":"signer","type":"address","internalType":"address"}]},{"type":"error","name":"DuplicateValidator","inputs":[{"name":"validator","type":"address","internalType":"address"}]},{"type":"error","name":"EmptyValidatorSet","inputs":[]},{"type":"error","name":"HeaderFromFuture","inputs":[{"name":"currentTimestamp","type":"uint256","internalType":"uint256"},{"name":"headerTimestamp","type":"uint256","internalType":"uint256"},{"name":"maxClockDrift","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"InsufficientTrustedValidatorOverlap","inputs":[{"name":"actual","type":"uint256","internalType":"uint256"},{"name":"required","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"InsufficientValidatorQuorum","inputs":[{"name":"actual","type":"uint256","internalType":"uint256"},{"name":"required","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"InvalidCommitSeal","inputs":[]},{"type":"error","name":"InvalidCommitmentValue","inputs":[{"name":"expectedValue","type":"bytes32","internalType":"bytes32"},{"name":"actualValue","type":"bytes32","internalType":"bytes32"}]},{"type":"error","name":"InvalidDifficulty","inputs":[{"name":"actualDifficulty","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"InvalidECDSASignatureLength","inputs":[{"name":"length","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"InvalidExtraDataFormat","inputs":[{"name":"itemsLength","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"InvalidHeaderFormat","inputs":[{"name":"itemsLength","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"InvalidHeaderHeight","inputs":[]},{"type":"error","name":"InvalidMixHash","inputs":[{"name":"actualMixHash","type":"bytes32","internalType":"bytes32"}]},{"type":"error","name":"InvalidNonce","inputs":[{"name":"actualNonce","type":"bytes","internalType":"bytes"}]},{"type":"error","name":"InvalidOmmersHash","inputs":[{"name":"actualOmmersHash","type":"bytes32","internalType":"bytes32"}]},{"type":"error","name":"InvalidPathLength","inputs":[{"name":"expectedLength","type":"uint256","internalType":"uint256"},{"name":"actualLength","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"InvalidRevisionNumber","inputs":[{"name":"providedRevisionNumber","type":"uint64","internalType":"uint64"}]},{"type":"error","name":"InvalidValidatorAddress","inputs":[{"name":"validator","type":"address","internalType":"address"}]},{"type":"error","name":"InvalidValidatorAddressLength","inputs":[{"name":"length","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"InvalidValueLength","inputs":[{"name":"expectedLength","type":"uint256","internalType":"uint256"},{"name":"actualLength","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"UnsupportedMisbehaviour","inputs":[]},{"type":"error","name":"ValueExists","inputs":[{"name":"actualValue","type":"bytes32","internalType":"bytes32"}]}],"bytecode":{"object":"0x6080604052346103c0576138d580380380610019816103c4565b928339810190610100818303126103c057610033816103e9565b61003f602083016103fd565b9061004c604084016103fd565b60608401516080850151909291906001600160401b0381116103c05785019286601f850112156103c0578351966001600160401b038811610376578760051b9460206100998188016103c4565b809a81520190602082978201019283116103c057602001905b8282106103a8575050506100c860a087016103fd565b956100e160e06100da60c084016103fd565b92016103e9565b956001600160401b03169081156103995788511561038a575f5b89518110156101b1576001600160a01b03610116828c610411565b51161561018a575f5b81811061012f57506001016100fb565b6001600160a01b03610141828d610411565b51166001600160a01b03610155848e610411565b5116146101645760010161011f565b6001600160a01b03610176838d610411565b511663107f863360e21b5f5260045260245ffd5b6001600160a01b039061019d908b610411565b51166359bff38760e01b5f5260045260245ffd5b5060408051979896978a979181016001600160401b03811182821017610376576040525f81526020810190848252604051926080840198848a1060018060401b038b1117610376576040998a526001600160a01b031680855260208086018490526001600160401b03928316868c01819052878416606090970196909652600180546001600160a01b031916909217825592516002805495516001600160801b031996871692851692909217918c1b6fffffffffffffffff000000000000000090811692909217815560038054909616909617968b1b16959095179092555f948552600490529590922080546001600160401b03191694861694909417845583019190915592519392019190831161037657680100000000000000008311610376578154838355808410610350575b50905f5260205f205f5b83811061033357846001600160a01b03811661031a575061030961052f565b505b60405161328390816105b28239f35b8061032761032d92610439565b506104af565b5061030b565b82516001600160a01b0316818301556020909201916001016102ea565b825f528360205f2091820191015b81811061036b57506102e0565b5f815560010161035e565b634e487b7160e01b5f52604160045260245ffd5b63339e1ffb60e01b5f5260045ffd5b6359d119e360e01b5f5260045ffd5b602080916103b5846103e9565b8152019101906100b2565b5f80fd5b6040519190601f01601f191682016001600160401b0381118382101761037657604052565b51906001600160a01b03821682036103c057565b51906001600160401b03821682036103c057565b80518210156104255760209160051b010190565b634e487b7160e01b5f52603260045260245ffd5b6001600160a01b0381165f9081525f5160206138b55f395f51905f52602052604090205460ff166104aa576001600160a01b03165f8181525f5160206138b55f395f51905f5260205260408120805460ff191660011790553391905f5160206138355f395f51905f528180a4600190565b505f90565b6001600160a01b0381165f9081525f5160206138555f395f51905f52602052604090205460ff166104aa576001600160a01b03165f8181525f5160206138555f395f51905f5260205260408120805460ff191660011790553391905f5160206138955f395f51905f52905f5160206138355f395f51905f529080a4600190565b5f80525f5160206138555f395f51905f526020525f5160206138755f395f51905f525460ff166105ad575f8080525f5160206138555f395f51905f526020525f5160206138755f395f51905f52805460ff1916600117905533905f5160206138955f395f51905f525f5160206138355f395f51905f528280a4600190565b5f9056fe60806040526004361015610011575f80fd5b5f3560e01c806301ffc9a7146100f45780630bece356146100ef578063248a9ca3146100ea5780632f2ff15d146100e557806336568abe146100e05780634d6d9ffb146100db5780635972185a146100d6578063682ed5f0146100d157806391d14854146100cc578063a217fddf146100c7578063d547741f146100c2578063ddba6537146100bd578063edce8bdc146100b85763ef913a4b146100b3575f80fd5b610a16565b61095e565b61088b565b61085c565b610842565b6107f4565b6105e6565b6105ac565b6103ac565b610350565b61031a565b6102b5565b610217565b34610195576020600319360112610195576004357fffffffff00000000000000000000000000000000000000000000000000000000811680910361019557807f7965db0b000000000000000000000000000000000000000000000000000000006020921490811561016b575b506040519015158152f35b7f01ffc9a7000000000000000000000000000000000000000000000000000000009150145f610160565b5f80fd5b9060206003198301126101955760043567ffffffffffffffff811161019557826023820112156101955780600401359267ffffffffffffffff84116101955760248483010111610195576024019190565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b346101955761028161022836610199565b5f80527f4c48d1d2b0f4f7485fc28e3db22341d96a20aa29e6efa8149da9751603abd4e06020527f6e0c24a6e293ff9b755263dbaa15ba3796b0b8d3fe17cfb4ddf8143b268eac475490919060ff161561029957610d9d565b6040516003821015610294576020918152f35b6101ea565b6102a1611287565b610d9d565b90816020910312610195573590565b346101955760206003193601126101955760206102df6004355f525f602052600160405f20015490565b604051908152f35b6003196040910112610195576004359060243573ffffffffffffffffffffffffffffffffffffffff811681036101955790565b346101955761034e61032b366102e7565b90610349610344825f525f602052600160405f20015490565b61130f565b6121b3565b005b346101955761035e366102e7565b3373ffffffffffffffffffffffffffffffffffffffff8216036103845761034e9161228a565b7f6697b232000000000000000000000000000000000000000000000000000000005f5260045ffd5b346101955760206003193601126101955760043567ffffffffffffffff8111610195578060040160806003198336030112610195575f80527f4c48d1d2b0f4f7485fc28e3db22341d96a20aa29e6efa8149da9751603abd4e060205260ff7f6e0c24a6e293ff9b755263dbaa15ba3796b0b8d3fe17cfb4ddf8143b268eac4754161561059f575b61044761044260248401611192565b61137c565b60648201916001610458848461119c565b90500361056157906104a96104966104a261049d61049661049061048961048460446104e09a01611192565b611b30565b988761119c565b9061126e565b3691610b4d565b61235f565b928061121d565b906001840154906040516104d7816104c960208201948560209181520190565b03601f198101835282610afd565b519020916123ed565b805161051f5761051b61050b6104fe845467ffffffffffffffff1690565b67ffffffffffffffff1690565b6040519081529081906020820190565b0390f35b61053361052e61055e92612532565b61255f565b7fd039601e000000000000000000000000000000000000000000000000000000005f52600452602490565b5ffd5b61055e61056e848461119c565b7f88b3170e000000000000000000000000000000000000000000000000000000005f52600160045260245250604490565b6105a7611287565b610433565b34610195575f6003193601126101955760206040517fbd893629a699470e4ec82a5715bb4981fdaacc5d0a728bf5f55b801d8f4ef10b8152f35b346101955760206003193601126101955760043567ffffffffffffffff8111610195578060040160a06003198336030112610195575f80527f4c48d1d2b0f4f7485fc28e3db22341d96a20aa29e6efa8149da9751603abd4e060205260ff7f6e0c24a6e293ff9b755263dbaa15ba3796b0b8d3fe17cfb4ddf8143b268eac475416156107e7575b61067c61044260248401611192565b6064820191600161068d848461119c565b90500361056157608481019060206106a5838561121d565b9050036107a957906106f46104966106ed6106e56106de61049d6104966104906106d761048460446107149c01611192565b9b8b61119c565b948761121d565b8101906102a6565b948061121d565b906001850154906040516104d7816104c960208201948560209181520190565b8051156107755761052e61072791612532565b908082036107475761051b61050b6104fe855467ffffffffffffffff1690565b7f56ed1b63000000000000000000000000000000000000000000000000000000005f5260045260245260445ffd5b61055e827f56ed1b63000000000000000000000000000000000000000000000000000000005f52906044916004525f602452565b61055e6107b6838561121d565b7f24fadac8000000000000000000000000000000000000000000000000000000005f52602060045260245250604490565b6107ef611287565b61066d565b3461019557602060ff610836610809366102e7565b905f525f845260405f209073ffffffffffffffffffffffffffffffffffffffff165f5260205260405f2090565b54166040519015158152f35b34610195575f6003193601126101955760206040515f8152f35b346101955761034e61086d366102e7565b90610886610344825f525f602052600160405f20015490565b61228a565b346101955761089936610199565b50505f80527f4c48d1d2b0f4f7485fc28e3db22341d96a20aa29e6efa8149da9751603abd4e06020527f6e0c24a6e293ff9b755263dbaa15ba3796b0b8d3fe17cfb4ddf8143b268eac475460ff1615610915575b7f2c1ed462000000000000000000000000000000000000000000000000000000005f5260045ffd5b61091d611287565b6108ed565b67ffffffffffffffff81160361019557565b601f19601f602060409481855280519182918282880152018686015e5f8582860101520116010190565b346101955760206003193601126101955761097e60043561048481610922565b67ffffffffffffffff8154166002600183015492019060405192608084019160208501526040840152606080840152815480915260a08301915f5260205f20905f5b8181106109ea5761051b856109de818703601f198101835282610afd565b60405191829182610934565b825473ffffffffffffffffffffffffffffffffffffffff168452602090930192600192830192016109c0565b34610195575f6003193601126101955761051b60405173ffffffffffffffffffffffffffffffffffffffff60015416602082015267ffffffffffffffff600254818116604084015260401c16606082015267ffffffffffffffff600354818116608084015260401c1660a082015260a081526109de60c082610afd565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b6060810190811067ffffffffffffffff821117610adc57604052565b610a93565b6040810190811067ffffffffffffffff821117610adc57604052565b90601f601f19910116810190811067ffffffffffffffff821117610adc57604052565b60405190610b2f604083610afd565b565b67ffffffffffffffff8111610adc57601f01601f191660200190565b929192610b5982610b31565b91610b676040519384610afd565b829481845281830111610195578281602093845f960137010152565b9080601f8301121561019557816020610b9e93359101610b4d565b90565b6020818303126101955780359067ffffffffffffffff8211610195570180820391608083126101955760405192610bd784610ac0565b823567ffffffffffffffff811161019557604091610bfa84601f19938701610b83565b8652011261019557604051610c0e81610ae1565b6020830135610c1c81610922565b81526040830135610c2c81610922565b60208201526020840152606082013567ffffffffffffffff811161019557610c549201610b83565b604082015290565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b9060018201809211610c9757565b610c5c565b60c001908160c011610c9757565b60f701908160f711610c9757565b6080019081608011610c9757565b60b701908160b711610c9757565b91908201809211610c9757565b908160011b9180830460021490151715610c9757565b81519167ffffffffffffffff8311610adc57680100000000000000008311610adc578154838355808410610d77575b506020610d389101915f5260205f2090565b5f5b838110610d475750505050565b6001906020610d6a855173ffffffffffffffffffffffffffffffffffffffff1690565b9401938184015501610d3a565b825f528360205f2091820191015b818110610d925750610d26565b5f8155600101610d85565b610da991810190610ba1565b9060208201610dc461044282515167ffffffffffffffff1690565b610dce8351611614565b92606084019367ffffffffffffffff610def865167ffffffffffffffff1690565b161561116a5760035491604083901c67ffffffffffffffff1693610e1d67ffffffffffffffff861642610cd4565b9460a0840195610e35875167ffffffffffffffff1690565b9067ffffffffffffffff82161161112b5750505160200151610e7290610e649067ffffffffffffffff16611b30565b9367ffffffffffffffff1690565b67ffffffffffffffff81168015159081611102575b506110ad575090610ef591610eb66002610eae610ea385611b87565b60e086015190611ca1565b950185611ea7565b610ec660c0830194855190611fcc565b60406080610ee960015473ffffffffffffffffffffffffffffffffffffffff1690565b9301519101519161206f565b610f22610f0a865167ffffffffffffffff1690565b67ffffffffffffffff165f52600460205260405f2090565b610f376104fe825467ffffffffffffffff1690565b61103b5750916002610fb5928694610fa8610f73610f64610f0a610fc39a9b5167ffffffffffffffff1690565b955167ffffffffffffffff1690565b859067ffffffffffffffff167fffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000825416179055565b6001840155519101610cf7565b5167ffffffffffffffff1690565b600254610fdc9060401c67ffffffffffffffff166104fe565b67ffffffffffffffff821611610ff157505f90565b611037907fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff6fffffffffffffffff00000000000000006002549260401b16911617600255565b5f90565b91611051611059945167ffffffffffffffff1690565b9051926120e5565b6110a75761055e611072835167ffffffffffffffff1690565b7fc1aea5f7000000000000000000000000000000000000000000000000000000005f5267ffffffffffffffff16600452602490565b60029150565b61055e906110c3855467ffffffffffffffff1690565b7feae35725000000000000000000000000000000000000000000000000000000005f5267ffffffffffffffff9081166004524260245216604452606490565b9050611123429161111e6104fe885467ffffffffffffffff1690565b610cd4565b11155f610e87565b7f9b772277000000000000000000000000000000000000000000000000000000005f524260045267ffffffffffffffff9081166024521660445260645ffd5b7f59d119e3000000000000000000000000000000000000000000000000000000005f5260045ffd5b35610b9e81610922565b9035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe181360301821215610195570180359067ffffffffffffffff821161019557602001918160051b3603831361019557565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b9035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe181360301821215610195570180359067ffffffffffffffff82116101955760200191813603831361019557565b9015611282578061127e9161121d565b9091565b6111f0565b335f9081527f4c48d1d2b0f4f7485fc28e3db22341d96a20aa29e6efa8149da9751603abd4e0602052604090205460ff16156112bf57565b7fe2517d3f000000000000000000000000000000000000000000000000000000005f52336004527fbd893629a699470e4ec82a5715bb4981fdaacc5d0a728bf5f55b801d8f4ef10b60245260445ffd5b805f525f60205260ff6113433360405f209073ffffffffffffffffffffffffffffffffffffffff165f5260205260405f2090565b54161561134d5750565b7fe2517d3f000000000000000000000000000000000000000000000000000000005f523360045260245260445ffd5b67ffffffffffffffff168061138e5750565b7f3ce598a9000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b60405190610100820182811067ffffffffffffffff821117610adc57604052606060e0838281528260208201528260408201525f838201525f60808201525f60a08201528260c08201520152565b8051600110156112825760400190565b805160071015611282576101000190565b8051600d1015611282576101c00190565b8051600e1015611282576101e00190565b805160081015611282576101200190565b8051600310156112825760800190565b8051600b1015611282576101800190565b8051600c1015611282576101a00190565b8051600410156112825760a00190565b8051156112825760200190565b8051600210156112825760600190565b805160101015611282576102200190565b80518210156112825760209160051b010190565b67ffffffffffffffff8111610adc5760051b60200190565b90611501826114df565b61150e6040519182610afd565b828152601f1961151e82946114df565b0190602036910137565b90602082519201517fffffffffffffffffffffffffffffffffffffffff00000000000000000000000081169260148110611560575050565b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000929350829060140360031b1b161690565b60405160a091906115a38382610afd565b6004815291601f1901825f5b8281106115bb57505050565b8060606020809385010152016115af565b906115d6826114df565b6115e36040519182610afd565b828152601f196115f382946114df565b01905f5b82811061160357505050565b8060606020809385010152016115f7565b61163061162b6116226113b9565b92808452612532565b6125a1565b602082019080825251600f8110611b0557507f1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d493476116766116708351611407565b5161266c565b03611aca57600161169061168a8351611417565b5161255f565b03611a8f577f63746963616c2062797a616e74696e65206661756c7420746f6c6572616e63656116c36116708351611428565b03611a54576116db6116d58251611439565b51612688565b80516008811490811591611a24575b506119ea575061162b61175d6116d5836117216117106104fe61168a611762985161144a565b67ffffffffffffffff166060880152565b61172e611670825161145b565b60808701526117576117466104fe61168a845161146b565b67ffffffffffffffff1660a0880152565b5161147c565b612532565b90604081019180835251600581036119bf57506117886117828351611407565b516125a1565b908151156119975761179a82516114f7565b9360c082019485525f5b8351811015611933576117ba6116d582866114cb565b80516014810361190857506117d16117d791611528565b60601c90565b73ffffffffffffffffffffffffffffffffffffffff811680156118c6575f5b8381106118325750509061182c600192611811838a516114cb565b9073ffffffffffffffffffffffffffffffffffffffff169052565b016117a4565b8161187761185e611844848d516114cb565b5173ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff1690565b14611884576001016117f6565b7f41fe18cc000000000000000000000000000000000000000000000000000000005f5273ffffffffffffffffffffffffffffffffffffffff831660045260245ffd5b7f59bff387000000000000000000000000000000000000000000000000000000005f5273ffffffffffffffffffffffffffffffffffffffff821660045260245ffd5b7f83e46ad2000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b509261178291945061194692505161148d565b61195081516115cc565b9260e081019384525f5b8251811015611991578061198a816119776116d5600195886114cb565b88519061198483836114cb565b526114cb565b500161195a565b50925050565b7f339e1ffb000000000000000000000000000000000000000000000000000000005f5260045ffd5b7f30c6792a000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b611a20906040519182917fd5edd2a500000000000000000000000000000000000000000000000000000000835260048301610934565b0390fd5b7f011b4d03dd8c01f1049143cf9c4c817e4b167f1d1b83e5c6f0f10d89ba1e7bce9150602083012014155f6116ea565b611a6461167061055e9251611428565b7fa19e609c000000000000000000000000000000000000000000000000000000005f52600452602490565b611a9f61168a61055e9251611417565b7ff71b722f000000000000000000000000000000000000000000000000000000005f52600452602490565b611ada61167061055e9251611407565b7fb8120dca000000000000000000000000000000000000000000000000000000005f52600452602490565b7fbc277732000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b67ffffffffffffffff1690815f52600460205260405f209167ffffffffffffffff83541615611b5c5750565b7ff761631b000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b6020611c26611b94611592565b611c0d611bab60408601611bb1611bab825161149d565b51612f88565b611bba8561149d565b52611bc48461149d565b50611bd2611bab8251611407565b611bdb85611407565b52611be584611407565b50611bf3611bab82516114aa565b611bfc856114aa565b52611c06846114aa565b505161145b565b611c168261145b565b52611c208161145b565b5061275e565b910190611c348251516115cc565b905f5b83518051821015611c8a579080600192600c82145f14611c78575050611c5c8361280f565b611c6682866114cb565b52611c7181856114cb565b5001611c37565b611c8591611bab916114cb565b611c5c565b505050611c97915061275e565b6020815191012090565b919091611cae83516114f7565b925f5b8151811015611e9457611cc481836114cb565b51805160418103611e69575080601b60ff611d13611d0d611ce7611d20966127ee565b517fff000000000000000000000000000000000000000000000000000000000000001690565b60f81c90565b1610611e16575b84613036565b50611d2a81612889565b15801590611df8575b611dd05773ffffffffffffffffffffffffffffffffffffffff81165f5b838110611d7057505090611d6a60019261181183896114cb565b01611cb1565b81611d8161185e611844848c6114cb565b14611d8e57600101611d50565b7f33af0d5f000000000000000000000000000000000000000000000000000000005f5273ffffffffffffffffffffffffffffffffffffffff831660045260245ffd5b7f09cb44e6000000000000000000000000000000000000000000000000000000005f5260045ffd5b5073ffffffffffffffffffffffffffffffffffffffff811615611d33565b611e58611e30611e2b611d0d611ce7856127ee565b612877565b60f81b7fff000000000000000000000000000000000000000000000000000000000000001690565b5f1a611e63826127ee565b53611d1a565b7ff2db9ce1000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b505050565b5f198114610c975760010190565b905f915f5b8151811015611f0057611edf73ffffffffffffffffffffffffffffffffffffffff611ed783856114cb565b511684612893565b611eec575b600101611eac565b92611ef8600191611e99565b939050611ee4565b50506003611f0f915404610c89565b90818110611f1b575050565b7fe2dcb1b9000000000000000000000000000000000000000000000000000000005f5260045260245260445ffd5b905f198201918211610c9757565b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff408201918211610c9757565b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff808201918211610c9757565b6020039060208211610c9757565b91908203918211610c9757565b905f915f5b81518110156120255761200473ffffffffffffffffffffffffffffffffffffffff611ffc83856114cb565b5116846128ea565b612011575b600101611fd1565b9261201d600191611e99565b939050612009565b50505190600382048203918211610c9757818110612041575050565b7f7818f4e4000000000000000000000000000000000000000000000000000000005f5260045260245260445ffd5b6120b99261162b9261175d926040517fffffffffffffffffffffffffffffffffffffffff000000000000000000000000602082019260601b168252601481526104d7603482610afd565b805160021015611282576060610b9e91015161266c565b8054821015611282575f5260205f2001905f90565b919067ffffffffffffffff80612103855467ffffffffffffffff1690565b9216911614908115916121a4575b5061219e5760020190815481510361219e575f5b81518110156121965761215b61213b82856120d0565b905473ffffffffffffffffffffffffffffffffffffffff9160031b1c1690565b73ffffffffffffffffffffffffffffffffffffffff61218061185e61184485876114cb565b91160361218f57600101612125565b5050505f90565b505050600190565b50505f90565b9050600182015414155f612111565b805f525f60205260ff6121e78360405f209073ffffffffffffffffffffffffffffffffffffffff165f5260205260405f2090565b541661219e57805f525f60205261221f8260405f209073ffffffffffffffffffffffffffffffffffffffff165f5260205260405f2090565b60017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0082541617905573ffffffffffffffffffffffffffffffffffffffff339216907f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d5f80a4600190565b805f525f60205260ff6122be8360405f209073ffffffffffffffffffffffffffffffffffffffff165f5260205260405f2090565b54161561219e57805f525f6020526122f78260405f209073ffffffffffffffffffffffffffffffffffffffff165f5260205260405f2090565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00815416905573ffffffffffffffffffffffffffffffffffffffff339216907ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b5f80a4600190565b60208151910120604051602081019182527f1260944489272988d9df285149b5aa1b0f48f2136d6f416159f840a3e07476006040820152604081526123a5606082610afd565b51902090565b604051906123ba602083610afd565b5f808352366020840137565b906123d082610b31565b6123dd6040519182610afd565b828152601f1961151e8294610b31565b61162b61242f919493946124016020610b31565b9561240f6040519788610afd565b6020875261241d6020610b31565b601f1960208901910136823752612532565b9061243a8451610ce1565b918451151580612512575b61244e90612558565b61246061245b5f85611fbf565b6123c6565b925f19015f5b81811061247a575050610b9e939450612a5e565b806124fc600f6124bf6124f6611d0d611ce78d61249960029960011c90565b908d6124f08a6124e88a6124bf6124b6611d0d611ce78a8a6127fe565b60041c600f1690565b1660f81b7fff000000000000000000000000000000000000000000000000000000000000001690565b5f1a926127fe565b536127fe565b60ff1690565b5f1a61250b60018301886127fe565b5301612466565b506001612445565b6040519061252782610ae1565b5f6020838281520152565b61253a61251a565b5060208151916040519261254d84610ae1565b835201602082015290565b1561019557565b80518015159081612595575b50156101955761257a90612d34565b90519060208110612589575090565b6020036101000a900490565b6021915011155f61256b565b6125aa81612d60565b15610195576125b881612d80565b6125c1816114df565b916125cf6040519384610afd565b818352601f196125de836114df565b015f5b81811061265557505060206126019101516125fb81612de1565b90610cd4565b5f905b8282106126115750505090565b61264d81612620600193612e4c565b90612629610b20565b82815281602082015261263c86896114cb565b5261264785886114cb565b50610cd4565b910190612604565b60209061266061251a565b828288010152016125e1565b6021815103610195576020015160018101809111610c97575190565b8051156101955761269b610b9e91612d34565b6126a7819392936123c6565b928360200190612f15565b805191908290602001825e015f815290565b610b2f906126e66126e0949360405195869360208501906126b2565b906126b2565b03601f198101845283610afd565b6001907fff00000000000000000000000000000000000000000000000000000000000000610b9e949316815201906126b2565b916001610b9e94937fff000000000000000000000000000000000000000000000000000000000000006126e09416815201906126b2565b5f9060605b815183101561278b5761278360019161277c85856114cb565b51906126c4565b920191612763565b9150508051603881106127ca5750610b9e6127a68251612fb4565b916104c96127ba611e306124f68651610caa565b9160405194859360208501612727565b6127dc611e306124f6610b9e93610c9c565b6104c9604051938492602084016126f4565b8051604010156112825760600190565b908151811015611282570160200190565b60018151148061285c575b610b9e5780516038811061284a5750610b9e6128368251612fb4565b916104c96127ba611e306124f68651610cc6565b6127dc611e306124f6610b9e93610cb8565b50608060ff612870611d0d611ce78561149d565b161061281a565b60ff601b9116019060ff8211610c9757565b6004111561029457565b905f5b825481101561218f5773ffffffffffffffffffffffffffffffffffffffff6128be82856120d0565b90549060031b1c1673ffffffffffffffffffffffffffffffffffffffff83161461219657600101612896565b905f5b825181101561218f5773ffffffffffffffffffffffffffffffffffffffff61291582856114cb565b511673ffffffffffffffffffffffffffffffffffffffff831614612196576001016128ed565b91906129478351610ce1565b908351151580612a54575b61295b90612558565b61296861245b8284611fbf565b9381926001808416146129f2575b5f19869101935b84811061298b575050505050565b836129e960016129df600f6124bf6124f6611d0d611ce78b60029b6129d86129cb886124bf8f611d0d611ce76129c46124b69360011c90565b80996127fe565b9b8d03809c5f1a926127fe565b538c6127fe565b5f1a9201896127fe565b5301859061297d565b92507f0f00000000000000000000000000000000000000000000000000000000000000612a316124f6611d0d611ce7612a2b8760011c90565b866127fe565b60f81b165f1a612a408661149d565b535f19612a4c83611e99565b939050612976565b5081811115612952565b915f915f612a6a61251a565b50845115612cfb5790935f915b81518310156101955782158080612ce5575b61019557159081612cc8575b5061019557612aa761178283836114cb565b948551600281145f14612ba45750612ac9612ac46116d58861149d565b6130cb565b95612adf612ad8888884613138565b8092610cd4565b965111612b865715612b165750612af69051611f49565b11610195575111612b0d576116d5610b9e91611407565b50610b9e6123ab565b919094612b238651611f49565b82146101955780612b45612b41612b3b600194611407565b51612d60565b1590565b15612b6757612b56612b5c91611407565b516130bd565b915b01919490612a77565b612b73612b8091611407565b5160208101519051902090565b91612b5e565b505091509250612b97915051611f49565b1161019557610b9e6123ab565b929491939192601103612c695781518314612c4b57612bd5612bcf6124f6611d0d611ce787876127fe565b93610c89565b92601081101561019557612bf2612bec82896114cb565b516130a7565b15612c145750505050612c0791925051611f49565b0361019557610b9e6123ab565b86612c2c612b41612b3b84600196989a97999b6114cb565b15612c3e57612b8091612b56916114cb565b612b8091612b73916114cb565b505050612c589051611f49565b03610195576116d5610b9e916114ba565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f696e76616c6964206e6f6465206c656e677468000000000000000000000000006044820152606490fd5b9050612cdd612cd784846114cb565b51613070565b14155f612a95565b50612cf3612b7385856114cb565b871415612a89565b509050612d2c92507f56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421915014612558565b610b9e6123ab565b906020820191612d448351612de1565b925190838201809211610c975751928303928311610c97579190565b805115612d7b57602060c0910151515f1a1061103757600190565b505f90565b805115612d7b575f9060208101908151612d9981612de1565b8101809111610c9757915190518101809111610c975791905b828110612dbf5750905090565b612dc881612e4c565b8101809111610c9757612ddb9091611e99565b90612db2565b515f1a6080811015612df257505f90565b60b881108015612e36575b15612e085750600190565b60c0811015612e2757610b9e90612e229060b75b90611fbf565b610c89565b610b9e90612e229060f7612e1c565b5060c08110158015612dfd575060f88110612dfd565b80515f1a906080821015612e61575050600190565b60b8821015612e775750612e22610b9e91611f84565b60c0821015612eb85760010151602082900360b7016101000a9004017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff4a0190565b60f8821015612ece5750612e22610b9e91611f57565b60010151602082900360f7016101000a9004017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0a0190565b601f8111610c97576101000a90565b90918015611e94575b6020811015612f585780612f3157505050565b612f45612f40612f4a92611fb1565b612f06565b611f49565b905182518216911916179052565b91908051825260208101809111610c97579060208101809111610c975791601f19810190811115612f1e57610c5c565b612f9281516123c6565b90815115612fb057806020610b9e9201519051908360200190612f15565b5090565b5f81805b6130225750612fc6816123c6565b91815b612fd257505090565b612fdb82611f49565b61300d7fff000000000000000000000000000000000000000000000000000000000000008360f81b165f1a91856127fe565b5360081c908015610c97575f19019081612fc9565b9061302c90611e99565b9060081c80612fb8565b81519190604183036130665761305f9250602082015190606060408401519301515f1a906131dc565b9192909190565b50505f9160029190565b80516020811015613088575060208101519051902090565b90602001512060405160208101918252602081526123a5604082610afd565b6001815103612d7b5760200151515f1a60801490565b6130c690612d34565b902090565b9081511561019557600f6130e76124b6611d0d611ce78661149d565b16806130fa5750610b9e60025f9361293b565b6001810361310f5750610b9e60015f9361293b565b600281036131255750610b9e600260019361293b565b60030361019557610b9e6001809361293b565b91905f5b838101808211610c975782518110806131d2575b156131ca576131807fff0000000000000000000000000000000000000000000000000000000000000091846127fe565b51167fff000000000000000000000000000000000000000000000000000000000000006131ad83866127fe565b511690036131c3576131be90611e99565b61313c565b9250505090565b509250505090565b5083518210613150565b91907f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0841161326b579160209360809260ff5f9560405194855216868401526040830152606082015282805260015afa15613260575f5173ffffffffffffffffffffffffffffffffffffffff81161561325657905f905f90565b505f906001905f90565b6040513d5f823e3d90fd5b5050505f916003919056fea164736f6c634300081c000a2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d4c48d1d2b0f4f7485fc28e3db22341d96a20aa29e6efa8149da9751603abd4e06e0c24a6e293ff9b755263dbaa15ba3796b0b8d3fe17cfb4ddf8143b268eac47bd893629a699470e4ec82a5715bb4981fdaacc5d0a728bf5f55b801d8f4ef10bad3228b676f7d3cd4284a5443f17f1962b36e491b30a40b2405849e597ba5fb5","sourceMap":"235:2275:34:-:0;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;235:2275:34;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;235:2275:34;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;:::i;:::-;;-1:-1:-1;;;;;235:2275:34;;3945:25:35;;3941:84;;235:2275:34;;17599:22:35;17595:79;;-1:-1:-1;17726:3:35;235:2275:34;;17703:21:35;;;;;-1:-1:-1;;;;;17749:13:35;;;;:::i;:::-;235:2275:34;;17749:27:35;17745:111;;-1:-1:-1;17889:5:35;;;;;;17726:3;235:2275:34;;17688:13:35;;17896:3;-1:-1:-1;;;;;17923:13:35;;;;:::i;:::-;235:2275:34;;-1:-1:-1;;;;;17940:13:35;235:2275:34;;17940:13:35;:::i;:::-;235:2275:34;;17923:30:35;17919:117;;235:2275:34;;17874:13:35;;17919:117;-1:-1:-1;;;;;18003:13:35;235:2275:34;;18003:13:35;:::i;:::-;235:2275:34;;17984:33:35;;;-1:-1:-1;17984:33:35;;235:2275:34;;-1:-1:-1;17984:33:35;17745:111;-1:-1:-1;;;;;235:2275:34;17827:13:35;;235:2275:34;17827:13:35;:::i;:::-;235:2275:34;;17803:38:35;;;-1:-1:-1;17803:38:35;;235:2275:34;;-1:-1:-1;17803:38:35;17703:21;-1:-1:-1;235:2275:34;;;17703:21:35;;;;;;;235:2275:34;;-1:-1:-1;;;;;235:2275:34;;;;;;;;;;-1:-1:-1;235:2275:34;;;4179:84:35;;235:2275:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;235:2275:34;;;;;4105:255:35;;;235:2275:34;;;-1:-1:-1;;;;;235:2275:34;;;4105:255:35;;;235:2275:34;;;;;;;4105:255:35;;;235:2275:34;;;;;;;-1:-1:-1;;;;;;235:2275:34;;;;;;;;;;;;;-1:-1:-1;;;;;;235:2275:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;235:2275:34;;;4411:15:35;235:2275:34;;;;;;;;-1:-1:-1;;;;;;235:2275:34;;;;;;;;;;4518:26:35;;235:2275:34;;;;;;;4582:25:35;;;235:2275:34;;;;;;;;;;;;;;;;;;;;17683:377:35;235:2275:34;;-1:-1:-1;235:2275:34;;-1:-1:-1;235:2275:34;-1:-1:-1;235:2275:34;;;;;;;-1:-1:-1;;;;;235:2275:34;;;;4690:44:35;;;:::i;:::-;;4645:233;235:2275:34;;;;;;;;;4645:233:35;4765:43;;4822:45;4765:43;;:::i;:::-;;4822:45;:::i;:::-;;4645:233;;235:2275:34;;;-1:-1:-1;;;;;235:2275:34;;;;;;;;;;;;;;;;-1:-1:-1;235:2275:34;;;-1:-1:-1;235:2275:34;;;;;;;;;;;;;;;;-1:-1:-1;235:2275:34;;;;;;;;;;-1:-1:-1;235:2275:34;;4411:15:35;235:2275:34;;-1:-1:-1;235:2275:34;17595:79:35;17644:19;;;-1:-1:-1;17644:19:35;;-1:-1:-1;17644:19:35;3941:84;3993:21;;;-1:-1:-1;3993:21:35;;-1:-1:-1;3993:21:35;235:2275:34;;;;;;;:::i;:::-;;;;;;;;;;-1:-1:-1;235:2275:34;;;;;;;;;-1:-1:-1;;235:2275:34;;;-1:-1:-1;;;;;235:2275:34;;;;;;;;;;:::o;:::-;;;-1:-1:-1;;;;;235:2275:34;;;;;;:::o;:::-;;;-1:-1:-1;;;;;235:2275:34;;;;;;:::o;:::-;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;6145:316:93;-1:-1:-1;;;;;235:2275:34;;3969:1:35;235:2275:34;;;-1:-1:-1;;;;;;;;;;;235:2275:34;;;;;;;;;;-1:-1:-1;;;;;235:2275:34;3969:1:35;235:2275:34;;;-1:-1:-1;;;;;;;;;;;235:2275:34;;;;;;;-1:-1:-1;;235:2275:34;;;;;735:10:121;;235:2275:34;-1:-1:-1;;;;;;;;;;;3969:1:35;;6336:40:93;6313:4;6390:11;:::o;6238:217::-;6432:12;3969:1:35;6432:12:93;:::o;6145:316::-;-1:-1:-1;;;;;235:2275:34;;;;;;-1:-1:-1;;;;;;;;;;;235:2275:34;;;;;;;;;;-1:-1:-1;;;;;235:2275:34;;;;;-1:-1:-1;;;;;;;;;;;235:2275:34;;;;;;;-1:-1:-1;;235:2275:34;;;;;735:10:121;;235:2275:34;-1:-1:-1;;;;;;;;;;;2082:33:35;-1:-1:-1;;;;;;;;;;;6336:40:93;235:2275:34;6336:40:93;6313:4;6390:11;:::o;6145:316::-;235:2275:34;;;-1:-1:-1;;;;;;;;;;;235:2275:34;;-1:-1:-1;;;;;;;;;;;235:2275:34;;;;;;;;;-1:-1:-1;;;;;;;;;;;235:2275:34;;-1:-1:-1;;;;;;;;;;;235:2275:34;;-1:-1:-1;;235:2275:34;6313:4:93;235:2275:34;;;735:10:121;;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;235:2275:34;;6336:40:93;6313:4;6390:11;:::o;6238:217::-;235:2275:34;6432:12:93;:::o","linkReferences":{}},"deployedBytecode":{"object":"0x60806040526004361015610011575f80fd5b5f3560e01c806301ffc9a7146100f45780630bece356146100ef578063248a9ca3146100ea5780632f2ff15d146100e557806336568abe146100e05780634d6d9ffb146100db5780635972185a146100d6578063682ed5f0146100d157806391d14854146100cc578063a217fddf146100c7578063d547741f146100c2578063ddba6537146100bd578063edce8bdc146100b85763ef913a4b146100b3575f80fd5b610a16565b61095e565b61088b565b61085c565b610842565b6107f4565b6105e6565b6105ac565b6103ac565b610350565b61031a565b6102b5565b610217565b34610195576020600319360112610195576004357fffffffff00000000000000000000000000000000000000000000000000000000811680910361019557807f7965db0b000000000000000000000000000000000000000000000000000000006020921490811561016b575b506040519015158152f35b7f01ffc9a7000000000000000000000000000000000000000000000000000000009150145f610160565b5f80fd5b9060206003198301126101955760043567ffffffffffffffff811161019557826023820112156101955780600401359267ffffffffffffffff84116101955760248483010111610195576024019190565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b346101955761028161022836610199565b5f80527f4c48d1d2b0f4f7485fc28e3db22341d96a20aa29e6efa8149da9751603abd4e06020527f6e0c24a6e293ff9b755263dbaa15ba3796b0b8d3fe17cfb4ddf8143b268eac475490919060ff161561029957610d9d565b6040516003821015610294576020918152f35b6101ea565b6102a1611287565b610d9d565b90816020910312610195573590565b346101955760206003193601126101955760206102df6004355f525f602052600160405f20015490565b604051908152f35b6003196040910112610195576004359060243573ffffffffffffffffffffffffffffffffffffffff811681036101955790565b346101955761034e61032b366102e7565b90610349610344825f525f602052600160405f20015490565b61130f565b6121b3565b005b346101955761035e366102e7565b3373ffffffffffffffffffffffffffffffffffffffff8216036103845761034e9161228a565b7f6697b232000000000000000000000000000000000000000000000000000000005f5260045ffd5b346101955760206003193601126101955760043567ffffffffffffffff8111610195578060040160806003198336030112610195575f80527f4c48d1d2b0f4f7485fc28e3db22341d96a20aa29e6efa8149da9751603abd4e060205260ff7f6e0c24a6e293ff9b755263dbaa15ba3796b0b8d3fe17cfb4ddf8143b268eac4754161561059f575b61044761044260248401611192565b61137c565b60648201916001610458848461119c565b90500361056157906104a96104966104a261049d61049661049061048961048460446104e09a01611192565b611b30565b988761119c565b9061126e565b3691610b4d565b61235f565b928061121d565b906001840154906040516104d7816104c960208201948560209181520190565b03601f198101835282610afd565b519020916123ed565b805161051f5761051b61050b6104fe845467ffffffffffffffff1690565b67ffffffffffffffff1690565b6040519081529081906020820190565b0390f35b61053361052e61055e92612532565b61255f565b7fd039601e000000000000000000000000000000000000000000000000000000005f52600452602490565b5ffd5b61055e61056e848461119c565b7f88b3170e000000000000000000000000000000000000000000000000000000005f52600160045260245250604490565b6105a7611287565b610433565b34610195575f6003193601126101955760206040517fbd893629a699470e4ec82a5715bb4981fdaacc5d0a728bf5f55b801d8f4ef10b8152f35b346101955760206003193601126101955760043567ffffffffffffffff8111610195578060040160a06003198336030112610195575f80527f4c48d1d2b0f4f7485fc28e3db22341d96a20aa29e6efa8149da9751603abd4e060205260ff7f6e0c24a6e293ff9b755263dbaa15ba3796b0b8d3fe17cfb4ddf8143b268eac475416156107e7575b61067c61044260248401611192565b6064820191600161068d848461119c565b90500361056157608481019060206106a5838561121d565b9050036107a957906106f46104966106ed6106e56106de61049d6104966104906106d761048460446107149c01611192565b9b8b61119c565b948761121d565b8101906102a6565b948061121d565b906001850154906040516104d7816104c960208201948560209181520190565b8051156107755761052e61072791612532565b908082036107475761051b61050b6104fe855467ffffffffffffffff1690565b7f56ed1b63000000000000000000000000000000000000000000000000000000005f5260045260245260445ffd5b61055e827f56ed1b63000000000000000000000000000000000000000000000000000000005f52906044916004525f602452565b61055e6107b6838561121d565b7f24fadac8000000000000000000000000000000000000000000000000000000005f52602060045260245250604490565b6107ef611287565b61066d565b3461019557602060ff610836610809366102e7565b905f525f845260405f209073ffffffffffffffffffffffffffffffffffffffff165f5260205260405f2090565b54166040519015158152f35b34610195575f6003193601126101955760206040515f8152f35b346101955761034e61086d366102e7565b90610886610344825f525f602052600160405f20015490565b61228a565b346101955761089936610199565b50505f80527f4c48d1d2b0f4f7485fc28e3db22341d96a20aa29e6efa8149da9751603abd4e06020527f6e0c24a6e293ff9b755263dbaa15ba3796b0b8d3fe17cfb4ddf8143b268eac475460ff1615610915575b7f2c1ed462000000000000000000000000000000000000000000000000000000005f5260045ffd5b61091d611287565b6108ed565b67ffffffffffffffff81160361019557565b601f19601f602060409481855280519182918282880152018686015e5f8582860101520116010190565b346101955760206003193601126101955761097e60043561048481610922565b67ffffffffffffffff8154166002600183015492019060405192608084019160208501526040840152606080840152815480915260a08301915f5260205f20905f5b8181106109ea5761051b856109de818703601f198101835282610afd565b60405191829182610934565b825473ffffffffffffffffffffffffffffffffffffffff168452602090930192600192830192016109c0565b34610195575f6003193601126101955761051b60405173ffffffffffffffffffffffffffffffffffffffff60015416602082015267ffffffffffffffff600254818116604084015260401c16606082015267ffffffffffffffff600354818116608084015260401c1660a082015260a081526109de60c082610afd565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b6060810190811067ffffffffffffffff821117610adc57604052565b610a93565b6040810190811067ffffffffffffffff821117610adc57604052565b90601f601f19910116810190811067ffffffffffffffff821117610adc57604052565b60405190610b2f604083610afd565b565b67ffffffffffffffff8111610adc57601f01601f191660200190565b929192610b5982610b31565b91610b676040519384610afd565b829481845281830111610195578281602093845f960137010152565b9080601f8301121561019557816020610b9e93359101610b4d565b90565b6020818303126101955780359067ffffffffffffffff8211610195570180820391608083126101955760405192610bd784610ac0565b823567ffffffffffffffff811161019557604091610bfa84601f19938701610b83565b8652011261019557604051610c0e81610ae1565b6020830135610c1c81610922565b81526040830135610c2c81610922565b60208201526020840152606082013567ffffffffffffffff811161019557610c549201610b83565b604082015290565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b9060018201809211610c9757565b610c5c565b60c001908160c011610c9757565b60f701908160f711610c9757565b6080019081608011610c9757565b60b701908160b711610c9757565b91908201809211610c9757565b908160011b9180830460021490151715610c9757565b81519167ffffffffffffffff8311610adc57680100000000000000008311610adc578154838355808410610d77575b506020610d389101915f5260205f2090565b5f5b838110610d475750505050565b6001906020610d6a855173ffffffffffffffffffffffffffffffffffffffff1690565b9401938184015501610d3a565b825f528360205f2091820191015b818110610d925750610d26565b5f8155600101610d85565b610da991810190610ba1565b9060208201610dc461044282515167ffffffffffffffff1690565b610dce8351611614565b92606084019367ffffffffffffffff610def865167ffffffffffffffff1690565b161561116a5760035491604083901c67ffffffffffffffff1693610e1d67ffffffffffffffff861642610cd4565b9460a0840195610e35875167ffffffffffffffff1690565b9067ffffffffffffffff82161161112b5750505160200151610e7290610e649067ffffffffffffffff16611b30565b9367ffffffffffffffff1690565b67ffffffffffffffff81168015159081611102575b506110ad575090610ef591610eb66002610eae610ea385611b87565b60e086015190611ca1565b950185611ea7565b610ec660c0830194855190611fcc565b60406080610ee960015473ffffffffffffffffffffffffffffffffffffffff1690565b9301519101519161206f565b610f22610f0a865167ffffffffffffffff1690565b67ffffffffffffffff165f52600460205260405f2090565b610f376104fe825467ffffffffffffffff1690565b61103b5750916002610fb5928694610fa8610f73610f64610f0a610fc39a9b5167ffffffffffffffff1690565b955167ffffffffffffffff1690565b859067ffffffffffffffff167fffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000825416179055565b6001840155519101610cf7565b5167ffffffffffffffff1690565b600254610fdc9060401c67ffffffffffffffff166104fe565b67ffffffffffffffff821611610ff157505f90565b611037907fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff6fffffffffffffffff00000000000000006002549260401b16911617600255565b5f90565b91611051611059945167ffffffffffffffff1690565b9051926120e5565b6110a75761055e611072835167ffffffffffffffff1690565b7fc1aea5f7000000000000000000000000000000000000000000000000000000005f5267ffffffffffffffff16600452602490565b60029150565b61055e906110c3855467ffffffffffffffff1690565b7feae35725000000000000000000000000000000000000000000000000000000005f5267ffffffffffffffff9081166004524260245216604452606490565b9050611123429161111e6104fe885467ffffffffffffffff1690565b610cd4565b11155f610e87565b7f9b772277000000000000000000000000000000000000000000000000000000005f524260045267ffffffffffffffff9081166024521660445260645ffd5b7f59d119e3000000000000000000000000000000000000000000000000000000005f5260045ffd5b35610b9e81610922565b9035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe181360301821215610195570180359067ffffffffffffffff821161019557602001918160051b3603831361019557565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b9035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe181360301821215610195570180359067ffffffffffffffff82116101955760200191813603831361019557565b9015611282578061127e9161121d565b9091565b6111f0565b335f9081527f4c48d1d2b0f4f7485fc28e3db22341d96a20aa29e6efa8149da9751603abd4e0602052604090205460ff16156112bf57565b7fe2517d3f000000000000000000000000000000000000000000000000000000005f52336004527fbd893629a699470e4ec82a5715bb4981fdaacc5d0a728bf5f55b801d8f4ef10b60245260445ffd5b805f525f60205260ff6113433360405f209073ffffffffffffffffffffffffffffffffffffffff165f5260205260405f2090565b54161561134d5750565b7fe2517d3f000000000000000000000000000000000000000000000000000000005f523360045260245260445ffd5b67ffffffffffffffff168061138e5750565b7f3ce598a9000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b60405190610100820182811067ffffffffffffffff821117610adc57604052606060e0838281528260208201528260408201525f838201525f60808201525f60a08201528260c08201520152565b8051600110156112825760400190565b805160071015611282576101000190565b8051600d1015611282576101c00190565b8051600e1015611282576101e00190565b805160081015611282576101200190565b8051600310156112825760800190565b8051600b1015611282576101800190565b8051600c1015611282576101a00190565b8051600410156112825760a00190565b8051156112825760200190565b8051600210156112825760600190565b805160101015611282576102200190565b80518210156112825760209160051b010190565b67ffffffffffffffff8111610adc5760051b60200190565b90611501826114df565b61150e6040519182610afd565b828152601f1961151e82946114df565b0190602036910137565b90602082519201517fffffffffffffffffffffffffffffffffffffffff00000000000000000000000081169260148110611560575050565b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000929350829060140360031b1b161690565b60405160a091906115a38382610afd565b6004815291601f1901825f5b8281106115bb57505050565b8060606020809385010152016115af565b906115d6826114df565b6115e36040519182610afd565b828152601f196115f382946114df565b01905f5b82811061160357505050565b8060606020809385010152016115f7565b61163061162b6116226113b9565b92808452612532565b6125a1565b602082019080825251600f8110611b0557507f1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d493476116766116708351611407565b5161266c565b03611aca57600161169061168a8351611417565b5161255f565b03611a8f577f63746963616c2062797a616e74696e65206661756c7420746f6c6572616e63656116c36116708351611428565b03611a54576116db6116d58251611439565b51612688565b80516008811490811591611a24575b506119ea575061162b61175d6116d5836117216117106104fe61168a611762985161144a565b67ffffffffffffffff166060880152565b61172e611670825161145b565b60808701526117576117466104fe61168a845161146b565b67ffffffffffffffff1660a0880152565b5161147c565b612532565b90604081019180835251600581036119bf57506117886117828351611407565b516125a1565b908151156119975761179a82516114f7565b9360c082019485525f5b8351811015611933576117ba6116d582866114cb565b80516014810361190857506117d16117d791611528565b60601c90565b73ffffffffffffffffffffffffffffffffffffffff811680156118c6575f5b8381106118325750509061182c600192611811838a516114cb565b9073ffffffffffffffffffffffffffffffffffffffff169052565b016117a4565b8161187761185e611844848d516114cb565b5173ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff1690565b14611884576001016117f6565b7f41fe18cc000000000000000000000000000000000000000000000000000000005f5273ffffffffffffffffffffffffffffffffffffffff831660045260245ffd5b7f59bff387000000000000000000000000000000000000000000000000000000005f5273ffffffffffffffffffffffffffffffffffffffff821660045260245ffd5b7f83e46ad2000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b509261178291945061194692505161148d565b61195081516115cc565b9260e081019384525f5b8251811015611991578061198a816119776116d5600195886114cb565b88519061198483836114cb565b526114cb565b500161195a565b50925050565b7f339e1ffb000000000000000000000000000000000000000000000000000000005f5260045ffd5b7f30c6792a000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b611a20906040519182917fd5edd2a500000000000000000000000000000000000000000000000000000000835260048301610934565b0390fd5b7f011b4d03dd8c01f1049143cf9c4c817e4b167f1d1b83e5c6f0f10d89ba1e7bce9150602083012014155f6116ea565b611a6461167061055e9251611428565b7fa19e609c000000000000000000000000000000000000000000000000000000005f52600452602490565b611a9f61168a61055e9251611417565b7ff71b722f000000000000000000000000000000000000000000000000000000005f52600452602490565b611ada61167061055e9251611407565b7fb8120dca000000000000000000000000000000000000000000000000000000005f52600452602490565b7fbc277732000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b67ffffffffffffffff1690815f52600460205260405f209167ffffffffffffffff83541615611b5c5750565b7ff761631b000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b6020611c26611b94611592565b611c0d611bab60408601611bb1611bab825161149d565b51612f88565b611bba8561149d565b52611bc48461149d565b50611bd2611bab8251611407565b611bdb85611407565b52611be584611407565b50611bf3611bab82516114aa565b611bfc856114aa565b52611c06846114aa565b505161145b565b611c168261145b565b52611c208161145b565b5061275e565b910190611c348251516115cc565b905f5b83518051821015611c8a579080600192600c82145f14611c78575050611c5c8361280f565b611c6682866114cb565b52611c7181856114cb565b5001611c37565b611c8591611bab916114cb565b611c5c565b505050611c97915061275e565b6020815191012090565b919091611cae83516114f7565b925f5b8151811015611e9457611cc481836114cb565b51805160418103611e69575080601b60ff611d13611d0d611ce7611d20966127ee565b517fff000000000000000000000000000000000000000000000000000000000000001690565b60f81c90565b1610611e16575b84613036565b50611d2a81612889565b15801590611df8575b611dd05773ffffffffffffffffffffffffffffffffffffffff81165f5b838110611d7057505090611d6a60019261181183896114cb565b01611cb1565b81611d8161185e611844848c6114cb565b14611d8e57600101611d50565b7f33af0d5f000000000000000000000000000000000000000000000000000000005f5273ffffffffffffffffffffffffffffffffffffffff831660045260245ffd5b7f09cb44e6000000000000000000000000000000000000000000000000000000005f5260045ffd5b5073ffffffffffffffffffffffffffffffffffffffff811615611d33565b611e58611e30611e2b611d0d611ce7856127ee565b612877565b60f81b7fff000000000000000000000000000000000000000000000000000000000000001690565b5f1a611e63826127ee565b53611d1a565b7ff2db9ce1000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b505050565b5f198114610c975760010190565b905f915f5b8151811015611f0057611edf73ffffffffffffffffffffffffffffffffffffffff611ed783856114cb565b511684612893565b611eec575b600101611eac565b92611ef8600191611e99565b939050611ee4565b50506003611f0f915404610c89565b90818110611f1b575050565b7fe2dcb1b9000000000000000000000000000000000000000000000000000000005f5260045260245260445ffd5b905f198201918211610c9757565b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff408201918211610c9757565b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff808201918211610c9757565b6020039060208211610c9757565b91908203918211610c9757565b905f915f5b81518110156120255761200473ffffffffffffffffffffffffffffffffffffffff611ffc83856114cb565b5116846128ea565b612011575b600101611fd1565b9261201d600191611e99565b939050612009565b50505190600382048203918211610c9757818110612041575050565b7f7818f4e4000000000000000000000000000000000000000000000000000000005f5260045260245260445ffd5b6120b99261162b9261175d926040517fffffffffffffffffffffffffffffffffffffffff000000000000000000000000602082019260601b168252601481526104d7603482610afd565b805160021015611282576060610b9e91015161266c565b8054821015611282575f5260205f2001905f90565b919067ffffffffffffffff80612103855467ffffffffffffffff1690565b9216911614908115916121a4575b5061219e5760020190815481510361219e575f5b81518110156121965761215b61213b82856120d0565b905473ffffffffffffffffffffffffffffffffffffffff9160031b1c1690565b73ffffffffffffffffffffffffffffffffffffffff61218061185e61184485876114cb565b91160361218f57600101612125565b5050505f90565b505050600190565b50505f90565b9050600182015414155f612111565b805f525f60205260ff6121e78360405f209073ffffffffffffffffffffffffffffffffffffffff165f5260205260405f2090565b541661219e57805f525f60205261221f8260405f209073ffffffffffffffffffffffffffffffffffffffff165f5260205260405f2090565b60017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0082541617905573ffffffffffffffffffffffffffffffffffffffff339216907f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d5f80a4600190565b805f525f60205260ff6122be8360405f209073ffffffffffffffffffffffffffffffffffffffff165f5260205260405f2090565b54161561219e57805f525f6020526122f78260405f209073ffffffffffffffffffffffffffffffffffffffff165f5260205260405f2090565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00815416905573ffffffffffffffffffffffffffffffffffffffff339216907ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b5f80a4600190565b60208151910120604051602081019182527f1260944489272988d9df285149b5aa1b0f48f2136d6f416159f840a3e07476006040820152604081526123a5606082610afd565b51902090565b604051906123ba602083610afd565b5f808352366020840137565b906123d082610b31565b6123dd6040519182610afd565b828152601f1961151e8294610b31565b61162b61242f919493946124016020610b31565b9561240f6040519788610afd565b6020875261241d6020610b31565b601f1960208901910136823752612532565b9061243a8451610ce1565b918451151580612512575b61244e90612558565b61246061245b5f85611fbf565b6123c6565b925f19015f5b81811061247a575050610b9e939450612a5e565b806124fc600f6124bf6124f6611d0d611ce78d61249960029960011c90565b908d6124f08a6124e88a6124bf6124b6611d0d611ce78a8a6127fe565b60041c600f1690565b1660f81b7fff000000000000000000000000000000000000000000000000000000000000001690565b5f1a926127fe565b536127fe565b60ff1690565b5f1a61250b60018301886127fe565b5301612466565b506001612445565b6040519061252782610ae1565b5f6020838281520152565b61253a61251a565b5060208151916040519261254d84610ae1565b835201602082015290565b1561019557565b80518015159081612595575b50156101955761257a90612d34565b90519060208110612589575090565b6020036101000a900490565b6021915011155f61256b565b6125aa81612d60565b15610195576125b881612d80565b6125c1816114df565b916125cf6040519384610afd565b818352601f196125de836114df565b015f5b81811061265557505060206126019101516125fb81612de1565b90610cd4565b5f905b8282106126115750505090565b61264d81612620600193612e4c565b90612629610b20565b82815281602082015261263c86896114cb565b5261264785886114cb565b50610cd4565b910190612604565b60209061266061251a565b828288010152016125e1565b6021815103610195576020015160018101809111610c97575190565b8051156101955761269b610b9e91612d34565b6126a7819392936123c6565b928360200190612f15565b805191908290602001825e015f815290565b610b2f906126e66126e0949360405195869360208501906126b2565b906126b2565b03601f198101845283610afd565b6001907fff00000000000000000000000000000000000000000000000000000000000000610b9e949316815201906126b2565b916001610b9e94937fff000000000000000000000000000000000000000000000000000000000000006126e09416815201906126b2565b5f9060605b815183101561278b5761278360019161277c85856114cb565b51906126c4565b920191612763565b9150508051603881106127ca5750610b9e6127a68251612fb4565b916104c96127ba611e306124f68651610caa565b9160405194859360208501612727565b6127dc611e306124f6610b9e93610c9c565b6104c9604051938492602084016126f4565b8051604010156112825760600190565b908151811015611282570160200190565b60018151148061285c575b610b9e5780516038811061284a5750610b9e6128368251612fb4565b916104c96127ba611e306124f68651610cc6565b6127dc611e306124f6610b9e93610cb8565b50608060ff612870611d0d611ce78561149d565b161061281a565b60ff601b9116019060ff8211610c9757565b6004111561029457565b905f5b825481101561218f5773ffffffffffffffffffffffffffffffffffffffff6128be82856120d0565b90549060031b1c1673ffffffffffffffffffffffffffffffffffffffff83161461219657600101612896565b905f5b825181101561218f5773ffffffffffffffffffffffffffffffffffffffff61291582856114cb565b511673ffffffffffffffffffffffffffffffffffffffff831614612196576001016128ed565b91906129478351610ce1565b908351151580612a54575b61295b90612558565b61296861245b8284611fbf565b9381926001808416146129f2575b5f19869101935b84811061298b575050505050565b836129e960016129df600f6124bf6124f6611d0d611ce78b60029b6129d86129cb886124bf8f611d0d611ce76129c46124b69360011c90565b80996127fe565b9b8d03809c5f1a926127fe565b538c6127fe565b5f1a9201896127fe565b5301859061297d565b92507f0f00000000000000000000000000000000000000000000000000000000000000612a316124f6611d0d611ce7612a2b8760011c90565b866127fe565b60f81b165f1a612a408661149d565b535f19612a4c83611e99565b939050612976565b5081811115612952565b915f915f612a6a61251a565b50845115612cfb5790935f915b81518310156101955782158080612ce5575b61019557159081612cc8575b5061019557612aa761178283836114cb565b948551600281145f14612ba45750612ac9612ac46116d58861149d565b6130cb565b95612adf612ad8888884613138565b8092610cd4565b965111612b865715612b165750612af69051611f49565b11610195575111612b0d576116d5610b9e91611407565b50610b9e6123ab565b919094612b238651611f49565b82146101955780612b45612b41612b3b600194611407565b51612d60565b1590565b15612b6757612b56612b5c91611407565b516130bd565b915b01919490612a77565b612b73612b8091611407565b5160208101519051902090565b91612b5e565b505091509250612b97915051611f49565b1161019557610b9e6123ab565b929491939192601103612c695781518314612c4b57612bd5612bcf6124f6611d0d611ce787876127fe565b93610c89565b92601081101561019557612bf2612bec82896114cb565b516130a7565b15612c145750505050612c0791925051611f49565b0361019557610b9e6123ab565b86612c2c612b41612b3b84600196989a97999b6114cb565b15612c3e57612b8091612b56916114cb565b612b8091612b73916114cb565b505050612c589051611f49565b03610195576116d5610b9e916114ba565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f696e76616c6964206e6f6465206c656e677468000000000000000000000000006044820152606490fd5b9050612cdd612cd784846114cb565b51613070565b14155f612a95565b50612cf3612b7385856114cb565b871415612a89565b509050612d2c92507f56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421915014612558565b610b9e6123ab565b906020820191612d448351612de1565b925190838201809211610c975751928303928311610c97579190565b805115612d7b57602060c0910151515f1a1061103757600190565b505f90565b805115612d7b575f9060208101908151612d9981612de1565b8101809111610c9757915190518101809111610c975791905b828110612dbf5750905090565b612dc881612e4c565b8101809111610c9757612ddb9091611e99565b90612db2565b515f1a6080811015612df257505f90565b60b881108015612e36575b15612e085750600190565b60c0811015612e2757610b9e90612e229060b75b90611fbf565b610c89565b610b9e90612e229060f7612e1c565b5060c08110158015612dfd575060f88110612dfd565b80515f1a906080821015612e61575050600190565b60b8821015612e775750612e22610b9e91611f84565b60c0821015612eb85760010151602082900360b7016101000a9004017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff4a0190565b60f8821015612ece5750612e22610b9e91611f57565b60010151602082900360f7016101000a9004017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0a0190565b601f8111610c97576101000a90565b90918015611e94575b6020811015612f585780612f3157505050565b612f45612f40612f4a92611fb1565b612f06565b611f49565b905182518216911916179052565b91908051825260208101809111610c97579060208101809111610c975791601f19810190811115612f1e57610c5c565b612f9281516123c6565b90815115612fb057806020610b9e9201519051908360200190612f15565b5090565b5f81805b6130225750612fc6816123c6565b91815b612fd257505090565b612fdb82611f49565b61300d7fff000000000000000000000000000000000000000000000000000000000000008360f81b165f1a91856127fe565b5360081c908015610c97575f19019081612fc9565b9061302c90611e99565b9060081c80612fb8565b81519190604183036130665761305f9250602082015190606060408401519301515f1a906131dc565b9192909190565b50505f9160029190565b80516020811015613088575060208101519051902090565b90602001512060405160208101918252602081526123a5604082610afd565b6001815103612d7b5760200151515f1a60801490565b6130c690612d34565b902090565b9081511561019557600f6130e76124b6611d0d611ce78661149d565b16806130fa5750610b9e60025f9361293b565b6001810361310f5750610b9e60015f9361293b565b600281036131255750610b9e600260019361293b565b60030361019557610b9e6001809361293b565b91905f5b838101808211610c975782518110806131d2575b156131ca576131807fff0000000000000000000000000000000000000000000000000000000000000091846127fe565b51167fff000000000000000000000000000000000000000000000000000000000000006131ad83866127fe565b511690036131c3576131be90611e99565b61313c565b9250505090565b509250505090565b5083518210613150565b91907f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0841161326b579160209360809260ff5f9560405194855216868401526040830152606082015282805260015afa15613260575f5173ffffffffffffffffffffffffffffffffffffffff81161561325657905f905f90565b505f906001905f90565b6040513d5f823e3d90fd5b5050505f916003919056fea164736f6c634300081c000a","sourceMap":"235:2275:34:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;;;;-1:-1:-1;;235:2275:34;;;;;;;;;;;;;;;2639:47:93;2654:32;235:2275:34;2639:47:93;;:87;;;;;235:2275:34;;;;;;;;;;2639:87:93;844:25:133;829:40;;;2639:87:93;;;235:2275:34;-1:-1:-1;235:2275:34;;;;;-1:-1:-1;;235:2275:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;5599:2265:35;235:2275:34;;;:::i;:::-;-1:-1:-1;235:2275:34;;;;;;;;;;;;23142:42:35;23138:105;;5599:2265;:::i;:::-;235:2275:34;;;;;;;;;;;;;;;:::i;23138:105:35:-;23211:20;;:::i;:::-;5599:2265;:::i;235:2275:34:-;;;;;;;;;;;:::o;:::-;;;;;-1:-1:-1;;235:2275:34;;;;;;;;;3867:6:93;235:2275:34;3867:6:93;235:2275:34;;3867:22:93;235:2275:34;3867:6:93;235:2275:34;3867:22:93;235:2275:34;3776:120:93;;235:2275:34;;;;;;;;-1:-1:-1;;235:2275:34;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;4296:25:93;235:2275:34;;;:::i;:::-;4266:18:93;2475:4;4266:18;;3867:6;235:2275:34;3867:6:93;235:2275:34;;3867:22:93;235:2275:34;3867:6:93;235:2275:34;3867:22:93;235:2275:34;3776:120:93;;4266:18;2475:4;:::i;:::-;4296:25;:::i;:::-;235:2275:34;;;;;;;;:::i;:::-;735:10:121;235:2275:34;;;5387:34:93;5383:102;;5495:37;;;:::i;5383:102::-;5444:30;;;235:2275:34;5444:30:93;;235:2275:34;;;;;-1:-1:-1;;235:2275:34;;;;;;;;;;;;;;;;-1:-1:-1;;235:2275:34;;;;;;;-1:-1:-1;235:2275:34;;;;;;;;;23142:42:35;23138:105;;235:2275:34;9327:31:35;;:16;;;:31;:::i;:::-;;:::i;:::-;9373:9;;;;9393:1;9373:9;;;;:::i;:::-;:21;;;9369:97;;9535:31;235:2275:34;9681:10:35;9599:36;235:2275:34;9622:12:35;:9;9516:51;9535:31;;9681:95;9535:31;;;:::i;:::-;9516:51;:::i;:::-;9622:9;;;:::i;:::-;:12;;:::i;:::-;235:2275:34;;;:::i;:::-;9599:36:35;:::i;:::-;9681:10;;;:::i;235:2275:34:-;9707:26:35;9393:1;9707:26;;235:2275:34;;;;9745:29:35;;;235:2275:34;9745:29:35;;;;235:2275:34;;;;;;;9745:29:35;;-1:-1:-1;;9745:29:35;;;;;;:::i;:::-;235:2275:34;9735:40:35;;9681:95;;:::i;:::-;235:2275:34;;9786:109:35;;235:2275:34;9904:31:35;235:2275:34;;;;;;;;;;;;9904:31:35;235:2275:34;;;;;;;;;;;;;;;;;9786:109:35;9853:29;:20;9833:51;9853:20;;:::i;:::-;:29;:::i;:::-;9833:51;-1:-1:-1;9833:51:35;235:2275:34;;;;;9833:51:35;-1:-1:-1;9833:51:35;9369:97;9417:38;9438:9;;;;:::i;:::-;9417:38;-1:-1:-1;9417:38:35;9393:1;235:2275:34;;;;-1:-1:-1;235:2275:34;;;23138:105:35;23211:20;;:::i;:::-;23138:105;;235:2275:34;;;;;-1:-1:-1;;235:2275:34;;;;;;;;2082:33:35;235:2275:34;;;;;;;;-1:-1:-1;;235:2275:34;;;;;;;;;;;;;;;;-1:-1:-1;;235:2275:34;;;;;;;-1:-1:-1;235:2275:34;;;;;;;;;23142:42:35;23138:105;;235:2275:34;8099:31:35;;:16;;;:31;:::i;:::-;8145:9;;;;8165:1;8145:9;;;;:::i;:::-;:21;;;8141:97;;8251:10;;;;235:2275:34;8251:10:35;;;;:::i;:::-;:23;;;8247:102;;8418:31;235:2275:34;8631:10:35;8552:33;8563:10;8482:36;235:2275:34;8505:12:35;:9;8399:51;8418:31;;8631:95;8418:31;;;:::i;8399:51::-;8505:9;;;:::i;8482:36::-;8563:10;;;:::i;:::-;8552:33;;;;:::i;:::-;8631:10;;;:::i;235:2275:34:-;8657:26:35;8165:1;8657:26;;235:2275:34;;;;8695:29:35;;;235:2275:34;8695:29:35;;;;235:2275:34;;;;;;;8631:95:35;235:2275:34;;8740:20:35;8736:107;;8883:20;:29;:20;;:::i;:29::-;8927:28;;;;8923:116;;235:2275:34;9048:31:35;235:2275:34;;;;;;;8923:116:35;8978:50;-1:-1:-1;8978:50:35;235:2275:34;;;;;-1:-1:-1;9833:51:35;8736:107;8783:49;;;-1:-1:-1;8783:49:35;235:2275:34;;;;;-1:-1:-1;235:2275:34;;;8247:102:35;8297:41;8320:10;;;;:::i;:::-;8297:41;-1:-1:-1;8297:41:35;235:2275:34;;;;;-1:-1:-1;235:2275:34;;;23138:105:35;23211:20;;:::i;:::-;23138:105;;235:2275:34;;;;;;2920:29:93;235:2275:34;;;:::i;:::-;;2920:6:93;235:2275:34;2920:6:93;235:2275:34;;;2920:6:93;235:2275:34;;;;;;;;;;;;;2920:29:93;235:2275:34;;;;;;;;;;;;;;;-1:-1:-1;;235:2275:34;;;;;;;;;;;;;;;;4713:26:93;235:2275:34;;;:::i;:::-;4683:18:93;2475:4;4683:18;;3867:6;235:2275:34;3867:6:93;235:2275:34;;3867:22:93;235:2275:34;3867:6:93;235:2275:34;3867:22:93;235:2275:34;3776:120:93;;2475:4;4713:26;:::i;235:2275:34:-;;;;;;;:::i;:::-;-1:-1:-1;;23181:1:35;235:2275:34;;;;;;;;;23142:42:35;23138:105;;235:2275:34;10069:25:35;23181:1;10069:25;235:2275:34;23181:1:35;10069:25;23138:105;23211:20;;:::i;:::-;23138:105;;235:2275:34;;;;;;;:::o;:::-;-1:-1:-1;;235:2275:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;-1:-1:-1;;235:2275:34;;;;;5411:34:35;235:2275:34;;;;;:::i;5411:34:35:-;235:2275:34;;;;5527:25:35;5499:26;;;235:2275:34;5527:25:35;;235:2275:34;;;;;;;5462:91:35;235:2275:34;5462:91:35;;235:2275:34;;;;;;;;;;;;;;;;;;;-1:-1:-1;235:2275:34;;-1:-1:-1;235:2275:34;;-1:-1:-1;235:2275:34;;;;;;;5462:91:35;;;;;-1:-1:-1;;5462:91:35;;;;;;:::i;:::-;235:2275:34;;;;;;;:::i;:::-;;;;;;;;;;;;5499:26:35;235:2275:34;;;;;;;;;;;;-1:-1:-1;;235:2275:34;;;;;;;;;5014:11:35;235:2275:34;;5003:23:35;;;235:2275:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5003:23:35;;;;;;:::i;235:2275:34:-;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;:::i;:::-;;;;;;;;;;;;;;;:::o;:::-;;;-1:-1:-1;;235:2275:34;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;:::i;:::-;:::o;:::-;;;;;;;;-1:-1:-1;;235:2275:34;;;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;-1:-1:-1;235:2275:34;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;:::i;:::-;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;-1:-1:-1;;235:2275:34;;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;:::o;:::-;;;;;;;;;;;;2212:66:35;235:2275:34;;;;;;;:::o;:::-;;:::i;:::-;22204:4:35;235:2275:34;;;22204:4:35;235:2275:34;;;:::o;:::-;22358:4:35;235:2275:34;;;22358:4:35;235:2275:34;;;:::o;:::-;21546:4:35;235:2275:34;;;21546:4:35;235:2275:34;;;:::o;:::-;21688:4:35;235:2275:34;;;21688:4:35;235:2275:34;;;:::o;:::-;;;;;;;;;;:::o;:::-;;;;;;;;;8592:1:37;235:2275:34;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;235:2275:34;;;-1:-1:-1;235:2275:34;;;;;;;;;;;;;;;;-1:-1:-1;235:2275:34;;;;;;5599:2265:35;5783:40;5599:2265;5783:40;;;;:::i;:::-;5854:18;;;;:33;235:2275:34;5854:18:35;;235:2275:34;;;;;5854:33:35;5928:28;5941:14;;5928:28;:::i;:::-;5970:13;;;;235:2275:34;;;;;;;;;;;5970:18:35;5966:77;;6074:25;235:2275:34;;;;;;;;6056:43:35;;235:2275:34;;;6056:15:35;:43;:::i;:::-;6102:16;;;;235:2275:34;;;;;;;;;6056:62:35;235:2275:34;;;-1:-1:-1;6052:178:35;;-1:-1:-1;;6306:18:35;5854;6306:33;235:2275:34;;;6287:53:35;;235:2275:34;;9516:51:35;:::i;6287:53::-;235:2275:34;;;;;;;;;6367:31:35;;;:139;;;;5599:2265;6350:298;;;6701:25;;6921:79;6701:25;6757:72;6074:25;6685:62;6701:25;;;:::i;:::-;6728:18;;;;6685:62;;:::i;:::-;6796:32;;6757:72;;:::i;:::-;6870:17;;;;;;;;;:::i;:::-;6982;6964:16;235:2275:34;6074:11:35;235:2275:34;;;;;;6964:16:35;;235:2275:34;6982:17:35;;;6921:79;;:::i;:::-;7059:30;235:2275:34;;;;;;;;;;;;7059:15:35;235:2275:34;;;;;;;7059:30:35;7103:37;235:2275:34;;;;;;;7103:37:35;7099:303;;235:2275:34;;6074:25:35;235:2275:34;;;;7495:46:35;235:2275:34;7455:30:35;235:2275:34;;;;;;;;;7455:30:35;235:2275:34;;;;;;;7495:46:35;235:2275:34;;;;;;;;;;;7495:46:35;6074:11;7551:29;;235:2275:34;7635:17:35;7604:28;;235:2275:34;:::i;:::-;;;;;;;6074:25:35;235:2275:34;7667:55:35;;235:2275:34;;;;;;7667:55:35;235:2275:34;;;7667:55:35;7663:141;;7814:43;5854:33;5599:2265;:::o;7663:141::-;7738:55;;235:2275:34;;6074:25:35;235:2275:34;;;;;;;;6074:25:35;235:2275:34;;7738:55:35;5854:33;5599:2265;:::o;7099:303::-;235:2275:34;;7160:95:35;235:2275:34;;;;;;;7237:17:35;;7160:95;;:::i;:::-;7156:175;;7351:40;235:2275:34;;;;;;;;7351:40:35;5854:33;7351:40;235:2275:34;;7059:15:35;235:2275:34;;;;7156:175:35;6074:25;;-1:-1:-1;7275:41:35:o;6350:298::-;6538:99;235:2275:34;;;;;;;;;6538:99:35;5854:33;6538:99;235:2275:34;;;;6538:99:35;235:2275:34;6056:15:35;235:2275:34;;;;;;;;6367:139:35;6056:15;;6418:69;6056:15;235:2275:34;6418:40:35;235:2275:34;;;;;;;6418:40:35;:69;:::i;:::-;:88;;6367:139;;;6052:178;6141:78;5854:33;6141:78;6056:15;6141:78;235:2275:34;;;;;;;;;;;-1:-1:-1;9833:51:35;5966:77;6011:21;5854:33;6011:21;;5854:33;6011:21;235:2275:34;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;:::i;:::-;;;:::o;:::-;;:::i;3165:103:93:-;735:10:121;2920:6:93;235:2275:34;;;;;;;;;;;;3485:23:93;3481:108;;3165:103::o;3481:108::-;3531:47;2920:6;3531:47;735:10:121;3531:47:93;235:2275:34;2082:33:35;235:2275:34;;;2920:6:93;3531:47;3165:103;235:2275:34;2920:6:93;235:2275:34;2920:6:93;235:2275:34;;;2920:29:93;735:10:121;235:2275:34;2920:6:93;235:2275:34;;;;;;;;;;;;;2920:29:93;235:2275:34;;3485:23:93;3481:108;;3165:103;:::o;3481:108::-;3531:47;2920:6;3531:47;735:10:121;3531:47:93;235:2275:34;;;;2920:6:93;3531:47;19709:177:35;235:2275:34;;19790:19:35;19786:94;;19709:177;:::o;19786:94::-;19832:37;19808:1;19832:37;;235:2275:34;;19808:1:35;19832:37;235:2275:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;235:2275:34;;;;-1:-1:-1;235:2275:34;;;;-1:-1:-1;235:2275:34;;;;;;;;;;;:::o;:::-;;;10964:1:35;235:2275:34;;;;;;;:::o;:::-;;;11133:1:35;235:2275:34;;;;;;;:::o;:::-;;;11272:2:35;235:2275:34;;;;;;;:::o;:::-;;;11458:2:35;235:2275:34;;;;;;;:::o;:::-;;;11501:1:35;235:2275:34;;;;;;;:::o;:::-;;;11731:1:35;235:2275:34;;;;;;;:::o;:::-;;;11804:2:35;235:2275:34;;;;;;;:::o;:::-;;;11872:2:35;235:2275:34;;;;;;;:::o;:::-;;;13103:1:35;235:2275:34;;;;;;;:::o;:::-;;;;;;;;;:::o;:::-;;;2043:1;235:2275;;;;;;;:::o;:::-;;;7558:2:37;235:2275:34;;;;;;;:::o;:::-;;;;;;;;;;;;;;;:::o;2212:66:35:-;;;;;;;;;;;:::o;:::-;;;;;:::i;:::-;235:2275:34;;;;;;:::i;:::-;2212:66:35;;;-1:-1:-1;;2212:66:35;;;;:::i;:::-;;;;;;;;:::o;:::-;;235:2275:34;;;;;2212:66:35;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;235:2275:34;2212:66:35;;;:::o;:::-;235:2275:34;;2212:66:35;;235:2275:34;;2212:66:35;235:2275:34;;:::i;:::-;1849:1;2212:66:35;;;-1:-1:-1;;2212:66:35;;-1:-1:-1;2212:66:35;;;;;;;;;:::o;:::-;;235:2275:34;2212:66:35;;;;;;;;;;;;;;;:::i;:::-;235:2275:34;;;;;;:::i;:::-;2212:66:35;;;-1:-1:-1;;2212:66:35;;;;:::i;:::-;;;-1:-1:-1;2212:66:35;;;;;;;;;:::o;:::-;;235:2275:34;2212:66:35;;;;;;;;;;10603:2705;10769:30;:21;235:2275:34;;:::i;:::-;10710:28:35;;;;10769:21;:::i;:::-;:30;:::i;:::-;10748:18;;;:51;;;;235:2275:34;10841:2:35;10813:30;;10809:114;;10945:18;2394:66;10945:36;:21;:18;;:21;:::i;:::-;;:36;:::i;:::-;10937:66;10933:168;;10964:1;11114:30;:21;:18;;:21;:::i;:::-;;:30;:::i;:::-;:35;11110:122;;2212:66;11253:37;:22;:18;;:22;:::i;:37::-;11245:67;11241:167;;11439:32;:22;:18;;:22;:::i;:::-;;:32;:::i;:::-;235:2275:34;;11501:1:35;11485:17;;;;;:73;;;10603:2705;11481:130;;;11644:18;11919:21;11853:32;:22;11644:18;11621:54;11637:38;11644:30;:21;11919:30;11644:18;;:21;:::i;11637:38::-;235:2275:34;;11621:13:35;;;2212:66;;11621:54;11712:36;:21;:18;;:21;:::i;:36::-;11685:16;;;2212:66;11759:58;11778:39;11785:31;:22;:18;;:22;:::i;11778:39::-;235:2275:34;;11759:16:35;;;2212:66;;11759:58;11853:18;:22;:::i;:32::-;11919:21;:::i;:30::-;11895:21;;;;:54;;;;235:2275:34;11995:1:35;11963:33;;11959:123;;12136:21;:33;:24;:21;;:24;:::i;:::-;;:33;:::i;:::-;235:2275:34;;;12183:26:35;12179:83;;12292:36;235:2275:34;;12292:36:35;:::i;:::-;12272:17;;;;:56;;;-1:-1:-1;12385:3:35;235:2275:34;;12358:25:35;;;;;12434:27;:17;;;;:::i;:27::-;235:2275:34;;12504:2:35;12479:27;;12475:125;;12642:23;;12634:32;12642:23;;:::i;:::-;2212:66;;;;12634:32;235:2275:34;;;12684:23:35;;12680:103;;-1:-1:-1;12816:5:35;;;;;;12989:17;;;:32;10964:1;12989:17;:32;:17;;;:32;:::i;:::-;2212:66;235:2275:34;;2212:66:35;;;12989:32;2212:66;12343:13;;12823:3;12850:17;:33;:20;;:17;;;:20;:::i;:::-;235:2275:34;;;;;12850:20:35;235:2275:34;;;;12850:33:35;;12846:116;;10964:1;2212:66;12801:13;;12846:116;12914:29;-1:-1:-1;12914:29:35;235:2275:34;;;12734:34:35;235:2275:34;2212:66:35;-1:-1:-1;9833:51:35;12680:103;12734:34;-1:-1:-1;12734:34:35;235:2275:34;;;12734:34:35;235:2275:34;2212:66:35;-1:-1:-1;9833:51:35;12475:125;12533:52;-1:-1:-1;12533:52:35;235:2275:34;;;-1:-1:-1;9833:51:35;12358:25;;;13081:24;12358:25;;;13081:33;12358:25;;13081:21;:24;:::i;:33::-;13145:29;235:2275:34;;13145:29:35;:::i;:::-;13124:18;;;;:50;;;-1:-1:-1;13226:3:35;235:2275:34;;13204:20:35;;;;;13269:12;13245:46;13269:12;:22;:12;10964:1;13269:12;;;:::i;:22::-;13245:18;;:46;;;;;:::i;:::-;;;:::i;:::-;;2212:66;13189:13;;13204:20;;;;;10603:2705::o;12179:83::-;12232:19;-1:-1:-1;12232:19:35;;-1:-1:-1;12232:19:35;11959:123;12019:52;-1:-1:-1;12019:52:35;235:2275:34;;;-1:-1:-1;9833:51:35;11481:130;11581:19;235:2275:34;;;11581:19:35;;;;;;;;;;:::i;:::-;;;;11485:73;11526:32;235:2275:34;;10748:18:35;235:2275:34;;11506:16:35;:52;;11485:73;;;11241:167;11358:37;:22;11335:62;11358:18;;:22;:::i;:37::-;11335:62;-1:-1:-1;11335:62:35;235:2275:34;;;;;11110:122:35;11190:30;:21;11172:49;11190:18;;:21;:::i;:30::-;11172:49;-1:-1:-1;11172:49:35;235:2275:34;;;;;10933:168:35;11052:36;:21;11026:64;11052:18;;:21;:::i;:36::-;11026:64;-1:-1:-1;11026:64:35;235:2275:34;;;;;10809:114:35;10866:46;10710:16;10866:46;235:2275:34;;;-1:-1:-1;9833:51:35;19288:292;235:2275:34;;;;-1:-1:-1;235:2275:34;19428:15:35;235:2275:34;;;-1:-1:-1;235:2275:34;;;;;;19473:29:35;19469:105;;19288:292;:::o;19469:105::-;19525:38;-1:-1:-1;19525:38:35;19428:15;235:2275:34;;-1:-1:-1;19525:38:35;1703:805:34;2231:18;2154:26;1837:14;;:::i;:::-;21133:17:35;2086:24:34;1891:21;;;21133:17:35;1891:24:34;:21;;:24;:::i;:::-;;21133:17:35;:::i;:::-;1861:55:34;;;:::i;:::-;;;;;:::i;:::-;;21133:17:35;1956:24:34;:21;;:24;:::i;21133:17:35:-;1926:55:34;;;:::i;:::-;;;;;:::i;:::-;;21133:17:35;2021:24:34;:21;;:24;:::i;21133:17:35:-;1991:55:34;;;:::i;:::-;;;;;:::i;:::-;;2086:21;:24;:::i;21133:17:35:-;2056:55:34;;;:::i;:::-;;;;;:::i;:::-;;2154:26;:::i;:::-;2231:18;;;2219:38;2231:18;;235:2275;2219:38;:::i;:::-;2272:13;1913:1;2318:3;2291:18;;235:2275;;2287:29;;;;;2354:82;;1978:1;2354:82;2359:2;2354:7;;:82;2359:2;;;2364:33;;;;;:::i;:::-;2337:99;;;;:::i;:::-;;;;;;:::i;:::-;;2212:66:35;2272:13:34;;2354:82;21133:17:35;2414:21:34;;;;:::i;21133:17:35:-;2354:82:34;;2287:29;;;;2473:27;2287:29;;2473:27;:::i;:::-;2231:18;235:2275;;;;2463:38;1703:805;:::o;14625:509:35:-;;;;14757:27;235:2275:34;;14757:27:35;:::i;:::-;14799:13;14811:1;14832:3;235:2275:34;;14814:16:35;;;;;14891:8;;;;:::i;:::-;;235:2275:34;;15452:2:35;15437:17;;15433:95;;15547:8;;15559:2;235:2275:34;15541:15:35;15547:8;;15680:30;15547:8;;:::i;:::-;235:2275:34;;;;;15547:8:35;235:2275:34;;;;15541:15:35;235:2275:34;15541:20:35;15537:90;;14832:3;15680:30;;:::i;:::-;235:2275:34;;;;:::i;:::-;15724:33:35;;;:57;;;14832:3;15720:114;;235:2275:34;;;14811:1:35;14934:5;;;;;;15098:19;;;;2212:66;15098:19;;;;;:::i;:::-;2212:66;14799:13;;14941:3;14968:10;:20;:10;;;;;:::i;:20::-;;14964:107;;2212:66;;14919:13;;14964:107;15019:33;14811:1;15019:33;235:2275:34;;;12734:34:35;235:2275:34;2212:66:35;-1:-1:-1;9833:51:35;15720:114;15804:19;14811:1;15804:19;;14811:1;15804:19;15724:57;235:2275:34;;;;15761:20:35;15724:57;;15537:90;15588:28;15595:20;:15;15601:8;;;;:::i;15595:15::-;:20;:::i;:::-;235:2275:34;;;;;;15588:28:35;14811:1;15577:39;;;;:::i;:::-;;15537:90;;15433:95;15477:40;14811:1;15477:40;235:2275:34;;;-1:-1:-1;9833:51:35;14814:16;;;;14625:509::o;235:2275:34:-;-1:-1:-1;;235:2275:34;;;;;;;:::o;16070:540:35:-;;-1:-1:-1;16267:13:35;-1:-1:-1;16302:3:35;235:2275:34;;16282:18:35;;;;;16325:47;235:2275:34;16361:10:35;;;;:::i;:::-;235:2275:34;;16325:47:35;;:::i;:::-;16321:94;;16302:3;2212:66;;16267:13;;16321:94;16392:8;;2212:66;16392:8;;:::i;:::-;16321:94;;;;;16282:18;;;16481:1;16454:32;16282:18;235:2275:34;;16454:32:35;:::i;:::-;16500:17;;;;16496:108;;16070:540;;:::o;16496:108::-;16540:53;-1:-1:-1;16540:53:35;235:2275:34;;;;;-1:-1:-1;16540:53:35;235:2275:34;;-1:-1:-1;;235:2275:34;;;;;;;:::o;:::-;;;;;;;;;;:::o;:::-;;;;;;;;;;:::o;:::-;;;;;;;;;:::o;:::-;;;;;;;;;;:::o;16833:545:35:-;;-1:-1:-1;16972:13:35;-1:-1:-1;17007:3:35;235:2275:34;;16987:18:35;;;;;17030:39;235:2275:34;17058:10:35;;;;:::i;:::-;235:2275:34;;17030:39:35;;:::i;:::-;17026:86;;17007:3;2212:66;;16972:13;;17026:86;17089:8;;2212:66;17089:8;;:::i;:::-;17026:86;;;;;16987:18;;;235:2275:34;;17261:1:35;235:2275:34;;;;;;;;;17276:17:35;;;17272:100;;16833:545;;:::o;17272:100::-;17316:45;-1:-1:-1;17316:45:35;235:2275:34;;;;;-1:-1:-1;17316:45:35;13603:440;13949:31;13603:440;13949:22;13603:440;13821:76;13603:440;235:2275:34;;;13870:25:35;;;235:2275:34;;;;;;13870:25:35;;;;;;;:::i;13949:31::-;235:2275:34;;14018:1:35;235:2275:34;;;;;14005:30:35;235:2275:34;;14005:15:35;:30;:::i;235:2275:34:-;;;;;;;;-1:-1:-1;235:2275:34;;-1:-1:-1;235:2275:34;;;-1:-1:-1;235:2275:34;:::o;18401:677:35:-;;;235:2275:34;;;;;;;;;;;;;;18648:37:35;;;;:82;;;18401:677;18644:125;;;18782:25;;235:2275:34;;;;;18782:53:35;18778:96;;235:2275:34;18926:3:35;235:2275:34;;18903:21:35;;;;;235:2275:34;18949:28:35;;;;:::i;:::-;235:2275:34;;;;;;;;;;;;18949:45:35;18981:13;;;;;:::i;18949:45::-;235:2275:34;;18949:45:35;18945:96;;2212:66;;18888:13;;18945:96;19014:12;;;235:2275:34;19014:12:35;:::o;18903:21::-;;;;2212:66;18401:677;:::o;18778:96::-;18851:12;;235:2275:34;18851:12:35;:::o;18648:82::-;18689:26;;;;;235:2275:34;18689:41:35;;18648:82;;;6145:316:93;235:2275:34;;;;;;;2920:29:93;235:2275:34;;;;;;;;;;;;;;;;2920:29:93;235:2275:34;;;;;;;;;;6281:29:93;235:2275:34;;;;;;;;;;;;;;;;6281:29:93;6313:4;235:2275:34;;;;;;;;735:10:121;235:2275:34;;6336:40:93;;235:2275:34;6336:40:93;;6313:4;6390:11;:::o;6698:317::-;235:2275:34;;;;;;;2920:29:93;235:2275:34;;;;;;;;;;;;;;;;2920:29:93;235:2275:34;;;;;;;;;;;6834:29:93;235:2275:34;;;;;;;;;;;;;;;;6834:29:93;235:2275:34;;;;;;;735:10:121;235:2275:34;;6890:40:93;;235:2275:34;6890:40:93;;235:2275:34;6944:11:93;:::o;14227:174:35:-;235:2275:34;;;;;14351:18:35;235:2275:34;;;14340:53:35;;235:2275:34;;;2605:66:35;235:2275:34;;;;;14340:53:35;;;;;;:::i;:::-;235:2275:34;14330:64:35;;14227:174;:::o;235:2275:34:-;;;;;;;;:::i;:::-;2546:1:37;235:2275:34;;;2212:66:35;235:2275:34;;;2212:66:35;235:2275:34:o;:::-;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;-1:-1:-1;;235:2275:34;;;;:::i;1287:390:37:-;1607:20;:29;1287:390;;;;235:2275:34;1508:2:37;235:2275:34;:::i;:::-;;;;;;;;:::i;:::-;1508:2:37;235:2275:34;;;1508:2:37;235:2275:34;:::i;:::-;-1:-1:-1;;1508:2:37;235:2275:34;;;;2212:66:35;;;1521:63:37;1607:20;:::i;:29::-;1648:21;8580:13;235:2275:34;;8580:13:37;:::i;:::-;235:2275:34;;;8611:13:37;;:33;;;1287:390;8603:42;;;:::i;:::-;8666:26;8676:15;-1:-1:-1;8676:15:37;;:::i;:::-;8666:26;:::i;:::-;8702:18;-1:-1:-1;;235:2275:34;1667:1:37;8888:14;;;;;;1600:70;;;;;;;:::i;8904:6::-;8969:5;9033:37;8985:3;9041:21;:16;9047:9;;8969:5;;8592:1;8969:5;235:2275:34;;;;8969:5:37;8966:9;;8930:59;8966:9;8952:37;8966:9;8960:21;:16;8966:9;;;;;:::i;8960:16::-;235:2275:34;;;;;;8960:21:37;8959:29;235:2275:34;;;;;;8952:37:37;1667:1;8930:59;;;:::i;:::-;;9047:9;:::i;9041:16::-;235:2275:34;;;;9033:37:37;1667:1;9007:63;;8743:1;235:2275:34;;9007:63:37;;:::i;:::-;;235:2275:34;8881:204:37;;8611:33;-1:-1:-1;8628:16:37;8611:33;;235:2275:34;;;;;;;:::i;:::-;-1:-1:-1;235:2275:34;;;;;;;:::o;2457:221:38:-;235:2275:34;;:::i;:::-;;2568:58:38;235:2275:34;;;;;;;;;:::i;:::-;2212:66:35;;2568:58:38;;2643:28;;2212:66:35;2457:221:38;:::o;235:2275:34:-;;;;:::o;7796:439:38:-;235:2275:34;;7883:12:38;;;:30;;;;7796:439;235:2275:34;;;;7957:21:38;;;:::i;:::-;7989:14;8013:192;;;;;;;8215:13;7796:439;:::o;8013:192::-;;;;;;;7796:439;:::o;7883:30::-;7911:2;7899:14;;;;7883:30;;;4170:519;4266:12;;;:::i;:::-;235:2275:34;;;4306:14:38;;;:::i;:::-;2212:66:35;;;:::i;:::-;235:2275:34;;;;;;;:::i;:::-;2212:66:35;;;-1:-1:-1;;235:2275:34;;;:::i;:::-;;-1:-1:-1;235:2275:34;;;;;;4404:11:38;;235:2275:34;4404:41:38;:11;;235:2275:34;4418:27:38;;;:::i;:::-;4404:41;;:::i;:::-;-1:-1:-1;4480:179:38;4500:9;;;;;;4669:13;;;4170:519;:::o;4511:3::-;4632:16;4540:19;;2212:66:35;4540:19:38;;:::i;:::-;235:2275:34;;;:::i;:::-;2212:66:35;;;4585:24:38;235:2275:34;4585:24:38;;2212:66:35;4573:36:38;;;;:::i;:::-;;;;;;:::i;:::-;;4632:16;:::i;:::-;4511:3;2212:66:35;4485:13:38;;;235:2275:34;;;;;:::i;:::-;;;;;;;;;;8413:298:38;8545:2;235:2275:34;;8533:14:38;235:2275:34;;8600:11:38;;235:2275:34;8614:1:38;235:2275:34;;;;;;;8625:56:38;8413:298;:::o;8857:379::-;235:2275:34;;8950:12:38;235:2275:34;;9006:21:38;9202:3;9006:21;;:::i;:::-;9059:14;;;;;;:::i;:::-;9109:61;;;;9202:3;;:::i;235:2275:34:-;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;:::i;:::-;;;:::i;:::-;;-1:-1:-1;;235:2275:34;;;;;;:::i;:::-;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;21886:523:35:-;-1:-1:-1;;235:2275:34;22047:3:35;235:2275:34;;22029:16:35;;;;;22076:31;2212:66;22098:8;;;;;:::i;:::-;;22076:31;;:::i;:::-;22047:3;2212:66;22014:13;;;22029:16;;;;235:2275:34;;22149:2:35;22132:19;;22128:120;;235:2275:34;22328:74:35;22282:29;235:2275:34;;22282:29:35;:::i;:::-;235:2275:34;22328:74:35;22345:37;22352:29;22358:22;235:2275:34;;22358:22:35;:::i;22345:37::-;235:2275:34;;;22328:74:35;;;;;;;:::i;22128:120::-;22191:36;22198:28;22204:21;22174:63;22204:21;;:::i;22191:36::-;22174:63;235:2275:34;;22174:63:35;;;;;;;:::i;235:2275:34:-;;;15552:2:35;235:2275:34;;;;;;;:::o;:::-;;;;;;;;;;;;;:::o;21295:440:35:-;21403:1;235:2275:34;;21389:15:35;:39;;;21295:440;21385:80;;235:2275:34;;21491:2:35;21478:15;;21474:108;;235:2275:34;21658:70:35;21616:25;235:2275:34;;21616:25:35;:::i;:::-;235:2275:34;21658:70:35;21675:37;21682:29;21688:22;235:2275:34;;21688:22:35;:::i;21474:108::-;21533:32;21540:24;21546:17;21516:55;21546:17;;:::i;21389:39::-;21414:6;21424:4;235:2275:34;21408:13:35;21414:6;;;;:::i;21408:13::-;235:2275:34;21408:20:35;21389:39;;235:2275:34;;;;;;;;;;;;:::o;:::-;;-1:-1:-1;235:2275:34;;;:::o;20106:284:35:-;;235:2275:34;20260:3:35;235:2275:34;;20237:21:35;;;;;235:2275:34;20283:13:35;;;;:::i;:::-;235:2275:34;;;;;;;;;;20283:23:35;20279:73;;2212:66;;20222:13;;20608:282;;235:2275:34;20760:3:35;235:2275:34;;20737:21:35;;;;;235:2275:34;20783:13:35;;;;:::i;:::-;235:2275:34;;;;;20783:23:35;20779:73;;2212:66;;20722:13;;8452:649:37;;;8580:13;235:2275:34;;8580:13:37;:::i;:::-;235:2275:34;;;8611:13:37;;:33;;;8452:649;8603:42;;;:::i;:::-;8666:26;8676:15;;;;:::i;8666:26::-;8702:18;;8734:10;8743:1;8734:10;;;:15;8730:118;;8452:649;-1:-1:-1;;235:2275:34;;;8881:204:37;8888:14;;;;;;8452:649;;;;;:::o;8904:6::-;8969:5;9007:63;8743:1;9033:37;8985:3;9041:21;:16;9047:9;;8969:5;8592:1;8969:5;8930:59;8952:37;8969:5;8960:21;8969:5;8966:9;;8969:5;8960:16;8969:5;235:2275:34;;;;8969:5:37;8966:9;;;:::i;8952:37::-;235:2275:34;;;8930:59:37;;8623:1;8930:59;;;:::i;:::-;;9047:9;;:::i;9033:37::-;8623:1;9007:63;235:2275:34;;9007:63:37;;:::i;:::-;;235:2275:34;8881:204:37;;;;8730:118;8795:10;;235:2275:34;8786:26:37;:21;8792:14;;8795:10;;235:2275:34;;;;8795:10:37;8792:14;;:::i;8786:26::-;235:2275:34;;;8623:1:37;8765:55;;;;:::i;:::-;;-1:-1:-1;;8834:3:37;;;:::i;:::-;8730:118;;;;;8611:33;-1:-1:-1;8628:16:37;;;;8611:33;;2316:5418;;2546:1;2557:20;2546:1;235:2275:34;;:::i;:::-;;;;2676:17:37;2672:223;;2963:13;;2546:1;2958:4724;2996:3;235:2275:34;;2978:16:37;;;;;3078:6;;;;:50;;2996:3;3074:97;;3285:6;:47;;;;2996:3;3281:94;;;3501:17;:8;;;;:::i;:17::-;235:2275:34;;;3552:1:37;3537:16;;3533:4139;3552:1;;;3731:7;3703:46;3731:17;:7;;;:::i;:17::-;3703:46;:::i;:::-;3791:56;3865:28;3791:56;;;;;:::i;:::-;3865:28;;;:::i;:::-;235:2275:34;;-1:-1:-1;3912:994:37;;4924:1185;;;235:2275:34;5002:16:37;235:2275:34;;5002:16:37;:::i;:::-;-1:-1:-1;4994:144:37;;235:2275:34;-1:-1:-1;5160:109:37;;5302:7;5338:18;5302:7;;:::i;5160:109::-;5234:12;;;:::i;4924:1185::-;235:2275:34;;;5481:16:37;235:2275:34;;5481:16:37;:::i;:::-;5476:21;;5472:138;;5637:7;5636:17;5637:16;:7;2212:66:35;5637:7:37;;:::i;:::-;;:16;:::i;:::-;5636:17;;235:2275:34;5636:17:37;5637:7;;;5824;:26;:7;;:::i;:::-;;:26;:::i;:::-;5632:459;;2212:66:35;2963:13:37;;;;;5632:459;6041:7;:27;:7;;:::i;:::-;;5445:11:38;;;235:2275:34;;;5522:62:38;;5341:272;;6041:27:37;5632:459;;;3912:994;235:2275:34;;;;;;4705:16:37;235:2275:34;;;4705:16:37;:::i;:::-;-1:-1:-1;4697:149:37;;4875:12;;:::i;3533:4139::-;6133:17;;;;;;6148:2;6133:17;6148:2;;235:2275:34;;6206:36:37;;6222:20;;6438:17;6373:43;6381:34;6387:27;;;;;:::i;6373:43::-;6438:17;;:::i;:::-;6481:12;6491:2;6481:12;;;6477:146;;6649:33;6669:12;;;;:::i;:::-;;6649:33;:::i;:::-;6669:12;;;235:2275:34;;;;6753:16:37;235:2275:34;;;;6753:16:37;:::i;:::-;6748:21;6744:157;;6934:12;;:::i;6645:555::-;6980:12;6979:22;6980:21;:12;;2212:66:35;6980:12:37;;;;;;;:::i;6979:22::-;6980:12;;;7044:31;:12;;;;:::i;6975:225::-;7145:32;:12;;;;:::i;6202:1388::-;235:2275:34;;;7398:16:37;235:2275:34;;7398:16:37;:::i;:::-;7393:21;7389:135;;7553:8;:18;:8;;:::i;6129:1543::-;235:2275:34;;7628:29:37;;;235:2275:34;7628:29:37;;;235:2275:34;;;;;;;;;;;;;11581:19:35;3285:47:37;3323:8;;3311:21;3323:8;;;;:::i;:::-;;3311:21;:::i;:::-;3295:37;;3285:47;;;3078:50;3100:8;:28;:8;;;;:::i;:28::-;3088:40;;;3078:50;;2672:223;2772:78;;;2764:87;2772:78;;2784:66;2772:78;;;2764:87;:::i;:::-;2872:12;;:::i;3469:281:38:-;;3598:11;;;235:2275:34;3583:27:38;235:2275:34;;3583:27:38;:::i;:::-;235:2275:34;;;;;;;;;;;;;;;;;;;;3723:20:38;3469:281;:::o;4838:321::-;235:2275:34;;4918:13:38;4914:31;;4994:11;868:4;4994:11;;235:2275:34;5015:64:38;235:2275:34;5015:64:38;5093:24;5089:42;;5148:4;4838:321;:::o;4914:31::-;4933:12;235:2275:34;4933:12:38;:::o;9434:424::-;235:2275:34;;9518:13:38;9514:27;;235:2275:34;9597:11:38;;;;235:2275:34;;;9611:27:38;;;:::i;:::-;235:2275:34;;;;;;;;;;;;;;;;;;9697:132:38;;9704:16;;;;;;9839:12;;;9434:424;:::o;9697:132::-;9756:20;;;:::i;:::-;235:2275:34;;;;;;;9811:7:38;9736:40;9811:7;;:::i;:::-;9697:132;;;11485:581;11589:64;235:2275:34;11589:64:38;682:4;11667:26;;682:4;;;11709:8;235:2275:34;11709:8:38;:::o;11663:397::-;776:4;11738:25;;:83;;;;11663:397;11734:326;;;11837:8;11844:1;11837:8;:::o;11734:326::-;868:4;11866:24;;868:4;;;11943:35;;:31;;958:4;11943:31;;;:::i;:::-;:35;:::i;11862:198::-;12016:33;;:29;;958:4;12016:29;235:2275:34;11738:83:38;11768:25;868:4;11768:25;;;:52;;11738:83;11768:52;11797:23;958:4;11797:23;;11738:83;;10045:1263;10171:64;;-1:-1:-1;10171:64:38;;682:4;10249:26;;682:4;;;10291:11;;10301:1;10045:1263;:::o;10245:1032::-;776:4;10323:25;;776:4;;;10374:26;;:30;:26;;:::i;10319:958::-;868:4;10425:24;;868:4;;;10465:385;;;;;;;;;;;;;;;;235:2275:34;:::o;10421:856:38:-;958:4;10870:23;;958:4;;;10919:24;;:28;:24;;:::i;10866:411::-;10978:289;;;;;;;;;;;;;;;;235:2275:34;:::o;1035:2:38:-;;;;;;;;;:::o;12279:770::-;;;12360:8;;12356:21;;12441:16;1035:2;12441:16;;;;;12642:7;12638:405;;12279:770;;;:::o;12638:405::-;12764:24;12772:15;12764:28;12772:15;;:::i;:::-;12764:24;:::i;:::-;:28;:::i;:::-;12806:227;;;;;;;;;;;;12279:770::o;12459:16::-;12491:65;;;;;;1035:2;235:2275:34;;;;;;;12600:17:38;1035:2;235:2275:34;;;;;;;12459:16:38;-1:-1:-1;;235:2275:34;;;;;;12434:194:38;235:2275:34;;:::i;6262:337:38:-;6372:19;235:2275:34;;6372:19:38;:::i;:::-;235:2275:34;;;6405:18:38;6401:37;;6542:11;6470:57;6560:8;6542:11;;235:2275:34;;;6470:57:38;;;;6560:8;;:::i;6401:37::-;6425:13;;:::o;22572:430:35:-;-1:-1:-1;22657:19:35;;22717:8;;;22812:17;;;;:::i;:::-;22839:11;22860:116;22885:5;;;22985:10;;22572:430;:::o;22892:3::-;22915:5;;;:::i;:::-;22911:31;235:2275:34;;;;;-1:-1:-1;22911:31:35;;;;:::i;:::-;;235:2275:34;;22892:3:35;235:2275:34;;;;-1:-1:-1;;235:2275:34;22865:18:35;;;;22710:73;22741:8;;;;:::i;:::-;235:2275:34;22771:1:35;235:2275:34;22710:73:35;;;2419:778:131;235:2275:34;;;2419:778:131;2609:2;2589:22;;2609:2;;3041:25;2825:196;;;;;;;;;;;;;;;-1:-1:-1;2825:196:131;3041:25;;:::i;:::-;3034:32;;;;;:::o;2585:606::-;3097:83;;3113:1;3097:83;3117:35;3097:83;;:::o;10970:270:37:-;235:2275:34;;11081:2:37;11069:14;;11081:2;;;5445:11:38;11081:2:37;5445:11:38;;235:2275:34;;;5522:62:38;;11099:32:37;:::o;11065:169::-;5445:11:38;11081:2:37;5445:11:38;235:2275:34;5522:62:38;235:2275:34;;11081:2:37;11179:43;;235:2275:34;;;11081:2:37;11179:43;;;235:2275:34;11179:43:37;;:::i;7919:335::-;8034:1;235:2275:34;;8022:13:37;8018:56;;8117:11;;235:2275:34;8138:60:37;235:2275:34;8138:60:37;8219:4;8214:9;;7919:335::o;5788:270:38:-;5909:21;5788:270;5909:21;:::i;:::-;5964:65;;5788:270;:::o;9342:729:37:-;;235:2275:34;;9472:13:37;235:2275:34;;9538:3:37;9518:17;:12;9524:5;;;;:::i;9518:17::-;:23;9583:16;;;9615:10;10038:25;9624:1;235:2275:34;9579:434:37;10038:25;:::i;9579:434::-;9689:1;9674:16;;9689:1;;9706:10;10038:25;9689:1;235:2275:34;9670:343:37;10038:25;:::i;9670:343::-;9780:1;9765:16;;9780:1;;9797:10;10038:25;9780:1;9689;9761:252;10038:25;:::i;9761:252::-;9870:1;9855:16;9870:1;;10038:25;9689:1;9911:13;9851:162;10038:25;:::i;10353:320::-;;;235:2275:34;10548:3:37;235:2275:34;;;;;;;;;;10505:24:37;;:41;;;10548:3;10505:41;;;10571:16;235:2275:34;;10571:16:37;;:::i;:::-;235:2275:34;;;10591:5:37;;;;:::i;:::-;235:2275:34;;10571:25:37;;10567:72;;10548:3;;;:::i;:::-;10498:151;;10567:72;10616:8;;;;;:::o;10505:41::-;;;;;;10353:320;:::o;10505:41::-;235:2275:34;;;10533:13:37;;10505:41;;7129:1551:131;;;8209:66;8196:79;;8192:164;;235:2275:34;;;;;;-1:-1:-1;235:2275:34;;;;;;;;;;;;;;;;;;;8467:24:131;;;;;;;;;-1:-1:-1;8467:24:131;235:2275:34;;;8505:20:131;8501:113;;8624:49;-1:-1:-1;8624:49:131;-1:-1:-1;7129:1551:131;:::o;8501:113::-;8541:62;-1:-1:-1;8541:62:131;8467:24;8541:62;-1:-1:-1;8541:62:131;:::o;8467:24::-;235:2275:34;;;;;;;;;8192:164:131;8291:54;;;8307:1;8291:54;8311:30;8291:54;;:::o","linkReferences":{}},"methodIdentifiers":{"DEFAULT_ADMIN_ROLE()":"a217fddf","PROOF_SUBMITTER_ROLE()":"5972185a","getClientState()":"ef913a4b","getConsensusState(uint64)":"edce8bdc","getRoleAdmin(bytes32)":"248a9ca3","grantRole(bytes32,address)":"2f2ff15d","hasRole(bytes32,address)":"91d14854","misbehaviour(bytes)":"ddba6537","renounceRole(bytes32,address)":"36568abe","revokeRole(bytes32,address)":"d547741f","supportsInterface(bytes4)":"01ffc9a7","updateClient(bytes)":"0bece356","verifyMembership((bytes,(uint64,uint64),bytes[],bytes))":"682ed5f0","verifyNonMembership((bytes,(uint64,uint64),bytes[]))":"4d6d9ffb"},"rawMetadata":"{\"compiler\":{\"version\":\"0.8.28+commit.7893614a\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"ibcRouter\",\"type\":\"address\"},{\"internalType\":\"uint64\",\"name\":\"initialTrustedHeight\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"initialTrustedTimestamp\",\"type\":\"uint64\"},{\"internalType\":\"bytes32\",\"name\":\"initialTrustedStorageRoot\",\"type\":\"bytes32\"},{\"internalType\":\"address[]\",\"name\":\"initialTrustedValidators\",\"type\":\"address[]\"},{\"internalType\":\"uint64\",\"name\":\"trustingPeriod\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"maxClockDrift\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"roleManager\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"AccessControlBadConfirmation\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"internalType\":\"bytes32\",\"name\":\"neededRole\",\"type\":\"bytes32\"}],\"name\":\"AccessControlUnauthorizedAccount\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"revisionHeight\",\"type\":\"uint64\"}],\"name\":\"ConflictingConsensusState\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"trustedTimestamp\",\"type\":\"uint64\"},{\"internalType\":\"uint256\",\"name\":\"currentTimestamp\",\"type\":\"uint256\"},{\"internalType\":\"uint64\",\"name\":\"trustingPeriod\",\"type\":\"uint64\"}],\"name\":\"ConsensusStateExpired\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"revisionHeight\",\"type\":\"uint64\"}],\"name\":\"ConsensusStateNotFound\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"signer\",\"type\":\"address\"}],\"name\":\"DuplicateCommitSealSigner\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"validator\",\"type\":\"address\"}],\"name\":\"DuplicateValidator\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"EmptyValidatorSet\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"currentTimestamp\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"headerTimestamp\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxClockDrift\",\"type\":\"uint256\"}],\"name\":\"HeaderFromFuture\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"actual\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"required\",\"type\":\"uint256\"}],\"name\":\"InsufficientTrustedValidatorOverlap\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"actual\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"required\",\"type\":\"uint256\"}],\"name\":\"InsufficientValidatorQuorum\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidCommitSeal\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"expectedValue\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"actualValue\",\"type\":\"bytes32\"}],\"name\":\"InvalidCommitmentValue\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"actualDifficulty\",\"type\":\"uint256\"}],\"name\":\"InvalidDifficulty\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"length\",\"type\":\"uint256\"}],\"name\":\"InvalidECDSASignatureLength\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"itemsLength\",\"type\":\"uint256\"}],\"name\":\"InvalidExtraDataFormat\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"itemsLength\",\"type\":\"uint256\"}],\"name\":\"InvalidHeaderFormat\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidHeaderHeight\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"actualMixHash\",\"type\":\"bytes32\"}],\"name\":\"InvalidMixHash\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"actualNonce\",\"type\":\"bytes\"}],\"name\":\"InvalidNonce\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"actualOmmersHash\",\"type\":\"bytes32\"}],\"name\":\"InvalidOmmersHash\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"expectedLength\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"actualLength\",\"type\":\"uint256\"}],\"name\":\"InvalidPathLength\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"providedRevisionNumber\",\"type\":\"uint64\"}],\"name\":\"InvalidRevisionNumber\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"validator\",\"type\":\"address\"}],\"name\":\"InvalidValidatorAddress\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"length\",\"type\":\"uint256\"}],\"name\":\"InvalidValidatorAddressLength\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"expectedLength\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"actualLength\",\"type\":\"uint256\"}],\"name\":\"InvalidValueLength\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"UnsupportedMisbehaviour\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"actualValue\",\"type\":\"bytes32\"}],\"name\":\"ValueExists\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"previousAdminRole\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"newAdminRole\",\"type\":\"bytes32\"}],\"name\":\"RoleAdminChanged\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"RoleGranted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"RoleRevoked\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"DEFAULT_ADMIN_ROLE\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"PROOF_SUBMITTER_ROLE\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getClientState\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"revisionHeight\",\"type\":\"uint64\"}],\"name\":\"getConsensusState\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"}],\"name\":\"getRoleAdmin\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"grantRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"hasRole\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"name\":\"misbehaviour\",\"outputs\":[],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"callerConfirmation\",\"type\":\"address\"}],\"name\":\"renounceRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"revokeRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes4\",\"name\":\"interfaceId\",\"type\":\"bytes4\"}],\"name\":\"supportsInterface\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"updateMsg\",\"type\":\"bytes\"}],\"name\":\"updateClient\",\"outputs\":[{\"internalType\":\"enum ILightClientMsgs.UpdateResult\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes\",\"name\":\"proof\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"uint64\",\"name\":\"revisionNumber\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"revisionHeight\",\"type\":\"uint64\"}],\"internalType\":\"struct IICS02ClientMsgs.Height\",\"name\":\"proofHeight\",\"type\":\"tuple\"},{\"internalType\":\"bytes[]\",\"name\":\"path\",\"type\":\"bytes[]\"},{\"internalType\":\"bytes\",\"name\":\"value\",\"type\":\"bytes\"}],\"internalType\":\"struct ILightClientMsgs.MsgVerifyMembership\",\"name\":\"msg_\",\"type\":\"tuple\"}],\"name\":\"verifyMembership\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes\",\"name\":\"proof\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"uint64\",\"name\":\"revisionNumber\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"revisionHeight\",\"type\":\"uint64\"}],\"internalType\":\"struct IICS02ClientMsgs.Height\",\"name\":\"proofHeight\",\"type\":\"tuple\"},{\"internalType\":\"bytes[]\",\"name\":\"path\",\"type\":\"bytes[]\"}],\"internalType\":\"struct ILightClientMsgs.MsgVerifyNonMembership\",\"name\":\"msg_\",\"type\":\"tuple\"}],\"name\":\"verifyNonMembership\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"errors\":{\"AccessControlBadConfirmation()\":[{\"details\":\"The caller of a function is not the expected one. NOTE: Don't confuse with {AccessControlUnauthorizedAccount}.\"}],\"AccessControlUnauthorizedAccount(address,bytes32)\":[{\"details\":\"The `account` is missing a role.\"}],\"ConflictingConsensusState(uint64)\":[{\"params\":{\"revisionHeight\":\"The conflicting revision height.\"}}],\"ConsensusStateExpired(uint64,uint256,uint64)\":[{\"params\":{\"currentTimestamp\":\"The current block timestamp.\",\"trustedTimestamp\":\"Timestamp of the trusted consensus state.\",\"trustingPeriod\":\"The configured trusting period.\"}}],\"ConsensusStateNotFound(uint64)\":[{\"params\":{\"revisionHeight\":\"The requested revision height.\"}}],\"DuplicateCommitSealSigner(address)\":[{\"params\":{\"signer\":\"The duplicate signer address.\"}}],\"DuplicateValidator(address)\":[{\"params\":{\"validator\":\"The duplicate validator address.\"}}],\"HeaderFromFuture(uint256,uint256,uint256)\":[{\"params\":{\"currentTimestamp\":\"The current block timestamp.\",\"headerTimestamp\":\"The submitted header timestamp.\",\"maxClockDrift\":\"The configured maximum clock drift.\"}}],\"InsufficientTrustedValidatorOverlap(uint256,uint256)\":[{\"params\":{\"actual\":\"The number of trusted validators that signed.\",\"required\":\"The minimum required trusted signer count.\"}}],\"InsufficientValidatorQuorum(uint256,uint256)\":[{\"params\":{\"actual\":\"The number of new validators that signed.\",\"required\":\"The minimum required signer count.\"}}],\"InvalidCommitmentValue(bytes32,bytes32)\":[{\"params\":{\"actualValue\":\"The proven commitment value.\",\"expectedValue\":\"The expected commitment value.\"}}],\"InvalidDifficulty(uint256)\":[{\"params\":{\"actualDifficulty\":\"The difficulty found in the header.\"}}],\"InvalidECDSASignatureLength(uint256)\":[{\"params\":{\"length\":\"The invalid signature length.\"}}],\"InvalidExtraDataFormat(uint256)\":[{\"params\":{\"itemsLength\":\"The decoded `extraData` item count.\"}}],\"InvalidHeaderFormat(uint256)\":[{\"params\":{\"itemsLength\":\"The decoded header item count.\"}}],\"InvalidMixHash(bytes32)\":[{\"params\":{\"actualMixHash\":\"The mix hash found in the header.\"}}],\"InvalidNonce(bytes)\":[{\"params\":{\"actualNonce\":\"The nonce found in the header.\"}}],\"InvalidOmmersHash(bytes32)\":[{\"params\":{\"actualOmmersHash\":\"The ommers hash found in the header.\"}}],\"InvalidPathLength(uint256,uint256)\":[{\"params\":{\"actualLength\":\"The actual path length.\",\"expectedLength\":\"The expected path length.\"}}],\"InvalidRevisionNumber(uint64)\":[{\"params\":{\"providedRevisionNumber\":\"The non-zero revision number.\"}}],\"InvalidValidatorAddress(address)\":[{\"params\":{\"validator\":\"The invalid validator address.\"}}],\"InvalidValidatorAddressLength(uint256)\":[{\"params\":{\"length\":\"The decoded validator address length.\"}}],\"InvalidValueLength(uint256,uint256)\":[{\"params\":{\"actualLength\":\"The actual value length.\",\"expectedLength\":\"The expected value length.\"}}],\"ValueExists(bytes32)\":[{\"params\":{\"actualValue\":\"The value found at the proven storage slot.\"}}]},\"events\":{\"RoleAdminChanged(bytes32,bytes32,bytes32)\":{\"details\":\"Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite {RoleAdminChanged} not being emitted to signal this.\"},\"RoleGranted(bytes32,address,address)\":{\"details\":\"Emitted when `account` is granted `role`. `sender` is the account that originated the contract call. This account bears the admin role (for the granted role). Expected in cases where the role was granted using the internal {AccessControl-_grantRole}.\"},\"RoleRevoked(bytes32,address,address)\":{\"details\":\"Emitted when `account` is revoked `role`. `sender` is the account that originated the contract call: - if using `revokeRole`, it is the admin role bearer - if using `renounceRole`, it is the role bearer (i.e. `account`)\"}},\"kind\":\"dev\",\"methods\":{\"constructor\":{\"params\":{\"ibcRouter\":\"Counterparty ICS26 router address whose storage is proven.\",\"initialTrustedHeight\":\"Initial trusted Besu height.\",\"initialTrustedStorageRoot\":\"Initial trusted storage root of `ibcRouter`.\",\"initialTrustedTimestamp\":\"Initial trusted header timestamp in seconds.\",\"initialTrustedValidators\":\"Initial trusted validator set.\",\"maxClockDrift\":\"Maximum allowed future drift in seconds for submitted headers.\",\"roleManager\":\"Address that administers proof submission; if zero, proof submission is open.\",\"trustingPeriod\":\"Maximum age in seconds for trusted consensus states.\"}},\"getClientState()\":{\"returns\":{\"_0\":\"The client state.\"}},\"getConsensusState(uint64)\":{\"params\":{\"revisionHeight\":\"The revision height to query.\"},\"returns\":{\"_0\":\"The ABI-encoded consensus state.\"}},\"getRoleAdmin(bytes32)\":{\"details\":\"Returns the admin role that controls `role`. See {grantRole} and {revokeRole}. To change a role's admin, use {_setRoleAdmin}.\"},\"grantRole(bytes32,address)\":{\"details\":\"Grants `role` to `account`. If `account` had not been already granted `role`, emits a {RoleGranted} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleGranted} event.\"},\"hasRole(bytes32,address)\":{\"details\":\"Returns `true` if `account` has been granted `role`.\"},\"misbehaviour(bytes)\":{\"params\":{\"misbehaviourMsg\":\"The misbehaviour message\"}},\"renounceRole(bytes32,address)\":{\"details\":\"Revokes `role` from the calling account. Roles are often managed via {grantRole} and {revokeRole}: this function's purpose is to provide a mechanism for accounts to lose their privileges if they are compromised (such as when a trusted device is misplaced). If the calling account had been revoked `role`, emits a {RoleRevoked} event. Requirements: - the caller must be `callerConfirmation`. May emit a {RoleRevoked} event.\"},\"revokeRole(bytes32,address)\":{\"details\":\"Revokes `role` from `account`. If `account` had been granted `role`, emits a {RoleRevoked} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleRevoked} event.\"},\"supportsInterface(bytes4)\":{\"details\":\"Returns true if this contract implements the interface defined by `interfaceId`. See the corresponding https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[ERC section] to learn more about how these ids are created. This function call must use less than 30 000 gas.\"},\"updateClient(bytes)\":{\"params\":{\"updateMsg\":\"The encoded update message e.g., an SP1 proof.\"},\"returns\":{\"_0\":\"The result of the update operation\"}},\"verifyMembership((bytes,(uint64,uint64),bytes[],bytes))\":{\"details\":\"Notice that this message is not view, as it may update the client state for caching purposes.\",\"params\":{\"msg_\":\"The membership message\"},\"returns\":{\"_0\":\"The unix timestamp of the verification height in the counterparty chain in seconds.\"}},\"verifyNonMembership((bytes,(uint64,uint64),bytes[]))\":{\"details\":\"Notice that this message is not view, as it may update the client state for caching purposes.\",\"params\":{\"msg_\":\"The membership message\"},\"returns\":{\"_0\":\"The unix timestamp of the verification height in the counterparty chain in seconds.\"}}},\"title\":\"Besu IBFT2 Light Client\",\"version\":1},\"userdoc\":{\"errors\":{\"ConflictingConsensusState(uint64)\":[{\"notice\":\"A different consensus state already exists at the submitted height.\"}],\"ConsensusStateExpired(uint64,uint256,uint64)\":[{\"notice\":\"The trusted consensus state is outside the trusting period.\"}],\"ConsensusStateNotFound(uint64)\":[{\"notice\":\"No consensus state exists for the requested height.\"}],\"DuplicateCommitSealSigner(address)\":[{\"notice\":\"A commit seal signer appears more than once.\"}],\"DuplicateValidator(address)\":[{\"notice\":\"A validator appears more than once.\"}],\"EmptyValidatorSet()\":[{\"notice\":\"The validator set is empty.\"}],\"HeaderFromFuture(uint256,uint256,uint256)\":[{\"notice\":\"The submitted header timestamp is too far in the future.\"}],\"InsufficientTrustedValidatorOverlap(uint256,uint256)\":[{\"notice\":\"The submitted signers do not overlap enough with the trusted validator set.\"}],\"InsufficientValidatorQuorum(uint256,uint256)\":[{\"notice\":\"The submitted signers do not meet quorum for the new validator set.\"}],\"InvalidCommitSeal()\":[{\"notice\":\"A commit seal did not recover a valid signer.\"}],\"InvalidCommitmentValue(bytes32,bytes32)\":[{\"notice\":\"A proven commitment value does not match the expected value.\"}],\"InvalidDifficulty(uint256)\":[{\"notice\":\"The Besu BFT difficulty is invalid.\"}],\"InvalidECDSASignatureLength(uint256)\":[{\"notice\":\"An ECDSA signature has an invalid length.\"}],\"InvalidExtraDataFormat(uint256)\":[{\"notice\":\"The submitted `extraData` field has an invalid RLP item count.\"}],\"InvalidHeaderFormat(uint256)\":[{\"notice\":\"The submitted header has an invalid RLP item count.\"}],\"InvalidHeaderHeight()\":[{\"notice\":\"The submitted header height is zero.\"}],\"InvalidMixHash(bytes32)\":[{\"notice\":\"The Besu BFT mix hash is invalid.\"}],\"InvalidNonce(bytes)\":[{\"notice\":\"The Besu BFT nonce is invalid.\"}],\"InvalidOmmersHash(bytes32)\":[{\"notice\":\"The ommers hash is invalid.\"}],\"InvalidPathLength(uint256,uint256)\":[{\"notice\":\"A proof path has an invalid length.\"}],\"InvalidRevisionNumber(uint64)\":[{\"notice\":\"The revision number must be zero for Besu light client heights.\"}],\"InvalidValidatorAddress(address)\":[{\"notice\":\"A validator address is invalid.\"}],\"InvalidValidatorAddressLength(uint256)\":[{\"notice\":\"A validator address has an invalid byte length.\"}],\"InvalidValueLength(uint256,uint256)\":[{\"notice\":\"A membership value has an invalid length.\"}],\"UnsupportedMisbehaviour()\":[{\"notice\":\"Misbehaviour handling is not supported by this client.\"}],\"ValueExists(bytes32)\":[{\"notice\":\"A non-membership proof found an existing value.\"}]},\"kind\":\"user\",\"methods\":{\"PROOF_SUBMITTER_ROLE()\":{\"notice\":\"Role allowed to submit client updates and proof verifications.\"},\"constructor\":{\"notice\":\"Creates a Besu IBFT2 light client from an initial trusted consensus state.\"},\"getClientState()\":{\"notice\":\"Returns the client state.\"},\"getConsensusState(uint64)\":{\"notice\":\"Returns the encoded consensus state for a revision height.\"},\"misbehaviour(bytes)\":{\"notice\":\"Misbehaviour handling, moves the light client to the frozen state if misbehaviour is detected\"},\"updateClient(bytes)\":{\"notice\":\"Updating the client and consensus state\"},\"verifyMembership((bytes,(uint64,uint64),bytes[],bytes))\":{\"notice\":\"Querying the membership of a key-value pair\"},\"verifyNonMembership((bytes,(uint64,uint64),bytes[]))\":{\"notice\":\"Querying the non-membership of a key\"}},\"notice\":\"Verifies Besu IBFT 2.0 headers and ICS26 router storage proofs.\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/light-clients/besu/BesuIBFT2LightClient.sol\":\"BesuIBFT2LightClient\"},\"evmVersion\":\"cancun\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"none\"},\"optimizer\":{\"enabled\":true,\"runs\":10000},\"remappings\":[\":@openzeppelin-contracts/=node_modules/@openzeppelin/contracts/\",\":@openzeppelin-upgradeable/=node_modules/@openzeppelin/contracts-upgradeable/\",\":@openzeppelin/=node_modules/@openzeppelin/\",\":@sp1-contracts/=node_modules/sp1-contracts/contracts/src/\",\":@uniswap/permit2/=node_modules/@uniswap/permit2/\",\":forge-std/=node_modules/forge-std/src/\",\":sp1-contracts/=node_modules/sp1-contracts/\"],\"viaIR\":true},\"sources\":{\"contracts/interfaces/ILightClient.sol\":{\"keccak256\":\"0x3b2361546ee834a442d844c979fbad3458ee13146b093f585587a09e19a266af\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://5b5d53101bb598f14a79cb1092479736fa18e8f84945ea6ef80f4dac84466042\",\"dweb:/ipfs/QmaTCo6M3Z9aYCSX65AQtixo1sB4ymQUDAgTXSKHqJHGDh\"]},\"contracts/light-clients/besu/BesuIBFT2LightClient.sol\":{\"keccak256\":\"0xeb02b0e8e66eddd178008e1070654974249c6d194ec88f704be73d2e3cfe0aed\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://110b67cddc218a288c4a18f7c288665c4c4788cfab2e296158efc34397499b58\",\"dweb:/ipfs/QmTdY238hzZX4ok9g1o1J52FdVqQsMZXQoFgRMYoZWqq9k\"]},\"contracts/light-clients/besu/BesuLightClientBase.sol\":{\"keccak256\":\"0xd700a74d5dd85a4dc0432f9fda2e787d78670647417e54416a07af85bb42194a\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://92069fbd0993510316fb3e9eba5dde45316cc6d3fd979c75b3485253709caa88\",\"dweb:/ipfs/QmeuXFNzqe5JYwkZwLBA7LSni4LuQAWgy7t7jbfHXAKNtz\"]},\"contracts/light-clients/besu/MPTProof.sol\":{\"keccak256\":\"0xe79077eef64b0a5901e83174bb0643dd71887d3d1b75a230e3c6d98230fe61a1\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://f828f699316e27a9449c4da03471f8a228c2919e93a5575dd331dfd7278de61b\",\"dweb:/ipfs/QmNzjoyYNyuFqn7tS7HteYhyTKS77iy7QhBwMc1rDDJcPY\"]},\"contracts/light-clients/besu/RLPReader.sol\":{\"keccak256\":\"0xa64ad17e6da7fed2bd206df52189286694339a8061dc5d158e717eda982af1d9\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://7020db2fe854e90e1b791e0e587610fc26bed3073ba1811faa275a1d8bf3c2c7\",\"dweb:/ipfs/QmdXdKghNFZSX7N9qD6BsKuJQdrFoqatsVWvHRL7vJCmeP\"]},\"contracts/light-clients/besu/errors/IBesuLightClientErrors.sol\":{\"keccak256\":\"0x1124e58e906cd3dddf876757393a4e4812170e4ae41da99a1d0b734266ae021b\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://54d7d62a6ef3af5d32eb3c293499f90223a0f349b1475b3dad6af443106041d4\",\"dweb:/ipfs/QmdSJQup9PvvB3hpnWZu3YE2Rh5kTcAs9zGBHsMyAdCKCX\"]},\"contracts/light-clients/besu/msgs/IBesuLightClientMsgs.sol\":{\"keccak256\":\"0x3a903fd7635a040041b94f4e33dc2881c8992bd22acb14cce72aeab074b820be\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://25d72c46f4bf1b6335f1c62c8d55f3e3643a41f75ffba160cb137bed57d7854c\",\"dweb:/ipfs/QmepY12FQmcMned3fbMt1K3mfELZwq9uiMKxS41yLDAxV3\"]},\"contracts/msgs/IICS02ClientMsgs.sol\":{\"keccak256\":\"0x03d1265eae327c3744d774bf22a30d845233d50664921c9aa57cef2d71fd89d2\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://89900781cc5c60540a237d92d42745ea6165765ee8fb4d50e8137a717195cc75\",\"dweb:/ipfs/Qmbx5p8gZ8sEMMeZytXsLee49JUayhAaoJ2yxX93WUrvQo\"]},\"contracts/msgs/ILightClientMsgs.sol\":{\"keccak256\":\"0x8d1e56ab166a7b4aa6999708e3214a4645ebbc3835c2b2a4c255c9923eebafde\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://8bd4200dc04d950c0f050623fa9a8accdbec877fd446c039d4dd6c678bdf1513\",\"dweb:/ipfs/QmZQTViaA7N6BVNDzJ1Z6w799PrPoE4ajPueZSPwX4sGZ9\"]},\"node_modules/@openzeppelin/contracts/access/AccessControl.sol\":{\"keccak256\":\"0x4686ec784d75f95beaf2bf5b5f26e5f946d4c864aaee9c3c62bdc18381f5e017\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://26710ca191913f3c9df542079c4a6dcff02968e92d4f7357daefef9fbe72a19c\",\"dweb:/ipfs/QmanHbeWuBbVEqXySHa1zhm2rExjYpChDBubBaJNTCa2JB\"]},\"node_modules/@openzeppelin/contracts/access/IAccessControl.sol\":{\"keccak256\":\"0xbff9f59c84e5337689161ce7641c0ef8e872d6a7536fbc1f5133f128887aba3c\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://b308f882e796f7b79c9502deacb0a62983035c6f6f4e962b319ba6a1f4a77d3d\",\"dweb:/ipfs/QmaWCW7ahEQqFjwhSUhV7Ae7WhfNvzSpE7DQ58hvEooqPL\"]},\"node_modules/@openzeppelin/contracts/utils/Context.sol\":{\"keccak256\":\"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://6a708e8a5bdb1011c2c381c9a5cfd8a9a956d7d0a9dc1bd8bcdaf52f76ef2f12\",\"dweb:/ipfs/Qmax9WHBnVsZP46ZxEMNRQpLQnrdE4dK8LehML1Py8FowF\"]},\"node_modules/@openzeppelin/contracts/utils/cryptography/ECDSA.sol\":{\"keccak256\":\"0xbeb5cad8aaabe0d35d2ec1a8414d91e81e5a8ca679add4cf57e2f33476861f40\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://ebb272a5ee2da4e8bd5551334e0ce8dce4e9c56a04570d6bf046d260fab3116a\",\"dweb:/ipfs/QmNw6RyM769qcqFocDq6HJMG2WiEnQbvizpRaUXsACHho2\"]},\"node_modules/@openzeppelin/contracts/utils/introspection/ERC165.sol\":{\"keccak256\":\"0x2d9dc2fe26180f74c11c13663647d38e259e45f95eb88f57b61d2160b0109d3e\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://81233d1f98060113d9922180bb0f14f8335856fe9f339134b09335e9f678c377\",\"dweb:/ipfs/QmWh6R35SarhAn4z2wH8SU456jJSYL2FgucfTFgbHJJN4E\"]},\"node_modules/@openzeppelin/contracts/utils/introspection/IERC165.sol\":{\"keccak256\":\"0x8891738ffe910f0cf2da09566928589bf5d63f4524dd734fd9cedbac3274dd5c\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://971f954442df5c2ef5b5ebf1eb245d7105d9fbacc7386ee5c796df1d45b21617\",\"dweb:/ipfs/QmadRjHbkicwqwwh61raUEapaVEtaLMcYbQZWs9gUkgj3u\"]}},\"version\":1}","metadata":{"compiler":{"version":"0.8.28+commit.7893614a"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"address","name":"ibcRouter","type":"address"},{"internalType":"uint64","name":"initialTrustedHeight","type":"uint64"},{"internalType":"uint64","name":"initialTrustedTimestamp","type":"uint64"},{"internalType":"bytes32","name":"initialTrustedStorageRoot","type":"bytes32"},{"internalType":"address[]","name":"initialTrustedValidators","type":"address[]"},{"internalType":"uint64","name":"trustingPeriod","type":"uint64"},{"internalType":"uint64","name":"maxClockDrift","type":"uint64"},{"internalType":"address","name":"roleManager","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"type":"error","name":"AccessControlBadConfirmation"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bytes32","name":"neededRole","type":"bytes32"}],"type":"error","name":"AccessControlUnauthorizedAccount"},{"inputs":[{"internalType":"uint64","name":"revisionHeight","type":"uint64"}],"type":"error","name":"ConflictingConsensusState"},{"inputs":[{"internalType":"uint64","name":"trustedTimestamp","type":"uint64"},{"internalType":"uint256","name":"currentTimestamp","type":"uint256"},{"internalType":"uint64","name":"trustingPeriod","type":"uint64"}],"type":"error","name":"ConsensusStateExpired"},{"inputs":[{"internalType":"uint64","name":"revisionHeight","type":"uint64"}],"type":"error","name":"ConsensusStateNotFound"},{"inputs":[{"internalType":"address","name":"signer","type":"address"}],"type":"error","name":"DuplicateCommitSealSigner"},{"inputs":[{"internalType":"address","name":"validator","type":"address"}],"type":"error","name":"DuplicateValidator"},{"inputs":[],"type":"error","name":"EmptyValidatorSet"},{"inputs":[{"internalType":"uint256","name":"currentTimestamp","type":"uint256"},{"internalType":"uint256","name":"headerTimestamp","type":"uint256"},{"internalType":"uint256","name":"maxClockDrift","type":"uint256"}],"type":"error","name":"HeaderFromFuture"},{"inputs":[{"internalType":"uint256","name":"actual","type":"uint256"},{"internalType":"uint256","name":"required","type":"uint256"}],"type":"error","name":"InsufficientTrustedValidatorOverlap"},{"inputs":[{"internalType":"uint256","name":"actual","type":"uint256"},{"internalType":"uint256","name":"required","type":"uint256"}],"type":"error","name":"InsufficientValidatorQuorum"},{"inputs":[],"type":"error","name":"InvalidCommitSeal"},{"inputs":[{"internalType":"bytes32","name":"expectedValue","type":"bytes32"},{"internalType":"bytes32","name":"actualValue","type":"bytes32"}],"type":"error","name":"InvalidCommitmentValue"},{"inputs":[{"internalType":"uint256","name":"actualDifficulty","type":"uint256"}],"type":"error","name":"InvalidDifficulty"},{"inputs":[{"internalType":"uint256","name":"length","type":"uint256"}],"type":"error","name":"InvalidECDSASignatureLength"},{"inputs":[{"internalType":"uint256","name":"itemsLength","type":"uint256"}],"type":"error","name":"InvalidExtraDataFormat"},{"inputs":[{"internalType":"uint256","name":"itemsLength","type":"uint256"}],"type":"error","name":"InvalidHeaderFormat"},{"inputs":[],"type":"error","name":"InvalidHeaderHeight"},{"inputs":[{"internalType":"bytes32","name":"actualMixHash","type":"bytes32"}],"type":"error","name":"InvalidMixHash"},{"inputs":[{"internalType":"bytes","name":"actualNonce","type":"bytes"}],"type":"error","name":"InvalidNonce"},{"inputs":[{"internalType":"bytes32","name":"actualOmmersHash","type":"bytes32"}],"type":"error","name":"InvalidOmmersHash"},{"inputs":[{"internalType":"uint256","name":"expectedLength","type":"uint256"},{"internalType":"uint256","name":"actualLength","type":"uint256"}],"type":"error","name":"InvalidPathLength"},{"inputs":[{"internalType":"uint64","name":"providedRevisionNumber","type":"uint64"}],"type":"error","name":"InvalidRevisionNumber"},{"inputs":[{"internalType":"address","name":"validator","type":"address"}],"type":"error","name":"InvalidValidatorAddress"},{"inputs":[{"internalType":"uint256","name":"length","type":"uint256"}],"type":"error","name":"InvalidValidatorAddressLength"},{"inputs":[{"internalType":"uint256","name":"expectedLength","type":"uint256"},{"internalType":"uint256","name":"actualLength","type":"uint256"}],"type":"error","name":"InvalidValueLength"},{"inputs":[],"type":"error","name":"UnsupportedMisbehaviour"},{"inputs":[{"internalType":"bytes32","name":"actualValue","type":"bytes32"}],"type":"error","name":"ValueExists"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32","indexed":true},{"internalType":"bytes32","name":"previousAdminRole","type":"bytes32","indexed":true},{"internalType":"bytes32","name":"newAdminRole","type":"bytes32","indexed":true}],"type":"event","name":"RoleAdminChanged","anonymous":false},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32","indexed":true},{"internalType":"address","name":"account","type":"address","indexed":true},{"internalType":"address","name":"sender","type":"address","indexed":true}],"type":"event","name":"RoleGranted","anonymous":false},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32","indexed":true},{"internalType":"address","name":"account","type":"address","indexed":true},{"internalType":"address","name":"sender","type":"address","indexed":true}],"type":"event","name":"RoleRevoked","anonymous":false},{"inputs":[],"stateMutability":"view","type":"function","name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"PROOF_SUBMITTER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"getClientState","outputs":[{"internalType":"bytes","name":"","type":"bytes"}]},{"inputs":[{"internalType":"uint64","name":"revisionHeight","type":"uint64"}],"stateMutability":"view","type":"function","name":"getConsensusState","outputs":[{"internalType":"bytes","name":"","type":"bytes"}]},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"stateMutability":"view","type":"function","name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}]},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"stateMutability":"nonpayable","type":"function","name":"grantRole"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"stateMutability":"view","type":"function","name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}]},{"inputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function","name":"misbehaviour"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"callerConfirmation","type":"address"}],"stateMutability":"nonpayable","type":"function","name":"renounceRole"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"stateMutability":"nonpayable","type":"function","name":"revokeRole"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"stateMutability":"view","type":"function","name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}]},{"inputs":[{"internalType":"bytes","name":"updateMsg","type":"bytes"}],"stateMutability":"nonpayable","type":"function","name":"updateClient","outputs":[{"internalType":"enum ILightClientMsgs.UpdateResult","name":"","type":"uint8"}]},{"inputs":[{"internalType":"struct ILightClientMsgs.MsgVerifyMembership","name":"msg_","type":"tuple","components":[{"internalType":"bytes","name":"proof","type":"bytes"},{"internalType":"struct IICS02ClientMsgs.Height","name":"proofHeight","type":"tuple","components":[{"internalType":"uint64","name":"revisionNumber","type":"uint64"},{"internalType":"uint64","name":"revisionHeight","type":"uint64"}]},{"internalType":"bytes[]","name":"path","type":"bytes[]"},{"internalType":"bytes","name":"value","type":"bytes"}]}],"stateMutability":"view","type":"function","name":"verifyMembership","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[{"internalType":"struct ILightClientMsgs.MsgVerifyNonMembership","name":"msg_","type":"tuple","components":[{"internalType":"bytes","name":"proof","type":"bytes"},{"internalType":"struct IICS02ClientMsgs.Height","name":"proofHeight","type":"tuple","components":[{"internalType":"uint64","name":"revisionNumber","type":"uint64"},{"internalType":"uint64","name":"revisionHeight","type":"uint64"}]},{"internalType":"bytes[]","name":"path","type":"bytes[]"}]}],"stateMutability":"view","type":"function","name":"verifyNonMembership","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]}],"devdoc":{"kind":"dev","methods":{"constructor":{"params":{"ibcRouter":"Counterparty ICS26 router address whose storage is proven.","initialTrustedHeight":"Initial trusted Besu height.","initialTrustedStorageRoot":"Initial trusted storage root of `ibcRouter`.","initialTrustedTimestamp":"Initial trusted header timestamp in seconds.","initialTrustedValidators":"Initial trusted validator set.","maxClockDrift":"Maximum allowed future drift in seconds for submitted headers.","roleManager":"Address that administers proof submission; if zero, proof submission is open.","trustingPeriod":"Maximum age in seconds for trusted consensus states."}},"getClientState()":{"returns":{"_0":"The client state."}},"getConsensusState(uint64)":{"params":{"revisionHeight":"The revision height to query."},"returns":{"_0":"The ABI-encoded consensus state."}},"getRoleAdmin(bytes32)":{"details":"Returns the admin role that controls `role`. See {grantRole} and {revokeRole}. To change a role's admin, use {_setRoleAdmin}."},"grantRole(bytes32,address)":{"details":"Grants `role` to `account`. If `account` had not been already granted `role`, emits a {RoleGranted} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleGranted} event."},"hasRole(bytes32,address)":{"details":"Returns `true` if `account` has been granted `role`."},"misbehaviour(bytes)":{"params":{"misbehaviourMsg":"The misbehaviour message"}},"renounceRole(bytes32,address)":{"details":"Revokes `role` from the calling account. Roles are often managed via {grantRole} and {revokeRole}: this function's purpose is to provide a mechanism for accounts to lose their privileges if they are compromised (such as when a trusted device is misplaced). If the calling account had been revoked `role`, emits a {RoleRevoked} event. Requirements: - the caller must be `callerConfirmation`. May emit a {RoleRevoked} event."},"revokeRole(bytes32,address)":{"details":"Revokes `role` from `account`. If `account` had been granted `role`, emits a {RoleRevoked} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleRevoked} event."},"supportsInterface(bytes4)":{"details":"Returns true if this contract implements the interface defined by `interfaceId`. See the corresponding https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[ERC section] to learn more about how these ids are created. This function call must use less than 30 000 gas."},"updateClient(bytes)":{"params":{"updateMsg":"The encoded update message e.g., an SP1 proof."},"returns":{"_0":"The result of the update operation"}},"verifyMembership((bytes,(uint64,uint64),bytes[],bytes))":{"details":"Notice that this message is not view, as it may update the client state for caching purposes.","params":{"msg_":"The membership message"},"returns":{"_0":"The unix timestamp of the verification height in the counterparty chain in seconds."}},"verifyNonMembership((bytes,(uint64,uint64),bytes[]))":{"details":"Notice that this message is not view, as it may update the client state for caching purposes.","params":{"msg_":"The membership message"},"returns":{"_0":"The unix timestamp of the verification height in the counterparty chain in seconds."}}},"version":1},"userdoc":{"kind":"user","methods":{"PROOF_SUBMITTER_ROLE()":{"notice":"Role allowed to submit client updates and proof verifications."},"constructor":{"notice":"Creates a Besu IBFT2 light client from an initial trusted consensus state."},"getClientState()":{"notice":"Returns the client state."},"getConsensusState(uint64)":{"notice":"Returns the encoded consensus state for a revision height."},"misbehaviour(bytes)":{"notice":"Misbehaviour handling, moves the light client to the frozen state if misbehaviour is detected"},"updateClient(bytes)":{"notice":"Updating the client and consensus state"},"verifyMembership((bytes,(uint64,uint64),bytes[],bytes))":{"notice":"Querying the membership of a key-value pair"},"verifyNonMembership((bytes,(uint64,uint64),bytes[]))":{"notice":"Querying the non-membership of a key"}},"version":1}},"settings":{"remappings":["@openzeppelin-contracts/=node_modules/@openzeppelin/contracts/","@openzeppelin-upgradeable/=node_modules/@openzeppelin/contracts-upgradeable/","@openzeppelin/=node_modules/@openzeppelin/","@sp1-contracts/=node_modules/sp1-contracts/contracts/src/","@uniswap/permit2/=node_modules/@uniswap/permit2/","forge-std/=node_modules/forge-std/src/","sp1-contracts/=node_modules/sp1-contracts/"],"optimizer":{"enabled":true,"runs":10000},"metadata":{"bytecodeHash":"none"},"compilationTarget":{"contracts/light-clients/besu/BesuIBFT2LightClient.sol":"BesuIBFT2LightClient"},"evmVersion":"cancun","libraries":{},"viaIR":true},"sources":{"contracts/interfaces/ILightClient.sol":{"keccak256":"0x3b2361546ee834a442d844c979fbad3458ee13146b093f585587a09e19a266af","urls":["bzz-raw://5b5d53101bb598f14a79cb1092479736fa18e8f84945ea6ef80f4dac84466042","dweb:/ipfs/QmaTCo6M3Z9aYCSX65AQtixo1sB4ymQUDAgTXSKHqJHGDh"],"license":"Apache-2.0"},"contracts/light-clients/besu/BesuIBFT2LightClient.sol":{"keccak256":"0xeb02b0e8e66eddd178008e1070654974249c6d194ec88f704be73d2e3cfe0aed","urls":["bzz-raw://110b67cddc218a288c4a18f7c288665c4c4788cfab2e296158efc34397499b58","dweb:/ipfs/QmTdY238hzZX4ok9g1o1J52FdVqQsMZXQoFgRMYoZWqq9k"],"license":"MIT"},"contracts/light-clients/besu/BesuLightClientBase.sol":{"keccak256":"0xd700a74d5dd85a4dc0432f9fda2e787d78670647417e54416a07af85bb42194a","urls":["bzz-raw://92069fbd0993510316fb3e9eba5dde45316cc6d3fd979c75b3485253709caa88","dweb:/ipfs/QmeuXFNzqe5JYwkZwLBA7LSni4LuQAWgy7t7jbfHXAKNtz"],"license":"MIT"},"contracts/light-clients/besu/MPTProof.sol":{"keccak256":"0xe79077eef64b0a5901e83174bb0643dd71887d3d1b75a230e3c6d98230fe61a1","urls":["bzz-raw://f828f699316e27a9449c4da03471f8a228c2919e93a5575dd331dfd7278de61b","dweb:/ipfs/QmNzjoyYNyuFqn7tS7HteYhyTKS77iy7QhBwMc1rDDJcPY"],"license":"Apache-2.0"},"contracts/light-clients/besu/RLPReader.sol":{"keccak256":"0xa64ad17e6da7fed2bd206df52189286694339a8061dc5d158e717eda982af1d9","urls":["bzz-raw://7020db2fe854e90e1b791e0e587610fc26bed3073ba1811faa275a1d8bf3c2c7","dweb:/ipfs/QmdXdKghNFZSX7N9qD6BsKuJQdrFoqatsVWvHRL7vJCmeP"],"license":"Apache-2.0"},"contracts/light-clients/besu/errors/IBesuLightClientErrors.sol":{"keccak256":"0x1124e58e906cd3dddf876757393a4e4812170e4ae41da99a1d0b734266ae021b","urls":["bzz-raw://54d7d62a6ef3af5d32eb3c293499f90223a0f349b1475b3dad6af443106041d4","dweb:/ipfs/QmdSJQup9PvvB3hpnWZu3YE2Rh5kTcAs9zGBHsMyAdCKCX"],"license":"MIT"},"contracts/light-clients/besu/msgs/IBesuLightClientMsgs.sol":{"keccak256":"0x3a903fd7635a040041b94f4e33dc2881c8992bd22acb14cce72aeab074b820be","urls":["bzz-raw://25d72c46f4bf1b6335f1c62c8d55f3e3643a41f75ffba160cb137bed57d7854c","dweb:/ipfs/QmepY12FQmcMned3fbMt1K3mfELZwq9uiMKxS41yLDAxV3"],"license":"MIT"},"contracts/msgs/IICS02ClientMsgs.sol":{"keccak256":"0x03d1265eae327c3744d774bf22a30d845233d50664921c9aa57cef2d71fd89d2","urls":["bzz-raw://89900781cc5c60540a237d92d42745ea6165765ee8fb4d50e8137a717195cc75","dweb:/ipfs/Qmbx5p8gZ8sEMMeZytXsLee49JUayhAaoJ2yxX93WUrvQo"],"license":"Apache-2.0"},"contracts/msgs/ILightClientMsgs.sol":{"keccak256":"0x8d1e56ab166a7b4aa6999708e3214a4645ebbc3835c2b2a4c255c9923eebafde","urls":["bzz-raw://8bd4200dc04d950c0f050623fa9a8accdbec877fd446c039d4dd6c678bdf1513","dweb:/ipfs/QmZQTViaA7N6BVNDzJ1Z6w799PrPoE4ajPueZSPwX4sGZ9"],"license":"Apache-2.0"},"node_modules/@openzeppelin/contracts/access/AccessControl.sol":{"keccak256":"0x4686ec784d75f95beaf2bf5b5f26e5f946d4c864aaee9c3c62bdc18381f5e017","urls":["bzz-raw://26710ca191913f3c9df542079c4a6dcff02968e92d4f7357daefef9fbe72a19c","dweb:/ipfs/QmanHbeWuBbVEqXySHa1zhm2rExjYpChDBubBaJNTCa2JB"],"license":"MIT"},"node_modules/@openzeppelin/contracts/access/IAccessControl.sol":{"keccak256":"0xbff9f59c84e5337689161ce7641c0ef8e872d6a7536fbc1f5133f128887aba3c","urls":["bzz-raw://b308f882e796f7b79c9502deacb0a62983035c6f6f4e962b319ba6a1f4a77d3d","dweb:/ipfs/QmaWCW7ahEQqFjwhSUhV7Ae7WhfNvzSpE7DQ58hvEooqPL"],"license":"MIT"},"node_modules/@openzeppelin/contracts/utils/Context.sol":{"keccak256":"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2","urls":["bzz-raw://6a708e8a5bdb1011c2c381c9a5cfd8a9a956d7d0a9dc1bd8bcdaf52f76ef2f12","dweb:/ipfs/Qmax9WHBnVsZP46ZxEMNRQpLQnrdE4dK8LehML1Py8FowF"],"license":"MIT"},"node_modules/@openzeppelin/contracts/utils/cryptography/ECDSA.sol":{"keccak256":"0xbeb5cad8aaabe0d35d2ec1a8414d91e81e5a8ca679add4cf57e2f33476861f40","urls":["bzz-raw://ebb272a5ee2da4e8bd5551334e0ce8dce4e9c56a04570d6bf046d260fab3116a","dweb:/ipfs/QmNw6RyM769qcqFocDq6HJMG2WiEnQbvizpRaUXsACHho2"],"license":"MIT"},"node_modules/@openzeppelin/contracts/utils/introspection/ERC165.sol":{"keccak256":"0x2d9dc2fe26180f74c11c13663647d38e259e45f95eb88f57b61d2160b0109d3e","urls":["bzz-raw://81233d1f98060113d9922180bb0f14f8335856fe9f339134b09335e9f678c377","dweb:/ipfs/QmWh6R35SarhAn4z2wH8SU456jJSYL2FgucfTFgbHJJN4E"],"license":"MIT"},"node_modules/@openzeppelin/contracts/utils/introspection/IERC165.sol":{"keccak256":"0x8891738ffe910f0cf2da09566928589bf5d63f4524dd734fd9cedbac3274dd5c","urls":["bzz-raw://971f954442df5c2ef5b5ebf1eb245d7105d9fbacc7386ee5c796df1d45b21617","dweb:/ipfs/QmadRjHbkicwqwwh61raUEapaVEtaLMcYbQZWs9gUkgj3u"],"license":"MIT"}},"version":1},"id":34} \ No newline at end of file +{"abi":[{"type":"constructor","inputs":[{"name":"ibcRouter","type":"address","internalType":"address"},{"name":"initialTrustedHeight","type":"uint64","internalType":"uint64"},{"name":"initialTrustedTimestamp","type":"uint64","internalType":"uint64"},{"name":"initialTrustedStorageRoot","type":"bytes32","internalType":"bytes32"},{"name":"initialTrustedValidators","type":"address[]","internalType":"address[]"},{"name":"trustingPeriod","type":"uint64","internalType":"uint64"},{"name":"maxClockDrift","type":"uint64","internalType":"uint64"},{"name":"roleManager","type":"address","internalType":"address"}],"stateMutability":"nonpayable"},{"type":"function","name":"DEFAULT_ADMIN_ROLE","inputs":[],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"type":"function","name":"PROOF_SUBMITTER_ROLE","inputs":[],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"type":"function","name":"getClientState","inputs":[],"outputs":[{"name":"","type":"bytes","internalType":"bytes"}],"stateMutability":"view"},{"type":"function","name":"getConsensusState","inputs":[{"name":"revisionHeight","type":"uint64","internalType":"uint64"}],"outputs":[{"name":"","type":"bytes","internalType":"bytes"}],"stateMutability":"view"},{"type":"function","name":"getRoleAdmin","inputs":[{"name":"role","type":"bytes32","internalType":"bytes32"}],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"type":"function","name":"grantRole","inputs":[{"name":"role","type":"bytes32","internalType":"bytes32"},{"name":"account","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"hasRole","inputs":[{"name":"role","type":"bytes32","internalType":"bytes32"},{"name":"account","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"misbehaviour","inputs":[{"name":"","type":"bytes","internalType":"bytes"}],"outputs":[],"stateMutability":"view"},{"type":"function","name":"renounceRole","inputs":[{"name":"role","type":"bytes32","internalType":"bytes32"},{"name":"callerConfirmation","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"revokeRole","inputs":[{"name":"role","type":"bytes32","internalType":"bytes32"},{"name":"account","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"supportsInterface","inputs":[{"name":"interfaceId","type":"bytes4","internalType":"bytes4"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"updateClient","inputs":[{"name":"updateMsg","type":"bytes","internalType":"bytes"}],"outputs":[{"name":"","type":"uint8","internalType":"enum ILightClientMsgs.UpdateResult"}],"stateMutability":"nonpayable"},{"type":"function","name":"verifyMembership","inputs":[{"name":"msg_","type":"tuple","internalType":"struct ILightClientMsgs.MsgVerifyMembership","components":[{"name":"proof","type":"bytes","internalType":"bytes"},{"name":"proofHeight","type":"tuple","internalType":"struct IICS02ClientMsgs.Height","components":[{"name":"revisionNumber","type":"uint64","internalType":"uint64"},{"name":"revisionHeight","type":"uint64","internalType":"uint64"}]},{"name":"path","type":"bytes[]","internalType":"bytes[]"},{"name":"value","type":"bytes","internalType":"bytes"}]}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"verifyNonMembership","inputs":[{"name":"msg_","type":"tuple","internalType":"struct ILightClientMsgs.MsgVerifyNonMembership","components":[{"name":"proof","type":"bytes","internalType":"bytes"},{"name":"proofHeight","type":"tuple","internalType":"struct IICS02ClientMsgs.Height","components":[{"name":"revisionNumber","type":"uint64","internalType":"uint64"},{"name":"revisionHeight","type":"uint64","internalType":"uint64"}]},{"name":"path","type":"bytes[]","internalType":"bytes[]"}]}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"event","name":"RoleAdminChanged","inputs":[{"name":"role","type":"bytes32","indexed":true,"internalType":"bytes32"},{"name":"previousAdminRole","type":"bytes32","indexed":true,"internalType":"bytes32"},{"name":"newAdminRole","type":"bytes32","indexed":true,"internalType":"bytes32"}],"anonymous":false},{"type":"event","name":"RoleGranted","inputs":[{"name":"role","type":"bytes32","indexed":true,"internalType":"bytes32"},{"name":"account","type":"address","indexed":true,"internalType":"address"},{"name":"sender","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"type":"event","name":"RoleRevoked","inputs":[{"name":"role","type":"bytes32","indexed":true,"internalType":"bytes32"},{"name":"account","type":"address","indexed":true,"internalType":"address"},{"name":"sender","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"type":"error","name":"AccessControlBadConfirmation","inputs":[]},{"type":"error","name":"AccessControlUnauthorizedAccount","inputs":[{"name":"account","type":"address","internalType":"address"},{"name":"neededRole","type":"bytes32","internalType":"bytes32"}]},{"type":"error","name":"ConflictingConsensusState","inputs":[{"name":"revisionHeight","type":"uint64","internalType":"uint64"}]},{"type":"error","name":"ConsensusStateExpired","inputs":[{"name":"trustedTimestamp","type":"uint64","internalType":"uint64"},{"name":"currentTimestamp","type":"uint256","internalType":"uint256"},{"name":"trustingPeriod","type":"uint64","internalType":"uint64"}]},{"type":"error","name":"ConsensusStateNotFound","inputs":[{"name":"revisionHeight","type":"uint64","internalType":"uint64"}]},{"type":"error","name":"DuplicateCommitSealSigner","inputs":[{"name":"signer","type":"address","internalType":"address"}]},{"type":"error","name":"DuplicateValidator","inputs":[{"name":"validator","type":"address","internalType":"address"}]},{"type":"error","name":"EmptyValidatorSet","inputs":[]},{"type":"error","name":"HeaderFromFuture","inputs":[{"name":"currentTimestamp","type":"uint256","internalType":"uint256"},{"name":"headerTimestamp","type":"uint256","internalType":"uint256"},{"name":"maxClockDrift","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"InsufficientTrustedValidatorOverlap","inputs":[{"name":"actual","type":"uint256","internalType":"uint256"},{"name":"required","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"InsufficientValidatorQuorum","inputs":[{"name":"actual","type":"uint256","internalType":"uint256"},{"name":"required","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"InvalidCommitSeal","inputs":[]},{"type":"error","name":"InvalidCommitmentValue","inputs":[{"name":"expectedValue","type":"bytes32","internalType":"bytes32"},{"name":"actualValue","type":"bytes32","internalType":"bytes32"}]},{"type":"error","name":"InvalidDifficulty","inputs":[{"name":"actualDifficulty","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"InvalidECDSASignatureLength","inputs":[{"name":"length","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"InvalidExtraDataFormat","inputs":[{"name":"itemsLength","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"InvalidHeaderFormat","inputs":[{"name":"itemsLength","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"InvalidHeaderHeight","inputs":[]},{"type":"error","name":"InvalidMixHash","inputs":[{"name":"actualMixHash","type":"bytes32","internalType":"bytes32"}]},{"type":"error","name":"InvalidNonce","inputs":[{"name":"actualNonce","type":"bytes","internalType":"bytes"}]},{"type":"error","name":"InvalidOmmersHash","inputs":[{"name":"actualOmmersHash","type":"bytes32","internalType":"bytes32"}]},{"type":"error","name":"InvalidPathLength","inputs":[{"name":"expectedLength","type":"uint256","internalType":"uint256"},{"name":"actualLength","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"InvalidRevisionNumber","inputs":[{"name":"providedRevisionNumber","type":"uint64","internalType":"uint64"}]},{"type":"error","name":"InvalidValidatorAddress","inputs":[{"name":"validator","type":"address","internalType":"address"}]},{"type":"error","name":"InvalidValidatorAddressLength","inputs":[{"name":"length","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"InvalidValueLength","inputs":[{"name":"expectedLength","type":"uint256","internalType":"uint256"},{"name":"actualLength","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"UnsupportedMisbehaviour","inputs":[]},{"type":"error","name":"ValueExists","inputs":[{"name":"actualValue","type":"bytes32","internalType":"bytes32"}]}],"bytecode":{"object":"0x6080604052346103c0576138ef80380380610019816103c4565b928339810190610100818303126103c057610033816103e9565b61003f602083016103fd565b9061004c604084016103fd565b60608401516080850151909291906001600160401b0381116103c05785019286601f850112156103c0578351966001600160401b038811610376578760051b9460206100998188016103c4565b809a81520190602082978201019283116103c057602001905b8282106103a8575050506100c860a087016103fd565b956100e160e06100da60c084016103fd565b92016103e9565b956001600160401b03169081156103995788511561038a575f5b89518110156101b1576001600160a01b03610116828c610411565b51161561018a575f5b81811061012f57506001016100fb565b6001600160a01b03610141828d610411565b51166001600160a01b03610155848e610411565b5116146101645760010161011f565b6001600160a01b03610176838d610411565b511663107f863360e21b5f5260045260245ffd5b6001600160a01b039061019d908b610411565b51166359bff38760e01b5f5260045260245ffd5b5060408051979896978a979181016001600160401b03811182821017610376576040525f81526020810190848252604051926080840198848a1060018060401b038b1117610376576040998a526001600160a01b031680855260208086018490526001600160401b03928316868c01819052878416606090970196909652600180546001600160a01b031916909217825592516002805495516001600160801b031996871692851692909217918c1b6fffffffffffffffff000000000000000090811692909217815560038054909616909617968b1b16959095179092555f948552600490529590922080546001600160401b03191694861694909417845583019190915592519392019190831161037657680100000000000000008311610376578154838355808410610350575b50905f5260205f205f5b83811061033357846001600160a01b03811661031a575061030961052f565b505b60405161329d90816105b28239f35b8061032761032d92610439565b506104af565b5061030b565b82516001600160a01b0316818301556020909201916001016102ea565b825f528360205f2091820191015b81811061036b57506102e0565b5f815560010161035e565b634e487b7160e01b5f52604160045260245ffd5b63339e1ffb60e01b5f5260045ffd5b6359d119e360e01b5f5260045ffd5b602080916103b5846103e9565b8152019101906100b2565b5f80fd5b6040519190601f01601f191682016001600160401b0381118382101761037657604052565b51906001600160a01b03821682036103c057565b51906001600160401b03821682036103c057565b80518210156104255760209160051b010190565b634e487b7160e01b5f52603260045260245ffd5b6001600160a01b0381165f9081525f5160206138cf5f395f51905f52602052604090205460ff166104aa576001600160a01b03165f8181525f5160206138cf5f395f51905f5260205260408120805460ff191660011790553391905f51602061384f5f395f51905f528180a4600190565b505f90565b6001600160a01b0381165f9081525f51602061386f5f395f51905f52602052604090205460ff166104aa576001600160a01b03165f8181525f51602061386f5f395f51905f5260205260408120805460ff191660011790553391905f5160206138af5f395f51905f52905f51602061384f5f395f51905f529080a4600190565b5f80525f51602061386f5f395f51905f526020525f51602061388f5f395f51905f525460ff166105ad575f8080525f51602061386f5f395f51905f526020525f51602061388f5f395f51905f52805460ff1916600117905533905f5160206138af5f395f51905f525f51602061384f5f395f51905f528280a4600190565b5f9056fe60806040526004361015610011575f80fd5b5f3560e01c806301ffc9a7146100f45780630bece356146100ef578063248a9ca3146100ea5780632f2ff15d146100e557806336568abe146100e05780634d6d9ffb146100db5780635972185a146100d6578063682ed5f0146100d157806391d14854146100cc578063a217fddf146100c7578063d547741f146100c2578063ddba6537146100bd578063edce8bdc146100b85763ef913a4b146100b3575f80fd5b610a16565b61095e565b61088b565b61085c565b610842565b6107f4565b6105e6565b6105ac565b6103ac565b610350565b61031a565b6102b5565b610217565b34610195576020600319360112610195576004357fffffffff00000000000000000000000000000000000000000000000000000000811680910361019557807f7965db0b000000000000000000000000000000000000000000000000000000006020921490811561016b575b506040519015158152f35b7f01ffc9a7000000000000000000000000000000000000000000000000000000009150145f610160565b5f80fd5b9060206003198301126101955760043567ffffffffffffffff811161019557826023820112156101955780600401359267ffffffffffffffff84116101955760248483010111610195576024019190565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b346101955761028161022836610199565b5f80527f4c48d1d2b0f4f7485fc28e3db22341d96a20aa29e6efa8149da9751603abd4e06020527f6e0c24a6e293ff9b755263dbaa15ba3796b0b8d3fe17cfb4ddf8143b268eac475490919060ff161561029957610d9d565b6040516003821015610294576020918152f35b6101ea565b6102a1611287565b610d9d565b90816020910312610195573590565b346101955760206003193601126101955760206102df6004355f525f602052600160405f20015490565b604051908152f35b6003196040910112610195576004359060243573ffffffffffffffffffffffffffffffffffffffff811681036101955790565b346101955761034e61032b366102e7565b90610349610344825f525f602052600160405f20015490565b61130f565b6121c6565b005b346101955761035e366102e7565b3373ffffffffffffffffffffffffffffffffffffffff8216036103845761034e9161229d565b7f6697b232000000000000000000000000000000000000000000000000000000005f5260045ffd5b346101955760206003193601126101955760043567ffffffffffffffff8111610195578060040160806003198336030112610195575f80527f4c48d1d2b0f4f7485fc28e3db22341d96a20aa29e6efa8149da9751603abd4e060205260ff7f6e0c24a6e293ff9b755263dbaa15ba3796b0b8d3fe17cfb4ddf8143b268eac4754161561059f575b61044761044260248401611192565b61137c565b60648201916001610458848461119c565b90500361056157906104a96104966104a261049d61049661049061048961048460446104e09a01611192565b611b30565b988761119c565b9061126e565b3691610b4d565b612372565b928061121d565b906001840154906040516104d7816104c960208201948560209181520190565b03601f198101835282610afd565b51902091612400565b805161051f5761051b61050b6104fe845467ffffffffffffffff1690565b67ffffffffffffffff1690565b6040519081529081906020820190565b0390f35b61053361052e61055e92612545565b612572565b7fd039601e000000000000000000000000000000000000000000000000000000005f52600452602490565b5ffd5b61055e61056e848461119c565b7f88b3170e000000000000000000000000000000000000000000000000000000005f52600160045260245250604490565b6105a7611287565b610433565b34610195575f6003193601126101955760206040517fbd893629a699470e4ec82a5715bb4981fdaacc5d0a728bf5f55b801d8f4ef10b8152f35b346101955760206003193601126101955760043567ffffffffffffffff8111610195578060040160a06003198336030112610195575f80527f4c48d1d2b0f4f7485fc28e3db22341d96a20aa29e6efa8149da9751603abd4e060205260ff7f6e0c24a6e293ff9b755263dbaa15ba3796b0b8d3fe17cfb4ddf8143b268eac475416156107e7575b61067c61044260248401611192565b6064820191600161068d848461119c565b90500361056157608481019060206106a5838561121d565b9050036107a957906106f46104966106ed6106e56106de61049d6104966104906106d761048460446107149c01611192565b9b8b61119c565b948761121d565b8101906102a6565b948061121d565b906001850154906040516104d7816104c960208201948560209181520190565b8051156107755761052e61072791612545565b908082036107475761051b61050b6104fe855467ffffffffffffffff1690565b7f56ed1b63000000000000000000000000000000000000000000000000000000005f5260045260245260445ffd5b61055e827f56ed1b63000000000000000000000000000000000000000000000000000000005f52906044916004525f602452565b61055e6107b6838561121d565b7f24fadac8000000000000000000000000000000000000000000000000000000005f52602060045260245250604490565b6107ef611287565b61066d565b3461019557602060ff610836610809366102e7565b905f525f845260405f209073ffffffffffffffffffffffffffffffffffffffff165f5260205260405f2090565b54166040519015158152f35b34610195575f6003193601126101955760206040515f8152f35b346101955761034e61086d366102e7565b90610886610344825f525f602052600160405f20015490565b61229d565b346101955761089936610199565b50505f80527f4c48d1d2b0f4f7485fc28e3db22341d96a20aa29e6efa8149da9751603abd4e06020527f6e0c24a6e293ff9b755263dbaa15ba3796b0b8d3fe17cfb4ddf8143b268eac475460ff1615610915575b7f2c1ed462000000000000000000000000000000000000000000000000000000005f5260045ffd5b61091d611287565b6108ed565b67ffffffffffffffff81160361019557565b601f19601f602060409481855280519182918282880152018686015e5f8582860101520116010190565b346101955760206003193601126101955761097e60043561048481610922565b67ffffffffffffffff8154166002600183015492019060405192608084019160208501526040840152606080840152815480915260a08301915f5260205f20905f5b8181106109ea5761051b856109de818703601f198101835282610afd565b60405191829182610934565b825473ffffffffffffffffffffffffffffffffffffffff168452602090930192600192830192016109c0565b34610195575f6003193601126101955761051b60405173ffffffffffffffffffffffffffffffffffffffff60015416602082015267ffffffffffffffff600254818116604084015260401c16606082015267ffffffffffffffff600354818116608084015260401c1660a082015260a081526109de60c082610afd565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b6060810190811067ffffffffffffffff821117610adc57604052565b610a93565b6040810190811067ffffffffffffffff821117610adc57604052565b90601f601f19910116810190811067ffffffffffffffff821117610adc57604052565b60405190610b2f604083610afd565b565b67ffffffffffffffff8111610adc57601f01601f191660200190565b929192610b5982610b31565b91610b676040519384610afd565b829481845281830111610195578281602093845f960137010152565b9080601f8301121561019557816020610b9e93359101610b4d565b90565b6020818303126101955780359067ffffffffffffffff8211610195570180820391608083126101955760405192610bd784610ac0565b823567ffffffffffffffff811161019557604091610bfa84601f19938701610b83565b8652011261019557604051610c0e81610ae1565b6020830135610c1c81610922565b81526040830135610c2c81610922565b60208201526020840152606082013567ffffffffffffffff811161019557610c549201610b83565b604082015290565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b9060018201809211610c9757565b610c5c565b60c001908160c011610c9757565b60f701908160f711610c9757565b6080019081608011610c9757565b60b701908160b711610c9757565b91908201809211610c9757565b908160011b9180830460021490151715610c9757565b81519167ffffffffffffffff8311610adc57680100000000000000008311610adc578154838355808410610d77575b506020610d389101915f5260205f2090565b5f5b838110610d475750505050565b6001906020610d6a855173ffffffffffffffffffffffffffffffffffffffff1690565b9401938184015501610d3a565b825f528360205f2091820191015b818110610d925750610d26565b5f8155600101610d85565b610da991810190610ba1565b9060208201610dc461044282515167ffffffffffffffff1690565b610dce8351611614565b92606084019367ffffffffffffffff610def865167ffffffffffffffff1690565b161561116a5760035491604083901c67ffffffffffffffff1693610e1d67ffffffffffffffff861642610cd4565b9460a0840195610e35875167ffffffffffffffff1690565b9067ffffffffffffffff82161161112b5750505160200151610e7290610e649067ffffffffffffffff16611b30565b9367ffffffffffffffff1690565b67ffffffffffffffff81168015159081611102575b506110ad575090610ef591610eb66002610eae610ea385611b87565b60e086015190611ca1565b950185611eba565b610ec660c0830194855190611fdf565b60406080610ee960015473ffffffffffffffffffffffffffffffffffffffff1690565b93015191015191612082565b610f22610f0a865167ffffffffffffffff1690565b67ffffffffffffffff165f52600460205260405f2090565b610f376104fe825467ffffffffffffffff1690565b61103b5750916002610fb5928694610fa8610f73610f64610f0a610fc39a9b5167ffffffffffffffff1690565b955167ffffffffffffffff1690565b859067ffffffffffffffff167fffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000825416179055565b6001840155519101610cf7565b5167ffffffffffffffff1690565b600254610fdc9060401c67ffffffffffffffff166104fe565b67ffffffffffffffff821611610ff157505f90565b611037907fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff6fffffffffffffffff00000000000000006002549260401b16911617600255565b5f90565b91611051611059945167ffffffffffffffff1690565b9051926120f8565b6110a75761055e611072835167ffffffffffffffff1690565b7fc1aea5f7000000000000000000000000000000000000000000000000000000005f5267ffffffffffffffff16600452602490565b60029150565b61055e906110c3855467ffffffffffffffff1690565b7feae35725000000000000000000000000000000000000000000000000000000005f5267ffffffffffffffff9081166004524260245216604452606490565b9050611123429161111e6104fe885467ffffffffffffffff1690565b610cd4565b11155f610e87565b7f9b772277000000000000000000000000000000000000000000000000000000005f524260045267ffffffffffffffff9081166024521660445260645ffd5b7f59d119e3000000000000000000000000000000000000000000000000000000005f5260045ffd5b35610b9e81610922565b9035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe181360301821215610195570180359067ffffffffffffffff821161019557602001918160051b3603831361019557565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b9035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe181360301821215610195570180359067ffffffffffffffff82116101955760200191813603831361019557565b9015611282578061127e9161121d565b9091565b6111f0565b335f9081527f4c48d1d2b0f4f7485fc28e3db22341d96a20aa29e6efa8149da9751603abd4e0602052604090205460ff16156112bf57565b7fe2517d3f000000000000000000000000000000000000000000000000000000005f52336004527fbd893629a699470e4ec82a5715bb4981fdaacc5d0a728bf5f55b801d8f4ef10b60245260445ffd5b805f525f60205260ff6113433360405f209073ffffffffffffffffffffffffffffffffffffffff165f5260205260405f2090565b54161561134d5750565b7fe2517d3f000000000000000000000000000000000000000000000000000000005f523360045260245260445ffd5b67ffffffffffffffff168061138e5750565b7f3ce598a9000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b60405190610100820182811067ffffffffffffffff821117610adc57604052606060e0838281528260208201528260408201525f838201525f60808201525f60a08201528260c08201520152565b8051600110156112825760400190565b805160071015611282576101000190565b8051600d1015611282576101c00190565b8051600e1015611282576101e00190565b805160081015611282576101200190565b8051600310156112825760800190565b8051600b1015611282576101800190565b8051600c1015611282576101a00190565b8051600410156112825760a00190565b8051156112825760200190565b8051600210156112825760600190565b805160101015611282576102200190565b80518210156112825760209160051b010190565b67ffffffffffffffff8111610adc5760051b60200190565b90611501826114df565b61150e6040519182610afd565b828152601f1961151e82946114df565b0190602036910137565b90602082519201517fffffffffffffffffffffffffffffffffffffffff00000000000000000000000081169260148110611560575050565b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000929350829060140360031b1b161690565b60405160a091906115a38382610afd565b6004815291601f1901825f5b8281106115bb57505050565b8060606020809385010152016115af565b906115d6826114df565b6115e36040519182610afd565b828152601f196115f382946114df565b01905f5b82811061160357505050565b8060606020809385010152016115f7565b61163061162b6116226113b9565b92808452612545565b6125b4565b602082019080825251600f8110611b0557507f1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d493476116766116708351611407565b5161267f565b03611aca57600161169061168a8351611417565b51612572565b03611a8f577f63746963616c2062797a616e74696e65206661756c7420746f6c6572616e63656116c36116708351611428565b03611a54576116db6116d58251611439565b5161269b565b80516008811490811591611a24575b506119ea575061162b61175d6116d5836117216117106104fe61168a611762985161144a565b67ffffffffffffffff166060880152565b61172e611670825161145b565b60808701526117576117466104fe61168a845161146b565b67ffffffffffffffff1660a0880152565b5161147c565b612545565b90604081019180835251600581036119bf57506117886117828351611407565b516125b4565b908151156119975761179a82516114f7565b9360c082019485525f5b8351811015611933576117ba6116d582866114cb565b80516014810361190857506117d16117d791611528565b60601c90565b73ffffffffffffffffffffffffffffffffffffffff811680156118c6575f5b8381106118325750509061182c600192611811838a516114cb565b9073ffffffffffffffffffffffffffffffffffffffff169052565b016117a4565b8161187761185e611844848d516114cb565b5173ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff1690565b14611884576001016117f6565b7f41fe18cc000000000000000000000000000000000000000000000000000000005f5273ffffffffffffffffffffffffffffffffffffffff831660045260245ffd5b7f59bff387000000000000000000000000000000000000000000000000000000005f5273ffffffffffffffffffffffffffffffffffffffff821660045260245ffd5b7f83e46ad2000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b509261178291945061194692505161148d565b61195081516115cc565b9260e081019384525f5b8251811015611991578061198a816119776116d5600195886114cb565b88519061198483836114cb565b526114cb565b500161195a565b50925050565b7f339e1ffb000000000000000000000000000000000000000000000000000000005f5260045ffd5b7f30c6792a000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b611a20906040519182917fd5edd2a500000000000000000000000000000000000000000000000000000000835260048301610934565b0390fd5b7f011b4d03dd8c01f1049143cf9c4c817e4b167f1d1b83e5c6f0f10d89ba1e7bce9150602083012014155f6116ea565b611a6461167061055e9251611428565b7fa19e609c000000000000000000000000000000000000000000000000000000005f52600452602490565b611a9f61168a61055e9251611417565b7ff71b722f000000000000000000000000000000000000000000000000000000005f52600452602490565b611ada61167061055e9251611407565b7fb8120dca000000000000000000000000000000000000000000000000000000005f52600452602490565b7fbc277732000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b67ffffffffffffffff1690815f52600460205260405f209167ffffffffffffffff83541615611b5c5750565b7ff761631b000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b6020611c26611b94611592565b611c0d611bab60408601611bb1611bab825161149d565b51612fa2565b611bba8561149d565b52611bc48461149d565b50611bd2611bab8251611407565b611bdb85611407565b52611be584611407565b50611bf3611bab82516114aa565b611bfc856114aa565b52611c06846114aa565b505161145b565b611c168261145b565b52611c208161145b565b50612771565b910190611c348251516115cc565b905f5b83518051821015611c8a579080600192600c82145f14611c78575050611c5c83612829565b611c6682866114cb565b52611c7181856114cb565b5001611c37565b611c8591611bab916114cb565b611c5c565b505050611c979150612771565b6020815191012090565b919091611cae83516114f7565b925f5b8151811015611ea757611cc481836114cb565b51805160418103611e7c575080601b60ff611d13611d0d611ce7611d2096612808565b517fff000000000000000000000000000000000000000000000000000000000000001690565b60f81c90565b1610611e29575b84613050565b90611d2a816128a3565b1590811591611e1f575b508015611e01575b611dd95773ffffffffffffffffffffffffffffffffffffffff81165f5b838110611d7957505090611d7360019261181183896114cb565b01611cb1565b81611d8a61185e611844848c6114cb565b14611d9757600101611d59565b7f33af0d5f000000000000000000000000000000000000000000000000000000005f5273ffffffffffffffffffffffffffffffffffffffff831660045260245ffd5b7f09cb44e6000000000000000000000000000000000000000000000000000000005f5260045ffd5b5073ffffffffffffffffffffffffffffffffffffffff811615611d3c565b905015155f611d34565b611e6b611e43611e3e611d0d611ce785612808565b612891565b60f81b7fff000000000000000000000000000000000000000000000000000000000000001690565b5f1a611e7682612808565b53611d1a565b7ff2db9ce1000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b505050565b5f198114610c975760010190565b905f915f5b8151811015611f1357611ef273ffffffffffffffffffffffffffffffffffffffff611eea83856114cb565b5116846128ad565b611eff575b600101611ebf565b92611f0b600191611eac565b939050611ef7565b50506003611f22915404610c89565b90818110611f2e575050565b7fe2dcb1b9000000000000000000000000000000000000000000000000000000005f5260045260245260445ffd5b905f198201918211610c9757565b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff408201918211610c9757565b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff808201918211610c9757565b6020039060208211610c9757565b91908203918211610c9757565b905f915f5b81518110156120385761201773ffffffffffffffffffffffffffffffffffffffff61200f83856114cb565b511684612904565b612024575b600101611fe4565b92612030600191611eac565b93905061201c565b50505190600382048203918211610c9757818110612054575050565b7f7818f4e4000000000000000000000000000000000000000000000000000000005f5260045260245260445ffd5b6120cc9261162b9261175d926040517fffffffffffffffffffffffffffffffffffffffff000000000000000000000000602082019260601b168252601481526104d7603482610afd565b805160021015611282576060610b9e91015161267f565b8054821015611282575f5260205f2001905f90565b919067ffffffffffffffff80612116855467ffffffffffffffff1690565b9216911614908115916121b7575b506121b1576002019081548151036121b1575f5b81518110156121a95761216e61214e82856120e3565b905473ffffffffffffffffffffffffffffffffffffffff9160031b1c1690565b73ffffffffffffffffffffffffffffffffffffffff61219361185e61184485876114cb565b9116036121a257600101612138565b5050505f90565b505050600190565b50505f90565b9050600182015414155f612124565b805f525f60205260ff6121fa8360405f209073ffffffffffffffffffffffffffffffffffffffff165f5260205260405f2090565b54166121b157805f525f6020526122328260405f209073ffffffffffffffffffffffffffffffffffffffff165f5260205260405f2090565b60017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0082541617905573ffffffffffffffffffffffffffffffffffffffff339216907f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d5f80a4600190565b805f525f60205260ff6122d18360405f209073ffffffffffffffffffffffffffffffffffffffff165f5260205260405f2090565b5416156121b157805f525f60205261230a8260405f209073ffffffffffffffffffffffffffffffffffffffff165f5260205260405f2090565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00815416905573ffffffffffffffffffffffffffffffffffffffff339216907ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b5f80a4600190565b60208151910120604051602081019182527f1260944489272988d9df285149b5aa1b0f48f2136d6f416159f840a3e07476006040820152604081526123b8606082610afd565b51902090565b604051906123cd602083610afd565b5f808352366020840137565b906123e382610b31565b6123f06040519182610afd565b828152601f1961151e8294610b31565b61162b612442919493946124146020610b31565b956124226040519788610afd565b602087526124306020610b31565b601f1960208901910136823752612545565b9061244d8451610ce1565b918451151580612525575b6124619061256b565b61247361246e5f85611fd2565b6123d9565b925f19015f5b81811061248d575050610b9e939450612a78565b8061250f600f6124d2612509611d0d611ce78d6124ac60029960011c90565b908d6125038a6124fb8a6124d26124c9611d0d611ce78a8a612818565b60041c600f1690565b1660f81b7fff000000000000000000000000000000000000000000000000000000000000001690565b5f1a92612818565b53612818565b60ff1690565b5f1a61251e6001830188612818565b5301612479565b506001612458565b6040519061253a82610ae1565b5f6020838281520152565b61254d61252d565b5060208151916040519261256084610ae1565b835201602082015290565b1561019557565b805180151590816125a8575b50156101955761258d90612d4e565b9051906020811061259c575090565b6020036101000a900490565b6021915011155f61257e565b6125bd81612d7a565b15610195576125cb81612d9a565b6125d4816114df565b916125e26040519384610afd565b818352601f196125f1836114df565b015f5b818110612668575050602061261491015161260e81612dfb565b90610cd4565b5f905b8282106126245750505090565b61266081612633600193612e66565b9061263c610b20565b82815281602082015261264f86896114cb565b5261265a85886114cb565b50610cd4565b910190612617565b60209061267361252d565b828288010152016125f4565b6021815103610195576020015160018101809111610c97575190565b805115610195576126ae610b9e91612d4e565b6126ba819392936123d9565b928360200190612f2f565b805191908290602001825e015f815290565b610b2f906126f96126f3949360405195869360208501906126c5565b906126c5565b03601f198101845283610afd565b6001907fff00000000000000000000000000000000000000000000000000000000000000610b9e949316815201906126c5565b916001610b9e94937fff000000000000000000000000000000000000000000000000000000000000006126f39416815201906126c5565b6127796123be565b905f915b81518310156127a55761279d60019161279685856114cb565b51906126d7565b92019161277d565b9150508051603881106127e45750610b9e6127c08251612fce565b916104c96127d4611e436125098651610caa565b916040519485936020850161273a565b6127f6611e43612509610b9e93610c9c565b6104c960405193849260208401612707565b8051604010156112825760600190565b908151811015611282570160200190565b600181511480612876575b610b9e578051603881106128645750610b9e6128508251612fce565b916104c96127d4611e436125098651610cc6565b6127f6611e43612509610b9e93610cb8565b50608060ff61288a611d0d611ce78561149d565b1610612834565b60ff601b9116019060ff8211610c9757565b6004111561029457565b905f5b82548110156121a25773ffffffffffffffffffffffffffffffffffffffff6128d882856120e3565b90549060031b1c1673ffffffffffffffffffffffffffffffffffffffff8316146121a9576001016128b0565b905f5b82518110156121a25773ffffffffffffffffffffffffffffffffffffffff61292f82856114cb565b511673ffffffffffffffffffffffffffffffffffffffff8316146121a957600101612907565b91906129618351610ce1565b908351151580612a6e575b6129759061256b565b61298261246e8284611fd2565b938192600180841614612a0c575b5f19869101935b8481106129a5575050505050565b83612a0360016129f9600f6124d2612509611d0d611ce78b60029b6129f26129e5886124d28f611d0d611ce76129de6124c99360011c90565b8099612818565b9b8d03809c5f1a92612818565b538c612818565b5f1a920189612818565b53018590612997565b92507f0f00000000000000000000000000000000000000000000000000000000000000612a4b612509611d0d611ce7612a458760011c90565b86612818565b60f81b165f1a612a5a8661149d565b535f19612a6683611eac565b939050612990565b508181111561296c565b915f915f612a8461252d565b50845115612d155790935f915b81518310156101955782158080612cff575b61019557159081612ce2575b5061019557612ac161178283836114cb565b948551600281145f14612bbe5750612ae3612ade6116d58861149d565b6130e5565b95612af9612af2888884613152565b8092610cd4565b965111612ba05715612b305750612b109051611f5c565b11610195575111612b27576116d5610b9e91611407565b50610b9e6123be565b919094612b3d8651611f5c565b82146101955780612b5f612b5b612b55600194611407565b51612d7a565b1590565b15612b8157612b70612b7691611407565b516130d7565b915b01919490612a91565b612b8d612b9a91611407565b5160208101519051902090565b91612b78565b505091509250612bb1915051611f5c565b1161019557610b9e6123be565b929491939192601103612c835781518314612c6557612bef612be9612509611d0d611ce78787612818565b93610c89565b92601081101561019557612c0c612c0682896114cb565b516130c1565b15612c2e5750505050612c2191925051611f5c565b0361019557610b9e6123be565b86612c46612b5b612b5584600196989a97999b6114cb565b15612c5857612b9a91612b70916114cb565b612b9a91612b8d916114cb565b505050612c729051611f5c565b03610195576116d5610b9e916114ba565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f696e76616c6964206e6f6465206c656e677468000000000000000000000000006044820152606490fd5b9050612cf7612cf184846114cb565b5161308a565b14155f612aaf565b50612d0d612b8d85856114cb565b871415612aa3565b509050612d4692507f56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b42191501461256b565b610b9e6123be565b906020820191612d5e8351612dfb565b925190838201809211610c975751928303928311610c97579190565b805115612d9557602060c0910151515f1a1061103757600190565b505f90565b805115612d95575f9060208101908151612db381612dfb565b8101809111610c9757915190518101809111610c975791905b828110612dd95750905090565b612de281612e66565b8101809111610c9757612df59091611eac565b90612dcc565b515f1a6080811015612e0c57505f90565b60b881108015612e50575b15612e225750600190565b60c0811015612e4157610b9e90612e3c9060b75b90611fd2565b610c89565b610b9e90612e3c9060f7612e36565b5060c08110158015612e17575060f88110612e17565b80515f1a906080821015612e7b575050600190565b60b8821015612e915750612e3c610b9e91611f97565b60c0821015612ed25760010151602082900360b7016101000a9004017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff4a0190565b60f8821015612ee85750612e3c610b9e91611f6a565b60010151602082900360f7016101000a9004017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0a0190565b601f8111610c97576101000a90565b90918015611ea7575b6020811015612f725780612f4b57505050565b612f5f612f5a612f6492611fc4565b612f20565b611f5c565b905182518216911916179052565b91908051825260208101809111610c97579060208101809111610c975791601f19810190811115612f3857610c5c565b612fac81516123d9565b90815115612fca57806020610b9e9201519051908360200190612f2f565b5090565b5f81805b61303c5750612fe0816123d9565b91815b612fec57505090565b612ff582611f5c565b6130277fff000000000000000000000000000000000000000000000000000000000000008360f81b165f1a9185612818565b5360081c908015610c97575f19019081612fe3565b9061304690611eac565b9060081c80612fd2565b8151919060418303613080576130799250602082015190606060408401519301515f1a906131f6565b9192909190565b50505f9160029190565b805160208110156130a2575060208101519051902090565b90602001512060405160208101918252602081526123b8604082610afd565b6001815103612d955760200151515f1a60801490565b6130e090612d4e565b902090565b9081511561019557600f6131016124c9611d0d611ce78661149d565b16806131145750610b9e60025f93612955565b600181036131295750610b9e60015f93612955565b6002810361313f5750610b9e6002600193612955565b60030361019557610b9e60018093612955565b91905f5b838101808211610c975782518110806131ec575b156131e45761319a7fff000000000000000000000000000000000000000000000000000000000000009184612818565b51167fff000000000000000000000000000000000000000000000000000000000000006131c78386612818565b511690036131dd576131d890611eac565b613156565b9250505090565b509250505090565b508351821061316a565b91907f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08411613285579160209360809260ff5f9560405194855216868401526040830152606082015282805260015afa1561327a575f5173ffffffffffffffffffffffffffffffffffffffff81161561327057905f905f90565b505f906001905f90565b6040513d5f823e3d90fd5b5050505f916003919056fea164736f6c634300081c000a2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d4c48d1d2b0f4f7485fc28e3db22341d96a20aa29e6efa8149da9751603abd4e06e0c24a6e293ff9b755263dbaa15ba3796b0b8d3fe17cfb4ddf8143b268eac47bd893629a699470e4ec82a5715bb4981fdaacc5d0a728bf5f55b801d8f4ef10bad3228b676f7d3cd4284a5443f17f1962b36e491b30a40b2405849e597ba5fb5","sourceMap":"242:2275:34:-:0;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;242:2275:34;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;242:2275:34;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;:::i;:::-;;-1:-1:-1;;;;;242:2275:34;;3952:25:35;;3948:84;;242:2275:34;;17667:22:35;17663:79;;-1:-1:-1;17794:3:35;242:2275:34;;17771:21:35;;;;;-1:-1:-1;;;;;17817:13:35;;;;:::i;:::-;242:2275:34;;17817:27:35;17813:111;;-1:-1:-1;17957:5:35;;;;;;17794:3;242:2275:34;;17756:13:35;;17964:3;-1:-1:-1;;;;;17991:13:35;;;;:::i;:::-;242:2275:34;;-1:-1:-1;;;;;18008:13:35;242:2275:34;;18008:13:35;:::i;:::-;242:2275:34;;17991:30:35;17987:117;;242:2275:34;;17942:13:35;;17987:117;-1:-1:-1;;;;;18071:13:35;242:2275:34;;18071:13:35;:::i;:::-;242:2275:34;;18052:33:35;;;-1:-1:-1;18052:33:35;;242:2275:34;;-1:-1:-1;18052:33:35;17813:111;-1:-1:-1;;;;;242:2275:34;17895:13:35;;242:2275:34;17895:13:35;:::i;:::-;242:2275:34;;17871:38:35;;;-1:-1:-1;17871:38:35;;242:2275:34;;-1:-1:-1;17871:38:35;17771:21;-1:-1:-1;242:2275:34;;;17771:21:35;;;;;;;242:2275:34;;-1:-1:-1;;;;;242:2275:34;;;;;;;;;;-1:-1:-1;242:2275:34;;;4186:84:35;;242:2275:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;242:2275:34;;;;;4112:255:35;;;242:2275:34;;;-1:-1:-1;;;;;242:2275:34;;;4112:255:35;;;242:2275:34;;;;;;;4112:255:35;;;242:2275:34;;;;;;;-1:-1:-1;;;;;;242:2275:34;;;;;;;;;;;;;-1:-1:-1;;;;;;242:2275:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;242:2275:34;;;4418:15:35;242:2275:34;;;;;;;;-1:-1:-1;;;;;;242:2275:34;;;;;;;;;;4525:26:35;;242:2275:34;;;;;;;4589:25:35;;;242:2275:34;;;;;;;;;;;;;;;;;;;;17751:377:35;242:2275:34;;-1:-1:-1;242:2275:34;;-1:-1:-1;242:2275:34;-1:-1:-1;242:2275:34;;;;;;;-1:-1:-1;;;;;242:2275:34;;;;4697:44:35;;;:::i;:::-;;4652:233;242:2275:34;;;;;;;;;4652:233:35;4772:43;;4829:45;4772:43;;:::i;:::-;;4829:45;:::i;:::-;;4652:233;;242:2275:34;;;-1:-1:-1;;;;;242:2275:34;;;;;;;;;;;;;;;;-1:-1:-1;242:2275:34;;;-1:-1:-1;242:2275:34;;;;;;;;;;;;;;;;-1:-1:-1;242:2275:34;;;;;;;;;;-1:-1:-1;242:2275:34;;4418:15:35;242:2275:34;;-1:-1:-1;242:2275:34;17663:79:35;17712:19;;;-1:-1:-1;17712:19:35;;-1:-1:-1;17712:19:35;3948:84;4000:21;;;-1:-1:-1;4000:21:35;;-1:-1:-1;4000:21:35;242:2275:34;;;;;;;:::i;:::-;;;;;;;;;;-1:-1:-1;242:2275:34;;;;;;;;;-1:-1:-1;;242:2275:34;;;-1:-1:-1;;;;;242:2275:34;;;;;;;;;;:::o;:::-;;;-1:-1:-1;;;;;242:2275:34;;;;;;:::o;:::-;;;-1:-1:-1;;;;;242:2275:34;;;;;;:::o;:::-;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;6145:316:93;-1:-1:-1;;;;;242:2275:34;;3976:1:35;242:2275:34;;;-1:-1:-1;;;;;;;;;;;242:2275:34;;;;;;;;;;-1:-1:-1;;;;;242:2275:34;3976:1:35;242:2275:34;;;-1:-1:-1;;;;;;;;;;;242:2275:34;;;;;;;-1:-1:-1;;242:2275:34;;;;;735:10:121;;242:2275:34;-1:-1:-1;;;;;;;;;;;3976:1:35;;6336:40:93;6313:4;6390:11;:::o;6238:217::-;6432:12;3976:1:35;6432:12:93;:::o;6145:316::-;-1:-1:-1;;;;;242:2275:34;;;;;;-1:-1:-1;;;;;;;;;;;242:2275:34;;;;;;;;;;-1:-1:-1;;;;;242:2275:34;;;;;-1:-1:-1;;;;;;;;;;;242:2275:34;;;;;;;-1:-1:-1;;242:2275:34;;;;;735:10:121;;242:2275:34;-1:-1:-1;;;;;;;;;;;2089:33:35;-1:-1:-1;;;;;;;;;;;6336:40:93;242:2275:34;6336:40:93;6313:4;6390:11;:::o;6145:316::-;242:2275:34;;;-1:-1:-1;;;;;;;;;;;242:2275:34;;-1:-1:-1;;;;;;;;;;;242:2275:34;;;;;;;;;-1:-1:-1;;;;;;;;;;;242:2275:34;;-1:-1:-1;;;;;;;;;;;242:2275:34;;-1:-1:-1;;242:2275:34;6313:4:93;242:2275:34;;;735:10:121;;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;242:2275:34;;6336:40:93;6313:4;6390:11;:::o;6238:217::-;242:2275:34;6432:12:93;:::o","linkReferences":{}},"deployedBytecode":{"object":"0x60806040526004361015610011575f80fd5b5f3560e01c806301ffc9a7146100f45780630bece356146100ef578063248a9ca3146100ea5780632f2ff15d146100e557806336568abe146100e05780634d6d9ffb146100db5780635972185a146100d6578063682ed5f0146100d157806391d14854146100cc578063a217fddf146100c7578063d547741f146100c2578063ddba6537146100bd578063edce8bdc146100b85763ef913a4b146100b3575f80fd5b610a16565b61095e565b61088b565b61085c565b610842565b6107f4565b6105e6565b6105ac565b6103ac565b610350565b61031a565b6102b5565b610217565b34610195576020600319360112610195576004357fffffffff00000000000000000000000000000000000000000000000000000000811680910361019557807f7965db0b000000000000000000000000000000000000000000000000000000006020921490811561016b575b506040519015158152f35b7f01ffc9a7000000000000000000000000000000000000000000000000000000009150145f610160565b5f80fd5b9060206003198301126101955760043567ffffffffffffffff811161019557826023820112156101955780600401359267ffffffffffffffff84116101955760248483010111610195576024019190565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b346101955761028161022836610199565b5f80527f4c48d1d2b0f4f7485fc28e3db22341d96a20aa29e6efa8149da9751603abd4e06020527f6e0c24a6e293ff9b755263dbaa15ba3796b0b8d3fe17cfb4ddf8143b268eac475490919060ff161561029957610d9d565b6040516003821015610294576020918152f35b6101ea565b6102a1611287565b610d9d565b90816020910312610195573590565b346101955760206003193601126101955760206102df6004355f525f602052600160405f20015490565b604051908152f35b6003196040910112610195576004359060243573ffffffffffffffffffffffffffffffffffffffff811681036101955790565b346101955761034e61032b366102e7565b90610349610344825f525f602052600160405f20015490565b61130f565b6121c6565b005b346101955761035e366102e7565b3373ffffffffffffffffffffffffffffffffffffffff8216036103845761034e9161229d565b7f6697b232000000000000000000000000000000000000000000000000000000005f5260045ffd5b346101955760206003193601126101955760043567ffffffffffffffff8111610195578060040160806003198336030112610195575f80527f4c48d1d2b0f4f7485fc28e3db22341d96a20aa29e6efa8149da9751603abd4e060205260ff7f6e0c24a6e293ff9b755263dbaa15ba3796b0b8d3fe17cfb4ddf8143b268eac4754161561059f575b61044761044260248401611192565b61137c565b60648201916001610458848461119c565b90500361056157906104a96104966104a261049d61049661049061048961048460446104e09a01611192565b611b30565b988761119c565b9061126e565b3691610b4d565b612372565b928061121d565b906001840154906040516104d7816104c960208201948560209181520190565b03601f198101835282610afd565b51902091612400565b805161051f5761051b61050b6104fe845467ffffffffffffffff1690565b67ffffffffffffffff1690565b6040519081529081906020820190565b0390f35b61053361052e61055e92612545565b612572565b7fd039601e000000000000000000000000000000000000000000000000000000005f52600452602490565b5ffd5b61055e61056e848461119c565b7f88b3170e000000000000000000000000000000000000000000000000000000005f52600160045260245250604490565b6105a7611287565b610433565b34610195575f6003193601126101955760206040517fbd893629a699470e4ec82a5715bb4981fdaacc5d0a728bf5f55b801d8f4ef10b8152f35b346101955760206003193601126101955760043567ffffffffffffffff8111610195578060040160a06003198336030112610195575f80527f4c48d1d2b0f4f7485fc28e3db22341d96a20aa29e6efa8149da9751603abd4e060205260ff7f6e0c24a6e293ff9b755263dbaa15ba3796b0b8d3fe17cfb4ddf8143b268eac475416156107e7575b61067c61044260248401611192565b6064820191600161068d848461119c565b90500361056157608481019060206106a5838561121d565b9050036107a957906106f46104966106ed6106e56106de61049d6104966104906106d761048460446107149c01611192565b9b8b61119c565b948761121d565b8101906102a6565b948061121d565b906001850154906040516104d7816104c960208201948560209181520190565b8051156107755761052e61072791612545565b908082036107475761051b61050b6104fe855467ffffffffffffffff1690565b7f56ed1b63000000000000000000000000000000000000000000000000000000005f5260045260245260445ffd5b61055e827f56ed1b63000000000000000000000000000000000000000000000000000000005f52906044916004525f602452565b61055e6107b6838561121d565b7f24fadac8000000000000000000000000000000000000000000000000000000005f52602060045260245250604490565b6107ef611287565b61066d565b3461019557602060ff610836610809366102e7565b905f525f845260405f209073ffffffffffffffffffffffffffffffffffffffff165f5260205260405f2090565b54166040519015158152f35b34610195575f6003193601126101955760206040515f8152f35b346101955761034e61086d366102e7565b90610886610344825f525f602052600160405f20015490565b61229d565b346101955761089936610199565b50505f80527f4c48d1d2b0f4f7485fc28e3db22341d96a20aa29e6efa8149da9751603abd4e06020527f6e0c24a6e293ff9b755263dbaa15ba3796b0b8d3fe17cfb4ddf8143b268eac475460ff1615610915575b7f2c1ed462000000000000000000000000000000000000000000000000000000005f5260045ffd5b61091d611287565b6108ed565b67ffffffffffffffff81160361019557565b601f19601f602060409481855280519182918282880152018686015e5f8582860101520116010190565b346101955760206003193601126101955761097e60043561048481610922565b67ffffffffffffffff8154166002600183015492019060405192608084019160208501526040840152606080840152815480915260a08301915f5260205f20905f5b8181106109ea5761051b856109de818703601f198101835282610afd565b60405191829182610934565b825473ffffffffffffffffffffffffffffffffffffffff168452602090930192600192830192016109c0565b34610195575f6003193601126101955761051b60405173ffffffffffffffffffffffffffffffffffffffff60015416602082015267ffffffffffffffff600254818116604084015260401c16606082015267ffffffffffffffff600354818116608084015260401c1660a082015260a081526109de60c082610afd565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b6060810190811067ffffffffffffffff821117610adc57604052565b610a93565b6040810190811067ffffffffffffffff821117610adc57604052565b90601f601f19910116810190811067ffffffffffffffff821117610adc57604052565b60405190610b2f604083610afd565b565b67ffffffffffffffff8111610adc57601f01601f191660200190565b929192610b5982610b31565b91610b676040519384610afd565b829481845281830111610195578281602093845f960137010152565b9080601f8301121561019557816020610b9e93359101610b4d565b90565b6020818303126101955780359067ffffffffffffffff8211610195570180820391608083126101955760405192610bd784610ac0565b823567ffffffffffffffff811161019557604091610bfa84601f19938701610b83565b8652011261019557604051610c0e81610ae1565b6020830135610c1c81610922565b81526040830135610c2c81610922565b60208201526020840152606082013567ffffffffffffffff811161019557610c549201610b83565b604082015290565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b9060018201809211610c9757565b610c5c565b60c001908160c011610c9757565b60f701908160f711610c9757565b6080019081608011610c9757565b60b701908160b711610c9757565b91908201809211610c9757565b908160011b9180830460021490151715610c9757565b81519167ffffffffffffffff8311610adc57680100000000000000008311610adc578154838355808410610d77575b506020610d389101915f5260205f2090565b5f5b838110610d475750505050565b6001906020610d6a855173ffffffffffffffffffffffffffffffffffffffff1690565b9401938184015501610d3a565b825f528360205f2091820191015b818110610d925750610d26565b5f8155600101610d85565b610da991810190610ba1565b9060208201610dc461044282515167ffffffffffffffff1690565b610dce8351611614565b92606084019367ffffffffffffffff610def865167ffffffffffffffff1690565b161561116a5760035491604083901c67ffffffffffffffff1693610e1d67ffffffffffffffff861642610cd4565b9460a0840195610e35875167ffffffffffffffff1690565b9067ffffffffffffffff82161161112b5750505160200151610e7290610e649067ffffffffffffffff16611b30565b9367ffffffffffffffff1690565b67ffffffffffffffff81168015159081611102575b506110ad575090610ef591610eb66002610eae610ea385611b87565b60e086015190611ca1565b950185611eba565b610ec660c0830194855190611fdf565b60406080610ee960015473ffffffffffffffffffffffffffffffffffffffff1690565b93015191015191612082565b610f22610f0a865167ffffffffffffffff1690565b67ffffffffffffffff165f52600460205260405f2090565b610f376104fe825467ffffffffffffffff1690565b61103b5750916002610fb5928694610fa8610f73610f64610f0a610fc39a9b5167ffffffffffffffff1690565b955167ffffffffffffffff1690565b859067ffffffffffffffff167fffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000825416179055565b6001840155519101610cf7565b5167ffffffffffffffff1690565b600254610fdc9060401c67ffffffffffffffff166104fe565b67ffffffffffffffff821611610ff157505f90565b611037907fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff6fffffffffffffffff00000000000000006002549260401b16911617600255565b5f90565b91611051611059945167ffffffffffffffff1690565b9051926120f8565b6110a75761055e611072835167ffffffffffffffff1690565b7fc1aea5f7000000000000000000000000000000000000000000000000000000005f5267ffffffffffffffff16600452602490565b60029150565b61055e906110c3855467ffffffffffffffff1690565b7feae35725000000000000000000000000000000000000000000000000000000005f5267ffffffffffffffff9081166004524260245216604452606490565b9050611123429161111e6104fe885467ffffffffffffffff1690565b610cd4565b11155f610e87565b7f9b772277000000000000000000000000000000000000000000000000000000005f524260045267ffffffffffffffff9081166024521660445260645ffd5b7f59d119e3000000000000000000000000000000000000000000000000000000005f5260045ffd5b35610b9e81610922565b9035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe181360301821215610195570180359067ffffffffffffffff821161019557602001918160051b3603831361019557565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b9035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe181360301821215610195570180359067ffffffffffffffff82116101955760200191813603831361019557565b9015611282578061127e9161121d565b9091565b6111f0565b335f9081527f4c48d1d2b0f4f7485fc28e3db22341d96a20aa29e6efa8149da9751603abd4e0602052604090205460ff16156112bf57565b7fe2517d3f000000000000000000000000000000000000000000000000000000005f52336004527fbd893629a699470e4ec82a5715bb4981fdaacc5d0a728bf5f55b801d8f4ef10b60245260445ffd5b805f525f60205260ff6113433360405f209073ffffffffffffffffffffffffffffffffffffffff165f5260205260405f2090565b54161561134d5750565b7fe2517d3f000000000000000000000000000000000000000000000000000000005f523360045260245260445ffd5b67ffffffffffffffff168061138e5750565b7f3ce598a9000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b60405190610100820182811067ffffffffffffffff821117610adc57604052606060e0838281528260208201528260408201525f838201525f60808201525f60a08201528260c08201520152565b8051600110156112825760400190565b805160071015611282576101000190565b8051600d1015611282576101c00190565b8051600e1015611282576101e00190565b805160081015611282576101200190565b8051600310156112825760800190565b8051600b1015611282576101800190565b8051600c1015611282576101a00190565b8051600410156112825760a00190565b8051156112825760200190565b8051600210156112825760600190565b805160101015611282576102200190565b80518210156112825760209160051b010190565b67ffffffffffffffff8111610adc5760051b60200190565b90611501826114df565b61150e6040519182610afd565b828152601f1961151e82946114df565b0190602036910137565b90602082519201517fffffffffffffffffffffffffffffffffffffffff00000000000000000000000081169260148110611560575050565b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000929350829060140360031b1b161690565b60405160a091906115a38382610afd565b6004815291601f1901825f5b8281106115bb57505050565b8060606020809385010152016115af565b906115d6826114df565b6115e36040519182610afd565b828152601f196115f382946114df565b01905f5b82811061160357505050565b8060606020809385010152016115f7565b61163061162b6116226113b9565b92808452612545565b6125b4565b602082019080825251600f8110611b0557507f1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d493476116766116708351611407565b5161267f565b03611aca57600161169061168a8351611417565b51612572565b03611a8f577f63746963616c2062797a616e74696e65206661756c7420746f6c6572616e63656116c36116708351611428565b03611a54576116db6116d58251611439565b5161269b565b80516008811490811591611a24575b506119ea575061162b61175d6116d5836117216117106104fe61168a611762985161144a565b67ffffffffffffffff166060880152565b61172e611670825161145b565b60808701526117576117466104fe61168a845161146b565b67ffffffffffffffff1660a0880152565b5161147c565b612545565b90604081019180835251600581036119bf57506117886117828351611407565b516125b4565b908151156119975761179a82516114f7565b9360c082019485525f5b8351811015611933576117ba6116d582866114cb565b80516014810361190857506117d16117d791611528565b60601c90565b73ffffffffffffffffffffffffffffffffffffffff811680156118c6575f5b8381106118325750509061182c600192611811838a516114cb565b9073ffffffffffffffffffffffffffffffffffffffff169052565b016117a4565b8161187761185e611844848d516114cb565b5173ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff1690565b14611884576001016117f6565b7f41fe18cc000000000000000000000000000000000000000000000000000000005f5273ffffffffffffffffffffffffffffffffffffffff831660045260245ffd5b7f59bff387000000000000000000000000000000000000000000000000000000005f5273ffffffffffffffffffffffffffffffffffffffff821660045260245ffd5b7f83e46ad2000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b509261178291945061194692505161148d565b61195081516115cc565b9260e081019384525f5b8251811015611991578061198a816119776116d5600195886114cb565b88519061198483836114cb565b526114cb565b500161195a565b50925050565b7f339e1ffb000000000000000000000000000000000000000000000000000000005f5260045ffd5b7f30c6792a000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b611a20906040519182917fd5edd2a500000000000000000000000000000000000000000000000000000000835260048301610934565b0390fd5b7f011b4d03dd8c01f1049143cf9c4c817e4b167f1d1b83e5c6f0f10d89ba1e7bce9150602083012014155f6116ea565b611a6461167061055e9251611428565b7fa19e609c000000000000000000000000000000000000000000000000000000005f52600452602490565b611a9f61168a61055e9251611417565b7ff71b722f000000000000000000000000000000000000000000000000000000005f52600452602490565b611ada61167061055e9251611407565b7fb8120dca000000000000000000000000000000000000000000000000000000005f52600452602490565b7fbc277732000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b67ffffffffffffffff1690815f52600460205260405f209167ffffffffffffffff83541615611b5c5750565b7ff761631b000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b6020611c26611b94611592565b611c0d611bab60408601611bb1611bab825161149d565b51612fa2565b611bba8561149d565b52611bc48461149d565b50611bd2611bab8251611407565b611bdb85611407565b52611be584611407565b50611bf3611bab82516114aa565b611bfc856114aa565b52611c06846114aa565b505161145b565b611c168261145b565b52611c208161145b565b50612771565b910190611c348251516115cc565b905f5b83518051821015611c8a579080600192600c82145f14611c78575050611c5c83612829565b611c6682866114cb565b52611c7181856114cb565b5001611c37565b611c8591611bab916114cb565b611c5c565b505050611c979150612771565b6020815191012090565b919091611cae83516114f7565b925f5b8151811015611ea757611cc481836114cb565b51805160418103611e7c575080601b60ff611d13611d0d611ce7611d2096612808565b517fff000000000000000000000000000000000000000000000000000000000000001690565b60f81c90565b1610611e29575b84613050565b90611d2a816128a3565b1590811591611e1f575b508015611e01575b611dd95773ffffffffffffffffffffffffffffffffffffffff81165f5b838110611d7957505090611d7360019261181183896114cb565b01611cb1565b81611d8a61185e611844848c6114cb565b14611d9757600101611d59565b7f33af0d5f000000000000000000000000000000000000000000000000000000005f5273ffffffffffffffffffffffffffffffffffffffff831660045260245ffd5b7f09cb44e6000000000000000000000000000000000000000000000000000000005f5260045ffd5b5073ffffffffffffffffffffffffffffffffffffffff811615611d3c565b905015155f611d34565b611e6b611e43611e3e611d0d611ce785612808565b612891565b60f81b7fff000000000000000000000000000000000000000000000000000000000000001690565b5f1a611e7682612808565b53611d1a565b7ff2db9ce1000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b505050565b5f198114610c975760010190565b905f915f5b8151811015611f1357611ef273ffffffffffffffffffffffffffffffffffffffff611eea83856114cb565b5116846128ad565b611eff575b600101611ebf565b92611f0b600191611eac565b939050611ef7565b50506003611f22915404610c89565b90818110611f2e575050565b7fe2dcb1b9000000000000000000000000000000000000000000000000000000005f5260045260245260445ffd5b905f198201918211610c9757565b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff408201918211610c9757565b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff808201918211610c9757565b6020039060208211610c9757565b91908203918211610c9757565b905f915f5b81518110156120385761201773ffffffffffffffffffffffffffffffffffffffff61200f83856114cb565b511684612904565b612024575b600101611fe4565b92612030600191611eac565b93905061201c565b50505190600382048203918211610c9757818110612054575050565b7f7818f4e4000000000000000000000000000000000000000000000000000000005f5260045260245260445ffd5b6120cc9261162b9261175d926040517fffffffffffffffffffffffffffffffffffffffff000000000000000000000000602082019260601b168252601481526104d7603482610afd565b805160021015611282576060610b9e91015161267f565b8054821015611282575f5260205f2001905f90565b919067ffffffffffffffff80612116855467ffffffffffffffff1690565b9216911614908115916121b7575b506121b1576002019081548151036121b1575f5b81518110156121a95761216e61214e82856120e3565b905473ffffffffffffffffffffffffffffffffffffffff9160031b1c1690565b73ffffffffffffffffffffffffffffffffffffffff61219361185e61184485876114cb565b9116036121a257600101612138565b5050505f90565b505050600190565b50505f90565b9050600182015414155f612124565b805f525f60205260ff6121fa8360405f209073ffffffffffffffffffffffffffffffffffffffff165f5260205260405f2090565b54166121b157805f525f6020526122328260405f209073ffffffffffffffffffffffffffffffffffffffff165f5260205260405f2090565b60017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0082541617905573ffffffffffffffffffffffffffffffffffffffff339216907f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d5f80a4600190565b805f525f60205260ff6122d18360405f209073ffffffffffffffffffffffffffffffffffffffff165f5260205260405f2090565b5416156121b157805f525f60205261230a8260405f209073ffffffffffffffffffffffffffffffffffffffff165f5260205260405f2090565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00815416905573ffffffffffffffffffffffffffffffffffffffff339216907ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b5f80a4600190565b60208151910120604051602081019182527f1260944489272988d9df285149b5aa1b0f48f2136d6f416159f840a3e07476006040820152604081526123b8606082610afd565b51902090565b604051906123cd602083610afd565b5f808352366020840137565b906123e382610b31565b6123f06040519182610afd565b828152601f1961151e8294610b31565b61162b612442919493946124146020610b31565b956124226040519788610afd565b602087526124306020610b31565b601f1960208901910136823752612545565b9061244d8451610ce1565b918451151580612525575b6124619061256b565b61247361246e5f85611fd2565b6123d9565b925f19015f5b81811061248d575050610b9e939450612a78565b8061250f600f6124d2612509611d0d611ce78d6124ac60029960011c90565b908d6125038a6124fb8a6124d26124c9611d0d611ce78a8a612818565b60041c600f1690565b1660f81b7fff000000000000000000000000000000000000000000000000000000000000001690565b5f1a92612818565b53612818565b60ff1690565b5f1a61251e6001830188612818565b5301612479565b506001612458565b6040519061253a82610ae1565b5f6020838281520152565b61254d61252d565b5060208151916040519261256084610ae1565b835201602082015290565b1561019557565b805180151590816125a8575b50156101955761258d90612d4e565b9051906020811061259c575090565b6020036101000a900490565b6021915011155f61257e565b6125bd81612d7a565b15610195576125cb81612d9a565b6125d4816114df565b916125e26040519384610afd565b818352601f196125f1836114df565b015f5b818110612668575050602061261491015161260e81612dfb565b90610cd4565b5f905b8282106126245750505090565b61266081612633600193612e66565b9061263c610b20565b82815281602082015261264f86896114cb565b5261265a85886114cb565b50610cd4565b910190612617565b60209061267361252d565b828288010152016125f4565b6021815103610195576020015160018101809111610c97575190565b805115610195576126ae610b9e91612d4e565b6126ba819392936123d9565b928360200190612f2f565b805191908290602001825e015f815290565b610b2f906126f96126f3949360405195869360208501906126c5565b906126c5565b03601f198101845283610afd565b6001907fff00000000000000000000000000000000000000000000000000000000000000610b9e949316815201906126c5565b916001610b9e94937fff000000000000000000000000000000000000000000000000000000000000006126f39416815201906126c5565b6127796123be565b905f915b81518310156127a55761279d60019161279685856114cb565b51906126d7565b92019161277d565b9150508051603881106127e45750610b9e6127c08251612fce565b916104c96127d4611e436125098651610caa565b916040519485936020850161273a565b6127f6611e43612509610b9e93610c9c565b6104c960405193849260208401612707565b8051604010156112825760600190565b908151811015611282570160200190565b600181511480612876575b610b9e578051603881106128645750610b9e6128508251612fce565b916104c96127d4611e436125098651610cc6565b6127f6611e43612509610b9e93610cb8565b50608060ff61288a611d0d611ce78561149d565b1610612834565b60ff601b9116019060ff8211610c9757565b6004111561029457565b905f5b82548110156121a25773ffffffffffffffffffffffffffffffffffffffff6128d882856120e3565b90549060031b1c1673ffffffffffffffffffffffffffffffffffffffff8316146121a9576001016128b0565b905f5b82518110156121a25773ffffffffffffffffffffffffffffffffffffffff61292f82856114cb565b511673ffffffffffffffffffffffffffffffffffffffff8316146121a957600101612907565b91906129618351610ce1565b908351151580612a6e575b6129759061256b565b61298261246e8284611fd2565b938192600180841614612a0c575b5f19869101935b8481106129a5575050505050565b83612a0360016129f9600f6124d2612509611d0d611ce78b60029b6129f26129e5886124d28f611d0d611ce76129de6124c99360011c90565b8099612818565b9b8d03809c5f1a92612818565b538c612818565b5f1a920189612818565b53018590612997565b92507f0f00000000000000000000000000000000000000000000000000000000000000612a4b612509611d0d611ce7612a458760011c90565b86612818565b60f81b165f1a612a5a8661149d565b535f19612a6683611eac565b939050612990565b508181111561296c565b915f915f612a8461252d565b50845115612d155790935f915b81518310156101955782158080612cff575b61019557159081612ce2575b5061019557612ac161178283836114cb565b948551600281145f14612bbe5750612ae3612ade6116d58861149d565b6130e5565b95612af9612af2888884613152565b8092610cd4565b965111612ba05715612b305750612b109051611f5c565b11610195575111612b27576116d5610b9e91611407565b50610b9e6123be565b919094612b3d8651611f5c565b82146101955780612b5f612b5b612b55600194611407565b51612d7a565b1590565b15612b8157612b70612b7691611407565b516130d7565b915b01919490612a91565b612b8d612b9a91611407565b5160208101519051902090565b91612b78565b505091509250612bb1915051611f5c565b1161019557610b9e6123be565b929491939192601103612c835781518314612c6557612bef612be9612509611d0d611ce78787612818565b93610c89565b92601081101561019557612c0c612c0682896114cb565b516130c1565b15612c2e5750505050612c2191925051611f5c565b0361019557610b9e6123be565b86612c46612b5b612b5584600196989a97999b6114cb565b15612c5857612b9a91612b70916114cb565b612b9a91612b8d916114cb565b505050612c729051611f5c565b03610195576116d5610b9e916114ba565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f696e76616c6964206e6f6465206c656e677468000000000000000000000000006044820152606490fd5b9050612cf7612cf184846114cb565b5161308a565b14155f612aaf565b50612d0d612b8d85856114cb565b871415612aa3565b509050612d4692507f56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b42191501461256b565b610b9e6123be565b906020820191612d5e8351612dfb565b925190838201809211610c975751928303928311610c97579190565b805115612d9557602060c0910151515f1a1061103757600190565b505f90565b805115612d95575f9060208101908151612db381612dfb565b8101809111610c9757915190518101809111610c975791905b828110612dd95750905090565b612de281612e66565b8101809111610c9757612df59091611eac565b90612dcc565b515f1a6080811015612e0c57505f90565b60b881108015612e50575b15612e225750600190565b60c0811015612e4157610b9e90612e3c9060b75b90611fd2565b610c89565b610b9e90612e3c9060f7612e36565b5060c08110158015612e17575060f88110612e17565b80515f1a906080821015612e7b575050600190565b60b8821015612e915750612e3c610b9e91611f97565b60c0821015612ed25760010151602082900360b7016101000a9004017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff4a0190565b60f8821015612ee85750612e3c610b9e91611f6a565b60010151602082900360f7016101000a9004017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0a0190565b601f8111610c97576101000a90565b90918015611ea7575b6020811015612f725780612f4b57505050565b612f5f612f5a612f6492611fc4565b612f20565b611f5c565b905182518216911916179052565b91908051825260208101809111610c97579060208101809111610c975791601f19810190811115612f3857610c5c565b612fac81516123d9565b90815115612fca57806020610b9e9201519051908360200190612f2f565b5090565b5f81805b61303c5750612fe0816123d9565b91815b612fec57505090565b612ff582611f5c565b6130277fff000000000000000000000000000000000000000000000000000000000000008360f81b165f1a9185612818565b5360081c908015610c97575f19019081612fe3565b9061304690611eac565b9060081c80612fd2565b8151919060418303613080576130799250602082015190606060408401519301515f1a906131f6565b9192909190565b50505f9160029190565b805160208110156130a2575060208101519051902090565b90602001512060405160208101918252602081526123b8604082610afd565b6001815103612d955760200151515f1a60801490565b6130e090612d4e565b902090565b9081511561019557600f6131016124c9611d0d611ce78661149d565b16806131145750610b9e60025f93612955565b600181036131295750610b9e60015f93612955565b6002810361313f5750610b9e6002600193612955565b60030361019557610b9e60018093612955565b91905f5b838101808211610c975782518110806131ec575b156131e45761319a7fff000000000000000000000000000000000000000000000000000000000000009184612818565b51167fff000000000000000000000000000000000000000000000000000000000000006131c78386612818565b511690036131dd576131d890611eac565b613156565b9250505090565b509250505090565b508351821061316a565b91907f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08411613285579160209360809260ff5f9560405194855216868401526040830152606082015282805260015afa1561327a575f5173ffffffffffffffffffffffffffffffffffffffff81161561327057905f905f90565b505f906001905f90565b6040513d5f823e3d90fd5b5050505f916003919056fea164736f6c634300081c000a","sourceMap":"242:2275:34:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;;;;-1:-1:-1;;242:2275:34;;;;;;;;;;;;;;;2639:47:93;2654:32;242:2275:34;2639:47:93;;:87;;;;;242:2275:34;;;;;;;;;;2639:87:93;844:25:133;829:40;;;2639:87:93;;;242:2275:34;-1:-1:-1;242:2275:34;;;;;-1:-1:-1;;242:2275:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;5606:2265:35;242:2275:34;;;:::i;:::-;-1:-1:-1;242:2275:34;;;;;;;;;;;;23225:42:35;23221:105;;5606:2265;:::i;:::-;242:2275:34;;;;;;;;;;;;;;;:::i;23221:105:35:-;23294:20;;:::i;:::-;5606:2265;:::i;242:2275:34:-;;;;;;;;;;;:::o;:::-;;;;;-1:-1:-1;;242:2275:34;;;;;;;;;3867:6:93;242:2275:34;3867:6:93;242:2275:34;;3867:22:93;242:2275:34;3867:6:93;242:2275:34;3867:22:93;242:2275:34;3776:120:93;;242:2275:34;;;;;;;;-1:-1:-1;;242:2275:34;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;4296:25:93;242:2275:34;;;:::i;:::-;4266:18:93;2475:4;4266:18;;3867:6;242:2275:34;3867:6:93;242:2275:34;;3867:22:93;242:2275:34;3867:6:93;242:2275:34;3867:22:93;242:2275:34;3776:120:93;;4266:18;2475:4;:::i;:::-;4296:25;:::i;:::-;242:2275:34;;;;;;;;:::i;:::-;735:10:121;242:2275:34;;;5387:34:93;5383:102;;5495:37;;;:::i;5383:102::-;5444:30;;;242:2275:34;5444:30:93;;242:2275:34;;;;;-1:-1:-1;;242:2275:34;;;;;;;;;;;;;;;;-1:-1:-1;;242:2275:34;;;;;;;-1:-1:-1;242:2275:34;;;;;;;;;23225:42:35;23221:105;;242:2275:34;9334:31:35;;:16;;;:31;:::i;:::-;;:::i;:::-;9380:9;;;;9400:1;9380:9;;;;:::i;:::-;:21;;;9376:97;;9542:31;242:2275:34;9688:10:35;9606:36;242:2275:34;9629:12:35;:9;9523:51;9542:31;;9688:95;9542:31;;;:::i;:::-;9523:51;:::i;:::-;9629:9;;;:::i;:::-;:12;;:::i;:::-;242:2275:34;;;:::i;:::-;9606:36:35;:::i;:::-;9688:10;;;:::i;242:2275:34:-;9714:26:35;9400:1;9714:26;;242:2275:34;;;;9752:29:35;;;242:2275:34;9752:29:35;;;;242:2275:34;;;;;;;9752:29:35;;-1:-1:-1;;9752:29:35;;;;;;:::i;:::-;242:2275:34;9742:40:35;;9688:95;;:::i;:::-;242:2275:34;;9793:109:35;;242:2275:34;9911:31:35;242:2275:34;;;;;;;;;;;;9911:31:35;242:2275:34;;;;;;;;;;;;;;;;;9793:109:35;9860:29;:20;9840:51;9860:20;;:::i;:::-;:29;:::i;:::-;9840:51;-1:-1:-1;9840:51:35;242:2275:34;;;;;9840:51:35;-1:-1:-1;9840:51:35;9376:97;9424:38;9445:9;;;;:::i;:::-;9424:38;-1:-1:-1;9424:38:35;9400:1;242:2275:34;;;;-1:-1:-1;242:2275:34;;;23221:105:35;23294:20;;:::i;:::-;23221:105;;242:2275:34;;;;;-1:-1:-1;;242:2275:34;;;;;;;;2089:33:35;242:2275:34;;;;;;;;-1:-1:-1;;242:2275:34;;;;;;;;;;;;;;;;-1:-1:-1;;242:2275:34;;;;;;;-1:-1:-1;242:2275:34;;;;;;;;;23225:42:35;23221:105;;242:2275:34;8106:31:35;;:16;;;:31;:::i;:::-;8152:9;;;;8172:1;8152:9;;;;:::i;:::-;:21;;;8148:97;;8258:10;;;;242:2275:34;8258:10:35;;;;:::i;:::-;:23;;;8254:102;;8425:31;242:2275:34;8638:10:35;8559:33;8570:10;8489:36;242:2275:34;8512:12:35;:9;8406:51;8425:31;;8638:95;8425:31;;;:::i;8406:51::-;8512:9;;;:::i;8489:36::-;8570:10;;;:::i;:::-;8559:33;;;;:::i;:::-;8638:10;;;:::i;242:2275:34:-;8664:26:35;8172:1;8664:26;;242:2275:34;;;;8702:29:35;;;242:2275:34;8702:29:35;;;;242:2275:34;;;;;;;8638:95:35;242:2275:34;;8747:20:35;8743:107;;8890:20;:29;:20;;:::i;:29::-;8934:28;;;;8930:116;;242:2275:34;9055:31:35;242:2275:34;;;;;;;8930:116:35;8985:50;-1:-1:-1;8985:50:35;242:2275:34;;;;;-1:-1:-1;9840:51:35;8743:107;8790:49;;;-1:-1:-1;8790:49:35;242:2275:34;;;;;-1:-1:-1;242:2275:34;;;8254:102:35;8304:41;8327:10;;;;:::i;:::-;8304:41;-1:-1:-1;8304:41:35;242:2275:34;;;;;-1:-1:-1;242:2275:34;;;23221:105:35;23294:20;;:::i;:::-;23221:105;;242:2275:34;;;;;;2920:29:93;242:2275:34;;;:::i;:::-;;2920:6:93;242:2275:34;2920:6:93;242:2275:34;;;2920:6:93;242:2275:34;;;;;;;;;;;;;2920:29:93;242:2275:34;;;;;;;;;;;;;;;-1:-1:-1;;242:2275:34;;;;;;;;;;;;;;;;4713:26:93;242:2275:34;;;:::i;:::-;4683:18:93;2475:4;4683:18;;3867:6;242:2275:34;3867:6:93;242:2275:34;;3867:22:93;242:2275:34;3867:6:93;242:2275:34;3867:22:93;242:2275:34;3776:120:93;;2475:4;4713:26;:::i;242:2275:34:-;;;;;;;:::i;:::-;-1:-1:-1;;23264:1:35;242:2275:34;;;;;;;;;23225:42:35;23221:105;;242:2275:34;10076:25:35;23264:1;10076:25;242:2275:34;23264:1:35;10076:25;23221:105;23294:20;;:::i;:::-;23221:105;;242:2275:34;;;;;;;:::o;:::-;-1:-1:-1;;242:2275:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;-1:-1:-1;;242:2275:34;;;;;5418:34:35;242:2275:34;;;;;:::i;5418:34:35:-;242:2275:34;;;;5534:25:35;5506:26;;;242:2275:34;5534:25:35;;242:2275:34;;;;;;;5469:91:35;242:2275:34;5469:91:35;;242:2275:34;;;;;;;;;;;;;;;;;;;-1:-1:-1;242:2275:34;;-1:-1:-1;242:2275:34;;-1:-1:-1;242:2275:34;;;;;;;5469:91:35;;;;;-1:-1:-1;;5469:91:35;;;;;;:::i;:::-;242:2275:34;;;;;;;:::i;:::-;;;;;;;;;;;;5506:26:35;242:2275:34;;;;;;;;;;;;-1:-1:-1;;242:2275:34;;;;;;;;;5021:11:35;242:2275:34;;5010:23:35;;;242:2275:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5010:23:35;;;;;;:::i;242:2275:34:-;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;:::i;:::-;;;;;;;;;;;;;;;:::o;:::-;;;-1:-1:-1;;242:2275:34;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;:::i;:::-;:::o;:::-;;;;;;;;-1:-1:-1;;242:2275:34;;;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;-1:-1:-1;242:2275:34;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;:::i;:::-;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;-1:-1:-1;;242:2275:34;;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;:::o;:::-;;;;;;;;;;;;2219:66:35;242:2275:34;;;;;;;:::o;:::-;;:::i;:::-;22287:4:35;242:2275:34;;;22287:4:35;242:2275:34;;;:::o;:::-;22441:4:35;242:2275:34;;;22441:4:35;242:2275:34;;;:::o;:::-;21614:4:35;242:2275:34;;;21614:4:35;242:2275:34;;;:::o;:::-;21756:4:35;242:2275:34;;;21756:4:35;242:2275:34;;;:::o;:::-;;;;;;;;;;:::o;:::-;;;;;;;;;8605:1:37;242:2275:34;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;242:2275:34;;;-1:-1:-1;242:2275:34;;;;;;;;;;;;;;;;-1:-1:-1;242:2275:34;;;;;;5606:2265:35;5790:40;5606:2265;5790:40;;;;:::i;:::-;5861:18;;;;:33;242:2275:34;5861:18:35;;242:2275:34;;;;;5861:33:35;5935:28;5948:14;;5935:28;:::i;:::-;5977:13;;;;242:2275:34;;;;;;;;;;;5977:18:35;5973:77;;6081:25;242:2275:34;;;;;;;;6063:43:35;;242:2275:34;;;6063:15:35;:43;:::i;:::-;6109:16;;;;242:2275:34;;;;;;;;;6063:62:35;242:2275:34;;;-1:-1:-1;6059:178:35;;-1:-1:-1;;6313:18:35;5861;6313:33;242:2275:34;;;6294:53:35;;242:2275:34;;9523:51:35;:::i;6294:53::-;242:2275:34;;;;;;;;;6374:31:35;;;:139;;;;5606:2265;6357:298;;;6708:25;;6928:79;6708:25;6764:72;6081:25;6692:62;6708:25;;;:::i;:::-;6735:18;;;;6692:62;;:::i;:::-;6803:32;;6764:72;;:::i;:::-;6877:17;;;;;;;;;:::i;:::-;6989;6971:16;242:2275:34;6081:11:35;242:2275:34;;;;;;6971:16:35;;242:2275:34;6989:17:35;;;6928:79;;:::i;:::-;7066:30;242:2275:34;;;;;;;;;;;;7066:15:35;242:2275:34;;;;;;;7066:30:35;7110:37;242:2275:34;;;;;;;7110:37:35;7106:303;;242:2275:34;;6081:25:35;242:2275:34;;;;7502:46:35;242:2275:34;7462:30:35;242:2275:34;;;;;;;;;7462:30:35;242:2275:34;;;;;;;7502:46:35;242:2275:34;;;;;;;;;;;7502:46:35;6081:11;7558:29;;242:2275:34;7642:17:35;7611:28;;242:2275:34;:::i;:::-;;;;;;;6081:25:35;242:2275:34;7674:55:35;;242:2275:34;;;;;;7674:55:35;242:2275:34;;;7674:55:35;7670:141;;7821:43;5861:33;5606:2265;:::o;7670:141::-;7745:55;;242:2275:34;;6081:25:35;242:2275:34;;;;;;;;6081:25:35;242:2275:34;;7745:55:35;5861:33;5606:2265;:::o;7106:303::-;242:2275:34;;7167:95:35;242:2275:34;;;;;;;7244:17:35;;7167:95;;:::i;:::-;7163:175;;7358:40;242:2275:34;;;;;;;;7358:40:35;5861:33;7358:40;242:2275:34;;7066:15:35;242:2275:34;;;;7163:175:35;6081:25;;-1:-1:-1;7282:41:35:o;6357:298::-;6545:99;242:2275:34;;;;;;;;;6545:99:35;5861:33;6545:99;242:2275:34;;;;6545:99:35;242:2275:34;6063:15:35;242:2275:34;;;;;;;;6374:139:35;6063:15;;6425:69;6063:15;242:2275:34;6425:40:35;242:2275:34;;;;;;;6425:40:35;:69;:::i;:::-;:88;;6374:139;;;6059:178;6148:78;5861:33;6148:78;6063:15;6148:78;242:2275:34;;;;;;;;;;;-1:-1:-1;9840:51:35;5973:77;6018:21;5861:33;6018:21;;5861:33;6018:21;242:2275:34;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;:::i;:::-;;;:::o;:::-;;:::i;3165:103:93:-;735:10:121;2920:6:93;242:2275:34;;;;;;;;;;;;3485:23:93;3481:108;;3165:103::o;3481:108::-;3531:47;2920:6;3531:47;735:10:121;3531:47:93;242:2275:34;2089:33:35;242:2275:34;;;2920:6:93;3531:47;3165:103;242:2275:34;2920:6:93;242:2275:34;2920:6:93;242:2275:34;;;2920:29:93;735:10:121;242:2275:34;2920:6:93;242:2275:34;;;;;;;;;;;;;2920:29:93;242:2275:34;;3485:23:93;3481:108;;3165:103;:::o;3481:108::-;3531:47;2920:6;3531:47;735:10:121;3531:47:93;242:2275:34;;;;2920:6:93;3531:47;19777:177:35;242:2275:34;;19858:19:35;19854:94;;19777:177;:::o;19854:94::-;19900:37;19876:1;19900:37;;242:2275:34;;19876:1:35;19900:37;242:2275:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;242:2275:34;;;;-1:-1:-1;242:2275:34;;;;-1:-1:-1;242:2275:34;;;;;;;;;;;:::o;:::-;;;10971:1:35;242:2275:34;;;;;;;:::o;:::-;;;11140:1:35;242:2275:34;;;;;;;:::o;:::-;;;11279:2:35;242:2275:34;;;;;;;:::o;:::-;;;11465:2:35;242:2275:34;;;;;;;:::o;:::-;;;11508:1:35;242:2275:34;;;;;;;:::o;:::-;;;11738:1:35;242:2275:34;;;;;;;:::o;:::-;;;11811:2:35;242:2275:34;;;;;;;:::o;:::-;;;11879:2:35;242:2275:34;;;;;;;:::o;:::-;;;13110:1:35;242:2275:34;;;;;;;:::o;:::-;;;;;;;;;:::o;:::-;;;2050:1;242:2275;;;;;;;:::o;:::-;;;7571:2:37;242:2275:34;;;;;;;:::o;:::-;;;;;;;;;;;;;;;:::o;2219:66:35:-;;;;;;;;;;;:::o;:::-;;;;;:::i;:::-;242:2275:34;;;;;;:::i;:::-;2219:66:35;;;-1:-1:-1;;2219:66:35;;;;:::i;:::-;;;;;;;;:::o;:::-;;242:2275:34;;;;;2219:66:35;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;242:2275:34;2219:66:35;;;:::o;:::-;242:2275:34;;2219:66:35;;242:2275:34;;2219:66:35;242:2275:34;;:::i;:::-;1856:1;2219:66:35;;;-1:-1:-1;;2219:66:35;;-1:-1:-1;2219:66:35;;;;;;;;;:::o;:::-;;242:2275:34;2219:66:35;;;;;;;;;;;;;;;:::i;:::-;242:2275:34;;;;;;:::i;:::-;2219:66:35;;;-1:-1:-1;;2219:66:35;;;;:::i;:::-;;;-1:-1:-1;2219:66:35;;;;;;;;;:::o;:::-;;242:2275:34;2219:66:35;;;;;;;;;;10610:2705;10776:30;:21;242:2275:34;;:::i;:::-;10717:28:35;;;;10776:21;:::i;:::-;:30;:::i;:::-;10755:18;;;:51;;;;242:2275:34;10848:2:35;10820:30;;10816:114;;10952:18;2401:66;10952:36;:21;:18;;:21;:::i;:::-;;:36;:::i;:::-;10944:66;10940:168;;10971:1;11121:30;:21;:18;;:21;:::i;:::-;;:30;:::i;:::-;:35;11117:122;;2219:66;11260:37;:22;:18;;:22;:::i;:37::-;11252:67;11248:167;;11446:32;:22;:18;;:22;:::i;:::-;;:32;:::i;:::-;242:2275:34;;11508:1:35;11492:17;;;;;:73;;;10610:2705;11488:130;;;11651:18;11926:21;11860:32;:22;11651:18;11628:54;11644:38;11651:30;:21;11926:30;11651:18;;:21;:::i;11644:38::-;242:2275:34;;11628:13:35;;;2219:66;;11628:54;11719:36;:21;:18;;:21;:::i;:36::-;11692:16;;;2219:66;11766:58;11785:39;11792:31;:22;:18;;:22;:::i;11785:39::-;242:2275:34;;11766:16:35;;;2219:66;;11766:58;11860:18;:22;:::i;:32::-;11926:21;:::i;:30::-;11902:21;;;;:54;;;;242:2275:34;12002:1:35;11970:33;;11966:123;;12143:21;:33;:24;:21;;:24;:::i;:::-;;:33;:::i;:::-;242:2275:34;;;12190:26:35;12186:83;;12299:36;242:2275:34;;12299:36:35;:::i;:::-;12279:17;;;;:56;;;-1:-1:-1;12392:3:35;242:2275:34;;12365:25:35;;;;;12441:27;:17;;;;:::i;:27::-;242:2275:34;;12511:2:35;12486:27;;12482:125;;12649:23;;12641:32;12649:23;;:::i;:::-;2219:66;;;;12641:32;242:2275:34;;;12691:23:35;;12687:103;;-1:-1:-1;12823:5:35;;;;;;12996:17;;;:32;10971:1;12996:17;:32;:17;;;:32;:::i;:::-;2219:66;242:2275:34;;2219:66:35;;;12996:32;2219:66;12350:13;;12830:3;12857:17;:33;:20;;:17;;;:20;:::i;:::-;242:2275:34;;;;;12857:20:35;242:2275:34;;;;12857:33:35;;12853:116;;10971:1;2219:66;12808:13;;12853:116;12921:29;-1:-1:-1;12921:29:35;242:2275:34;;;12741:34:35;242:2275:34;2219:66:35;-1:-1:-1;9840:51:35;12687:103;12741:34;-1:-1:-1;12741:34:35;242:2275:34;;;12741:34:35;242:2275:34;2219:66:35;-1:-1:-1;9840:51:35;12482:125;12540:52;-1:-1:-1;12540:52:35;242:2275:34;;;-1:-1:-1;9840:51:35;12365:25;;;13088:24;12365:25;;;13088:33;12365:25;;13088:21;:24;:::i;:33::-;13152:29;242:2275:34;;13152:29:35;:::i;:::-;13131:18;;;;:50;;;-1:-1:-1;13233:3:35;242:2275:34;;13211:20:35;;;;;13276:12;13252:46;13276:12;:22;:12;10971:1;13276:12;;;:::i;:22::-;13252:18;;:46;;;;;:::i;:::-;;;:::i;:::-;;2219:66;13196:13;;13211:20;;;;;10610:2705::o;12186:83::-;12239:19;-1:-1:-1;12239:19:35;;-1:-1:-1;12239:19:35;11966:123;12026:52;-1:-1:-1;12026:52:35;242:2275:34;;;-1:-1:-1;9840:51:35;11488:130;11588:19;242:2275:34;;;11588:19:35;;;;;;;;;;:::i;:::-;;;;11492:73;11533:32;242:2275:34;;10755:18:35;242:2275:34;;11513:16:35;:52;;11492:73;;;11248:167;11365:37;:22;11342:62;11365:18;;:22;:::i;:37::-;11342:62;-1:-1:-1;11342:62:35;242:2275:34;;;;;11117:122:35;11197:30;:21;11179:49;11197:18;;:21;:::i;:30::-;11179:49;-1:-1:-1;11179:49:35;242:2275:34;;;;;10940:168:35;11059:36;:21;11033:64;11059:18;;:21;:::i;:36::-;11033:64;-1:-1:-1;11033:64:35;242:2275:34;;;;;10816:114:35;10873:46;10717:16;10873:46;242:2275:34;;;-1:-1:-1;9840:51:35;19356:292;242:2275:34;;;;-1:-1:-1;242:2275:34;19496:15:35;242:2275:34;;;-1:-1:-1;242:2275:34;;;;;;19541:29:35;19537:105;;19356:292;:::o;19537:105::-;19593:38;-1:-1:-1;19593:38:35;19496:15;242:2275:34;;-1:-1:-1;19593:38:35;1710:805:34;2238:18;2161:26;1844:14;;:::i;:::-;21201:17:35;2093:24:34;1898:21;;;21201:17:35;1898:24:34;:21;;:24;:::i;:::-;;21201:17:35;:::i;:::-;1868:55:34;;;:::i;:::-;;;;;:::i;:::-;;21201:17:35;1963:24:34;:21;;:24;:::i;21201:17:35:-;1933:55:34;;;:::i;:::-;;;;;:::i;:::-;;21201:17:35;2028:24:34;:21;;:24;:::i;21201:17:35:-;1998:55:34;;;:::i;:::-;;;;;:::i;:::-;;2093:21;:24;:::i;21201:17:35:-;2063:55:34;;;:::i;:::-;;;;;:::i;:::-;;2161:26;:::i;:::-;2238:18;;;2226:38;2238:18;;242:2275;2226:38;:::i;:::-;2279:13;1920:1;2325:3;2298:18;;242:2275;;2294:29;;;;;2361:82;;1985:1;2361:82;2366:2;2361:7;;:82;2366:2;;;2371:33;;;;;:::i;:::-;2344:99;;;;:::i;:::-;;;;;;:::i;:::-;;2219:66:35;2279:13:34;;2361:82;21201:17:35;2421:21:34;;;;:::i;21201:17:35:-;2361:82:34;;2294:29;;;;2480:27;2294:29;;2480:27;:::i;:::-;2238:18;242:2275;;;;2470:38;1710:805;:::o;14632:509:35:-;;;;14764:27;242:2275:34;;14764:27:35;:::i;:::-;14806:13;14818:1;14839:3;242:2275:34;;14821:16:35;;;;;14898:8;;;;:::i;:::-;;242:2275:34;;15459:2:35;15444:17;;15440:95;;15554:8;;15566:2;242:2275:34;15548:15:35;15554:8;;15709:30;15554:8;;:::i;:::-;242:2275:34;;;;;15554:8:35;242:2275:34;;;;15548:15:35;242:2275:34;15548:20:35;15544:90;;14839:3;15709:30;;:::i;:::-;242:2275:34;;;;:::i;:::-;15753:33:35;;;;:64;;;14839:3;15753:88;;;;;14839:3;15749:145;;242:2275:34;;;14818:1:35;14941:5;;;;;;15105:19;;;;2219:66;15105:19;;;;;:::i;:::-;2219:66;14806:13;;14948:3;14975:10;:20;:10;;;;;:::i;:20::-;;14971:107;;2219:66;;14926:13;;14971:107;15026:33;14818:1;15026:33;242:2275:34;;;12741:34:35;242:2275:34;2219:66:35;-1:-1:-1;9840:51:35;15749:145;15864:19;14818:1;15864:19;;14818:1;15864:19;15753:88;242:2275:34;;;;15821:20:35;15753:88;;:64;15790:27;;;;15753:64;;;15544:90;15595:28;15602:20;:15;15608:8;;;;:::i;15602:15::-;:20;:::i;:::-;242:2275:34;;;;;;15595:28:35;14818:1;15584:39;;;;:::i;:::-;;15544:90;;15440:95;15484:40;14818:1;15484:40;242:2275:34;;;-1:-1:-1;9840:51:35;14821:16;;;;14632:509::o;242:2275:34:-;-1:-1:-1;;242:2275:34;;;;;;;:::o;16130:544:35:-;;16315:1;16331:13;16315:1;16366:3;242:2275:34;;16346:18:35;;;;;16389:47;242:2275:34;16425:10:35;;;;:::i;:::-;242:2275:34;;16389:47:35;;:::i;:::-;16385:94;;16366:3;2219:66;;16331:13;;16385:94;16456:8;;2219:66;16456:8;;:::i;:::-;16385:94;;;;;16346:18;;;16545:1;16518:32;16346:18;242:2275:34;;16518:32:35;:::i;:::-;16564:17;;;;16560:108;;16130:544;;:::o;16560:108::-;16604:53;16315:1;16604:53;242:2275:34;;;;;16315:1:35;16604:53;242:2275:34;;-1:-1:-1;;242:2275:34;;;;;;;:::o;:::-;;;;;;;;;;:::o;:::-;;;;;;;;;;:::o;:::-;;;;;;;;;:::o;:::-;;;;;;;;;;:::o;16897:549:35:-;;17024:1;17040:13;17024:1;17075:3;242:2275:34;;17055:18:35;;;;;17098:39;242:2275:34;17126:10:35;;;;:::i;:::-;242:2275:34;;17098:39:35;;:::i;:::-;17094:86;;17075:3;2219:66;;17040:13;;17094:86;17157:8;;2219:66;17157:8;;:::i;:::-;17094:86;;;;;17055:18;;;242:2275:34;;17329:1:35;242:2275:34;;;;;;;;;17344:17:35;;;17340:100;;16897:549;;:::o;17340:100::-;17384:45;17024:1;17384:45;242:2275:34;;;;;17024:1:35;17384:45;13610:440;13956:31;13610:440;13956:22;13610:440;13828:76;13610:440;242:2275:34;;;13877:25:35;;;242:2275:34;;;;;;13877:25:35;;;;;;;:::i;13956:31::-;242:2275:34;;14025:1:35;242:2275:34;;;;;14012:30:35;242:2275:34;;14012:15:35;:30;:::i;242:2275:34:-;;;;;;;;-1:-1:-1;242:2275:34;;-1:-1:-1;242:2275:34;;;-1:-1:-1;242:2275:34;:::o;18469:677:35:-;;;242:2275:34;;;;;;;;;;;;;;18716:37:35;;;;:82;;;18469:677;18712:125;;;18850:25;;242:2275:34;;;;;18850:53:35;18846:96;;242:2275:34;18994:3:35;242:2275:34;;18971:21:35;;;;;242:2275:34;19017:28:35;;;;:::i;:::-;242:2275:34;;;;;;;;;;;;19017:45:35;19049:13;;;;;:::i;19017:45::-;242:2275:34;;19017:45:35;19013:96;;2219:66;;18956:13;;19013:96;19082:12;;;242:2275:34;19082:12:35;:::o;18971:21::-;;;;2219:66;18469:677;:::o;18846:96::-;18919:12;;242:2275:34;18919:12:35;:::o;18716:82::-;18757:26;;;;;242:2275:34;18757:41:35;;18716:82;;;6145:316:93;242:2275:34;;;;;;;2920:29:93;242:2275:34;;;;;;;;;;;;;;;;2920:29:93;242:2275:34;;;;;;;;;;6281:29:93;242:2275:34;;;;;;;;;;;;;;;;6281:29:93;6313:4;242:2275:34;;;;;;;;735:10:121;242:2275:34;;6336:40:93;;242:2275:34;6336:40:93;;6313:4;6390:11;:::o;6698:317::-;242:2275:34;;;;;;;2920:29:93;242:2275:34;;;;;;;;;;;;;;;;2920:29:93;242:2275:34;;;;;;;;;;;6834:29:93;242:2275:34;;;;;;;;;;;;;;;;6834:29:93;242:2275:34;;;;;;;735:10:121;242:2275:34;;6890:40:93;;242:2275:34;6890:40:93;;242:2275:34;6944:11:93;:::o;14234:174:35:-;242:2275:34;;;;;14358:18:35;242:2275:34;;;14347:53:35;;242:2275:34;;;2612:66:35;242:2275:34;;;;;14347:53:35;;;;;;:::i;:::-;242:2275:34;14337:64:35;;14234:174;:::o;242:2275:34:-;;;;;;;;:::i;:::-;22080:1:35;242:2275:34;;;2219:66:35;242:2275:34;;;2219:66:35;242:2275:34:o;:::-;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;-1:-1:-1;;242:2275:34;;;;:::i;1287:390:37:-;1607:20;:29;1287:390;;;;242:2275:34;1508:2:37;242:2275:34;:::i;:::-;;;;;;;;:::i;:::-;1508:2:37;242:2275:34;;;1508:2:37;242:2275:34;:::i;:::-;-1:-1:-1;;1508:2:37;242:2275:34;;;;2219:66:35;;;1521:63:37;1607:20;:::i;:29::-;1648:21;8593:13;242:2275:34;;8593:13:37;:::i;:::-;242:2275:34;;;8624:13:37;;:33;;;1287:390;8616:42;;;:::i;:::-;8679:26;8689:15;-1:-1:-1;8689:15:37;;:::i;:::-;8679:26;:::i;:::-;8715:18;-1:-1:-1;;242:2275:34;1667:1:37;8901:14;;;;;;1600:70;;;;;;;:::i;8917:6::-;8982:5;9046:37;8998:3;9054:21;:16;9060:9;;8982:5;;8605:1;8982:5;242:2275:34;;;;8982:5:37;8979:9;;8943:59;8979:9;8965:37;8979:9;8973:21;:16;8979:9;;;;;:::i;8973:16::-;242:2275:34;;;;;;8973:21:37;8972:29;242:2275:34;;;;;;8965:37:37;1667:1;8943:59;;;:::i;:::-;;9060:9;:::i;9054:16::-;242:2275:34;;;;9046:37:37;1667:1;9020:63;;8756:1;242:2275:34;;9020:63:37;;:::i;:::-;;242:2275:34;8894:204:37;;8624:33;-1:-1:-1;8641:16:37;8624:33;;242:2275:34;;;;;;;:::i;:::-;-1:-1:-1;242:2275:34;;;;;;;:::o;2457:221:38:-;242:2275:34;;:::i;:::-;;2568:58:38;242:2275:34;;;;;;;;;:::i;:::-;2219:66:35;;2568:58:38;;2643:28;;2219:66:35;2457:221:38;:::o;242:2275:34:-;;;;:::o;7796:439:38:-;242:2275:34;;7883:12:38;;;:30;;;;7796:439;242:2275:34;;;;7957:21:38;;;:::i;:::-;7989:14;8013:192;;;;;;;8215:13;7796:439;:::o;8013:192::-;;;;;;;7796:439;:::o;7883:30::-;7911:2;7899:14;;;;7883:30;;;4170:519;4266:12;;;:::i;:::-;242:2275:34;;;4306:14:38;;;:::i;:::-;2219:66:35;;;:::i;:::-;242:2275:34;;;;;;;:::i;:::-;2219:66:35;;;-1:-1:-1;;242:2275:34;;;:::i;:::-;;-1:-1:-1;242:2275:34;;;;;;4404:11:38;;242:2275:34;4404:41:38;:11;;242:2275:34;4418:27:38;;;:::i;:::-;4404:41;;:::i;:::-;-1:-1:-1;4480:179:38;4500:9;;;;;;4669:13;;;4170:519;:::o;4511:3::-;4632:16;4540:19;;2219:66:35;4540:19:38;;:::i;:::-;242:2275:34;;;:::i;:::-;2219:66:35;;;4585:24:38;242:2275:34;4585:24:38;;2219:66:35;4573:36:38;;;;:::i;:::-;;;;;;:::i;:::-;;4632:16;:::i;:::-;4511:3;2219:66:35;4485:13:38;;;242:2275:34;;;;;:::i;:::-;;;;;;;;;;8413:298:38;8545:2;242:2275:34;;8533:14:38;242:2275:34;;8600:11:38;;242:2275:34;8614:1:38;242:2275:34;;;;;;;8625:56:38;8413:298;:::o;8857:379::-;242:2275:34;;8950:12:38;242:2275:34;;9006:21:38;9202:3;9006:21;;:::i;:::-;9059:14;;;;;;:::i;:::-;9109:61;;;;9202:3;;:::i;242:2275:34:-;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;:::i;:::-;;;:::i;:::-;;-1:-1:-1;;242:2275:34;;;;;;:::i;:::-;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;21954:538:35:-;22070:12;;:::i;:::-;22097:13;22080:1;22092:109;22130:3;242:2275:34;;22112:16:35;;;;;22159:31;2219:66;22181:8;;;;;:::i;:::-;;22159:31;;:::i;:::-;22130:3;2219:66;22097:13;;;22112:16;;;;242:2275:34;;22232:2:35;22215:19;;22211:120;;242:2275:34;22411:74:35;22365:29;242:2275:34;;22365:29:35;:::i;:::-;242:2275:34;22411:74:35;22428:37;22435:29;22441:22;242:2275:34;;22441:22:35;:::i;22428:37::-;242:2275:34;;;22411:74:35;;;;;;;:::i;22211:120::-;22274:36;22281:28;22287:21;22257:63;22287:21;;:::i;22274:36::-;22257:63;242:2275:34;;22257:63:35;;;;;;;:::i;242:2275:34:-;;;15559:2:35;242:2275:34;;;;;;;:::o;:::-;;;;;;;;;;;;;:::o;21363:440:35:-;21471:1;242:2275:34;;21457:15:35;:39;;;21363:440;21453:80;;242:2275:34;;21559:2:35;21546:15;;21542:108;;242:2275:34;21726:70:35;21684:25;242:2275:34;;21684:25:35;:::i;:::-;242:2275:34;21726:70:35;21743:37;21750:29;21756:22;242:2275:34;;21756:22:35;:::i;21542:108::-;21601:32;21608:24;21614:17;21584:55;21614:17;;:::i;21457:39::-;21482:6;21492:4;242:2275:34;21476:13:35;21482:6;;;;:::i;21476:13::-;242:2275:34;21476:20:35;21457:39;;242:2275:34;;;;;;;;;;;;:::o;:::-;;-1:-1:-1;242:2275:34;;;:::o;20174:284:35:-;;242:2275:34;20328:3:35;242:2275:34;;20305:21:35;;;;;242:2275:34;20351:13:35;;;;:::i;:::-;242:2275:34;;;;;;;;;;20351:23:35;20347:73;;2219:66;;20290:13;;20676:282;;242:2275:34;20828:3:35;242:2275:34;;20805:21:35;;;;;242:2275:34;20851:13:35;;;;:::i;:::-;242:2275:34;;;;;20851:23:35;20847:73;;2219:66;;20790:13;;8465:649:37;;;8593:13;242:2275:34;;8593:13:37;:::i;:::-;242:2275:34;;;8624:13:37;;:33;;;8465:649;8616:42;;;:::i;:::-;8679:26;8689:15;;;;:::i;8679:26::-;8715:18;;8747:10;8756:1;8747:10;;;:15;8743:118;;8465:649;-1:-1:-1;;242:2275:34;;;8894:204:37;8901:14;;;;;;8465:649;;;;;:::o;8917:6::-;8982:5;9020:63;8756:1;9046:37;8998:3;9054:21;:16;9060:9;;8982:5;8605:1;8982:5;8943:59;8965:37;8982:5;8973:21;8982:5;8979:9;;8982:5;8973:16;8982:5;242:2275:34;;;;8982:5:37;8979:9;;;:::i;8965:37::-;242:2275:34;;;8943:59:37;;8636:1;8943:59;;;:::i;:::-;;9060:9;;:::i;9046:37::-;8636:1;9020:63;242:2275:34;;9020:63:37;;:::i;:::-;;242:2275:34;8894:204:37;;;;8743:118;8808:10;;242:2275:34;8799:26:37;:21;8805:14;;8808:10;;242:2275:34;;;;8808:10:37;8805:14;;:::i;8799:26::-;242:2275:34;;;8636:1:37;8778:55;;;;:::i;:::-;;-1:-1:-1;;8847:3:37;;;:::i;:::-;8743:118;;;;;8624:33;-1:-1:-1;8641:16:37;;;;8624:33;;2316:5431;;2546:1;2557:33;2546:1;242:2275:34;;:::i;:::-;;;;2689:17:37;2685:223;;2976:13;;2546:1;2971:4724;3009:3;242:2275:34;;2991:16:37;;;;;3091:6;;;;:50;;3009:3;3087:97;;3298:6;:47;;;;3009:3;3294:94;;;3514:17;:8;;;;:::i;:17::-;242:2275:34;;;3565:1:37;3550:16;;3546:4139;3565:1;;;3744:7;3716:46;3744:17;:7;;;:::i;:17::-;3716:46;:::i;:::-;3804:56;3878:28;3804:56;;;;;:::i;:::-;3878:28;;;:::i;:::-;242:2275:34;;-1:-1:-1;3925:994:37;;4937:1185;;;242:2275:34;5015:16:37;242:2275:34;;5015:16:37;:::i;:::-;-1:-1:-1;5007:144:37;;242:2275:34;-1:-1:-1;5173:109:37;;5315:7;5351:18;5315:7;;:::i;5173:109::-;5247:12;;;:::i;4937:1185::-;242:2275:34;;;5494:16:37;242:2275:34;;5494:16:37;:::i;:::-;5489:21;;5485:138;;5650:7;5649:17;5650:16;:7;2219:66:35;5650:7:37;;:::i;:::-;;:16;:::i;:::-;5649:17;;242:2275:34;5649:17:37;5650:7;;;5837;:26;:7;;:::i;:::-;;:26;:::i;:::-;5645:459;;2219:66:35;2976:13:37;;;;;5645:459;6054:7;:27;:7;;:::i;:::-;;5445:11:38;;;242:2275:34;;;5522:62:38;;5341:272;;6054:27:37;5645:459;;;3925:994;242:2275:34;;;;;;4718:16:37;242:2275:34;;;4718:16:37;:::i;:::-;-1:-1:-1;4710:149:37;;4888:12;;:::i;3546:4139::-;6146:17;;;;;;6161:2;6146:17;6161:2;;242:2275:34;;6219:36:37;;6235:20;;6451:17;6386:43;6394:34;6400:27;;;;;:::i;6386:43::-;6451:17;;:::i;:::-;6494:12;6504:2;6494:12;;;6490:146;;6662:33;6682:12;;;;:::i;:::-;;6662:33;:::i;:::-;6682:12;;;242:2275:34;;;;6766:16:37;242:2275:34;;;;6766:16:37;:::i;:::-;6761:21;6757:157;;6947:12;;:::i;6658:555::-;6993:12;6992:22;6993:21;:12;;2219:66:35;6993:12:37;;;;;;;:::i;6992:22::-;6993:12;;;7057:31;:12;;;;:::i;6988:225::-;7158:32;:12;;;;:::i;6215:1388::-;242:2275:34;;;7411:16:37;242:2275:34;;7411:16:37;:::i;:::-;7406:21;7402:135;;7566:8;:18;:8;;:::i;6142:1543::-;242:2275:34;;7641:29:37;;;242:2275:34;7641:29:37;;;242:2275:34;;;;;;;;;;;;;11588:19:35;3298:47:37;3336:8;;3324:21;3336:8;;;;:::i;:::-;;3324:21;:::i;:::-;3308:37;;3298:47;;;3091:50;3113:8;:28;:8;;;;:::i;:28::-;3101:40;;;3091:50;;2685:223;2785:78;;;2777:87;2785:78;;2797:66;2785:78;;;2777:87;:::i;:::-;2885:12;;:::i;3469:281:38:-;;3598:11;;;242:2275:34;3583:27:38;242:2275:34;;3583:27:38;:::i;:::-;242:2275:34;;;;;;;;;;;;;;;;;;;;3723:20:38;3469:281;:::o;4838:321::-;242:2275:34;;4918:13:38;4914:31;;4994:11;868:4;4994:11;;242:2275:34;5015:64:38;242:2275:34;5015:64:38;5093:24;5089:42;;5148:4;4838:321;:::o;4914:31::-;4933:12;242:2275:34;4933:12:38;:::o;9434:424::-;242:2275:34;;9518:13:38;9514:27;;242:2275:34;9597:11:38;;;;242:2275:34;;;9611:27:38;;;:::i;:::-;242:2275:34;;;;;;;;;;;;;;;;;;9697:132:38;;9704:16;;;;;;9839:12;;;9434:424;:::o;9697:132::-;9756:20;;;:::i;:::-;242:2275:34;;;;;;;9811:7:38;9736:40;9811:7;;:::i;:::-;9697:132;;;11485:581;11589:64;242:2275:34;11589:64:38;682:4;11667:26;;682:4;;;11709:8;242:2275:34;11709:8:38;:::o;11663:397::-;776:4;11738:25;;:83;;;;11663:397;11734:326;;;11837:8;11844:1;11837:8;:::o;11734:326::-;868:4;11866:24;;868:4;;;11943:35;;:31;;958:4;11943:31;;;:::i;:::-;:35;:::i;11862:198::-;12016:33;;:29;;958:4;12016:29;242:2275:34;11738:83:38;11768:25;868:4;11768:25;;;:52;;11738:83;11768:52;11797:23;958:4;11797:23;;11738:83;;10045:1263;10171:64;;-1:-1:-1;10171:64:38;;682:4;10249:26;;682:4;;;10291:11;;10301:1;10045:1263;:::o;10245:1032::-;776:4;10323:25;;776:4;;;10374:26;;:30;:26;;:::i;10319:958::-;868:4;10425:24;;868:4;;;10465:385;;;;;;;;;;;;;;;;242:2275:34;:::o;10421:856:38:-;958:4;10870:23;;958:4;;;10919:24;;:28;:24;;:::i;10866:411::-;10978:289;;;;;;;;;;;;;;;;242:2275:34;:::o;1035:2:38:-;;;;;;;;;:::o;12279:770::-;;;12360:8;;12356:21;;12441:16;1035:2;12441:16;;;;;12642:7;12638:405;;12279:770;;;:::o;12638:405::-;12764:24;12772:15;12764:28;12772:15;;:::i;:::-;12764:24;:::i;:::-;:28;:::i;:::-;12806:227;;;;;;;;;;;;12279:770::o;12459:16::-;12491:65;;;;;;1035:2;242:2275:34;;;;;;;12600:17:38;1035:2;242:2275:34;;;;;;;12459:16:38;-1:-1:-1;;242:2275:34;;;;;;12434:194:38;242:2275:34;;:::i;6262:337:38:-;6372:19;242:2275:34;;6372:19:38;:::i;:::-;242:2275:34;;;6405:18:38;6401:37;;6542:11;6470:57;6560:8;6542:11;;242:2275:34;;;6470:57:38;;;;6560:8;;:::i;6401:37::-;6425:13;;:::o;22655:430:35:-;-1:-1:-1;22740:19:35;;22800:8;;;22895:17;;;;:::i;:::-;22922:11;22943:116;22968:5;;;23068:10;;22655:430;:::o;22975:3::-;22998:5;;;:::i;:::-;22994:31;242:2275:34;;;;;-1:-1:-1;22994:31:35;;;;:::i;:::-;;242:2275:34;;22975:3:35;242:2275:34;;;;-1:-1:-1;;242:2275:34;22948:18:35;;;;22793:73;22824:8;;;;:::i;:::-;242:2275:34;22854:1:35;242:2275:34;22793:73:35;;;2419:778:131;242:2275:34;;;2419:778:131;2609:2;2589:22;;2609:2;;3041:25;2825:196;;;;;;;;;;;;;;;-1:-1:-1;2825:196:131;3041:25;;:::i;:::-;3034:32;;;;;:::o;2585:606::-;3097:83;;3113:1;3097:83;3117:35;3097:83;;:::o;10983:270:37:-;242:2275:34;;11094:2:37;11082:14;;11094:2;;;5445:11:38;11094:2:37;5445:11:38;;242:2275:34;;;5522:62:38;;11112:32:37;:::o;11078:169::-;5445:11:38;11094:2:37;5445:11:38;242:2275:34;5522:62:38;242:2275:34;;11094:2:37;11192:43;;242:2275:34;;;11094:2:37;11192:43;;;242:2275:34;11192:43:37;;:::i;7932:335::-;8047:1;242:2275:34;;8035:13:37;8031:56;;8130:11;;242:2275:34;8151:60:37;242:2275:34;8151:60:37;8232:4;8227:9;;7932:335::o;5788:270:38:-;5909:21;5788:270;5909:21;:::i;:::-;5964:65;;5788:270;:::o;9355:729:37:-;;242:2275:34;;9485:13:37;242:2275:34;;9551:3:37;9531:17;:12;9537:5;;;;:::i;9531:17::-;:23;9596:16;;;9628:10;10051:25;9637:1;242:2275:34;9592:434:37;10051:25;:::i;9592:434::-;9702:1;9687:16;;9702:1;;9719:10;10051:25;9702:1;242:2275:34;9683:343:37;10051:25;:::i;9683:343::-;9793:1;9778:16;;9793:1;;9810:10;10051:25;9793:1;9702;9774:252;10051:25;:::i;9774:252::-;9883:1;9868:16;9883:1;;10051:25;9702:1;9924:13;9864:162;10051:25;:::i;10366:320::-;;;242:2275:34;10561:3:37;242:2275:34;;;;;;;;;;10518:24:37;;:41;;;10561:3;10518:41;;;10584:16;242:2275:34;;10584:16:37;;:::i;:::-;242:2275:34;;;10604:5:37;;;;:::i;:::-;242:2275:34;;10584:25:37;;10580:72;;10561:3;;;:::i;:::-;10511:151;;10580:72;10629:8;;;;;:::o;10518:41::-;;;;;;10366:320;:::o;10518:41::-;242:2275:34;;;10546:13:37;;10518:41;;7129:1551:131;;;8209:66;8196:79;;8192:164;;242:2275:34;;;;;;-1:-1:-1;242:2275:34;;;;;;;;;;;;;;;;;;;8467:24:131;;;;;;;;;-1:-1:-1;8467:24:131;242:2275:34;;;8505:20:131;8501:113;;8624:49;-1:-1:-1;8624:49:131;-1:-1:-1;7129:1551:131;:::o;8501:113::-;8541:62;-1:-1:-1;8541:62:131;8467:24;8541:62;-1:-1:-1;8541:62:131;:::o;8467:24::-;242:2275:34;;;;;;;;;8192:164:131;8291:54;;;8307:1;8291:54;8311:30;8291:54;;:::o","linkReferences":{}},"methodIdentifiers":{"DEFAULT_ADMIN_ROLE()":"a217fddf","PROOF_SUBMITTER_ROLE()":"5972185a","getClientState()":"ef913a4b","getConsensusState(uint64)":"edce8bdc","getRoleAdmin(bytes32)":"248a9ca3","grantRole(bytes32,address)":"2f2ff15d","hasRole(bytes32,address)":"91d14854","misbehaviour(bytes)":"ddba6537","renounceRole(bytes32,address)":"36568abe","revokeRole(bytes32,address)":"d547741f","supportsInterface(bytes4)":"01ffc9a7","updateClient(bytes)":"0bece356","verifyMembership((bytes,(uint64,uint64),bytes[],bytes))":"682ed5f0","verifyNonMembership((bytes,(uint64,uint64),bytes[]))":"4d6d9ffb"},"rawMetadata":"{\"compiler\":{\"version\":\"0.8.28+commit.7893614a\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"ibcRouter\",\"type\":\"address\"},{\"internalType\":\"uint64\",\"name\":\"initialTrustedHeight\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"initialTrustedTimestamp\",\"type\":\"uint64\"},{\"internalType\":\"bytes32\",\"name\":\"initialTrustedStorageRoot\",\"type\":\"bytes32\"},{\"internalType\":\"address[]\",\"name\":\"initialTrustedValidators\",\"type\":\"address[]\"},{\"internalType\":\"uint64\",\"name\":\"trustingPeriod\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"maxClockDrift\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"roleManager\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"AccessControlBadConfirmation\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"internalType\":\"bytes32\",\"name\":\"neededRole\",\"type\":\"bytes32\"}],\"name\":\"AccessControlUnauthorizedAccount\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"revisionHeight\",\"type\":\"uint64\"}],\"name\":\"ConflictingConsensusState\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"trustedTimestamp\",\"type\":\"uint64\"},{\"internalType\":\"uint256\",\"name\":\"currentTimestamp\",\"type\":\"uint256\"},{\"internalType\":\"uint64\",\"name\":\"trustingPeriod\",\"type\":\"uint64\"}],\"name\":\"ConsensusStateExpired\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"revisionHeight\",\"type\":\"uint64\"}],\"name\":\"ConsensusStateNotFound\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"signer\",\"type\":\"address\"}],\"name\":\"DuplicateCommitSealSigner\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"validator\",\"type\":\"address\"}],\"name\":\"DuplicateValidator\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"EmptyValidatorSet\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"currentTimestamp\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"headerTimestamp\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxClockDrift\",\"type\":\"uint256\"}],\"name\":\"HeaderFromFuture\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"actual\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"required\",\"type\":\"uint256\"}],\"name\":\"InsufficientTrustedValidatorOverlap\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"actual\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"required\",\"type\":\"uint256\"}],\"name\":\"InsufficientValidatorQuorum\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidCommitSeal\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"expectedValue\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"actualValue\",\"type\":\"bytes32\"}],\"name\":\"InvalidCommitmentValue\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"actualDifficulty\",\"type\":\"uint256\"}],\"name\":\"InvalidDifficulty\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"length\",\"type\":\"uint256\"}],\"name\":\"InvalidECDSASignatureLength\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"itemsLength\",\"type\":\"uint256\"}],\"name\":\"InvalidExtraDataFormat\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"itemsLength\",\"type\":\"uint256\"}],\"name\":\"InvalidHeaderFormat\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidHeaderHeight\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"actualMixHash\",\"type\":\"bytes32\"}],\"name\":\"InvalidMixHash\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"actualNonce\",\"type\":\"bytes\"}],\"name\":\"InvalidNonce\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"actualOmmersHash\",\"type\":\"bytes32\"}],\"name\":\"InvalidOmmersHash\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"expectedLength\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"actualLength\",\"type\":\"uint256\"}],\"name\":\"InvalidPathLength\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"providedRevisionNumber\",\"type\":\"uint64\"}],\"name\":\"InvalidRevisionNumber\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"validator\",\"type\":\"address\"}],\"name\":\"InvalidValidatorAddress\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"length\",\"type\":\"uint256\"}],\"name\":\"InvalidValidatorAddressLength\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"expectedLength\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"actualLength\",\"type\":\"uint256\"}],\"name\":\"InvalidValueLength\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"UnsupportedMisbehaviour\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"actualValue\",\"type\":\"bytes32\"}],\"name\":\"ValueExists\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"previousAdminRole\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"newAdminRole\",\"type\":\"bytes32\"}],\"name\":\"RoleAdminChanged\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"RoleGranted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"RoleRevoked\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"DEFAULT_ADMIN_ROLE\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"PROOF_SUBMITTER_ROLE\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getClientState\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"revisionHeight\",\"type\":\"uint64\"}],\"name\":\"getConsensusState\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"}],\"name\":\"getRoleAdmin\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"grantRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"hasRole\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"name\":\"misbehaviour\",\"outputs\":[],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"callerConfirmation\",\"type\":\"address\"}],\"name\":\"renounceRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"revokeRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes4\",\"name\":\"interfaceId\",\"type\":\"bytes4\"}],\"name\":\"supportsInterface\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"updateMsg\",\"type\":\"bytes\"}],\"name\":\"updateClient\",\"outputs\":[{\"internalType\":\"enum ILightClientMsgs.UpdateResult\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes\",\"name\":\"proof\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"uint64\",\"name\":\"revisionNumber\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"revisionHeight\",\"type\":\"uint64\"}],\"internalType\":\"struct IICS02ClientMsgs.Height\",\"name\":\"proofHeight\",\"type\":\"tuple\"},{\"internalType\":\"bytes[]\",\"name\":\"path\",\"type\":\"bytes[]\"},{\"internalType\":\"bytes\",\"name\":\"value\",\"type\":\"bytes\"}],\"internalType\":\"struct ILightClientMsgs.MsgVerifyMembership\",\"name\":\"msg_\",\"type\":\"tuple\"}],\"name\":\"verifyMembership\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes\",\"name\":\"proof\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"uint64\",\"name\":\"revisionNumber\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"revisionHeight\",\"type\":\"uint64\"}],\"internalType\":\"struct IICS02ClientMsgs.Height\",\"name\":\"proofHeight\",\"type\":\"tuple\"},{\"internalType\":\"bytes[]\",\"name\":\"path\",\"type\":\"bytes[]\"}],\"internalType\":\"struct ILightClientMsgs.MsgVerifyNonMembership\",\"name\":\"msg_\",\"type\":\"tuple\"}],\"name\":\"verifyNonMembership\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"errors\":{\"AccessControlBadConfirmation()\":[{\"details\":\"The caller of a function is not the expected one. NOTE: Don't confuse with {AccessControlUnauthorizedAccount}.\"}],\"AccessControlUnauthorizedAccount(address,bytes32)\":[{\"details\":\"The `account` is missing a role.\"}],\"ConflictingConsensusState(uint64)\":[{\"params\":{\"revisionHeight\":\"The conflicting revision height.\"}}],\"ConsensusStateExpired(uint64,uint256,uint64)\":[{\"params\":{\"currentTimestamp\":\"The current block timestamp.\",\"trustedTimestamp\":\"Timestamp of the trusted consensus state.\",\"trustingPeriod\":\"The configured trusting period.\"}}],\"ConsensusStateNotFound(uint64)\":[{\"params\":{\"revisionHeight\":\"The requested revision height.\"}}],\"DuplicateCommitSealSigner(address)\":[{\"params\":{\"signer\":\"The duplicate signer address.\"}}],\"DuplicateValidator(address)\":[{\"params\":{\"validator\":\"The duplicate validator address.\"}}],\"HeaderFromFuture(uint256,uint256,uint256)\":[{\"params\":{\"currentTimestamp\":\"The current block timestamp.\",\"headerTimestamp\":\"The submitted header timestamp.\",\"maxClockDrift\":\"The configured maximum clock drift.\"}}],\"InsufficientTrustedValidatorOverlap(uint256,uint256)\":[{\"params\":{\"actual\":\"The number of trusted validators that signed.\",\"required\":\"The minimum required trusted signer count.\"}}],\"InsufficientValidatorQuorum(uint256,uint256)\":[{\"params\":{\"actual\":\"The number of new validators that signed.\",\"required\":\"The minimum required signer count.\"}}],\"InvalidCommitmentValue(bytes32,bytes32)\":[{\"params\":{\"actualValue\":\"The proven commitment value.\",\"expectedValue\":\"The expected commitment value.\"}}],\"InvalidDifficulty(uint256)\":[{\"params\":{\"actualDifficulty\":\"The difficulty found in the header.\"}}],\"InvalidECDSASignatureLength(uint256)\":[{\"params\":{\"length\":\"The invalid signature length.\"}}],\"InvalidExtraDataFormat(uint256)\":[{\"params\":{\"itemsLength\":\"The decoded `extraData` item count.\"}}],\"InvalidHeaderFormat(uint256)\":[{\"params\":{\"itemsLength\":\"The decoded header item count.\"}}],\"InvalidMixHash(bytes32)\":[{\"params\":{\"actualMixHash\":\"The mix hash found in the header.\"}}],\"InvalidNonce(bytes)\":[{\"params\":{\"actualNonce\":\"The nonce found in the header.\"}}],\"InvalidOmmersHash(bytes32)\":[{\"params\":{\"actualOmmersHash\":\"The ommers hash found in the header.\"}}],\"InvalidPathLength(uint256,uint256)\":[{\"params\":{\"actualLength\":\"The actual path length.\",\"expectedLength\":\"The expected path length.\"}}],\"InvalidRevisionNumber(uint64)\":[{\"params\":{\"providedRevisionNumber\":\"The non-zero revision number.\"}}],\"InvalidValidatorAddress(address)\":[{\"params\":{\"validator\":\"The invalid validator address.\"}}],\"InvalidValidatorAddressLength(uint256)\":[{\"params\":{\"length\":\"The decoded validator address length.\"}}],\"InvalidValueLength(uint256,uint256)\":[{\"params\":{\"actualLength\":\"The actual value length.\",\"expectedLength\":\"The expected value length.\"}}],\"ValueExists(bytes32)\":[{\"params\":{\"actualValue\":\"The value found at the proven storage slot.\"}}]},\"events\":{\"RoleAdminChanged(bytes32,bytes32,bytes32)\":{\"details\":\"Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite {RoleAdminChanged} not being emitted to signal this.\"},\"RoleGranted(bytes32,address,address)\":{\"details\":\"Emitted when `account` is granted `role`. `sender` is the account that originated the contract call. This account bears the admin role (for the granted role). Expected in cases where the role was granted using the internal {AccessControl-_grantRole}.\"},\"RoleRevoked(bytes32,address,address)\":{\"details\":\"Emitted when `account` is revoked `role`. `sender` is the account that originated the contract call: - if using `revokeRole`, it is the admin role bearer - if using `renounceRole`, it is the role bearer (i.e. `account`)\"}},\"kind\":\"dev\",\"methods\":{\"constructor\":{\"params\":{\"ibcRouter\":\"Counterparty ICS26 router address whose storage is proven.\",\"initialTrustedHeight\":\"Initial trusted Besu height.\",\"initialTrustedStorageRoot\":\"Initial trusted storage root of `ibcRouter`.\",\"initialTrustedTimestamp\":\"Initial trusted header timestamp in seconds.\",\"initialTrustedValidators\":\"Initial trusted validator set.\",\"maxClockDrift\":\"Maximum allowed future drift in seconds for submitted headers.\",\"roleManager\":\"Address that administers proof submission; if zero, proof submission is open.\",\"trustingPeriod\":\"Maximum age in seconds for trusted consensus states.\"}},\"getClientState()\":{\"returns\":{\"_0\":\"The client state.\"}},\"getConsensusState(uint64)\":{\"params\":{\"revisionHeight\":\"The revision height to query.\"},\"returns\":{\"_0\":\"The ABI-encoded consensus state.\"}},\"getRoleAdmin(bytes32)\":{\"details\":\"Returns the admin role that controls `role`. See {grantRole} and {revokeRole}. To change a role's admin, use {_setRoleAdmin}.\"},\"grantRole(bytes32,address)\":{\"details\":\"Grants `role` to `account`. If `account` had not been already granted `role`, emits a {RoleGranted} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleGranted} event.\"},\"hasRole(bytes32,address)\":{\"details\":\"Returns `true` if `account` has been granted `role`.\"},\"misbehaviour(bytes)\":{\"params\":{\"misbehaviourMsg\":\"The misbehaviour message\"}},\"renounceRole(bytes32,address)\":{\"details\":\"Revokes `role` from the calling account. Roles are often managed via {grantRole} and {revokeRole}: this function's purpose is to provide a mechanism for accounts to lose their privileges if they are compromised (such as when a trusted device is misplaced). If the calling account had been revoked `role`, emits a {RoleRevoked} event. Requirements: - the caller must be `callerConfirmation`. May emit a {RoleRevoked} event.\"},\"revokeRole(bytes32,address)\":{\"details\":\"Revokes `role` from `account`. If `account` had been granted `role`, emits a {RoleRevoked} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleRevoked} event.\"},\"supportsInterface(bytes4)\":{\"details\":\"Returns true if this contract implements the interface defined by `interfaceId`. See the corresponding https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[ERC section] to learn more about how these ids are created. This function call must use less than 30 000 gas.\"},\"updateClient(bytes)\":{\"params\":{\"updateMsg\":\"The encoded update message e.g., an SP1 proof.\"},\"returns\":{\"_0\":\"The result of the update operation\"}},\"verifyMembership((bytes,(uint64,uint64),bytes[],bytes))\":{\"details\":\"Notice that this message is not view, as it may update the client state for caching purposes.\",\"params\":{\"msg_\":\"The membership message\"},\"returns\":{\"_0\":\"The unix timestamp of the verification height in the counterparty chain in seconds.\"}},\"verifyNonMembership((bytes,(uint64,uint64),bytes[]))\":{\"details\":\"Notice that this message is not view, as it may update the client state for caching purposes.\",\"params\":{\"msg_\":\"The membership message\"},\"returns\":{\"_0\":\"The unix timestamp of the verification height in the counterparty chain in seconds.\"}}},\"title\":\"Besu IBFT2 Light Client\",\"version\":1},\"userdoc\":{\"errors\":{\"ConflictingConsensusState(uint64)\":[{\"notice\":\"A different consensus state already exists at the submitted height.\"}],\"ConsensusStateExpired(uint64,uint256,uint64)\":[{\"notice\":\"The trusted consensus state is outside the trusting period.\"}],\"ConsensusStateNotFound(uint64)\":[{\"notice\":\"No consensus state exists for the requested height.\"}],\"DuplicateCommitSealSigner(address)\":[{\"notice\":\"A commit seal signer appears more than once.\"}],\"DuplicateValidator(address)\":[{\"notice\":\"A validator appears more than once.\"}],\"EmptyValidatorSet()\":[{\"notice\":\"The validator set is empty.\"}],\"HeaderFromFuture(uint256,uint256,uint256)\":[{\"notice\":\"The submitted header timestamp is too far in the future.\"}],\"InsufficientTrustedValidatorOverlap(uint256,uint256)\":[{\"notice\":\"The submitted signers do not overlap enough with the trusted validator set.\"}],\"InsufficientValidatorQuorum(uint256,uint256)\":[{\"notice\":\"The submitted signers do not meet quorum for the new validator set.\"}],\"InvalidCommitSeal()\":[{\"notice\":\"A commit seal did not recover a valid signer.\"}],\"InvalidCommitmentValue(bytes32,bytes32)\":[{\"notice\":\"A proven commitment value does not match the expected value.\"}],\"InvalidDifficulty(uint256)\":[{\"notice\":\"The Besu BFT difficulty is invalid.\"}],\"InvalidECDSASignatureLength(uint256)\":[{\"notice\":\"An ECDSA signature has an invalid length.\"}],\"InvalidExtraDataFormat(uint256)\":[{\"notice\":\"The submitted `extraData` field has an invalid RLP item count.\"}],\"InvalidHeaderFormat(uint256)\":[{\"notice\":\"The submitted header has an invalid RLP item count.\"}],\"InvalidHeaderHeight()\":[{\"notice\":\"The submitted header height is zero.\"}],\"InvalidMixHash(bytes32)\":[{\"notice\":\"The Besu BFT mix hash is invalid.\"}],\"InvalidNonce(bytes)\":[{\"notice\":\"The Besu BFT nonce is invalid.\"}],\"InvalidOmmersHash(bytes32)\":[{\"notice\":\"The ommers hash is invalid.\"}],\"InvalidPathLength(uint256,uint256)\":[{\"notice\":\"A proof path has an invalid length.\"}],\"InvalidRevisionNumber(uint64)\":[{\"notice\":\"The revision number must be zero for Besu light client heights.\"}],\"InvalidValidatorAddress(address)\":[{\"notice\":\"A validator address is invalid.\"}],\"InvalidValidatorAddressLength(uint256)\":[{\"notice\":\"A validator address has an invalid byte length.\"}],\"InvalidValueLength(uint256,uint256)\":[{\"notice\":\"A membership value has an invalid length.\"}],\"UnsupportedMisbehaviour()\":[{\"notice\":\"Misbehaviour handling is not supported by this client.\"}],\"ValueExists(bytes32)\":[{\"notice\":\"A non-membership proof found an existing value.\"}]},\"kind\":\"user\",\"methods\":{\"PROOF_SUBMITTER_ROLE()\":{\"notice\":\"Role allowed to submit client updates and proof verifications.\"},\"constructor\":{\"notice\":\"Creates a Besu IBFT2 light client from an initial trusted consensus state.\"},\"getClientState()\":{\"notice\":\"Returns the client state.\"},\"getConsensusState(uint64)\":{\"notice\":\"Returns the encoded consensus state for a revision height.\"},\"misbehaviour(bytes)\":{\"notice\":\"Misbehaviour handling, moves the light client to the frozen state if misbehaviour is detected\"},\"updateClient(bytes)\":{\"notice\":\"Updating the client and consensus state\"},\"verifyMembership((bytes,(uint64,uint64),bytes[],bytes))\":{\"notice\":\"Querying the membership of a key-value pair\"},\"verifyNonMembership((bytes,(uint64,uint64),bytes[]))\":{\"notice\":\"Querying the non-membership of a key\"}},\"notice\":\"Verifies Besu IBFT 2.0 headers and ICS26 router storage proofs.\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/light-clients/besu/BesuIBFT2LightClient.sol\":\"BesuIBFT2LightClient\"},\"evmVersion\":\"cancun\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"none\"},\"optimizer\":{\"enabled\":true,\"runs\":10000},\"remappings\":[\":@openzeppelin-contracts/=node_modules/@openzeppelin/contracts/\",\":@openzeppelin-upgradeable/=node_modules/@openzeppelin/contracts-upgradeable/\",\":@openzeppelin/=node_modules/@openzeppelin/\",\":@sp1-contracts/=node_modules/sp1-contracts/contracts/src/\",\":@uniswap/permit2/=node_modules/@uniswap/permit2/\",\":forge-std/=node_modules/forge-std/src/\",\":sp1-contracts/=node_modules/sp1-contracts/\"],\"viaIR\":true},\"sources\":{\"contracts/interfaces/ILightClient.sol\":{\"keccak256\":\"0x3b2361546ee834a442d844c979fbad3458ee13146b093f585587a09e19a266af\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://5b5d53101bb598f14a79cb1092479736fa18e8f84945ea6ef80f4dac84466042\",\"dweb:/ipfs/QmaTCo6M3Z9aYCSX65AQtixo1sB4ymQUDAgTXSKHqJHGDh\"]},\"contracts/light-clients/besu/BesuIBFT2LightClient.sol\":{\"keccak256\":\"0xc8536dfc90aa5a55d128e40d6d9715a9fbd55cef5353001da2e773cc9810160e\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://8790efb3e5909701669411298cdc72cc4e8ccdb8fcb6797e1d50e218e76a625d\",\"dweb:/ipfs/QmNiFBhRfaHHG3Tj3R8Y1nvojGs3sVCdL5ANBSgKfVj9Fz\"]},\"contracts/light-clients/besu/BesuLightClientBase.sol\":{\"keccak256\":\"0xc6e53bf0a6dc8d40d819e2f735bbae57c97454974d622901eb2361143b388529\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://c1c65ba0c1b91751f62c769a6d892371cc8af598116217643acab4a3ce470435\",\"dweb:/ipfs/Qmf1pqQC7iELqiKnSyjAPsTFYFsyWzxHez7FLjs8jax7Km\"]},\"contracts/light-clients/besu/MPTProof.sol\":{\"keccak256\":\"0x9ab26e6445b20541e8725b190006444d3b16eb3e021174e280451f934d9535c6\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://b6f3fd58b06b942a454bb9b21e9be40a2dab8a09f78e75ff4357c8afbc7e2d5b\",\"dweb:/ipfs/QmPeUwNScDiU91Xx4UQduYjyCPALYLPq73ZUMEn8Nr1rTG\"]},\"contracts/light-clients/besu/RLPReader.sol\":{\"keccak256\":\"0xa64ad17e6da7fed2bd206df52189286694339a8061dc5d158e717eda982af1d9\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://7020db2fe854e90e1b791e0e587610fc26bed3073ba1811faa275a1d8bf3c2c7\",\"dweb:/ipfs/QmdXdKghNFZSX7N9qD6BsKuJQdrFoqatsVWvHRL7vJCmeP\"]},\"contracts/light-clients/besu/errors/IBesuLightClientErrors.sol\":{\"keccak256\":\"0xfb8d8e28c81a48e1165b9d9e69406208fbb0ced1b30d9ef3293112562ffbb448\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://0d3d314a005ada41d997a6e5b254ebd70066c3ccd2e6306249c258c4a13c3623\",\"dweb:/ipfs/QmbRH23Vh7Xp1eXQmfnafMyTebuihQTLfRYeq6BbGJfYnY\"]},\"contracts/light-clients/besu/msgs/IBesuLightClientMsgs.sol\":{\"keccak256\":\"0x3fc43a3daaae2f89dca4cadbc99ea71086282f987b47a95c13489ae3384532cf\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://36083aa6833eb30d26023f7dc0b2e22b7d0723d922fcd50cf86999edc9aeb474\",\"dweb:/ipfs/QmbPv9KJj5AuJkgppuyuoaTHtiw91Qkx1tdkf1R5D4wad2\"]},\"contracts/msgs/IICS02ClientMsgs.sol\":{\"keccak256\":\"0x03d1265eae327c3744d774bf22a30d845233d50664921c9aa57cef2d71fd89d2\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://89900781cc5c60540a237d92d42745ea6165765ee8fb4d50e8137a717195cc75\",\"dweb:/ipfs/Qmbx5p8gZ8sEMMeZytXsLee49JUayhAaoJ2yxX93WUrvQo\"]},\"contracts/msgs/ILightClientMsgs.sol\":{\"keccak256\":\"0x8d1e56ab166a7b4aa6999708e3214a4645ebbc3835c2b2a4c255c9923eebafde\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://8bd4200dc04d950c0f050623fa9a8accdbec877fd446c039d4dd6c678bdf1513\",\"dweb:/ipfs/QmZQTViaA7N6BVNDzJ1Z6w799PrPoE4ajPueZSPwX4sGZ9\"]},\"node_modules/@openzeppelin/contracts/access/AccessControl.sol\":{\"keccak256\":\"0x4686ec784d75f95beaf2bf5b5f26e5f946d4c864aaee9c3c62bdc18381f5e017\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://26710ca191913f3c9df542079c4a6dcff02968e92d4f7357daefef9fbe72a19c\",\"dweb:/ipfs/QmanHbeWuBbVEqXySHa1zhm2rExjYpChDBubBaJNTCa2JB\"]},\"node_modules/@openzeppelin/contracts/access/IAccessControl.sol\":{\"keccak256\":\"0xbff9f59c84e5337689161ce7641c0ef8e872d6a7536fbc1f5133f128887aba3c\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://b308f882e796f7b79c9502deacb0a62983035c6f6f4e962b319ba6a1f4a77d3d\",\"dweb:/ipfs/QmaWCW7ahEQqFjwhSUhV7Ae7WhfNvzSpE7DQ58hvEooqPL\"]},\"node_modules/@openzeppelin/contracts/utils/Context.sol\":{\"keccak256\":\"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://6a708e8a5bdb1011c2c381c9a5cfd8a9a956d7d0a9dc1bd8bcdaf52f76ef2f12\",\"dweb:/ipfs/Qmax9WHBnVsZP46ZxEMNRQpLQnrdE4dK8LehML1Py8FowF\"]},\"node_modules/@openzeppelin/contracts/utils/cryptography/ECDSA.sol\":{\"keccak256\":\"0xbeb5cad8aaabe0d35d2ec1a8414d91e81e5a8ca679add4cf57e2f33476861f40\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://ebb272a5ee2da4e8bd5551334e0ce8dce4e9c56a04570d6bf046d260fab3116a\",\"dweb:/ipfs/QmNw6RyM769qcqFocDq6HJMG2WiEnQbvizpRaUXsACHho2\"]},\"node_modules/@openzeppelin/contracts/utils/introspection/ERC165.sol\":{\"keccak256\":\"0x2d9dc2fe26180f74c11c13663647d38e259e45f95eb88f57b61d2160b0109d3e\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://81233d1f98060113d9922180bb0f14f8335856fe9f339134b09335e9f678c377\",\"dweb:/ipfs/QmWh6R35SarhAn4z2wH8SU456jJSYL2FgucfTFgbHJJN4E\"]},\"node_modules/@openzeppelin/contracts/utils/introspection/IERC165.sol\":{\"keccak256\":\"0x8891738ffe910f0cf2da09566928589bf5d63f4524dd734fd9cedbac3274dd5c\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://971f954442df5c2ef5b5ebf1eb245d7105d9fbacc7386ee5c796df1d45b21617\",\"dweb:/ipfs/QmadRjHbkicwqwwh61raUEapaVEtaLMcYbQZWs9gUkgj3u\"]}},\"version\":1}","metadata":{"compiler":{"version":"0.8.28+commit.7893614a"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"address","name":"ibcRouter","type":"address"},{"internalType":"uint64","name":"initialTrustedHeight","type":"uint64"},{"internalType":"uint64","name":"initialTrustedTimestamp","type":"uint64"},{"internalType":"bytes32","name":"initialTrustedStorageRoot","type":"bytes32"},{"internalType":"address[]","name":"initialTrustedValidators","type":"address[]"},{"internalType":"uint64","name":"trustingPeriod","type":"uint64"},{"internalType":"uint64","name":"maxClockDrift","type":"uint64"},{"internalType":"address","name":"roleManager","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"type":"error","name":"AccessControlBadConfirmation"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bytes32","name":"neededRole","type":"bytes32"}],"type":"error","name":"AccessControlUnauthorizedAccount"},{"inputs":[{"internalType":"uint64","name":"revisionHeight","type":"uint64"}],"type":"error","name":"ConflictingConsensusState"},{"inputs":[{"internalType":"uint64","name":"trustedTimestamp","type":"uint64"},{"internalType":"uint256","name":"currentTimestamp","type":"uint256"},{"internalType":"uint64","name":"trustingPeriod","type":"uint64"}],"type":"error","name":"ConsensusStateExpired"},{"inputs":[{"internalType":"uint64","name":"revisionHeight","type":"uint64"}],"type":"error","name":"ConsensusStateNotFound"},{"inputs":[{"internalType":"address","name":"signer","type":"address"}],"type":"error","name":"DuplicateCommitSealSigner"},{"inputs":[{"internalType":"address","name":"validator","type":"address"}],"type":"error","name":"DuplicateValidator"},{"inputs":[],"type":"error","name":"EmptyValidatorSet"},{"inputs":[{"internalType":"uint256","name":"currentTimestamp","type":"uint256"},{"internalType":"uint256","name":"headerTimestamp","type":"uint256"},{"internalType":"uint256","name":"maxClockDrift","type":"uint256"}],"type":"error","name":"HeaderFromFuture"},{"inputs":[{"internalType":"uint256","name":"actual","type":"uint256"},{"internalType":"uint256","name":"required","type":"uint256"}],"type":"error","name":"InsufficientTrustedValidatorOverlap"},{"inputs":[{"internalType":"uint256","name":"actual","type":"uint256"},{"internalType":"uint256","name":"required","type":"uint256"}],"type":"error","name":"InsufficientValidatorQuorum"},{"inputs":[],"type":"error","name":"InvalidCommitSeal"},{"inputs":[{"internalType":"bytes32","name":"expectedValue","type":"bytes32"},{"internalType":"bytes32","name":"actualValue","type":"bytes32"}],"type":"error","name":"InvalidCommitmentValue"},{"inputs":[{"internalType":"uint256","name":"actualDifficulty","type":"uint256"}],"type":"error","name":"InvalidDifficulty"},{"inputs":[{"internalType":"uint256","name":"length","type":"uint256"}],"type":"error","name":"InvalidECDSASignatureLength"},{"inputs":[{"internalType":"uint256","name":"itemsLength","type":"uint256"}],"type":"error","name":"InvalidExtraDataFormat"},{"inputs":[{"internalType":"uint256","name":"itemsLength","type":"uint256"}],"type":"error","name":"InvalidHeaderFormat"},{"inputs":[],"type":"error","name":"InvalidHeaderHeight"},{"inputs":[{"internalType":"bytes32","name":"actualMixHash","type":"bytes32"}],"type":"error","name":"InvalidMixHash"},{"inputs":[{"internalType":"bytes","name":"actualNonce","type":"bytes"}],"type":"error","name":"InvalidNonce"},{"inputs":[{"internalType":"bytes32","name":"actualOmmersHash","type":"bytes32"}],"type":"error","name":"InvalidOmmersHash"},{"inputs":[{"internalType":"uint256","name":"expectedLength","type":"uint256"},{"internalType":"uint256","name":"actualLength","type":"uint256"}],"type":"error","name":"InvalidPathLength"},{"inputs":[{"internalType":"uint64","name":"providedRevisionNumber","type":"uint64"}],"type":"error","name":"InvalidRevisionNumber"},{"inputs":[{"internalType":"address","name":"validator","type":"address"}],"type":"error","name":"InvalidValidatorAddress"},{"inputs":[{"internalType":"uint256","name":"length","type":"uint256"}],"type":"error","name":"InvalidValidatorAddressLength"},{"inputs":[{"internalType":"uint256","name":"expectedLength","type":"uint256"},{"internalType":"uint256","name":"actualLength","type":"uint256"}],"type":"error","name":"InvalidValueLength"},{"inputs":[],"type":"error","name":"UnsupportedMisbehaviour"},{"inputs":[{"internalType":"bytes32","name":"actualValue","type":"bytes32"}],"type":"error","name":"ValueExists"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32","indexed":true},{"internalType":"bytes32","name":"previousAdminRole","type":"bytes32","indexed":true},{"internalType":"bytes32","name":"newAdminRole","type":"bytes32","indexed":true}],"type":"event","name":"RoleAdminChanged","anonymous":false},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32","indexed":true},{"internalType":"address","name":"account","type":"address","indexed":true},{"internalType":"address","name":"sender","type":"address","indexed":true}],"type":"event","name":"RoleGranted","anonymous":false},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32","indexed":true},{"internalType":"address","name":"account","type":"address","indexed":true},{"internalType":"address","name":"sender","type":"address","indexed":true}],"type":"event","name":"RoleRevoked","anonymous":false},{"inputs":[],"stateMutability":"view","type":"function","name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"PROOF_SUBMITTER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"getClientState","outputs":[{"internalType":"bytes","name":"","type":"bytes"}]},{"inputs":[{"internalType":"uint64","name":"revisionHeight","type":"uint64"}],"stateMutability":"view","type":"function","name":"getConsensusState","outputs":[{"internalType":"bytes","name":"","type":"bytes"}]},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"stateMutability":"view","type":"function","name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}]},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"stateMutability":"nonpayable","type":"function","name":"grantRole"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"stateMutability":"view","type":"function","name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}]},{"inputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function","name":"misbehaviour"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"callerConfirmation","type":"address"}],"stateMutability":"nonpayable","type":"function","name":"renounceRole"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"stateMutability":"nonpayable","type":"function","name":"revokeRole"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"stateMutability":"view","type":"function","name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}]},{"inputs":[{"internalType":"bytes","name":"updateMsg","type":"bytes"}],"stateMutability":"nonpayable","type":"function","name":"updateClient","outputs":[{"internalType":"enum ILightClientMsgs.UpdateResult","name":"","type":"uint8"}]},{"inputs":[{"internalType":"struct ILightClientMsgs.MsgVerifyMembership","name":"msg_","type":"tuple","components":[{"internalType":"bytes","name":"proof","type":"bytes"},{"internalType":"struct IICS02ClientMsgs.Height","name":"proofHeight","type":"tuple","components":[{"internalType":"uint64","name":"revisionNumber","type":"uint64"},{"internalType":"uint64","name":"revisionHeight","type":"uint64"}]},{"internalType":"bytes[]","name":"path","type":"bytes[]"},{"internalType":"bytes","name":"value","type":"bytes"}]}],"stateMutability":"view","type":"function","name":"verifyMembership","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[{"internalType":"struct ILightClientMsgs.MsgVerifyNonMembership","name":"msg_","type":"tuple","components":[{"internalType":"bytes","name":"proof","type":"bytes"},{"internalType":"struct IICS02ClientMsgs.Height","name":"proofHeight","type":"tuple","components":[{"internalType":"uint64","name":"revisionNumber","type":"uint64"},{"internalType":"uint64","name":"revisionHeight","type":"uint64"}]},{"internalType":"bytes[]","name":"path","type":"bytes[]"}]}],"stateMutability":"view","type":"function","name":"verifyNonMembership","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]}],"devdoc":{"kind":"dev","methods":{"constructor":{"params":{"ibcRouter":"Counterparty ICS26 router address whose storage is proven.","initialTrustedHeight":"Initial trusted Besu height.","initialTrustedStorageRoot":"Initial trusted storage root of `ibcRouter`.","initialTrustedTimestamp":"Initial trusted header timestamp in seconds.","initialTrustedValidators":"Initial trusted validator set.","maxClockDrift":"Maximum allowed future drift in seconds for submitted headers.","roleManager":"Address that administers proof submission; if zero, proof submission is open.","trustingPeriod":"Maximum age in seconds for trusted consensus states."}},"getClientState()":{"returns":{"_0":"The client state."}},"getConsensusState(uint64)":{"params":{"revisionHeight":"The revision height to query."},"returns":{"_0":"The ABI-encoded consensus state."}},"getRoleAdmin(bytes32)":{"details":"Returns the admin role that controls `role`. See {grantRole} and {revokeRole}. To change a role's admin, use {_setRoleAdmin}."},"grantRole(bytes32,address)":{"details":"Grants `role` to `account`. If `account` had not been already granted `role`, emits a {RoleGranted} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleGranted} event."},"hasRole(bytes32,address)":{"details":"Returns `true` if `account` has been granted `role`."},"misbehaviour(bytes)":{"params":{"misbehaviourMsg":"The misbehaviour message"}},"renounceRole(bytes32,address)":{"details":"Revokes `role` from the calling account. Roles are often managed via {grantRole} and {revokeRole}: this function's purpose is to provide a mechanism for accounts to lose their privileges if they are compromised (such as when a trusted device is misplaced). If the calling account had been revoked `role`, emits a {RoleRevoked} event. Requirements: - the caller must be `callerConfirmation`. May emit a {RoleRevoked} event."},"revokeRole(bytes32,address)":{"details":"Revokes `role` from `account`. If `account` had been granted `role`, emits a {RoleRevoked} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleRevoked} event."},"supportsInterface(bytes4)":{"details":"Returns true if this contract implements the interface defined by `interfaceId`. See the corresponding https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[ERC section] to learn more about how these ids are created. This function call must use less than 30 000 gas."},"updateClient(bytes)":{"params":{"updateMsg":"The encoded update message e.g., an SP1 proof."},"returns":{"_0":"The result of the update operation"}},"verifyMembership((bytes,(uint64,uint64),bytes[],bytes))":{"details":"Notice that this message is not view, as it may update the client state for caching purposes.","params":{"msg_":"The membership message"},"returns":{"_0":"The unix timestamp of the verification height in the counterparty chain in seconds."}},"verifyNonMembership((bytes,(uint64,uint64),bytes[]))":{"details":"Notice that this message is not view, as it may update the client state for caching purposes.","params":{"msg_":"The membership message"},"returns":{"_0":"The unix timestamp of the verification height in the counterparty chain in seconds."}}},"version":1},"userdoc":{"kind":"user","methods":{"PROOF_SUBMITTER_ROLE()":{"notice":"Role allowed to submit client updates and proof verifications."},"constructor":{"notice":"Creates a Besu IBFT2 light client from an initial trusted consensus state."},"getClientState()":{"notice":"Returns the client state."},"getConsensusState(uint64)":{"notice":"Returns the encoded consensus state for a revision height."},"misbehaviour(bytes)":{"notice":"Misbehaviour handling, moves the light client to the frozen state if misbehaviour is detected"},"updateClient(bytes)":{"notice":"Updating the client and consensus state"},"verifyMembership((bytes,(uint64,uint64),bytes[],bytes))":{"notice":"Querying the membership of a key-value pair"},"verifyNonMembership((bytes,(uint64,uint64),bytes[]))":{"notice":"Querying the non-membership of a key"}},"version":1}},"settings":{"remappings":["@openzeppelin-contracts/=node_modules/@openzeppelin/contracts/","@openzeppelin-upgradeable/=node_modules/@openzeppelin/contracts-upgradeable/","@openzeppelin/=node_modules/@openzeppelin/","@sp1-contracts/=node_modules/sp1-contracts/contracts/src/","@uniswap/permit2/=node_modules/@uniswap/permit2/","forge-std/=node_modules/forge-std/src/","sp1-contracts/=node_modules/sp1-contracts/"],"optimizer":{"enabled":true,"runs":10000},"metadata":{"bytecodeHash":"none"},"compilationTarget":{"contracts/light-clients/besu/BesuIBFT2LightClient.sol":"BesuIBFT2LightClient"},"evmVersion":"cancun","libraries":{},"viaIR":true},"sources":{"contracts/interfaces/ILightClient.sol":{"keccak256":"0x3b2361546ee834a442d844c979fbad3458ee13146b093f585587a09e19a266af","urls":["bzz-raw://5b5d53101bb598f14a79cb1092479736fa18e8f84945ea6ef80f4dac84466042","dweb:/ipfs/QmaTCo6M3Z9aYCSX65AQtixo1sB4ymQUDAgTXSKHqJHGDh"],"license":"Apache-2.0"},"contracts/light-clients/besu/BesuIBFT2LightClient.sol":{"keccak256":"0xc8536dfc90aa5a55d128e40d6d9715a9fbd55cef5353001da2e773cc9810160e","urls":["bzz-raw://8790efb3e5909701669411298cdc72cc4e8ccdb8fcb6797e1d50e218e76a625d","dweb:/ipfs/QmNiFBhRfaHHG3Tj3R8Y1nvojGs3sVCdL5ANBSgKfVj9Fz"],"license":"Apache-2.0"},"contracts/light-clients/besu/BesuLightClientBase.sol":{"keccak256":"0xc6e53bf0a6dc8d40d819e2f735bbae57c97454974d622901eb2361143b388529","urls":["bzz-raw://c1c65ba0c1b91751f62c769a6d892371cc8af598116217643acab4a3ce470435","dweb:/ipfs/Qmf1pqQC7iELqiKnSyjAPsTFYFsyWzxHez7FLjs8jax7Km"],"license":"Apache-2.0"},"contracts/light-clients/besu/MPTProof.sol":{"keccak256":"0x9ab26e6445b20541e8725b190006444d3b16eb3e021174e280451f934d9535c6","urls":["bzz-raw://b6f3fd58b06b942a454bb9b21e9be40a2dab8a09f78e75ff4357c8afbc7e2d5b","dweb:/ipfs/QmPeUwNScDiU91Xx4UQduYjyCPALYLPq73ZUMEn8Nr1rTG"],"license":"Apache-2.0"},"contracts/light-clients/besu/RLPReader.sol":{"keccak256":"0xa64ad17e6da7fed2bd206df52189286694339a8061dc5d158e717eda982af1d9","urls":["bzz-raw://7020db2fe854e90e1b791e0e587610fc26bed3073ba1811faa275a1d8bf3c2c7","dweb:/ipfs/QmdXdKghNFZSX7N9qD6BsKuJQdrFoqatsVWvHRL7vJCmeP"],"license":"Apache-2.0"},"contracts/light-clients/besu/errors/IBesuLightClientErrors.sol":{"keccak256":"0xfb8d8e28c81a48e1165b9d9e69406208fbb0ced1b30d9ef3293112562ffbb448","urls":["bzz-raw://0d3d314a005ada41d997a6e5b254ebd70066c3ccd2e6306249c258c4a13c3623","dweb:/ipfs/QmbRH23Vh7Xp1eXQmfnafMyTebuihQTLfRYeq6BbGJfYnY"],"license":"Apache-2.0"},"contracts/light-clients/besu/msgs/IBesuLightClientMsgs.sol":{"keccak256":"0x3fc43a3daaae2f89dca4cadbc99ea71086282f987b47a95c13489ae3384532cf","urls":["bzz-raw://36083aa6833eb30d26023f7dc0b2e22b7d0723d922fcd50cf86999edc9aeb474","dweb:/ipfs/QmbPv9KJj5AuJkgppuyuoaTHtiw91Qkx1tdkf1R5D4wad2"],"license":"Apache-2.0"},"contracts/msgs/IICS02ClientMsgs.sol":{"keccak256":"0x03d1265eae327c3744d774bf22a30d845233d50664921c9aa57cef2d71fd89d2","urls":["bzz-raw://89900781cc5c60540a237d92d42745ea6165765ee8fb4d50e8137a717195cc75","dweb:/ipfs/Qmbx5p8gZ8sEMMeZytXsLee49JUayhAaoJ2yxX93WUrvQo"],"license":"Apache-2.0"},"contracts/msgs/ILightClientMsgs.sol":{"keccak256":"0x8d1e56ab166a7b4aa6999708e3214a4645ebbc3835c2b2a4c255c9923eebafde","urls":["bzz-raw://8bd4200dc04d950c0f050623fa9a8accdbec877fd446c039d4dd6c678bdf1513","dweb:/ipfs/QmZQTViaA7N6BVNDzJ1Z6w799PrPoE4ajPueZSPwX4sGZ9"],"license":"Apache-2.0"},"node_modules/@openzeppelin/contracts/access/AccessControl.sol":{"keccak256":"0x4686ec784d75f95beaf2bf5b5f26e5f946d4c864aaee9c3c62bdc18381f5e017","urls":["bzz-raw://26710ca191913f3c9df542079c4a6dcff02968e92d4f7357daefef9fbe72a19c","dweb:/ipfs/QmanHbeWuBbVEqXySHa1zhm2rExjYpChDBubBaJNTCa2JB"],"license":"MIT"},"node_modules/@openzeppelin/contracts/access/IAccessControl.sol":{"keccak256":"0xbff9f59c84e5337689161ce7641c0ef8e872d6a7536fbc1f5133f128887aba3c","urls":["bzz-raw://b308f882e796f7b79c9502deacb0a62983035c6f6f4e962b319ba6a1f4a77d3d","dweb:/ipfs/QmaWCW7ahEQqFjwhSUhV7Ae7WhfNvzSpE7DQ58hvEooqPL"],"license":"MIT"},"node_modules/@openzeppelin/contracts/utils/Context.sol":{"keccak256":"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2","urls":["bzz-raw://6a708e8a5bdb1011c2c381c9a5cfd8a9a956d7d0a9dc1bd8bcdaf52f76ef2f12","dweb:/ipfs/Qmax9WHBnVsZP46ZxEMNRQpLQnrdE4dK8LehML1Py8FowF"],"license":"MIT"},"node_modules/@openzeppelin/contracts/utils/cryptography/ECDSA.sol":{"keccak256":"0xbeb5cad8aaabe0d35d2ec1a8414d91e81e5a8ca679add4cf57e2f33476861f40","urls":["bzz-raw://ebb272a5ee2da4e8bd5551334e0ce8dce4e9c56a04570d6bf046d260fab3116a","dweb:/ipfs/QmNw6RyM769qcqFocDq6HJMG2WiEnQbvizpRaUXsACHho2"],"license":"MIT"},"node_modules/@openzeppelin/contracts/utils/introspection/ERC165.sol":{"keccak256":"0x2d9dc2fe26180f74c11c13663647d38e259e45f95eb88f57b61d2160b0109d3e","urls":["bzz-raw://81233d1f98060113d9922180bb0f14f8335856fe9f339134b09335e9f678c377","dweb:/ipfs/QmWh6R35SarhAn4z2wH8SU456jJSYL2FgucfTFgbHJJN4E"],"license":"MIT"},"node_modules/@openzeppelin/contracts/utils/introspection/IERC165.sol":{"keccak256":"0x8891738ffe910f0cf2da09566928589bf5d63f4524dd734fd9cedbac3274dd5c","urls":["bzz-raw://971f954442df5c2ef5b5ebf1eb245d7105d9fbacc7386ee5c796df1d45b21617","dweb:/ipfs/QmadRjHbkicwqwwh61raUEapaVEtaLMcYbQZWs9gUkgj3u"],"license":"MIT"}},"version":1},"id":34} \ No newline at end of file diff --git a/ibc-solidity/abi/bytecode/BesuQBFTLightClient.json b/ibc-solidity/abi/bytecode/BesuQBFTLightClient.json index a0fc021b8..c205ef201 100644 --- a/ibc-solidity/abi/bytecode/BesuQBFTLightClient.json +++ b/ibc-solidity/abi/bytecode/BesuQBFTLightClient.json @@ -1 +1 @@ -{"abi":[{"type":"constructor","inputs":[{"name":"ibcRouter","type":"address","internalType":"address"},{"name":"initialTrustedHeight","type":"uint64","internalType":"uint64"},{"name":"initialTrustedTimestamp","type":"uint64","internalType":"uint64"},{"name":"initialTrustedStorageRoot","type":"bytes32","internalType":"bytes32"},{"name":"initialTrustedValidators","type":"address[]","internalType":"address[]"},{"name":"trustingPeriod","type":"uint64","internalType":"uint64"},{"name":"maxClockDrift","type":"uint64","internalType":"uint64"},{"name":"roleManager","type":"address","internalType":"address"}],"stateMutability":"nonpayable"},{"type":"function","name":"DEFAULT_ADMIN_ROLE","inputs":[],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"type":"function","name":"PROOF_SUBMITTER_ROLE","inputs":[],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"type":"function","name":"getClientState","inputs":[],"outputs":[{"name":"","type":"bytes","internalType":"bytes"}],"stateMutability":"view"},{"type":"function","name":"getConsensusState","inputs":[{"name":"revisionHeight","type":"uint64","internalType":"uint64"}],"outputs":[{"name":"","type":"bytes","internalType":"bytes"}],"stateMutability":"view"},{"type":"function","name":"getRoleAdmin","inputs":[{"name":"role","type":"bytes32","internalType":"bytes32"}],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"type":"function","name":"grantRole","inputs":[{"name":"role","type":"bytes32","internalType":"bytes32"},{"name":"account","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"hasRole","inputs":[{"name":"role","type":"bytes32","internalType":"bytes32"},{"name":"account","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"misbehaviour","inputs":[{"name":"","type":"bytes","internalType":"bytes"}],"outputs":[],"stateMutability":"view"},{"type":"function","name":"renounceRole","inputs":[{"name":"role","type":"bytes32","internalType":"bytes32"},{"name":"callerConfirmation","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"revokeRole","inputs":[{"name":"role","type":"bytes32","internalType":"bytes32"},{"name":"account","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"supportsInterface","inputs":[{"name":"interfaceId","type":"bytes4","internalType":"bytes4"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"updateClient","inputs":[{"name":"updateMsg","type":"bytes","internalType":"bytes"}],"outputs":[{"name":"","type":"uint8","internalType":"enum ILightClientMsgs.UpdateResult"}],"stateMutability":"nonpayable"},{"type":"function","name":"verifyMembership","inputs":[{"name":"msg_","type":"tuple","internalType":"struct ILightClientMsgs.MsgVerifyMembership","components":[{"name":"proof","type":"bytes","internalType":"bytes"},{"name":"proofHeight","type":"tuple","internalType":"struct IICS02ClientMsgs.Height","components":[{"name":"revisionNumber","type":"uint64","internalType":"uint64"},{"name":"revisionHeight","type":"uint64","internalType":"uint64"}]},{"name":"path","type":"bytes[]","internalType":"bytes[]"},{"name":"value","type":"bytes","internalType":"bytes"}]}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"verifyNonMembership","inputs":[{"name":"msg_","type":"tuple","internalType":"struct ILightClientMsgs.MsgVerifyNonMembership","components":[{"name":"proof","type":"bytes","internalType":"bytes"},{"name":"proofHeight","type":"tuple","internalType":"struct IICS02ClientMsgs.Height","components":[{"name":"revisionNumber","type":"uint64","internalType":"uint64"},{"name":"revisionHeight","type":"uint64","internalType":"uint64"}]},{"name":"path","type":"bytes[]","internalType":"bytes[]"}]}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"event","name":"RoleAdminChanged","inputs":[{"name":"role","type":"bytes32","indexed":true,"internalType":"bytes32"},{"name":"previousAdminRole","type":"bytes32","indexed":true,"internalType":"bytes32"},{"name":"newAdminRole","type":"bytes32","indexed":true,"internalType":"bytes32"}],"anonymous":false},{"type":"event","name":"RoleGranted","inputs":[{"name":"role","type":"bytes32","indexed":true,"internalType":"bytes32"},{"name":"account","type":"address","indexed":true,"internalType":"address"},{"name":"sender","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"type":"event","name":"RoleRevoked","inputs":[{"name":"role","type":"bytes32","indexed":true,"internalType":"bytes32"},{"name":"account","type":"address","indexed":true,"internalType":"address"},{"name":"sender","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"type":"error","name":"AccessControlBadConfirmation","inputs":[]},{"type":"error","name":"AccessControlUnauthorizedAccount","inputs":[{"name":"account","type":"address","internalType":"address"},{"name":"neededRole","type":"bytes32","internalType":"bytes32"}]},{"type":"error","name":"ConflictingConsensusState","inputs":[{"name":"revisionHeight","type":"uint64","internalType":"uint64"}]},{"type":"error","name":"ConsensusStateExpired","inputs":[{"name":"trustedTimestamp","type":"uint64","internalType":"uint64"},{"name":"currentTimestamp","type":"uint256","internalType":"uint256"},{"name":"trustingPeriod","type":"uint64","internalType":"uint64"}]},{"type":"error","name":"ConsensusStateNotFound","inputs":[{"name":"revisionHeight","type":"uint64","internalType":"uint64"}]},{"type":"error","name":"DuplicateCommitSealSigner","inputs":[{"name":"signer","type":"address","internalType":"address"}]},{"type":"error","name":"DuplicateValidator","inputs":[{"name":"validator","type":"address","internalType":"address"}]},{"type":"error","name":"EmptyValidatorSet","inputs":[]},{"type":"error","name":"HeaderFromFuture","inputs":[{"name":"currentTimestamp","type":"uint256","internalType":"uint256"},{"name":"headerTimestamp","type":"uint256","internalType":"uint256"},{"name":"maxClockDrift","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"InsufficientTrustedValidatorOverlap","inputs":[{"name":"actual","type":"uint256","internalType":"uint256"},{"name":"required","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"InsufficientValidatorQuorum","inputs":[{"name":"actual","type":"uint256","internalType":"uint256"},{"name":"required","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"InvalidCommitSeal","inputs":[]},{"type":"error","name":"InvalidCommitmentValue","inputs":[{"name":"expectedValue","type":"bytes32","internalType":"bytes32"},{"name":"actualValue","type":"bytes32","internalType":"bytes32"}]},{"type":"error","name":"InvalidDifficulty","inputs":[{"name":"actualDifficulty","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"InvalidECDSASignatureLength","inputs":[{"name":"length","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"InvalidExtraDataFormat","inputs":[{"name":"itemsLength","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"InvalidHeaderFormat","inputs":[{"name":"itemsLength","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"InvalidHeaderHeight","inputs":[]},{"type":"error","name":"InvalidMixHash","inputs":[{"name":"actualMixHash","type":"bytes32","internalType":"bytes32"}]},{"type":"error","name":"InvalidNonce","inputs":[{"name":"actualNonce","type":"bytes","internalType":"bytes"}]},{"type":"error","name":"InvalidOmmersHash","inputs":[{"name":"actualOmmersHash","type":"bytes32","internalType":"bytes32"}]},{"type":"error","name":"InvalidPathLength","inputs":[{"name":"expectedLength","type":"uint256","internalType":"uint256"},{"name":"actualLength","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"InvalidRevisionNumber","inputs":[{"name":"providedRevisionNumber","type":"uint64","internalType":"uint64"}]},{"type":"error","name":"InvalidValidatorAddress","inputs":[{"name":"validator","type":"address","internalType":"address"}]},{"type":"error","name":"InvalidValidatorAddressLength","inputs":[{"name":"length","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"InvalidValueLength","inputs":[{"name":"expectedLength","type":"uint256","internalType":"uint256"},{"name":"actualLength","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"UnsupportedMisbehaviour","inputs":[]},{"type":"error","name":"ValueExists","inputs":[{"name":"actualValue","type":"bytes32","internalType":"bytes32"}]}],"bytecode":{"object":"0x6080604052346103c05761392c80380380610019816103c4565b928339810190610100818303126103c057610033816103e9565b61003f602083016103fd565b9061004c604084016103fd565b60608401516080850151909291906001600160401b0381116103c05785019286601f850112156103c0578351966001600160401b038811610376578760051b9460206100998188016103c4565b809a81520190602082978201019283116103c057602001905b8282106103a8575050506100c860a087016103fd565b956100e160e06100da60c084016103fd565b92016103e9565b956001600160401b03169081156103995788511561038a575f5b89518110156101b1576001600160a01b03610116828c610411565b51161561018a575f5b81811061012f57506001016100fb565b6001600160a01b03610141828d610411565b51166001600160a01b03610155848e610411565b5116146101645760010161011f565b6001600160a01b03610176838d610411565b511663107f863360e21b5f5260045260245ffd5b6001600160a01b039061019d908b610411565b51166359bff38760e01b5f5260045260245ffd5b5060408051979896978a979181016001600160401b03811182821017610376576040525f81526020810190848252604051926080840198848a1060018060401b038b1117610376576040998a526001600160a01b031680855260208086018490526001600160401b03928316868c01819052878416606090970196909652600180546001600160a01b031916909217825592516002805495516001600160801b031996871692851692909217918c1b6fffffffffffffffff000000000000000090811692909217815560038054909616909617968b1b16959095179092555f948552600490529590922080546001600160401b03191694861694909417845583019190915592519392019190831161037657680100000000000000008311610376578154838355808410610350575b50905f5260205f205f5b83811061033357846001600160a01b03811661031a575061030961052f565b505b6040516132da90816105b28239f35b8061032761032d92610439565b506104af565b5061030b565b82516001600160a01b0316818301556020909201916001016102ea565b825f528360205f2091820191015b81811061036b57506102e0565b5f815560010161035e565b634e487b7160e01b5f52604160045260245ffd5b63339e1ffb60e01b5f5260045ffd5b6359d119e360e01b5f5260045ffd5b602080916103b5846103e9565b8152019101906100b2565b5f80fd5b6040519190601f01601f191682016001600160401b0381118382101761037657604052565b51906001600160a01b03821682036103c057565b51906001600160401b03821682036103c057565b80518210156104255760209160051b010190565b634e487b7160e01b5f52603260045260245ffd5b6001600160a01b0381165f9081525f51602061390c5f395f51905f52602052604090205460ff166104aa576001600160a01b03165f8181525f51602061390c5f395f51905f5260205260408120805460ff191660011790553391905f51602061388c5f395f51905f528180a4600190565b505f90565b6001600160a01b0381165f9081525f5160206138ac5f395f51905f52602052604090205460ff166104aa576001600160a01b03165f8181525f5160206138ac5f395f51905f5260205260408120805460ff191660011790553391905f5160206138ec5f395f51905f52905f51602061388c5f395f51905f529080a4600190565b5f80525f5160206138ac5f395f51905f526020525f5160206138cc5f395f51905f525460ff166105ad575f8080525f5160206138ac5f395f51905f526020525f5160206138cc5f395f51905f52805460ff1916600117905533905f5160206138ec5f395f51905f525f51602061388c5f395f51905f528280a4600190565b5f9056fe60806040526004361015610011575f80fd5b5f3560e01c806301ffc9a7146100f45780630bece356146100ef578063248a9ca3146100ea5780632f2ff15d146100e557806336568abe146100e05780634d6d9ffb146100db5780635972185a146100d6578063682ed5f0146100d157806391d14854146100cc578063a217fddf146100c7578063d547741f146100c2578063ddba6537146100bd578063edce8bdc146100b85763ef913a4b146100b3575f80fd5b610a16565b61095e565b61088b565b61085c565b610842565b6107f4565b6105e6565b6105ac565b6103ac565b610350565b61031a565b6102b5565b610217565b34610195576020600319360112610195576004357fffffffff00000000000000000000000000000000000000000000000000000000811680910361019557807f7965db0b000000000000000000000000000000000000000000000000000000006020921490811561016b575b506040519015158152f35b7f01ffc9a7000000000000000000000000000000000000000000000000000000009150145f610160565b5f80fd5b9060206003198301126101955760043567ffffffffffffffff811161019557826023820112156101955780600401359267ffffffffffffffff84116101955760248483010111610195576024019190565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b346101955761028161022836610199565b5f80527f4c48d1d2b0f4f7485fc28e3db22341d96a20aa29e6efa8149da9751603abd4e06020527f6e0c24a6e293ff9b755263dbaa15ba3796b0b8d3fe17cfb4ddf8143b268eac475490919060ff161561029957610d9d565b6040516003821015610294576020918152f35b6101ea565b6102a1611287565b610d9d565b90816020910312610195573590565b346101955760206003193601126101955760206102df6004355f525f602052600160405f20015490565b604051908152f35b6003196040910112610195576004359060243573ffffffffffffffffffffffffffffffffffffffff811681036101955790565b346101955761034e61032b366102e7565b90610349610344825f525f602052600160405f20015490565b61130f565b61220a565b005b346101955761035e366102e7565b3373ffffffffffffffffffffffffffffffffffffffff8216036103845761034e916122e1565b7f6697b232000000000000000000000000000000000000000000000000000000005f5260045ffd5b346101955760206003193601126101955760043567ffffffffffffffff8111610195578060040160806003198336030112610195575f80527f4c48d1d2b0f4f7485fc28e3db22341d96a20aa29e6efa8149da9751603abd4e060205260ff7f6e0c24a6e293ff9b755263dbaa15ba3796b0b8d3fe17cfb4ddf8143b268eac4754161561059f575b61044761044260248401611192565b61137c565b60648201916001610458848461119c565b90500361056157906104a96104966104a261049d61049661049061048961048460446104e09a01611192565b611b30565b988761119c565b9061126e565b3691610b4d565b6123b6565b928061121d565b906001840154906040516104d7816104c960208201948560209181520190565b03601f198101835282610afd565b51902091612444565b805161051f5761051b61050b6104fe845467ffffffffffffffff1690565b67ffffffffffffffff1690565b6040519081529081906020820190565b0390f35b61053361052e61055e92612589565b6125b6565b7fd039601e000000000000000000000000000000000000000000000000000000005f52600452602490565b5ffd5b61055e61056e848461119c565b7f88b3170e000000000000000000000000000000000000000000000000000000005f52600160045260245250604490565b6105a7611287565b610433565b34610195575f6003193601126101955760206040517fbd893629a699470e4ec82a5715bb4981fdaacc5d0a728bf5f55b801d8f4ef10b8152f35b346101955760206003193601126101955760043567ffffffffffffffff8111610195578060040160a06003198336030112610195575f80527f4c48d1d2b0f4f7485fc28e3db22341d96a20aa29e6efa8149da9751603abd4e060205260ff7f6e0c24a6e293ff9b755263dbaa15ba3796b0b8d3fe17cfb4ddf8143b268eac475416156107e7575b61067c61044260248401611192565b6064820191600161068d848461119c565b90500361056157608481019060206106a5838561121d565b9050036107a957906106f46104966106ed6106e56106de61049d6104966104906106d761048460446107149c01611192565b9b8b61119c565b948761121d565b8101906102a6565b948061121d565b906001850154906040516104d7816104c960208201948560209181520190565b8051156107755761052e61072791612589565b908082036107475761051b61050b6104fe855467ffffffffffffffff1690565b7f56ed1b63000000000000000000000000000000000000000000000000000000005f5260045260245260445ffd5b61055e827f56ed1b63000000000000000000000000000000000000000000000000000000005f52906044916004525f602452565b61055e6107b6838561121d565b7f24fadac8000000000000000000000000000000000000000000000000000000005f52602060045260245250604490565b6107ef611287565b61066d565b3461019557602060ff610836610809366102e7565b905f525f845260405f209073ffffffffffffffffffffffffffffffffffffffff165f5260205260405f2090565b54166040519015158152f35b34610195575f6003193601126101955760206040515f8152f35b346101955761034e61086d366102e7565b90610886610344825f525f602052600160405f20015490565b6122e1565b346101955761089936610199565b50505f80527f4c48d1d2b0f4f7485fc28e3db22341d96a20aa29e6efa8149da9751603abd4e06020527f6e0c24a6e293ff9b755263dbaa15ba3796b0b8d3fe17cfb4ddf8143b268eac475460ff1615610915575b7f2c1ed462000000000000000000000000000000000000000000000000000000005f5260045ffd5b61091d611287565b6108ed565b67ffffffffffffffff81160361019557565b601f19601f602060409481855280519182918282880152018686015e5f8582860101520116010190565b346101955760206003193601126101955761097e60043561048481610922565b67ffffffffffffffff8154166002600183015492019060405192608084019160208501526040840152606080840152815480915260a08301915f5260205f20905f5b8181106109ea5761051b856109de818703601f198101835282610afd565b60405191829182610934565b825473ffffffffffffffffffffffffffffffffffffffff168452602090930192600192830192016109c0565b34610195575f6003193601126101955761051b60405173ffffffffffffffffffffffffffffffffffffffff60015416602082015267ffffffffffffffff600254818116604084015260401c16606082015267ffffffffffffffff600354818116608084015260401c1660a082015260a081526109de60c082610afd565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b6060810190811067ffffffffffffffff821117610adc57604052565b610a93565b6040810190811067ffffffffffffffff821117610adc57604052565b90601f601f19910116810190811067ffffffffffffffff821117610adc57604052565b60405190610b2f604083610afd565b565b67ffffffffffffffff8111610adc57601f01601f191660200190565b929192610b5982610b31565b91610b676040519384610afd565b829481845281830111610195578281602093845f960137010152565b9080601f8301121561019557816020610b9e93359101610b4d565b90565b6020818303126101955780359067ffffffffffffffff8211610195570180820391608083126101955760405192610bd784610ac0565b823567ffffffffffffffff811161019557604091610bfa84601f19938701610b83565b8652011261019557604051610c0e81610ae1565b6020830135610c1c81610922565b81526040830135610c2c81610922565b60208201526020840152606082013567ffffffffffffffff811161019557610c549201610b83565b604082015290565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b9060018201809211610c9757565b610c5c565b60c001908160c011610c9757565b60f701908160f711610c9757565b6080019081608011610c9757565b60b701908160b711610c9757565b91908201809211610c9757565b908160011b9180830460021490151715610c9757565b81519167ffffffffffffffff8311610adc57680100000000000000008311610adc578154838355808410610d77575b506020610d389101915f5260205f2090565b5f5b838110610d475750505050565b6001906020610d6a855173ffffffffffffffffffffffffffffffffffffffff1690565b9401938184015501610d3a565b825f528360205f2091820191015b818110610d925750610d26565b5f8155600101610d85565b610da991810190610ba1565b9060208201610dc461044282515167ffffffffffffffff1690565b610dce8351611614565b92606084019367ffffffffffffffff610def865167ffffffffffffffff1690565b161561116a5760035491604083901c67ffffffffffffffff1693610e1d67ffffffffffffffff861642610cd4565b9460a0840195610e35875167ffffffffffffffff1690565b9067ffffffffffffffff82161161112b5750505160200151610e7290610e649067ffffffffffffffff16611b30565b9367ffffffffffffffff1690565b67ffffffffffffffff81168015159081611102575b506110ad575090610ef591610eb66002610eae610ea385611bc2565b60e086015190611cf8565b950185611efe565b610ec660c0830194855190612023565b60406080610ee960015473ffffffffffffffffffffffffffffffffffffffff1690565b930151910151916120c6565b610f22610f0a865167ffffffffffffffff1690565b67ffffffffffffffff165f52600460205260405f2090565b610f376104fe825467ffffffffffffffff1690565b61103b5750916002610fb5928694610fa8610f73610f64610f0a610fc39a9b5167ffffffffffffffff1690565b955167ffffffffffffffff1690565b859067ffffffffffffffff167fffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000825416179055565b6001840155519101610cf7565b5167ffffffffffffffff1690565b600254610fdc9060401c67ffffffffffffffff166104fe565b67ffffffffffffffff821611610ff157505f90565b611037907fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff6fffffffffffffffff00000000000000006002549260401b16911617600255565b5f90565b91611051611059945167ffffffffffffffff1690565b90519261213c565b6110a75761055e611072835167ffffffffffffffff1690565b7fc1aea5f7000000000000000000000000000000000000000000000000000000005f5267ffffffffffffffff16600452602490565b60029150565b61055e906110c3855467ffffffffffffffff1690565b7feae35725000000000000000000000000000000000000000000000000000000005f5267ffffffffffffffff9081166004524260245216604452606490565b9050611123429161111e6104fe885467ffffffffffffffff1690565b610cd4565b11155f610e87565b7f9b772277000000000000000000000000000000000000000000000000000000005f524260045267ffffffffffffffff9081166024521660445260645ffd5b7f59d119e3000000000000000000000000000000000000000000000000000000005f5260045ffd5b35610b9e81610922565b9035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe181360301821215610195570180359067ffffffffffffffff821161019557602001918160051b3603831361019557565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b9035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe181360301821215610195570180359067ffffffffffffffff82116101955760200191813603831361019557565b9015611282578061127e9161121d565b9091565b6111f0565b335f9081527f4c48d1d2b0f4f7485fc28e3db22341d96a20aa29e6efa8149da9751603abd4e0602052604090205460ff16156112bf57565b7fe2517d3f000000000000000000000000000000000000000000000000000000005f52336004527fbd893629a699470e4ec82a5715bb4981fdaacc5d0a728bf5f55b801d8f4ef10b60245260445ffd5b805f525f60205260ff6113433360405f209073ffffffffffffffffffffffffffffffffffffffff165f5260205260405f2090565b54161561134d5750565b7fe2517d3f000000000000000000000000000000000000000000000000000000005f523360045260245260445ffd5b67ffffffffffffffff168061138e5750565b7f3ce598a9000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b60405190610100820182811067ffffffffffffffff821117610adc57604052606060e0838281528260208201528260408201525f838201525f60808201525f60a08201528260c08201520152565b8051600110156112825760400190565b805160071015611282576101000190565b8051600d1015611282576101c00190565b8051600e1015611282576101e00190565b805160081015611282576101200190565b8051600310156112825760800190565b8051600b1015611282576101800190565b8051600c1015611282576101a00190565b8051600410156112825760a00190565b8051156112825760200190565b8051600210156112825760600190565b805160101015611282576102200190565b80518210156112825760209160051b010190565b67ffffffffffffffff8111610adc5760051b60200190565b90611501826114df565b61150e6040519182610afd565b828152601f1961151e82946114df565b0190602036910137565b90602082519201517fffffffffffffffffffffffffffffffffffffffff00000000000000000000000081169260148110611560575050565b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000929350829060140360031b1b161690565b60405160c091906115a38382610afd565b6005815291601f1901825f5b8281106115bb57505050565b8060606020809385010152016115af565b906115d6826114df565b6115e36040519182610afd565b828152601f196115f382946114df565b01905f5b82811061160357505050565b8060606020809385010152016115f7565b61163061162b6116226113b9565b92808452612589565b6125f8565b602082019080825251600f8110611b0557507f1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d493476116766116708351611407565b516126c3565b03611aca57600161169061168a8351611417565b516125b6565b03611a8f577f63746963616c2062797a616e74696e65206661756c7420746f6c6572616e63656116c36116708351611428565b03611a54576116db6116d58251611439565b516126df565b80516008811490811591611a24575b506119ea575061162b61175d6116d5836117216117106104fe61168a611762985161144a565b67ffffffffffffffff166060880152565b61172e611670825161145b565b60808701526117576117466104fe61168a845161146b565b67ffffffffffffffff1660a0880152565b5161147c565b612589565b90604081019180835251600581036119bf57506117886117828351611407565b516125f8565b908151156119975761179a82516114f7565b9360c082019485525f5b8351811015611933576117ba6116d582866114cb565b80516014810361190857506117d16117d791611528565b60601c90565b73ffffffffffffffffffffffffffffffffffffffff811680156118c6575f5b8381106118325750509061182c600192611811838a516114cb565b9073ffffffffffffffffffffffffffffffffffffffff169052565b016117a4565b8161187761185e611844848d516114cb565b5173ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff1690565b14611884576001016117f6565b7f41fe18cc000000000000000000000000000000000000000000000000000000005f5273ffffffffffffffffffffffffffffffffffffffff831660045260245ffd5b7f59bff387000000000000000000000000000000000000000000000000000000005f5273ffffffffffffffffffffffffffffffffffffffff821660045260245ffd5b7f83e46ad2000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b509261178291945061194692505161148d565b61195081516115cc565b9260e081019384525f5b8251811015611991578061198a816119776116d5600195886114cb565b88519061198483836114cb565b526114cb565b500161195a565b50925050565b7f339e1ffb000000000000000000000000000000000000000000000000000000005f5260045ffd5b7f30c6792a000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b611a20906040519182917fd5edd2a500000000000000000000000000000000000000000000000000000000835260048301610934565b0390fd5b7f011b4d03dd8c01f1049143cf9c4c817e4b167f1d1b83e5c6f0f10d89ba1e7bce9150602083012014155f6116ea565b611a6461167061055e9251611428565b7fa19e609c000000000000000000000000000000000000000000000000000000005f52600452602490565b611a9f61168a61055e9251611417565b7ff71b722f000000000000000000000000000000000000000000000000000000005f52600452602490565b611ada61167061055e9251611407565b7fb8120dca000000000000000000000000000000000000000000000000000000005f52600452602490565b7fbc277732000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b67ffffffffffffffff1690815f52600460205260405f209167ffffffffffffffff83541615611b5c5750565b7ff761631b000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b60405190611b96604083610afd565b600182527fc0000000000000000000000000000000000000000000000000000000000000006020830152565b6020611c7d611bcf611592565b611c48611be660408601611bec611be6825161149d565b51612fdf565b611bf58561149d565b52611bff8461149d565b50611c0d611be68251611407565b611c1685611407565b52611c2084611407565b50611c2e611be682516114aa565b611c37856114aa565b52611c41846114aa565b505161145b565b611c518261145b565b52611c5b8161145b565b50611c64611b87565b611c6d8261148d565b52611c778161148d565b506127b5565b910190611c8b8251516115cc565b905f5b83518051821015611ce1579080600192600c82145f14611ccf575050611cb383612866565b611cbd82866114cb565b52611cc881856114cb565b5001611c8e565b611cdc91611be6916114cb565b611cb3565b505050611cee91506127b5565b6020815191012090565b919091611d0583516114f7565b925f5b8151811015611eeb57611d1b81836114cb565b51805160418103611ec0575080601b60ff611d6a611d64611d3e611d7796612845565b517fff000000000000000000000000000000000000000000000000000000000000001690565b60f81c90565b1610611e6d575b8461308d565b50611d81816128e0565b15801590611e4f575b611e275773ffffffffffffffffffffffffffffffffffffffff81165f5b838110611dc757505090611dc160019261181183896114cb565b01611d08565b81611dd861185e611844848c6114cb565b14611de557600101611da7565b7f33af0d5f000000000000000000000000000000000000000000000000000000005f5273ffffffffffffffffffffffffffffffffffffffff831660045260245ffd5b7f09cb44e6000000000000000000000000000000000000000000000000000000005f5260045ffd5b5073ffffffffffffffffffffffffffffffffffffffff811615611d8a565b611eaf611e87611e82611d64611d3e85612845565b6128ce565b60f81b7fff000000000000000000000000000000000000000000000000000000000000001690565b5f1a611eba82612845565b53611d71565b7ff2db9ce1000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b505050565b5f198114610c975760010190565b905f915f5b8151811015611f5757611f3673ffffffffffffffffffffffffffffffffffffffff611f2e83856114cb565b5116846128ea565b611f43575b600101611f03565b92611f4f600191611ef0565b939050611f3b565b50506003611f66915404610c89565b90818110611f72575050565b7fe2dcb1b9000000000000000000000000000000000000000000000000000000005f5260045260245260445ffd5b905f198201918211610c9757565b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff408201918211610c9757565b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff808201918211610c9757565b6020039060208211610c9757565b91908203918211610c9757565b905f915f5b815181101561207c5761205b73ffffffffffffffffffffffffffffffffffffffff61205383856114cb565b511684612941565b612068575b600101612028565b92612074600191611ef0565b939050612060565b50505190600382048203918211610c9757818110612098575050565b7f7818f4e4000000000000000000000000000000000000000000000000000000005f5260045260245260445ffd5b6121109261162b9261175d926040517fffffffffffffffffffffffffffffffffffffffff000000000000000000000000602082019260601b168252601481526104d7603482610afd565b805160021015611282576060610b9e9101516126c3565b8054821015611282575f5260205f2001905f90565b919067ffffffffffffffff8061215a855467ffffffffffffffff1690565b9216911614908115916121fb575b506121f5576002019081548151036121f5575f5b81518110156121ed576121b26121928285612127565b905473ffffffffffffffffffffffffffffffffffffffff9160031b1c1690565b73ffffffffffffffffffffffffffffffffffffffff6121d761185e61184485876114cb565b9116036121e65760010161217c565b5050505f90565b505050600190565b50505f90565b9050600182015414155f612168565b805f525f60205260ff61223e8360405f209073ffffffffffffffffffffffffffffffffffffffff165f5260205260405f2090565b54166121f557805f525f6020526122768260405f209073ffffffffffffffffffffffffffffffffffffffff165f5260205260405f2090565b60017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0082541617905573ffffffffffffffffffffffffffffffffffffffff339216907f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d5f80a4600190565b805f525f60205260ff6123158360405f209073ffffffffffffffffffffffffffffffffffffffff165f5260205260405f2090565b5416156121f557805f525f60205261234e8260405f209073ffffffffffffffffffffffffffffffffffffffff165f5260205260405f2090565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00815416905573ffffffffffffffffffffffffffffffffffffffff339216907ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b5f80a4600190565b60208151910120604051602081019182527f1260944489272988d9df285149b5aa1b0f48f2136d6f416159f840a3e07476006040820152604081526123fc606082610afd565b51902090565b60405190612411602083610afd565b5f808352366020840137565b9061242782610b31565b6124346040519182610afd565b828152601f1961151e8294610b31565b61162b612486919493946124586020610b31565b956124666040519788610afd565b602087526124746020610b31565b601f1960208901910136823752612589565b906124918451610ce1565b918451151580612569575b6124a5906125af565b6124b76124b25f85612016565b61241d565b925f19015f5b8181106124d1575050610b9e939450612ab5565b80612553600f61251661254d611d64611d3e8d6124f060029960011c90565b908d6125478a61253f8a61251661250d611d64611d3e8a8a612855565b60041c600f1690565b1660f81b7fff000000000000000000000000000000000000000000000000000000000000001690565b5f1a92612855565b53612855565b60ff1690565b5f1a6125626001830188612855565b53016124bd565b50600161249c565b6040519061257e82610ae1565b5f6020838281520152565b612591612571565b506020815191604051926125a484610ae1565b835201602082015290565b1561019557565b805180151590816125ec575b5015610195576125d190612d8b565b905190602081106125e0575090565b6020036101000a900490565b6021915011155f6125c2565b61260181612db7565b156101955761260f81612dd7565b612618816114df565b916126266040519384610afd565b818352601f19612635836114df565b015f5b8181106126ac575050602061265891015161265281612e38565b90610cd4565b5f905b8282106126685750505090565b6126a481612677600193612ea3565b90612680610b20565b82815281602082015261269386896114cb565b5261269e85886114cb565b50610cd4565b91019061265b565b6020906126b7612571565b82828801015201612638565b6021815103610195576020015160018101809111610c97575190565b805115610195576126f2610b9e91612d8b565b6126fe8193929361241d565b928360200190612f6c565b805191908290602001825e015f815290565b610b2f9061273d61273794936040519586936020850190612709565b90612709565b03601f198101845283610afd565b6001907fff00000000000000000000000000000000000000000000000000000000000000610b9e94931681520190612709565b916001610b9e94937fff00000000000000000000000000000000000000000000000000000000000000612737941681520190612709565b5f9060605b81518310156127e2576127da6001916127d385856114cb565b519061271b565b9201916127ba565b9150508051603881106128215750610b9e6127fd825161300b565b916104c9612811611e8761254d8651610caa565b916040519485936020850161277e565b612833611e8761254d610b9e93610c9c565b6104c96040519384926020840161274b565b8051604010156112825760600190565b908151811015611282570160200190565b6001815114806128b3575b610b9e578051603881106128a15750610b9e61288d825161300b565b916104c9612811611e8761254d8651610cc6565b612833611e8761254d610b9e93610cb8565b50608060ff6128c7611d64611d3e8561149d565b1610612871565b60ff601b9116019060ff8211610c9757565b6004111561029457565b905f5b82548110156121e65773ffffffffffffffffffffffffffffffffffffffff6129158285612127565b90549060031b1c1673ffffffffffffffffffffffffffffffffffffffff8316146121ed576001016128ed565b905f5b82518110156121e65773ffffffffffffffffffffffffffffffffffffffff61296c82856114cb565b511673ffffffffffffffffffffffffffffffffffffffff8316146121ed57600101612944565b919061299e8351610ce1565b908351151580612aab575b6129b2906125af565b6129bf6124b28284612016565b938192600180841614612a49575b5f19869101935b8481106129e2575050505050565b83612a406001612a36600f61251661254d611d64611d3e8b60029b612a2f612a22886125168f611d64611d3e612a1b61250d9360011c90565b8099612855565b9b8d03809c5f1a92612855565b538c612855565b5f1a920189612855565b530185906129d4565b92507f0f00000000000000000000000000000000000000000000000000000000000000612a8861254d611d64611d3e612a828760011c90565b86612855565b60f81b165f1a612a978661149d565b535f19612aa383611ef0565b9390506129cd565b50818111156129a9565b915f915f612ac1612571565b50845115612d525790935f915b81518310156101955782158080612d3c575b61019557159081612d1f575b5061019557612afe61178283836114cb565b948551600281145f14612bfb5750612b20612b1b6116d58861149d565b613122565b95612b36612b2f88888461318f565b8092610cd4565b965111612bdd5715612b6d5750612b4d9051611fa0565b11610195575111612b64576116d5610b9e91611407565b50610b9e612402565b919094612b7a8651611fa0565b82146101955780612b9c612b98612b92600194611407565b51612db7565b1590565b15612bbe57612bad612bb391611407565b51613114565b915b01919490612ace565b612bca612bd791611407565b5160208101519051902090565b91612bb5565b505091509250612bee915051611fa0565b1161019557610b9e612402565b929491939192601103612cc05781518314612ca257612c2c612c2661254d611d64611d3e8787612855565b93610c89565b92601081101561019557612c49612c4382896114cb565b516130fe565b15612c6b5750505050612c5e91925051611fa0565b0361019557610b9e612402565b86612c83612b98612b9284600196989a97999b6114cb565b15612c9557612bd791612bad916114cb565b612bd791612bca916114cb565b505050612caf9051611fa0565b03610195576116d5610b9e916114ba565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f696e76616c6964206e6f6465206c656e677468000000000000000000000000006044820152606490fd5b9050612d34612d2e84846114cb565b516130c7565b14155f612aec565b50612d4a612bca85856114cb565b871415612ae0565b509050612d8392507f56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b4219150146125af565b610b9e612402565b906020820191612d9b8351612e38565b925190838201809211610c975751928303928311610c97579190565b805115612dd257602060c0910151515f1a1061103757600190565b505f90565b805115612dd2575f9060208101908151612df081612e38565b8101809111610c9757915190518101809111610c975791905b828110612e165750905090565b612e1f81612ea3565b8101809111610c9757612e329091611ef0565b90612e09565b515f1a6080811015612e4957505f90565b60b881108015612e8d575b15612e5f5750600190565b60c0811015612e7e57610b9e90612e799060b75b90612016565b610c89565b610b9e90612e799060f7612e73565b5060c08110158015612e54575060f88110612e54565b80515f1a906080821015612eb8575050600190565b60b8821015612ece5750612e79610b9e91611fdb565b60c0821015612f0f5760010151602082900360b7016101000a9004017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff4a0190565b60f8821015612f255750612e79610b9e91611fae565b60010151602082900360f7016101000a9004017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0a0190565b601f8111610c97576101000a90565b90918015611eeb575b6020811015612faf5780612f8857505050565b612f9c612f97612fa192612008565b612f5d565b611fa0565b905182518216911916179052565b91908051825260208101809111610c97579060208101809111610c975791601f19810190811115612f7557610c5c565b612fe9815161241d565b9081511561300757806020610b9e9201519051908360200190612f6c565b5090565b5f81805b613079575061301d8161241d565b91815b61302957505090565b61303282611fa0565b6130647fff000000000000000000000000000000000000000000000000000000000000008360f81b165f1a9185612855565b5360081c908015610c97575f19019081613020565b9061308390611ef0565b9060081c8061300f565b81519190604183036130bd576130b69250602082015190606060408401519301515f1a90613233565b9192909190565b50505f9160029190565b805160208110156130df575060208101519051902090565b90602001512060405160208101918252602081526123fc604082610afd565b6001815103612dd25760200151515f1a60801490565b61311d90612d8b565b902090565b9081511561019557600f61313e61250d611d64611d3e8661149d565b16806131515750610b9e60025f93612992565b600181036131665750610b9e60015f93612992565b6002810361317c5750610b9e6002600193612992565b60030361019557610b9e60018093612992565b91905f5b838101808211610c97578251811080613229575b15613221576131d77fff000000000000000000000000000000000000000000000000000000000000009184612855565b51167fff000000000000000000000000000000000000000000000000000000000000006132048386612855565b5116900361321a5761321590611ef0565b613193565b9250505090565b509250505090565b50835182106131a7565b91907f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a084116132c2579160209360809260ff5f9560405194855216868401526040830152606082015282805260015afa156132b7575f5173ffffffffffffffffffffffffffffffffffffffff8116156132ad57905f905f90565b505f906001905f90565b6040513d5f823e3d90fd5b5050505f916003919056fea164736f6c634300081c000a2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d4c48d1d2b0f4f7485fc28e3db22341d96a20aa29e6efa8149da9751603abd4e06e0c24a6e293ff9b755263dbaa15ba3796b0b8d3fe17cfb4ddf8143b268eac47bd893629a699470e4ec82a5715bb4981fdaacc5d0a728bf5f55b801d8f4ef10bad3228b676f7d3cd4284a5443f17f1962b36e491b30a40b2405849e597ba5fb5","sourceMap":"230:2306:36:-:0;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;230:2306:36;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;230:2306:36;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;:::i;:::-;;-1:-1:-1;;;;;230:2306:36;;3945:25:35;;3941:84;;230:2306:36;;17599:22:35;17595:79;;-1:-1:-1;17726:3:35;230:2306:36;;17703:21:35;;;;;-1:-1:-1;;;;;17749:13:35;;;;:::i;:::-;230:2306:36;;17749:27:35;17745:111;;-1:-1:-1;17889:5:35;;;;;;17726:3;230:2306:36;;17688:13:35;;17896:3;-1:-1:-1;;;;;17923:13:35;;;;:::i;:::-;230:2306:36;;-1:-1:-1;;;;;17940:13:35;230:2306:36;;17940:13:35;:::i;:::-;230:2306:36;;17923:30:35;17919:117;;230:2306:36;;17874:13:35;;17919:117;-1:-1:-1;;;;;18003:13:35;230:2306:36;;18003:13:35;:::i;:::-;230:2306:36;;17984:33:35;;;-1:-1:-1;17984:33:35;;230:2306:36;;-1:-1:-1;17984:33:35;17745:111;-1:-1:-1;;;;;230:2306:36;17827:13:35;;230:2306:36;17827:13:35;:::i;:::-;230:2306:36;;17803:38:35;;;-1:-1:-1;17803:38:35;;230:2306:36;;-1:-1:-1;17803:38:35;17703:21;-1:-1:-1;230:2306:36;;;17703:21:35;;;;;;;230:2306:36;;-1:-1:-1;;;;;230:2306:36;;;;;;;;;;-1:-1:-1;230:2306:36;;;4179:84:35;;230:2306:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;230:2306:36;;;;;4105:255:35;;;230:2306:36;;;-1:-1:-1;;;;;230:2306:36;;;4105:255:35;;;230:2306:36;;;;;;;4105:255:35;;;230:2306:36;;;;;;;-1:-1:-1;;;;;;230:2306:36;;;;;;;;;;;;;-1:-1:-1;;;;;;230:2306:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;230:2306:36;;;4411:15:35;230:2306:36;;;;;;;;-1:-1:-1;;;;;;230:2306:36;;;;;;;;;;4518:26:35;;230:2306:36;;;;;;;4582:25:35;;;230:2306:36;;;;;;;;;;;;;;;;;;;;17683:377:35;230:2306:36;;-1:-1:-1;230:2306:36;;-1:-1:-1;230:2306:36;-1:-1:-1;230:2306:36;;;;;;;-1:-1:-1;;;;;230:2306:36;;;;4690:44:35;;;:::i;:::-;;4645:233;230:2306:36;;;;;;;;;4645:233:35;4765:43;;4822:45;4765:43;;:::i;:::-;;4822:45;:::i;:::-;;4645:233;;230:2306:36;;;-1:-1:-1;;;;;230:2306:36;;;;;;;;;;;;;;;;-1:-1:-1;230:2306:36;;;-1:-1:-1;230:2306:36;;;;;;;;;;;;;;;;-1:-1:-1;230:2306:36;;;;;;;;;;-1:-1:-1;230:2306:36;;4411:15:35;230:2306:36;;-1:-1:-1;230:2306:36;17595:79:35;17644:19;;;-1:-1:-1;17644:19:35;;-1:-1:-1;17644:19:35;3941:84;3993:21;;;-1:-1:-1;3993:21:35;;-1:-1:-1;3993:21:35;230:2306:36;;;;;;;:::i;:::-;;;;;;;;;;-1:-1:-1;230:2306:36;;;;;;;;;-1:-1:-1;;230:2306:36;;;-1:-1:-1;;;;;230:2306:36;;;;;;;;;;:::o;:::-;;;-1:-1:-1;;;;;230:2306:36;;;;;;:::o;:::-;;;-1:-1:-1;;;;;230:2306:36;;;;;;:::o;:::-;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;6145:316:93;-1:-1:-1;;;;;230:2306:36;;3969:1:35;230:2306:36;;;-1:-1:-1;;;;;;;;;;;230:2306:36;;;;;;;;;;-1:-1:-1;;;;;230:2306:36;3969:1:35;230:2306:36;;;-1:-1:-1;;;;;;;;;;;230:2306:36;;;;;;;-1:-1:-1;;230:2306:36;;;;;735:10:121;;230:2306:36;-1:-1:-1;;;;;;;;;;;3969:1:35;;6336:40:93;6313:4;6390:11;:::o;6238:217::-;6432:12;3969:1:35;6432:12:93;:::o;6145:316::-;-1:-1:-1;;;;;230:2306:36;;;;;;-1:-1:-1;;;;;;;;;;;230:2306:36;;;;;;;;;;-1:-1:-1;;;;;230:2306:36;;;;;-1:-1:-1;;;;;;;;;;;230:2306:36;;;;;;;-1:-1:-1;;230:2306:36;;;;;735:10:121;;230:2306:36;-1:-1:-1;;;;;;;;;;;2082:33:35;-1:-1:-1;;;;;;;;;;;6336:40:93;230:2306:36;6336:40:93;6313:4;6390:11;:::o;6145:316::-;230:2306:36;;;-1:-1:-1;;;;;;;;;;;230:2306:36;;-1:-1:-1;;;;;;;;;;;230:2306:36;;;;;;;;;-1:-1:-1;;;;;;;;;;;230:2306:36;;-1:-1:-1;;;;;;;;;;;230:2306:36;;-1:-1:-1;;230:2306:36;6313:4:93;230:2306:36;;;735:10:121;;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;230:2306:36;;6336:40:93;6313:4;6390:11;:::o;6238:217::-;230:2306:36;6432:12:93;:::o","linkReferences":{}},"deployedBytecode":{"object":"0x60806040526004361015610011575f80fd5b5f3560e01c806301ffc9a7146100f45780630bece356146100ef578063248a9ca3146100ea5780632f2ff15d146100e557806336568abe146100e05780634d6d9ffb146100db5780635972185a146100d6578063682ed5f0146100d157806391d14854146100cc578063a217fddf146100c7578063d547741f146100c2578063ddba6537146100bd578063edce8bdc146100b85763ef913a4b146100b3575f80fd5b610a16565b61095e565b61088b565b61085c565b610842565b6107f4565b6105e6565b6105ac565b6103ac565b610350565b61031a565b6102b5565b610217565b34610195576020600319360112610195576004357fffffffff00000000000000000000000000000000000000000000000000000000811680910361019557807f7965db0b000000000000000000000000000000000000000000000000000000006020921490811561016b575b506040519015158152f35b7f01ffc9a7000000000000000000000000000000000000000000000000000000009150145f610160565b5f80fd5b9060206003198301126101955760043567ffffffffffffffff811161019557826023820112156101955780600401359267ffffffffffffffff84116101955760248483010111610195576024019190565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b346101955761028161022836610199565b5f80527f4c48d1d2b0f4f7485fc28e3db22341d96a20aa29e6efa8149da9751603abd4e06020527f6e0c24a6e293ff9b755263dbaa15ba3796b0b8d3fe17cfb4ddf8143b268eac475490919060ff161561029957610d9d565b6040516003821015610294576020918152f35b6101ea565b6102a1611287565b610d9d565b90816020910312610195573590565b346101955760206003193601126101955760206102df6004355f525f602052600160405f20015490565b604051908152f35b6003196040910112610195576004359060243573ffffffffffffffffffffffffffffffffffffffff811681036101955790565b346101955761034e61032b366102e7565b90610349610344825f525f602052600160405f20015490565b61130f565b61220a565b005b346101955761035e366102e7565b3373ffffffffffffffffffffffffffffffffffffffff8216036103845761034e916122e1565b7f6697b232000000000000000000000000000000000000000000000000000000005f5260045ffd5b346101955760206003193601126101955760043567ffffffffffffffff8111610195578060040160806003198336030112610195575f80527f4c48d1d2b0f4f7485fc28e3db22341d96a20aa29e6efa8149da9751603abd4e060205260ff7f6e0c24a6e293ff9b755263dbaa15ba3796b0b8d3fe17cfb4ddf8143b268eac4754161561059f575b61044761044260248401611192565b61137c565b60648201916001610458848461119c565b90500361056157906104a96104966104a261049d61049661049061048961048460446104e09a01611192565b611b30565b988761119c565b9061126e565b3691610b4d565b6123b6565b928061121d565b906001840154906040516104d7816104c960208201948560209181520190565b03601f198101835282610afd565b51902091612444565b805161051f5761051b61050b6104fe845467ffffffffffffffff1690565b67ffffffffffffffff1690565b6040519081529081906020820190565b0390f35b61053361052e61055e92612589565b6125b6565b7fd039601e000000000000000000000000000000000000000000000000000000005f52600452602490565b5ffd5b61055e61056e848461119c565b7f88b3170e000000000000000000000000000000000000000000000000000000005f52600160045260245250604490565b6105a7611287565b610433565b34610195575f6003193601126101955760206040517fbd893629a699470e4ec82a5715bb4981fdaacc5d0a728bf5f55b801d8f4ef10b8152f35b346101955760206003193601126101955760043567ffffffffffffffff8111610195578060040160a06003198336030112610195575f80527f4c48d1d2b0f4f7485fc28e3db22341d96a20aa29e6efa8149da9751603abd4e060205260ff7f6e0c24a6e293ff9b755263dbaa15ba3796b0b8d3fe17cfb4ddf8143b268eac475416156107e7575b61067c61044260248401611192565b6064820191600161068d848461119c565b90500361056157608481019060206106a5838561121d565b9050036107a957906106f46104966106ed6106e56106de61049d6104966104906106d761048460446107149c01611192565b9b8b61119c565b948761121d565b8101906102a6565b948061121d565b906001850154906040516104d7816104c960208201948560209181520190565b8051156107755761052e61072791612589565b908082036107475761051b61050b6104fe855467ffffffffffffffff1690565b7f56ed1b63000000000000000000000000000000000000000000000000000000005f5260045260245260445ffd5b61055e827f56ed1b63000000000000000000000000000000000000000000000000000000005f52906044916004525f602452565b61055e6107b6838561121d565b7f24fadac8000000000000000000000000000000000000000000000000000000005f52602060045260245250604490565b6107ef611287565b61066d565b3461019557602060ff610836610809366102e7565b905f525f845260405f209073ffffffffffffffffffffffffffffffffffffffff165f5260205260405f2090565b54166040519015158152f35b34610195575f6003193601126101955760206040515f8152f35b346101955761034e61086d366102e7565b90610886610344825f525f602052600160405f20015490565b6122e1565b346101955761089936610199565b50505f80527f4c48d1d2b0f4f7485fc28e3db22341d96a20aa29e6efa8149da9751603abd4e06020527f6e0c24a6e293ff9b755263dbaa15ba3796b0b8d3fe17cfb4ddf8143b268eac475460ff1615610915575b7f2c1ed462000000000000000000000000000000000000000000000000000000005f5260045ffd5b61091d611287565b6108ed565b67ffffffffffffffff81160361019557565b601f19601f602060409481855280519182918282880152018686015e5f8582860101520116010190565b346101955760206003193601126101955761097e60043561048481610922565b67ffffffffffffffff8154166002600183015492019060405192608084019160208501526040840152606080840152815480915260a08301915f5260205f20905f5b8181106109ea5761051b856109de818703601f198101835282610afd565b60405191829182610934565b825473ffffffffffffffffffffffffffffffffffffffff168452602090930192600192830192016109c0565b34610195575f6003193601126101955761051b60405173ffffffffffffffffffffffffffffffffffffffff60015416602082015267ffffffffffffffff600254818116604084015260401c16606082015267ffffffffffffffff600354818116608084015260401c1660a082015260a081526109de60c082610afd565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b6060810190811067ffffffffffffffff821117610adc57604052565b610a93565b6040810190811067ffffffffffffffff821117610adc57604052565b90601f601f19910116810190811067ffffffffffffffff821117610adc57604052565b60405190610b2f604083610afd565b565b67ffffffffffffffff8111610adc57601f01601f191660200190565b929192610b5982610b31565b91610b676040519384610afd565b829481845281830111610195578281602093845f960137010152565b9080601f8301121561019557816020610b9e93359101610b4d565b90565b6020818303126101955780359067ffffffffffffffff8211610195570180820391608083126101955760405192610bd784610ac0565b823567ffffffffffffffff811161019557604091610bfa84601f19938701610b83565b8652011261019557604051610c0e81610ae1565b6020830135610c1c81610922565b81526040830135610c2c81610922565b60208201526020840152606082013567ffffffffffffffff811161019557610c549201610b83565b604082015290565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b9060018201809211610c9757565b610c5c565b60c001908160c011610c9757565b60f701908160f711610c9757565b6080019081608011610c9757565b60b701908160b711610c9757565b91908201809211610c9757565b908160011b9180830460021490151715610c9757565b81519167ffffffffffffffff8311610adc57680100000000000000008311610adc578154838355808410610d77575b506020610d389101915f5260205f2090565b5f5b838110610d475750505050565b6001906020610d6a855173ffffffffffffffffffffffffffffffffffffffff1690565b9401938184015501610d3a565b825f528360205f2091820191015b818110610d925750610d26565b5f8155600101610d85565b610da991810190610ba1565b9060208201610dc461044282515167ffffffffffffffff1690565b610dce8351611614565b92606084019367ffffffffffffffff610def865167ffffffffffffffff1690565b161561116a5760035491604083901c67ffffffffffffffff1693610e1d67ffffffffffffffff861642610cd4565b9460a0840195610e35875167ffffffffffffffff1690565b9067ffffffffffffffff82161161112b5750505160200151610e7290610e649067ffffffffffffffff16611b30565b9367ffffffffffffffff1690565b67ffffffffffffffff81168015159081611102575b506110ad575090610ef591610eb66002610eae610ea385611bc2565b60e086015190611cf8565b950185611efe565b610ec660c0830194855190612023565b60406080610ee960015473ffffffffffffffffffffffffffffffffffffffff1690565b930151910151916120c6565b610f22610f0a865167ffffffffffffffff1690565b67ffffffffffffffff165f52600460205260405f2090565b610f376104fe825467ffffffffffffffff1690565b61103b5750916002610fb5928694610fa8610f73610f64610f0a610fc39a9b5167ffffffffffffffff1690565b955167ffffffffffffffff1690565b859067ffffffffffffffff167fffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000825416179055565b6001840155519101610cf7565b5167ffffffffffffffff1690565b600254610fdc9060401c67ffffffffffffffff166104fe565b67ffffffffffffffff821611610ff157505f90565b611037907fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff6fffffffffffffffff00000000000000006002549260401b16911617600255565b5f90565b91611051611059945167ffffffffffffffff1690565b90519261213c565b6110a75761055e611072835167ffffffffffffffff1690565b7fc1aea5f7000000000000000000000000000000000000000000000000000000005f5267ffffffffffffffff16600452602490565b60029150565b61055e906110c3855467ffffffffffffffff1690565b7feae35725000000000000000000000000000000000000000000000000000000005f5267ffffffffffffffff9081166004524260245216604452606490565b9050611123429161111e6104fe885467ffffffffffffffff1690565b610cd4565b11155f610e87565b7f9b772277000000000000000000000000000000000000000000000000000000005f524260045267ffffffffffffffff9081166024521660445260645ffd5b7f59d119e3000000000000000000000000000000000000000000000000000000005f5260045ffd5b35610b9e81610922565b9035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe181360301821215610195570180359067ffffffffffffffff821161019557602001918160051b3603831361019557565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b9035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe181360301821215610195570180359067ffffffffffffffff82116101955760200191813603831361019557565b9015611282578061127e9161121d565b9091565b6111f0565b335f9081527f4c48d1d2b0f4f7485fc28e3db22341d96a20aa29e6efa8149da9751603abd4e0602052604090205460ff16156112bf57565b7fe2517d3f000000000000000000000000000000000000000000000000000000005f52336004527fbd893629a699470e4ec82a5715bb4981fdaacc5d0a728bf5f55b801d8f4ef10b60245260445ffd5b805f525f60205260ff6113433360405f209073ffffffffffffffffffffffffffffffffffffffff165f5260205260405f2090565b54161561134d5750565b7fe2517d3f000000000000000000000000000000000000000000000000000000005f523360045260245260445ffd5b67ffffffffffffffff168061138e5750565b7f3ce598a9000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b60405190610100820182811067ffffffffffffffff821117610adc57604052606060e0838281528260208201528260408201525f838201525f60808201525f60a08201528260c08201520152565b8051600110156112825760400190565b805160071015611282576101000190565b8051600d1015611282576101c00190565b8051600e1015611282576101e00190565b805160081015611282576101200190565b8051600310156112825760800190565b8051600b1015611282576101800190565b8051600c1015611282576101a00190565b8051600410156112825760a00190565b8051156112825760200190565b8051600210156112825760600190565b805160101015611282576102200190565b80518210156112825760209160051b010190565b67ffffffffffffffff8111610adc5760051b60200190565b90611501826114df565b61150e6040519182610afd565b828152601f1961151e82946114df565b0190602036910137565b90602082519201517fffffffffffffffffffffffffffffffffffffffff00000000000000000000000081169260148110611560575050565b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000929350829060140360031b1b161690565b60405160c091906115a38382610afd565b6005815291601f1901825f5b8281106115bb57505050565b8060606020809385010152016115af565b906115d6826114df565b6115e36040519182610afd565b828152601f196115f382946114df565b01905f5b82811061160357505050565b8060606020809385010152016115f7565b61163061162b6116226113b9565b92808452612589565b6125f8565b602082019080825251600f8110611b0557507f1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d493476116766116708351611407565b516126c3565b03611aca57600161169061168a8351611417565b516125b6565b03611a8f577f63746963616c2062797a616e74696e65206661756c7420746f6c6572616e63656116c36116708351611428565b03611a54576116db6116d58251611439565b516126df565b80516008811490811591611a24575b506119ea575061162b61175d6116d5836117216117106104fe61168a611762985161144a565b67ffffffffffffffff166060880152565b61172e611670825161145b565b60808701526117576117466104fe61168a845161146b565b67ffffffffffffffff1660a0880152565b5161147c565b612589565b90604081019180835251600581036119bf57506117886117828351611407565b516125f8565b908151156119975761179a82516114f7565b9360c082019485525f5b8351811015611933576117ba6116d582866114cb565b80516014810361190857506117d16117d791611528565b60601c90565b73ffffffffffffffffffffffffffffffffffffffff811680156118c6575f5b8381106118325750509061182c600192611811838a516114cb565b9073ffffffffffffffffffffffffffffffffffffffff169052565b016117a4565b8161187761185e611844848d516114cb565b5173ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff1690565b14611884576001016117f6565b7f41fe18cc000000000000000000000000000000000000000000000000000000005f5273ffffffffffffffffffffffffffffffffffffffff831660045260245ffd5b7f59bff387000000000000000000000000000000000000000000000000000000005f5273ffffffffffffffffffffffffffffffffffffffff821660045260245ffd5b7f83e46ad2000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b509261178291945061194692505161148d565b61195081516115cc565b9260e081019384525f5b8251811015611991578061198a816119776116d5600195886114cb565b88519061198483836114cb565b526114cb565b500161195a565b50925050565b7f339e1ffb000000000000000000000000000000000000000000000000000000005f5260045ffd5b7f30c6792a000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b611a20906040519182917fd5edd2a500000000000000000000000000000000000000000000000000000000835260048301610934565b0390fd5b7f011b4d03dd8c01f1049143cf9c4c817e4b167f1d1b83e5c6f0f10d89ba1e7bce9150602083012014155f6116ea565b611a6461167061055e9251611428565b7fa19e609c000000000000000000000000000000000000000000000000000000005f52600452602490565b611a9f61168a61055e9251611417565b7ff71b722f000000000000000000000000000000000000000000000000000000005f52600452602490565b611ada61167061055e9251611407565b7fb8120dca000000000000000000000000000000000000000000000000000000005f52600452602490565b7fbc277732000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b67ffffffffffffffff1690815f52600460205260405f209167ffffffffffffffff83541615611b5c5750565b7ff761631b000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b60405190611b96604083610afd565b600182527fc0000000000000000000000000000000000000000000000000000000000000006020830152565b6020611c7d611bcf611592565b611c48611be660408601611bec611be6825161149d565b51612fdf565b611bf58561149d565b52611bff8461149d565b50611c0d611be68251611407565b611c1685611407565b52611c2084611407565b50611c2e611be682516114aa565b611c37856114aa565b52611c41846114aa565b505161145b565b611c518261145b565b52611c5b8161145b565b50611c64611b87565b611c6d8261148d565b52611c778161148d565b506127b5565b910190611c8b8251516115cc565b905f5b83518051821015611ce1579080600192600c82145f14611ccf575050611cb383612866565b611cbd82866114cb565b52611cc881856114cb565b5001611c8e565b611cdc91611be6916114cb565b611cb3565b505050611cee91506127b5565b6020815191012090565b919091611d0583516114f7565b925f5b8151811015611eeb57611d1b81836114cb565b51805160418103611ec0575080601b60ff611d6a611d64611d3e611d7796612845565b517fff000000000000000000000000000000000000000000000000000000000000001690565b60f81c90565b1610611e6d575b8461308d565b50611d81816128e0565b15801590611e4f575b611e275773ffffffffffffffffffffffffffffffffffffffff81165f5b838110611dc757505090611dc160019261181183896114cb565b01611d08565b81611dd861185e611844848c6114cb565b14611de557600101611da7565b7f33af0d5f000000000000000000000000000000000000000000000000000000005f5273ffffffffffffffffffffffffffffffffffffffff831660045260245ffd5b7f09cb44e6000000000000000000000000000000000000000000000000000000005f5260045ffd5b5073ffffffffffffffffffffffffffffffffffffffff811615611d8a565b611eaf611e87611e82611d64611d3e85612845565b6128ce565b60f81b7fff000000000000000000000000000000000000000000000000000000000000001690565b5f1a611eba82612845565b53611d71565b7ff2db9ce1000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b505050565b5f198114610c975760010190565b905f915f5b8151811015611f5757611f3673ffffffffffffffffffffffffffffffffffffffff611f2e83856114cb565b5116846128ea565b611f43575b600101611f03565b92611f4f600191611ef0565b939050611f3b565b50506003611f66915404610c89565b90818110611f72575050565b7fe2dcb1b9000000000000000000000000000000000000000000000000000000005f5260045260245260445ffd5b905f198201918211610c9757565b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff408201918211610c9757565b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff808201918211610c9757565b6020039060208211610c9757565b91908203918211610c9757565b905f915f5b815181101561207c5761205b73ffffffffffffffffffffffffffffffffffffffff61205383856114cb565b511684612941565b612068575b600101612028565b92612074600191611ef0565b939050612060565b50505190600382048203918211610c9757818110612098575050565b7f7818f4e4000000000000000000000000000000000000000000000000000000005f5260045260245260445ffd5b6121109261162b9261175d926040517fffffffffffffffffffffffffffffffffffffffff000000000000000000000000602082019260601b168252601481526104d7603482610afd565b805160021015611282576060610b9e9101516126c3565b8054821015611282575f5260205f2001905f90565b919067ffffffffffffffff8061215a855467ffffffffffffffff1690565b9216911614908115916121fb575b506121f5576002019081548151036121f5575f5b81518110156121ed576121b26121928285612127565b905473ffffffffffffffffffffffffffffffffffffffff9160031b1c1690565b73ffffffffffffffffffffffffffffffffffffffff6121d761185e61184485876114cb565b9116036121e65760010161217c565b5050505f90565b505050600190565b50505f90565b9050600182015414155f612168565b805f525f60205260ff61223e8360405f209073ffffffffffffffffffffffffffffffffffffffff165f5260205260405f2090565b54166121f557805f525f6020526122768260405f209073ffffffffffffffffffffffffffffffffffffffff165f5260205260405f2090565b60017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0082541617905573ffffffffffffffffffffffffffffffffffffffff339216907f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d5f80a4600190565b805f525f60205260ff6123158360405f209073ffffffffffffffffffffffffffffffffffffffff165f5260205260405f2090565b5416156121f557805f525f60205261234e8260405f209073ffffffffffffffffffffffffffffffffffffffff165f5260205260405f2090565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00815416905573ffffffffffffffffffffffffffffffffffffffff339216907ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b5f80a4600190565b60208151910120604051602081019182527f1260944489272988d9df285149b5aa1b0f48f2136d6f416159f840a3e07476006040820152604081526123fc606082610afd565b51902090565b60405190612411602083610afd565b5f808352366020840137565b9061242782610b31565b6124346040519182610afd565b828152601f1961151e8294610b31565b61162b612486919493946124586020610b31565b956124666040519788610afd565b602087526124746020610b31565b601f1960208901910136823752612589565b906124918451610ce1565b918451151580612569575b6124a5906125af565b6124b76124b25f85612016565b61241d565b925f19015f5b8181106124d1575050610b9e939450612ab5565b80612553600f61251661254d611d64611d3e8d6124f060029960011c90565b908d6125478a61253f8a61251661250d611d64611d3e8a8a612855565b60041c600f1690565b1660f81b7fff000000000000000000000000000000000000000000000000000000000000001690565b5f1a92612855565b53612855565b60ff1690565b5f1a6125626001830188612855565b53016124bd565b50600161249c565b6040519061257e82610ae1565b5f6020838281520152565b612591612571565b506020815191604051926125a484610ae1565b835201602082015290565b1561019557565b805180151590816125ec575b5015610195576125d190612d8b565b905190602081106125e0575090565b6020036101000a900490565b6021915011155f6125c2565b61260181612db7565b156101955761260f81612dd7565b612618816114df565b916126266040519384610afd565b818352601f19612635836114df565b015f5b8181106126ac575050602061265891015161265281612e38565b90610cd4565b5f905b8282106126685750505090565b6126a481612677600193612ea3565b90612680610b20565b82815281602082015261269386896114cb565b5261269e85886114cb565b50610cd4565b91019061265b565b6020906126b7612571565b82828801015201612638565b6021815103610195576020015160018101809111610c97575190565b805115610195576126f2610b9e91612d8b565b6126fe8193929361241d565b928360200190612f6c565b805191908290602001825e015f815290565b610b2f9061273d61273794936040519586936020850190612709565b90612709565b03601f198101845283610afd565b6001907fff00000000000000000000000000000000000000000000000000000000000000610b9e94931681520190612709565b916001610b9e94937fff00000000000000000000000000000000000000000000000000000000000000612737941681520190612709565b5f9060605b81518310156127e2576127da6001916127d385856114cb565b519061271b565b9201916127ba565b9150508051603881106128215750610b9e6127fd825161300b565b916104c9612811611e8761254d8651610caa565b916040519485936020850161277e565b612833611e8761254d610b9e93610c9c565b6104c96040519384926020840161274b565b8051604010156112825760600190565b908151811015611282570160200190565b6001815114806128b3575b610b9e578051603881106128a15750610b9e61288d825161300b565b916104c9612811611e8761254d8651610cc6565b612833611e8761254d610b9e93610cb8565b50608060ff6128c7611d64611d3e8561149d565b1610612871565b60ff601b9116019060ff8211610c9757565b6004111561029457565b905f5b82548110156121e65773ffffffffffffffffffffffffffffffffffffffff6129158285612127565b90549060031b1c1673ffffffffffffffffffffffffffffffffffffffff8316146121ed576001016128ed565b905f5b82518110156121e65773ffffffffffffffffffffffffffffffffffffffff61296c82856114cb565b511673ffffffffffffffffffffffffffffffffffffffff8316146121ed57600101612944565b919061299e8351610ce1565b908351151580612aab575b6129b2906125af565b6129bf6124b28284612016565b938192600180841614612a49575b5f19869101935b8481106129e2575050505050565b83612a406001612a36600f61251661254d611d64611d3e8b60029b612a2f612a22886125168f611d64611d3e612a1b61250d9360011c90565b8099612855565b9b8d03809c5f1a92612855565b538c612855565b5f1a920189612855565b530185906129d4565b92507f0f00000000000000000000000000000000000000000000000000000000000000612a8861254d611d64611d3e612a828760011c90565b86612855565b60f81b165f1a612a978661149d565b535f19612aa383611ef0565b9390506129cd565b50818111156129a9565b915f915f612ac1612571565b50845115612d525790935f915b81518310156101955782158080612d3c575b61019557159081612d1f575b5061019557612afe61178283836114cb565b948551600281145f14612bfb5750612b20612b1b6116d58861149d565b613122565b95612b36612b2f88888461318f565b8092610cd4565b965111612bdd5715612b6d5750612b4d9051611fa0565b11610195575111612b64576116d5610b9e91611407565b50610b9e612402565b919094612b7a8651611fa0565b82146101955780612b9c612b98612b92600194611407565b51612db7565b1590565b15612bbe57612bad612bb391611407565b51613114565b915b01919490612ace565b612bca612bd791611407565b5160208101519051902090565b91612bb5565b505091509250612bee915051611fa0565b1161019557610b9e612402565b929491939192601103612cc05781518314612ca257612c2c612c2661254d611d64611d3e8787612855565b93610c89565b92601081101561019557612c49612c4382896114cb565b516130fe565b15612c6b5750505050612c5e91925051611fa0565b0361019557610b9e612402565b86612c83612b98612b9284600196989a97999b6114cb565b15612c9557612bd791612bad916114cb565b612bd791612bca916114cb565b505050612caf9051611fa0565b03610195576116d5610b9e916114ba565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f696e76616c6964206e6f6465206c656e677468000000000000000000000000006044820152606490fd5b9050612d34612d2e84846114cb565b516130c7565b14155f612aec565b50612d4a612bca85856114cb565b871415612ae0565b509050612d8392507f56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b4219150146125af565b610b9e612402565b906020820191612d9b8351612e38565b925190838201809211610c975751928303928311610c97579190565b805115612dd257602060c0910151515f1a1061103757600190565b505f90565b805115612dd2575f9060208101908151612df081612e38565b8101809111610c9757915190518101809111610c975791905b828110612e165750905090565b612e1f81612ea3565b8101809111610c9757612e329091611ef0565b90612e09565b515f1a6080811015612e4957505f90565b60b881108015612e8d575b15612e5f5750600190565b60c0811015612e7e57610b9e90612e799060b75b90612016565b610c89565b610b9e90612e799060f7612e73565b5060c08110158015612e54575060f88110612e54565b80515f1a906080821015612eb8575050600190565b60b8821015612ece5750612e79610b9e91611fdb565b60c0821015612f0f5760010151602082900360b7016101000a9004017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff4a0190565b60f8821015612f255750612e79610b9e91611fae565b60010151602082900360f7016101000a9004017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0a0190565b601f8111610c97576101000a90565b90918015611eeb575b6020811015612faf5780612f8857505050565b612f9c612f97612fa192612008565b612f5d565b611fa0565b905182518216911916179052565b91908051825260208101809111610c97579060208101809111610c975791601f19810190811115612f7557610c5c565b612fe9815161241d565b9081511561300757806020610b9e9201519051908360200190612f6c565b5090565b5f81805b613079575061301d8161241d565b91815b61302957505090565b61303282611fa0565b6130647fff000000000000000000000000000000000000000000000000000000000000008360f81b165f1a9185612855565b5360081c908015610c97575f19019081613020565b9061308390611ef0565b9060081c8061300f565b81519190604183036130bd576130b69250602082015190606060408401519301515f1a90613233565b9192909190565b50505f9160029190565b805160208110156130df575060208101519051902090565b90602001512060405160208101918252602081526123fc604082610afd565b6001815103612dd25760200151515f1a60801490565b61311d90612d8b565b902090565b9081511561019557600f61313e61250d611d64611d3e8661149d565b16806131515750610b9e60025f93612992565b600181036131665750610b9e60015f93612992565b6002810361317c5750610b9e6002600193612992565b60030361019557610b9e60018093612992565b91905f5b838101808211610c97578251811080613229575b15613221576131d77fff000000000000000000000000000000000000000000000000000000000000009184612855565b51167fff000000000000000000000000000000000000000000000000000000000000006132048386612855565b5116900361321a5761321590611ef0565b613193565b9250505090565b509250505090565b50835182106131a7565b91907f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a084116132c2579160209360809260ff5f9560405194855216868401526040830152606082015282805260015afa156132b7575f5173ffffffffffffffffffffffffffffffffffffffff8116156132ad57905f905f90565b505f906001905f90565b6040513d5f823e3d90fd5b5050505f916003919056fea164736f6c634300081c000a","sourceMap":"230:2306:36:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;;;;-1:-1:-1;;230:2306:36;;;;;;;;;;;;;;;2639:47:93;2654:32;230:2306:36;2639:47:93;;:87;;;;;230:2306:36;;;;;;;;;;2639:87:93;844:25:133;829:40;;;2639:87:93;;;230:2306:36;-1:-1:-1;230:2306:36;;;;;-1:-1:-1;;230:2306:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;5599:2265:35;230:2306:36;;;:::i;:::-;-1:-1:-1;230:2306:36;;;;;;;;;;;;23142:42:35;23138:105;;5599:2265;:::i;:::-;230:2306:36;;;;;;;;;;;;;;;:::i;23138:105:35:-;23211:20;;:::i;:::-;5599:2265;:::i;230:2306:36:-;;;;;;;;;;;:::o;:::-;;;;;-1:-1:-1;;230:2306:36;;;;;;;;;3867:6:93;230:2306:36;3867:6:93;230:2306:36;;3867:22:93;230:2306:36;3867:6:93;230:2306:36;3867:22:93;230:2306:36;3776:120:93;;230:2306:36;;;;;;;;-1:-1:-1;;230:2306:36;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;4296:25:93;230:2306:36;;;:::i;:::-;4266:18:93;2475:4;4266:18;;3867:6;230:2306:36;3867:6:93;230:2306:36;;3867:22:93;230:2306:36;3867:6:93;230:2306:36;3867:22:93;230:2306:36;3776:120:93;;4266:18;2475:4;:::i;:::-;4296:25;:::i;:::-;230:2306:36;;;;;;;;:::i;:::-;735:10:121;230:2306:36;;;5387:34:93;5383:102;;5495:37;;;:::i;5383:102::-;5444:30;;;230:2306:36;5444:30:93;;230:2306:36;;;;;-1:-1:-1;;230:2306:36;;;;;;;;;;;;;;;;-1:-1:-1;;230:2306:36;;;;;;;-1:-1:-1;230:2306:36;;;;;;;;;23142:42:35;23138:105;;230:2306:36;9327:31:35;;:16;;;:31;:::i;:::-;;:::i;:::-;9373:9;;;;9393:1;9373:9;;;;:::i;:::-;:21;;;9369:97;;9535:31;230:2306:36;9681:10:35;9599:36;230:2306:36;9622:12:35;:9;9516:51;9535:31;;9681:95;9535:31;;;:::i;:::-;9516:51;:::i;:::-;9622:9;;;:::i;:::-;:12;;:::i;:::-;230:2306:36;;;:::i;:::-;9599:36:35;:::i;:::-;9681:10;;;:::i;230:2306:36:-;9707:26:35;9393:1;9707:26;;230:2306:36;;;;9745:29:35;;;230:2306:36;9745:29:35;;;;230:2306:36;;;;;;;9745:29:35;;-1:-1:-1;;9745:29:35;;;;;;:::i;:::-;230:2306:36;9735:40:35;;9681:95;;:::i;:::-;230:2306:36;;9786:109:35;;230:2306:36;9904:31:35;230:2306:36;;;;;;;;;;;;9904:31:35;230:2306:36;;;;;;;;;;;;;;;;;9786:109:35;9853:29;:20;9833:51;9853:20;;:::i;:::-;:29;:::i;:::-;9833:51;-1:-1:-1;9833:51:35;230:2306:36;;;;;9833:51:35;-1:-1:-1;9833:51:35;9369:97;9417:38;9438:9;;;;:::i;:::-;9417:38;-1:-1:-1;9417:38:35;9393:1;230:2306:36;;;;-1:-1:-1;230:2306:36;;;23138:105:35;23211:20;;:::i;:::-;23138:105;;230:2306:36;;;;;-1:-1:-1;;230:2306:36;;;;;;;;2082:33:35;230:2306:36;;;;;;;;-1:-1:-1;;230:2306:36;;;;;;;;;;;;;;;;-1:-1:-1;;230:2306:36;;;;;;;-1:-1:-1;230:2306:36;;;;;;;;;23142:42:35;23138:105;;230:2306:36;8099:31:35;;:16;;;:31;:::i;:::-;8145:9;;;;8165:1;8145:9;;;;:::i;:::-;:21;;;8141:97;;8251:10;;;;230:2306:36;8251:10:35;;;;:::i;:::-;:23;;;8247:102;;8418:31;230:2306:36;8631:10:35;8552:33;8563:10;8482:36;230:2306:36;8505:12:35;:9;8399:51;8418:31;;8631:95;8418:31;;;:::i;8399:51::-;8505:9;;;:::i;8482:36::-;8563:10;;;:::i;:::-;8552:33;;;;:::i;:::-;8631:10;;;:::i;230:2306:36:-;8657:26:35;8165:1;8657:26;;230:2306:36;;;;8695:29:35;;;230:2306:36;8695:29:35;;;;230:2306:36;;;;;;;8631:95:35;230:2306:36;;8740:20:35;8736:107;;8883:20;:29;:20;;:::i;:29::-;8927:28;;;;8923:116;;230:2306:36;9048:31:35;230:2306:36;;;;;;;8923:116:35;8978:50;-1:-1:-1;8978:50:35;230:2306:36;;;;;-1:-1:-1;9833:51:35;8736:107;8783:49;;;-1:-1:-1;8783:49:35;230:2306:36;;;;;-1:-1:-1;230:2306:36;;;8247:102:35;8297:41;8320:10;;;;:::i;:::-;8297:41;-1:-1:-1;8297:41:35;230:2306:36;;;;;-1:-1:-1;230:2306:36;;;23138:105:35;23211:20;;:::i;:::-;23138:105;;230:2306:36;;;;;;2920:29:93;230:2306:36;;;:::i;:::-;;2920:6:93;230:2306:36;2920:6:93;230:2306:36;;;2920:6:93;230:2306:36;;;;;;;;;;;;;2920:29:93;230:2306:36;;;;;;;;;;;;;;;-1:-1:-1;;230:2306:36;;;;;;;;;;;;;;;;4713:26:93;230:2306:36;;;:::i;:::-;4683:18:93;2475:4;4683:18;;3867:6;230:2306:36;3867:6:93;230:2306:36;;3867:22:93;230:2306:36;3867:6:93;230:2306:36;3867:22:93;230:2306:36;3776:120:93;;2475:4;4713:26;:::i;230:2306:36:-;;;;;;;:::i;:::-;-1:-1:-1;;23181:1:35;230:2306:36;;;;;;;;;23142:42:35;23138:105;;230:2306:36;10069:25:35;23181:1;10069:25;230:2306:36;23181:1:35;10069:25;23138:105;23211:20;;:::i;:::-;23138:105;;230:2306:36;;;;;;;:::o;:::-;-1:-1:-1;;230:2306:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;-1:-1:-1;;230:2306:36;;;;;5411:34:35;230:2306:36;;;;;:::i;5411:34:35:-;230:2306:36;;;;5527:25:35;5499:26;;;230:2306:36;5527:25:35;;230:2306:36;;;;;;;5462:91:35;230:2306:36;5462:91:35;;230:2306:36;;;;;;;;;;;;;;;;;;;-1:-1:-1;230:2306:36;;-1:-1:-1;230:2306:36;;-1:-1:-1;230:2306:36;;;;;;;5462:91:35;;;;;-1:-1:-1;;5462:91:35;;;;;;:::i;:::-;230:2306:36;;;;;;;:::i;:::-;;;;;;;;;;;;5499:26:35;230:2306:36;;;;;;;;;;;;-1:-1:-1;;230:2306:36;;;;;;;;;5014:11:35;230:2306:36;;5003:23:35;;;230:2306:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5003:23:35;;;;;;:::i;230:2306:36:-;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;:::i;:::-;;;;;;;;;;;;;;;:::o;:::-;;;-1:-1:-1;;230:2306:36;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;:::i;:::-;:::o;:::-;;;;;;;;-1:-1:-1;;230:2306:36;;;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;-1:-1:-1;230:2306:36;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;:::i;:::-;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;-1:-1:-1;;230:2306:36;;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;:::o;:::-;;;;;;;;;;;;2212:66:35;230:2306:36;;;;;;;:::o;:::-;;:::i;:::-;22204:4:35;230:2306:36;;;22204:4:35;230:2306:36;;;:::o;:::-;22358:4:35;230:2306:36;;;22358:4:35;230:2306:36;;;:::o;:::-;21546:4:35;230:2306:36;;;21546:4:35;230:2306:36;;;:::o;:::-;21688:4:35;230:2306:36;;;21688:4:35;230:2306:36;;;:::o;:::-;;;;;;;;;;:::o;:::-;;;;;;;;;8592:1:37;230:2306:36;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;230:2306:36;;;-1:-1:-1;230:2306:36;;;;;;;;;;;;;;;;-1:-1:-1;230:2306:36;;;;;;5599:2265:35;5783:40;5599:2265;5783:40;;;;:::i;:::-;5854:18;;;;:33;230:2306:36;5854:18:35;;230:2306:36;;;;;5854:33:35;5928:28;5941:14;;5928:28;:::i;:::-;5970:13;;;;230:2306:36;;;;;;;;;;;5970:18:35;5966:77;;6074:25;230:2306:36;;;;;;;;6056:43:35;;230:2306:36;;;6056:15:35;:43;:::i;:::-;6102:16;;;;230:2306:36;;;;;;;;;6056:62:35;230:2306:36;;;-1:-1:-1;6052:178:35;;-1:-1:-1;;6306:18:35;5854;6306:33;230:2306:36;;;6287:53:35;;230:2306:36;;9516:51:35;:::i;6287:53::-;230:2306:36;;;;;;;;;6367:31:35;;;:139;;;;5599:2265;6350:298;;;6701:25;;6921:79;6701:25;6757:72;6074:25;6685:62;6701:25;;;:::i;:::-;6728:18;;;;6685:62;;:::i;:::-;6796:32;;6757:72;;:::i;:::-;6870:17;;;;;;;;;:::i;:::-;6982;6964:16;230:2306:36;6074:11:35;230:2306:36;;;;;;6964:16:35;;230:2306:36;6982:17:35;;;6921:79;;:::i;:::-;7059:30;230:2306:36;;;;;;;;;;;;7059:15:35;230:2306:36;;;;;;;7059:30:35;7103:37;230:2306:36;;;;;;;7103:37:35;7099:303;;230:2306:36;;6074:25:35;230:2306:36;;;;7495:46:35;230:2306:36;7455:30:35;230:2306:36;;;;;;;;;7455:30:35;230:2306:36;;;;;;;7495:46:35;230:2306:36;;;;;;;;;;;7495:46:35;6074:11;7551:29;;230:2306:36;7635:17:35;7604:28;;230:2306:36;:::i;:::-;;;;;;;6074:25:35;230:2306:36;7667:55:35;;230:2306:36;;;;;;7667:55:35;230:2306:36;;;7667:55:35;7663:141;;7814:43;5854:33;5599:2265;:::o;7663:141::-;7738:55;;230:2306:36;;6074:25:35;230:2306:36;;;;;;;;6074:25:35;230:2306:36;;7738:55:35;5854:33;5599:2265;:::o;7099:303::-;230:2306:36;;7160:95:35;230:2306:36;;;;;;;7237:17:35;;7160:95;;:::i;:::-;7156:175;;7351:40;230:2306:36;;;;;;;;7351:40:35;5854:33;7351:40;230:2306:36;;7059:15:35;230:2306:36;;;;7156:175:35;6074:25;;-1:-1:-1;7275:41:35:o;6350:298::-;6538:99;230:2306:36;;;;;;;;;6538:99:35;5854:33;6538:99;230:2306:36;;;;6538:99:35;230:2306:36;6056:15:35;230:2306:36;;;;;;;;6367:139:35;6056:15;;6418:69;6056:15;230:2306:36;6418:40:35;230:2306:36;;;;;;;6418:40:35;:69;:::i;:::-;:88;;6367:139;;;6052:178;6141:78;5854:33;6141:78;6056:15;6141:78;230:2306:36;;;;;;;;;;;-1:-1:-1;9833:51:35;5966:77;6011:21;5854:33;6011:21;;5854:33;6011:21;230:2306:36;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;:::i;:::-;;;:::o;:::-;;:::i;3165:103:93:-;735:10:121;2920:6:93;230:2306:36;;;;;;;;;;;;3485:23:93;3481:108;;3165:103::o;3481:108::-;3531:47;2920:6;3531:47;735:10:121;3531:47:93;230:2306:36;2082:33:35;230:2306:36;;;2920:6:93;3531:47;3165:103;230:2306:36;2920:6:93;230:2306:36;2920:6:93;230:2306:36;;;2920:29:93;735:10:121;230:2306:36;2920:6:93;230:2306:36;;;;;;;;;;;;;2920:29:93;230:2306:36;;3485:23:93;3481:108;;3165:103;:::o;3481:108::-;3531:47;2920:6;3531:47;735:10:121;3531:47:93;230:2306:36;;;;2920:6:93;3531:47;19709:177:35;230:2306:36;;19790:19:35;19786:94;;19709:177;:::o;19786:94::-;19832:37;19808:1;19832:37;;230:2306:36;;19808:1:35;19832:37;230:2306:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;230:2306:36;;;;-1:-1:-1;230:2306:36;;;;-1:-1:-1;230:2306:36;;;;;;;;;;;:::o;:::-;;;10964:1:35;230:2306:36;;;;;;;:::o;:::-;;;11133:1:35;230:2306:36;;;;;;;:::o;:::-;;;11272:2:35;230:2306:36;;;;;;;:::o;:::-;;;11458:2:35;230:2306:36;;;;;;;:::o;:::-;;;11501:1:35;230:2306:36;;;;;;;:::o;:::-;;;11731:1:35;230:2306:36;;;;;;;:::o;:::-;;;11804:2:35;230:2306:36;;;;;;;:::o;:::-;;;11872:2:35;230:2306:36;;;;;;;:::o;:::-;;;13103:1:35;230:2306:36;;;;;;;:::o;:::-;;;;;;;;;:::o;:::-;;;2036:1;230:2306;;;;;;;:::o;:::-;;;7558:2:37;230:2306:36;;;;;;;:::o;:::-;;;;;;;;;;;;;;;:::o;2212:66:35:-;;;;;;;;;;;:::o;:::-;;;;;:::i;:::-;230:2306:36;;;;;;:::i;:::-;2212:66:35;;;-1:-1:-1;;2212:66:35;;;;:::i;:::-;;;;;;;;:::o;:::-;;230:2306:36;;;;;2212:66:35;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;230:2306:36;2212:66:35;;;:::o;:::-;230:2306:36;;2212:66:35;;230:2306:36;;2212:66:35;230:2306:36;;:::i;:::-;1842:1;2212:66:35;;;-1:-1:-1;;2212:66:35;;-1:-1:-1;2212:66:35;;;;;;;;;:::o;:::-;;230:2306:36;2212:66:35;;;;;;;;;;;;;;;:::i;:::-;230:2306:36;;;;;;:::i;:::-;2212:66:35;;;-1:-1:-1;;2212:66:35;;;;:::i;:::-;;;-1:-1:-1;2212:66:35;;;;;;;;;:::o;:::-;;230:2306:36;2212:66:35;;;;;;;;;;10603:2705;10769:30;:21;230:2306:36;;:::i;:::-;10710:28:35;;;;10769:21;:::i;:::-;:30;:::i;:::-;10748:18;;;:51;;;;230:2306:36;10841:2:35;10813:30;;10809:114;;10945:18;2394:66;10945:36;:21;:18;;:21;:::i;:::-;;:36;:::i;:::-;10937:66;10933:168;;10964:1;11114:30;:21;:18;;:21;:::i;:::-;;:30;:::i;:::-;:35;11110:122;;2212:66;11253:37;:22;:18;;:22;:::i;:37::-;11245:67;11241:167;;11439:32;:22;:18;;:22;:::i;:::-;;:32;:::i;:::-;230:2306:36;;11501:1:35;11485:17;;;;;:73;;;10603:2705;11481:130;;;11644:18;11919:21;11853:32;:22;11644:18;11621:54;11637:38;11644:30;:21;11919:30;11644:18;;:21;:::i;11637:38::-;230:2306:36;;11621:13:35;;;2212:66;;11621:54;11712:36;:21;:18;;:21;:::i;:36::-;11685:16;;;2212:66;11759:58;11778:39;11785:31;:22;:18;;:22;:::i;11778:39::-;230:2306:36;;11759:16:35;;;2212:66;;11759:58;11853:18;:22;:::i;:32::-;11919:21;:::i;:30::-;11895:21;;;;:54;;;;230:2306:36;11995:1:35;11963:33;;11959:123;;12136:21;:33;:24;:21;;:24;:::i;:::-;;:33;:::i;:::-;230:2306:36;;;12183:26:35;12179:83;;12292:36;230:2306:36;;12292:36:35;:::i;:::-;12272:17;;;;:56;;;-1:-1:-1;12385:3:35;230:2306:36;;12358:25:35;;;;;12434:27;:17;;;;:::i;:27::-;230:2306:36;;12504:2:35;12479:27;;12475:125;;12642:23;;12634:32;12642:23;;:::i;:::-;2212:66;;;;12634:32;230:2306:36;;;12684:23:35;;12680:103;;-1:-1:-1;12816:5:35;;;;;;12989:17;;;:32;10964:1;12989:17;:32;:17;;;:32;:::i;:::-;2212:66;230:2306:36;;2212:66:35;;;12989:32;2212:66;12343:13;;12823:3;12850:17;:33;:20;;:17;;;:20;:::i;:::-;230:2306:36;;;;;12850:20:35;230:2306:36;;;;12850:33:35;;12846:116;;10964:1;2212:66;12801:13;;12846:116;12914:29;-1:-1:-1;12914:29:35;230:2306:36;;;12734:34:35;230:2306:36;2212:66:35;-1:-1:-1;9833:51:35;12680:103;12734:34;-1:-1:-1;12734:34:35;230:2306:36;;;12734:34:35;230:2306:36;2212:66:35;-1:-1:-1;9833:51:35;12475:125;12533:52;-1:-1:-1;12533:52:35;230:2306:36;;;-1:-1:-1;9833:51:35;12358:25;;;13081:24;12358:25;;;13081:33;12358:25;;13081:21;:24;:::i;:33::-;13145:29;230:2306:36;;13145:29:35;:::i;:::-;13124:18;;;;:50;;;-1:-1:-1;13226:3:35;230:2306:36;;13204:20:35;;;;;13269:12;13245:46;13269:12;:22;:12;10964:1;13269:12;;;:::i;:22::-;13245:18;;:46;;;;;:::i;:::-;;;:::i;:::-;;2212:66;13189:13;;13204:20;;;;;10603:2705::o;12179:83::-;12232:19;-1:-1:-1;12232:19:35;;-1:-1:-1;12232:19:35;11959:123;12019:52;-1:-1:-1;12019:52:35;230:2306:36;;;-1:-1:-1;9833:51:35;11481:130;11581:19;230:2306:36;;;11581:19:35;;;;;;;;;;:::i;:::-;;;;11485:73;11526:32;230:2306:36;;10748:18:35;230:2306:36;;11506:16:35;:52;;11485:73;;;11241:167;11358:37;:22;11335:62;11358:18;;:22;:::i;:37::-;11335:62;-1:-1:-1;11335:62:35;230:2306:36;;;;;11110:122:35;11190:30;:21;11172:49;11190:18;;:21;:::i;:30::-;11172:49;-1:-1:-1;11172:49:35;230:2306:36;;;;;10933:168:35;11052:36;:21;11026:64;11052:18;;:21;:::i;:36::-;11026:64;-1:-1:-1;11026:64:35;230:2306:36;;;;;10809:114:35;10866:46;10710:16;10866:46;230:2306:36;;;-1:-1:-1;9833:51:35;19288:292;230:2306:36;;;;-1:-1:-1;230:2306:36;19428:15:35;230:2306:36;;;-1:-1:-1;230:2306:36;;;;;;19473:29:35;19469:105;;19288:292;:::o;19469:105::-;19525:38;-1:-1:-1;19525:38:35;19428:15;230:2306:36;;-1:-1:-1;19525:38:35;230:2306:36;;;;;;;;:::i;:::-;;;;;;;;;:::o;1696:838::-;2257:18;2180:26;1830:14;;:::i;:::-;21133:17:35;2079:24:36;1884:21;;;21133:17:35;1884:24:36;:21;;:24;:::i;:::-;;21133:17:35;:::i;:::-;1854:55:36;;;:::i;:::-;;;;;:::i;:::-;;21133:17:35;1949:24:36;:21;;:24;:::i;21133:17:35:-;1919:55:36;;;:::i;:::-;;;;;:::i;:::-;;21133:17:35;2014:24:36;:21;;:24;:::i;21133:17:35:-;1984:55:36;;;:::i;:::-;;;;;:::i;:::-;;2079:21;:24;:::i;21133:17:35:-;2049:55:36;;;:::i;:::-;;;;;:::i;:::-;;2114:23;;:::i;:::-;;;;:::i;:::-;2212:66:35;2114:23:36;;;:::i;:::-;;2180:26;:::i;:::-;2257:18;;;2245:38;2257:18;;230:2306;2245:38;:::i;:::-;2298:13;1906:1;2344:3;2317:18;;230:2306;;2313:29;;;;;2380:82;;1971:1;2380:82;2385:2;2380:7;;:82;2385:2;;;2390:33;;;;;:::i;:::-;2363:99;;;;:::i;:::-;;;;;;:::i;:::-;;2212:66:35;2298:13:36;;2380:82;21133:17:35;2440:21:36;;;;:::i;21133:17:35:-;2380:82:36;;2313:29;;;;2499:27;2313:29;;2499:27;:::i;:::-;2257:18;230:2306;;;;2489:38;1696:838;:::o;14625:509:35:-;;;;14757:27;230:2306:36;;14757:27:35;:::i;:::-;14799:13;14811:1;14832:3;230:2306:36;;14814:16:35;;;;;14891:8;;;;:::i;:::-;;230:2306:36;;15452:2:35;15437:17;;15433:95;;15547:8;;15559:2;230:2306:36;15541:15:35;15547:8;;15680:30;15547:8;;:::i;:::-;230:2306:36;;;;;15547:8:35;230:2306:36;;;;15541:15:35;230:2306:36;15541:20:35;15537:90;;14832:3;15680:30;;:::i;:::-;230:2306:36;;;;:::i;:::-;15724:33:35;;;:57;;;14832:3;15720:114;;230:2306:36;;;14811:1:35;14934:5;;;;;;15098:19;;;;2212:66;15098:19;;;;;:::i;:::-;2212:66;14799:13;;14941:3;14968:10;:20;:10;;;;;:::i;:20::-;;14964:107;;2212:66;;14919:13;;14964:107;15019:33;14811:1;15019:33;230:2306:36;;;12734:34:35;230:2306:36;2212:66:35;-1:-1:-1;9833:51:35;15720:114;15804:19;14811:1;15804:19;;14811:1;15804:19;15724:57;230:2306:36;;;;15761:20:35;15724:57;;15537:90;15588:28;15595:20;:15;15601:8;;;;:::i;15595:15::-;:20;:::i;:::-;230:2306:36;;;;;;15588:28:35;14811:1;15577:39;;;;:::i;:::-;;15537:90;;15433:95;15477:40;14811:1;15477:40;230:2306:36;;;-1:-1:-1;9833:51:35;14814:16;;;;14625:509::o;230:2306:36:-;-1:-1:-1;;230:2306:36;;;;;;;:::o;16070:540:35:-;;-1:-1:-1;16267:13:35;-1:-1:-1;16302:3:35;230:2306:36;;16282:18:35;;;;;16325:47;230:2306:36;16361:10:35;;;;:::i;:::-;230:2306:36;;16325:47:35;;:::i;:::-;16321:94;;16302:3;2212:66;;16267:13;;16321:94;16392:8;;2212:66;16392:8;;:::i;:::-;16321:94;;;;;16282:18;;;16481:1;16454:32;16282:18;230:2306:36;;16454:32:35;:::i;:::-;16500:17;;;;16496:108;;16070:540;;:::o;16496:108::-;16540:53;-1:-1:-1;16540:53:35;230:2306:36;;;;;-1:-1:-1;16540:53:35;230:2306:36;;-1:-1:-1;;230:2306:36;;;;;;;:::o;:::-;;;;;;;;;;:::o;:::-;;;;;;;;;;:::o;:::-;;;;;;;;;:::o;:::-;;;;;;;;;;:::o;16833:545:35:-;;-1:-1:-1;16972:13:35;-1:-1:-1;17007:3:35;230:2306:36;;16987:18:35;;;;;17030:39;230:2306:36;17058:10:35;;;;:::i;:::-;230:2306:36;;17030:39:35;;:::i;:::-;17026:86;;17007:3;2212:66;;16972:13;;17026:86;17089:8;;2212:66;17089:8;;:::i;:::-;17026:86;;;;;16987:18;;;230:2306:36;;17261:1:35;230:2306:36;;;;;;;;;17276:17:35;;;17272:100;;16833:545;;:::o;17272:100::-;17316:45;-1:-1:-1;17316:45:35;230:2306:36;;;;;-1:-1:-1;17316:45:35;13603:440;13949:31;13603:440;13949:22;13603:440;13821:76;13603:440;230:2306:36;;;13870:25:35;;;230:2306:36;;;;;;13870:25:35;;;;;;;:::i;13949:31::-;230:2306:36;;14018:1:35;230:2306:36;;;;;14005:30:35;230:2306:36;;14005:15:35;:30;:::i;230:2306:36:-;;;;;;;;-1:-1:-1;230:2306:36;;-1:-1:-1;230:2306:36;;;-1:-1:-1;230:2306:36;:::o;18401:677:35:-;;;230:2306:36;;;;;;;;;;;;;;18648:37:35;;;;:82;;;18401:677;18644:125;;;18782:25;;230:2306:36;;;;;18782:53:35;18778:96;;230:2306:36;18926:3:35;230:2306:36;;18903:21:35;;;;;230:2306:36;18949:28:35;;;;:::i;:::-;230:2306:36;;;;;;;;;;;;18949:45:35;18981:13;;;;;:::i;18949:45::-;230:2306:36;;18949:45:35;18945:96;;2212:66;;18888:13;;18945:96;19014:12;;;230:2306:36;19014:12:35;:::o;18903:21::-;;;;2212:66;18401:677;:::o;18778:96::-;18851:12;;230:2306:36;18851:12:35;:::o;18648:82::-;18689:26;;;;;230:2306:36;18689:41:35;;18648:82;;;6145:316:93;230:2306:36;;;;;;;2920:29:93;230:2306:36;;;;;;;;;;;;;;;;2920:29:93;230:2306:36;;;;;;;;;;6281:29:93;230:2306:36;;;;;;;;;;;;;;;;6281:29:93;6313:4;230:2306:36;;;;;;;;735:10:121;230:2306:36;;6336:40:93;;230:2306:36;6336:40:93;;6313:4;6390:11;:::o;6698:317::-;230:2306:36;;;;;;;2920:29:93;230:2306:36;;;;;;;;;;;;;;;;2920:29:93;230:2306:36;;;;;;;;;;;6834:29:93;230:2306:36;;;;;;;;;;;;;;;;6834:29:93;230:2306:36;;;;;;;735:10:121;230:2306:36;;6890:40:93;;230:2306:36;6890:40:93;;230:2306:36;6944:11:93;:::o;14227:174:35:-;230:2306:36;;;;;14351:18:35;230:2306:36;;;14340:53:35;;230:2306:36;;;2605:66:35;230:2306:36;;;;;14340:53:35;;;;;;:::i;:::-;230:2306:36;14330:64:35;;14227:174;:::o;230:2306:36:-;;;;;;;;:::i;:::-;2546:1:37;230:2306:36;;;2212:66:35;230:2306:36;;;2212:66:35;230:2306:36:o;:::-;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;-1:-1:-1;;230:2306:36;;;;:::i;1287:390:37:-;1607:20;:29;1287:390;;;;230:2306:36;1508:2:37;230:2306:36;:::i;:::-;;;;;;;;:::i;:::-;1508:2:37;230:2306:36;;;1508:2:37;230:2306:36;:::i;:::-;-1:-1:-1;;1508:2:37;230:2306:36;;;;2212:66:35;;;1521:63:37;1607:20;:::i;:29::-;1648:21;8580:13;230:2306:36;;8580:13:37;:::i;:::-;230:2306:36;;;8611:13:37;;:33;;;1287:390;8603:42;;;:::i;:::-;8666:26;8676:15;-1:-1:-1;8676:15:37;;:::i;:::-;8666:26;:::i;:::-;8702:18;-1:-1:-1;;230:2306:36;1667:1:37;8888:14;;;;;;1600:70;;;;;;;:::i;8904:6::-;8969:5;9033:37;8985:3;9041:21;:16;9047:9;;8969:5;;8592:1;8969:5;230:2306:36;;;;8969:5:37;8966:9;;8930:59;8966:9;8952:37;8966:9;8960:21;:16;8966:9;;;;;:::i;8960:16::-;230:2306:36;;;;;;8960:21:37;8959:29;230:2306:36;;;;;;8952:37:37;1667:1;8930:59;;;:::i;:::-;;9047:9;:::i;9041:16::-;230:2306:36;;;;9033:37:37;1667:1;9007:63;;8743:1;230:2306:36;;9007:63:37;;:::i;:::-;;230:2306:36;8881:204:37;;8611:33;-1:-1:-1;8628:16:37;8611:33;;230:2306:36;;;;;;;:::i;:::-;-1:-1:-1;230:2306:36;;;;;;;:::o;2457:221:38:-;230:2306:36;;:::i;:::-;;2568:58:38;230:2306:36;;;;;;;;;:::i;:::-;2212:66:35;;2568:58:38;;2643:28;;2212:66:35;2457:221:38;:::o;230:2306:36:-;;;;:::o;7796:439:38:-;230:2306:36;;7883:12:38;;;:30;;;;7796:439;230:2306:36;;;;7957:21:38;;;:::i;:::-;7989:14;8013:192;;;;;;;8215:13;7796:439;:::o;8013:192::-;;;;;;;7796:439;:::o;7883:30::-;7911:2;7899:14;;;;7883:30;;;4170:519;4266:12;;;:::i;:::-;230:2306:36;;;4306:14:38;;;:::i;:::-;2212:66:35;;;:::i;:::-;230:2306:36;;;;;;;:::i;:::-;2212:66:35;;;-1:-1:-1;;230:2306:36;;;:::i;:::-;;-1:-1:-1;230:2306:36;;;;;;4404:11:38;;230:2306:36;4404:41:38;:11;;230:2306:36;4418:27:38;;;:::i;:::-;4404:41;;:::i;:::-;-1:-1:-1;4480:179:38;4500:9;;;;;;4669:13;;;4170:519;:::o;4511:3::-;4632:16;4540:19;;2212:66:35;4540:19:38;;:::i;:::-;230:2306:36;;;:::i;:::-;2212:66:35;;;4585:24:38;230:2306:36;4585:24:38;;2212:66:35;4573:36:38;;;;:::i;:::-;;;;;;:::i;:::-;;4632:16;:::i;:::-;4511:3;2212:66:35;4485:13:38;;;230:2306:36;;;;;:::i;:::-;;;;;;;;;;8413:298:38;8545:2;230:2306:36;;8533:14:38;230:2306:36;;8600:11:38;;230:2306:36;8614:1:38;230:2306:36;;;;;;;8625:56:38;8413:298;:::o;8857:379::-;230:2306:36;;8950:12:38;230:2306:36;;9006:21:38;9202:3;9006:21;;:::i;:::-;9059:14;;;;;;:::i;:::-;9109:61;;;;9202:3;;:::i;230:2306:36:-;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;:::i;:::-;;;:::i;:::-;;-1:-1:-1;;230:2306:36;;;;;;:::i;:::-;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;21886:523:35:-;-1:-1:-1;;230:2306:36;22047:3:35;230:2306:36;;22029:16:35;;;;;22076:31;2212:66;22098:8;;;;;:::i;:::-;;22076:31;;:::i;:::-;22047:3;2212:66;22014:13;;;22029:16;;;;230:2306:36;;22149:2:35;22132:19;;22128:120;;230:2306:36;22328:74:35;22282:29;230:2306:36;;22282:29:35;:::i;:::-;230:2306:36;22328:74:35;22345:37;22352:29;22358:22;230:2306:36;;22358:22:35;:::i;22345:37::-;230:2306:36;;;22328:74:35;;;;;;;:::i;22128:120::-;22191:36;22198:28;22204:21;22174:63;22204:21;;:::i;22191:36::-;22174:63;230:2306:36;;22174:63:35;;;;;;;:::i;230:2306:36:-;;;15552:2:35;230:2306:36;;;;;;;:::o;:::-;;;;;;;;;;;;;:::o;21295:440:35:-;21403:1;230:2306:36;;21389:15:35;:39;;;21295:440;21385:80;;230:2306:36;;21491:2:35;21478:15;;21474:108;;230:2306:36;21658:70:35;21616:25;230:2306:36;;21616:25:35;:::i;:::-;230:2306:36;21658:70:35;21675:37;21682:29;21688:22;230:2306:36;;21688:22:35;:::i;21474:108::-;21533:32;21540:24;21546:17;21516:55;21546:17;;:::i;21389:39::-;21414:6;21424:4;230:2306:36;21408:13:35;21414:6;;;;:::i;21408:13::-;230:2306:36;21408:20:35;21389:39;;230:2306:36;;;;;;;;;;;;:::o;:::-;;-1:-1:-1;230:2306:36;;;:::o;20106:284:35:-;;230:2306:36;20260:3:35;230:2306:36;;20237:21:35;;;;;230:2306:36;20283:13:35;;;;:::i;:::-;230:2306:36;;;;;;;;;;20283:23:35;20279:73;;2212:66;;20222:13;;20608:282;;230:2306:36;20760:3:35;230:2306:36;;20737:21:35;;;;;230:2306:36;20783:13:35;;;;:::i;:::-;230:2306:36;;;;;20783:23:35;20779:73;;2212:66;;20722:13;;8452:649:37;;;8580:13;230:2306:36;;8580:13:37;:::i;:::-;230:2306:36;;;8611:13:37;;:33;;;8452:649;8603:42;;;:::i;:::-;8666:26;8676:15;;;;:::i;8666:26::-;8702:18;;8734:10;8743:1;8734:10;;;:15;8730:118;;8452:649;-1:-1:-1;;230:2306:36;;;8881:204:37;8888:14;;;;;;8452:649;;;;;:::o;8904:6::-;8969:5;9007:63;8743:1;9033:37;8985:3;9041:21;:16;9047:9;;8969:5;8592:1;8969:5;8930:59;8952:37;8969:5;8960:21;8969:5;8966:9;;8969:5;8960:16;8969:5;230:2306:36;;;;8969:5:37;8966:9;;;:::i;8952:37::-;230:2306:36;;;8930:59:37;;8623:1;8930:59;;;:::i;:::-;;9047:9;;:::i;9033:37::-;8623:1;9007:63;230:2306:36;;9007:63:37;;:::i;:::-;;230:2306:36;8881:204:37;;;;8730:118;8795:10;;230:2306:36;8786:26:37;:21;8792:14;;8795:10;;230:2306:36;;;;8795:10:37;8792:14;;:::i;8786:26::-;230:2306:36;;;8623:1:37;8765:55;;;;:::i;:::-;;-1:-1:-1;;8834:3:37;;;:::i;:::-;8730:118;;;;;8611:33;-1:-1:-1;8628:16:37;;;;8611:33;;2316:5418;;2546:1;2557:20;2546:1;230:2306:36;;:::i;:::-;;;;2676:17:37;2672:223;;2963:13;;2546:1;2958:4724;2996:3;230:2306:36;;2978:16:37;;;;;3078:6;;;;:50;;2996:3;3074:97;;3285:6;:47;;;;2996:3;3281:94;;;3501:17;:8;;;;:::i;:17::-;230:2306:36;;;3552:1:37;3537:16;;3533:4139;3552:1;;;3731:7;3703:46;3731:17;:7;;;:::i;:17::-;3703:46;:::i;:::-;3791:56;3865:28;3791:56;;;;;:::i;:::-;3865:28;;;:::i;:::-;230:2306:36;;-1:-1:-1;3912:994:37;;4924:1185;;;230:2306:36;5002:16:37;230:2306:36;;5002:16:37;:::i;:::-;-1:-1:-1;4994:144:37;;230:2306:36;-1:-1:-1;5160:109:37;;5302:7;5338:18;5302:7;;:::i;5160:109::-;5234:12;;;:::i;4924:1185::-;230:2306:36;;;5481:16:37;230:2306:36;;5481:16:37;:::i;:::-;5476:21;;5472:138;;5637:7;5636:17;5637:16;:7;2212:66:35;5637:7:37;;:::i;:::-;;:16;:::i;:::-;5636:17;;230:2306:36;5636:17:37;5637:7;;;5824;:26;:7;;:::i;:::-;;:26;:::i;:::-;5632:459;;2212:66:35;2963:13:37;;;;;5632:459;6041:7;:27;:7;;:::i;:::-;;5445:11:38;;;230:2306:36;;;5522:62:38;;5341:272;;6041:27:37;5632:459;;;3912:994;230:2306:36;;;;;;4705:16:37;230:2306:36;;;4705:16:37;:::i;:::-;-1:-1:-1;4697:149:37;;4875:12;;:::i;3533:4139::-;6133:17;;;;;;6148:2;6133:17;6148:2;;230:2306:36;;6206:36:37;;6222:20;;6438:17;6373:43;6381:34;6387:27;;;;;:::i;6373:43::-;6438:17;;:::i;:::-;6481:12;6491:2;6481:12;;;6477:146;;6649:33;6669:12;;;;:::i;:::-;;6649:33;:::i;:::-;6669:12;;;230:2306:36;;;;6753:16:37;230:2306:36;;;;6753:16:37;:::i;:::-;6748:21;6744:157;;6934:12;;:::i;6645:555::-;6980:12;6979:22;6980:21;:12;;2212:66:35;6980:12:37;;;;;;;:::i;6979:22::-;6980:12;;;7044:31;:12;;;;:::i;6975:225::-;7145:32;:12;;;;:::i;6202:1388::-;230:2306:36;;;7398:16:37;230:2306:36;;7398:16:37;:::i;:::-;7393:21;7389:135;;7553:8;:18;:8;;:::i;6129:1543::-;230:2306:36;;7628:29:37;;;230:2306:36;7628:29:37;;;230:2306:36;;;;;;;;;;;;;11581:19:35;3285:47:37;3323:8;;3311:21;3323:8;;;;:::i;:::-;;3311:21;:::i;:::-;3295:37;;3285:47;;;3078:50;3100:8;:28;:8;;;;:::i;:28::-;3088:40;;;3078:50;;2672:223;2772:78;;;2764:87;2772:78;;2784:66;2772:78;;;2764:87;:::i;:::-;2872:12;;:::i;3469:281:38:-;;3598:11;;;230:2306:36;3583:27:38;230:2306:36;;3583:27:38;:::i;:::-;230:2306:36;;;;;;;;;;;;;;;;;;;;3723:20:38;3469:281;:::o;4838:321::-;230:2306:36;;4918:13:38;4914:31;;4994:11;868:4;4994:11;;230:2306:36;5015:64:38;230:2306:36;5015:64:38;5093:24;5089:42;;5148:4;4838:321;:::o;4914:31::-;4933:12;230:2306:36;4933:12:38;:::o;9434:424::-;230:2306:36;;9518:13:38;9514:27;;230:2306:36;9597:11:38;;;;230:2306:36;;;9611:27:38;;;:::i;:::-;230:2306:36;;;;;;;;;;;;;;;;;;9697:132:38;;9704:16;;;;;;9839:12;;;9434:424;:::o;9697:132::-;9756:20;;;:::i;:::-;230:2306:36;;;;;;;9811:7:38;9736:40;9811:7;;:::i;:::-;9697:132;;;11485:581;11589:64;230:2306:36;11589:64:38;682:4;11667:26;;682:4;;;11709:8;230:2306:36;11709:8:38;:::o;11663:397::-;776:4;11738:25;;:83;;;;11663:397;11734:326;;;11837:8;11844:1;11837:8;:::o;11734:326::-;868:4;11866:24;;868:4;;;11943:35;;:31;;958:4;11943:31;;;:::i;:::-;:35;:::i;11862:198::-;12016:33;;:29;;958:4;12016:29;230:2306:36;11738:83:38;11768:25;868:4;11768:25;;;:52;;11738:83;11768:52;11797:23;958:4;11797:23;;11738:83;;10045:1263;10171:64;;-1:-1:-1;10171:64:38;;682:4;10249:26;;682:4;;;10291:11;;10301:1;10045:1263;:::o;10245:1032::-;776:4;10323:25;;776:4;;;10374:26;;:30;:26;;:::i;10319:958::-;868:4;10425:24;;868:4;;;10465:385;;;;;;;;;;;;;;;;230:2306:36;:::o;10421:856:38:-;958:4;10870:23;;958:4;;;10919:24;;:28;:24;;:::i;10866:411::-;10978:289;;;;;;;;;;;;;;;;230:2306:36;:::o;1035:2:38:-;;;;;;;;;:::o;12279:770::-;;;12360:8;;12356:21;;12441:16;1035:2;12441:16;;;;;12642:7;12638:405;;12279:770;;;:::o;12638:405::-;12764:24;12772:15;12764:28;12772:15;;:::i;:::-;12764:24;:::i;:::-;:28;:::i;:::-;12806:227;;;;;;;;;;;;12279:770::o;12459:16::-;12491:65;;;;;;1035:2;230:2306:36;;;;;;;12600:17:38;1035:2;230:2306:36;;;;;;;12459:16:38;-1:-1:-1;;230:2306:36;;;;;;12434:194:38;230:2306:36;;:::i;6262:337:38:-;6372:19;230:2306:36;;6372:19:38;:::i;:::-;230:2306:36;;;6405:18:38;6401:37;;6542:11;6470:57;6560:8;6542:11;;230:2306:36;;;6470:57:38;;;;6560:8;;:::i;6401:37::-;6425:13;;:::o;22572:430:35:-;-1:-1:-1;22657:19:35;;22717:8;;;22812:17;;;;:::i;:::-;22839:11;22860:116;22885:5;;;22985:10;;22572:430;:::o;22892:3::-;22915:5;;;:::i;:::-;22911:31;230:2306:36;;;;;-1:-1:-1;22911:31:35;;;;:::i;:::-;;230:2306:36;;22892:3:35;230:2306:36;;;;-1:-1:-1;;230:2306:36;22865:18:35;;;;22710:73;22741:8;;;;:::i;:::-;230:2306:36;22771:1:35;230:2306:36;22710:73:35;;;2419:778:131;230:2306:36;;;2419:778:131;2609:2;2589:22;;2609:2;;3041:25;2825:196;;;;;;;;;;;;;;;-1:-1:-1;2825:196:131;3041:25;;:::i;:::-;3034:32;;;;;:::o;2585:606::-;3097:83;;3113:1;3097:83;3117:35;3097:83;;:::o;10970:270:37:-;230:2306:36;;11081:2:37;11069:14;;11081:2;;;5445:11:38;11081:2:37;5445:11:38;;230:2306:36;;;5522:62:38;;11099:32:37;:::o;11065:169::-;5445:11:38;11081:2:37;5445:11:38;230:2306:36;5522:62:38;230:2306:36;;11081:2:37;11179:43;;230:2306:36;;;11081:2:37;11179:43;;;230:2306:36;11179:43:37;;:::i;7919:335::-;8034:1;230:2306:36;;8022:13:37;8018:56;;8117:11;;230:2306:36;8138:60:37;230:2306:36;8138:60:37;8219:4;8214:9;;7919:335::o;5788:270:38:-;5909:21;5788:270;5909:21;:::i;:::-;5964:65;;5788:270;:::o;9342:729:37:-;;230:2306:36;;9472:13:37;230:2306:36;;9538:3:37;9518:17;:12;9524:5;;;;:::i;9518:17::-;:23;9583:16;;;9615:10;10038:25;9624:1;230:2306:36;9579:434:37;10038:25;:::i;9579:434::-;9689:1;9674:16;;9689:1;;9706:10;10038:25;9689:1;230:2306:36;9670:343:37;10038:25;:::i;9670:343::-;9780:1;9765:16;;9780:1;;9797:10;10038:25;9780:1;9689;9761:252;10038:25;:::i;9761:252::-;9870:1;9855:16;9870:1;;10038:25;9689:1;9911:13;9851:162;10038:25;:::i;10353:320::-;;;230:2306:36;10548:3:37;230:2306:36;;;;;;;;;;10505:24:37;;:41;;;10548:3;10505:41;;;10571:16;230:2306:36;;10571:16:37;;:::i;:::-;230:2306:36;;;10591:5:37;;;;:::i;:::-;230:2306:36;;10571:25:37;;10567:72;;10548:3;;;:::i;:::-;10498:151;;10567:72;10616:8;;;;;:::o;10505:41::-;;;;;;10353:320;:::o;10505:41::-;230:2306:36;;;10533:13:37;;10505:41;;7129:1551:131;;;8209:66;8196:79;;8192:164;;230:2306:36;;;;;;-1:-1:-1;230:2306:36;;;;;;;;;;;;;;;;;;;8467:24:131;;;;;;;;;-1:-1:-1;8467:24:131;230:2306:36;;;8505:20:131;8501:113;;8624:49;-1:-1:-1;8624:49:131;-1:-1:-1;7129:1551:131;:::o;8501:113::-;8541:62;-1:-1:-1;8541:62:131;8467:24;8541:62;-1:-1:-1;8541:62:131;:::o;8467:24::-;230:2306:36;;;;;;;;;8192:164:131;8291:54;;;8307:1;8291:54;8311:30;8291:54;;:::o","linkReferences":{}},"methodIdentifiers":{"DEFAULT_ADMIN_ROLE()":"a217fddf","PROOF_SUBMITTER_ROLE()":"5972185a","getClientState()":"ef913a4b","getConsensusState(uint64)":"edce8bdc","getRoleAdmin(bytes32)":"248a9ca3","grantRole(bytes32,address)":"2f2ff15d","hasRole(bytes32,address)":"91d14854","misbehaviour(bytes)":"ddba6537","renounceRole(bytes32,address)":"36568abe","revokeRole(bytes32,address)":"d547741f","supportsInterface(bytes4)":"01ffc9a7","updateClient(bytes)":"0bece356","verifyMembership((bytes,(uint64,uint64),bytes[],bytes))":"682ed5f0","verifyNonMembership((bytes,(uint64,uint64),bytes[]))":"4d6d9ffb"},"rawMetadata":"{\"compiler\":{\"version\":\"0.8.28+commit.7893614a\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"ibcRouter\",\"type\":\"address\"},{\"internalType\":\"uint64\",\"name\":\"initialTrustedHeight\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"initialTrustedTimestamp\",\"type\":\"uint64\"},{\"internalType\":\"bytes32\",\"name\":\"initialTrustedStorageRoot\",\"type\":\"bytes32\"},{\"internalType\":\"address[]\",\"name\":\"initialTrustedValidators\",\"type\":\"address[]\"},{\"internalType\":\"uint64\",\"name\":\"trustingPeriod\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"maxClockDrift\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"roleManager\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"AccessControlBadConfirmation\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"internalType\":\"bytes32\",\"name\":\"neededRole\",\"type\":\"bytes32\"}],\"name\":\"AccessControlUnauthorizedAccount\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"revisionHeight\",\"type\":\"uint64\"}],\"name\":\"ConflictingConsensusState\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"trustedTimestamp\",\"type\":\"uint64\"},{\"internalType\":\"uint256\",\"name\":\"currentTimestamp\",\"type\":\"uint256\"},{\"internalType\":\"uint64\",\"name\":\"trustingPeriod\",\"type\":\"uint64\"}],\"name\":\"ConsensusStateExpired\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"revisionHeight\",\"type\":\"uint64\"}],\"name\":\"ConsensusStateNotFound\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"signer\",\"type\":\"address\"}],\"name\":\"DuplicateCommitSealSigner\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"validator\",\"type\":\"address\"}],\"name\":\"DuplicateValidator\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"EmptyValidatorSet\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"currentTimestamp\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"headerTimestamp\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxClockDrift\",\"type\":\"uint256\"}],\"name\":\"HeaderFromFuture\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"actual\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"required\",\"type\":\"uint256\"}],\"name\":\"InsufficientTrustedValidatorOverlap\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"actual\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"required\",\"type\":\"uint256\"}],\"name\":\"InsufficientValidatorQuorum\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidCommitSeal\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"expectedValue\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"actualValue\",\"type\":\"bytes32\"}],\"name\":\"InvalidCommitmentValue\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"actualDifficulty\",\"type\":\"uint256\"}],\"name\":\"InvalidDifficulty\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"length\",\"type\":\"uint256\"}],\"name\":\"InvalidECDSASignatureLength\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"itemsLength\",\"type\":\"uint256\"}],\"name\":\"InvalidExtraDataFormat\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"itemsLength\",\"type\":\"uint256\"}],\"name\":\"InvalidHeaderFormat\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidHeaderHeight\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"actualMixHash\",\"type\":\"bytes32\"}],\"name\":\"InvalidMixHash\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"actualNonce\",\"type\":\"bytes\"}],\"name\":\"InvalidNonce\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"actualOmmersHash\",\"type\":\"bytes32\"}],\"name\":\"InvalidOmmersHash\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"expectedLength\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"actualLength\",\"type\":\"uint256\"}],\"name\":\"InvalidPathLength\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"providedRevisionNumber\",\"type\":\"uint64\"}],\"name\":\"InvalidRevisionNumber\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"validator\",\"type\":\"address\"}],\"name\":\"InvalidValidatorAddress\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"length\",\"type\":\"uint256\"}],\"name\":\"InvalidValidatorAddressLength\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"expectedLength\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"actualLength\",\"type\":\"uint256\"}],\"name\":\"InvalidValueLength\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"UnsupportedMisbehaviour\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"actualValue\",\"type\":\"bytes32\"}],\"name\":\"ValueExists\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"previousAdminRole\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"newAdminRole\",\"type\":\"bytes32\"}],\"name\":\"RoleAdminChanged\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"RoleGranted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"RoleRevoked\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"DEFAULT_ADMIN_ROLE\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"PROOF_SUBMITTER_ROLE\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getClientState\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"revisionHeight\",\"type\":\"uint64\"}],\"name\":\"getConsensusState\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"}],\"name\":\"getRoleAdmin\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"grantRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"hasRole\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"name\":\"misbehaviour\",\"outputs\":[],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"callerConfirmation\",\"type\":\"address\"}],\"name\":\"renounceRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"revokeRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes4\",\"name\":\"interfaceId\",\"type\":\"bytes4\"}],\"name\":\"supportsInterface\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"updateMsg\",\"type\":\"bytes\"}],\"name\":\"updateClient\",\"outputs\":[{\"internalType\":\"enum ILightClientMsgs.UpdateResult\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes\",\"name\":\"proof\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"uint64\",\"name\":\"revisionNumber\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"revisionHeight\",\"type\":\"uint64\"}],\"internalType\":\"struct IICS02ClientMsgs.Height\",\"name\":\"proofHeight\",\"type\":\"tuple\"},{\"internalType\":\"bytes[]\",\"name\":\"path\",\"type\":\"bytes[]\"},{\"internalType\":\"bytes\",\"name\":\"value\",\"type\":\"bytes\"}],\"internalType\":\"struct ILightClientMsgs.MsgVerifyMembership\",\"name\":\"msg_\",\"type\":\"tuple\"}],\"name\":\"verifyMembership\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes\",\"name\":\"proof\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"uint64\",\"name\":\"revisionNumber\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"revisionHeight\",\"type\":\"uint64\"}],\"internalType\":\"struct IICS02ClientMsgs.Height\",\"name\":\"proofHeight\",\"type\":\"tuple\"},{\"internalType\":\"bytes[]\",\"name\":\"path\",\"type\":\"bytes[]\"}],\"internalType\":\"struct ILightClientMsgs.MsgVerifyNonMembership\",\"name\":\"msg_\",\"type\":\"tuple\"}],\"name\":\"verifyNonMembership\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"errors\":{\"AccessControlBadConfirmation()\":[{\"details\":\"The caller of a function is not the expected one. NOTE: Don't confuse with {AccessControlUnauthorizedAccount}.\"}],\"AccessControlUnauthorizedAccount(address,bytes32)\":[{\"details\":\"The `account` is missing a role.\"}],\"ConflictingConsensusState(uint64)\":[{\"params\":{\"revisionHeight\":\"The conflicting revision height.\"}}],\"ConsensusStateExpired(uint64,uint256,uint64)\":[{\"params\":{\"currentTimestamp\":\"The current block timestamp.\",\"trustedTimestamp\":\"Timestamp of the trusted consensus state.\",\"trustingPeriod\":\"The configured trusting period.\"}}],\"ConsensusStateNotFound(uint64)\":[{\"params\":{\"revisionHeight\":\"The requested revision height.\"}}],\"DuplicateCommitSealSigner(address)\":[{\"params\":{\"signer\":\"The duplicate signer address.\"}}],\"DuplicateValidator(address)\":[{\"params\":{\"validator\":\"The duplicate validator address.\"}}],\"HeaderFromFuture(uint256,uint256,uint256)\":[{\"params\":{\"currentTimestamp\":\"The current block timestamp.\",\"headerTimestamp\":\"The submitted header timestamp.\",\"maxClockDrift\":\"The configured maximum clock drift.\"}}],\"InsufficientTrustedValidatorOverlap(uint256,uint256)\":[{\"params\":{\"actual\":\"The number of trusted validators that signed.\",\"required\":\"The minimum required trusted signer count.\"}}],\"InsufficientValidatorQuorum(uint256,uint256)\":[{\"params\":{\"actual\":\"The number of new validators that signed.\",\"required\":\"The minimum required signer count.\"}}],\"InvalidCommitmentValue(bytes32,bytes32)\":[{\"params\":{\"actualValue\":\"The proven commitment value.\",\"expectedValue\":\"The expected commitment value.\"}}],\"InvalidDifficulty(uint256)\":[{\"params\":{\"actualDifficulty\":\"The difficulty found in the header.\"}}],\"InvalidECDSASignatureLength(uint256)\":[{\"params\":{\"length\":\"The invalid signature length.\"}}],\"InvalidExtraDataFormat(uint256)\":[{\"params\":{\"itemsLength\":\"The decoded `extraData` item count.\"}}],\"InvalidHeaderFormat(uint256)\":[{\"params\":{\"itemsLength\":\"The decoded header item count.\"}}],\"InvalidMixHash(bytes32)\":[{\"params\":{\"actualMixHash\":\"The mix hash found in the header.\"}}],\"InvalidNonce(bytes)\":[{\"params\":{\"actualNonce\":\"The nonce found in the header.\"}}],\"InvalidOmmersHash(bytes32)\":[{\"params\":{\"actualOmmersHash\":\"The ommers hash found in the header.\"}}],\"InvalidPathLength(uint256,uint256)\":[{\"params\":{\"actualLength\":\"The actual path length.\",\"expectedLength\":\"The expected path length.\"}}],\"InvalidRevisionNumber(uint64)\":[{\"params\":{\"providedRevisionNumber\":\"The non-zero revision number.\"}}],\"InvalidValidatorAddress(address)\":[{\"params\":{\"validator\":\"The invalid validator address.\"}}],\"InvalidValidatorAddressLength(uint256)\":[{\"params\":{\"length\":\"The decoded validator address length.\"}}],\"InvalidValueLength(uint256,uint256)\":[{\"params\":{\"actualLength\":\"The actual value length.\",\"expectedLength\":\"The expected value length.\"}}],\"ValueExists(bytes32)\":[{\"params\":{\"actualValue\":\"The value found at the proven storage slot.\"}}]},\"events\":{\"RoleAdminChanged(bytes32,bytes32,bytes32)\":{\"details\":\"Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite {RoleAdminChanged} not being emitted to signal this.\"},\"RoleGranted(bytes32,address,address)\":{\"details\":\"Emitted when `account` is granted `role`. `sender` is the account that originated the contract call. This account bears the admin role (for the granted role). Expected in cases where the role was granted using the internal {AccessControl-_grantRole}.\"},\"RoleRevoked(bytes32,address,address)\":{\"details\":\"Emitted when `account` is revoked `role`. `sender` is the account that originated the contract call: - if using `revokeRole`, it is the admin role bearer - if using `renounceRole`, it is the role bearer (i.e. `account`)\"}},\"kind\":\"dev\",\"methods\":{\"constructor\":{\"params\":{\"ibcRouter\":\"Counterparty ICS26 router address whose storage is proven.\",\"initialTrustedHeight\":\"Initial trusted Besu height.\",\"initialTrustedStorageRoot\":\"Initial trusted storage root of `ibcRouter`.\",\"initialTrustedTimestamp\":\"Initial trusted header timestamp in seconds.\",\"initialTrustedValidators\":\"Initial trusted validator set.\",\"maxClockDrift\":\"Maximum allowed future drift in seconds for submitted headers.\",\"roleManager\":\"Address that administers proof submission; if zero, proof submission is open.\",\"trustingPeriod\":\"Maximum age in seconds for trusted consensus states.\"}},\"getClientState()\":{\"returns\":{\"_0\":\"The client state.\"}},\"getConsensusState(uint64)\":{\"params\":{\"revisionHeight\":\"The revision height to query.\"},\"returns\":{\"_0\":\"The ABI-encoded consensus state.\"}},\"getRoleAdmin(bytes32)\":{\"details\":\"Returns the admin role that controls `role`. See {grantRole} and {revokeRole}. To change a role's admin, use {_setRoleAdmin}.\"},\"grantRole(bytes32,address)\":{\"details\":\"Grants `role` to `account`. If `account` had not been already granted `role`, emits a {RoleGranted} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleGranted} event.\"},\"hasRole(bytes32,address)\":{\"details\":\"Returns `true` if `account` has been granted `role`.\"},\"misbehaviour(bytes)\":{\"params\":{\"misbehaviourMsg\":\"The misbehaviour message\"}},\"renounceRole(bytes32,address)\":{\"details\":\"Revokes `role` from the calling account. Roles are often managed via {grantRole} and {revokeRole}: this function's purpose is to provide a mechanism for accounts to lose their privileges if they are compromised (such as when a trusted device is misplaced). If the calling account had been revoked `role`, emits a {RoleRevoked} event. Requirements: - the caller must be `callerConfirmation`. May emit a {RoleRevoked} event.\"},\"revokeRole(bytes32,address)\":{\"details\":\"Revokes `role` from `account`. If `account` had been granted `role`, emits a {RoleRevoked} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleRevoked} event.\"},\"supportsInterface(bytes4)\":{\"details\":\"Returns true if this contract implements the interface defined by `interfaceId`. See the corresponding https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[ERC section] to learn more about how these ids are created. This function call must use less than 30 000 gas.\"},\"updateClient(bytes)\":{\"params\":{\"updateMsg\":\"The encoded update message e.g., an SP1 proof.\"},\"returns\":{\"_0\":\"The result of the update operation\"}},\"verifyMembership((bytes,(uint64,uint64),bytes[],bytes))\":{\"details\":\"Notice that this message is not view, as it may update the client state for caching purposes.\",\"params\":{\"msg_\":\"The membership message\"},\"returns\":{\"_0\":\"The unix timestamp of the verification height in the counterparty chain in seconds.\"}},\"verifyNonMembership((bytes,(uint64,uint64),bytes[]))\":{\"details\":\"Notice that this message is not view, as it may update the client state for caching purposes.\",\"params\":{\"msg_\":\"The membership message\"},\"returns\":{\"_0\":\"The unix timestamp of the verification height in the counterparty chain in seconds.\"}}},\"title\":\"Besu QBFT Light Client\",\"version\":1},\"userdoc\":{\"errors\":{\"ConflictingConsensusState(uint64)\":[{\"notice\":\"A different consensus state already exists at the submitted height.\"}],\"ConsensusStateExpired(uint64,uint256,uint64)\":[{\"notice\":\"The trusted consensus state is outside the trusting period.\"}],\"ConsensusStateNotFound(uint64)\":[{\"notice\":\"No consensus state exists for the requested height.\"}],\"DuplicateCommitSealSigner(address)\":[{\"notice\":\"A commit seal signer appears more than once.\"}],\"DuplicateValidator(address)\":[{\"notice\":\"A validator appears more than once.\"}],\"EmptyValidatorSet()\":[{\"notice\":\"The validator set is empty.\"}],\"HeaderFromFuture(uint256,uint256,uint256)\":[{\"notice\":\"The submitted header timestamp is too far in the future.\"}],\"InsufficientTrustedValidatorOverlap(uint256,uint256)\":[{\"notice\":\"The submitted signers do not overlap enough with the trusted validator set.\"}],\"InsufficientValidatorQuorum(uint256,uint256)\":[{\"notice\":\"The submitted signers do not meet quorum for the new validator set.\"}],\"InvalidCommitSeal()\":[{\"notice\":\"A commit seal did not recover a valid signer.\"}],\"InvalidCommitmentValue(bytes32,bytes32)\":[{\"notice\":\"A proven commitment value does not match the expected value.\"}],\"InvalidDifficulty(uint256)\":[{\"notice\":\"The Besu BFT difficulty is invalid.\"}],\"InvalidECDSASignatureLength(uint256)\":[{\"notice\":\"An ECDSA signature has an invalid length.\"}],\"InvalidExtraDataFormat(uint256)\":[{\"notice\":\"The submitted `extraData` field has an invalid RLP item count.\"}],\"InvalidHeaderFormat(uint256)\":[{\"notice\":\"The submitted header has an invalid RLP item count.\"}],\"InvalidHeaderHeight()\":[{\"notice\":\"The submitted header height is zero.\"}],\"InvalidMixHash(bytes32)\":[{\"notice\":\"The Besu BFT mix hash is invalid.\"}],\"InvalidNonce(bytes)\":[{\"notice\":\"The Besu BFT nonce is invalid.\"}],\"InvalidOmmersHash(bytes32)\":[{\"notice\":\"The ommers hash is invalid.\"}],\"InvalidPathLength(uint256,uint256)\":[{\"notice\":\"A proof path has an invalid length.\"}],\"InvalidRevisionNumber(uint64)\":[{\"notice\":\"The revision number must be zero for Besu light client heights.\"}],\"InvalidValidatorAddress(address)\":[{\"notice\":\"A validator address is invalid.\"}],\"InvalidValidatorAddressLength(uint256)\":[{\"notice\":\"A validator address has an invalid byte length.\"}],\"InvalidValueLength(uint256,uint256)\":[{\"notice\":\"A membership value has an invalid length.\"}],\"UnsupportedMisbehaviour()\":[{\"notice\":\"Misbehaviour handling is not supported by this client.\"}],\"ValueExists(bytes32)\":[{\"notice\":\"A non-membership proof found an existing value.\"}]},\"kind\":\"user\",\"methods\":{\"PROOF_SUBMITTER_ROLE()\":{\"notice\":\"Role allowed to submit client updates and proof verifications.\"},\"constructor\":{\"notice\":\"Creates a Besu QBFT light client from an initial trusted consensus state.\"},\"getClientState()\":{\"notice\":\"Returns the client state.\"},\"getConsensusState(uint64)\":{\"notice\":\"Returns the encoded consensus state for a revision height.\"},\"misbehaviour(bytes)\":{\"notice\":\"Misbehaviour handling, moves the light client to the frozen state if misbehaviour is detected\"},\"updateClient(bytes)\":{\"notice\":\"Updating the client and consensus state\"},\"verifyMembership((bytes,(uint64,uint64),bytes[],bytes))\":{\"notice\":\"Querying the membership of a key-value pair\"},\"verifyNonMembership((bytes,(uint64,uint64),bytes[]))\":{\"notice\":\"Querying the non-membership of a key\"}},\"notice\":\"Verifies Besu QBFT headers and ICS26 router storage proofs.\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/light-clients/besu/BesuQBFTLightClient.sol\":\"BesuQBFTLightClient\"},\"evmVersion\":\"cancun\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"none\"},\"optimizer\":{\"enabled\":true,\"runs\":10000},\"remappings\":[\":@openzeppelin-contracts/=node_modules/@openzeppelin/contracts/\",\":@openzeppelin-upgradeable/=node_modules/@openzeppelin/contracts-upgradeable/\",\":@openzeppelin/=node_modules/@openzeppelin/\",\":@sp1-contracts/=node_modules/sp1-contracts/contracts/src/\",\":@uniswap/permit2/=node_modules/@uniswap/permit2/\",\":forge-std/=node_modules/forge-std/src/\",\":sp1-contracts/=node_modules/sp1-contracts/\"],\"viaIR\":true},\"sources\":{\"contracts/interfaces/ILightClient.sol\":{\"keccak256\":\"0x3b2361546ee834a442d844c979fbad3458ee13146b093f585587a09e19a266af\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://5b5d53101bb598f14a79cb1092479736fa18e8f84945ea6ef80f4dac84466042\",\"dweb:/ipfs/QmaTCo6M3Z9aYCSX65AQtixo1sB4ymQUDAgTXSKHqJHGDh\"]},\"contracts/light-clients/besu/BesuLightClientBase.sol\":{\"keccak256\":\"0xd700a74d5dd85a4dc0432f9fda2e787d78670647417e54416a07af85bb42194a\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://92069fbd0993510316fb3e9eba5dde45316cc6d3fd979c75b3485253709caa88\",\"dweb:/ipfs/QmeuXFNzqe5JYwkZwLBA7LSni4LuQAWgy7t7jbfHXAKNtz\"]},\"contracts/light-clients/besu/BesuQBFTLightClient.sol\":{\"keccak256\":\"0x7fcf75573578ef5c30dfbab335b7a4a400b35f1ad0259bc2bf712d12ffc10ddc\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://623f65bad2a1caaf28e1ecb52f42a73e78d0a04cf7bf88edceea5f225d8cf24b\",\"dweb:/ipfs/QmS6fPmaTh9MmAXQUdYFLjxph5tPynmZ5DmLo2juTa3Qq6\"]},\"contracts/light-clients/besu/MPTProof.sol\":{\"keccak256\":\"0xe79077eef64b0a5901e83174bb0643dd71887d3d1b75a230e3c6d98230fe61a1\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://f828f699316e27a9449c4da03471f8a228c2919e93a5575dd331dfd7278de61b\",\"dweb:/ipfs/QmNzjoyYNyuFqn7tS7HteYhyTKS77iy7QhBwMc1rDDJcPY\"]},\"contracts/light-clients/besu/RLPReader.sol\":{\"keccak256\":\"0xa64ad17e6da7fed2bd206df52189286694339a8061dc5d158e717eda982af1d9\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://7020db2fe854e90e1b791e0e587610fc26bed3073ba1811faa275a1d8bf3c2c7\",\"dweb:/ipfs/QmdXdKghNFZSX7N9qD6BsKuJQdrFoqatsVWvHRL7vJCmeP\"]},\"contracts/light-clients/besu/errors/IBesuLightClientErrors.sol\":{\"keccak256\":\"0x1124e58e906cd3dddf876757393a4e4812170e4ae41da99a1d0b734266ae021b\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://54d7d62a6ef3af5d32eb3c293499f90223a0f349b1475b3dad6af443106041d4\",\"dweb:/ipfs/QmdSJQup9PvvB3hpnWZu3YE2Rh5kTcAs9zGBHsMyAdCKCX\"]},\"contracts/light-clients/besu/msgs/IBesuLightClientMsgs.sol\":{\"keccak256\":\"0x3a903fd7635a040041b94f4e33dc2881c8992bd22acb14cce72aeab074b820be\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://25d72c46f4bf1b6335f1c62c8d55f3e3643a41f75ffba160cb137bed57d7854c\",\"dweb:/ipfs/QmepY12FQmcMned3fbMt1K3mfELZwq9uiMKxS41yLDAxV3\"]},\"contracts/msgs/IICS02ClientMsgs.sol\":{\"keccak256\":\"0x03d1265eae327c3744d774bf22a30d845233d50664921c9aa57cef2d71fd89d2\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://89900781cc5c60540a237d92d42745ea6165765ee8fb4d50e8137a717195cc75\",\"dweb:/ipfs/Qmbx5p8gZ8sEMMeZytXsLee49JUayhAaoJ2yxX93WUrvQo\"]},\"contracts/msgs/ILightClientMsgs.sol\":{\"keccak256\":\"0x8d1e56ab166a7b4aa6999708e3214a4645ebbc3835c2b2a4c255c9923eebafde\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://8bd4200dc04d950c0f050623fa9a8accdbec877fd446c039d4dd6c678bdf1513\",\"dweb:/ipfs/QmZQTViaA7N6BVNDzJ1Z6w799PrPoE4ajPueZSPwX4sGZ9\"]},\"node_modules/@openzeppelin/contracts/access/AccessControl.sol\":{\"keccak256\":\"0x4686ec784d75f95beaf2bf5b5f26e5f946d4c864aaee9c3c62bdc18381f5e017\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://26710ca191913f3c9df542079c4a6dcff02968e92d4f7357daefef9fbe72a19c\",\"dweb:/ipfs/QmanHbeWuBbVEqXySHa1zhm2rExjYpChDBubBaJNTCa2JB\"]},\"node_modules/@openzeppelin/contracts/access/IAccessControl.sol\":{\"keccak256\":\"0xbff9f59c84e5337689161ce7641c0ef8e872d6a7536fbc1f5133f128887aba3c\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://b308f882e796f7b79c9502deacb0a62983035c6f6f4e962b319ba6a1f4a77d3d\",\"dweb:/ipfs/QmaWCW7ahEQqFjwhSUhV7Ae7WhfNvzSpE7DQ58hvEooqPL\"]},\"node_modules/@openzeppelin/contracts/utils/Context.sol\":{\"keccak256\":\"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://6a708e8a5bdb1011c2c381c9a5cfd8a9a956d7d0a9dc1bd8bcdaf52f76ef2f12\",\"dweb:/ipfs/Qmax9WHBnVsZP46ZxEMNRQpLQnrdE4dK8LehML1Py8FowF\"]},\"node_modules/@openzeppelin/contracts/utils/cryptography/ECDSA.sol\":{\"keccak256\":\"0xbeb5cad8aaabe0d35d2ec1a8414d91e81e5a8ca679add4cf57e2f33476861f40\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://ebb272a5ee2da4e8bd5551334e0ce8dce4e9c56a04570d6bf046d260fab3116a\",\"dweb:/ipfs/QmNw6RyM769qcqFocDq6HJMG2WiEnQbvizpRaUXsACHho2\"]},\"node_modules/@openzeppelin/contracts/utils/introspection/ERC165.sol\":{\"keccak256\":\"0x2d9dc2fe26180f74c11c13663647d38e259e45f95eb88f57b61d2160b0109d3e\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://81233d1f98060113d9922180bb0f14f8335856fe9f339134b09335e9f678c377\",\"dweb:/ipfs/QmWh6R35SarhAn4z2wH8SU456jJSYL2FgucfTFgbHJJN4E\"]},\"node_modules/@openzeppelin/contracts/utils/introspection/IERC165.sol\":{\"keccak256\":\"0x8891738ffe910f0cf2da09566928589bf5d63f4524dd734fd9cedbac3274dd5c\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://971f954442df5c2ef5b5ebf1eb245d7105d9fbacc7386ee5c796df1d45b21617\",\"dweb:/ipfs/QmadRjHbkicwqwwh61raUEapaVEtaLMcYbQZWs9gUkgj3u\"]}},\"version\":1}","metadata":{"compiler":{"version":"0.8.28+commit.7893614a"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"address","name":"ibcRouter","type":"address"},{"internalType":"uint64","name":"initialTrustedHeight","type":"uint64"},{"internalType":"uint64","name":"initialTrustedTimestamp","type":"uint64"},{"internalType":"bytes32","name":"initialTrustedStorageRoot","type":"bytes32"},{"internalType":"address[]","name":"initialTrustedValidators","type":"address[]"},{"internalType":"uint64","name":"trustingPeriod","type":"uint64"},{"internalType":"uint64","name":"maxClockDrift","type":"uint64"},{"internalType":"address","name":"roleManager","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"type":"error","name":"AccessControlBadConfirmation"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bytes32","name":"neededRole","type":"bytes32"}],"type":"error","name":"AccessControlUnauthorizedAccount"},{"inputs":[{"internalType":"uint64","name":"revisionHeight","type":"uint64"}],"type":"error","name":"ConflictingConsensusState"},{"inputs":[{"internalType":"uint64","name":"trustedTimestamp","type":"uint64"},{"internalType":"uint256","name":"currentTimestamp","type":"uint256"},{"internalType":"uint64","name":"trustingPeriod","type":"uint64"}],"type":"error","name":"ConsensusStateExpired"},{"inputs":[{"internalType":"uint64","name":"revisionHeight","type":"uint64"}],"type":"error","name":"ConsensusStateNotFound"},{"inputs":[{"internalType":"address","name":"signer","type":"address"}],"type":"error","name":"DuplicateCommitSealSigner"},{"inputs":[{"internalType":"address","name":"validator","type":"address"}],"type":"error","name":"DuplicateValidator"},{"inputs":[],"type":"error","name":"EmptyValidatorSet"},{"inputs":[{"internalType":"uint256","name":"currentTimestamp","type":"uint256"},{"internalType":"uint256","name":"headerTimestamp","type":"uint256"},{"internalType":"uint256","name":"maxClockDrift","type":"uint256"}],"type":"error","name":"HeaderFromFuture"},{"inputs":[{"internalType":"uint256","name":"actual","type":"uint256"},{"internalType":"uint256","name":"required","type":"uint256"}],"type":"error","name":"InsufficientTrustedValidatorOverlap"},{"inputs":[{"internalType":"uint256","name":"actual","type":"uint256"},{"internalType":"uint256","name":"required","type":"uint256"}],"type":"error","name":"InsufficientValidatorQuorum"},{"inputs":[],"type":"error","name":"InvalidCommitSeal"},{"inputs":[{"internalType":"bytes32","name":"expectedValue","type":"bytes32"},{"internalType":"bytes32","name":"actualValue","type":"bytes32"}],"type":"error","name":"InvalidCommitmentValue"},{"inputs":[{"internalType":"uint256","name":"actualDifficulty","type":"uint256"}],"type":"error","name":"InvalidDifficulty"},{"inputs":[{"internalType":"uint256","name":"length","type":"uint256"}],"type":"error","name":"InvalidECDSASignatureLength"},{"inputs":[{"internalType":"uint256","name":"itemsLength","type":"uint256"}],"type":"error","name":"InvalidExtraDataFormat"},{"inputs":[{"internalType":"uint256","name":"itemsLength","type":"uint256"}],"type":"error","name":"InvalidHeaderFormat"},{"inputs":[],"type":"error","name":"InvalidHeaderHeight"},{"inputs":[{"internalType":"bytes32","name":"actualMixHash","type":"bytes32"}],"type":"error","name":"InvalidMixHash"},{"inputs":[{"internalType":"bytes","name":"actualNonce","type":"bytes"}],"type":"error","name":"InvalidNonce"},{"inputs":[{"internalType":"bytes32","name":"actualOmmersHash","type":"bytes32"}],"type":"error","name":"InvalidOmmersHash"},{"inputs":[{"internalType":"uint256","name":"expectedLength","type":"uint256"},{"internalType":"uint256","name":"actualLength","type":"uint256"}],"type":"error","name":"InvalidPathLength"},{"inputs":[{"internalType":"uint64","name":"providedRevisionNumber","type":"uint64"}],"type":"error","name":"InvalidRevisionNumber"},{"inputs":[{"internalType":"address","name":"validator","type":"address"}],"type":"error","name":"InvalidValidatorAddress"},{"inputs":[{"internalType":"uint256","name":"length","type":"uint256"}],"type":"error","name":"InvalidValidatorAddressLength"},{"inputs":[{"internalType":"uint256","name":"expectedLength","type":"uint256"},{"internalType":"uint256","name":"actualLength","type":"uint256"}],"type":"error","name":"InvalidValueLength"},{"inputs":[],"type":"error","name":"UnsupportedMisbehaviour"},{"inputs":[{"internalType":"bytes32","name":"actualValue","type":"bytes32"}],"type":"error","name":"ValueExists"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32","indexed":true},{"internalType":"bytes32","name":"previousAdminRole","type":"bytes32","indexed":true},{"internalType":"bytes32","name":"newAdminRole","type":"bytes32","indexed":true}],"type":"event","name":"RoleAdminChanged","anonymous":false},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32","indexed":true},{"internalType":"address","name":"account","type":"address","indexed":true},{"internalType":"address","name":"sender","type":"address","indexed":true}],"type":"event","name":"RoleGranted","anonymous":false},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32","indexed":true},{"internalType":"address","name":"account","type":"address","indexed":true},{"internalType":"address","name":"sender","type":"address","indexed":true}],"type":"event","name":"RoleRevoked","anonymous":false},{"inputs":[],"stateMutability":"view","type":"function","name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"PROOF_SUBMITTER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"getClientState","outputs":[{"internalType":"bytes","name":"","type":"bytes"}]},{"inputs":[{"internalType":"uint64","name":"revisionHeight","type":"uint64"}],"stateMutability":"view","type":"function","name":"getConsensusState","outputs":[{"internalType":"bytes","name":"","type":"bytes"}]},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"stateMutability":"view","type":"function","name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}]},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"stateMutability":"nonpayable","type":"function","name":"grantRole"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"stateMutability":"view","type":"function","name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}]},{"inputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function","name":"misbehaviour"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"callerConfirmation","type":"address"}],"stateMutability":"nonpayable","type":"function","name":"renounceRole"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"stateMutability":"nonpayable","type":"function","name":"revokeRole"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"stateMutability":"view","type":"function","name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}]},{"inputs":[{"internalType":"bytes","name":"updateMsg","type":"bytes"}],"stateMutability":"nonpayable","type":"function","name":"updateClient","outputs":[{"internalType":"enum ILightClientMsgs.UpdateResult","name":"","type":"uint8"}]},{"inputs":[{"internalType":"struct ILightClientMsgs.MsgVerifyMembership","name":"msg_","type":"tuple","components":[{"internalType":"bytes","name":"proof","type":"bytes"},{"internalType":"struct IICS02ClientMsgs.Height","name":"proofHeight","type":"tuple","components":[{"internalType":"uint64","name":"revisionNumber","type":"uint64"},{"internalType":"uint64","name":"revisionHeight","type":"uint64"}]},{"internalType":"bytes[]","name":"path","type":"bytes[]"},{"internalType":"bytes","name":"value","type":"bytes"}]}],"stateMutability":"view","type":"function","name":"verifyMembership","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[{"internalType":"struct ILightClientMsgs.MsgVerifyNonMembership","name":"msg_","type":"tuple","components":[{"internalType":"bytes","name":"proof","type":"bytes"},{"internalType":"struct IICS02ClientMsgs.Height","name":"proofHeight","type":"tuple","components":[{"internalType":"uint64","name":"revisionNumber","type":"uint64"},{"internalType":"uint64","name":"revisionHeight","type":"uint64"}]},{"internalType":"bytes[]","name":"path","type":"bytes[]"}]}],"stateMutability":"view","type":"function","name":"verifyNonMembership","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]}],"devdoc":{"kind":"dev","methods":{"constructor":{"params":{"ibcRouter":"Counterparty ICS26 router address whose storage is proven.","initialTrustedHeight":"Initial trusted Besu height.","initialTrustedStorageRoot":"Initial trusted storage root of `ibcRouter`.","initialTrustedTimestamp":"Initial trusted header timestamp in seconds.","initialTrustedValidators":"Initial trusted validator set.","maxClockDrift":"Maximum allowed future drift in seconds for submitted headers.","roleManager":"Address that administers proof submission; if zero, proof submission is open.","trustingPeriod":"Maximum age in seconds for trusted consensus states."}},"getClientState()":{"returns":{"_0":"The client state."}},"getConsensusState(uint64)":{"params":{"revisionHeight":"The revision height to query."},"returns":{"_0":"The ABI-encoded consensus state."}},"getRoleAdmin(bytes32)":{"details":"Returns the admin role that controls `role`. See {grantRole} and {revokeRole}. To change a role's admin, use {_setRoleAdmin}."},"grantRole(bytes32,address)":{"details":"Grants `role` to `account`. If `account` had not been already granted `role`, emits a {RoleGranted} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleGranted} event."},"hasRole(bytes32,address)":{"details":"Returns `true` if `account` has been granted `role`."},"misbehaviour(bytes)":{"params":{"misbehaviourMsg":"The misbehaviour message"}},"renounceRole(bytes32,address)":{"details":"Revokes `role` from the calling account. Roles are often managed via {grantRole} and {revokeRole}: this function's purpose is to provide a mechanism for accounts to lose their privileges if they are compromised (such as when a trusted device is misplaced). If the calling account had been revoked `role`, emits a {RoleRevoked} event. Requirements: - the caller must be `callerConfirmation`. May emit a {RoleRevoked} event."},"revokeRole(bytes32,address)":{"details":"Revokes `role` from `account`. If `account` had been granted `role`, emits a {RoleRevoked} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleRevoked} event."},"supportsInterface(bytes4)":{"details":"Returns true if this contract implements the interface defined by `interfaceId`. See the corresponding https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[ERC section] to learn more about how these ids are created. This function call must use less than 30 000 gas."},"updateClient(bytes)":{"params":{"updateMsg":"The encoded update message e.g., an SP1 proof."},"returns":{"_0":"The result of the update operation"}},"verifyMembership((bytes,(uint64,uint64),bytes[],bytes))":{"details":"Notice that this message is not view, as it may update the client state for caching purposes.","params":{"msg_":"The membership message"},"returns":{"_0":"The unix timestamp of the verification height in the counterparty chain in seconds."}},"verifyNonMembership((bytes,(uint64,uint64),bytes[]))":{"details":"Notice that this message is not view, as it may update the client state for caching purposes.","params":{"msg_":"The membership message"},"returns":{"_0":"The unix timestamp of the verification height in the counterparty chain in seconds."}}},"version":1},"userdoc":{"kind":"user","methods":{"PROOF_SUBMITTER_ROLE()":{"notice":"Role allowed to submit client updates and proof verifications."},"constructor":{"notice":"Creates a Besu QBFT light client from an initial trusted consensus state."},"getClientState()":{"notice":"Returns the client state."},"getConsensusState(uint64)":{"notice":"Returns the encoded consensus state for a revision height."},"misbehaviour(bytes)":{"notice":"Misbehaviour handling, moves the light client to the frozen state if misbehaviour is detected"},"updateClient(bytes)":{"notice":"Updating the client and consensus state"},"verifyMembership((bytes,(uint64,uint64),bytes[],bytes))":{"notice":"Querying the membership of a key-value pair"},"verifyNonMembership((bytes,(uint64,uint64),bytes[]))":{"notice":"Querying the non-membership of a key"}},"version":1}},"settings":{"remappings":["@openzeppelin-contracts/=node_modules/@openzeppelin/contracts/","@openzeppelin-upgradeable/=node_modules/@openzeppelin/contracts-upgradeable/","@openzeppelin/=node_modules/@openzeppelin/","@sp1-contracts/=node_modules/sp1-contracts/contracts/src/","@uniswap/permit2/=node_modules/@uniswap/permit2/","forge-std/=node_modules/forge-std/src/","sp1-contracts/=node_modules/sp1-contracts/"],"optimizer":{"enabled":true,"runs":10000},"metadata":{"bytecodeHash":"none"},"compilationTarget":{"contracts/light-clients/besu/BesuQBFTLightClient.sol":"BesuQBFTLightClient"},"evmVersion":"cancun","libraries":{},"viaIR":true},"sources":{"contracts/interfaces/ILightClient.sol":{"keccak256":"0x3b2361546ee834a442d844c979fbad3458ee13146b093f585587a09e19a266af","urls":["bzz-raw://5b5d53101bb598f14a79cb1092479736fa18e8f84945ea6ef80f4dac84466042","dweb:/ipfs/QmaTCo6M3Z9aYCSX65AQtixo1sB4ymQUDAgTXSKHqJHGDh"],"license":"Apache-2.0"},"contracts/light-clients/besu/BesuLightClientBase.sol":{"keccak256":"0xd700a74d5dd85a4dc0432f9fda2e787d78670647417e54416a07af85bb42194a","urls":["bzz-raw://92069fbd0993510316fb3e9eba5dde45316cc6d3fd979c75b3485253709caa88","dweb:/ipfs/QmeuXFNzqe5JYwkZwLBA7LSni4LuQAWgy7t7jbfHXAKNtz"],"license":"MIT"},"contracts/light-clients/besu/BesuQBFTLightClient.sol":{"keccak256":"0x7fcf75573578ef5c30dfbab335b7a4a400b35f1ad0259bc2bf712d12ffc10ddc","urls":["bzz-raw://623f65bad2a1caaf28e1ecb52f42a73e78d0a04cf7bf88edceea5f225d8cf24b","dweb:/ipfs/QmS6fPmaTh9MmAXQUdYFLjxph5tPynmZ5DmLo2juTa3Qq6"],"license":"MIT"},"contracts/light-clients/besu/MPTProof.sol":{"keccak256":"0xe79077eef64b0a5901e83174bb0643dd71887d3d1b75a230e3c6d98230fe61a1","urls":["bzz-raw://f828f699316e27a9449c4da03471f8a228c2919e93a5575dd331dfd7278de61b","dweb:/ipfs/QmNzjoyYNyuFqn7tS7HteYhyTKS77iy7QhBwMc1rDDJcPY"],"license":"Apache-2.0"},"contracts/light-clients/besu/RLPReader.sol":{"keccak256":"0xa64ad17e6da7fed2bd206df52189286694339a8061dc5d158e717eda982af1d9","urls":["bzz-raw://7020db2fe854e90e1b791e0e587610fc26bed3073ba1811faa275a1d8bf3c2c7","dweb:/ipfs/QmdXdKghNFZSX7N9qD6BsKuJQdrFoqatsVWvHRL7vJCmeP"],"license":"Apache-2.0"},"contracts/light-clients/besu/errors/IBesuLightClientErrors.sol":{"keccak256":"0x1124e58e906cd3dddf876757393a4e4812170e4ae41da99a1d0b734266ae021b","urls":["bzz-raw://54d7d62a6ef3af5d32eb3c293499f90223a0f349b1475b3dad6af443106041d4","dweb:/ipfs/QmdSJQup9PvvB3hpnWZu3YE2Rh5kTcAs9zGBHsMyAdCKCX"],"license":"MIT"},"contracts/light-clients/besu/msgs/IBesuLightClientMsgs.sol":{"keccak256":"0x3a903fd7635a040041b94f4e33dc2881c8992bd22acb14cce72aeab074b820be","urls":["bzz-raw://25d72c46f4bf1b6335f1c62c8d55f3e3643a41f75ffba160cb137bed57d7854c","dweb:/ipfs/QmepY12FQmcMned3fbMt1K3mfELZwq9uiMKxS41yLDAxV3"],"license":"MIT"},"contracts/msgs/IICS02ClientMsgs.sol":{"keccak256":"0x03d1265eae327c3744d774bf22a30d845233d50664921c9aa57cef2d71fd89d2","urls":["bzz-raw://89900781cc5c60540a237d92d42745ea6165765ee8fb4d50e8137a717195cc75","dweb:/ipfs/Qmbx5p8gZ8sEMMeZytXsLee49JUayhAaoJ2yxX93WUrvQo"],"license":"Apache-2.0"},"contracts/msgs/ILightClientMsgs.sol":{"keccak256":"0x8d1e56ab166a7b4aa6999708e3214a4645ebbc3835c2b2a4c255c9923eebafde","urls":["bzz-raw://8bd4200dc04d950c0f050623fa9a8accdbec877fd446c039d4dd6c678bdf1513","dweb:/ipfs/QmZQTViaA7N6BVNDzJ1Z6w799PrPoE4ajPueZSPwX4sGZ9"],"license":"Apache-2.0"},"node_modules/@openzeppelin/contracts/access/AccessControl.sol":{"keccak256":"0x4686ec784d75f95beaf2bf5b5f26e5f946d4c864aaee9c3c62bdc18381f5e017","urls":["bzz-raw://26710ca191913f3c9df542079c4a6dcff02968e92d4f7357daefef9fbe72a19c","dweb:/ipfs/QmanHbeWuBbVEqXySHa1zhm2rExjYpChDBubBaJNTCa2JB"],"license":"MIT"},"node_modules/@openzeppelin/contracts/access/IAccessControl.sol":{"keccak256":"0xbff9f59c84e5337689161ce7641c0ef8e872d6a7536fbc1f5133f128887aba3c","urls":["bzz-raw://b308f882e796f7b79c9502deacb0a62983035c6f6f4e962b319ba6a1f4a77d3d","dweb:/ipfs/QmaWCW7ahEQqFjwhSUhV7Ae7WhfNvzSpE7DQ58hvEooqPL"],"license":"MIT"},"node_modules/@openzeppelin/contracts/utils/Context.sol":{"keccak256":"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2","urls":["bzz-raw://6a708e8a5bdb1011c2c381c9a5cfd8a9a956d7d0a9dc1bd8bcdaf52f76ef2f12","dweb:/ipfs/Qmax9WHBnVsZP46ZxEMNRQpLQnrdE4dK8LehML1Py8FowF"],"license":"MIT"},"node_modules/@openzeppelin/contracts/utils/cryptography/ECDSA.sol":{"keccak256":"0xbeb5cad8aaabe0d35d2ec1a8414d91e81e5a8ca679add4cf57e2f33476861f40","urls":["bzz-raw://ebb272a5ee2da4e8bd5551334e0ce8dce4e9c56a04570d6bf046d260fab3116a","dweb:/ipfs/QmNw6RyM769qcqFocDq6HJMG2WiEnQbvizpRaUXsACHho2"],"license":"MIT"},"node_modules/@openzeppelin/contracts/utils/introspection/ERC165.sol":{"keccak256":"0x2d9dc2fe26180f74c11c13663647d38e259e45f95eb88f57b61d2160b0109d3e","urls":["bzz-raw://81233d1f98060113d9922180bb0f14f8335856fe9f339134b09335e9f678c377","dweb:/ipfs/QmWh6R35SarhAn4z2wH8SU456jJSYL2FgucfTFgbHJJN4E"],"license":"MIT"},"node_modules/@openzeppelin/contracts/utils/introspection/IERC165.sol":{"keccak256":"0x8891738ffe910f0cf2da09566928589bf5d63f4524dd734fd9cedbac3274dd5c","urls":["bzz-raw://971f954442df5c2ef5b5ebf1eb245d7105d9fbacc7386ee5c796df1d45b21617","dweb:/ipfs/QmadRjHbkicwqwwh61raUEapaVEtaLMcYbQZWs9gUkgj3u"],"license":"MIT"}},"version":1},"id":36} \ No newline at end of file +{"abi":[{"type":"constructor","inputs":[{"name":"ibcRouter","type":"address","internalType":"address"},{"name":"initialTrustedHeight","type":"uint64","internalType":"uint64"},{"name":"initialTrustedTimestamp","type":"uint64","internalType":"uint64"},{"name":"initialTrustedStorageRoot","type":"bytes32","internalType":"bytes32"},{"name":"initialTrustedValidators","type":"address[]","internalType":"address[]"},{"name":"trustingPeriod","type":"uint64","internalType":"uint64"},{"name":"maxClockDrift","type":"uint64","internalType":"uint64"},{"name":"roleManager","type":"address","internalType":"address"}],"stateMutability":"nonpayable"},{"type":"function","name":"DEFAULT_ADMIN_ROLE","inputs":[],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"type":"function","name":"PROOF_SUBMITTER_ROLE","inputs":[],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"type":"function","name":"getClientState","inputs":[],"outputs":[{"name":"","type":"bytes","internalType":"bytes"}],"stateMutability":"view"},{"type":"function","name":"getConsensusState","inputs":[{"name":"revisionHeight","type":"uint64","internalType":"uint64"}],"outputs":[{"name":"","type":"bytes","internalType":"bytes"}],"stateMutability":"view"},{"type":"function","name":"getRoleAdmin","inputs":[{"name":"role","type":"bytes32","internalType":"bytes32"}],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"type":"function","name":"grantRole","inputs":[{"name":"role","type":"bytes32","internalType":"bytes32"},{"name":"account","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"hasRole","inputs":[{"name":"role","type":"bytes32","internalType":"bytes32"},{"name":"account","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"misbehaviour","inputs":[{"name":"","type":"bytes","internalType":"bytes"}],"outputs":[],"stateMutability":"view"},{"type":"function","name":"renounceRole","inputs":[{"name":"role","type":"bytes32","internalType":"bytes32"},{"name":"callerConfirmation","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"revokeRole","inputs":[{"name":"role","type":"bytes32","internalType":"bytes32"},{"name":"account","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"supportsInterface","inputs":[{"name":"interfaceId","type":"bytes4","internalType":"bytes4"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"updateClient","inputs":[{"name":"updateMsg","type":"bytes","internalType":"bytes"}],"outputs":[{"name":"","type":"uint8","internalType":"enum ILightClientMsgs.UpdateResult"}],"stateMutability":"nonpayable"},{"type":"function","name":"verifyMembership","inputs":[{"name":"msg_","type":"tuple","internalType":"struct ILightClientMsgs.MsgVerifyMembership","components":[{"name":"proof","type":"bytes","internalType":"bytes"},{"name":"proofHeight","type":"tuple","internalType":"struct IICS02ClientMsgs.Height","components":[{"name":"revisionNumber","type":"uint64","internalType":"uint64"},{"name":"revisionHeight","type":"uint64","internalType":"uint64"}]},{"name":"path","type":"bytes[]","internalType":"bytes[]"},{"name":"value","type":"bytes","internalType":"bytes"}]}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"verifyNonMembership","inputs":[{"name":"msg_","type":"tuple","internalType":"struct ILightClientMsgs.MsgVerifyNonMembership","components":[{"name":"proof","type":"bytes","internalType":"bytes"},{"name":"proofHeight","type":"tuple","internalType":"struct IICS02ClientMsgs.Height","components":[{"name":"revisionNumber","type":"uint64","internalType":"uint64"},{"name":"revisionHeight","type":"uint64","internalType":"uint64"}]},{"name":"path","type":"bytes[]","internalType":"bytes[]"}]}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"event","name":"RoleAdminChanged","inputs":[{"name":"role","type":"bytes32","indexed":true,"internalType":"bytes32"},{"name":"previousAdminRole","type":"bytes32","indexed":true,"internalType":"bytes32"},{"name":"newAdminRole","type":"bytes32","indexed":true,"internalType":"bytes32"}],"anonymous":false},{"type":"event","name":"RoleGranted","inputs":[{"name":"role","type":"bytes32","indexed":true,"internalType":"bytes32"},{"name":"account","type":"address","indexed":true,"internalType":"address"},{"name":"sender","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"type":"event","name":"RoleRevoked","inputs":[{"name":"role","type":"bytes32","indexed":true,"internalType":"bytes32"},{"name":"account","type":"address","indexed":true,"internalType":"address"},{"name":"sender","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"type":"error","name":"AccessControlBadConfirmation","inputs":[]},{"type":"error","name":"AccessControlUnauthorizedAccount","inputs":[{"name":"account","type":"address","internalType":"address"},{"name":"neededRole","type":"bytes32","internalType":"bytes32"}]},{"type":"error","name":"ConflictingConsensusState","inputs":[{"name":"revisionHeight","type":"uint64","internalType":"uint64"}]},{"type":"error","name":"ConsensusStateExpired","inputs":[{"name":"trustedTimestamp","type":"uint64","internalType":"uint64"},{"name":"currentTimestamp","type":"uint256","internalType":"uint256"},{"name":"trustingPeriod","type":"uint64","internalType":"uint64"}]},{"type":"error","name":"ConsensusStateNotFound","inputs":[{"name":"revisionHeight","type":"uint64","internalType":"uint64"}]},{"type":"error","name":"DuplicateCommitSealSigner","inputs":[{"name":"signer","type":"address","internalType":"address"}]},{"type":"error","name":"DuplicateValidator","inputs":[{"name":"validator","type":"address","internalType":"address"}]},{"type":"error","name":"EmptyValidatorSet","inputs":[]},{"type":"error","name":"HeaderFromFuture","inputs":[{"name":"currentTimestamp","type":"uint256","internalType":"uint256"},{"name":"headerTimestamp","type":"uint256","internalType":"uint256"},{"name":"maxClockDrift","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"InsufficientTrustedValidatorOverlap","inputs":[{"name":"actual","type":"uint256","internalType":"uint256"},{"name":"required","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"InsufficientValidatorQuorum","inputs":[{"name":"actual","type":"uint256","internalType":"uint256"},{"name":"required","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"InvalidCommitSeal","inputs":[]},{"type":"error","name":"InvalidCommitmentValue","inputs":[{"name":"expectedValue","type":"bytes32","internalType":"bytes32"},{"name":"actualValue","type":"bytes32","internalType":"bytes32"}]},{"type":"error","name":"InvalidDifficulty","inputs":[{"name":"actualDifficulty","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"InvalidECDSASignatureLength","inputs":[{"name":"length","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"InvalidExtraDataFormat","inputs":[{"name":"itemsLength","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"InvalidHeaderFormat","inputs":[{"name":"itemsLength","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"InvalidHeaderHeight","inputs":[]},{"type":"error","name":"InvalidMixHash","inputs":[{"name":"actualMixHash","type":"bytes32","internalType":"bytes32"}]},{"type":"error","name":"InvalidNonce","inputs":[{"name":"actualNonce","type":"bytes","internalType":"bytes"}]},{"type":"error","name":"InvalidOmmersHash","inputs":[{"name":"actualOmmersHash","type":"bytes32","internalType":"bytes32"}]},{"type":"error","name":"InvalidPathLength","inputs":[{"name":"expectedLength","type":"uint256","internalType":"uint256"},{"name":"actualLength","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"InvalidRevisionNumber","inputs":[{"name":"providedRevisionNumber","type":"uint64","internalType":"uint64"}]},{"type":"error","name":"InvalidValidatorAddress","inputs":[{"name":"validator","type":"address","internalType":"address"}]},{"type":"error","name":"InvalidValidatorAddressLength","inputs":[{"name":"length","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"InvalidValueLength","inputs":[{"name":"expectedLength","type":"uint256","internalType":"uint256"},{"name":"actualLength","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"UnsupportedMisbehaviour","inputs":[]},{"type":"error","name":"ValueExists","inputs":[{"name":"actualValue","type":"bytes32","internalType":"bytes32"}]}],"bytecode":{"object":"0x6080604052346103c05761394680380380610019816103c4565b928339810190610100818303126103c057610033816103e9565b61003f602083016103fd565b9061004c604084016103fd565b60608401516080850151909291906001600160401b0381116103c05785019286601f850112156103c0578351966001600160401b038811610376578760051b9460206100998188016103c4565b809a81520190602082978201019283116103c057602001905b8282106103a8575050506100c860a087016103fd565b956100e160e06100da60c084016103fd565b92016103e9565b956001600160401b03169081156103995788511561038a575f5b89518110156101b1576001600160a01b03610116828c610411565b51161561018a575f5b81811061012f57506001016100fb565b6001600160a01b03610141828d610411565b51166001600160a01b03610155848e610411565b5116146101645760010161011f565b6001600160a01b03610176838d610411565b511663107f863360e21b5f5260045260245ffd5b6001600160a01b039061019d908b610411565b51166359bff38760e01b5f5260045260245ffd5b5060408051979896978a979181016001600160401b03811182821017610376576040525f81526020810190848252604051926080840198848a1060018060401b038b1117610376576040998a526001600160a01b031680855260208086018490526001600160401b03928316868c01819052878416606090970196909652600180546001600160a01b031916909217825592516002805495516001600160801b031996871692851692909217918c1b6fffffffffffffffff000000000000000090811692909217815560038054909616909617968b1b16959095179092555f948552600490529590922080546001600160401b03191694861694909417845583019190915592519392019190831161037657680100000000000000008311610376578154838355808410610350575b50905f5260205f205f5b83811061033357846001600160a01b03811661031a575061030961052f565b505b6040516132f490816105b28239f35b8061032761032d92610439565b506104af565b5061030b565b82516001600160a01b0316818301556020909201916001016102ea565b825f528360205f2091820191015b81811061036b57506102e0565b5f815560010161035e565b634e487b7160e01b5f52604160045260245ffd5b63339e1ffb60e01b5f5260045ffd5b6359d119e360e01b5f5260045ffd5b602080916103b5846103e9565b8152019101906100b2565b5f80fd5b6040519190601f01601f191682016001600160401b0381118382101761037657604052565b51906001600160a01b03821682036103c057565b51906001600160401b03821682036103c057565b80518210156104255760209160051b010190565b634e487b7160e01b5f52603260045260245ffd5b6001600160a01b0381165f9081525f5160206139265f395f51905f52602052604090205460ff166104aa576001600160a01b03165f8181525f5160206139265f395f51905f5260205260408120805460ff191660011790553391905f5160206138a65f395f51905f528180a4600190565b505f90565b6001600160a01b0381165f9081525f5160206138c65f395f51905f52602052604090205460ff166104aa576001600160a01b03165f8181525f5160206138c65f395f51905f5260205260408120805460ff191660011790553391905f5160206139065f395f51905f52905f5160206138a65f395f51905f529080a4600190565b5f80525f5160206138c65f395f51905f526020525f5160206138e65f395f51905f525460ff166105ad575f8080525f5160206138c65f395f51905f526020525f5160206138e65f395f51905f52805460ff1916600117905533905f5160206139065f395f51905f525f5160206138a65f395f51905f528280a4600190565b5f9056fe60806040526004361015610011575f80fd5b5f3560e01c806301ffc9a7146100f45780630bece356146100ef578063248a9ca3146100ea5780632f2ff15d146100e557806336568abe146100e05780634d6d9ffb146100db5780635972185a146100d6578063682ed5f0146100d157806391d14854146100cc578063a217fddf146100c7578063d547741f146100c2578063ddba6537146100bd578063edce8bdc146100b85763ef913a4b146100b3575f80fd5b610a16565b61095e565b61088b565b61085c565b610842565b6107f4565b6105e6565b6105ac565b6103ac565b610350565b61031a565b6102b5565b610217565b34610195576020600319360112610195576004357fffffffff00000000000000000000000000000000000000000000000000000000811680910361019557807f7965db0b000000000000000000000000000000000000000000000000000000006020921490811561016b575b506040519015158152f35b7f01ffc9a7000000000000000000000000000000000000000000000000000000009150145f610160565b5f80fd5b9060206003198301126101955760043567ffffffffffffffff811161019557826023820112156101955780600401359267ffffffffffffffff84116101955760248483010111610195576024019190565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b346101955761028161022836610199565b5f80527f4c48d1d2b0f4f7485fc28e3db22341d96a20aa29e6efa8149da9751603abd4e06020527f6e0c24a6e293ff9b755263dbaa15ba3796b0b8d3fe17cfb4ddf8143b268eac475490919060ff161561029957610d9d565b6040516003821015610294576020918152f35b6101ea565b6102a1611287565b610d9d565b90816020910312610195573590565b346101955760206003193601126101955760206102df6004355f525f602052600160405f20015490565b604051908152f35b6003196040910112610195576004359060243573ffffffffffffffffffffffffffffffffffffffff811681036101955790565b346101955761034e61032b366102e7565b90610349610344825f525f602052600160405f20015490565b61130f565b61221d565b005b346101955761035e366102e7565b3373ffffffffffffffffffffffffffffffffffffffff8216036103845761034e916122f4565b7f6697b232000000000000000000000000000000000000000000000000000000005f5260045ffd5b346101955760206003193601126101955760043567ffffffffffffffff8111610195578060040160806003198336030112610195575f80527f4c48d1d2b0f4f7485fc28e3db22341d96a20aa29e6efa8149da9751603abd4e060205260ff7f6e0c24a6e293ff9b755263dbaa15ba3796b0b8d3fe17cfb4ddf8143b268eac4754161561059f575b61044761044260248401611192565b61137c565b60648201916001610458848461119c565b90500361056157906104a96104966104a261049d61049661049061048961048460446104e09a01611192565b611b30565b988761119c565b9061126e565b3691610b4d565b6123c9565b928061121d565b906001840154906040516104d7816104c960208201948560209181520190565b03601f198101835282610afd565b51902091612457565b805161051f5761051b61050b6104fe845467ffffffffffffffff1690565b67ffffffffffffffff1690565b6040519081529081906020820190565b0390f35b61053361052e61055e9261259c565b6125c9565b7fd039601e000000000000000000000000000000000000000000000000000000005f52600452602490565b5ffd5b61055e61056e848461119c565b7f88b3170e000000000000000000000000000000000000000000000000000000005f52600160045260245250604490565b6105a7611287565b610433565b34610195575f6003193601126101955760206040517fbd893629a699470e4ec82a5715bb4981fdaacc5d0a728bf5f55b801d8f4ef10b8152f35b346101955760206003193601126101955760043567ffffffffffffffff8111610195578060040160a06003198336030112610195575f80527f4c48d1d2b0f4f7485fc28e3db22341d96a20aa29e6efa8149da9751603abd4e060205260ff7f6e0c24a6e293ff9b755263dbaa15ba3796b0b8d3fe17cfb4ddf8143b268eac475416156107e7575b61067c61044260248401611192565b6064820191600161068d848461119c565b90500361056157608481019060206106a5838561121d565b9050036107a957906106f46104966106ed6106e56106de61049d6104966104906106d761048460446107149c01611192565b9b8b61119c565b948761121d565b8101906102a6565b948061121d565b906001850154906040516104d7816104c960208201948560209181520190565b8051156107755761052e6107279161259c565b908082036107475761051b61050b6104fe855467ffffffffffffffff1690565b7f56ed1b63000000000000000000000000000000000000000000000000000000005f5260045260245260445ffd5b61055e827f56ed1b63000000000000000000000000000000000000000000000000000000005f52906044916004525f602452565b61055e6107b6838561121d565b7f24fadac8000000000000000000000000000000000000000000000000000000005f52602060045260245250604490565b6107ef611287565b61066d565b3461019557602060ff610836610809366102e7565b905f525f845260405f209073ffffffffffffffffffffffffffffffffffffffff165f5260205260405f2090565b54166040519015158152f35b34610195575f6003193601126101955760206040515f8152f35b346101955761034e61086d366102e7565b90610886610344825f525f602052600160405f20015490565b6122f4565b346101955761089936610199565b50505f80527f4c48d1d2b0f4f7485fc28e3db22341d96a20aa29e6efa8149da9751603abd4e06020527f6e0c24a6e293ff9b755263dbaa15ba3796b0b8d3fe17cfb4ddf8143b268eac475460ff1615610915575b7f2c1ed462000000000000000000000000000000000000000000000000000000005f5260045ffd5b61091d611287565b6108ed565b67ffffffffffffffff81160361019557565b601f19601f602060409481855280519182918282880152018686015e5f8582860101520116010190565b346101955760206003193601126101955761097e60043561048481610922565b67ffffffffffffffff8154166002600183015492019060405192608084019160208501526040840152606080840152815480915260a08301915f5260205f20905f5b8181106109ea5761051b856109de818703601f198101835282610afd565b60405191829182610934565b825473ffffffffffffffffffffffffffffffffffffffff168452602090930192600192830192016109c0565b34610195575f6003193601126101955761051b60405173ffffffffffffffffffffffffffffffffffffffff60015416602082015267ffffffffffffffff600254818116604084015260401c16606082015267ffffffffffffffff600354818116608084015260401c1660a082015260a081526109de60c082610afd565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b6060810190811067ffffffffffffffff821117610adc57604052565b610a93565b6040810190811067ffffffffffffffff821117610adc57604052565b90601f601f19910116810190811067ffffffffffffffff821117610adc57604052565b60405190610b2f604083610afd565b565b67ffffffffffffffff8111610adc57601f01601f191660200190565b929192610b5982610b31565b91610b676040519384610afd565b829481845281830111610195578281602093845f960137010152565b9080601f8301121561019557816020610b9e93359101610b4d565b90565b6020818303126101955780359067ffffffffffffffff8211610195570180820391608083126101955760405192610bd784610ac0565b823567ffffffffffffffff811161019557604091610bfa84601f19938701610b83565b8652011261019557604051610c0e81610ae1565b6020830135610c1c81610922565b81526040830135610c2c81610922565b60208201526020840152606082013567ffffffffffffffff811161019557610c549201610b83565b604082015290565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b9060018201809211610c9757565b610c5c565b60c001908160c011610c9757565b60f701908160f711610c9757565b6080019081608011610c9757565b60b701908160b711610c9757565b91908201809211610c9757565b908160011b9180830460021490151715610c9757565b81519167ffffffffffffffff8311610adc57680100000000000000008311610adc578154838355808410610d77575b506020610d389101915f5260205f2090565b5f5b838110610d475750505050565b6001906020610d6a855173ffffffffffffffffffffffffffffffffffffffff1690565b9401938184015501610d3a565b825f528360205f2091820191015b818110610d925750610d26565b5f8155600101610d85565b610da991810190610ba1565b9060208201610dc461044282515167ffffffffffffffff1690565b610dce8351611614565b92606084019367ffffffffffffffff610def865167ffffffffffffffff1690565b161561116a5760035491604083901c67ffffffffffffffff1693610e1d67ffffffffffffffff861642610cd4565b9460a0840195610e35875167ffffffffffffffff1690565b9067ffffffffffffffff82161161112b5750505160200151610e7290610e649067ffffffffffffffff16611b30565b9367ffffffffffffffff1690565b67ffffffffffffffff81168015159081611102575b506110ad575090610ef591610eb66002610eae610ea385611bc2565b60e086015190611cf8565b950185611f11565b610ec660c0830194855190612036565b60406080610ee960015473ffffffffffffffffffffffffffffffffffffffff1690565b930151910151916120d9565b610f22610f0a865167ffffffffffffffff1690565b67ffffffffffffffff165f52600460205260405f2090565b610f376104fe825467ffffffffffffffff1690565b61103b5750916002610fb5928694610fa8610f73610f64610f0a610fc39a9b5167ffffffffffffffff1690565b955167ffffffffffffffff1690565b859067ffffffffffffffff167fffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000825416179055565b6001840155519101610cf7565b5167ffffffffffffffff1690565b600254610fdc9060401c67ffffffffffffffff166104fe565b67ffffffffffffffff821611610ff157505f90565b611037907fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff6fffffffffffffffff00000000000000006002549260401b16911617600255565b5f90565b91611051611059945167ffffffffffffffff1690565b90519261214f565b6110a75761055e611072835167ffffffffffffffff1690565b7fc1aea5f7000000000000000000000000000000000000000000000000000000005f5267ffffffffffffffff16600452602490565b60029150565b61055e906110c3855467ffffffffffffffff1690565b7feae35725000000000000000000000000000000000000000000000000000000005f5267ffffffffffffffff9081166004524260245216604452606490565b9050611123429161111e6104fe885467ffffffffffffffff1690565b610cd4565b11155f610e87565b7f9b772277000000000000000000000000000000000000000000000000000000005f524260045267ffffffffffffffff9081166024521660445260645ffd5b7f59d119e3000000000000000000000000000000000000000000000000000000005f5260045ffd5b35610b9e81610922565b9035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe181360301821215610195570180359067ffffffffffffffff821161019557602001918160051b3603831361019557565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b9035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe181360301821215610195570180359067ffffffffffffffff82116101955760200191813603831361019557565b9015611282578061127e9161121d565b9091565b6111f0565b335f9081527f4c48d1d2b0f4f7485fc28e3db22341d96a20aa29e6efa8149da9751603abd4e0602052604090205460ff16156112bf57565b7fe2517d3f000000000000000000000000000000000000000000000000000000005f52336004527fbd893629a699470e4ec82a5715bb4981fdaacc5d0a728bf5f55b801d8f4ef10b60245260445ffd5b805f525f60205260ff6113433360405f209073ffffffffffffffffffffffffffffffffffffffff165f5260205260405f2090565b54161561134d5750565b7fe2517d3f000000000000000000000000000000000000000000000000000000005f523360045260245260445ffd5b67ffffffffffffffff168061138e5750565b7f3ce598a9000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b60405190610100820182811067ffffffffffffffff821117610adc57604052606060e0838281528260208201528260408201525f838201525f60808201525f60a08201528260c08201520152565b8051600110156112825760400190565b805160071015611282576101000190565b8051600d1015611282576101c00190565b8051600e1015611282576101e00190565b805160081015611282576101200190565b8051600310156112825760800190565b8051600b1015611282576101800190565b8051600c1015611282576101a00190565b8051600410156112825760a00190565b8051156112825760200190565b8051600210156112825760600190565b805160101015611282576102200190565b80518210156112825760209160051b010190565b67ffffffffffffffff8111610adc5760051b60200190565b90611501826114df565b61150e6040519182610afd565b828152601f1961151e82946114df565b0190602036910137565b90602082519201517fffffffffffffffffffffffffffffffffffffffff00000000000000000000000081169260148110611560575050565b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000929350829060140360031b1b161690565b60405160c091906115a38382610afd565b6005815291601f1901825f5b8281106115bb57505050565b8060606020809385010152016115af565b906115d6826114df565b6115e36040519182610afd565b828152601f196115f382946114df565b01905f5b82811061160357505050565b8060606020809385010152016115f7565b61163061162b6116226113b9565b9280845261259c565b61260b565b602082019080825251600f8110611b0557507f1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d493476116766116708351611407565b516126d6565b03611aca57600161169061168a8351611417565b516125c9565b03611a8f577f63746963616c2062797a616e74696e65206661756c7420746f6c6572616e63656116c36116708351611428565b03611a54576116db6116d58251611439565b516126f2565b80516008811490811591611a24575b506119ea575061162b61175d6116d5836117216117106104fe61168a611762985161144a565b67ffffffffffffffff166060880152565b61172e611670825161145b565b60808701526117576117466104fe61168a845161146b565b67ffffffffffffffff1660a0880152565b5161147c565b61259c565b90604081019180835251600581036119bf57506117886117828351611407565b5161260b565b908151156119975761179a82516114f7565b9360c082019485525f5b8351811015611933576117ba6116d582866114cb565b80516014810361190857506117d16117d791611528565b60601c90565b73ffffffffffffffffffffffffffffffffffffffff811680156118c6575f5b8381106118325750509061182c600192611811838a516114cb565b9073ffffffffffffffffffffffffffffffffffffffff169052565b016117a4565b8161187761185e611844848d516114cb565b5173ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff1690565b14611884576001016117f6565b7f41fe18cc000000000000000000000000000000000000000000000000000000005f5273ffffffffffffffffffffffffffffffffffffffff831660045260245ffd5b7f59bff387000000000000000000000000000000000000000000000000000000005f5273ffffffffffffffffffffffffffffffffffffffff821660045260245ffd5b7f83e46ad2000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b509261178291945061194692505161148d565b61195081516115cc565b9260e081019384525f5b8251811015611991578061198a816119776116d5600195886114cb565b88519061198483836114cb565b526114cb565b500161195a565b50925050565b7f339e1ffb000000000000000000000000000000000000000000000000000000005f5260045ffd5b7f30c6792a000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b611a20906040519182917fd5edd2a500000000000000000000000000000000000000000000000000000000835260048301610934565b0390fd5b7f011b4d03dd8c01f1049143cf9c4c817e4b167f1d1b83e5c6f0f10d89ba1e7bce9150602083012014155f6116ea565b611a6461167061055e9251611428565b7fa19e609c000000000000000000000000000000000000000000000000000000005f52600452602490565b611a9f61168a61055e9251611417565b7ff71b722f000000000000000000000000000000000000000000000000000000005f52600452602490565b611ada61167061055e9251611407565b7fb8120dca000000000000000000000000000000000000000000000000000000005f52600452602490565b7fbc277732000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b67ffffffffffffffff1690815f52600460205260405f209167ffffffffffffffff83541615611b5c5750565b7ff761631b000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b60405190611b96604083610afd565b600182527fc0000000000000000000000000000000000000000000000000000000000000006020830152565b6020611c7d611bcf611592565b611c48611be660408601611bec611be6825161149d565b51612ff9565b611bf58561149d565b52611bff8461149d565b50611c0d611be68251611407565b611c1685611407565b52611c2084611407565b50611c2e611be682516114aa565b611c37856114aa565b52611c41846114aa565b505161145b565b611c518261145b565b52611c5b8161145b565b50611c64611b87565b611c6d8261148d565b52611c778161148d565b506127c8565b910190611c8b8251516115cc565b905f5b83518051821015611ce1579080600192600c82145f14611ccf575050611cb383612880565b611cbd82866114cb565b52611cc881856114cb565b5001611c8e565b611cdc91611be6916114cb565b611cb3565b505050611cee91506127c8565b6020815191012090565b919091611d0583516114f7565b925f5b8151811015611efe57611d1b81836114cb565b51805160418103611ed3575080601b60ff611d6a611d64611d3e611d779661285f565b517fff000000000000000000000000000000000000000000000000000000000000001690565b60f81c90565b1610611e80575b846130a7565b90611d81816128fa565b1590811591611e76575b508015611e58575b611e305773ffffffffffffffffffffffffffffffffffffffff81165f5b838110611dd057505090611dca60019261181183896114cb565b01611d08565b81611de161185e611844848c6114cb565b14611dee57600101611db0565b7f33af0d5f000000000000000000000000000000000000000000000000000000005f5273ffffffffffffffffffffffffffffffffffffffff831660045260245ffd5b7f09cb44e6000000000000000000000000000000000000000000000000000000005f5260045ffd5b5073ffffffffffffffffffffffffffffffffffffffff811615611d93565b905015155f611d8b565b611ec2611e9a611e95611d64611d3e8561285f565b6128e8565b60f81b7fff000000000000000000000000000000000000000000000000000000000000001690565b5f1a611ecd8261285f565b53611d71565b7ff2db9ce1000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b505050565b5f198114610c975760010190565b905f915f5b8151811015611f6a57611f4973ffffffffffffffffffffffffffffffffffffffff611f4183856114cb565b511684612904565b611f56575b600101611f16565b92611f62600191611f03565b939050611f4e565b50506003611f79915404610c89565b90818110611f85575050565b7fe2dcb1b9000000000000000000000000000000000000000000000000000000005f5260045260245260445ffd5b905f198201918211610c9757565b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff408201918211610c9757565b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff808201918211610c9757565b6020039060208211610c9757565b91908203918211610c9757565b905f915f5b815181101561208f5761206e73ffffffffffffffffffffffffffffffffffffffff61206683856114cb565b51168461295b565b61207b575b60010161203b565b92612087600191611f03565b939050612073565b50505190600382048203918211610c97578181106120ab575050565b7f7818f4e4000000000000000000000000000000000000000000000000000000005f5260045260245260445ffd5b6121239261162b9261175d926040517fffffffffffffffffffffffffffffffffffffffff000000000000000000000000602082019260601b168252601481526104d7603482610afd565b805160021015611282576060610b9e9101516126d6565b8054821015611282575f5260205f2001905f90565b919067ffffffffffffffff8061216d855467ffffffffffffffff1690565b92169116149081159161220e575b5061220857600201908154815103612208575f5b8151811015612200576121c56121a5828561213a565b905473ffffffffffffffffffffffffffffffffffffffff9160031b1c1690565b73ffffffffffffffffffffffffffffffffffffffff6121ea61185e61184485876114cb565b9116036121f95760010161218f565b5050505f90565b505050600190565b50505f90565b9050600182015414155f61217b565b805f525f60205260ff6122518360405f209073ffffffffffffffffffffffffffffffffffffffff165f5260205260405f2090565b541661220857805f525f6020526122898260405f209073ffffffffffffffffffffffffffffffffffffffff165f5260205260405f2090565b60017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0082541617905573ffffffffffffffffffffffffffffffffffffffff339216907f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d5f80a4600190565b805f525f60205260ff6123288360405f209073ffffffffffffffffffffffffffffffffffffffff165f5260205260405f2090565b54161561220857805f525f6020526123618260405f209073ffffffffffffffffffffffffffffffffffffffff165f5260205260405f2090565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00815416905573ffffffffffffffffffffffffffffffffffffffff339216907ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b5f80a4600190565b60208151910120604051602081019182527f1260944489272988d9df285149b5aa1b0f48f2136d6f416159f840a3e074760060408201526040815261240f606082610afd565b51902090565b60405190612424602083610afd565b5f808352366020840137565b9061243a82610b31565b6124476040519182610afd565b828152601f1961151e8294610b31565b61162b6124999194939461246b6020610b31565b956124796040519788610afd565b602087526124876020610b31565b601f196020890191013682375261259c565b906124a48451610ce1565b91845115158061257c575b6124b8906125c2565b6124ca6124c55f85612029565b612430565b925f19015f5b8181106124e4575050610b9e939450612acf565b80612566600f612529612560611d64611d3e8d61250360029960011c90565b908d61255a8a6125528a612529612520611d64611d3e8a8a61286f565b60041c600f1690565b1660f81b7fff000000000000000000000000000000000000000000000000000000000000001690565b5f1a9261286f565b5361286f565b60ff1690565b5f1a612575600183018861286f565b53016124d0565b5060016124af565b6040519061259182610ae1565b5f6020838281520152565b6125a4612584565b506020815191604051926125b784610ae1565b835201602082015290565b1561019557565b805180151590816125ff575b5015610195576125e490612da5565b905190602081106125f3575090565b6020036101000a900490565b6021915011155f6125d5565b61261481612dd1565b156101955761262281612df1565b61262b816114df565b916126396040519384610afd565b818352601f19612648836114df565b015f5b8181106126bf575050602061266b91015161266581612e52565b90610cd4565b5f905b82821061267b5750505090565b6126b78161268a600193612ebd565b90612693610b20565b8281528160208201526126a686896114cb565b526126b185886114cb565b50610cd4565b91019061266e565b6020906126ca612584565b8282880101520161264b565b6021815103610195576020015160018101809111610c97575190565b80511561019557612705610b9e91612da5565b61271181939293612430565b928360200190612f86565b805191908290602001825e015f815290565b610b2f9061275061274a9493604051958693602085019061271c565b9061271c565b03601f198101845283610afd565b6001907fff00000000000000000000000000000000000000000000000000000000000000610b9e9493168152019061271c565b916001610b9e94937fff0000000000000000000000000000000000000000000000000000000000000061274a94168152019061271c565b6127d0612415565b905f915b81518310156127fc576127f46001916127ed85856114cb565b519061272e565b9201916127d4565b91505080516038811061283b5750610b9e6128178251613025565b916104c961282b611e9a6125608651610caa565b9160405194859360208501612791565b61284d611e9a612560610b9e93610c9c565b6104c96040519384926020840161275e565b8051604010156112825760600190565b908151811015611282570160200190565b6001815114806128cd575b610b9e578051603881106128bb5750610b9e6128a78251613025565b916104c961282b611e9a6125608651610cc6565b61284d611e9a612560610b9e93610cb8565b50608060ff6128e1611d64611d3e8561149d565b161061288b565b60ff601b9116019060ff8211610c9757565b6004111561029457565b905f5b82548110156121f95773ffffffffffffffffffffffffffffffffffffffff61292f828561213a565b90549060031b1c1673ffffffffffffffffffffffffffffffffffffffff83161461220057600101612907565b905f5b82518110156121f95773ffffffffffffffffffffffffffffffffffffffff61298682856114cb565b511673ffffffffffffffffffffffffffffffffffffffff8316146122005760010161295e565b91906129b88351610ce1565b908351151580612ac5575b6129cc906125c2565b6129d96124c58284612029565b938192600180841614612a63575b5f19869101935b8481106129fc575050505050565b83612a5a6001612a50600f612529612560611d64611d3e8b60029b612a49612a3c886125298f611d64611d3e612a356125209360011c90565b809961286f565b9b8d03809c5f1a9261286f565b538c61286f565b5f1a92018961286f565b530185906129ee565b92507f0f00000000000000000000000000000000000000000000000000000000000000612aa2612560611d64611d3e612a9c8760011c90565b8661286f565b60f81b165f1a612ab18661149d565b535f19612abd83611f03565b9390506129e7565b50818111156129c3565b915f915f612adb612584565b50845115612d6c5790935f915b81518310156101955782158080612d56575b61019557159081612d39575b5061019557612b1861178283836114cb565b948551600281145f14612c155750612b3a612b356116d58861149d565b61313c565b95612b50612b498888846131a9565b8092610cd4565b965111612bf75715612b875750612b679051611fb3565b11610195575111612b7e576116d5610b9e91611407565b50610b9e612415565b919094612b948651611fb3565b82146101955780612bb6612bb2612bac600194611407565b51612dd1565b1590565b15612bd857612bc7612bcd91611407565b5161312e565b915b01919490612ae8565b612be4612bf191611407565b5160208101519051902090565b91612bcf565b505091509250612c08915051611fb3565b1161019557610b9e612415565b929491939192601103612cda5781518314612cbc57612c46612c40612560611d64611d3e878761286f565b93610c89565b92601081101561019557612c63612c5d82896114cb565b51613118565b15612c855750505050612c7891925051611fb3565b0361019557610b9e612415565b86612c9d612bb2612bac84600196989a97999b6114cb565b15612caf57612bf191612bc7916114cb565b612bf191612be4916114cb565b505050612cc99051611fb3565b03610195576116d5610b9e916114ba565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f696e76616c6964206e6f6465206c656e677468000000000000000000000000006044820152606490fd5b9050612d4e612d4884846114cb565b516130e1565b14155f612b06565b50612d64612be485856114cb565b871415612afa565b509050612d9d92507f56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b4219150146125c2565b610b9e612415565b906020820191612db58351612e52565b925190838201809211610c975751928303928311610c97579190565b805115612dec57602060c0910151515f1a1061103757600190565b505f90565b805115612dec575f9060208101908151612e0a81612e52565b8101809111610c9757915190518101809111610c975791905b828110612e305750905090565b612e3981612ebd565b8101809111610c9757612e4c9091611f03565b90612e23565b515f1a6080811015612e6357505f90565b60b881108015612ea7575b15612e795750600190565b60c0811015612e9857610b9e90612e939060b75b90612029565b610c89565b610b9e90612e939060f7612e8d565b5060c08110158015612e6e575060f88110612e6e565b80515f1a906080821015612ed2575050600190565b60b8821015612ee85750612e93610b9e91611fee565b60c0821015612f295760010151602082900360b7016101000a9004017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff4a0190565b60f8821015612f3f5750612e93610b9e91611fc1565b60010151602082900360f7016101000a9004017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0a0190565b601f8111610c97576101000a90565b90918015611efe575b6020811015612fc95780612fa257505050565b612fb6612fb1612fbb9261201b565b612f77565b611fb3565b905182518216911916179052565b91908051825260208101809111610c97579060208101809111610c975791601f19810190811115612f8f57610c5c565b6130038151612430565b9081511561302157806020610b9e9201519051908360200190612f86565b5090565b5f81805b613093575061303781612430565b91815b61304357505090565b61304c82611fb3565b61307e7fff000000000000000000000000000000000000000000000000000000000000008360f81b165f1a918561286f565b5360081c908015610c97575f1901908161303a565b9061309d90611f03565b9060081c80613029565b81519190604183036130d7576130d09250602082015190606060408401519301515f1a9061324d565b9192909190565b50505f9160029190565b805160208110156130f9575060208101519051902090565b906020015120604051602081019182526020815261240f604082610afd565b6001815103612dec5760200151515f1a60801490565b61313790612da5565b902090565b9081511561019557600f613158612520611d64611d3e8661149d565b168061316b5750610b9e60025f936129ac565b600181036131805750610b9e60015f936129ac565b600281036131965750610b9e60026001936129ac565b60030361019557610b9e600180936129ac565b91905f5b838101808211610c97578251811080613243575b1561323b576131f17fff00000000000000000000000000000000000000000000000000000000000000918461286f565b51167fff0000000000000000000000000000000000000000000000000000000000000061321e838661286f565b511690036132345761322f90611f03565b6131ad565b9250505090565b509250505090565b50835182106131c1565b91907f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a084116132dc579160209360809260ff5f9560405194855216868401526040830152606082015282805260015afa156132d1575f5173ffffffffffffffffffffffffffffffffffffffff8116156132c757905f905f90565b505f906001905f90565b6040513d5f823e3d90fd5b5050505f916003919056fea164736f6c634300081c000a2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d4c48d1d2b0f4f7485fc28e3db22341d96a20aa29e6efa8149da9751603abd4e06e0c24a6e293ff9b755263dbaa15ba3796b0b8d3fe17cfb4ddf8143b268eac47bd893629a699470e4ec82a5715bb4981fdaacc5d0a728bf5f55b801d8f4ef10bad3228b676f7d3cd4284a5443f17f1962b36e491b30a40b2405849e597ba5fb5","sourceMap":"237:2306:36:-:0;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;237:2306:36;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;237:2306:36;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;:::i;:::-;;-1:-1:-1;;;;;237:2306:36;;3952:25:35;;3948:84;;237:2306:36;;17667:22:35;17663:79;;-1:-1:-1;17794:3:35;237:2306:36;;17771:21:35;;;;;-1:-1:-1;;;;;17817:13:35;;;;:::i;:::-;237:2306:36;;17817:27:35;17813:111;;-1:-1:-1;17957:5:35;;;;;;17794:3;237:2306:36;;17756:13:35;;17964:3;-1:-1:-1;;;;;17991:13:35;;;;:::i;:::-;237:2306:36;;-1:-1:-1;;;;;18008:13:35;237:2306:36;;18008:13:35;:::i;:::-;237:2306:36;;17991:30:35;17987:117;;237:2306:36;;17942:13:35;;17987:117;-1:-1:-1;;;;;18071:13:35;237:2306:36;;18071:13:35;:::i;:::-;237:2306:36;;18052:33:35;;;-1:-1:-1;18052:33:35;;237:2306:36;;-1:-1:-1;18052:33:35;17813:111;-1:-1:-1;;;;;237:2306:36;17895:13:35;;237:2306:36;17895:13:35;:::i;:::-;237:2306:36;;17871:38:35;;;-1:-1:-1;17871:38:35;;237:2306:36;;-1:-1:-1;17871:38:35;17771:21;-1:-1:-1;237:2306:36;;;17771:21:35;;;;;;;237:2306:36;;-1:-1:-1;;;;;237:2306:36;;;;;;;;;;-1:-1:-1;237:2306:36;;;4186:84:35;;237:2306:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;237:2306:36;;;;;4112:255:35;;;237:2306:36;;;-1:-1:-1;;;;;237:2306:36;;;4112:255:35;;;237:2306:36;;;;;;;4112:255:35;;;237:2306:36;;;;;;;-1:-1:-1;;;;;;237:2306:36;;;;;;;;;;;;;-1:-1:-1;;;;;;237:2306:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;237:2306:36;;;4418:15:35;237:2306:36;;;;;;;;-1:-1:-1;;;;;;237:2306:36;;;;;;;;;;4525:26:35;;237:2306:36;;;;;;;4589:25:35;;;237:2306:36;;;;;;;;;;;;;;;;;;;;17751:377:35;237:2306:36;;-1:-1:-1;237:2306:36;;-1:-1:-1;237:2306:36;-1:-1:-1;237:2306:36;;;;;;;-1:-1:-1;;;;;237:2306:36;;;;4697:44:35;;;:::i;:::-;;4652:233;237:2306:36;;;;;;;;;4652:233:35;4772:43;;4829:45;4772:43;;:::i;:::-;;4829:45;:::i;:::-;;4652:233;;237:2306:36;;;-1:-1:-1;;;;;237:2306:36;;;;;;;;;;;;;;;;-1:-1:-1;237:2306:36;;;-1:-1:-1;237:2306:36;;;;;;;;;;;;;;;;-1:-1:-1;237:2306:36;;;;;;;;;;-1:-1:-1;237:2306:36;;4418:15:35;237:2306:36;;-1:-1:-1;237:2306:36;17663:79:35;17712:19;;;-1:-1:-1;17712:19:35;;-1:-1:-1;17712:19:35;3948:84;4000:21;;;-1:-1:-1;4000:21:35;;-1:-1:-1;4000:21:35;237:2306:36;;;;;;;:::i;:::-;;;;;;;;;;-1:-1:-1;237:2306:36;;;;;;;;;-1:-1:-1;;237:2306:36;;;-1:-1:-1;;;;;237:2306:36;;;;;;;;;;:::o;:::-;;;-1:-1:-1;;;;;237:2306:36;;;;;;:::o;:::-;;;-1:-1:-1;;;;;237:2306:36;;;;;;:::o;:::-;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;6145:316:93;-1:-1:-1;;;;;237:2306:36;;3976:1:35;237:2306:36;;;-1:-1:-1;;;;;;;;;;;237:2306:36;;;;;;;;;;-1:-1:-1;;;;;237:2306:36;3976:1:35;237:2306:36;;;-1:-1:-1;;;;;;;;;;;237:2306:36;;;;;;;-1:-1:-1;;237:2306:36;;;;;735:10:121;;237:2306:36;-1:-1:-1;;;;;;;;;;;3976:1:35;;6336:40:93;6313:4;6390:11;:::o;6238:217::-;6432:12;3976:1:35;6432:12:93;:::o;6145:316::-;-1:-1:-1;;;;;237:2306:36;;;;;;-1:-1:-1;;;;;;;;;;;237:2306:36;;;;;;;;;;-1:-1:-1;;;;;237:2306:36;;;;;-1:-1:-1;;;;;;;;;;;237:2306:36;;;;;;;-1:-1:-1;;237:2306:36;;;;;735:10:121;;237:2306:36;-1:-1:-1;;;;;;;;;;;2089:33:35;-1:-1:-1;;;;;;;;;;;6336:40:93;237:2306:36;6336:40:93;6313:4;6390:11;:::o;6145:316::-;237:2306:36;;;-1:-1:-1;;;;;;;;;;;237:2306:36;;-1:-1:-1;;;;;;;;;;;237:2306:36;;;;;;;;;-1:-1:-1;;;;;;;;;;;237:2306:36;;-1:-1:-1;;;;;;;;;;;237:2306:36;;-1:-1:-1;;237:2306:36;6313:4:93;237:2306:36;;;735:10:121;;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;237:2306:36;;6336:40:93;6313:4;6390:11;:::o;6238:217::-;237:2306:36;6432:12:93;:::o","linkReferences":{}},"deployedBytecode":{"object":"0x60806040526004361015610011575f80fd5b5f3560e01c806301ffc9a7146100f45780630bece356146100ef578063248a9ca3146100ea5780632f2ff15d146100e557806336568abe146100e05780634d6d9ffb146100db5780635972185a146100d6578063682ed5f0146100d157806391d14854146100cc578063a217fddf146100c7578063d547741f146100c2578063ddba6537146100bd578063edce8bdc146100b85763ef913a4b146100b3575f80fd5b610a16565b61095e565b61088b565b61085c565b610842565b6107f4565b6105e6565b6105ac565b6103ac565b610350565b61031a565b6102b5565b610217565b34610195576020600319360112610195576004357fffffffff00000000000000000000000000000000000000000000000000000000811680910361019557807f7965db0b000000000000000000000000000000000000000000000000000000006020921490811561016b575b506040519015158152f35b7f01ffc9a7000000000000000000000000000000000000000000000000000000009150145f610160565b5f80fd5b9060206003198301126101955760043567ffffffffffffffff811161019557826023820112156101955780600401359267ffffffffffffffff84116101955760248483010111610195576024019190565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b346101955761028161022836610199565b5f80527f4c48d1d2b0f4f7485fc28e3db22341d96a20aa29e6efa8149da9751603abd4e06020527f6e0c24a6e293ff9b755263dbaa15ba3796b0b8d3fe17cfb4ddf8143b268eac475490919060ff161561029957610d9d565b6040516003821015610294576020918152f35b6101ea565b6102a1611287565b610d9d565b90816020910312610195573590565b346101955760206003193601126101955760206102df6004355f525f602052600160405f20015490565b604051908152f35b6003196040910112610195576004359060243573ffffffffffffffffffffffffffffffffffffffff811681036101955790565b346101955761034e61032b366102e7565b90610349610344825f525f602052600160405f20015490565b61130f565b61221d565b005b346101955761035e366102e7565b3373ffffffffffffffffffffffffffffffffffffffff8216036103845761034e916122f4565b7f6697b232000000000000000000000000000000000000000000000000000000005f5260045ffd5b346101955760206003193601126101955760043567ffffffffffffffff8111610195578060040160806003198336030112610195575f80527f4c48d1d2b0f4f7485fc28e3db22341d96a20aa29e6efa8149da9751603abd4e060205260ff7f6e0c24a6e293ff9b755263dbaa15ba3796b0b8d3fe17cfb4ddf8143b268eac4754161561059f575b61044761044260248401611192565b61137c565b60648201916001610458848461119c565b90500361056157906104a96104966104a261049d61049661049061048961048460446104e09a01611192565b611b30565b988761119c565b9061126e565b3691610b4d565b6123c9565b928061121d565b906001840154906040516104d7816104c960208201948560209181520190565b03601f198101835282610afd565b51902091612457565b805161051f5761051b61050b6104fe845467ffffffffffffffff1690565b67ffffffffffffffff1690565b6040519081529081906020820190565b0390f35b61053361052e61055e9261259c565b6125c9565b7fd039601e000000000000000000000000000000000000000000000000000000005f52600452602490565b5ffd5b61055e61056e848461119c565b7f88b3170e000000000000000000000000000000000000000000000000000000005f52600160045260245250604490565b6105a7611287565b610433565b34610195575f6003193601126101955760206040517fbd893629a699470e4ec82a5715bb4981fdaacc5d0a728bf5f55b801d8f4ef10b8152f35b346101955760206003193601126101955760043567ffffffffffffffff8111610195578060040160a06003198336030112610195575f80527f4c48d1d2b0f4f7485fc28e3db22341d96a20aa29e6efa8149da9751603abd4e060205260ff7f6e0c24a6e293ff9b755263dbaa15ba3796b0b8d3fe17cfb4ddf8143b268eac475416156107e7575b61067c61044260248401611192565b6064820191600161068d848461119c565b90500361056157608481019060206106a5838561121d565b9050036107a957906106f46104966106ed6106e56106de61049d6104966104906106d761048460446107149c01611192565b9b8b61119c565b948761121d565b8101906102a6565b948061121d565b906001850154906040516104d7816104c960208201948560209181520190565b8051156107755761052e6107279161259c565b908082036107475761051b61050b6104fe855467ffffffffffffffff1690565b7f56ed1b63000000000000000000000000000000000000000000000000000000005f5260045260245260445ffd5b61055e827f56ed1b63000000000000000000000000000000000000000000000000000000005f52906044916004525f602452565b61055e6107b6838561121d565b7f24fadac8000000000000000000000000000000000000000000000000000000005f52602060045260245250604490565b6107ef611287565b61066d565b3461019557602060ff610836610809366102e7565b905f525f845260405f209073ffffffffffffffffffffffffffffffffffffffff165f5260205260405f2090565b54166040519015158152f35b34610195575f6003193601126101955760206040515f8152f35b346101955761034e61086d366102e7565b90610886610344825f525f602052600160405f20015490565b6122f4565b346101955761089936610199565b50505f80527f4c48d1d2b0f4f7485fc28e3db22341d96a20aa29e6efa8149da9751603abd4e06020527f6e0c24a6e293ff9b755263dbaa15ba3796b0b8d3fe17cfb4ddf8143b268eac475460ff1615610915575b7f2c1ed462000000000000000000000000000000000000000000000000000000005f5260045ffd5b61091d611287565b6108ed565b67ffffffffffffffff81160361019557565b601f19601f602060409481855280519182918282880152018686015e5f8582860101520116010190565b346101955760206003193601126101955761097e60043561048481610922565b67ffffffffffffffff8154166002600183015492019060405192608084019160208501526040840152606080840152815480915260a08301915f5260205f20905f5b8181106109ea5761051b856109de818703601f198101835282610afd565b60405191829182610934565b825473ffffffffffffffffffffffffffffffffffffffff168452602090930192600192830192016109c0565b34610195575f6003193601126101955761051b60405173ffffffffffffffffffffffffffffffffffffffff60015416602082015267ffffffffffffffff600254818116604084015260401c16606082015267ffffffffffffffff600354818116608084015260401c1660a082015260a081526109de60c082610afd565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b6060810190811067ffffffffffffffff821117610adc57604052565b610a93565b6040810190811067ffffffffffffffff821117610adc57604052565b90601f601f19910116810190811067ffffffffffffffff821117610adc57604052565b60405190610b2f604083610afd565b565b67ffffffffffffffff8111610adc57601f01601f191660200190565b929192610b5982610b31565b91610b676040519384610afd565b829481845281830111610195578281602093845f960137010152565b9080601f8301121561019557816020610b9e93359101610b4d565b90565b6020818303126101955780359067ffffffffffffffff8211610195570180820391608083126101955760405192610bd784610ac0565b823567ffffffffffffffff811161019557604091610bfa84601f19938701610b83565b8652011261019557604051610c0e81610ae1565b6020830135610c1c81610922565b81526040830135610c2c81610922565b60208201526020840152606082013567ffffffffffffffff811161019557610c549201610b83565b604082015290565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b9060018201809211610c9757565b610c5c565b60c001908160c011610c9757565b60f701908160f711610c9757565b6080019081608011610c9757565b60b701908160b711610c9757565b91908201809211610c9757565b908160011b9180830460021490151715610c9757565b81519167ffffffffffffffff8311610adc57680100000000000000008311610adc578154838355808410610d77575b506020610d389101915f5260205f2090565b5f5b838110610d475750505050565b6001906020610d6a855173ffffffffffffffffffffffffffffffffffffffff1690565b9401938184015501610d3a565b825f528360205f2091820191015b818110610d925750610d26565b5f8155600101610d85565b610da991810190610ba1565b9060208201610dc461044282515167ffffffffffffffff1690565b610dce8351611614565b92606084019367ffffffffffffffff610def865167ffffffffffffffff1690565b161561116a5760035491604083901c67ffffffffffffffff1693610e1d67ffffffffffffffff861642610cd4565b9460a0840195610e35875167ffffffffffffffff1690565b9067ffffffffffffffff82161161112b5750505160200151610e7290610e649067ffffffffffffffff16611b30565b9367ffffffffffffffff1690565b67ffffffffffffffff81168015159081611102575b506110ad575090610ef591610eb66002610eae610ea385611bc2565b60e086015190611cf8565b950185611f11565b610ec660c0830194855190612036565b60406080610ee960015473ffffffffffffffffffffffffffffffffffffffff1690565b930151910151916120d9565b610f22610f0a865167ffffffffffffffff1690565b67ffffffffffffffff165f52600460205260405f2090565b610f376104fe825467ffffffffffffffff1690565b61103b5750916002610fb5928694610fa8610f73610f64610f0a610fc39a9b5167ffffffffffffffff1690565b955167ffffffffffffffff1690565b859067ffffffffffffffff167fffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000825416179055565b6001840155519101610cf7565b5167ffffffffffffffff1690565b600254610fdc9060401c67ffffffffffffffff166104fe565b67ffffffffffffffff821611610ff157505f90565b611037907fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff6fffffffffffffffff00000000000000006002549260401b16911617600255565b5f90565b91611051611059945167ffffffffffffffff1690565b90519261214f565b6110a75761055e611072835167ffffffffffffffff1690565b7fc1aea5f7000000000000000000000000000000000000000000000000000000005f5267ffffffffffffffff16600452602490565b60029150565b61055e906110c3855467ffffffffffffffff1690565b7feae35725000000000000000000000000000000000000000000000000000000005f5267ffffffffffffffff9081166004524260245216604452606490565b9050611123429161111e6104fe885467ffffffffffffffff1690565b610cd4565b11155f610e87565b7f9b772277000000000000000000000000000000000000000000000000000000005f524260045267ffffffffffffffff9081166024521660445260645ffd5b7f59d119e3000000000000000000000000000000000000000000000000000000005f5260045ffd5b35610b9e81610922565b9035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe181360301821215610195570180359067ffffffffffffffff821161019557602001918160051b3603831361019557565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b9035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe181360301821215610195570180359067ffffffffffffffff82116101955760200191813603831361019557565b9015611282578061127e9161121d565b9091565b6111f0565b335f9081527f4c48d1d2b0f4f7485fc28e3db22341d96a20aa29e6efa8149da9751603abd4e0602052604090205460ff16156112bf57565b7fe2517d3f000000000000000000000000000000000000000000000000000000005f52336004527fbd893629a699470e4ec82a5715bb4981fdaacc5d0a728bf5f55b801d8f4ef10b60245260445ffd5b805f525f60205260ff6113433360405f209073ffffffffffffffffffffffffffffffffffffffff165f5260205260405f2090565b54161561134d5750565b7fe2517d3f000000000000000000000000000000000000000000000000000000005f523360045260245260445ffd5b67ffffffffffffffff168061138e5750565b7f3ce598a9000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b60405190610100820182811067ffffffffffffffff821117610adc57604052606060e0838281528260208201528260408201525f838201525f60808201525f60a08201528260c08201520152565b8051600110156112825760400190565b805160071015611282576101000190565b8051600d1015611282576101c00190565b8051600e1015611282576101e00190565b805160081015611282576101200190565b8051600310156112825760800190565b8051600b1015611282576101800190565b8051600c1015611282576101a00190565b8051600410156112825760a00190565b8051156112825760200190565b8051600210156112825760600190565b805160101015611282576102200190565b80518210156112825760209160051b010190565b67ffffffffffffffff8111610adc5760051b60200190565b90611501826114df565b61150e6040519182610afd565b828152601f1961151e82946114df565b0190602036910137565b90602082519201517fffffffffffffffffffffffffffffffffffffffff00000000000000000000000081169260148110611560575050565b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000929350829060140360031b1b161690565b60405160c091906115a38382610afd565b6005815291601f1901825f5b8281106115bb57505050565b8060606020809385010152016115af565b906115d6826114df565b6115e36040519182610afd565b828152601f196115f382946114df565b01905f5b82811061160357505050565b8060606020809385010152016115f7565b61163061162b6116226113b9565b9280845261259c565b61260b565b602082019080825251600f8110611b0557507f1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d493476116766116708351611407565b516126d6565b03611aca57600161169061168a8351611417565b516125c9565b03611a8f577f63746963616c2062797a616e74696e65206661756c7420746f6c6572616e63656116c36116708351611428565b03611a54576116db6116d58251611439565b516126f2565b80516008811490811591611a24575b506119ea575061162b61175d6116d5836117216117106104fe61168a611762985161144a565b67ffffffffffffffff166060880152565b61172e611670825161145b565b60808701526117576117466104fe61168a845161146b565b67ffffffffffffffff1660a0880152565b5161147c565b61259c565b90604081019180835251600581036119bf57506117886117828351611407565b5161260b565b908151156119975761179a82516114f7565b9360c082019485525f5b8351811015611933576117ba6116d582866114cb565b80516014810361190857506117d16117d791611528565b60601c90565b73ffffffffffffffffffffffffffffffffffffffff811680156118c6575f5b8381106118325750509061182c600192611811838a516114cb565b9073ffffffffffffffffffffffffffffffffffffffff169052565b016117a4565b8161187761185e611844848d516114cb565b5173ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff1690565b14611884576001016117f6565b7f41fe18cc000000000000000000000000000000000000000000000000000000005f5273ffffffffffffffffffffffffffffffffffffffff831660045260245ffd5b7f59bff387000000000000000000000000000000000000000000000000000000005f5273ffffffffffffffffffffffffffffffffffffffff821660045260245ffd5b7f83e46ad2000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b509261178291945061194692505161148d565b61195081516115cc565b9260e081019384525f5b8251811015611991578061198a816119776116d5600195886114cb565b88519061198483836114cb565b526114cb565b500161195a565b50925050565b7f339e1ffb000000000000000000000000000000000000000000000000000000005f5260045ffd5b7f30c6792a000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b611a20906040519182917fd5edd2a500000000000000000000000000000000000000000000000000000000835260048301610934565b0390fd5b7f011b4d03dd8c01f1049143cf9c4c817e4b167f1d1b83e5c6f0f10d89ba1e7bce9150602083012014155f6116ea565b611a6461167061055e9251611428565b7fa19e609c000000000000000000000000000000000000000000000000000000005f52600452602490565b611a9f61168a61055e9251611417565b7ff71b722f000000000000000000000000000000000000000000000000000000005f52600452602490565b611ada61167061055e9251611407565b7fb8120dca000000000000000000000000000000000000000000000000000000005f52600452602490565b7fbc277732000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b67ffffffffffffffff1690815f52600460205260405f209167ffffffffffffffff83541615611b5c5750565b7ff761631b000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b60405190611b96604083610afd565b600182527fc0000000000000000000000000000000000000000000000000000000000000006020830152565b6020611c7d611bcf611592565b611c48611be660408601611bec611be6825161149d565b51612ff9565b611bf58561149d565b52611bff8461149d565b50611c0d611be68251611407565b611c1685611407565b52611c2084611407565b50611c2e611be682516114aa565b611c37856114aa565b52611c41846114aa565b505161145b565b611c518261145b565b52611c5b8161145b565b50611c64611b87565b611c6d8261148d565b52611c778161148d565b506127c8565b910190611c8b8251516115cc565b905f5b83518051821015611ce1579080600192600c82145f14611ccf575050611cb383612880565b611cbd82866114cb565b52611cc881856114cb565b5001611c8e565b611cdc91611be6916114cb565b611cb3565b505050611cee91506127c8565b6020815191012090565b919091611d0583516114f7565b925f5b8151811015611efe57611d1b81836114cb565b51805160418103611ed3575080601b60ff611d6a611d64611d3e611d779661285f565b517fff000000000000000000000000000000000000000000000000000000000000001690565b60f81c90565b1610611e80575b846130a7565b90611d81816128fa565b1590811591611e76575b508015611e58575b611e305773ffffffffffffffffffffffffffffffffffffffff81165f5b838110611dd057505090611dca60019261181183896114cb565b01611d08565b81611de161185e611844848c6114cb565b14611dee57600101611db0565b7f33af0d5f000000000000000000000000000000000000000000000000000000005f5273ffffffffffffffffffffffffffffffffffffffff831660045260245ffd5b7f09cb44e6000000000000000000000000000000000000000000000000000000005f5260045ffd5b5073ffffffffffffffffffffffffffffffffffffffff811615611d93565b905015155f611d8b565b611ec2611e9a611e95611d64611d3e8561285f565b6128e8565b60f81b7fff000000000000000000000000000000000000000000000000000000000000001690565b5f1a611ecd8261285f565b53611d71565b7ff2db9ce1000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b505050565b5f198114610c975760010190565b905f915f5b8151811015611f6a57611f4973ffffffffffffffffffffffffffffffffffffffff611f4183856114cb565b511684612904565b611f56575b600101611f16565b92611f62600191611f03565b939050611f4e565b50506003611f79915404610c89565b90818110611f85575050565b7fe2dcb1b9000000000000000000000000000000000000000000000000000000005f5260045260245260445ffd5b905f198201918211610c9757565b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff408201918211610c9757565b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff808201918211610c9757565b6020039060208211610c9757565b91908203918211610c9757565b905f915f5b815181101561208f5761206e73ffffffffffffffffffffffffffffffffffffffff61206683856114cb565b51168461295b565b61207b575b60010161203b565b92612087600191611f03565b939050612073565b50505190600382048203918211610c97578181106120ab575050565b7f7818f4e4000000000000000000000000000000000000000000000000000000005f5260045260245260445ffd5b6121239261162b9261175d926040517fffffffffffffffffffffffffffffffffffffffff000000000000000000000000602082019260601b168252601481526104d7603482610afd565b805160021015611282576060610b9e9101516126d6565b8054821015611282575f5260205f2001905f90565b919067ffffffffffffffff8061216d855467ffffffffffffffff1690565b92169116149081159161220e575b5061220857600201908154815103612208575f5b8151811015612200576121c56121a5828561213a565b905473ffffffffffffffffffffffffffffffffffffffff9160031b1c1690565b73ffffffffffffffffffffffffffffffffffffffff6121ea61185e61184485876114cb565b9116036121f95760010161218f565b5050505f90565b505050600190565b50505f90565b9050600182015414155f61217b565b805f525f60205260ff6122518360405f209073ffffffffffffffffffffffffffffffffffffffff165f5260205260405f2090565b541661220857805f525f6020526122898260405f209073ffffffffffffffffffffffffffffffffffffffff165f5260205260405f2090565b60017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0082541617905573ffffffffffffffffffffffffffffffffffffffff339216907f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d5f80a4600190565b805f525f60205260ff6123288360405f209073ffffffffffffffffffffffffffffffffffffffff165f5260205260405f2090565b54161561220857805f525f6020526123618260405f209073ffffffffffffffffffffffffffffffffffffffff165f5260205260405f2090565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00815416905573ffffffffffffffffffffffffffffffffffffffff339216907ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b5f80a4600190565b60208151910120604051602081019182527f1260944489272988d9df285149b5aa1b0f48f2136d6f416159f840a3e074760060408201526040815261240f606082610afd565b51902090565b60405190612424602083610afd565b5f808352366020840137565b9061243a82610b31565b6124476040519182610afd565b828152601f1961151e8294610b31565b61162b6124999194939461246b6020610b31565b956124796040519788610afd565b602087526124876020610b31565b601f196020890191013682375261259c565b906124a48451610ce1565b91845115158061257c575b6124b8906125c2565b6124ca6124c55f85612029565b612430565b925f19015f5b8181106124e4575050610b9e939450612acf565b80612566600f612529612560611d64611d3e8d61250360029960011c90565b908d61255a8a6125528a612529612520611d64611d3e8a8a61286f565b60041c600f1690565b1660f81b7fff000000000000000000000000000000000000000000000000000000000000001690565b5f1a9261286f565b5361286f565b60ff1690565b5f1a612575600183018861286f565b53016124d0565b5060016124af565b6040519061259182610ae1565b5f6020838281520152565b6125a4612584565b506020815191604051926125b784610ae1565b835201602082015290565b1561019557565b805180151590816125ff575b5015610195576125e490612da5565b905190602081106125f3575090565b6020036101000a900490565b6021915011155f6125d5565b61261481612dd1565b156101955761262281612df1565b61262b816114df565b916126396040519384610afd565b818352601f19612648836114df565b015f5b8181106126bf575050602061266b91015161266581612e52565b90610cd4565b5f905b82821061267b5750505090565b6126b78161268a600193612ebd565b90612693610b20565b8281528160208201526126a686896114cb565b526126b185886114cb565b50610cd4565b91019061266e565b6020906126ca612584565b8282880101520161264b565b6021815103610195576020015160018101809111610c97575190565b80511561019557612705610b9e91612da5565b61271181939293612430565b928360200190612f86565b805191908290602001825e015f815290565b610b2f9061275061274a9493604051958693602085019061271c565b9061271c565b03601f198101845283610afd565b6001907fff00000000000000000000000000000000000000000000000000000000000000610b9e9493168152019061271c565b916001610b9e94937fff0000000000000000000000000000000000000000000000000000000000000061274a94168152019061271c565b6127d0612415565b905f915b81518310156127fc576127f46001916127ed85856114cb565b519061272e565b9201916127d4565b91505080516038811061283b5750610b9e6128178251613025565b916104c961282b611e9a6125608651610caa565b9160405194859360208501612791565b61284d611e9a612560610b9e93610c9c565b6104c96040519384926020840161275e565b8051604010156112825760600190565b908151811015611282570160200190565b6001815114806128cd575b610b9e578051603881106128bb5750610b9e6128a78251613025565b916104c961282b611e9a6125608651610cc6565b61284d611e9a612560610b9e93610cb8565b50608060ff6128e1611d64611d3e8561149d565b161061288b565b60ff601b9116019060ff8211610c9757565b6004111561029457565b905f5b82548110156121f95773ffffffffffffffffffffffffffffffffffffffff61292f828561213a565b90549060031b1c1673ffffffffffffffffffffffffffffffffffffffff83161461220057600101612907565b905f5b82518110156121f95773ffffffffffffffffffffffffffffffffffffffff61298682856114cb565b511673ffffffffffffffffffffffffffffffffffffffff8316146122005760010161295e565b91906129b88351610ce1565b908351151580612ac5575b6129cc906125c2565b6129d96124c58284612029565b938192600180841614612a63575b5f19869101935b8481106129fc575050505050565b83612a5a6001612a50600f612529612560611d64611d3e8b60029b612a49612a3c886125298f611d64611d3e612a356125209360011c90565b809961286f565b9b8d03809c5f1a9261286f565b538c61286f565b5f1a92018961286f565b530185906129ee565b92507f0f00000000000000000000000000000000000000000000000000000000000000612aa2612560611d64611d3e612a9c8760011c90565b8661286f565b60f81b165f1a612ab18661149d565b535f19612abd83611f03565b9390506129e7565b50818111156129c3565b915f915f612adb612584565b50845115612d6c5790935f915b81518310156101955782158080612d56575b61019557159081612d39575b5061019557612b1861178283836114cb565b948551600281145f14612c155750612b3a612b356116d58861149d565b61313c565b95612b50612b498888846131a9565b8092610cd4565b965111612bf75715612b875750612b679051611fb3565b11610195575111612b7e576116d5610b9e91611407565b50610b9e612415565b919094612b948651611fb3565b82146101955780612bb6612bb2612bac600194611407565b51612dd1565b1590565b15612bd857612bc7612bcd91611407565b5161312e565b915b01919490612ae8565b612be4612bf191611407565b5160208101519051902090565b91612bcf565b505091509250612c08915051611fb3565b1161019557610b9e612415565b929491939192601103612cda5781518314612cbc57612c46612c40612560611d64611d3e878761286f565b93610c89565b92601081101561019557612c63612c5d82896114cb565b51613118565b15612c855750505050612c7891925051611fb3565b0361019557610b9e612415565b86612c9d612bb2612bac84600196989a97999b6114cb565b15612caf57612bf191612bc7916114cb565b612bf191612be4916114cb565b505050612cc99051611fb3565b03610195576116d5610b9e916114ba565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f696e76616c6964206e6f6465206c656e677468000000000000000000000000006044820152606490fd5b9050612d4e612d4884846114cb565b516130e1565b14155f612b06565b50612d64612be485856114cb565b871415612afa565b509050612d9d92507f56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b4219150146125c2565b610b9e612415565b906020820191612db58351612e52565b925190838201809211610c975751928303928311610c97579190565b805115612dec57602060c0910151515f1a1061103757600190565b505f90565b805115612dec575f9060208101908151612e0a81612e52565b8101809111610c9757915190518101809111610c975791905b828110612e305750905090565b612e3981612ebd565b8101809111610c9757612e4c9091611f03565b90612e23565b515f1a6080811015612e6357505f90565b60b881108015612ea7575b15612e795750600190565b60c0811015612e9857610b9e90612e939060b75b90612029565b610c89565b610b9e90612e939060f7612e8d565b5060c08110158015612e6e575060f88110612e6e565b80515f1a906080821015612ed2575050600190565b60b8821015612ee85750612e93610b9e91611fee565b60c0821015612f295760010151602082900360b7016101000a9004017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff4a0190565b60f8821015612f3f5750612e93610b9e91611fc1565b60010151602082900360f7016101000a9004017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0a0190565b601f8111610c97576101000a90565b90918015611efe575b6020811015612fc95780612fa257505050565b612fb6612fb1612fbb9261201b565b612f77565b611fb3565b905182518216911916179052565b91908051825260208101809111610c97579060208101809111610c975791601f19810190811115612f8f57610c5c565b6130038151612430565b9081511561302157806020610b9e9201519051908360200190612f86565b5090565b5f81805b613093575061303781612430565b91815b61304357505090565b61304c82611fb3565b61307e7fff000000000000000000000000000000000000000000000000000000000000008360f81b165f1a918561286f565b5360081c908015610c97575f1901908161303a565b9061309d90611f03565b9060081c80613029565b81519190604183036130d7576130d09250602082015190606060408401519301515f1a9061324d565b9192909190565b50505f9160029190565b805160208110156130f9575060208101519051902090565b906020015120604051602081019182526020815261240f604082610afd565b6001815103612dec5760200151515f1a60801490565b61313790612da5565b902090565b9081511561019557600f613158612520611d64611d3e8661149d565b168061316b5750610b9e60025f936129ac565b600181036131805750610b9e60015f936129ac565b600281036131965750610b9e60026001936129ac565b60030361019557610b9e600180936129ac565b91905f5b838101808211610c97578251811080613243575b1561323b576131f17fff00000000000000000000000000000000000000000000000000000000000000918461286f565b51167fff0000000000000000000000000000000000000000000000000000000000000061321e838661286f565b511690036132345761322f90611f03565b6131ad565b9250505090565b509250505090565b50835182106131c1565b91907f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a084116132dc579160209360809260ff5f9560405194855216868401526040830152606082015282805260015afa156132d1575f5173ffffffffffffffffffffffffffffffffffffffff8116156132c757905f905f90565b505f906001905f90565b6040513d5f823e3d90fd5b5050505f916003919056fea164736f6c634300081c000a","sourceMap":"237:2306:36:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;;;;-1:-1:-1;;237:2306:36;;;;;;;;;;;;;;;2639:47:93;2654:32;237:2306:36;2639:47:93;;:87;;;;;237:2306:36;;;;;;;;;;2639:87:93;844:25:133;829:40;;;2639:87:93;;;237:2306:36;-1:-1:-1;237:2306:36;;;;;-1:-1:-1;;237:2306:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;5606:2265:35;237:2306:36;;;:::i;:::-;-1:-1:-1;237:2306:36;;;;;;;;;;;;23225:42:35;23221:105;;5606:2265;:::i;:::-;237:2306:36;;;;;;;;;;;;;;;:::i;23221:105:35:-;23294:20;;:::i;:::-;5606:2265;:::i;237:2306:36:-;;;;;;;;;;;:::o;:::-;;;;;-1:-1:-1;;237:2306:36;;;;;;;;;3867:6:93;237:2306:36;3867:6:93;237:2306:36;;3867:22:93;237:2306:36;3867:6:93;237:2306:36;3867:22:93;237:2306:36;3776:120:93;;237:2306:36;;;;;;;;-1:-1:-1;;237:2306:36;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;4296:25:93;237:2306:36;;;:::i;:::-;4266:18:93;2475:4;4266:18;;3867:6;237:2306:36;3867:6:93;237:2306:36;;3867:22:93;237:2306:36;3867:6:93;237:2306:36;3867:22:93;237:2306:36;3776:120:93;;4266:18;2475:4;:::i;:::-;4296:25;:::i;:::-;237:2306:36;;;;;;;;:::i;:::-;735:10:121;237:2306:36;;;5387:34:93;5383:102;;5495:37;;;:::i;5383:102::-;5444:30;;;237:2306:36;5444:30:93;;237:2306:36;;;;;-1:-1:-1;;237:2306:36;;;;;;;;;;;;;;;;-1:-1:-1;;237:2306:36;;;;;;;-1:-1:-1;237:2306:36;;;;;;;;;23225:42:35;23221:105;;237:2306:36;9334:31:35;;:16;;;:31;:::i;:::-;;:::i;:::-;9380:9;;;;9400:1;9380:9;;;;:::i;:::-;:21;;;9376:97;;9542:31;237:2306:36;9688:10:35;9606:36;237:2306:36;9629:12:35;:9;9523:51;9542:31;;9688:95;9542:31;;;:::i;:::-;9523:51;:::i;:::-;9629:9;;;:::i;:::-;:12;;:::i;:::-;237:2306:36;;;:::i;:::-;9606:36:35;:::i;:::-;9688:10;;;:::i;237:2306:36:-;9714:26:35;9400:1;9714:26;;237:2306:36;;;;9752:29:35;;;237:2306:36;9752:29:35;;;;237:2306:36;;;;;;;9752:29:35;;-1:-1:-1;;9752:29:35;;;;;;:::i;:::-;237:2306:36;9742:40:35;;9688:95;;:::i;:::-;237:2306:36;;9793:109:35;;237:2306:36;9911:31:35;237:2306:36;;;;;;;;;;;;9911:31:35;237:2306:36;;;;;;;;;;;;;;;;;9793:109:35;9860:29;:20;9840:51;9860:20;;:::i;:::-;:29;:::i;:::-;9840:51;-1:-1:-1;9840:51:35;237:2306:36;;;;;9840:51:35;-1:-1:-1;9840:51:35;9376:97;9424:38;9445:9;;;;:::i;:::-;9424:38;-1:-1:-1;9424:38:35;9400:1;237:2306:36;;;;-1:-1:-1;237:2306:36;;;23221:105:35;23294:20;;:::i;:::-;23221:105;;237:2306:36;;;;;-1:-1:-1;;237:2306:36;;;;;;;;2089:33:35;237:2306:36;;;;;;;;-1:-1:-1;;237:2306:36;;;;;;;;;;;;;;;;-1:-1:-1;;237:2306:36;;;;;;;-1:-1:-1;237:2306:36;;;;;;;;;23225:42:35;23221:105;;237:2306:36;8106:31:35;;:16;;;:31;:::i;:::-;8152:9;;;;8172:1;8152:9;;;;:::i;:::-;:21;;;8148:97;;8258:10;;;;237:2306:36;8258:10:35;;;;:::i;:::-;:23;;;8254:102;;8425:31;237:2306:36;8638:10:35;8559:33;8570:10;8489:36;237:2306:36;8512:12:35;:9;8406:51;8425:31;;8638:95;8425:31;;;:::i;8406:51::-;8512:9;;;:::i;8489:36::-;8570:10;;;:::i;:::-;8559:33;;;;:::i;:::-;8638:10;;;:::i;237:2306:36:-;8664:26:35;8172:1;8664:26;;237:2306:36;;;;8702:29:35;;;237:2306:36;8702:29:35;;;;237:2306:36;;;;;;;8638:95:35;237:2306:36;;8747:20:35;8743:107;;8890:20;:29;:20;;:::i;:29::-;8934:28;;;;8930:116;;237:2306:36;9055:31:35;237:2306:36;;;;;;;8930:116:35;8985:50;-1:-1:-1;8985:50:35;237:2306:36;;;;;-1:-1:-1;9840:51:35;8743:107;8790:49;;;-1:-1:-1;8790:49:35;237:2306:36;;;;;-1:-1:-1;237:2306:36;;;8254:102:35;8304:41;8327:10;;;;:::i;:::-;8304:41;-1:-1:-1;8304:41:35;237:2306:36;;;;;-1:-1:-1;237:2306:36;;;23221:105:35;23294:20;;:::i;:::-;23221:105;;237:2306:36;;;;;;2920:29:93;237:2306:36;;;:::i;:::-;;2920:6:93;237:2306:36;2920:6:93;237:2306:36;;;2920:6:93;237:2306:36;;;;;;;;;;;;;2920:29:93;237:2306:36;;;;;;;;;;;;;;;-1:-1:-1;;237:2306:36;;;;;;;;;;;;;;;;4713:26:93;237:2306:36;;;:::i;:::-;4683:18:93;2475:4;4683:18;;3867:6;237:2306:36;3867:6:93;237:2306:36;;3867:22:93;237:2306:36;3867:6:93;237:2306:36;3867:22:93;237:2306:36;3776:120:93;;2475:4;4713:26;:::i;237:2306:36:-;;;;;;;:::i;:::-;-1:-1:-1;;23264:1:35;237:2306:36;;;;;;;;;23225:42:35;23221:105;;237:2306:36;10076:25:35;23264:1;10076:25;237:2306:36;23264:1:35;10076:25;23221:105;23294:20;;:::i;:::-;23221:105;;237:2306:36;;;;;;;:::o;:::-;-1:-1:-1;;237:2306:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;-1:-1:-1;;237:2306:36;;;;;5418:34:35;237:2306:36;;;;;:::i;5418:34:35:-;237:2306:36;;;;5534:25:35;5506:26;;;237:2306:36;5534:25:35;;237:2306:36;;;;;;;5469:91:35;237:2306:36;5469:91:35;;237:2306:36;;;;;;;;;;;;;;;;;;;-1:-1:-1;237:2306:36;;-1:-1:-1;237:2306:36;;-1:-1:-1;237:2306:36;;;;;;;5469:91:35;;;;;-1:-1:-1;;5469:91:35;;;;;;:::i;:::-;237:2306:36;;;;;;;:::i;:::-;;;;;;;;;;;;5506:26:35;237:2306:36;;;;;;;;;;;;-1:-1:-1;;237:2306:36;;;;;;;;;5021:11:35;237:2306:36;;5010:23:35;;;237:2306:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5010:23:35;;;;;;:::i;237:2306:36:-;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;:::i;:::-;;;;;;;;;;;;;;;:::o;:::-;;;-1:-1:-1;;237:2306:36;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;:::i;:::-;:::o;:::-;;;;;;;;-1:-1:-1;;237:2306:36;;;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;-1:-1:-1;237:2306:36;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;:::i;:::-;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;-1:-1:-1;;237:2306:36;;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;:::o;:::-;;;;;;;;;;;;2219:66:35;237:2306:36;;;;;;;:::o;:::-;;:::i;:::-;22287:4:35;237:2306:36;;;22287:4:35;237:2306:36;;;:::o;:::-;22441:4:35;237:2306:36;;;22441:4:35;237:2306:36;;;:::o;:::-;21614:4:35;237:2306:36;;;21614:4:35;237:2306:36;;;:::o;:::-;21756:4:35;237:2306:36;;;21756:4:35;237:2306:36;;;:::o;:::-;;;;;;;;;;:::o;:::-;;;;;;;;;8605:1:37;237:2306:36;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;237:2306:36;;;-1:-1:-1;237:2306:36;;;;;;;;;;;;;;;;-1:-1:-1;237:2306:36;;;;;;5606:2265:35;5790:40;5606:2265;5790:40;;;;:::i;:::-;5861:18;;;;:33;237:2306:36;5861:18:35;;237:2306:36;;;;;5861:33:35;5935:28;5948:14;;5935:28;:::i;:::-;5977:13;;;;237:2306:36;;;;;;;;;;;5977:18:35;5973:77;;6081:25;237:2306:36;;;;;;;;6063:43:35;;237:2306:36;;;6063:15:35;:43;:::i;:::-;6109:16;;;;237:2306:36;;;;;;;;;6063:62:35;237:2306:36;;;-1:-1:-1;6059:178:35;;-1:-1:-1;;6313:18:35;5861;6313:33;237:2306:36;;;6294:53:35;;237:2306:36;;9523:51:35;:::i;6294:53::-;237:2306:36;;;;;;;;;6374:31:35;;;:139;;;;5606:2265;6357:298;;;6708:25;;6928:79;6708:25;6764:72;6081:25;6692:62;6708:25;;;:::i;:::-;6735:18;;;;6692:62;;:::i;:::-;6803:32;;6764:72;;:::i;:::-;6877:17;;;;;;;;;:::i;:::-;6989;6971:16;237:2306:36;6081:11:35;237:2306:36;;;;;;6971:16:35;;237:2306:36;6989:17:35;;;6928:79;;:::i;:::-;7066:30;237:2306:36;;;;;;;;;;;;7066:15:35;237:2306:36;;;;;;;7066:30:35;7110:37;237:2306:36;;;;;;;7110:37:35;7106:303;;237:2306:36;;6081:25:35;237:2306:36;;;;7502:46:35;237:2306:36;7462:30:35;237:2306:36;;;;;;;;;7462:30:35;237:2306:36;;;;;;;7502:46:35;237:2306:36;;;;;;;;;;;7502:46:35;6081:11;7558:29;;237:2306:36;7642:17:35;7611:28;;237:2306:36;:::i;:::-;;;;;;;6081:25:35;237:2306:36;7674:55:35;;237:2306:36;;;;;;7674:55:35;237:2306:36;;;7674:55:35;7670:141;;7821:43;5861:33;5606:2265;:::o;7670:141::-;7745:55;;237:2306:36;;6081:25:35;237:2306:36;;;;;;;;6081:25:35;237:2306:36;;7745:55:35;5861:33;5606:2265;:::o;7106:303::-;237:2306:36;;7167:95:35;237:2306:36;;;;;;;7244:17:35;;7167:95;;:::i;:::-;7163:175;;7358:40;237:2306:36;;;;;;;;7358:40:35;5861:33;7358:40;237:2306:36;;7066:15:35;237:2306:36;;;;7163:175:35;6081:25;;-1:-1:-1;7282:41:35:o;6357:298::-;6545:99;237:2306:36;;;;;;;;;6545:99:35;5861:33;6545:99;237:2306:36;;;;6545:99:35;237:2306:36;6063:15:35;237:2306:36;;;;;;;;6374:139:35;6063:15;;6425:69;6063:15;237:2306:36;6425:40:35;237:2306:36;;;;;;;6425:40:35;:69;:::i;:::-;:88;;6374:139;;;6059:178;6148:78;5861:33;6148:78;6063:15;6148:78;237:2306:36;;;;;;;;;;;-1:-1:-1;9840:51:35;5973:77;6018:21;5861:33;6018:21;;5861:33;6018:21;237:2306:36;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;:::i;:::-;;;:::o;:::-;;:::i;3165:103:93:-;735:10:121;2920:6:93;237:2306:36;;;;;;;;;;;;3485:23:93;3481:108;;3165:103::o;3481:108::-;3531:47;2920:6;3531:47;735:10:121;3531:47:93;237:2306:36;2089:33:35;237:2306:36;;;2920:6:93;3531:47;3165:103;237:2306:36;2920:6:93;237:2306:36;2920:6:93;237:2306:36;;;2920:29:93;735:10:121;237:2306:36;2920:6:93;237:2306:36;;;;;;;;;;;;;2920:29:93;237:2306:36;;3485:23:93;3481:108;;3165:103;:::o;3481:108::-;3531:47;2920:6;3531:47;735:10:121;3531:47:93;237:2306:36;;;;2920:6:93;3531:47;19777:177:35;237:2306:36;;19858:19:35;19854:94;;19777:177;:::o;19854:94::-;19900:37;19876:1;19900:37;;237:2306:36;;19876:1:35;19900:37;237:2306:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;237:2306:36;;;;-1:-1:-1;237:2306:36;;;;-1:-1:-1;237:2306:36;;;;;;;;;;;:::o;:::-;;;10971:1:35;237:2306:36;;;;;;;:::o;:::-;;;11140:1:35;237:2306:36;;;;;;;:::o;:::-;;;11279:2:35;237:2306:36;;;;;;;:::o;:::-;;;11465:2:35;237:2306:36;;;;;;;:::o;:::-;;;11508:1:35;237:2306:36;;;;;;;:::o;:::-;;;11738:1:35;237:2306:36;;;;;;;:::o;:::-;;;11811:2:35;237:2306:36;;;;;;;:::o;:::-;;;11879:2:35;237:2306:36;;;;;;;:::o;:::-;;;13110:1:35;237:2306:36;;;;;;;:::o;:::-;;;;;;;;;:::o;:::-;;;2043:1;237:2306;;;;;;;:::o;:::-;;;7571:2:37;237:2306:36;;;;;;;:::o;:::-;;;;;;;;;;;;;;;:::o;2219:66:35:-;;;;;;;;;;;:::o;:::-;;;;;:::i;:::-;237:2306:36;;;;;;:::i;:::-;2219:66:35;;;-1:-1:-1;;2219:66:35;;;;:::i;:::-;;;;;;;;:::o;:::-;;237:2306:36;;;;;2219:66:35;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;237:2306:36;2219:66:35;;;:::o;:::-;237:2306:36;;2219:66:35;;237:2306:36;;2219:66:35;237:2306:36;;:::i;:::-;1849:1;2219:66:35;;;-1:-1:-1;;2219:66:35;;-1:-1:-1;2219:66:35;;;;;;;;;:::o;:::-;;237:2306:36;2219:66:35;;;;;;;;;;;;;;;:::i;:::-;237:2306:36;;;;;;:::i;:::-;2219:66:35;;;-1:-1:-1;;2219:66:35;;;;:::i;:::-;;;-1:-1:-1;2219:66:35;;;;;;;;;:::o;:::-;;237:2306:36;2219:66:35;;;;;;;;;;10610:2705;10776:30;:21;237:2306:36;;:::i;:::-;10717:28:35;;;;10776:21;:::i;:::-;:30;:::i;:::-;10755:18;;;:51;;;;237:2306:36;10848:2:35;10820:30;;10816:114;;10952:18;2401:66;10952:36;:21;:18;;:21;:::i;:::-;;:36;:::i;:::-;10944:66;10940:168;;10971:1;11121:30;:21;:18;;:21;:::i;:::-;;:30;:::i;:::-;:35;11117:122;;2219:66;11260:37;:22;:18;;:22;:::i;:37::-;11252:67;11248:167;;11446:32;:22;:18;;:22;:::i;:::-;;:32;:::i;:::-;237:2306:36;;11508:1:35;11492:17;;;;;:73;;;10610:2705;11488:130;;;11651:18;11926:21;11860:32;:22;11651:18;11628:54;11644:38;11651:30;:21;11926:30;11651:18;;:21;:::i;11644:38::-;237:2306:36;;11628:13:35;;;2219:66;;11628:54;11719:36;:21;:18;;:21;:::i;:36::-;11692:16;;;2219:66;11766:58;11785:39;11792:31;:22;:18;;:22;:::i;11785:39::-;237:2306:36;;11766:16:35;;;2219:66;;11766:58;11860:18;:22;:::i;:32::-;11926:21;:::i;:30::-;11902:21;;;;:54;;;;237:2306:36;12002:1:35;11970:33;;11966:123;;12143:21;:33;:24;:21;;:24;:::i;:::-;;:33;:::i;:::-;237:2306:36;;;12190:26:35;12186:83;;12299:36;237:2306:36;;12299:36:35;:::i;:::-;12279:17;;;;:56;;;-1:-1:-1;12392:3:35;237:2306:36;;12365:25:35;;;;;12441:27;:17;;;;:::i;:27::-;237:2306:36;;12511:2:35;12486:27;;12482:125;;12649:23;;12641:32;12649:23;;:::i;:::-;2219:66;;;;12641:32;237:2306:36;;;12691:23:35;;12687:103;;-1:-1:-1;12823:5:35;;;;;;12996:17;;;:32;10971:1;12996:17;:32;:17;;;:32;:::i;:::-;2219:66;237:2306:36;;2219:66:35;;;12996:32;2219:66;12350:13;;12830:3;12857:17;:33;:20;;:17;;;:20;:::i;:::-;237:2306:36;;;;;12857:20:35;237:2306:36;;;;12857:33:35;;12853:116;;10971:1;2219:66;12808:13;;12853:116;12921:29;-1:-1:-1;12921:29:35;237:2306:36;;;12741:34:35;237:2306:36;2219:66:35;-1:-1:-1;9840:51:35;12687:103;12741:34;-1:-1:-1;12741:34:35;237:2306:36;;;12741:34:35;237:2306:36;2219:66:35;-1:-1:-1;9840:51:35;12482:125;12540:52;-1:-1:-1;12540:52:35;237:2306:36;;;-1:-1:-1;9840:51:35;12365:25;;;13088:24;12365:25;;;13088:33;12365:25;;13088:21;:24;:::i;:33::-;13152:29;237:2306:36;;13152:29:35;:::i;:::-;13131:18;;;;:50;;;-1:-1:-1;13233:3:35;237:2306:36;;13211:20:35;;;;;13276:12;13252:46;13276:12;:22;:12;10971:1;13276:12;;;:::i;:22::-;13252:18;;:46;;;;;:::i;:::-;;;:::i;:::-;;2219:66;13196:13;;13211:20;;;;;10610:2705::o;12186:83::-;12239:19;-1:-1:-1;12239:19:35;;-1:-1:-1;12239:19:35;11966:123;12026:52;-1:-1:-1;12026:52:35;237:2306:36;;;-1:-1:-1;9840:51:35;11488:130;11588:19;237:2306:36;;;11588:19:35;;;;;;;;;;:::i;:::-;;;;11492:73;11533:32;237:2306:36;;10755:18:35;237:2306:36;;11513:16:35;:52;;11492:73;;;11248:167;11365:37;:22;11342:62;11365:18;;:22;:::i;:37::-;11342:62;-1:-1:-1;11342:62:35;237:2306:36;;;;;11117:122:35;11197:30;:21;11179:49;11197:18;;:21;:::i;:30::-;11179:49;-1:-1:-1;11179:49:35;237:2306:36;;;;;10940:168:35;11059:36;:21;11033:64;11059:18;;:21;:::i;:36::-;11033:64;-1:-1:-1;11033:64:35;237:2306:36;;;;;10816:114:35;10873:46;10717:16;10873:46;237:2306:36;;;-1:-1:-1;9840:51:35;19356:292;237:2306:36;;;;-1:-1:-1;237:2306:36;19496:15:35;237:2306:36;;;-1:-1:-1;237:2306:36;;;;;;19541:29:35;19537:105;;19356:292;:::o;19537:105::-;19593:38;-1:-1:-1;19593:38:35;19496:15;237:2306:36;;-1:-1:-1;19593:38:35;237:2306:36;;;;;;;;:::i;:::-;;;;;;;;;:::o;1703:838::-;2264:18;2187:26;1837:14;;:::i;:::-;21201:17:35;2086:24:36;1891:21;;;21201:17:35;1891:24:36;:21;;:24;:::i;:::-;;21201:17:35;:::i;:::-;1861:55:36;;;:::i;:::-;;;;;:::i;:::-;;21201:17:35;1956:24:36;:21;;:24;:::i;21201:17:35:-;1926:55:36;;;:::i;:::-;;;;;:::i;:::-;;21201:17:35;2021:24:36;:21;;:24;:::i;21201:17:35:-;1991:55:36;;;:::i;:::-;;;;;:::i;:::-;;2086:21;:24;:::i;21201:17:35:-;2056:55:36;;;:::i;:::-;;;;;:::i;:::-;;2121:23;;:::i;:::-;;;;:::i;:::-;2219:66:35;2121:23:36;;;:::i;:::-;;2187:26;:::i;:::-;2264:18;;;2252:38;2264:18;;237:2306;2252:38;:::i;:::-;2305:13;1913:1;2351:3;2324:18;;237:2306;;2320:29;;;;;2387:82;;1978:1;2387:82;2392:2;2387:7;;:82;2392:2;;;2397:33;;;;;:::i;:::-;2370:99;;;;:::i;:::-;;;;;;:::i;:::-;;2219:66:35;2305:13:36;;2387:82;21201:17:35;2447:21:36;;;;:::i;21201:17:35:-;2387:82:36;;2320:29;;;;2506:27;2320:29;;2506:27;:::i;:::-;2264:18;237:2306;;;;2496:38;1703:838;:::o;14632:509:35:-;;;;14764:27;237:2306:36;;14764:27:35;:::i;:::-;14806:13;14818:1;14839:3;237:2306:36;;14821:16:35;;;;;14898:8;;;;:::i;:::-;;237:2306:36;;15459:2:35;15444:17;;15440:95;;15554:8;;15566:2;237:2306:36;15548:15:35;15554:8;;15709:30;15554:8;;:::i;:::-;237:2306:36;;;;;15554:8:35;237:2306:36;;;;15548:15:35;237:2306:36;15548:20:35;15544:90;;14839:3;15709:30;;:::i;:::-;237:2306:36;;;;:::i;:::-;15753:33:35;;;;:64;;;14839:3;15753:88;;;;;14839:3;15749:145;;237:2306:36;;;14818:1:35;14941:5;;;;;;15105:19;;;;2219:66;15105:19;;;;;:::i;:::-;2219:66;14806:13;;14948:3;14975:10;:20;:10;;;;;:::i;:20::-;;14971:107;;2219:66;;14926:13;;14971:107;15026:33;14818:1;15026:33;237:2306:36;;;12741:34:35;237:2306:36;2219:66:35;-1:-1:-1;9840:51:35;15749:145;15864:19;14818:1;15864:19;;14818:1;15864:19;15753:88;237:2306:36;;;;15821:20:35;15753:88;;:64;15790:27;;;;15753:64;;;15544:90;15595:28;15602:20;:15;15608:8;;;;:::i;15602:15::-;:20;:::i;:::-;237:2306:36;;;;;;15595:28:35;14818:1;15584:39;;;;:::i;:::-;;15544:90;;15440:95;15484:40;14818:1;15484:40;237:2306:36;;;-1:-1:-1;9840:51:35;14821:16;;;;14632:509::o;237:2306:36:-;-1:-1:-1;;237:2306:36;;;;;;;:::o;16130:544:35:-;;16315:1;16331:13;16315:1;16366:3;237:2306:36;;16346:18:35;;;;;16389:47;237:2306:36;16425:10:35;;;;:::i;:::-;237:2306:36;;16389:47:35;;:::i;:::-;16385:94;;16366:3;2219:66;;16331:13;;16385:94;16456:8;;2219:66;16456:8;;:::i;:::-;16385:94;;;;;16346:18;;;16545:1;16518:32;16346:18;237:2306:36;;16518:32:35;:::i;:::-;16564:17;;;;16560:108;;16130:544;;:::o;16560:108::-;16604:53;16315:1;16604:53;237:2306:36;;;;;16315:1:35;16604:53;237:2306:36;;-1:-1:-1;;237:2306:36;;;;;;;:::o;:::-;;;;;;;;;;:::o;:::-;;;;;;;;;;:::o;:::-;;;;;;;;;:::o;:::-;;;;;;;;;;:::o;16897:549:35:-;;17024:1;17040:13;17024:1;17075:3;237:2306:36;;17055:18:35;;;;;17098:39;237:2306:36;17126:10:35;;;;:::i;:::-;237:2306:36;;17098:39:35;;:::i;:::-;17094:86;;17075:3;2219:66;;17040:13;;17094:86;17157:8;;2219:66;17157:8;;:::i;:::-;17094:86;;;;;17055:18;;;237:2306:36;;17329:1:35;237:2306:36;;;;;;;;;17344:17:35;;;17340:100;;16897:549;;:::o;17340:100::-;17384:45;17024:1;17384:45;237:2306:36;;;;;17024:1:35;17384:45;13610:440;13956:31;13610:440;13956:22;13610:440;13828:76;13610:440;237:2306:36;;;13877:25:35;;;237:2306:36;;;;;;13877:25:35;;;;;;;:::i;13956:31::-;237:2306:36;;14025:1:35;237:2306:36;;;;;14012:30:35;237:2306:36;;14012:15:35;:30;:::i;237:2306:36:-;;;;;;;;-1:-1:-1;237:2306:36;;-1:-1:-1;237:2306:36;;;-1:-1:-1;237:2306:36;:::o;18469:677:35:-;;;237:2306:36;;;;;;;;;;;;;;18716:37:35;;;;:82;;;18469:677;18712:125;;;18850:25;;237:2306:36;;;;;18850:53:35;18846:96;;237:2306:36;18994:3:35;237:2306:36;;18971:21:35;;;;;237:2306:36;19017:28:35;;;;:::i;:::-;237:2306:36;;;;;;;;;;;;19017:45:35;19049:13;;;;;:::i;19017:45::-;237:2306:36;;19017:45:35;19013:96;;2219:66;;18956:13;;19013:96;19082:12;;;237:2306:36;19082:12:35;:::o;18971:21::-;;;;2219:66;18469:677;:::o;18846:96::-;18919:12;;237:2306:36;18919:12:35;:::o;18716:82::-;18757:26;;;;;237:2306:36;18757:41:35;;18716:82;;;6145:316:93;237:2306:36;;;;;;;2920:29:93;237:2306:36;;;;;;;;;;;;;;;;2920:29:93;237:2306:36;;;;;;;;;;6281:29:93;237:2306:36;;;;;;;;;;;;;;;;6281:29:93;6313:4;237:2306:36;;;;;;;;735:10:121;237:2306:36;;6336:40:93;;237:2306:36;6336:40:93;;6313:4;6390:11;:::o;6698:317::-;237:2306:36;;;;;;;2920:29:93;237:2306:36;;;;;;;;;;;;;;;;2920:29:93;237:2306:36;;;;;;;;;;;6834:29:93;237:2306:36;;;;;;;;;;;;;;;;6834:29:93;237:2306:36;;;;;;;735:10:121;237:2306:36;;6890:40:93;;237:2306:36;6890:40:93;;237:2306:36;6944:11:93;:::o;14234:174:35:-;237:2306:36;;;;;14358:18:35;237:2306:36;;;14347:53:35;;237:2306:36;;;2612:66:35;237:2306:36;;;;;14347:53:35;;;;;;:::i;:::-;237:2306:36;14337:64:35;;14234:174;:::o;237:2306:36:-;;;;;;;;:::i;:::-;22080:1:35;237:2306:36;;;2219:66:35;237:2306:36;;;2219:66:35;237:2306:36:o;:::-;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;-1:-1:-1;;237:2306:36;;;;:::i;1287:390:37:-;1607:20;:29;1287:390;;;;237:2306:36;1508:2:37;237:2306:36;:::i;:::-;;;;;;;;:::i;:::-;1508:2:37;237:2306:36;;;1508:2:37;237:2306:36;:::i;:::-;-1:-1:-1;;1508:2:37;237:2306:36;;;;2219:66:35;;;1521:63:37;1607:20;:::i;:29::-;1648:21;8593:13;237:2306:36;;8593:13:37;:::i;:::-;237:2306:36;;;8624:13:37;;:33;;;1287:390;8616:42;;;:::i;:::-;8679:26;8689:15;-1:-1:-1;8689:15:37;;:::i;:::-;8679:26;:::i;:::-;8715:18;-1:-1:-1;;237:2306:36;1667:1:37;8901:14;;;;;;1600:70;;;;;;;:::i;8917:6::-;8982:5;9046:37;8998:3;9054:21;:16;9060:9;;8982:5;;8605:1;8982:5;237:2306:36;;;;8982:5:37;8979:9;;8943:59;8979:9;8965:37;8979:9;8973:21;:16;8979:9;;;;;:::i;8973:16::-;237:2306:36;;;;;;8973:21:37;8972:29;237:2306:36;;;;;;8965:37:37;1667:1;8943:59;;;:::i;:::-;;9060:9;:::i;9054:16::-;237:2306:36;;;;9046:37:37;1667:1;9020:63;;8756:1;237:2306:36;;9020:63:37;;:::i;:::-;;237:2306:36;8894:204:37;;8624:33;-1:-1:-1;8641:16:37;8624:33;;237:2306:36;;;;;;;:::i;:::-;-1:-1:-1;237:2306:36;;;;;;;:::o;2457:221:38:-;237:2306:36;;:::i;:::-;;2568:58:38;237:2306:36;;;;;;;;;:::i;:::-;2219:66:35;;2568:58:38;;2643:28;;2219:66:35;2457:221:38;:::o;237:2306:36:-;;;;:::o;7796:439:38:-;237:2306:36;;7883:12:38;;;:30;;;;7796:439;237:2306:36;;;;7957:21:38;;;:::i;:::-;7989:14;8013:192;;;;;;;8215:13;7796:439;:::o;8013:192::-;;;;;;;7796:439;:::o;7883:30::-;7911:2;7899:14;;;;7883:30;;;4170:519;4266:12;;;:::i;:::-;237:2306:36;;;4306:14:38;;;:::i;:::-;2219:66:35;;;:::i;:::-;237:2306:36;;;;;;;:::i;:::-;2219:66:35;;;-1:-1:-1;;237:2306:36;;;:::i;:::-;;-1:-1:-1;237:2306:36;;;;;;4404:11:38;;237:2306:36;4404:41:38;:11;;237:2306:36;4418:27:38;;;:::i;:::-;4404:41;;:::i;:::-;-1:-1:-1;4480:179:38;4500:9;;;;;;4669:13;;;4170:519;:::o;4511:3::-;4632:16;4540:19;;2219:66:35;4540:19:38;;:::i;:::-;237:2306:36;;;:::i;:::-;2219:66:35;;;4585:24:38;237:2306:36;4585:24:38;;2219:66:35;4573:36:38;;;;:::i;:::-;;;;;;:::i;:::-;;4632:16;:::i;:::-;4511:3;2219:66:35;4485:13:38;;;237:2306:36;;;;;:::i;:::-;;;;;;;;;;8413:298:38;8545:2;237:2306:36;;8533:14:38;237:2306:36;;8600:11:38;;237:2306:36;8614:1:38;237:2306:36;;;;;;;8625:56:38;8413:298;:::o;8857:379::-;237:2306:36;;8950:12:38;237:2306:36;;9006:21:38;9202:3;9006:21;;:::i;:::-;9059:14;;;;;;:::i;:::-;9109:61;;;;9202:3;;:::i;237:2306:36:-;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;:::i;:::-;;;:::i;:::-;;-1:-1:-1;;237:2306:36;;;;;;:::i;:::-;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;21954:538:35:-;22070:12;;:::i;:::-;22097:13;22080:1;22092:109;22130:3;237:2306:36;;22112:16:35;;;;;22159:31;2219:66;22181:8;;;;;:::i;:::-;;22159:31;;:::i;:::-;22130:3;2219:66;22097:13;;;22112:16;;;;237:2306:36;;22232:2:35;22215:19;;22211:120;;237:2306:36;22411:74:35;22365:29;237:2306:36;;22365:29:35;:::i;:::-;237:2306:36;22411:74:35;22428:37;22435:29;22441:22;237:2306:36;;22441:22:35;:::i;22428:37::-;237:2306:36;;;22411:74:35;;;;;;;:::i;22211:120::-;22274:36;22281:28;22287:21;22257:63;22287:21;;:::i;22274:36::-;22257:63;237:2306:36;;22257:63:35;;;;;;;:::i;237:2306:36:-;;;15559:2:35;237:2306:36;;;;;;;:::o;:::-;;;;;;;;;;;;;:::o;21363:440:35:-;21471:1;237:2306:36;;21457:15:35;:39;;;21363:440;21453:80;;237:2306:36;;21559:2:35;21546:15;;21542:108;;237:2306:36;21726:70:35;21684:25;237:2306:36;;21684:25:35;:::i;:::-;237:2306:36;21726:70:35;21743:37;21750:29;21756:22;237:2306:36;;21756:22:35;:::i;21542:108::-;21601:32;21608:24;21614:17;21584:55;21614:17;;:::i;21457:39::-;21482:6;21492:4;237:2306:36;21476:13:35;21482:6;;;;:::i;21476:13::-;237:2306:36;21476:20:35;21457:39;;237:2306:36;;;;;;;;;;;;:::o;:::-;;-1:-1:-1;237:2306:36;;;:::o;20174:284:35:-;;237:2306:36;20328:3:35;237:2306:36;;20305:21:35;;;;;237:2306:36;20351:13:35;;;;:::i;:::-;237:2306:36;;;;;;;;;;20351:23:35;20347:73;;2219:66;;20290:13;;20676:282;;237:2306:36;20828:3:35;237:2306:36;;20805:21:35;;;;;237:2306:36;20851:13:35;;;;:::i;:::-;237:2306:36;;;;;20851:23:35;20847:73;;2219:66;;20790:13;;8465:649:37;;;8593:13;237:2306:36;;8593:13:37;:::i;:::-;237:2306:36;;;8624:13:37;;:33;;;8465:649;8616:42;;;:::i;:::-;8679:26;8689:15;;;;:::i;8679:26::-;8715:18;;8747:10;8756:1;8747:10;;;:15;8743:118;;8465:649;-1:-1:-1;;237:2306:36;;;8894:204:37;8901:14;;;;;;8465:649;;;;;:::o;8917:6::-;8982:5;9020:63;8756:1;9046:37;8998:3;9054:21;:16;9060:9;;8982:5;8605:1;8982:5;8943:59;8965:37;8982:5;8973:21;8982:5;8979:9;;8982:5;8973:16;8982:5;237:2306:36;;;;8982:5:37;8979:9;;;:::i;8965:37::-;237:2306:36;;;8943:59:37;;8636:1;8943:59;;;:::i;:::-;;9060:9;;:::i;9046:37::-;8636:1;9020:63;237:2306:36;;9020:63:37;;:::i;:::-;;237:2306:36;8894:204:37;;;;8743:118;8808:10;;237:2306:36;8799:26:37;:21;8805:14;;8808:10;;237:2306:36;;;;8808:10:37;8805:14;;:::i;8799:26::-;237:2306:36;;;8636:1:37;8778:55;;;;:::i;:::-;;-1:-1:-1;;8847:3:37;;;:::i;:::-;8743:118;;;;;8624:33;-1:-1:-1;8641:16:37;;;;8624:33;;2316:5431;;2546:1;2557:33;2546:1;237:2306:36;;:::i;:::-;;;;2689:17:37;2685:223;;2976:13;;2546:1;2971:4724;3009:3;237:2306:36;;2991:16:37;;;;;3091:6;;;;:50;;3009:3;3087:97;;3298:6;:47;;;;3009:3;3294:94;;;3514:17;:8;;;;:::i;:17::-;237:2306:36;;;3565:1:37;3550:16;;3546:4139;3565:1;;;3744:7;3716:46;3744:17;:7;;;:::i;:17::-;3716:46;:::i;:::-;3804:56;3878:28;3804:56;;;;;:::i;:::-;3878:28;;;:::i;:::-;237:2306:36;;-1:-1:-1;3925:994:37;;4937:1185;;;237:2306:36;5015:16:37;237:2306:36;;5015:16:37;:::i;:::-;-1:-1:-1;5007:144:37;;237:2306:36;-1:-1:-1;5173:109:37;;5315:7;5351:18;5315:7;;:::i;5173:109::-;5247:12;;;:::i;4937:1185::-;237:2306:36;;;5494:16:37;237:2306:36;;5494:16:37;:::i;:::-;5489:21;;5485:138;;5650:7;5649:17;5650:16;:7;2219:66:35;5650:7:37;;:::i;:::-;;:16;:::i;:::-;5649:17;;237:2306:36;5649:17:37;5650:7;;;5837;:26;:7;;:::i;:::-;;:26;:::i;:::-;5645:459;;2219:66:35;2976:13:37;;;;;5645:459;6054:7;:27;:7;;:::i;:::-;;5445:11:38;;;237:2306:36;;;5522:62:38;;5341:272;;6054:27:37;5645:459;;;3925:994;237:2306:36;;;;;;4718:16:37;237:2306:36;;;4718:16:37;:::i;:::-;-1:-1:-1;4710:149:37;;4888:12;;:::i;3546:4139::-;6146:17;;;;;;6161:2;6146:17;6161:2;;237:2306:36;;6219:36:37;;6235:20;;6451:17;6386:43;6394:34;6400:27;;;;;:::i;6386:43::-;6451:17;;:::i;:::-;6494:12;6504:2;6494:12;;;6490:146;;6662:33;6682:12;;;;:::i;:::-;;6662:33;:::i;:::-;6682:12;;;237:2306:36;;;;6766:16:37;237:2306:36;;;;6766:16:37;:::i;:::-;6761:21;6757:157;;6947:12;;:::i;6658:555::-;6993:12;6992:22;6993:21;:12;;2219:66:35;6993:12:37;;;;;;;:::i;6992:22::-;6993:12;;;7057:31;:12;;;;:::i;6988:225::-;7158:32;:12;;;;:::i;6215:1388::-;237:2306:36;;;7411:16:37;237:2306:36;;7411:16:37;:::i;:::-;7406:21;7402:135;;7566:8;:18;:8;;:::i;6142:1543::-;237:2306:36;;7641:29:37;;;237:2306:36;7641:29:37;;;237:2306:36;;;;;;;;;;;;;11588:19:35;3298:47:37;3336:8;;3324:21;3336:8;;;;:::i;:::-;;3324:21;:::i;:::-;3308:37;;3298:47;;;3091:50;3113:8;:28;:8;;;;:::i;:28::-;3101:40;;;3091:50;;2685:223;2785:78;;;2777:87;2785:78;;2797:66;2785:78;;;2777:87;:::i;:::-;2885:12;;:::i;3469:281:38:-;;3598:11;;;237:2306:36;3583:27:38;237:2306:36;;3583:27:38;:::i;:::-;237:2306:36;;;;;;;;;;;;;;;;;;;;3723:20:38;3469:281;:::o;4838:321::-;237:2306:36;;4918:13:38;4914:31;;4994:11;868:4;4994:11;;237:2306:36;5015:64:38;237:2306:36;5015:64:38;5093:24;5089:42;;5148:4;4838:321;:::o;4914:31::-;4933:12;237:2306:36;4933:12:38;:::o;9434:424::-;237:2306:36;;9518:13:38;9514:27;;237:2306:36;9597:11:38;;;;237:2306:36;;;9611:27:38;;;:::i;:::-;237:2306:36;;;;;;;;;;;;;;;;;;9697:132:38;;9704:16;;;;;;9839:12;;;9434:424;:::o;9697:132::-;9756:20;;;:::i;:::-;237:2306:36;;;;;;;9811:7:38;9736:40;9811:7;;:::i;:::-;9697:132;;;11485:581;11589:64;237:2306:36;11589:64:38;682:4;11667:26;;682:4;;;11709:8;237:2306:36;11709:8:38;:::o;11663:397::-;776:4;11738:25;;:83;;;;11663:397;11734:326;;;11837:8;11844:1;11837:8;:::o;11734:326::-;868:4;11866:24;;868:4;;;11943:35;;:31;;958:4;11943:31;;;:::i;:::-;:35;:::i;11862:198::-;12016:33;;:29;;958:4;12016:29;237:2306:36;11738:83:38;11768:25;868:4;11768:25;;;:52;;11738:83;11768:52;11797:23;958:4;11797:23;;11738:83;;10045:1263;10171:64;;-1:-1:-1;10171:64:38;;682:4;10249:26;;682:4;;;10291:11;;10301:1;10045:1263;:::o;10245:1032::-;776:4;10323:25;;776:4;;;10374:26;;:30;:26;;:::i;10319:958::-;868:4;10425:24;;868:4;;;10465:385;;;;;;;;;;;;;;;;237:2306:36;:::o;10421:856:38:-;958:4;10870:23;;958:4;;;10919:24;;:28;:24;;:::i;10866:411::-;10978:289;;;;;;;;;;;;;;;;237:2306:36;:::o;1035:2:38:-;;;;;;;;;:::o;12279:770::-;;;12360:8;;12356:21;;12441:16;1035:2;12441:16;;;;;12642:7;12638:405;;12279:770;;;:::o;12638:405::-;12764:24;12772:15;12764:28;12772:15;;:::i;:::-;12764:24;:::i;:::-;:28;:::i;:::-;12806:227;;;;;;;;;;;;12279:770::o;12459:16::-;12491:65;;;;;;1035:2;237:2306:36;;;;;;;12600:17:38;1035:2;237:2306:36;;;;;;;12459:16:38;-1:-1:-1;;237:2306:36;;;;;;12434:194:38;237:2306:36;;:::i;6262:337:38:-;6372:19;237:2306:36;;6372:19:38;:::i;:::-;237:2306:36;;;6405:18:38;6401:37;;6542:11;6470:57;6560:8;6542:11;;237:2306:36;;;6470:57:38;;;;6560:8;;:::i;6401:37::-;6425:13;;:::o;22655:430:35:-;-1:-1:-1;22740:19:35;;22800:8;;;22895:17;;;;:::i;:::-;22922:11;22943:116;22968:5;;;23068:10;;22655:430;:::o;22975:3::-;22998:5;;;:::i;:::-;22994:31;237:2306:36;;;;;-1:-1:-1;22994:31:35;;;;:::i;:::-;;237:2306:36;;22975:3:35;237:2306:36;;;;-1:-1:-1;;237:2306:36;22948:18:35;;;;22793:73;22824:8;;;;:::i;:::-;237:2306:36;22854:1:35;237:2306:36;22793:73:35;;;2419:778:131;237:2306:36;;;2419:778:131;2609:2;2589:22;;2609:2;;3041:25;2825:196;;;;;;;;;;;;;;;-1:-1:-1;2825:196:131;3041:25;;:::i;:::-;3034:32;;;;;:::o;2585:606::-;3097:83;;3113:1;3097:83;3117:35;3097:83;;:::o;10983:270:37:-;237:2306:36;;11094:2:37;11082:14;;11094:2;;;5445:11:38;11094:2:37;5445:11:38;;237:2306:36;;;5522:62:38;;11112:32:37;:::o;11078:169::-;5445:11:38;11094:2:37;5445:11:38;237:2306:36;5522:62:38;237:2306:36;;11094:2:37;11192:43;;237:2306:36;;;11094:2:37;11192:43;;;237:2306:36;11192:43:37;;:::i;7932:335::-;8047:1;237:2306:36;;8035:13:37;8031:56;;8130:11;;237:2306:36;8151:60:37;237:2306:36;8151:60:37;8232:4;8227:9;;7932:335::o;5788:270:38:-;5909:21;5788:270;5909:21;:::i;:::-;5964:65;;5788:270;:::o;9355:729:37:-;;237:2306:36;;9485:13:37;237:2306:36;;9551:3:37;9531:17;:12;9537:5;;;;:::i;9531:17::-;:23;9596:16;;;9628:10;10051:25;9637:1;237:2306:36;9592:434:37;10051:25;:::i;9592:434::-;9702:1;9687:16;;9702:1;;9719:10;10051:25;9702:1;237:2306:36;9683:343:37;10051:25;:::i;9683:343::-;9793:1;9778:16;;9793:1;;9810:10;10051:25;9793:1;9702;9774:252;10051:25;:::i;9774:252::-;9883:1;9868:16;9883:1;;10051:25;9702:1;9924:13;9864:162;10051:25;:::i;10366:320::-;;;237:2306:36;10561:3:37;237:2306:36;;;;;;;;;;10518:24:37;;:41;;;10561:3;10518:41;;;10584:16;237:2306:36;;10584:16:37;;:::i;:::-;237:2306:36;;;10604:5:37;;;;:::i;:::-;237:2306:36;;10584:25:37;;10580:72;;10561:3;;;:::i;:::-;10511:151;;10580:72;10629:8;;;;;:::o;10518:41::-;;;;;;10366:320;:::o;10518:41::-;237:2306:36;;;10546:13:37;;10518:41;;7129:1551:131;;;8209:66;8196:79;;8192:164;;237:2306:36;;;;;;-1:-1:-1;237:2306:36;;;;;;;;;;;;;;;;;;;8467:24:131;;;;;;;;;-1:-1:-1;8467:24:131;237:2306:36;;;8505:20:131;8501:113;;8624:49;-1:-1:-1;8624:49:131;-1:-1:-1;7129:1551:131;:::o;8501:113::-;8541:62;-1:-1:-1;8541:62:131;8467:24;8541:62;-1:-1:-1;8541:62:131;:::o;8467:24::-;237:2306:36;;;;;;;;;8192:164:131;8291:54;;;8307:1;8291:54;8311:30;8291:54;;:::o","linkReferences":{}},"methodIdentifiers":{"DEFAULT_ADMIN_ROLE()":"a217fddf","PROOF_SUBMITTER_ROLE()":"5972185a","getClientState()":"ef913a4b","getConsensusState(uint64)":"edce8bdc","getRoleAdmin(bytes32)":"248a9ca3","grantRole(bytes32,address)":"2f2ff15d","hasRole(bytes32,address)":"91d14854","misbehaviour(bytes)":"ddba6537","renounceRole(bytes32,address)":"36568abe","revokeRole(bytes32,address)":"d547741f","supportsInterface(bytes4)":"01ffc9a7","updateClient(bytes)":"0bece356","verifyMembership((bytes,(uint64,uint64),bytes[],bytes))":"682ed5f0","verifyNonMembership((bytes,(uint64,uint64),bytes[]))":"4d6d9ffb"},"rawMetadata":"{\"compiler\":{\"version\":\"0.8.28+commit.7893614a\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"ibcRouter\",\"type\":\"address\"},{\"internalType\":\"uint64\",\"name\":\"initialTrustedHeight\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"initialTrustedTimestamp\",\"type\":\"uint64\"},{\"internalType\":\"bytes32\",\"name\":\"initialTrustedStorageRoot\",\"type\":\"bytes32\"},{\"internalType\":\"address[]\",\"name\":\"initialTrustedValidators\",\"type\":\"address[]\"},{\"internalType\":\"uint64\",\"name\":\"trustingPeriod\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"maxClockDrift\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"roleManager\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"AccessControlBadConfirmation\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"internalType\":\"bytes32\",\"name\":\"neededRole\",\"type\":\"bytes32\"}],\"name\":\"AccessControlUnauthorizedAccount\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"revisionHeight\",\"type\":\"uint64\"}],\"name\":\"ConflictingConsensusState\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"trustedTimestamp\",\"type\":\"uint64\"},{\"internalType\":\"uint256\",\"name\":\"currentTimestamp\",\"type\":\"uint256\"},{\"internalType\":\"uint64\",\"name\":\"trustingPeriod\",\"type\":\"uint64\"}],\"name\":\"ConsensusStateExpired\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"revisionHeight\",\"type\":\"uint64\"}],\"name\":\"ConsensusStateNotFound\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"signer\",\"type\":\"address\"}],\"name\":\"DuplicateCommitSealSigner\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"validator\",\"type\":\"address\"}],\"name\":\"DuplicateValidator\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"EmptyValidatorSet\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"currentTimestamp\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"headerTimestamp\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxClockDrift\",\"type\":\"uint256\"}],\"name\":\"HeaderFromFuture\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"actual\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"required\",\"type\":\"uint256\"}],\"name\":\"InsufficientTrustedValidatorOverlap\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"actual\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"required\",\"type\":\"uint256\"}],\"name\":\"InsufficientValidatorQuorum\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidCommitSeal\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"expectedValue\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"actualValue\",\"type\":\"bytes32\"}],\"name\":\"InvalidCommitmentValue\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"actualDifficulty\",\"type\":\"uint256\"}],\"name\":\"InvalidDifficulty\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"length\",\"type\":\"uint256\"}],\"name\":\"InvalidECDSASignatureLength\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"itemsLength\",\"type\":\"uint256\"}],\"name\":\"InvalidExtraDataFormat\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"itemsLength\",\"type\":\"uint256\"}],\"name\":\"InvalidHeaderFormat\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidHeaderHeight\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"actualMixHash\",\"type\":\"bytes32\"}],\"name\":\"InvalidMixHash\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"actualNonce\",\"type\":\"bytes\"}],\"name\":\"InvalidNonce\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"actualOmmersHash\",\"type\":\"bytes32\"}],\"name\":\"InvalidOmmersHash\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"expectedLength\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"actualLength\",\"type\":\"uint256\"}],\"name\":\"InvalidPathLength\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"providedRevisionNumber\",\"type\":\"uint64\"}],\"name\":\"InvalidRevisionNumber\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"validator\",\"type\":\"address\"}],\"name\":\"InvalidValidatorAddress\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"length\",\"type\":\"uint256\"}],\"name\":\"InvalidValidatorAddressLength\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"expectedLength\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"actualLength\",\"type\":\"uint256\"}],\"name\":\"InvalidValueLength\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"UnsupportedMisbehaviour\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"actualValue\",\"type\":\"bytes32\"}],\"name\":\"ValueExists\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"previousAdminRole\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"newAdminRole\",\"type\":\"bytes32\"}],\"name\":\"RoleAdminChanged\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"RoleGranted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"RoleRevoked\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"DEFAULT_ADMIN_ROLE\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"PROOF_SUBMITTER_ROLE\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getClientState\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"revisionHeight\",\"type\":\"uint64\"}],\"name\":\"getConsensusState\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"}],\"name\":\"getRoleAdmin\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"grantRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"hasRole\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"name\":\"misbehaviour\",\"outputs\":[],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"callerConfirmation\",\"type\":\"address\"}],\"name\":\"renounceRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"revokeRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes4\",\"name\":\"interfaceId\",\"type\":\"bytes4\"}],\"name\":\"supportsInterface\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"updateMsg\",\"type\":\"bytes\"}],\"name\":\"updateClient\",\"outputs\":[{\"internalType\":\"enum ILightClientMsgs.UpdateResult\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes\",\"name\":\"proof\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"uint64\",\"name\":\"revisionNumber\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"revisionHeight\",\"type\":\"uint64\"}],\"internalType\":\"struct IICS02ClientMsgs.Height\",\"name\":\"proofHeight\",\"type\":\"tuple\"},{\"internalType\":\"bytes[]\",\"name\":\"path\",\"type\":\"bytes[]\"},{\"internalType\":\"bytes\",\"name\":\"value\",\"type\":\"bytes\"}],\"internalType\":\"struct ILightClientMsgs.MsgVerifyMembership\",\"name\":\"msg_\",\"type\":\"tuple\"}],\"name\":\"verifyMembership\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes\",\"name\":\"proof\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"uint64\",\"name\":\"revisionNumber\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"revisionHeight\",\"type\":\"uint64\"}],\"internalType\":\"struct IICS02ClientMsgs.Height\",\"name\":\"proofHeight\",\"type\":\"tuple\"},{\"internalType\":\"bytes[]\",\"name\":\"path\",\"type\":\"bytes[]\"}],\"internalType\":\"struct ILightClientMsgs.MsgVerifyNonMembership\",\"name\":\"msg_\",\"type\":\"tuple\"}],\"name\":\"verifyNonMembership\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"errors\":{\"AccessControlBadConfirmation()\":[{\"details\":\"The caller of a function is not the expected one. NOTE: Don't confuse with {AccessControlUnauthorizedAccount}.\"}],\"AccessControlUnauthorizedAccount(address,bytes32)\":[{\"details\":\"The `account` is missing a role.\"}],\"ConflictingConsensusState(uint64)\":[{\"params\":{\"revisionHeight\":\"The conflicting revision height.\"}}],\"ConsensusStateExpired(uint64,uint256,uint64)\":[{\"params\":{\"currentTimestamp\":\"The current block timestamp.\",\"trustedTimestamp\":\"Timestamp of the trusted consensus state.\",\"trustingPeriod\":\"The configured trusting period.\"}}],\"ConsensusStateNotFound(uint64)\":[{\"params\":{\"revisionHeight\":\"The requested revision height.\"}}],\"DuplicateCommitSealSigner(address)\":[{\"params\":{\"signer\":\"The duplicate signer address.\"}}],\"DuplicateValidator(address)\":[{\"params\":{\"validator\":\"The duplicate validator address.\"}}],\"HeaderFromFuture(uint256,uint256,uint256)\":[{\"params\":{\"currentTimestamp\":\"The current block timestamp.\",\"headerTimestamp\":\"The submitted header timestamp.\",\"maxClockDrift\":\"The configured maximum clock drift.\"}}],\"InsufficientTrustedValidatorOverlap(uint256,uint256)\":[{\"params\":{\"actual\":\"The number of trusted validators that signed.\",\"required\":\"The minimum required trusted signer count.\"}}],\"InsufficientValidatorQuorum(uint256,uint256)\":[{\"params\":{\"actual\":\"The number of new validators that signed.\",\"required\":\"The minimum required signer count.\"}}],\"InvalidCommitmentValue(bytes32,bytes32)\":[{\"params\":{\"actualValue\":\"The proven commitment value.\",\"expectedValue\":\"The expected commitment value.\"}}],\"InvalidDifficulty(uint256)\":[{\"params\":{\"actualDifficulty\":\"The difficulty found in the header.\"}}],\"InvalidECDSASignatureLength(uint256)\":[{\"params\":{\"length\":\"The invalid signature length.\"}}],\"InvalidExtraDataFormat(uint256)\":[{\"params\":{\"itemsLength\":\"The decoded `extraData` item count.\"}}],\"InvalidHeaderFormat(uint256)\":[{\"params\":{\"itemsLength\":\"The decoded header item count.\"}}],\"InvalidMixHash(bytes32)\":[{\"params\":{\"actualMixHash\":\"The mix hash found in the header.\"}}],\"InvalidNonce(bytes)\":[{\"params\":{\"actualNonce\":\"The nonce found in the header.\"}}],\"InvalidOmmersHash(bytes32)\":[{\"params\":{\"actualOmmersHash\":\"The ommers hash found in the header.\"}}],\"InvalidPathLength(uint256,uint256)\":[{\"params\":{\"actualLength\":\"The actual path length.\",\"expectedLength\":\"The expected path length.\"}}],\"InvalidRevisionNumber(uint64)\":[{\"params\":{\"providedRevisionNumber\":\"The non-zero revision number.\"}}],\"InvalidValidatorAddress(address)\":[{\"params\":{\"validator\":\"The invalid validator address.\"}}],\"InvalidValidatorAddressLength(uint256)\":[{\"params\":{\"length\":\"The decoded validator address length.\"}}],\"InvalidValueLength(uint256,uint256)\":[{\"params\":{\"actualLength\":\"The actual value length.\",\"expectedLength\":\"The expected value length.\"}}],\"ValueExists(bytes32)\":[{\"params\":{\"actualValue\":\"The value found at the proven storage slot.\"}}]},\"events\":{\"RoleAdminChanged(bytes32,bytes32,bytes32)\":{\"details\":\"Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite {RoleAdminChanged} not being emitted to signal this.\"},\"RoleGranted(bytes32,address,address)\":{\"details\":\"Emitted when `account` is granted `role`. `sender` is the account that originated the contract call. This account bears the admin role (for the granted role). Expected in cases where the role was granted using the internal {AccessControl-_grantRole}.\"},\"RoleRevoked(bytes32,address,address)\":{\"details\":\"Emitted when `account` is revoked `role`. `sender` is the account that originated the contract call: - if using `revokeRole`, it is the admin role bearer - if using `renounceRole`, it is the role bearer (i.e. `account`)\"}},\"kind\":\"dev\",\"methods\":{\"constructor\":{\"params\":{\"ibcRouter\":\"Counterparty ICS26 router address whose storage is proven.\",\"initialTrustedHeight\":\"Initial trusted Besu height.\",\"initialTrustedStorageRoot\":\"Initial trusted storage root of `ibcRouter`.\",\"initialTrustedTimestamp\":\"Initial trusted header timestamp in seconds.\",\"initialTrustedValidators\":\"Initial trusted validator set.\",\"maxClockDrift\":\"Maximum allowed future drift in seconds for submitted headers.\",\"roleManager\":\"Address that administers proof submission; if zero, proof submission is open.\",\"trustingPeriod\":\"Maximum age in seconds for trusted consensus states.\"}},\"getClientState()\":{\"returns\":{\"_0\":\"The client state.\"}},\"getConsensusState(uint64)\":{\"params\":{\"revisionHeight\":\"The revision height to query.\"},\"returns\":{\"_0\":\"The ABI-encoded consensus state.\"}},\"getRoleAdmin(bytes32)\":{\"details\":\"Returns the admin role that controls `role`. See {grantRole} and {revokeRole}. To change a role's admin, use {_setRoleAdmin}.\"},\"grantRole(bytes32,address)\":{\"details\":\"Grants `role` to `account`. If `account` had not been already granted `role`, emits a {RoleGranted} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleGranted} event.\"},\"hasRole(bytes32,address)\":{\"details\":\"Returns `true` if `account` has been granted `role`.\"},\"misbehaviour(bytes)\":{\"params\":{\"misbehaviourMsg\":\"The misbehaviour message\"}},\"renounceRole(bytes32,address)\":{\"details\":\"Revokes `role` from the calling account. Roles are often managed via {grantRole} and {revokeRole}: this function's purpose is to provide a mechanism for accounts to lose their privileges if they are compromised (such as when a trusted device is misplaced). If the calling account had been revoked `role`, emits a {RoleRevoked} event. Requirements: - the caller must be `callerConfirmation`. May emit a {RoleRevoked} event.\"},\"revokeRole(bytes32,address)\":{\"details\":\"Revokes `role` from `account`. If `account` had been granted `role`, emits a {RoleRevoked} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleRevoked} event.\"},\"supportsInterface(bytes4)\":{\"details\":\"Returns true if this contract implements the interface defined by `interfaceId`. See the corresponding https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[ERC section] to learn more about how these ids are created. This function call must use less than 30 000 gas.\"},\"updateClient(bytes)\":{\"params\":{\"updateMsg\":\"The encoded update message e.g., an SP1 proof.\"},\"returns\":{\"_0\":\"The result of the update operation\"}},\"verifyMembership((bytes,(uint64,uint64),bytes[],bytes))\":{\"details\":\"Notice that this message is not view, as it may update the client state for caching purposes.\",\"params\":{\"msg_\":\"The membership message\"},\"returns\":{\"_0\":\"The unix timestamp of the verification height in the counterparty chain in seconds.\"}},\"verifyNonMembership((bytes,(uint64,uint64),bytes[]))\":{\"details\":\"Notice that this message is not view, as it may update the client state for caching purposes.\",\"params\":{\"msg_\":\"The membership message\"},\"returns\":{\"_0\":\"The unix timestamp of the verification height in the counterparty chain in seconds.\"}}},\"title\":\"Besu QBFT Light Client\",\"version\":1},\"userdoc\":{\"errors\":{\"ConflictingConsensusState(uint64)\":[{\"notice\":\"A different consensus state already exists at the submitted height.\"}],\"ConsensusStateExpired(uint64,uint256,uint64)\":[{\"notice\":\"The trusted consensus state is outside the trusting period.\"}],\"ConsensusStateNotFound(uint64)\":[{\"notice\":\"No consensus state exists for the requested height.\"}],\"DuplicateCommitSealSigner(address)\":[{\"notice\":\"A commit seal signer appears more than once.\"}],\"DuplicateValidator(address)\":[{\"notice\":\"A validator appears more than once.\"}],\"EmptyValidatorSet()\":[{\"notice\":\"The validator set is empty.\"}],\"HeaderFromFuture(uint256,uint256,uint256)\":[{\"notice\":\"The submitted header timestamp is too far in the future.\"}],\"InsufficientTrustedValidatorOverlap(uint256,uint256)\":[{\"notice\":\"The submitted signers do not overlap enough with the trusted validator set.\"}],\"InsufficientValidatorQuorum(uint256,uint256)\":[{\"notice\":\"The submitted signers do not meet quorum for the new validator set.\"}],\"InvalidCommitSeal()\":[{\"notice\":\"A commit seal did not recover a valid signer.\"}],\"InvalidCommitmentValue(bytes32,bytes32)\":[{\"notice\":\"A proven commitment value does not match the expected value.\"}],\"InvalidDifficulty(uint256)\":[{\"notice\":\"The Besu BFT difficulty is invalid.\"}],\"InvalidECDSASignatureLength(uint256)\":[{\"notice\":\"An ECDSA signature has an invalid length.\"}],\"InvalidExtraDataFormat(uint256)\":[{\"notice\":\"The submitted `extraData` field has an invalid RLP item count.\"}],\"InvalidHeaderFormat(uint256)\":[{\"notice\":\"The submitted header has an invalid RLP item count.\"}],\"InvalidHeaderHeight()\":[{\"notice\":\"The submitted header height is zero.\"}],\"InvalidMixHash(bytes32)\":[{\"notice\":\"The Besu BFT mix hash is invalid.\"}],\"InvalidNonce(bytes)\":[{\"notice\":\"The Besu BFT nonce is invalid.\"}],\"InvalidOmmersHash(bytes32)\":[{\"notice\":\"The ommers hash is invalid.\"}],\"InvalidPathLength(uint256,uint256)\":[{\"notice\":\"A proof path has an invalid length.\"}],\"InvalidRevisionNumber(uint64)\":[{\"notice\":\"The revision number must be zero for Besu light client heights.\"}],\"InvalidValidatorAddress(address)\":[{\"notice\":\"A validator address is invalid.\"}],\"InvalidValidatorAddressLength(uint256)\":[{\"notice\":\"A validator address has an invalid byte length.\"}],\"InvalidValueLength(uint256,uint256)\":[{\"notice\":\"A membership value has an invalid length.\"}],\"UnsupportedMisbehaviour()\":[{\"notice\":\"Misbehaviour handling is not supported by this client.\"}],\"ValueExists(bytes32)\":[{\"notice\":\"A non-membership proof found an existing value.\"}]},\"kind\":\"user\",\"methods\":{\"PROOF_SUBMITTER_ROLE()\":{\"notice\":\"Role allowed to submit client updates and proof verifications.\"},\"constructor\":{\"notice\":\"Creates a Besu QBFT light client from an initial trusted consensus state.\"},\"getClientState()\":{\"notice\":\"Returns the client state.\"},\"getConsensusState(uint64)\":{\"notice\":\"Returns the encoded consensus state for a revision height.\"},\"misbehaviour(bytes)\":{\"notice\":\"Misbehaviour handling, moves the light client to the frozen state if misbehaviour is detected\"},\"updateClient(bytes)\":{\"notice\":\"Updating the client and consensus state\"},\"verifyMembership((bytes,(uint64,uint64),bytes[],bytes))\":{\"notice\":\"Querying the membership of a key-value pair\"},\"verifyNonMembership((bytes,(uint64,uint64),bytes[]))\":{\"notice\":\"Querying the non-membership of a key\"}},\"notice\":\"Verifies Besu QBFT headers and ICS26 router storage proofs.\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/light-clients/besu/BesuQBFTLightClient.sol\":\"BesuQBFTLightClient\"},\"evmVersion\":\"cancun\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"none\"},\"optimizer\":{\"enabled\":true,\"runs\":10000},\"remappings\":[\":@openzeppelin-contracts/=node_modules/@openzeppelin/contracts/\",\":@openzeppelin-upgradeable/=node_modules/@openzeppelin/contracts-upgradeable/\",\":@openzeppelin/=node_modules/@openzeppelin/\",\":@sp1-contracts/=node_modules/sp1-contracts/contracts/src/\",\":@uniswap/permit2/=node_modules/@uniswap/permit2/\",\":forge-std/=node_modules/forge-std/src/\",\":sp1-contracts/=node_modules/sp1-contracts/\"],\"viaIR\":true},\"sources\":{\"contracts/interfaces/ILightClient.sol\":{\"keccak256\":\"0x3b2361546ee834a442d844c979fbad3458ee13146b093f585587a09e19a266af\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://5b5d53101bb598f14a79cb1092479736fa18e8f84945ea6ef80f4dac84466042\",\"dweb:/ipfs/QmaTCo6M3Z9aYCSX65AQtixo1sB4ymQUDAgTXSKHqJHGDh\"]},\"contracts/light-clients/besu/BesuLightClientBase.sol\":{\"keccak256\":\"0xc6e53bf0a6dc8d40d819e2f735bbae57c97454974d622901eb2361143b388529\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://c1c65ba0c1b91751f62c769a6d892371cc8af598116217643acab4a3ce470435\",\"dweb:/ipfs/Qmf1pqQC7iELqiKnSyjAPsTFYFsyWzxHez7FLjs8jax7Km\"]},\"contracts/light-clients/besu/BesuQBFTLightClient.sol\":{\"keccak256\":\"0xaeb51b2596e5959273edc43f9db73effe6c8f0f05bdedda140db66e2dfdd0fea\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://28beb01f795950c145576718eb64a4c65948c5c04db20d9b9105d416ada277b4\",\"dweb:/ipfs/Qmb2CjEjmrF8pFj4eo9mCfRA2VWCVQ5H1F81DA9sBtvaVA\"]},\"contracts/light-clients/besu/MPTProof.sol\":{\"keccak256\":\"0x9ab26e6445b20541e8725b190006444d3b16eb3e021174e280451f934d9535c6\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://b6f3fd58b06b942a454bb9b21e9be40a2dab8a09f78e75ff4357c8afbc7e2d5b\",\"dweb:/ipfs/QmPeUwNScDiU91Xx4UQduYjyCPALYLPq73ZUMEn8Nr1rTG\"]},\"contracts/light-clients/besu/RLPReader.sol\":{\"keccak256\":\"0xa64ad17e6da7fed2bd206df52189286694339a8061dc5d158e717eda982af1d9\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://7020db2fe854e90e1b791e0e587610fc26bed3073ba1811faa275a1d8bf3c2c7\",\"dweb:/ipfs/QmdXdKghNFZSX7N9qD6BsKuJQdrFoqatsVWvHRL7vJCmeP\"]},\"contracts/light-clients/besu/errors/IBesuLightClientErrors.sol\":{\"keccak256\":\"0xfb8d8e28c81a48e1165b9d9e69406208fbb0ced1b30d9ef3293112562ffbb448\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://0d3d314a005ada41d997a6e5b254ebd70066c3ccd2e6306249c258c4a13c3623\",\"dweb:/ipfs/QmbRH23Vh7Xp1eXQmfnafMyTebuihQTLfRYeq6BbGJfYnY\"]},\"contracts/light-clients/besu/msgs/IBesuLightClientMsgs.sol\":{\"keccak256\":\"0x3fc43a3daaae2f89dca4cadbc99ea71086282f987b47a95c13489ae3384532cf\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://36083aa6833eb30d26023f7dc0b2e22b7d0723d922fcd50cf86999edc9aeb474\",\"dweb:/ipfs/QmbPv9KJj5AuJkgppuyuoaTHtiw91Qkx1tdkf1R5D4wad2\"]},\"contracts/msgs/IICS02ClientMsgs.sol\":{\"keccak256\":\"0x03d1265eae327c3744d774bf22a30d845233d50664921c9aa57cef2d71fd89d2\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://89900781cc5c60540a237d92d42745ea6165765ee8fb4d50e8137a717195cc75\",\"dweb:/ipfs/Qmbx5p8gZ8sEMMeZytXsLee49JUayhAaoJ2yxX93WUrvQo\"]},\"contracts/msgs/ILightClientMsgs.sol\":{\"keccak256\":\"0x8d1e56ab166a7b4aa6999708e3214a4645ebbc3835c2b2a4c255c9923eebafde\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://8bd4200dc04d950c0f050623fa9a8accdbec877fd446c039d4dd6c678bdf1513\",\"dweb:/ipfs/QmZQTViaA7N6BVNDzJ1Z6w799PrPoE4ajPueZSPwX4sGZ9\"]},\"node_modules/@openzeppelin/contracts/access/AccessControl.sol\":{\"keccak256\":\"0x4686ec784d75f95beaf2bf5b5f26e5f946d4c864aaee9c3c62bdc18381f5e017\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://26710ca191913f3c9df542079c4a6dcff02968e92d4f7357daefef9fbe72a19c\",\"dweb:/ipfs/QmanHbeWuBbVEqXySHa1zhm2rExjYpChDBubBaJNTCa2JB\"]},\"node_modules/@openzeppelin/contracts/access/IAccessControl.sol\":{\"keccak256\":\"0xbff9f59c84e5337689161ce7641c0ef8e872d6a7536fbc1f5133f128887aba3c\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://b308f882e796f7b79c9502deacb0a62983035c6f6f4e962b319ba6a1f4a77d3d\",\"dweb:/ipfs/QmaWCW7ahEQqFjwhSUhV7Ae7WhfNvzSpE7DQ58hvEooqPL\"]},\"node_modules/@openzeppelin/contracts/utils/Context.sol\":{\"keccak256\":\"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://6a708e8a5bdb1011c2c381c9a5cfd8a9a956d7d0a9dc1bd8bcdaf52f76ef2f12\",\"dweb:/ipfs/Qmax9WHBnVsZP46ZxEMNRQpLQnrdE4dK8LehML1Py8FowF\"]},\"node_modules/@openzeppelin/contracts/utils/cryptography/ECDSA.sol\":{\"keccak256\":\"0xbeb5cad8aaabe0d35d2ec1a8414d91e81e5a8ca679add4cf57e2f33476861f40\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://ebb272a5ee2da4e8bd5551334e0ce8dce4e9c56a04570d6bf046d260fab3116a\",\"dweb:/ipfs/QmNw6RyM769qcqFocDq6HJMG2WiEnQbvizpRaUXsACHho2\"]},\"node_modules/@openzeppelin/contracts/utils/introspection/ERC165.sol\":{\"keccak256\":\"0x2d9dc2fe26180f74c11c13663647d38e259e45f95eb88f57b61d2160b0109d3e\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://81233d1f98060113d9922180bb0f14f8335856fe9f339134b09335e9f678c377\",\"dweb:/ipfs/QmWh6R35SarhAn4z2wH8SU456jJSYL2FgucfTFgbHJJN4E\"]},\"node_modules/@openzeppelin/contracts/utils/introspection/IERC165.sol\":{\"keccak256\":\"0x8891738ffe910f0cf2da09566928589bf5d63f4524dd734fd9cedbac3274dd5c\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://971f954442df5c2ef5b5ebf1eb245d7105d9fbacc7386ee5c796df1d45b21617\",\"dweb:/ipfs/QmadRjHbkicwqwwh61raUEapaVEtaLMcYbQZWs9gUkgj3u\"]}},\"version\":1}","metadata":{"compiler":{"version":"0.8.28+commit.7893614a"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"address","name":"ibcRouter","type":"address"},{"internalType":"uint64","name":"initialTrustedHeight","type":"uint64"},{"internalType":"uint64","name":"initialTrustedTimestamp","type":"uint64"},{"internalType":"bytes32","name":"initialTrustedStorageRoot","type":"bytes32"},{"internalType":"address[]","name":"initialTrustedValidators","type":"address[]"},{"internalType":"uint64","name":"trustingPeriod","type":"uint64"},{"internalType":"uint64","name":"maxClockDrift","type":"uint64"},{"internalType":"address","name":"roleManager","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"type":"error","name":"AccessControlBadConfirmation"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bytes32","name":"neededRole","type":"bytes32"}],"type":"error","name":"AccessControlUnauthorizedAccount"},{"inputs":[{"internalType":"uint64","name":"revisionHeight","type":"uint64"}],"type":"error","name":"ConflictingConsensusState"},{"inputs":[{"internalType":"uint64","name":"trustedTimestamp","type":"uint64"},{"internalType":"uint256","name":"currentTimestamp","type":"uint256"},{"internalType":"uint64","name":"trustingPeriod","type":"uint64"}],"type":"error","name":"ConsensusStateExpired"},{"inputs":[{"internalType":"uint64","name":"revisionHeight","type":"uint64"}],"type":"error","name":"ConsensusStateNotFound"},{"inputs":[{"internalType":"address","name":"signer","type":"address"}],"type":"error","name":"DuplicateCommitSealSigner"},{"inputs":[{"internalType":"address","name":"validator","type":"address"}],"type":"error","name":"DuplicateValidator"},{"inputs":[],"type":"error","name":"EmptyValidatorSet"},{"inputs":[{"internalType":"uint256","name":"currentTimestamp","type":"uint256"},{"internalType":"uint256","name":"headerTimestamp","type":"uint256"},{"internalType":"uint256","name":"maxClockDrift","type":"uint256"}],"type":"error","name":"HeaderFromFuture"},{"inputs":[{"internalType":"uint256","name":"actual","type":"uint256"},{"internalType":"uint256","name":"required","type":"uint256"}],"type":"error","name":"InsufficientTrustedValidatorOverlap"},{"inputs":[{"internalType":"uint256","name":"actual","type":"uint256"},{"internalType":"uint256","name":"required","type":"uint256"}],"type":"error","name":"InsufficientValidatorQuorum"},{"inputs":[],"type":"error","name":"InvalidCommitSeal"},{"inputs":[{"internalType":"bytes32","name":"expectedValue","type":"bytes32"},{"internalType":"bytes32","name":"actualValue","type":"bytes32"}],"type":"error","name":"InvalidCommitmentValue"},{"inputs":[{"internalType":"uint256","name":"actualDifficulty","type":"uint256"}],"type":"error","name":"InvalidDifficulty"},{"inputs":[{"internalType":"uint256","name":"length","type":"uint256"}],"type":"error","name":"InvalidECDSASignatureLength"},{"inputs":[{"internalType":"uint256","name":"itemsLength","type":"uint256"}],"type":"error","name":"InvalidExtraDataFormat"},{"inputs":[{"internalType":"uint256","name":"itemsLength","type":"uint256"}],"type":"error","name":"InvalidHeaderFormat"},{"inputs":[],"type":"error","name":"InvalidHeaderHeight"},{"inputs":[{"internalType":"bytes32","name":"actualMixHash","type":"bytes32"}],"type":"error","name":"InvalidMixHash"},{"inputs":[{"internalType":"bytes","name":"actualNonce","type":"bytes"}],"type":"error","name":"InvalidNonce"},{"inputs":[{"internalType":"bytes32","name":"actualOmmersHash","type":"bytes32"}],"type":"error","name":"InvalidOmmersHash"},{"inputs":[{"internalType":"uint256","name":"expectedLength","type":"uint256"},{"internalType":"uint256","name":"actualLength","type":"uint256"}],"type":"error","name":"InvalidPathLength"},{"inputs":[{"internalType":"uint64","name":"providedRevisionNumber","type":"uint64"}],"type":"error","name":"InvalidRevisionNumber"},{"inputs":[{"internalType":"address","name":"validator","type":"address"}],"type":"error","name":"InvalidValidatorAddress"},{"inputs":[{"internalType":"uint256","name":"length","type":"uint256"}],"type":"error","name":"InvalidValidatorAddressLength"},{"inputs":[{"internalType":"uint256","name":"expectedLength","type":"uint256"},{"internalType":"uint256","name":"actualLength","type":"uint256"}],"type":"error","name":"InvalidValueLength"},{"inputs":[],"type":"error","name":"UnsupportedMisbehaviour"},{"inputs":[{"internalType":"bytes32","name":"actualValue","type":"bytes32"}],"type":"error","name":"ValueExists"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32","indexed":true},{"internalType":"bytes32","name":"previousAdminRole","type":"bytes32","indexed":true},{"internalType":"bytes32","name":"newAdminRole","type":"bytes32","indexed":true}],"type":"event","name":"RoleAdminChanged","anonymous":false},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32","indexed":true},{"internalType":"address","name":"account","type":"address","indexed":true},{"internalType":"address","name":"sender","type":"address","indexed":true}],"type":"event","name":"RoleGranted","anonymous":false},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32","indexed":true},{"internalType":"address","name":"account","type":"address","indexed":true},{"internalType":"address","name":"sender","type":"address","indexed":true}],"type":"event","name":"RoleRevoked","anonymous":false},{"inputs":[],"stateMutability":"view","type":"function","name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"PROOF_SUBMITTER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"getClientState","outputs":[{"internalType":"bytes","name":"","type":"bytes"}]},{"inputs":[{"internalType":"uint64","name":"revisionHeight","type":"uint64"}],"stateMutability":"view","type":"function","name":"getConsensusState","outputs":[{"internalType":"bytes","name":"","type":"bytes"}]},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"stateMutability":"view","type":"function","name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}]},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"stateMutability":"nonpayable","type":"function","name":"grantRole"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"stateMutability":"view","type":"function","name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}]},{"inputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function","name":"misbehaviour"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"callerConfirmation","type":"address"}],"stateMutability":"nonpayable","type":"function","name":"renounceRole"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"stateMutability":"nonpayable","type":"function","name":"revokeRole"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"stateMutability":"view","type":"function","name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}]},{"inputs":[{"internalType":"bytes","name":"updateMsg","type":"bytes"}],"stateMutability":"nonpayable","type":"function","name":"updateClient","outputs":[{"internalType":"enum ILightClientMsgs.UpdateResult","name":"","type":"uint8"}]},{"inputs":[{"internalType":"struct ILightClientMsgs.MsgVerifyMembership","name":"msg_","type":"tuple","components":[{"internalType":"bytes","name":"proof","type":"bytes"},{"internalType":"struct IICS02ClientMsgs.Height","name":"proofHeight","type":"tuple","components":[{"internalType":"uint64","name":"revisionNumber","type":"uint64"},{"internalType":"uint64","name":"revisionHeight","type":"uint64"}]},{"internalType":"bytes[]","name":"path","type":"bytes[]"},{"internalType":"bytes","name":"value","type":"bytes"}]}],"stateMutability":"view","type":"function","name":"verifyMembership","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[{"internalType":"struct ILightClientMsgs.MsgVerifyNonMembership","name":"msg_","type":"tuple","components":[{"internalType":"bytes","name":"proof","type":"bytes"},{"internalType":"struct IICS02ClientMsgs.Height","name":"proofHeight","type":"tuple","components":[{"internalType":"uint64","name":"revisionNumber","type":"uint64"},{"internalType":"uint64","name":"revisionHeight","type":"uint64"}]},{"internalType":"bytes[]","name":"path","type":"bytes[]"}]}],"stateMutability":"view","type":"function","name":"verifyNonMembership","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]}],"devdoc":{"kind":"dev","methods":{"constructor":{"params":{"ibcRouter":"Counterparty ICS26 router address whose storage is proven.","initialTrustedHeight":"Initial trusted Besu height.","initialTrustedStorageRoot":"Initial trusted storage root of `ibcRouter`.","initialTrustedTimestamp":"Initial trusted header timestamp in seconds.","initialTrustedValidators":"Initial trusted validator set.","maxClockDrift":"Maximum allowed future drift in seconds for submitted headers.","roleManager":"Address that administers proof submission; if zero, proof submission is open.","trustingPeriod":"Maximum age in seconds for trusted consensus states."}},"getClientState()":{"returns":{"_0":"The client state."}},"getConsensusState(uint64)":{"params":{"revisionHeight":"The revision height to query."},"returns":{"_0":"The ABI-encoded consensus state."}},"getRoleAdmin(bytes32)":{"details":"Returns the admin role that controls `role`. See {grantRole} and {revokeRole}. To change a role's admin, use {_setRoleAdmin}."},"grantRole(bytes32,address)":{"details":"Grants `role` to `account`. If `account` had not been already granted `role`, emits a {RoleGranted} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleGranted} event."},"hasRole(bytes32,address)":{"details":"Returns `true` if `account` has been granted `role`."},"misbehaviour(bytes)":{"params":{"misbehaviourMsg":"The misbehaviour message"}},"renounceRole(bytes32,address)":{"details":"Revokes `role` from the calling account. Roles are often managed via {grantRole} and {revokeRole}: this function's purpose is to provide a mechanism for accounts to lose their privileges if they are compromised (such as when a trusted device is misplaced). If the calling account had been revoked `role`, emits a {RoleRevoked} event. Requirements: - the caller must be `callerConfirmation`. May emit a {RoleRevoked} event."},"revokeRole(bytes32,address)":{"details":"Revokes `role` from `account`. If `account` had been granted `role`, emits a {RoleRevoked} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleRevoked} event."},"supportsInterface(bytes4)":{"details":"Returns true if this contract implements the interface defined by `interfaceId`. See the corresponding https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[ERC section] to learn more about how these ids are created. This function call must use less than 30 000 gas."},"updateClient(bytes)":{"params":{"updateMsg":"The encoded update message e.g., an SP1 proof."},"returns":{"_0":"The result of the update operation"}},"verifyMembership((bytes,(uint64,uint64),bytes[],bytes))":{"details":"Notice that this message is not view, as it may update the client state for caching purposes.","params":{"msg_":"The membership message"},"returns":{"_0":"The unix timestamp of the verification height in the counterparty chain in seconds."}},"verifyNonMembership((bytes,(uint64,uint64),bytes[]))":{"details":"Notice that this message is not view, as it may update the client state for caching purposes.","params":{"msg_":"The membership message"},"returns":{"_0":"The unix timestamp of the verification height in the counterparty chain in seconds."}}},"version":1},"userdoc":{"kind":"user","methods":{"PROOF_SUBMITTER_ROLE()":{"notice":"Role allowed to submit client updates and proof verifications."},"constructor":{"notice":"Creates a Besu QBFT light client from an initial trusted consensus state."},"getClientState()":{"notice":"Returns the client state."},"getConsensusState(uint64)":{"notice":"Returns the encoded consensus state for a revision height."},"misbehaviour(bytes)":{"notice":"Misbehaviour handling, moves the light client to the frozen state if misbehaviour is detected"},"updateClient(bytes)":{"notice":"Updating the client and consensus state"},"verifyMembership((bytes,(uint64,uint64),bytes[],bytes))":{"notice":"Querying the membership of a key-value pair"},"verifyNonMembership((bytes,(uint64,uint64),bytes[]))":{"notice":"Querying the non-membership of a key"}},"version":1}},"settings":{"remappings":["@openzeppelin-contracts/=node_modules/@openzeppelin/contracts/","@openzeppelin-upgradeable/=node_modules/@openzeppelin/contracts-upgradeable/","@openzeppelin/=node_modules/@openzeppelin/","@sp1-contracts/=node_modules/sp1-contracts/contracts/src/","@uniswap/permit2/=node_modules/@uniswap/permit2/","forge-std/=node_modules/forge-std/src/","sp1-contracts/=node_modules/sp1-contracts/"],"optimizer":{"enabled":true,"runs":10000},"metadata":{"bytecodeHash":"none"},"compilationTarget":{"contracts/light-clients/besu/BesuQBFTLightClient.sol":"BesuQBFTLightClient"},"evmVersion":"cancun","libraries":{},"viaIR":true},"sources":{"contracts/interfaces/ILightClient.sol":{"keccak256":"0x3b2361546ee834a442d844c979fbad3458ee13146b093f585587a09e19a266af","urls":["bzz-raw://5b5d53101bb598f14a79cb1092479736fa18e8f84945ea6ef80f4dac84466042","dweb:/ipfs/QmaTCo6M3Z9aYCSX65AQtixo1sB4ymQUDAgTXSKHqJHGDh"],"license":"Apache-2.0"},"contracts/light-clients/besu/BesuLightClientBase.sol":{"keccak256":"0xc6e53bf0a6dc8d40d819e2f735bbae57c97454974d622901eb2361143b388529","urls":["bzz-raw://c1c65ba0c1b91751f62c769a6d892371cc8af598116217643acab4a3ce470435","dweb:/ipfs/Qmf1pqQC7iELqiKnSyjAPsTFYFsyWzxHez7FLjs8jax7Km"],"license":"Apache-2.0"},"contracts/light-clients/besu/BesuQBFTLightClient.sol":{"keccak256":"0xaeb51b2596e5959273edc43f9db73effe6c8f0f05bdedda140db66e2dfdd0fea","urls":["bzz-raw://28beb01f795950c145576718eb64a4c65948c5c04db20d9b9105d416ada277b4","dweb:/ipfs/Qmb2CjEjmrF8pFj4eo9mCfRA2VWCVQ5H1F81DA9sBtvaVA"],"license":"Apache-2.0"},"contracts/light-clients/besu/MPTProof.sol":{"keccak256":"0x9ab26e6445b20541e8725b190006444d3b16eb3e021174e280451f934d9535c6","urls":["bzz-raw://b6f3fd58b06b942a454bb9b21e9be40a2dab8a09f78e75ff4357c8afbc7e2d5b","dweb:/ipfs/QmPeUwNScDiU91Xx4UQduYjyCPALYLPq73ZUMEn8Nr1rTG"],"license":"Apache-2.0"},"contracts/light-clients/besu/RLPReader.sol":{"keccak256":"0xa64ad17e6da7fed2bd206df52189286694339a8061dc5d158e717eda982af1d9","urls":["bzz-raw://7020db2fe854e90e1b791e0e587610fc26bed3073ba1811faa275a1d8bf3c2c7","dweb:/ipfs/QmdXdKghNFZSX7N9qD6BsKuJQdrFoqatsVWvHRL7vJCmeP"],"license":"Apache-2.0"},"contracts/light-clients/besu/errors/IBesuLightClientErrors.sol":{"keccak256":"0xfb8d8e28c81a48e1165b9d9e69406208fbb0ced1b30d9ef3293112562ffbb448","urls":["bzz-raw://0d3d314a005ada41d997a6e5b254ebd70066c3ccd2e6306249c258c4a13c3623","dweb:/ipfs/QmbRH23Vh7Xp1eXQmfnafMyTebuihQTLfRYeq6BbGJfYnY"],"license":"Apache-2.0"},"contracts/light-clients/besu/msgs/IBesuLightClientMsgs.sol":{"keccak256":"0x3fc43a3daaae2f89dca4cadbc99ea71086282f987b47a95c13489ae3384532cf","urls":["bzz-raw://36083aa6833eb30d26023f7dc0b2e22b7d0723d922fcd50cf86999edc9aeb474","dweb:/ipfs/QmbPv9KJj5AuJkgppuyuoaTHtiw91Qkx1tdkf1R5D4wad2"],"license":"Apache-2.0"},"contracts/msgs/IICS02ClientMsgs.sol":{"keccak256":"0x03d1265eae327c3744d774bf22a30d845233d50664921c9aa57cef2d71fd89d2","urls":["bzz-raw://89900781cc5c60540a237d92d42745ea6165765ee8fb4d50e8137a717195cc75","dweb:/ipfs/Qmbx5p8gZ8sEMMeZytXsLee49JUayhAaoJ2yxX93WUrvQo"],"license":"Apache-2.0"},"contracts/msgs/ILightClientMsgs.sol":{"keccak256":"0x8d1e56ab166a7b4aa6999708e3214a4645ebbc3835c2b2a4c255c9923eebafde","urls":["bzz-raw://8bd4200dc04d950c0f050623fa9a8accdbec877fd446c039d4dd6c678bdf1513","dweb:/ipfs/QmZQTViaA7N6BVNDzJ1Z6w799PrPoE4ajPueZSPwX4sGZ9"],"license":"Apache-2.0"},"node_modules/@openzeppelin/contracts/access/AccessControl.sol":{"keccak256":"0x4686ec784d75f95beaf2bf5b5f26e5f946d4c864aaee9c3c62bdc18381f5e017","urls":["bzz-raw://26710ca191913f3c9df542079c4a6dcff02968e92d4f7357daefef9fbe72a19c","dweb:/ipfs/QmanHbeWuBbVEqXySHa1zhm2rExjYpChDBubBaJNTCa2JB"],"license":"MIT"},"node_modules/@openzeppelin/contracts/access/IAccessControl.sol":{"keccak256":"0xbff9f59c84e5337689161ce7641c0ef8e872d6a7536fbc1f5133f128887aba3c","urls":["bzz-raw://b308f882e796f7b79c9502deacb0a62983035c6f6f4e962b319ba6a1f4a77d3d","dweb:/ipfs/QmaWCW7ahEQqFjwhSUhV7Ae7WhfNvzSpE7DQ58hvEooqPL"],"license":"MIT"},"node_modules/@openzeppelin/contracts/utils/Context.sol":{"keccak256":"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2","urls":["bzz-raw://6a708e8a5bdb1011c2c381c9a5cfd8a9a956d7d0a9dc1bd8bcdaf52f76ef2f12","dweb:/ipfs/Qmax9WHBnVsZP46ZxEMNRQpLQnrdE4dK8LehML1Py8FowF"],"license":"MIT"},"node_modules/@openzeppelin/contracts/utils/cryptography/ECDSA.sol":{"keccak256":"0xbeb5cad8aaabe0d35d2ec1a8414d91e81e5a8ca679add4cf57e2f33476861f40","urls":["bzz-raw://ebb272a5ee2da4e8bd5551334e0ce8dce4e9c56a04570d6bf046d260fab3116a","dweb:/ipfs/QmNw6RyM769qcqFocDq6HJMG2WiEnQbvizpRaUXsACHho2"],"license":"MIT"},"node_modules/@openzeppelin/contracts/utils/introspection/ERC165.sol":{"keccak256":"0x2d9dc2fe26180f74c11c13663647d38e259e45f95eb88f57b61d2160b0109d3e","urls":["bzz-raw://81233d1f98060113d9922180bb0f14f8335856fe9f339134b09335e9f678c377","dweb:/ipfs/QmWh6R35SarhAn4z2wH8SU456jJSYL2FgucfTFgbHJJN4E"],"license":"MIT"},"node_modules/@openzeppelin/contracts/utils/introspection/IERC165.sol":{"keccak256":"0x8891738ffe910f0cf2da09566928589bf5d63f4524dd734fd9cedbac3274dd5c","urls":["bzz-raw://971f954442df5c2ef5b5ebf1eb245d7105d9fbacc7386ee5c796df1d45b21617","dweb:/ipfs/QmadRjHbkicwqwwh61raUEapaVEtaLMcYbQZWs9gUkgj3u"],"license":"MIT"}},"version":1},"id":36} \ No newline at end of file diff --git a/ibc-solidity/abi/bytecode/DummyLightClient.json b/ibc-solidity/abi/bytecode/DummyLightClient.json index a600e2b42..f0e60cef3 100644 --- a/ibc-solidity/abi/bytecode/DummyLightClient.json +++ b/ibc-solidity/abi/bytecode/DummyLightClient.json @@ -1 +1 @@ -{"abi":[{"type":"function","name":"getClientState","inputs":[],"outputs":[{"name":"","type":"bytes","internalType":"bytes"}],"stateMutability":"view"},{"type":"function","name":"misbehaviour","inputs":[{"name":"","type":"bytes","internalType":"bytes"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"updateClient","inputs":[{"name":"updateMsg","type":"bytes","internalType":"bytes"}],"outputs":[{"name":"","type":"uint8","internalType":"enum ILightClientMsgs.UpdateResult"}],"stateMutability":"nonpayable"},{"type":"function","name":"verifyMembership","inputs":[{"name":"msg_","type":"tuple","internalType":"struct ILightClientMsgs.MsgVerifyMembership","components":[{"name":"proof","type":"bytes","internalType":"bytes"},{"name":"proofHeight","type":"tuple","internalType":"struct IICS02ClientMsgs.Height","components":[{"name":"revisionNumber","type":"uint64","internalType":"uint64"},{"name":"revisionHeight","type":"uint64","internalType":"uint64"}]},{"name":"path","type":"bytes[]","internalType":"bytes[]"},{"name":"value","type":"bytes","internalType":"bytes"}]}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"nonpayable"},{"type":"function","name":"verifyNonMembership","inputs":[{"name":"msg_","type":"tuple","internalType":"struct ILightClientMsgs.MsgVerifyNonMembership","components":[{"name":"proof","type":"bytes","internalType":"bytes"},{"name":"proofHeight","type":"tuple","internalType":"struct IICS02ClientMsgs.Height","components":[{"name":"revisionNumber","type":"uint64","internalType":"uint64"},{"name":"revisionHeight","type":"uint64","internalType":"uint64"}]},{"name":"path","type":"bytes[]","internalType":"bytes[]"}]}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"nonpayable"}],"bytecode":{"object":"0x60808060405234601557610c5a908161001a8239f35b5f80fdfe6080806040526004361015610012575f80fd5b5f3560e01c9081630bece3561461031f575080634d6d9ffb1461024a578063682ed5f0146100d2578063ddba6537146100c25763ef913a4b14610053575f80fd5b346100be575f6003193601126100be576100ba60405167ffffffffffffffff5f54818116602084015260401c16604082015267ffffffffffffffff600154166060820152606081526100a6608082610860565b60405191829160208352602083019061081f565b0390f35b5f80fd5b346100be576100d0366107ce565b005b346100be5760206003193601126100be5760043567ffffffffffffffff81116100be578060040160a060031983360301126100be57602482019161014661011884610a96565b936101406064608485019461013961013087896109cd565b90501515610914565b0185610979565b91610b32565b5f52600360205260405f20549182156101ec5761016d91610166916109cd565b36916108b0565b602081519101200361018e5760209067ffffffffffffffff60405191168152f35b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f76616c7565206d69736d617463680000000000000000000000000000000000006044820152fd5b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f6d697373696e67206d656d6265727368697000000000000000000000000000006044820152fd5b346100be5760206003193601126100be5760043567ffffffffffffffff81116100be57608060031982360301126100be5761029c6024820161014061028e82610a96565b936064810190600401610979565b5f52600360205260405f20546102c15760209067ffffffffffffffff60405191168152f35b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f6d656d62657273686970206578697374730000000000000000000000000000006044820152fd5b346100be5761032d366107ce565b8101906020818303126100be5780359067ffffffffffffffff82116100be570191828203608081126100be57606082019082821067ffffffffffffffff8311176107a1576040918252126100be5760405161038781610844565b61039084610883565b815261039e60208501610883565b602082015281526103b160408401610883565b926020820193845260608101359067ffffffffffffffff82116100be57019180601f840112156100be578235926103e784610898565b936103f56040519586610860565b80855260208086019160051b830101918383116100be5760208101915b8383106106a6578787876040810191825267ffffffffffffffff8351161561064857519167ffffffffffffffff808451169161045660208601938385511690610a1e565b82825116905f52600260205260405f20907fffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000825416179055511680602060405161049f81610844565b868152015267ffffffffffffffff8451167fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000005f5416175f5581517fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff6fffffffffffffffff00000000000000005f549260401b169116175f557fffffffffffffffffffffffffffffffffffffffffffffffff000000000000000060015416176001555f5b8251805182101561063e576020908260051b01015160208101906105698251511515610914565b5160405160208101916040820160208452815180915260608301602060608360051b8601019301915f5b8181106105f7575050505091816105ba6105db93600197969503601f198101835282610860565b51902067ffffffffffffffff88511667ffffffffffffffff87511690610a50565b905160208151910120905f52600360205260405f205501610542565b90919293602080610632837fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa08a60019603018852885161081f565b96019401929101610593565b60206040515f8152f35b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f7a65726f2074696d657374616d700000000000000000000000000000000000006044820152fd5b823567ffffffffffffffff81116100be578201906040601f1983880301126100be57604051906106d582610844565b602083013567ffffffffffffffff81116100be5760209084010187601f820112156100be57803561070581610898565b916107136040519384610860565b81835260208084019260051b820101918a83116100be5760208201905b8382106107735750505050825260408301359167ffffffffffffffff83116100be57610764886020809695819601016108f6565b83820152815201920191610412565b813567ffffffffffffffff81116100be576020916107968e8480948801016108f6565b815201910190610730565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b9060206003198301126100be5760043567ffffffffffffffff81116100be57826023820112156100be5780600401359267ffffffffffffffff84116100be57602484830101116100be576024019190565b90601f19601f602080948051918291828752018686015e5f8582860101520116010190565b6040810190811067ffffffffffffffff8211176107a157604052565b90601f601f19910116810190811067ffffffffffffffff8211176107a157604052565b359067ffffffffffffffff821682036100be57565b67ffffffffffffffff81116107a15760051b60200190565b92919267ffffffffffffffff82116107a157604051916108da6020601f19601f8401160184610860565b8294818452818301116100be578281602093845f960137010152565b9080601f830112156100be57816020610911933591016108b0565b90565b1561091b57565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600b60248201527f656d7074792076616c75650000000000000000000000000000000000000000006044820152fd5b9035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1813603018212156100be570180359067ffffffffffffffff82116100be57602001918160051b360383136100be57565b9035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1813603018212156100be570180359067ffffffffffffffff82116100be576020019181360383136100be57565b9067ffffffffffffffff6040519181602084019416845216604082015260408152610a4a606082610860565b51902090565b9167ffffffffffffffff60405192816020850195168552166040830152606082015260608152610a4a608082610860565b3567ffffffffffffffff811681036100be5790565b610ab590610aaf6020610aa883610a81565b9201610a81565b90610a1e565b5f52600260205267ffffffffffffffff60405f2054168015610ad45790565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f756e6b6e6f776e206865696768740000000000000000000000000000000000006044820152fd5b90929192610b4b6020610b4484610a81565b9301610a81565b90604051946020860191816040880160208552526060870160608360051b89010192825f907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1813603015b838310610bc45750505050505094610bbb81610911969703601f198101835282610860565b51902091610a50565b9091929394957fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa08c82030186528635828112156100be578301906020823592019167ffffffffffffffff81116100be5780360383136100be57602082601f19601f8480600198869897879852868601375f84820186015201160101980196019493019190610b9656fea164736f6c634300081c000a","sourceMap":"261:3672:41:-:0;;;;;;;;;;;;;;;;;","linkReferences":{}},"deployedBytecode":{"object":"0x6080806040526004361015610012575f80fd5b5f3560e01c9081630bece3561461031f575080634d6d9ffb1461024a578063682ed5f0146100d2578063ddba6537146100c25763ef913a4b14610053575f80fd5b346100be575f6003193601126100be576100ba60405167ffffffffffffffff5f54818116602084015260401c16604082015267ffffffffffffffff600154166060820152606081526100a6608082610860565b60405191829160208352602083019061081f565b0390f35b5f80fd5b346100be576100d0366107ce565b005b346100be5760206003193601126100be5760043567ffffffffffffffff81116100be578060040160a060031983360301126100be57602482019161014661011884610a96565b936101406064608485019461013961013087896109cd565b90501515610914565b0185610979565b91610b32565b5f52600360205260405f20549182156101ec5761016d91610166916109cd565b36916108b0565b602081519101200361018e5760209067ffffffffffffffff60405191168152f35b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f76616c7565206d69736d617463680000000000000000000000000000000000006044820152fd5b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f6d697373696e67206d656d6265727368697000000000000000000000000000006044820152fd5b346100be5760206003193601126100be5760043567ffffffffffffffff81116100be57608060031982360301126100be5761029c6024820161014061028e82610a96565b936064810190600401610979565b5f52600360205260405f20546102c15760209067ffffffffffffffff60405191168152f35b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f6d656d62657273686970206578697374730000000000000000000000000000006044820152fd5b346100be5761032d366107ce565b8101906020818303126100be5780359067ffffffffffffffff82116100be570191828203608081126100be57606082019082821067ffffffffffffffff8311176107a1576040918252126100be5760405161038781610844565b61039084610883565b815261039e60208501610883565b602082015281526103b160408401610883565b926020820193845260608101359067ffffffffffffffff82116100be57019180601f840112156100be578235926103e784610898565b936103f56040519586610860565b80855260208086019160051b830101918383116100be5760208101915b8383106106a6578787876040810191825267ffffffffffffffff8351161561064857519167ffffffffffffffff808451169161045660208601938385511690610a1e565b82825116905f52600260205260405f20907fffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000825416179055511680602060405161049f81610844565b868152015267ffffffffffffffff8451167fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000005f5416175f5581517fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff6fffffffffffffffff00000000000000005f549260401b169116175f557fffffffffffffffffffffffffffffffffffffffffffffffff000000000000000060015416176001555f5b8251805182101561063e576020908260051b01015160208101906105698251511515610914565b5160405160208101916040820160208452815180915260608301602060608360051b8601019301915f5b8181106105f7575050505091816105ba6105db93600197969503601f198101835282610860565b51902067ffffffffffffffff88511667ffffffffffffffff87511690610a50565b905160208151910120905f52600360205260405f205501610542565b90919293602080610632837fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa08a60019603018852885161081f565b96019401929101610593565b60206040515f8152f35b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f7a65726f2074696d657374616d700000000000000000000000000000000000006044820152fd5b823567ffffffffffffffff81116100be578201906040601f1983880301126100be57604051906106d582610844565b602083013567ffffffffffffffff81116100be5760209084010187601f820112156100be57803561070581610898565b916107136040519384610860565b81835260208084019260051b820101918a83116100be5760208201905b8382106107735750505050825260408301359167ffffffffffffffff83116100be57610764886020809695819601016108f6565b83820152815201920191610412565b813567ffffffffffffffff81116100be576020916107968e8480948801016108f6565b815201910190610730565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b9060206003198301126100be5760043567ffffffffffffffff81116100be57826023820112156100be5780600401359267ffffffffffffffff84116100be57602484830101116100be576024019190565b90601f19601f602080948051918291828752018686015e5f8582860101520116010190565b6040810190811067ffffffffffffffff8211176107a157604052565b90601f601f19910116810190811067ffffffffffffffff8211176107a157604052565b359067ffffffffffffffff821682036100be57565b67ffffffffffffffff81116107a15760051b60200190565b92919267ffffffffffffffff82116107a157604051916108da6020601f19601f8401160184610860565b8294818452818301116100be578281602093845f960137010152565b9080601f830112156100be57816020610911933591016108b0565b90565b1561091b57565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600b60248201527f656d7074792076616c75650000000000000000000000000000000000000000006044820152fd5b9035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1813603018212156100be570180359067ffffffffffffffff82116100be57602001918160051b360383136100be57565b9035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1813603018212156100be570180359067ffffffffffffffff82116100be576020019181360383136100be57565b9067ffffffffffffffff6040519181602084019416845216604082015260408152610a4a606082610860565b51902090565b9167ffffffffffffffff60405192816020850195168552166040830152606082015260608152610a4a608082610860565b3567ffffffffffffffff811681036100be5790565b610ab590610aaf6020610aa883610a81565b9201610a81565b90610a1e565b5f52600260205267ffffffffffffffff60405f2054168015610ad45790565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f756e6b6e6f776e206865696768740000000000000000000000000000000000006044820152fd5b90929192610b4b6020610b4484610a81565b9301610a81565b90604051946020860191816040880160208552526060870160608360051b89010192825f907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1813603015b838310610bc45750505050505094610bbb81610911969703601f198101835282610860565b51902091610a50565b9091929394957fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa08c82030186528635828112156100be578301906020823592019167ffffffffffffffff81116100be5780360383136100be57602082601f19601f8480600198869897879852868601375f84820186015201160101980196019493019190610b9656fea164736f6c634300081c000a","sourceMap":"261:3672:41:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;261:3672:41;;;;;;;;;;;;;;2883:24;;;261:3672;;;;;;;;;;;;;;;;;2883:24;;;;;;:::i;:::-;261:3672;;;;;2883:24;261:3672;;2883:24;261:3672;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;261:3672:41;;;;;;;;;;;;;;;;-1:-1:-1;;261:3672:41;;;;;;;2032:16;;;2021:28;2159:43;2021:28;;;:::i;:::-;2067:10;2192:9;;2067:10;;;;2059:46;2067:10;;;;:::i;:::-;:22;;;;2059:46;:::i;:::-;2192:9;;;:::i;:::-;2159:43;;:::i;:::-;261:3672;;2136:22;261:3672;;;;;;2221:23;;;261:3672;;;2308:10;;;;:::i;:::-;261:3672;;;:::i;:::-;;;;;;2298:21;2285:34;261:3672;;;;;;;;;;;;;2192:9;261:3672;;;;;;;;;;;2032:16;261:3672;;;;;;;;;;2192:9;261:3672;;;;;;;;;;;2032:16;261:3672;;;;;;;;;;;;;;-1:-1:-1;;261:3672:41;;;;;;;;;;;;;-1:-1:-1;;261:3672:41;;;;;;;2600:43;2529:16;;;2633:9;2518:28;;;:::i;:::-;2633:9;;;;261:3672;;;2633:9;:::i;2600:43::-;261:3672;;2577:22;261:3672;;;;;;;;;;;;;;;;;;;2633:9;261:3672;;;;;;;;;;;2529:16;261:3672;;;;;;;;;;;;;;;;:::i;:::-;966:40;;261:3672;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1024:19;261:3672;;1113:11;261:3672;;;;;;1188:21;1154:56;261:3672;1188:21;;261:3672;;;;;1154:56;;:::i;:::-;261:3672;;;;;;;1220:11;261:3672;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;1284:70;261:3672;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1414:3;1389:16;;261:3672;;1385:27;;;;;261:3672;;;;;;;1464:19;261:3672;1505:16;;;1497:52;1505:16;;261:3672;1505:28;;1497:52;:::i;:::-;1604:15;261:3672;;;1593:27;;261:3672;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1593:27;;;;;;;1659:70;1593:27;261:3672;1593:27;;;;-1:-1:-1;;1593:27:41;;;;;;:::i;:::-;261:3672;1583:38;;261:3672;;;;;;;;1659:70;;:::i;:::-;1793:16;;261:3672;;;;;1783:27;261:3672;;;1743:22;261:3672;;;;;;;1370:13;;261:3672;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;1385:27;261:3672;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;261:3672:41;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;261:3672:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;-1:-1:-1;;261:3672:41;;;;;;;;;;;;;;;;;-1:-1:-1;261:3672:41;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;:::o;:::-;;;-1:-1:-1;;261:3672:41;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;:::o;:::-;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;-1:-1:-1;;261:3672:41;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;-1:-1:-1;261:3672:41;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;:::i;:::-;;:::o;:::-;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;3487:174::-;;261:3672;;;3611:42;;;;;261:3672;;;;;;;;;;3611:42;;;;;;:::i;:::-;261:3672;3601:53;;3487:174;:::o;3667:264::-;;261:3672;;;3871:52;;;;;261:3672;;;;;;;;;;;;;;3871:52;;;;;;:::i;261:3672::-;;;;;;;;;;:::o;2920:273::-;3052:56;2920:273;3086:21;;3063;;;:::i;:::-;3086;;;:::i;:::-;3052:56;;:::i;:::-;-1:-1:-1;261:3672:41;3040:11;3086:21;261:3672;;;-1:-1:-1;261:3672:41;;;3127:14;;261:3672;;2920:273;:::o;261:3672::-;;;;;;;3086:21;261:3672;;;;;;;;;;;;;;;3199:282;;;;;3423:21;;3400;;;:::i;:::-;3423;;;:::i;:::-;261:3672;;;3456:16;3423:21;3456:16;;261:3672;;;;;3423:21;261:3672;;;;;;;;;;;;;;;-1:-1:-1;261:3672:41;;;;;;;;;;;;3456:16;;;;;;;;;3385:89;3456:16;;;-1:-1:-1;;3456:16:41;;;;;;:::i;:::-;261:3672;3446:27;;3385:89;;:::i;261:3672::-;;;;;;;;;;;;;;;;;;;;;;;;;3423:21;261:3672;;;;;;;;;;;;;;;;;3423:21;261:3672;-1:-1:-1;;261:3672:41;;;;;;;;;;;;;;;-1:-1:-1;261:3672:41;;;;;;;;;;;;;;;;;;;;","linkReferences":{}},"methodIdentifiers":{"getClientState()":"ef913a4b","misbehaviour(bytes)":"ddba6537","updateClient(bytes)":"0bece356","verifyMembership((bytes,(uint64,uint64),bytes[],bytes))":"682ed5f0","verifyNonMembership((bytes,(uint64,uint64),bytes[]))":"4d6d9ffb"},"rawMetadata":"{\"compiler\":{\"version\":\"0.8.28+commit.7893614a\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"name\":\"getClientState\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"name\":\"misbehaviour\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"updateMsg\",\"type\":\"bytes\"}],\"name\":\"updateClient\",\"outputs\":[{\"internalType\":\"enum ILightClientMsgs.UpdateResult\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes\",\"name\":\"proof\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"uint64\",\"name\":\"revisionNumber\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"revisionHeight\",\"type\":\"uint64\"}],\"internalType\":\"struct IICS02ClientMsgs.Height\",\"name\":\"proofHeight\",\"type\":\"tuple\"},{\"internalType\":\"bytes[]\",\"name\":\"path\",\"type\":\"bytes[]\"},{\"internalType\":\"bytes\",\"name\":\"value\",\"type\":\"bytes\"}],\"internalType\":\"struct ILightClientMsgs.MsgVerifyMembership\",\"name\":\"msg_\",\"type\":\"tuple\"}],\"name\":\"verifyMembership\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes\",\"name\":\"proof\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"uint64\",\"name\":\"revisionNumber\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"revisionHeight\",\"type\":\"uint64\"}],\"internalType\":\"struct IICS02ClientMsgs.Height\",\"name\":\"proofHeight\",\"type\":\"tuple\"},{\"internalType\":\"bytes[]\",\"name\":\"path\",\"type\":\"bytes[]\"}],\"internalType\":\"struct ILightClientMsgs.MsgVerifyNonMembership\",\"name\":\"msg_\",\"type\":\"tuple\"}],\"name\":\"verifyNonMembership\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"getClientState()\":{\"returns\":{\"_0\":\"The client state.\"}},\"updateClient(bytes)\":{\"params\":{\"updateMsg\":\"The encoded update message e.g., an SP1 proof.\"},\"returns\":{\"_0\":\"The result of the update operation\"}},\"verifyMembership((bytes,(uint64,uint64),bytes[],bytes))\":{\"details\":\"Notice that this message is not view, as it may update the client state for caching purposes.\",\"params\":{\"msg_\":\"The membership message\"},\"returns\":{\"_0\":\"The unix timestamp of the verification height in the counterparty chain in seconds.\"}},\"verifyNonMembership((bytes,(uint64,uint64),bytes[]))\":{\"details\":\"Notice that this message is not view, as it may update the client state for caching purposes.\",\"params\":{\"msg_\":\"The membership message\"},\"returns\":{\"_0\":\"The unix timestamp of the verification height in the counterparty chain in seconds.\"}}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"getClientState()\":{\"notice\":\"Returns the client state.\"},\"updateClient(bytes)\":{\"notice\":\"Updating the client and consensus state\"},\"verifyMembership((bytes,(uint64,uint64),bytes[],bytes))\":{\"notice\":\"Querying the membership of a key-value pair\"},\"verifyNonMembership((bytes,(uint64,uint64),bytes[]))\":{\"notice\":\"Querying the non-membership of a key\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/light-clients/dummy/DummyLightClient.sol\":\"DummyLightClient\"},\"evmVersion\":\"cancun\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"none\"},\"optimizer\":{\"enabled\":true,\"runs\":10000},\"remappings\":[\":@openzeppelin-contracts/=node_modules/@openzeppelin/contracts/\",\":@openzeppelin-upgradeable/=node_modules/@openzeppelin/contracts-upgradeable/\",\":@openzeppelin/=node_modules/@openzeppelin/\",\":@sp1-contracts/=node_modules/sp1-contracts/contracts/src/\",\":@uniswap/permit2/=node_modules/@uniswap/permit2/\",\":forge-std/=node_modules/forge-std/src/\",\":sp1-contracts/=node_modules/sp1-contracts/\"],\"viaIR\":true},\"sources\":{\"contracts/interfaces/ILightClient.sol\":{\"keccak256\":\"0x1caae9e4f741a86c0056d5f7713a35f3bd96db7a9fd52fc9f1cf79aad76a442f\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://4a536db3b926560f69547c17e4f451a2631ddea0f42bd224c7fd8382d74429f6\",\"dweb:/ipfs/QmcQ33kxcmmowXgMbQGTBgiKBjF7v8UiP4y73bB9hhDizC\"]},\"contracts/light-clients/dummy/DummyLightClient.sol\":{\"keccak256\":\"0x71e8d19d1164eb76d80529206ef42fe782c2c7c5e1d9cc7d62e27e0a4ab969c7\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://6ced75b4a2a948ae297411595f617b80584c6ac381eabb39dd43cdb62caeb9f5\",\"dweb:/ipfs/QmXN4t37cgiqSiH4TLZKGEANE4fXdjKHugeLyQ8b682iSs\"]},\"contracts/msgs/IICS02ClientMsgs.sol\":{\"keccak256\":\"0xb5fdb25319d5c32b3f527982d45ec1e9bec5215515581aee034d853006ea01a0\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://6b8939bf552c62c952a491008bcd9b59ab7dda20a9482bf93438e05793881542\",\"dweb:/ipfs/QmfWmzNCp8bd4pP26Lfw5HHp4dSZnCDqZDjVN7SD8P7eDh\"]},\"contracts/msgs/ILightClientMsgs.sol\":{\"keccak256\":\"0xa0565e7748b8b3284d72e1aa6ef4cc8264fcaa5f4e0761d22d64686953db6378\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://c4476010d7090bfaa74127526f2051c6bc82ff42a09b936e848880a1f15a6065\",\"dweb:/ipfs/QmY87JgRsFQXSZdGXNjNHEJCkdTHzFXH4vZEJ3q7MnHuP8\"]}},\"version\":1}","metadata":{"compiler":{"version":"0.8.28+commit.7893614a"},"language":"Solidity","output":{"abi":[{"inputs":[],"stateMutability":"view","type":"function","name":"getClientState","outputs":[{"internalType":"bytes","name":"","type":"bytes"}]},{"inputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"nonpayable","type":"function","name":"misbehaviour"},{"inputs":[{"internalType":"bytes","name":"updateMsg","type":"bytes"}],"stateMutability":"nonpayable","type":"function","name":"updateClient","outputs":[{"internalType":"enum ILightClientMsgs.UpdateResult","name":"","type":"uint8"}]},{"inputs":[{"internalType":"struct ILightClientMsgs.MsgVerifyMembership","name":"msg_","type":"tuple","components":[{"internalType":"bytes","name":"proof","type":"bytes"},{"internalType":"struct IICS02ClientMsgs.Height","name":"proofHeight","type":"tuple","components":[{"internalType":"uint64","name":"revisionNumber","type":"uint64"},{"internalType":"uint64","name":"revisionHeight","type":"uint64"}]},{"internalType":"bytes[]","name":"path","type":"bytes[]"},{"internalType":"bytes","name":"value","type":"bytes"}]}],"stateMutability":"nonpayable","type":"function","name":"verifyMembership","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[{"internalType":"struct ILightClientMsgs.MsgVerifyNonMembership","name":"msg_","type":"tuple","components":[{"internalType":"bytes","name":"proof","type":"bytes"},{"internalType":"struct IICS02ClientMsgs.Height","name":"proofHeight","type":"tuple","components":[{"internalType":"uint64","name":"revisionNumber","type":"uint64"},{"internalType":"uint64","name":"revisionHeight","type":"uint64"}]},{"internalType":"bytes[]","name":"path","type":"bytes[]"}]}],"stateMutability":"nonpayable","type":"function","name":"verifyNonMembership","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]}],"devdoc":{"kind":"dev","methods":{"getClientState()":{"returns":{"_0":"The client state."}},"updateClient(bytes)":{"params":{"updateMsg":"The encoded update message e.g., an SP1 proof."},"returns":{"_0":"The result of the update operation"}},"verifyMembership((bytes,(uint64,uint64),bytes[],bytes))":{"details":"Notice that this message is not view, as it may update the client state for caching purposes.","params":{"msg_":"The membership message"},"returns":{"_0":"The unix timestamp of the verification height in the counterparty chain in seconds."}},"verifyNonMembership((bytes,(uint64,uint64),bytes[]))":{"details":"Notice that this message is not view, as it may update the client state for caching purposes.","params":{"msg_":"The membership message"},"returns":{"_0":"The unix timestamp of the verification height in the counterparty chain in seconds."}}},"version":1},"userdoc":{"kind":"user","methods":{"getClientState()":{"notice":"Returns the client state."},"updateClient(bytes)":{"notice":"Updating the client and consensus state"},"verifyMembership((bytes,(uint64,uint64),bytes[],bytes))":{"notice":"Querying the membership of a key-value pair"},"verifyNonMembership((bytes,(uint64,uint64),bytes[]))":{"notice":"Querying the non-membership of a key"}},"version":1}},"settings":{"remappings":["@openzeppelin-contracts/=node_modules/@openzeppelin/contracts/","@openzeppelin-upgradeable/=node_modules/@openzeppelin/contracts-upgradeable/","@openzeppelin/=node_modules/@openzeppelin/","@sp1-contracts/=node_modules/sp1-contracts/contracts/src/","@uniswap/permit2/=node_modules/@uniswap/permit2/","forge-std/=node_modules/forge-std/src/","sp1-contracts/=node_modules/sp1-contracts/"],"optimizer":{"enabled":true,"runs":10000},"metadata":{"bytecodeHash":"none"},"compilationTarget":{"contracts/light-clients/dummy/DummyLightClient.sol":"DummyLightClient"},"evmVersion":"cancun","libraries":{},"viaIR":true},"sources":{"contracts/interfaces/ILightClient.sol":{"keccak256":"0x1caae9e4f741a86c0056d5f7713a35f3bd96db7a9fd52fc9f1cf79aad76a442f","urls":["bzz-raw://4a536db3b926560f69547c17e4f451a2631ddea0f42bd224c7fd8382d74429f6","dweb:/ipfs/QmcQ33kxcmmowXgMbQGTBgiKBjF7v8UiP4y73bB9hhDizC"],"license":"MIT"},"contracts/light-clients/dummy/DummyLightClient.sol":{"keccak256":"0x71e8d19d1164eb76d80529206ef42fe782c2c7c5e1d9cc7d62e27e0a4ab969c7","urls":["bzz-raw://6ced75b4a2a948ae297411595f617b80584c6ac381eabb39dd43cdb62caeb9f5","dweb:/ipfs/QmXN4t37cgiqSiH4TLZKGEANE4fXdjKHugeLyQ8b682iSs"],"license":"MIT"},"contracts/msgs/IICS02ClientMsgs.sol":{"keccak256":"0xb5fdb25319d5c32b3f527982d45ec1e9bec5215515581aee034d853006ea01a0","urls":["bzz-raw://6b8939bf552c62c952a491008bcd9b59ab7dda20a9482bf93438e05793881542","dweb:/ipfs/QmfWmzNCp8bd4pP26Lfw5HHp4dSZnCDqZDjVN7SD8P7eDh"],"license":"MIT"},"contracts/msgs/ILightClientMsgs.sol":{"keccak256":"0xa0565e7748b8b3284d72e1aa6ef4cc8264fcaa5f4e0761d22d64686953db6378","urls":["bzz-raw://c4476010d7090bfaa74127526f2051c6bc82ff42a09b936e848880a1f15a6065","dweb:/ipfs/QmY87JgRsFQXSZdGXNjNHEJCkdTHzFXH4vZEJ3q7MnHuP8"],"license":"MIT"}},"version":1},"id":41} \ No newline at end of file +{"abi":[{"type":"function","name":"getClientState","inputs":[],"outputs":[{"name":"","type":"bytes","internalType":"bytes"}],"stateMutability":"view"},{"type":"function","name":"misbehaviour","inputs":[{"name":"","type":"bytes","internalType":"bytes"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"updateClient","inputs":[{"name":"updateMsg","type":"bytes","internalType":"bytes"}],"outputs":[{"name":"","type":"uint8","internalType":"enum ILightClientMsgs.UpdateResult"}],"stateMutability":"nonpayable"},{"type":"function","name":"verifyMembership","inputs":[{"name":"msg_","type":"tuple","internalType":"struct ILightClientMsgs.MsgVerifyMembership","components":[{"name":"proof","type":"bytes","internalType":"bytes"},{"name":"proofHeight","type":"tuple","internalType":"struct IICS02ClientMsgs.Height","components":[{"name":"revisionNumber","type":"uint64","internalType":"uint64"},{"name":"revisionHeight","type":"uint64","internalType":"uint64"}]},{"name":"path","type":"bytes[]","internalType":"bytes[]"},{"name":"value","type":"bytes","internalType":"bytes"}]}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"nonpayable"},{"type":"function","name":"verifyNonMembership","inputs":[{"name":"msg_","type":"tuple","internalType":"struct ILightClientMsgs.MsgVerifyNonMembership","components":[{"name":"proof","type":"bytes","internalType":"bytes"},{"name":"proofHeight","type":"tuple","internalType":"struct IICS02ClientMsgs.Height","components":[{"name":"revisionNumber","type":"uint64","internalType":"uint64"},{"name":"revisionHeight","type":"uint64","internalType":"uint64"}]},{"name":"path","type":"bytes[]","internalType":"bytes[]"}]}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"nonpayable"},{"type":"error","name":"MembershipExists","inputs":[]},{"type":"error","name":"MissingMembership","inputs":[]},{"type":"error","name":"UnknownHeight","inputs":[]},{"type":"error","name":"ValueMismatch","inputs":[]},{"type":"error","name":"ZeroTimestamp","inputs":[]}],"bytecode":{"object":"0x60808060405234601557610ab7908161001a8239f35b5f80fdfe6080806040526004361015610012575f80fd5b5f3560e01c9081630bece356146102ac575080634d6d9ffb1461020d578063682ed5f0146100d2578063ddba6537146100c25763ef913a4b14610053575f80fd5b346100be575f6003193601126100be576100ba60405167ffffffffffffffff5f54818116602084015260401c16604082015267ffffffffffffffff600154166060820152606081526100a66080826107a9565b604051918291602083526020830190610768565b0390f35b5f80fd5b346100be576100d036610717565b005b346100be5760206003193601126100be5760043567ffffffffffffffff81116100be578036039060a06003198301126100be57602481019161012d61011684610929565b93610127606485018560040161085d565b9161098f565b5f52600360205260405f20549182156101e5577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdd608482013592018212156100be570160048101359067ffffffffffffffff82116100be5760240181360381136100be5761019c9136916107f9565b60208151910120036101bd5760209067ffffffffffffffff60405191168152f35b7fdd8e4af7000000000000000000000000000000000000000000000000000000005f5260045ffd5b7ff6b593a3000000000000000000000000000000000000000000000000000000005f5260045ffd5b346100be5760206003193601126100be5760043567ffffffffffffffff81116100be57608060031982360301126100be5761025f6024820161012761025182610929565b93606481019060040161085d565b5f52600360205260405f20546102845760209067ffffffffffffffff60405191168152f35b7f679fc91d000000000000000000000000000000000000000000000000000000005f5260045ffd5b346100be576102ba36610717565b8101906020818303126100be5780359067ffffffffffffffff82116100be570191828203608081126100be57606082019082821067ffffffffffffffff8311176106ea576040918252126100be576040516103148161078d565b61031d846107cc565b815261032b602085016107cc565b6020820152815261033e604084016107cc565b926020820193845260608101359067ffffffffffffffff82116100be57019180601f840112156100be57823592610374846107e1565b9361038260405195866107a9565b80855260208086019160051b830101918383116100be5760208101915b8383106105ef578787876040810191825267ffffffffffffffff835116156105c757519167ffffffffffffffff80845116916103e3602086019383855116906108b1565b82825116905f52600260205260405f20907fffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000825416179055511680602060405161042c8161078d565b868152015267ffffffffffffffff8451167fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000005f5416175f5581517fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff6fffffffffffffffff00000000000000005f549260401b169116175f557fffffffffffffffffffffffffffffffffffffffffffffffff000000000000000060015416176001555f5b825180518210156105bd576020908260051b010151805160405160208101916040820160208452815180915260608301602060608360051b8601019301915f5b81811061057657505050506001949392826105386020946105599403601f1981018352826107a9565b51902067ffffffffffffffff89511667ffffffffffffffff885116906108e3565b91015160208151910120905f52600360205260405f2055016104cf565b909192936020806105b1837fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa08a600196030188528851610768565b9601940192910161050f565b60206040515f8152f35b7fda16d767000000000000000000000000000000000000000000000000000000005f5260045ffd5b823567ffffffffffffffff81116100be578201906040601f1983880301126100be576040519061061e8261078d565b602083013567ffffffffffffffff81116100be5760209084010187601f820112156100be57803561064e816107e1565b9161065c60405193846107a9565b81835260208084019260051b820101918a83116100be5760208201905b8382106106bc5750505050825260408301359167ffffffffffffffff83116100be576106ad8860208096958196010161083f565b8382015281520192019161039f565b813567ffffffffffffffff81116100be576020916106df8e84809488010161083f565b815201910190610679565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b9060206003198301126100be5760043567ffffffffffffffff81116100be57826023820112156100be5780600401359267ffffffffffffffff84116100be57602484830101116100be576024019190565b90601f19601f602080948051918291828752018686015e5f8582860101520116010190565b6040810190811067ffffffffffffffff8211176106ea57604052565b90601f601f19910116810190811067ffffffffffffffff8211176106ea57604052565b359067ffffffffffffffff821682036100be57565b67ffffffffffffffff81116106ea5760051b60200190565b92919267ffffffffffffffff82116106ea57604051916108236020601f19601f84011601846107a9565b8294818452818301116100be578281602093845f960137010152565b9080601f830112156100be5781602061085a933591016107f9565b90565b9035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1813603018212156100be570180359067ffffffffffffffff82116100be57602001918160051b360383136100be57565b9067ffffffffffffffff60405191816020840194168452166040820152604081526108dd6060826107a9565b51902090565b9167ffffffffffffffff604051928160208501951685521660408301526060820152606081526108dd6080826107a9565b3567ffffffffffffffff811681036100be5790565b61094890610942602061093b83610914565b9201610914565b906108b1565b5f52600260205267ffffffffffffffff60405f20541680156109675790565b7f8da291bd000000000000000000000000000000000000000000000000000000005f5260045ffd5b909291926109a860206109a184610914565b9301610914565b90604051946020860191816040880160208552526060870160608360051b89010192825f907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1813603015b838310610a215750505050505094610a188161085a969703601f1981018352826107a9565b519020916108e3565b9091929394957fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa08c82030186528635828112156100be578301906020823592019167ffffffffffffffff81116100be5780360383136100be57602082601f19601f8480600198869897879852868601375f848201860152011601019801960194930191906109f356fea164736f6c634300081c000a","sourceMap":"387:5920:41:-:0;;;;;;;;;;;;;;;;;","linkReferences":{}},"deployedBytecode":{"object":"0x6080806040526004361015610012575f80fd5b5f3560e01c9081630bece356146102ac575080634d6d9ffb1461020d578063682ed5f0146100d2578063ddba6537146100c25763ef913a4b14610053575f80fd5b346100be575f6003193601126100be576100ba60405167ffffffffffffffff5f54818116602084015260401c16604082015267ffffffffffffffff600154166060820152606081526100a66080826107a9565b604051918291602083526020830190610768565b0390f35b5f80fd5b346100be576100d036610717565b005b346100be5760206003193601126100be5760043567ffffffffffffffff81116100be578036039060a06003198301126100be57602481019161012d61011684610929565b93610127606485018560040161085d565b9161098f565b5f52600360205260405f20549182156101e5577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdd608482013592018212156100be570160048101359067ffffffffffffffff82116100be5760240181360381136100be5761019c9136916107f9565b60208151910120036101bd5760209067ffffffffffffffff60405191168152f35b7fdd8e4af7000000000000000000000000000000000000000000000000000000005f5260045ffd5b7ff6b593a3000000000000000000000000000000000000000000000000000000005f5260045ffd5b346100be5760206003193601126100be5760043567ffffffffffffffff81116100be57608060031982360301126100be5761025f6024820161012761025182610929565b93606481019060040161085d565b5f52600360205260405f20546102845760209067ffffffffffffffff60405191168152f35b7f679fc91d000000000000000000000000000000000000000000000000000000005f5260045ffd5b346100be576102ba36610717565b8101906020818303126100be5780359067ffffffffffffffff82116100be570191828203608081126100be57606082019082821067ffffffffffffffff8311176106ea576040918252126100be576040516103148161078d565b61031d846107cc565b815261032b602085016107cc565b6020820152815261033e604084016107cc565b926020820193845260608101359067ffffffffffffffff82116100be57019180601f840112156100be57823592610374846107e1565b9361038260405195866107a9565b80855260208086019160051b830101918383116100be5760208101915b8383106105ef578787876040810191825267ffffffffffffffff835116156105c757519167ffffffffffffffff80845116916103e3602086019383855116906108b1565b82825116905f52600260205260405f20907fffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000825416179055511680602060405161042c8161078d565b868152015267ffffffffffffffff8451167fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000005f5416175f5581517fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff6fffffffffffffffff00000000000000005f549260401b169116175f557fffffffffffffffffffffffffffffffffffffffffffffffff000000000000000060015416176001555f5b825180518210156105bd576020908260051b010151805160405160208101916040820160208452815180915260608301602060608360051b8601019301915f5b81811061057657505050506001949392826105386020946105599403601f1981018352826107a9565b51902067ffffffffffffffff89511667ffffffffffffffff885116906108e3565b91015160208151910120905f52600360205260405f2055016104cf565b909192936020806105b1837fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa08a600196030188528851610768565b9601940192910161050f565b60206040515f8152f35b7fda16d767000000000000000000000000000000000000000000000000000000005f5260045ffd5b823567ffffffffffffffff81116100be578201906040601f1983880301126100be576040519061061e8261078d565b602083013567ffffffffffffffff81116100be5760209084010187601f820112156100be57803561064e816107e1565b9161065c60405193846107a9565b81835260208084019260051b820101918a83116100be5760208201905b8382106106bc5750505050825260408301359167ffffffffffffffff83116100be576106ad8860208096958196010161083f565b8382015281520192019161039f565b813567ffffffffffffffff81116100be576020916106df8e84809488010161083f565b815201910190610679565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b9060206003198301126100be5760043567ffffffffffffffff81116100be57826023820112156100be5780600401359267ffffffffffffffff84116100be57602484830101116100be576024019190565b90601f19601f602080948051918291828752018686015e5f8582860101520116010190565b6040810190811067ffffffffffffffff8211176106ea57604052565b90601f601f19910116810190811067ffffffffffffffff8211176106ea57604052565b359067ffffffffffffffff821682036100be57565b67ffffffffffffffff81116106ea5760051b60200190565b92919267ffffffffffffffff82116106ea57604051916108236020601f19601f84011601846107a9565b8294818452818301116100be578281602093845f960137010152565b9080601f830112156100be5781602061085a933591016107f9565b90565b9035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1813603018212156100be570180359067ffffffffffffffff82116100be57602001918160051b360383136100be57565b9067ffffffffffffffff60405191816020840194168452166040820152604081526108dd6060826107a9565b51902090565b9167ffffffffffffffff604051928160208501951685521660408301526060820152606081526108dd6080826107a9565b3567ffffffffffffffff811681036100be5790565b61094890610942602061093b83610914565b9201610914565b906108b1565b5f52600260205267ffffffffffffffff60405f20541680156109675790565b7f8da291bd000000000000000000000000000000000000000000000000000000005f5260045ffd5b909291926109a860206109a184610914565b9301610914565b90604051946020860191816040880160208552526060870160608360051b89010192825f907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1813603015b838310610a215750505050505094610a188161085a969703601f1981018352826107a9565b519020916108e3565b9091929394957fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa08c82030186528635828112156100be578301906020823592019167ffffffffffffffff81116100be5780360383136100be57602082601f19601f8480600198869897879852868601375f848201860152011601019801960194930191906109f356fea164736f6c634300081c000a","sourceMap":"387:5920:41:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;387:5920:41;;;;;;;;;;;;;;4446:24;;;387:5920;;;;;;;;;;;;;;;;;4446:24;;;;;;:::i;:::-;387:5920;;;;;4446:24;387:5920;;4446:24;387:5920;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;387:5920:41;;;;;;;;;;;;;;;;;-1:-1:-1;;387:5920:41;;;;;3457:16;;;3446:28;3528:43;3446:28;;;:::i;:::-;3561:9;;;;;387:5920;;;3561:9;:::i;:::-;3528:43;;:::i;:::-;387:5920;;3505:22;387:5920;;;;;;3586:23;;;3582:80;;387:5920;3698:10;;;387:5920;;;;;;;;;;;;;;;;;;;3457:16;387:5920;;;;;;;;;;;;;:::i;:::-;;;;;;3688:21;3675:34;3671:87;;387:5920;;;;;;;;;;3671:87;3732:15;387:5920;3732:15;387:5920;;3732:15;3582:80;3632:19;387:5920;3632:19;387:5920;;3632:19;387:5920;;;;;-1:-1:-1;;387:5920:41;;;;;;;;;;;;;-1:-1:-1;;387:5920:41;;;;;;;4052:43;3981:16;;;4085:9;3970:28;;;:::i;:::-;4085:9;;;;387:5920;;;4085:9;:::i;4052:43::-;387:5920;;4029:22;387:5920;;;;;;4106:79;;387:5920;;;;;;;;;;4106:79;4156:18;387:5920;4156:18;387:5920;;4156:18;387:5920;;;;;;;:::i;:::-;2399:40;;387:5920;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2453:19;2449:72;;2571:11;387:5920;;;;;;2646:21;2612:56;387:5920;2646:21;;387:5920;;;;;2612:56;;:::i;:::-;387:5920;;;;;;;2678:11;387:5920;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;2742:70;387:5920;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2872:3;2847:16;;387:5920;;2843:27;;;;;387:5920;;;;;;;2922:19;2996:15;;387:5920;;;2985:27;;387:5920;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2985:27;;;;387:5920;2985:27;;;;;387:5920;2985:27;3051:70;2985:27;;-1:-1:-1;;2985:27:41;;;;;;:::i;:::-;387:5920;2975:38;;387:5920;;;;;;;;3051:70;;:::i;:::-;3185:16;;;387:5920;;;;;3175:27;387:5920;;;3135:22;387:5920;;;;;;;2828:13;;387:5920;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;2843:27;387:5920;;;;;;;2449:72;2495:15;387:5920;2495:15;387:5920;;2495:15;387:5920;;;;;;;;;;;;-1:-1:-1;;387:5920:41;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;387:5920:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;-1:-1:-1;;387:5920:41;;;;;;;;;;;;;;;;;-1:-1:-1;387:5920:41;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;:::o;:::-;;;-1:-1:-1;;387:5920:41;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;:::o;:::-;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;-1:-1:-1;;387:5920:41;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;-1:-1:-1;387:5920:41;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;:::i;:::-;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;5589:174::-;;387:5920;;;5713:42;;;;;387:5920;;;;;;;;;;5713:42;;;;;;:::i;:::-;387:5920;5703:53;;5589:174;:::o;6041:264::-;;387:5920;;;6245:52;;;;;387:5920;;;;;;;;;;;;;;6245:52;;;;;;:::i;387:5920::-;;;;;;;;;;:::o;4633:298::-;4765:56;4633:298;4799:21;;4776;;;:::i;:::-;4799;;;:::i;:::-;4765:56;;:::i;:::-;-1:-1:-1;387:5920:41;4753:11;4799:21;387:5920;;;-1:-1:-1;387:5920:41;;;4836:14;;4832:67;;4633:298;:::o;4832:67::-;4873:15;-1:-1:-1;4873:15:41;;-1:-1:-1;4873:15:41;5112:282;;;;;5336:21;;5313;;;:::i;:::-;5336;;;:::i;:::-;387:5920;;;5369:16;5336:21;5369:16;;387:5920;;;;;5336:21;387:5920;;;;;;;;;;;;;;;-1:-1:-1;387:5920:41;;;;;;;;;;;;5369:16;;;;;;;;;5298:89;5369:16;;;-1:-1:-1;;5369:16:41;;;;;;:::i;:::-;387:5920;5359:27;;5298:89;;:::i;387:5920::-;;;;;;;;;;;;;;;;;;;;;;;;;5336:21;387:5920;;;;;;;;;;;;;;;;;5336:21;387:5920;-1:-1:-1;;387:5920:41;;;;;;;;;;;;;;;-1:-1:-1;387:5920:41;;;;;;;;;;;;;;;;;;;;","linkReferences":{}},"methodIdentifiers":{"getClientState()":"ef913a4b","misbehaviour(bytes)":"ddba6537","updateClient(bytes)":"0bece356","verifyMembership((bytes,(uint64,uint64),bytes[],bytes))":"682ed5f0","verifyNonMembership((bytes,(uint64,uint64),bytes[]))":"4d6d9ffb"},"rawMetadata":"{\"compiler\":{\"version\":\"0.8.28+commit.7893614a\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"name\":\"MembershipExists\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"MissingMembership\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"UnknownHeight\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ValueMismatch\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ZeroTimestamp\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"getClientState\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"name\":\"misbehaviour\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"updateMsg\",\"type\":\"bytes\"}],\"name\":\"updateClient\",\"outputs\":[{\"internalType\":\"enum ILightClientMsgs.UpdateResult\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes\",\"name\":\"proof\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"uint64\",\"name\":\"revisionNumber\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"revisionHeight\",\"type\":\"uint64\"}],\"internalType\":\"struct IICS02ClientMsgs.Height\",\"name\":\"proofHeight\",\"type\":\"tuple\"},{\"internalType\":\"bytes[]\",\"name\":\"path\",\"type\":\"bytes[]\"},{\"internalType\":\"bytes\",\"name\":\"value\",\"type\":\"bytes\"}],\"internalType\":\"struct ILightClientMsgs.MsgVerifyMembership\",\"name\":\"msg_\",\"type\":\"tuple\"}],\"name\":\"verifyMembership\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes\",\"name\":\"proof\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"uint64\",\"name\":\"revisionNumber\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"revisionHeight\",\"type\":\"uint64\"}],\"internalType\":\"struct IICS02ClientMsgs.Height\",\"name\":\"proofHeight\",\"type\":\"tuple\"},{\"internalType\":\"bytes[]\",\"name\":\"path\",\"type\":\"bytes[]\"}],\"internalType\":\"struct ILightClientMsgs.MsgVerifyNonMembership\",\"name\":\"msg_\",\"type\":\"tuple\"}],\"name\":\"verifyNonMembership\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"getClientState()\":{\"returns\":{\"_0\":\"The client state.\"}},\"misbehaviour(bytes)\":{\"params\":{\"misbehaviourMsg\":\"The misbehaviour message\"}},\"updateClient(bytes)\":{\"params\":{\"updateMsg\":\"The encoded update message e.g., an SP1 proof.\"},\"returns\":{\"_0\":\"The result of the update operation\"}},\"verifyMembership((bytes,(uint64,uint64),bytes[],bytes))\":{\"details\":\"Notice that this message is not view, as it may update the client state for caching purposes.\",\"params\":{\"msg_\":\"The membership message\"},\"returns\":{\"_0\":\"The unix timestamp of the verification height in the counterparty chain in seconds.\"}},\"verifyNonMembership((bytes,(uint64,uint64),bytes[]))\":{\"details\":\"Notice that this message is not view, as it may update the client state for caching purposes.\",\"params\":{\"msg_\":\"The membership message\"},\"returns\":{\"_0\":\"The unix timestamp of the verification height in the counterparty chain in seconds.\"}}},\"title\":\"Dummy Light Client\",\"version\":1},\"userdoc\":{\"errors\":{\"MembershipExists()\":[{\"notice\":\"A membership record exists for the queried height and path.\"}],\"MissingMembership()\":[{\"notice\":\"No membership record exists for the queried height and path.\"}],\"UnknownHeight()\":[{\"notice\":\"No timestamp has been registered for the queried height.\"}],\"ValueMismatch()\":[{\"notice\":\"The queried value does not match the stored value hash.\"}],\"ZeroTimestamp()\":[{\"notice\":\"Consensus timestamps must be non-zero.\"}]},\"kind\":\"user\",\"methods\":{\"getClientState()\":{\"notice\":\"Returns the client state.\"},\"misbehaviour(bytes)\":{\"notice\":\"Misbehaviour handling, moves the light client to the frozen state if misbehaviour is detected\"},\"updateClient(bytes)\":{\"notice\":\"Updating the client and consensus state\"},\"verifyMembership((bytes,(uint64,uint64),bytes[],bytes))\":{\"notice\":\"Querying the membership of a key-value pair\"},\"verifyNonMembership((bytes,(uint64,uint64),bytes[]))\":{\"notice\":\"Querying the non-membership of a key\"}},\"notice\":\"Insecure light client for local development and testing; proofs are ignored.\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/light-clients/dummy/DummyLightClient.sol\":\"DummyLightClient\"},\"evmVersion\":\"cancun\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"none\"},\"optimizer\":{\"enabled\":true,\"runs\":10000},\"remappings\":[\":@openzeppelin-contracts/=node_modules/@openzeppelin/contracts/\",\":@openzeppelin-upgradeable/=node_modules/@openzeppelin/contracts-upgradeable/\",\":@openzeppelin/=node_modules/@openzeppelin/\",\":@sp1-contracts/=node_modules/sp1-contracts/contracts/src/\",\":@uniswap/permit2/=node_modules/@uniswap/permit2/\",\":forge-std/=node_modules/forge-std/src/\",\":sp1-contracts/=node_modules/sp1-contracts/\"],\"viaIR\":true},\"sources\":{\"contracts/interfaces/ILightClient.sol\":{\"keccak256\":\"0x3b2361546ee834a442d844c979fbad3458ee13146b093f585587a09e19a266af\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://5b5d53101bb598f14a79cb1092479736fa18e8f84945ea6ef80f4dac84466042\",\"dweb:/ipfs/QmaTCo6M3Z9aYCSX65AQtixo1sB4ymQUDAgTXSKHqJHGDh\"]},\"contracts/light-clients/dummy/DummyLightClient.sol\":{\"keccak256\":\"0xc437cd8a47fe9aaaca75d70d1a8334f92a5a14a2165dac7125142786363f6b0b\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://928edc008c2a0748bcb36822d7a347cd5a1d30b26917cdeaa8b01b49bb3dd12b\",\"dweb:/ipfs/QmekzYQLNGG2JHW1deJ2mPLuoCxoHyjiT73K9fh5HMavW5\"]},\"contracts/msgs/IICS02ClientMsgs.sol\":{\"keccak256\":\"0x03d1265eae327c3744d774bf22a30d845233d50664921c9aa57cef2d71fd89d2\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://89900781cc5c60540a237d92d42745ea6165765ee8fb4d50e8137a717195cc75\",\"dweb:/ipfs/Qmbx5p8gZ8sEMMeZytXsLee49JUayhAaoJ2yxX93WUrvQo\"]},\"contracts/msgs/ILightClientMsgs.sol\":{\"keccak256\":\"0x8d1e56ab166a7b4aa6999708e3214a4645ebbc3835c2b2a4c255c9923eebafde\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://8bd4200dc04d950c0f050623fa9a8accdbec877fd446c039d4dd6c678bdf1513\",\"dweb:/ipfs/QmZQTViaA7N6BVNDzJ1Z6w799PrPoE4ajPueZSPwX4sGZ9\"]}},\"version\":1}","metadata":{"compiler":{"version":"0.8.28+commit.7893614a"},"language":"Solidity","output":{"abi":[{"inputs":[],"type":"error","name":"MembershipExists"},{"inputs":[],"type":"error","name":"MissingMembership"},{"inputs":[],"type":"error","name":"UnknownHeight"},{"inputs":[],"type":"error","name":"ValueMismatch"},{"inputs":[],"type":"error","name":"ZeroTimestamp"},{"inputs":[],"stateMutability":"view","type":"function","name":"getClientState","outputs":[{"internalType":"bytes","name":"","type":"bytes"}]},{"inputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"nonpayable","type":"function","name":"misbehaviour"},{"inputs":[{"internalType":"bytes","name":"updateMsg","type":"bytes"}],"stateMutability":"nonpayable","type":"function","name":"updateClient","outputs":[{"internalType":"enum ILightClientMsgs.UpdateResult","name":"","type":"uint8"}]},{"inputs":[{"internalType":"struct ILightClientMsgs.MsgVerifyMembership","name":"msg_","type":"tuple","components":[{"internalType":"bytes","name":"proof","type":"bytes"},{"internalType":"struct IICS02ClientMsgs.Height","name":"proofHeight","type":"tuple","components":[{"internalType":"uint64","name":"revisionNumber","type":"uint64"},{"internalType":"uint64","name":"revisionHeight","type":"uint64"}]},{"internalType":"bytes[]","name":"path","type":"bytes[]"},{"internalType":"bytes","name":"value","type":"bytes"}]}],"stateMutability":"nonpayable","type":"function","name":"verifyMembership","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[{"internalType":"struct ILightClientMsgs.MsgVerifyNonMembership","name":"msg_","type":"tuple","components":[{"internalType":"bytes","name":"proof","type":"bytes"},{"internalType":"struct IICS02ClientMsgs.Height","name":"proofHeight","type":"tuple","components":[{"internalType":"uint64","name":"revisionNumber","type":"uint64"},{"internalType":"uint64","name":"revisionHeight","type":"uint64"}]},{"internalType":"bytes[]","name":"path","type":"bytes[]"}]}],"stateMutability":"nonpayable","type":"function","name":"verifyNonMembership","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]}],"devdoc":{"kind":"dev","methods":{"getClientState()":{"returns":{"_0":"The client state."}},"misbehaviour(bytes)":{"params":{"misbehaviourMsg":"The misbehaviour message"}},"updateClient(bytes)":{"params":{"updateMsg":"The encoded update message e.g., an SP1 proof."},"returns":{"_0":"The result of the update operation"}},"verifyMembership((bytes,(uint64,uint64),bytes[],bytes))":{"details":"Notice that this message is not view, as it may update the client state for caching purposes.","params":{"msg_":"The membership message"},"returns":{"_0":"The unix timestamp of the verification height in the counterparty chain in seconds."}},"verifyNonMembership((bytes,(uint64,uint64),bytes[]))":{"details":"Notice that this message is not view, as it may update the client state for caching purposes.","params":{"msg_":"The membership message"},"returns":{"_0":"The unix timestamp of the verification height in the counterparty chain in seconds."}}},"version":1},"userdoc":{"kind":"user","methods":{"getClientState()":{"notice":"Returns the client state."},"misbehaviour(bytes)":{"notice":"Misbehaviour handling, moves the light client to the frozen state if misbehaviour is detected"},"updateClient(bytes)":{"notice":"Updating the client and consensus state"},"verifyMembership((bytes,(uint64,uint64),bytes[],bytes))":{"notice":"Querying the membership of a key-value pair"},"verifyNonMembership((bytes,(uint64,uint64),bytes[]))":{"notice":"Querying the non-membership of a key"}},"version":1}},"settings":{"remappings":["@openzeppelin-contracts/=node_modules/@openzeppelin/contracts/","@openzeppelin-upgradeable/=node_modules/@openzeppelin/contracts-upgradeable/","@openzeppelin/=node_modules/@openzeppelin/","@sp1-contracts/=node_modules/sp1-contracts/contracts/src/","@uniswap/permit2/=node_modules/@uniswap/permit2/","forge-std/=node_modules/forge-std/src/","sp1-contracts/=node_modules/sp1-contracts/"],"optimizer":{"enabled":true,"runs":10000},"metadata":{"bytecodeHash":"none"},"compilationTarget":{"contracts/light-clients/dummy/DummyLightClient.sol":"DummyLightClient"},"evmVersion":"cancun","libraries":{},"viaIR":true},"sources":{"contracts/interfaces/ILightClient.sol":{"keccak256":"0x3b2361546ee834a442d844c979fbad3458ee13146b093f585587a09e19a266af","urls":["bzz-raw://5b5d53101bb598f14a79cb1092479736fa18e8f84945ea6ef80f4dac84466042","dweb:/ipfs/QmaTCo6M3Z9aYCSX65AQtixo1sB4ymQUDAgTXSKHqJHGDh"],"license":"Apache-2.0"},"contracts/light-clients/dummy/DummyLightClient.sol":{"keccak256":"0xc437cd8a47fe9aaaca75d70d1a8334f92a5a14a2165dac7125142786363f6b0b","urls":["bzz-raw://928edc008c2a0748bcb36822d7a347cd5a1d30b26917cdeaa8b01b49bb3dd12b","dweb:/ipfs/QmekzYQLNGG2JHW1deJ2mPLuoCxoHyjiT73K9fh5HMavW5"],"license":"Apache-2.0"},"contracts/msgs/IICS02ClientMsgs.sol":{"keccak256":"0x03d1265eae327c3744d774bf22a30d845233d50664921c9aa57cef2d71fd89d2","urls":["bzz-raw://89900781cc5c60540a237d92d42745ea6165765ee8fb4d50e8137a717195cc75","dweb:/ipfs/Qmbx5p8gZ8sEMMeZytXsLee49JUayhAaoJ2yxX93WUrvQo"],"license":"Apache-2.0"},"contracts/msgs/ILightClientMsgs.sol":{"keccak256":"0x8d1e56ab166a7b4aa6999708e3214a4645ebbc3835c2b2a4c255c9923eebafde","urls":["bzz-raw://8bd4200dc04d950c0f050623fa9a8accdbec877fd446c039d4dd6c678bdf1513","dweb:/ipfs/QmZQTViaA7N6BVNDzJ1Z6w799PrPoE4ajPueZSPwX4sGZ9"],"license":"Apache-2.0"}},"version":1},"id":41} \ No newline at end of file diff --git a/ibc-solidity/abi/bytecode/SP1ICS07Tendermint.json b/ibc-solidity/abi/bytecode/SP1ICS07Tendermint.json index eea3d2be2..aa7cd9e37 100644 --- a/ibc-solidity/abi/bytecode/SP1ICS07Tendermint.json +++ b/ibc-solidity/abi/bytecode/SP1ICS07Tendermint.json @@ -1 +1 @@ -{"abi":[{"type":"constructor","inputs":[{"name":"updateClientProgramVkey","type":"bytes32","internalType":"bytes32"},{"name":"membershipProgramVkey","type":"bytes32","internalType":"bytes32"},{"name":"updateClientAndMembershipProgramVkey","type":"bytes32","internalType":"bytes32"},{"name":"misbehaviourProgramVkey","type":"bytes32","internalType":"bytes32"},{"name":"sp1Verifier","type":"address","internalType":"address"},{"name":"_clientState","type":"bytes","internalType":"bytes"},{"name":"_consensusState","type":"bytes32","internalType":"bytes32"},{"name":"roleManager","type":"address","internalType":"address"}],"stateMutability":"nonpayable"},{"type":"function","name":"ALLOWED_SP1_CLOCK_DRIFT","inputs":[],"outputs":[{"name":"","type":"uint16","internalType":"uint16"}],"stateMutability":"view"},{"type":"function","name":"DEFAULT_ADMIN_ROLE","inputs":[],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"type":"function","name":"MEMBERSHIP_PROGRAM_VKEY","inputs":[],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"type":"function","name":"MISBEHAVIOUR_PROGRAM_VKEY","inputs":[],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"type":"function","name":"PROOF_SUBMITTER_ROLE","inputs":[],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"type":"function","name":"UPDATE_CLIENT_AND_MEMBERSHIP_PROGRAM_VKEY","inputs":[],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"type":"function","name":"UPDATE_CLIENT_PROGRAM_VKEY","inputs":[],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"type":"function","name":"VERIFIER","inputs":[],"outputs":[{"name":"","type":"address","internalType":"contract ISP1Verifier"}],"stateMutability":"view"},{"type":"function","name":"clientState","inputs":[],"outputs":[{"name":"chainId","type":"string","internalType":"string"},{"name":"trustLevel","type":"tuple","internalType":"struct IICS07TendermintMsgs.TrustThreshold","components":[{"name":"numerator","type":"uint8","internalType":"uint8"},{"name":"denominator","type":"uint8","internalType":"uint8"}]},{"name":"latestHeight","type":"tuple","internalType":"struct IICS02ClientMsgs.Height","components":[{"name":"revisionNumber","type":"uint64","internalType":"uint64"},{"name":"revisionHeight","type":"uint64","internalType":"uint64"}]},{"name":"trustingPeriod","type":"uint32","internalType":"uint32"},{"name":"unbondingPeriod","type":"uint32","internalType":"uint32"},{"name":"isFrozen","type":"bool","internalType":"bool"},{"name":"zkAlgorithm","type":"uint8","internalType":"enum IICS07TendermintMsgs.SupportedZkAlgorithm"}],"stateMutability":"view"},{"type":"function","name":"getClientState","inputs":[],"outputs":[{"name":"","type":"bytes","internalType":"bytes"}],"stateMutability":"view"},{"type":"function","name":"getConsensusStateHash","inputs":[{"name":"revisionHeight","type":"uint64","internalType":"uint64"}],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"type":"function","name":"getRoleAdmin","inputs":[{"name":"role","type":"bytes32","internalType":"bytes32"}],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"type":"function","name":"grantRole","inputs":[{"name":"role","type":"bytes32","internalType":"bytes32"},{"name":"account","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"hasRole","inputs":[{"name":"role","type":"bytes32","internalType":"bytes32"},{"name":"account","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"misbehaviour","inputs":[{"name":"misbehaviourMsg","type":"bytes","internalType":"bytes"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"multicall","inputs":[{"name":"data","type":"bytes[]","internalType":"bytes[]"}],"outputs":[{"name":"results","type":"bytes[]","internalType":"bytes[]"}],"stateMutability":"nonpayable"},{"type":"function","name":"renounceRole","inputs":[{"name":"role","type":"bytes32","internalType":"bytes32"},{"name":"callerConfirmation","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"revokeRole","inputs":[{"name":"role","type":"bytes32","internalType":"bytes32"},{"name":"account","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"supportsInterface","inputs":[{"name":"interfaceId","type":"bytes4","internalType":"bytes4"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"updateClient","inputs":[{"name":"updateMsg","type":"bytes","internalType":"bytes"}],"outputs":[{"name":"","type":"uint8","internalType":"enum ILightClientMsgs.UpdateResult"}],"stateMutability":"nonpayable"},{"type":"function","name":"verifyMembership","inputs":[{"name":"msg_","type":"tuple","internalType":"struct ILightClientMsgs.MsgVerifyMembership","components":[{"name":"proof","type":"bytes","internalType":"bytes"},{"name":"proofHeight","type":"tuple","internalType":"struct IICS02ClientMsgs.Height","components":[{"name":"revisionNumber","type":"uint64","internalType":"uint64"},{"name":"revisionHeight","type":"uint64","internalType":"uint64"}]},{"name":"path","type":"bytes[]","internalType":"bytes[]"},{"name":"value","type":"bytes","internalType":"bytes"}]}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"nonpayable"},{"type":"function","name":"verifyNonMembership","inputs":[{"name":"msg_","type":"tuple","internalType":"struct ILightClientMsgs.MsgVerifyNonMembership","components":[{"name":"proof","type":"bytes","internalType":"bytes"},{"name":"proofHeight","type":"tuple","internalType":"struct IICS02ClientMsgs.Height","components":[{"name":"revisionNumber","type":"uint64","internalType":"uint64"},{"name":"revisionHeight","type":"uint64","internalType":"uint64"}]},{"name":"path","type":"bytes[]","internalType":"bytes[]"}]}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"nonpayable"},{"type":"event","name":"RoleAdminChanged","inputs":[{"name":"role","type":"bytes32","indexed":true,"internalType":"bytes32"},{"name":"previousAdminRole","type":"bytes32","indexed":true,"internalType":"bytes32"},{"name":"newAdminRole","type":"bytes32","indexed":true,"internalType":"bytes32"}],"anonymous":false},{"type":"event","name":"RoleGranted","inputs":[{"name":"role","type":"bytes32","indexed":true,"internalType":"bytes32"},{"name":"account","type":"address","indexed":true,"internalType":"address"},{"name":"sender","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"type":"event","name":"RoleRevoked","inputs":[{"name":"role","type":"bytes32","indexed":true,"internalType":"bytes32"},{"name":"account","type":"address","indexed":true,"internalType":"address"},{"name":"sender","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"type":"error","name":"AccessControlBadConfirmation","inputs":[]},{"type":"error","name":"AccessControlUnauthorizedAccount","inputs":[{"name":"account","type":"address","internalType":"address"},{"name":"neededRole","type":"bytes32","internalType":"bytes32"}]},{"type":"error","name":"AddressEmptyCode","inputs":[{"name":"target","type":"address","internalType":"address"}]},{"type":"error","name":"CannotHandleMisbehavior","inputs":[]},{"type":"error","name":"ChainIdMismatch","inputs":[{"name":"expected","type":"string","internalType":"string"},{"name":"actual","type":"string","internalType":"string"}]},{"type":"error","name":"ClientStateMismatch","inputs":[{"name":"expected","type":"bytes","internalType":"bytes"},{"name":"actual","type":"bytes","internalType":"bytes"}]},{"type":"error","name":"ConsensusStateHashMismatch","inputs":[{"name":"expected","type":"bytes32","internalType":"bytes32"},{"name":"actual","type":"bytes32","internalType":"bytes32"}]},{"type":"error","name":"ConsensusStateNotFound","inputs":[]},{"type":"error","name":"ConsensusStateRootMismatch","inputs":[{"name":"expected","type":"bytes32","internalType":"bytes32"},{"name":"actual","type":"bytes32","internalType":"bytes32"}]},{"type":"error","name":"EmptyValue","inputs":[]},{"type":"error","name":"FailedCall","inputs":[]},{"type":"error","name":"FeatureNotSupported","inputs":[]},{"type":"error","name":"FrozenClientState","inputs":[]},{"type":"error","name":"InvalidMembershipProof","inputs":[]},{"type":"error","name":"KeyValuePairNotInCache","inputs":[{"name":"path","type":"bytes[]","internalType":"bytes[]"},{"name":"value","type":"bytes","internalType":"bytes"}]},{"type":"error","name":"LengthIsOutOfRange","inputs":[{"name":"length","type":"uint256","internalType":"uint256"},{"name":"min","type":"uint256","internalType":"uint256"},{"name":"max","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"MembershipProofKeyNotFound","inputs":[{"name":"path","type":"bytes[]","internalType":"bytes[]"}]},{"type":"error","name":"MembershipProofValueMismatch","inputs":[{"name":"expected","type":"bytes","internalType":"bytes"},{"name":"actual","type":"bytes","internalType":"bytes"}]},{"type":"error","name":"ProofHeightMismatch","inputs":[{"name":"expectedRevisionNumber","type":"uint64","internalType":"uint64"},{"name":"expectedRevisionHeight","type":"uint64","internalType":"uint64"},{"name":"actualRevisionNumber","type":"uint64","internalType":"uint64"},{"name":"actualRevisionHeight","type":"uint64","internalType":"uint64"}]},{"type":"error","name":"ProofIsInTheFuture","inputs":[{"name":"now","type":"uint256","internalType":"uint256"},{"name":"proofTimestamp","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"ProofIsTooOld","inputs":[{"name":"now","type":"uint256","internalType":"uint256"},{"name":"proofTimestamp","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"TrustThresholdMismatch","inputs":[{"name":"expectedNumerator","type":"uint256","internalType":"uint256"},{"name":"expectedDenominator","type":"uint256","internalType":"uint256"},{"name":"actualNumerator","type":"uint256","internalType":"uint256"},{"name":"actualDenominator","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"TrustingPeriodMismatch","inputs":[{"name":"expected","type":"uint256","internalType":"uint256"},{"name":"actual","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"TrustingPeriodTooLong","inputs":[{"name":"trustingPeriod","type":"uint256","internalType":"uint256"},{"name":"unbondingPeriod","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"UnbondingPeriodMismatch","inputs":[{"name":"expected","type":"uint256","internalType":"uint256"},{"name":"actual","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"UnknownMembershipProofType","inputs":[{"name":"proofType","type":"uint8","internalType":"uint8"}]},{"type":"error","name":"UnknownZkAlgorithm","inputs":[{"name":"algorithm","type":"uint8","internalType":"uint8"}]},{"type":"error","name":"VerificationKeyMismatch","inputs":[{"name":"expected","type":"bytes32","internalType":"bytes32"},{"name":"actual","type":"bytes32","internalType":"bytes32"}]}],"bytecode":{"object":"0x61012060405234610541576137358038038061001a81610564565b928339810161010082820312610541578151916020810151604082015160608301519061004960808501610589565b60a08501519095906001600160401b0381116105415785019080601f8301121561054157815161007b9260200161059d565b9261008d60e060c08701519601610589565b9660805260a05260c05260e05280518101906020820190602081840312610541576020810151906001600160401b038211610541570191829003601f1981019061012013610541576040519160e083016001600160401b0381118482101761052d5760405260208401516001600160401b038111610541576020908501019080601f830112156105415781516101259260200161059d565b825260408112610541576040610139610545565b916101458286016105dd565b8352610153606086016105dd565b602084015260208401928352603f19011261054157610170610545565b61017c608085016105eb565b815261018a60a085016105eb565b6020820152604083019081526101a260c085016105ff565b90606084019182526101b660e086016105ff565b92608085019384526101008601519586151587036105415760a0860196875261012001519460028610156105415760c08101958652518051906001600160401b03821161052d57600154600181811c91168015610523575b602082101461050f57601f81116104ac575b50602090601f831160011461043f5763ffffffff95949392915f9183610434575b50508160011b915f199060031b1c1916176001555b5160ff81511661ff00602060025493015160081b169161ffff191617176002555160018060401b0381511660035491602068010000000000000000600160801b0391015160401b169160018060801b031916171760035551169267ffffffff00000000600454925160201b169051151560401b92519160028310156104205769ff00000000000000000068ff00000000000000009360481b169469ff000000000000000000199160018060481b0319161716179116171760045560018060401b0360035460401c165f52600560205260405f205560018060a01b03166101005260045463ffffffff8116610708810163ffffffff811161040c5763ffffffff809360201c1692839116116103f757826001600160a01b0381166103de575061037c610706565b505b604051612f0c908161078982396080518181816105570152611482015260a0518181816101f90152611e3e015260c051818181610cf001526121c2015260e0518181816102a00152610afe015261010051818181610cb50152611a570152f35b806103eb6103f192610610565b50610686565b5061037e565b6333fae18560e21b5f5260045260245260445ffd5b634e487b7160e01b5f52601160045260245ffd5b634e487b7160e01b5f52602160045260245ffd5b015190505f80610241565b90601f1983169160015f52815f20925f5b818110610494575091600193918563ffffffff99989796941061047c575b505050811b01600155610256565b01515f1960f88460031b161c191690555f808061046e565b92936020600181928786015181550195019301610450565b60015f527fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf6601f840160051c81019160208510610505575b601f0160051c01905b8181106104fa5750610220565b5f81556001016104ed565b90915081906104e4565b634e487b7160e01b5f52602260045260245ffd5b90607f169061020e565b634e487b7160e01b5f52604160045260245ffd5b5f80fd5b60408051919082016001600160401b0381118382101761052d57604052565b6040519190601f01601f191682016001600160401b0381118382101761052d57604052565b51906001600160a01b038216820361054157565b9192916001600160401b03821161052d576105c1601f8301601f1916602001610564565b938285528282011161054157815f926020928387015e84010152565b519060ff8216820361054157565b51906001600160401b038216820361054157565b519063ffffffff8216820361054157565b6001600160a01b0381165f9081525f5160206137155f395f51905f52602052604090205460ff16610681576001600160a01b03165f8181525f5160206137155f395f51905f5260205260408120805460ff191660011790553391905f5160206136955f395f51905f528180a4600190565b505f90565b6001600160a01b0381165f9081525f5160206136b55f395f51905f52602052604090205460ff16610681576001600160a01b03165f8181525f5160206136b55f395f51905f5260205260408120805460ff191660011790553391905f5160206136f55f395f51905f52905f5160206136955f395f51905f529080a4600190565b5f80525f5160206136b55f395f51905f526020525f5160206136d55f395f51905f525460ff16610784575f8080525f5160206136b55f395f51905f526020525f5160206136d55f395f51905f52805460ff1916600117905533905f5160206136f55f395f51905f525f5160206136955f395f51905f528280a4600190565b5f9056fe6080806040526004361015610012575f80fd5b5f3560e01c90816301ffc9a714610d13575080630225293e14610cd957806308c84e7014610c895780630bece35614610bc657806323842fb814610b96578063248a9ca314610b6c5780632c3ee47414610b505780632f2ff15d14610b21578063314d4dff14610ae757806336568abe14610a8b5780634d6d9ffb146109a95780635972185a1461096f578063682ed5f01461084b57806391d1485414610802578063a217fddf146107e8578063ac9650d81461066a578063bd3ce6b01461057a578063ca7242f914610540578063d547741f1461050a578063ddba65371461021c578063e45a6d0d146101e25763ef913a4b1461010e575f80fd5b346101de575f6003193601126101de576101da60405160208082015261012060408201526101c6816101436101608201610f03565b60ff600254818116606085015260081c16608083015267ffffffffffffffff60035481811660a085015260401c1660c083015260ff60045463ffffffff811660e085015263ffffffff8160201c16610100850152818160401c16151561012085015260481c166101b28161109c565b61014083015203601f198101835282611079565b604051918291602083526020830190610e35565b0390f35b5f80fd5b346101de575f6003193601126101de5760206040517f00000000000000000000000000000000000000000000000000000000000000008152f35b346101de5761022a36610db1565b6004549160ff8360401c166104e2575f80527f4c48d1d2b0f4f7485fc28e3db22341d96a20aa29e6efa8149da9751603abd4e06020527f6e0c24a6e293ff9b755263dbaa15ba3796b0b8d3fe17cfb4ddf8143b268eac4754610298929060ff16156104d5575b810190611116565b6102c78151517f00000000000000000000000000000000000000000000000000000000000000008082146111c6565b6020815101518051810160208101916020818303126101de57602081015167ffffffffffffffff81116101de57019061018090829003126101de576040519061030f82611009565b602081015167ffffffffffffffff81116101de5783908201602001906103349161129d565b825261034260408201611385565b60208301908152906103578460608301611256565b604084019081529161036c8560a08401611256565b60608501908152946103818160e085016113a2565b92608086019384526101400190610397916113a2565b9360a081019485525190516fffffffffffffffffffffffffffffffff166103bd9161265e565b516040805182516fffffffffffffffffffffffffffffffff166020808301918252840151828401529190920151606080840191909152825290610401608082611079565b51902090516020015167ffffffffffffffff1661041d90611686565b61042a91908181146118b9565b516040805182516fffffffffffffffffffffffffffffffff16602080830191825284015182840152919092015160608084019190915282529061046e608082611079565b51902090516020015167ffffffffffffffff1661048a90611686565b61049791908181146118b9565b516104a190611a40565b7fffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffff1668010000000000000000176004555f80f35b6104dd6117cb565b610290565b7f928b1233000000000000000000000000000000000000000000000000000000005f5260045ffd5b346101de5761053e61051b36610e02565b90610539610534825f525f602052600160405f20015490565b611853565b611be2565b005b346101de575f6003193601126101de5760206040517f00000000000000000000000000000000000000000000000000000000000000008152f35b346101de575f6003193601126101de576040516105a18161059a81610f03565b0382611079565b6101206040516105b081610fc0565b60025460ff8116825260ff602083019160081c16815260ff6040516105d481610fc0565b67ffffffffffffffff600354818116835281602084019160401c168152816004549385808660481c1697816106146040519d8d8f9e8f9081520190610e35565b9a511660208c0152511660408a0152511660608801525116608086015263ffffffff811660a086015263ffffffff8160201c1660c086015260401c16151560e08401526106608161109c565b6101008301520390f35b346101de5760206003193601126101de5760043567ffffffffffffffff81116101de57366023820112156101de57806004013567ffffffffffffffff81116101de57602482013660248360051b850101116101de576020906040516106cf8382611079565b5f815282810191601f1984013684376106e785611772565b956106f56040519788611079565b858752601f1961070487611772565b01855f5b8281106107d8575050505f5b868110156107c5576001906107a15f8061076e8861073a60248760051b8a01018a6116cd565b8d8d6040959395519483869484860198893784019083820190898252519283915e010185815203601f198101835282611079565b5190305af43d156107bd573d90610784826110a6565b916107926040519384611079565b82523d5f8b84013e5b30612d1f565b6107ab828b61178a565b526107b6818a61178a565b5001610714565b60609061079b565b604051868152806101da8189018b610e5a565b606082828c010152018690610708565b346101de575f6003193601126101de5760206040515f8152f35b346101de5761081036610e02565b905f525f60205273ffffffffffffffffffffffffffffffffffffffff60405f2091165f52602052602060ff60405f2054166040519015158152f35b346101de5760206003193601126101de5760043567ffffffffffffffff81116101de578060040160a060031983360301126101de5760ff60045460401c166104e2575f80527f4c48d1d2b0f4f7485fc28e3db22341d96a20aa29e6efa8149da9751603abd4e06020527f6e0c24a6e293ff9b755263dbaa15ba3796b0b8d3fe17cfb4ddf8143b268eac475460ff1615610962575b60848201916108ee83836116cd565b90501561093a576020928261090681610932956116cd565b602461092a61092361091b606489018761171e565b9790966116cd565b36916110c2565b950191611d2b565b604051908152f35b7f1208b21b000000000000000000000000000000000000000000000000000000005f5260045ffd5b61096a6117cb565b6108df565b346101de575f6003193601126101de5760206040517fbd893629a699470e4ec82a5715bb4981fdaacc5d0a728bf5f55b801d8f4ef10b8152f35b346101de5760206003193601126101de5760043567ffffffffffffffff81116101de5780600401608060031983360301126101de5760ff60045460401c166104e2575f80527f4c48d1d2b0f4f7485fc28e3db22341d96a20aa29e6efa8149da9751603abd4e060209081527f6e0c24a6e293ff9b755263dbaa15ba3796b0b8d3fe17cfb4ddf8143b268eac4754909261093292909160ff1615610a7e575b610a61610a5482806116cd565b919092606485019061171e565b929091602460405195610a748988611079565b5f87520191611d2b565b610a866117cb565b610a47565b346101de57610a9936610e02565b3373ffffffffffffffffffffffffffffffffffffffff821603610abf5761053e91611be2565b7f6697b232000000000000000000000000000000000000000000000000000000005f5260045ffd5b346101de575f6003193601126101de5760206040517f00000000000000000000000000000000000000000000000000000000000000008152f35b346101de5761053e610b3236610e02565b90610b4b610534825f525f602052600160405f20015490565b611b10565b346101de575f6003193601126101de5760206040516107088152f35b346101de5760206003193601126101de5760206109326004355f525f602052600160405f20015490565b346101de5760206003193601126101de5760043567ffffffffffffffff811681036101de57610932602091611686565b346101de57610bd436610db1565b60ff60045460401c166104e2575f80527f4c48d1d2b0f4f7485fc28e3db22341d96a20aa29e6efa8149da9751603abd4e06020527f6e0c24a6e293ff9b755263dbaa15ba3796b0b8d3fe17cfb4ddf8143b268eac4754610c3c929060ff1615610c7c5761146e565b6040516003821015610c4f576020918152f35b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b610c846117cb565b61146e565b346101de575f6003193601126101de57602060405173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b346101de575f6003193601126101de5760206040517f00000000000000000000000000000000000000000000000000000000000000008152f35b346101de5760206003193601126101de57600435907fffffffff0000000000000000000000000000000000000000000000000000000082168092036101de57817f7965db0b0000000000000000000000000000000000000000000000000000000060209314908115610d87575b5015158152f35b7f01ffc9a70000000000000000000000000000000000000000000000000000000091501483610d80565b9060206003198301126101de5760043567ffffffffffffffff81116101de57826023820112156101de5780600401359267ffffffffffffffff84116101de57602484830101116101de576024019190565b60031960409101126101de576004359060243573ffffffffffffffffffffffffffffffffffffffff811681036101de5790565b90601f19601f602080948051918291828752018686015e5f8582860101520116010190565b9080602083519182815201916020808360051b8301019401925f915b838310610e8557505050505090565b9091929394602080610ea383601f1986600196030187528951610e35565b97019301930191939290610e76565b90600182811c92168015610ef9575b6020831014610ecc57565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b91607f1691610ec1565b6001545f9291610f1282610eb2565b8082529160018116908115610f865750600114610f2d575050565b60015f9081529293509091907fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf65b838310610f6c575060209250010190565b600181602092949394548385870101520191019190610f5b565b60209495507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0091509291921683830152151560051b010190565b6040810190811067ffffffffffffffff821117610fdc57604052565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b60c0810190811067ffffffffffffffff821117610fdc57604052565b6020810190811067ffffffffffffffff821117610fdc57604052565b6060810190811067ffffffffffffffff821117610fdc57604052565b60e0810190811067ffffffffffffffff821117610fdc57604052565b90601f601f19910116810190811067ffffffffffffffff821117610fdc57604052565b60021115610c4f57565b67ffffffffffffffff8111610fdc57601f01601f191660200190565b9291926110ce826110a6565b916110dc6040519384611079565b8294818452818301116101de578281602093845f960137010152565b9080601f830112156101de57816020611113933591016110c2565b90565b6020818303126101de5780359067ffffffffffffffff82116101de5701906020828203126101de576040519161114b83611025565b80359067ffffffffffffffff82116101de57016060818303126101de576040519161117583611041565b81358352602082013567ffffffffffffffff81116101de57816111999184016110f8565b6020840152604082013567ffffffffffffffff81116101de576111bc92016110f8565b6040820152815290565b156111cf575050565b7fd56bdc26000000000000000000000000000000000000000000000000000000005f5260045260245260445ffd5b929192611209826110a6565b916112176040519384611079565b8294818452818301116101de578281602093845f96015e010152565b519060ff821682036101de57565b519067ffffffffffffffff821682036101de57565b91908260409103126101de5760405161126e81610fc0565b602061128781839561127f81611241565b855201611241565b910152565b519063ffffffff821682036101de57565b91908281039261012084126101de57604051916112b98361105d565b8294825167ffffffffffffffff81116101de57830182601f820112156101de576040916112ef84836020601f19955191016111fd565b865201126101de576113349060405161130781610fc0565b61131360208501611233565b815261132160408501611233565b6020820152602085015260608301611256565b604083015261134560a0820161128c565b606083015261135660c0820161128c565b608083015260e08101519081151582036101de576101009160a084015201519060028210156101de5760c00152565b51906fffffffffffffffffffffffffffffffff821682036101de57565b91908260609103126101de576040516113ba81611041565b60408082946113c881611385565b8452602081015160208501520151910152565b9190610180838203126101de57604051906113f582611009565b819380519167ffffffffffffffff83116101de576101408261141e8360a096611287960161129d565b865261142d83602083016113a2565b602087015261143f83608083016113a2565b604087015261145060e08201611385565b6060870152611463836101008301611256565b608087015201611256565b61147a91810190611116565b6114a98151517f00000000000000000000000000000000000000000000000000000000000000008082146111c6565b60208151015180518101906020818303126101de5760208101519167ffffffffffffffff83116101de576114e49260208092019201016113db565b906114ee826118f0565b6114f782611983565b916003831015610c4f578261162957908167ffffffffffffffff6020604060a0611113960193845184848201511685600354851c1681116115a1575b5050015160405161158681611578858201948591909160408060608301946fffffffffffffffffffffffffffffffff8151168452602081015160208501520151910152565b03601f198101835282611079565b51902092510151165f52600560205260405f20555b51611a40565b6115e08661162293511667ffffffffffffffff167fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000006003541617600355565b7fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff6fffffffffffffffff00000000000000006003549260401b16911617600355565b5f80611533565b506001820361166e5761111390680100000000000000007fffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffff600454161760045561159b565b6002821461167f576111139061159b565b5050600290565b67ffffffffffffffff165f52600560205260405f205480156116a55790565b7f5b48b457000000000000000000000000000000000000000000000000000000005f5260045ffd5b9035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1813603018212156101de570180359067ffffffffffffffff82116101de576020019181360383136101de57565b9035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1813603018212156101de570180359067ffffffffffffffff82116101de57602001918160051b360383136101de57565b67ffffffffffffffff8111610fdc5760051b60200190565b805182101561179e5760209160051b010190565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b335f9081527f4c48d1d2b0f4f7485fc28e3db22341d96a20aa29e6efa8149da9751603abd4e0602052604090205460ff161561180357565b7fe2517d3f000000000000000000000000000000000000000000000000000000005f52336004527fbd893629a699470e4ec82a5715bb4981fdaacc5d0a728bf5f55b801d8f4ef10b60245260445ffd5b805f525f60205260405f2073ffffffffffffffffffffffffffffffffffffffff33165f5260205260ff60405f2054161561188a5750565b7fe2517d3f000000000000000000000000000000000000000000000000000000005f523360045260245260445ffd5b156118c2575050565b7f6d23e8a3000000000000000000000000000000000000000000000000000000005f5260045260245260445ffd5b6119819061191681516fffffffffffffffffffffffffffffffff6060840151169061265e565b61197967ffffffffffffffff602060808185015160405161196b81611578868201948591909160408060608301946fffffffffffffffffffffffffffffffff8151168452602081015160208501520151910152565b519020940151015116611686565b8082146118b9565b565b67ffffffffffffffff602060a08301510151165f52600560205260405f205480155f146119b05750505f90565b604082019081516040516119f98161157860208201948591909160408060608301946fffffffffffffffffffffffffffffffff8151168452602081015160208501520151910152565b5190201491821592611a17575b505015611a1257600190565b600290565b6fffffffffffffffffffffffffffffffff91925060208291015151169151511611155f80611a06565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169080516040602083015192015192803b156101de575f92611ad892611aea604051968795869485947f41493c600000000000000000000000000000000000000000000000000000000086526004860152606060248601526064850190610e35565b90600319848303016044850152610e35565b03915afa8015611b0557611afb5750565b5f61198191611079565b6040513d5f823e3d90fd5b805f525f60205260405f2073ffffffffffffffffffffffffffffffffffffffff83165f5260205260ff60405f205416155f14611bdc57805f525f60205260405f2073ffffffffffffffffffffffffffffffffffffffff83165f5260205260405f2060017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0082541617905573ffffffffffffffffffffffffffffffffffffffff339216907f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d5f80a4600190565b50505f90565b805f525f60205260405f2073ffffffffffffffffffffffffffffffffffffffff83165f5260205260ff60405f2054165f14611bdc57805f525f60205260405f2073ffffffffffffffffffffffffffffffffffffffff83165f5260205260405f207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00815416905573ffffffffffffffffffffffffffffffffffffffff339216907ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b5f80a4600190565b3567ffffffffffffffff811681036101de5790565b929190611ccb81611772565b93611cd96040519586611079565b602085838152019160051b8101918383116101de5781905b838210611cff575050505050565b813567ffffffffffffffff81116101de57602091611d2087849387016110f8565b815201910190611cf1565b90949291939480156125a5578101906020818303126101de5780359067ffffffffffffffff82116101de57016040818303126101de5760405191611d6e83610fc0565b813560028110156101de578352602082013567ffffffffffffffff81116101de57611d9992016110f8565b90602081019182528051611dac8161109c565b611db58161109c565b612022575051908151820160208101926020818303126101de57602081015167ffffffffffffffff81116101de570190608090829003126101de5760405192611dfd84610fc0565b602082015167ffffffffffffffff81116101de5782611e26836020604094611e2e9701016129d0565b8652016113a2565b9460208301958652611e658351517f00000000000000000000000000000000000000000000000000000000000000008082146111c6565b6020835101519182518301926020818503126101de5760208101519067ffffffffffffffff82116101de5701926040848203126101de5760405193611ea985610fc0565b6020810151855260408101519167ffffffffffffffff83116101de57611ed6926020809201920101612a36565b94611ef06020850196808852518015158061201657612b83565b5f805b87518051831015611fe357611f0b83611f1e9261178a565b5151611f18368888611cbf565b90612db8565b15611fd957508694611f7d611f92956fffffffffffffffffffffffffffffffff9a9895611f7661159b966020633b9aca009f9d8198611f5d915161178a565b51015190815181518082149182611fc5575b5050612bc1565b6001612c0f565b51950194611f8a86611caa565b875191612e2a565b516001815111611fa6575b50505151160490565b611fb2611fbe92611caa565b90848451511691612eba565b5f80611f9d565b909150898401209089830120145f80611f6f565b9060010190611ef3565b5061159b92506020915094611f7d611f92956fffffffffffffffffffffffffffffffff9a9895633b9aca009c9a98612c0f565b5061ffff811115612b83565b949060018695939495516120358161109c565b61203e8161109c565b146120855760ff86516120508161109c565b6120598161109c565b7fd3a2e6c9000000000000000000000000000000000000000000000000000000005f521660045260245ffd5b90919293945051926060602060405161209d81610fc0565b6040516120a981611009565b6040516120b58161105d565b8481526040516120c481610fc0565b5f81525f85820152848201526040516120dc81610fc0565b5f81525f8582015260408201525f858201525f60808201525f60a08201525f60c0820152815261210a612998565b83820152612116612998565b60408201525f8482015260405161212c81610fc0565b5f81525f84820152608082015260405161214581610fc0565b5f81525f8482015260a08201528152015283518401936020818603126101de5760208101519067ffffffffffffffff82116101de5701936020858203126101de576040519461219386611025565b60208101519067ffffffffffffffff82116101de5760206121bc92816121e995019201016129d0565b808652517f00000000000000000000000000000000000000000000000000000000000000008082146111c6565b602084510151948551860160208101966020818303126101de57602081015167ffffffffffffffff81116101de570190604090829003126101de576040519661223188610fc0565b602082015167ffffffffffffffff81116101de57816020612254928501016113db565b885260408201519167ffffffffffffffff83116101de576122789201602001612a36565b936122926020880195808752518015158061201657612b83565b60208101956122a087611caa565b67ffffffffffffffff60a08a5101519181602084015116918291161480612586575b6122cb85611caa565b9267ffffffffffffffff6122de8c611caa565b915116911561253857505050506122f99061159b89516118f0565b6123038751611983565b6003811015610c4f5780612507575061231b86611caa565b67ffffffffffffffff8060035460401c169116116124b4575b5060408651015160405161237d8161157860208201948591909160408060608301946fffffffffffffffffffffffffffffffff8151168452602081015160208501520151910152565b51902067ffffffffffffffff61239287611caa565b165f52600560205260405f20555b5f805b8551805183101561248957611f0b836123bb9261178a565b1561247f5750633b9aca0096936fffffffffffffffffffffffffffffffff9693611f76879460206123f261240a9660409b5161178a565b51015190815181518082149182612469575050612bc1565b6124318351858101519067ffffffffffffffff602060a08185015193015101511690612e2a565b516001815111612447575b505051015151160490565b61245361246292611caa565b90858585510151511691612eba565b5f8061243c565b9091506020840120906020830120145f80611f6f565b90600101906123a3565b50604095925061240a9150936fffffffffffffffffffffffffffffffff9693633b9aca009895612c0f565b6124c06124f591611caa565b67ffffffffffffffff167fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000006003541617600355565b6125016115e086611caa565b5f612334565b60019150036123a0577f59bc8fd3000000000000000000000000000000000000000000000000000000005f5260045ffd5b6084945067ffffffffffffffff9081604051957fb8d8167e00000000000000000000000000000000000000000000000000000000875216600486015216602484015260448301526064820152fd5b5061259084611caa565b67ffffffffffffffff808451169116146122c2565b505090916125b860206125cd9201611caa565b91604051946125c686610fc0565b3691611cbf565b8352602083019182526040516125ec81611578866020830195866128ca565b5190205c915190518215612606575050633b9aca00900490565b9061265a612648926040519384937ff06fc33b000000000000000000000000000000000000000000000000000000008552604060048601526044850190610e5a565b90600319848303016024850152610e35565b0390fd5b906fffffffffffffffffffffffffffffffff633b9aca0091160442811161289b5780420342811161286e576107081061283f57508051516126a0600154610eb2565b1480612818575b815190156127d85750602081015160ff815116906002549160ff83169283821492836127bf575b6020015160ff169215612777575050505063ffffffff606082015116906004549163ffffffff831680820361274957505063ffffffff608081920151169160201c1680820361271b575050565b7f1eb5c1eb000000000000000000000000000000000000000000000000000000005f5260045260245260445ffd5b7f73b1bde3000000000000000000000000000000000000000000000000000000005f5260045260245260445ffd5b6084945060ff90604051947fd382033a000000000000000000000000000000000000000000000000000000008652600486015260081c16602484015260448301526064820152fd5b6020810151600883901c60ff90811691161493506126ce565b61265a906040519182917ff6b6676b0000000000000000000000000000000000000000000000000000000083526040600484015261264860448401610f03565b508051602081519101206040516128328161059a81610f03565b60208151910120146126a7565b7f12e74add000000000000000000000000000000000000000000000000000000005f524260045260245260445ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b7f20daedb6000000000000000000000000000000000000000000000000000000005f524260045260245260445ffd5b9067ffffffffffffffff90939293168152604060208201526080810190835191604080830152825180915260a0820190602060a08260051b8501019401915f905b82821061294f57505050506020611113939401519060607fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc082850301910152610e35565b9091929460208061298a837fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6089600196030186528951610e35565b97019201920190929161290b565b604051906129a582611041565b5f6040838281528260208201520152565b9080601f830112156101de578151611113926020016111fd565b91906060838203126101de57604051906129e982611041565b819380518352602081015167ffffffffffffffff81116101de5782612a0f9183016129b6565b602084015260408101519167ffffffffffffffff83116101de5760409261128792016129b6565b9080601f830112156101de57815191612a4e83611772565b92612a5c6040519485611079565b80845260208085019160051b830101918383116101de5760208101915b838310612a8857505050505090565b825167ffffffffffffffff81116101de578201906040601f1983880301126101de5760405190612ab782610fc0565b602083015167ffffffffffffffff81116101de5760209084010187601f820112156101de578051612ae781611772565b91612af56040519384611079565b81835260208084019260051b820101918a83116101de5760208201905b838210612b555750505050825260408301519167ffffffffffffffff83116101de57612b46886020809695819601016129b6565b83820152815201920191612a79565b815167ffffffffffffffff81116101de57602091612b788e8480948801016129b6565b815201910190612b12565b15612b8b5750565b7fb0369c31000000000000000000000000000000000000000000000000000000005f52600452600160245261ffff60445260645ffd5b91909115612bcd575050565b9061265a612648926040519384937f5f1ca381000000000000000000000000000000000000000000000000000000008552604060048601526044850190610e35565b91909115612c1b575050565b604051907ffef760c700000000000000000000000000000000000000000000000000000000825280602483016020600485015252604482019260448260051b84010191815f907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1813603015b838310612c945786860387fd5b90919293947fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbc8782030188528535828112156101de578301906020823592019167ffffffffffffffff81116101de5780360383136101de57602082601f19601f8480600198869897879852868601375f85828601015201160101970198019301919096939296612c87565b90612d5c5750805115612d3457602081519101fd5b7fd6bda275000000000000000000000000000000000000000000000000000000005f5260045ffd5b81511580612daf575b612d6d575090565b73ffffffffffffffffffffffffffffffffffffffff907f9996b315000000000000000000000000000000000000000000000000000000005f521660045260245ffd5b50803b15612d65565b908151815103611bdc575f5b8251811015612e2257612dd7818461178a565b5151612de3828461178a565b515103612e1b57612df4818461178a565b5160208151910120612e06828461178a565b516020815191012003612e1b57600101612dc4565b5050505f90565b505050600190565b91612e7f60209261197960405185810190612e7681611578888591909160408060608301946fffffffffffffffffffffffffffffffff8151168452602081015160208501520151910152565b51902091611686565b0151808203612e8c575050565b7f4b2dfe98000000000000000000000000000000000000000000000000000000005f5260045260245260445ffd5b929190925f5b8451811015612ef8578083612ed76001938861178a565b51604051612eee81611578602082019489866128ca565b5190205d01612ec0565b505050905056fea164736f6c634300081c000a2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d4c48d1d2b0f4f7485fc28e3db22341d96a20aa29e6efa8149da9751603abd4e06e0c24a6e293ff9b755263dbaa15ba3796b0b8d3fe17cfb4ddf8143b268eac47bd893629a699470e4ec82a5715bb4981fdaacc5d0a728bf5f55b801d8f4ef10bad3228b676f7d3cd4284a5443f17f1962b36e491b30a40b2405849e597ba5fb5","sourceMap":"1355:25496:45:-:0;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;-1:-1:-1;;;;;1355:25496:45;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;:::i;:::-;3774:52;1355:25496;3774:52;1355:25496;3836:47;1355:25496;3893:80;1355:25496;3983:51;1355:25496;;4059:60;;;1355:25496;4059:60;;1355:25496;;;;;;;;;4059:60;;1355:25496;;-1:-1:-1;;;;;1355:25496:45;;;;;;;;;-1:-1:-1;;1355:25496:45;;;;-1:-1:-1;1355:25496:45;;;;;;;;-1:-1:-1;;;;;1355:25496:45;;;;;;;;;;;;;;-1:-1:-1;;;;;1355:25496:45;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;1355:25496:45;;;;;;;;;;;;;;;;-1:-1:-1;1355:25496:45;;;;;;;;;;;-1:-1:-1;1355:25496:45;;;;;;;;;;;;;;;;-1:-1:-1;;1355:25496:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1355:25496:45;4129:21;1355:25496;;;-1:-1:-1;1355:25496:45;;;;;;;;;4220:36;1355:25496;;;;;2472:10;;;1355:25496;2472:10;;;;1355:25496;2472:10;;1355:25496;2472:10;1355:25496;;;;;4288:83;2472:10;;1355:25496;-1:-1:-1;;;;;1355:25496:45;;;;4529:44;;;:::i;:::-;;4484:351;1355:25496;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4484:351;4637:43;;4736:45;4637:43;;:::i;:::-;;4736:45;:::i;:::-;;4484:351;;2472:10;;;;-1:-1:-1;2472:10:45;1355:25496;2472:10;;;;-1:-1:-1;2472:10:45;;1355:25496;;;-1:-1:-1;2472:10:45;;1355:25496;2472:10;;-1:-1:-1;2472:10:45;1355:25496;;;;-1:-1:-1;1355:25496:45;;;;;-1:-1:-1;1355:25496:45;;;;;-1:-1:-1;1355:25496:45;;;;;;;;;;;;-1:-1:-1;1355:25496:45;;-1:-1:-1;1355:25496:45;;-1:-1:-1;1355:25496:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1355:25496:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1355:25496:45;;;;;;;;;-1:-1:-1;1355:25496:45;;;;;;;;-1:-1:-1;1355:25496:45;;;;;-1:-1:-1;1355:25496:45;;;;;;;;;;;;-1:-1:-1;1355:25496:45;;;;;-1:-1:-1;1355:25496:45;;-1:-1:-1;1355:25496:45;;;;;;;;;;-1:-1:-1;;;;;1355:25496:45;;;;;;;;;;:::o;:::-;;;;;;;-1:-1:-1;;1355:25496:45;;;-1:-1:-1;;;;;1355:25496:45;;;;;;;;;;:::o;:::-;;;-1:-1:-1;;;;;1355:25496:45;;;;;;:::o;:::-;;;;-1:-1:-1;;;;;1355:25496:45;;;;;;;;-1:-1:-1;;1355:25496:45;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;:::o;:::-;;;-1:-1:-1;;;;;1355:25496:45;;;;;;:::o;:::-;;;;;;;;;;:::o;6155:316:92:-;-1:-1:-1;;;;;1355:25496:45;;;;;;-1:-1:-1;;;;;;;;;;;1355:25496:45;;;;;;;;;;-1:-1:-1;;;;;1355:25496:45;;;;;-1:-1:-1;;;;;;;;;;;1355:25496:45;;;;;;;-1:-1:-1;;1355:25496:45;;;;;735:10:120;;1355:25496:45;-1:-1:-1;;;;;;;;;;;1355:25496:45;;6346:40:92;6323:4;6400:11;:::o;6248:217::-;6442:12;1355:25496:45;6442:12:92;:::o;6155:316::-;-1:-1:-1;;;;;1355:25496:45;;;;;;-1:-1:-1;;;;;;;;;;;1355:25496:45;;;;;;;;;;-1:-1:-1;;;;;1355:25496:45;;;;;-1:-1:-1;;;;;;;;;;;1355:25496:45;;;;;;;-1:-1:-1;;1355:25496:45;;;;;735:10:120;;1355:25496:45;-1:-1:-1;;;;;;;;;;;2576:33:45;-1:-1:-1;;;;;;;;;;;6346:40:92;1355:25496:45;6346:40:92;6323:4;6400:11;:::o;6155:316::-;1355:25496:45;;;-1:-1:-1;;;;;;;;;;;1355:25496:45;;-1:-1:-1;;;;;;;;;;;1355:25496:45;;;;;;;;;-1:-1:-1;;;;;;;;;;;1355:25496:45;;-1:-1:-1;;;;;;;;;;;1355:25496:45;;-1:-1:-1;;1355:25496:45;6323:4:92;1355:25496:45;;;735:10:120;;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;1355:25496:45;;6346:40:92;6323:4;6400:11;:::o;6248:217::-;1355:25496:45;6442:12:92;:::o","linkReferences":{}},"deployedBytecode":{"object":"0x6080806040526004361015610012575f80fd5b5f3560e01c90816301ffc9a714610d13575080630225293e14610cd957806308c84e7014610c895780630bece35614610bc657806323842fb814610b96578063248a9ca314610b6c5780632c3ee47414610b505780632f2ff15d14610b21578063314d4dff14610ae757806336568abe14610a8b5780634d6d9ffb146109a95780635972185a1461096f578063682ed5f01461084b57806391d1485414610802578063a217fddf146107e8578063ac9650d81461066a578063bd3ce6b01461057a578063ca7242f914610540578063d547741f1461050a578063ddba65371461021c578063e45a6d0d146101e25763ef913a4b1461010e575f80fd5b346101de575f6003193601126101de576101da60405160208082015261012060408201526101c6816101436101608201610f03565b60ff600254818116606085015260081c16608083015267ffffffffffffffff60035481811660a085015260401c1660c083015260ff60045463ffffffff811660e085015263ffffffff8160201c16610100850152818160401c16151561012085015260481c166101b28161109c565b61014083015203601f198101835282611079565b604051918291602083526020830190610e35565b0390f35b5f80fd5b346101de575f6003193601126101de5760206040517f00000000000000000000000000000000000000000000000000000000000000008152f35b346101de5761022a36610db1565b6004549160ff8360401c166104e2575f80527f4c48d1d2b0f4f7485fc28e3db22341d96a20aa29e6efa8149da9751603abd4e06020527f6e0c24a6e293ff9b755263dbaa15ba3796b0b8d3fe17cfb4ddf8143b268eac4754610298929060ff16156104d5575b810190611116565b6102c78151517f00000000000000000000000000000000000000000000000000000000000000008082146111c6565b6020815101518051810160208101916020818303126101de57602081015167ffffffffffffffff81116101de57019061018090829003126101de576040519061030f82611009565b602081015167ffffffffffffffff81116101de5783908201602001906103349161129d565b825261034260408201611385565b60208301908152906103578460608301611256565b604084019081529161036c8560a08401611256565b60608501908152946103818160e085016113a2565b92608086019384526101400190610397916113a2565b9360a081019485525190516fffffffffffffffffffffffffffffffff166103bd9161265e565b516040805182516fffffffffffffffffffffffffffffffff166020808301918252840151828401529190920151606080840191909152825290610401608082611079565b51902090516020015167ffffffffffffffff1661041d90611686565b61042a91908181146118b9565b516040805182516fffffffffffffffffffffffffffffffff16602080830191825284015182840152919092015160608084019190915282529061046e608082611079565b51902090516020015167ffffffffffffffff1661048a90611686565b61049791908181146118b9565b516104a190611a40565b7fffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffff1668010000000000000000176004555f80f35b6104dd6117cb565b610290565b7f928b1233000000000000000000000000000000000000000000000000000000005f5260045ffd5b346101de5761053e61051b36610e02565b90610539610534825f525f602052600160405f20015490565b611853565b611be2565b005b346101de575f6003193601126101de5760206040517f00000000000000000000000000000000000000000000000000000000000000008152f35b346101de575f6003193601126101de576040516105a18161059a81610f03565b0382611079565b6101206040516105b081610fc0565b60025460ff8116825260ff602083019160081c16815260ff6040516105d481610fc0565b67ffffffffffffffff600354818116835281602084019160401c168152816004549385808660481c1697816106146040519d8d8f9e8f9081520190610e35565b9a511660208c0152511660408a0152511660608801525116608086015263ffffffff811660a086015263ffffffff8160201c1660c086015260401c16151560e08401526106608161109c565b6101008301520390f35b346101de5760206003193601126101de5760043567ffffffffffffffff81116101de57366023820112156101de57806004013567ffffffffffffffff81116101de57602482013660248360051b850101116101de576020906040516106cf8382611079565b5f815282810191601f1984013684376106e785611772565b956106f56040519788611079565b858752601f1961070487611772565b01855f5b8281106107d8575050505f5b868110156107c5576001906107a15f8061076e8861073a60248760051b8a01018a6116cd565b8d8d6040959395519483869484860198893784019083820190898252519283915e010185815203601f198101835282611079565b5190305af43d156107bd573d90610784826110a6565b916107926040519384611079565b82523d5f8b84013e5b30612d1f565b6107ab828b61178a565b526107b6818a61178a565b5001610714565b60609061079b565b604051868152806101da8189018b610e5a565b606082828c010152018690610708565b346101de575f6003193601126101de5760206040515f8152f35b346101de5761081036610e02565b905f525f60205273ffffffffffffffffffffffffffffffffffffffff60405f2091165f52602052602060ff60405f2054166040519015158152f35b346101de5760206003193601126101de5760043567ffffffffffffffff81116101de578060040160a060031983360301126101de5760ff60045460401c166104e2575f80527f4c48d1d2b0f4f7485fc28e3db22341d96a20aa29e6efa8149da9751603abd4e06020527f6e0c24a6e293ff9b755263dbaa15ba3796b0b8d3fe17cfb4ddf8143b268eac475460ff1615610962575b60848201916108ee83836116cd565b90501561093a576020928261090681610932956116cd565b602461092a61092361091b606489018761171e565b9790966116cd565b36916110c2565b950191611d2b565b604051908152f35b7f1208b21b000000000000000000000000000000000000000000000000000000005f5260045ffd5b61096a6117cb565b6108df565b346101de575f6003193601126101de5760206040517fbd893629a699470e4ec82a5715bb4981fdaacc5d0a728bf5f55b801d8f4ef10b8152f35b346101de5760206003193601126101de5760043567ffffffffffffffff81116101de5780600401608060031983360301126101de5760ff60045460401c166104e2575f80527f4c48d1d2b0f4f7485fc28e3db22341d96a20aa29e6efa8149da9751603abd4e060209081527f6e0c24a6e293ff9b755263dbaa15ba3796b0b8d3fe17cfb4ddf8143b268eac4754909261093292909160ff1615610a7e575b610a61610a5482806116cd565b919092606485019061171e565b929091602460405195610a748988611079565b5f87520191611d2b565b610a866117cb565b610a47565b346101de57610a9936610e02565b3373ffffffffffffffffffffffffffffffffffffffff821603610abf5761053e91611be2565b7f6697b232000000000000000000000000000000000000000000000000000000005f5260045ffd5b346101de575f6003193601126101de5760206040517f00000000000000000000000000000000000000000000000000000000000000008152f35b346101de5761053e610b3236610e02565b90610b4b610534825f525f602052600160405f20015490565b611b10565b346101de575f6003193601126101de5760206040516107088152f35b346101de5760206003193601126101de5760206109326004355f525f602052600160405f20015490565b346101de5760206003193601126101de5760043567ffffffffffffffff811681036101de57610932602091611686565b346101de57610bd436610db1565b60ff60045460401c166104e2575f80527f4c48d1d2b0f4f7485fc28e3db22341d96a20aa29e6efa8149da9751603abd4e06020527f6e0c24a6e293ff9b755263dbaa15ba3796b0b8d3fe17cfb4ddf8143b268eac4754610c3c929060ff1615610c7c5761146e565b6040516003821015610c4f576020918152f35b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b610c846117cb565b61146e565b346101de575f6003193601126101de57602060405173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b346101de575f6003193601126101de5760206040517f00000000000000000000000000000000000000000000000000000000000000008152f35b346101de5760206003193601126101de57600435907fffffffff0000000000000000000000000000000000000000000000000000000082168092036101de57817f7965db0b0000000000000000000000000000000000000000000000000000000060209314908115610d87575b5015158152f35b7f01ffc9a70000000000000000000000000000000000000000000000000000000091501483610d80565b9060206003198301126101de5760043567ffffffffffffffff81116101de57826023820112156101de5780600401359267ffffffffffffffff84116101de57602484830101116101de576024019190565b60031960409101126101de576004359060243573ffffffffffffffffffffffffffffffffffffffff811681036101de5790565b90601f19601f602080948051918291828752018686015e5f8582860101520116010190565b9080602083519182815201916020808360051b8301019401925f915b838310610e8557505050505090565b9091929394602080610ea383601f1986600196030187528951610e35565b97019301930191939290610e76565b90600182811c92168015610ef9575b6020831014610ecc57565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b91607f1691610ec1565b6001545f9291610f1282610eb2565b8082529160018116908115610f865750600114610f2d575050565b60015f9081529293509091907fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf65b838310610f6c575060209250010190565b600181602092949394548385870101520191019190610f5b565b60209495507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0091509291921683830152151560051b010190565b6040810190811067ffffffffffffffff821117610fdc57604052565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b60c0810190811067ffffffffffffffff821117610fdc57604052565b6020810190811067ffffffffffffffff821117610fdc57604052565b6060810190811067ffffffffffffffff821117610fdc57604052565b60e0810190811067ffffffffffffffff821117610fdc57604052565b90601f601f19910116810190811067ffffffffffffffff821117610fdc57604052565b60021115610c4f57565b67ffffffffffffffff8111610fdc57601f01601f191660200190565b9291926110ce826110a6565b916110dc6040519384611079565b8294818452818301116101de578281602093845f960137010152565b9080601f830112156101de57816020611113933591016110c2565b90565b6020818303126101de5780359067ffffffffffffffff82116101de5701906020828203126101de576040519161114b83611025565b80359067ffffffffffffffff82116101de57016060818303126101de576040519161117583611041565b81358352602082013567ffffffffffffffff81116101de57816111999184016110f8565b6020840152604082013567ffffffffffffffff81116101de576111bc92016110f8565b6040820152815290565b156111cf575050565b7fd56bdc26000000000000000000000000000000000000000000000000000000005f5260045260245260445ffd5b929192611209826110a6565b916112176040519384611079565b8294818452818301116101de578281602093845f96015e010152565b519060ff821682036101de57565b519067ffffffffffffffff821682036101de57565b91908260409103126101de5760405161126e81610fc0565b602061128781839561127f81611241565b855201611241565b910152565b519063ffffffff821682036101de57565b91908281039261012084126101de57604051916112b98361105d565b8294825167ffffffffffffffff81116101de57830182601f820112156101de576040916112ef84836020601f19955191016111fd565b865201126101de576113349060405161130781610fc0565b61131360208501611233565b815261132160408501611233565b6020820152602085015260608301611256565b604083015261134560a0820161128c565b606083015261135660c0820161128c565b608083015260e08101519081151582036101de576101009160a084015201519060028210156101de5760c00152565b51906fffffffffffffffffffffffffffffffff821682036101de57565b91908260609103126101de576040516113ba81611041565b60408082946113c881611385565b8452602081015160208501520151910152565b9190610180838203126101de57604051906113f582611009565b819380519167ffffffffffffffff83116101de576101408261141e8360a096611287960161129d565b865261142d83602083016113a2565b602087015261143f83608083016113a2565b604087015261145060e08201611385565b6060870152611463836101008301611256565b608087015201611256565b61147a91810190611116565b6114a98151517f00000000000000000000000000000000000000000000000000000000000000008082146111c6565b60208151015180518101906020818303126101de5760208101519167ffffffffffffffff83116101de576114e49260208092019201016113db565b906114ee826118f0565b6114f782611983565b916003831015610c4f578261162957908167ffffffffffffffff6020604060a0611113960193845184848201511685600354851c1681116115a1575b5050015160405161158681611578858201948591909160408060608301946fffffffffffffffffffffffffffffffff8151168452602081015160208501520151910152565b03601f198101835282611079565b51902092510151165f52600560205260405f20555b51611a40565b6115e08661162293511667ffffffffffffffff167fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000006003541617600355565b7fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff6fffffffffffffffff00000000000000006003549260401b16911617600355565b5f80611533565b506001820361166e5761111390680100000000000000007fffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffff600454161760045561159b565b6002821461167f576111139061159b565b5050600290565b67ffffffffffffffff165f52600560205260405f205480156116a55790565b7f5b48b457000000000000000000000000000000000000000000000000000000005f5260045ffd5b9035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1813603018212156101de570180359067ffffffffffffffff82116101de576020019181360383136101de57565b9035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1813603018212156101de570180359067ffffffffffffffff82116101de57602001918160051b360383136101de57565b67ffffffffffffffff8111610fdc5760051b60200190565b805182101561179e5760209160051b010190565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b335f9081527f4c48d1d2b0f4f7485fc28e3db22341d96a20aa29e6efa8149da9751603abd4e0602052604090205460ff161561180357565b7fe2517d3f000000000000000000000000000000000000000000000000000000005f52336004527fbd893629a699470e4ec82a5715bb4981fdaacc5d0a728bf5f55b801d8f4ef10b60245260445ffd5b805f525f60205260405f2073ffffffffffffffffffffffffffffffffffffffff33165f5260205260ff60405f2054161561188a5750565b7fe2517d3f000000000000000000000000000000000000000000000000000000005f523360045260245260445ffd5b156118c2575050565b7f6d23e8a3000000000000000000000000000000000000000000000000000000005f5260045260245260445ffd5b6119819061191681516fffffffffffffffffffffffffffffffff6060840151169061265e565b61197967ffffffffffffffff602060808185015160405161196b81611578868201948591909160408060608301946fffffffffffffffffffffffffffffffff8151168452602081015160208501520151910152565b519020940151015116611686565b8082146118b9565b565b67ffffffffffffffff602060a08301510151165f52600560205260405f205480155f146119b05750505f90565b604082019081516040516119f98161157860208201948591909160408060608301946fffffffffffffffffffffffffffffffff8151168452602081015160208501520151910152565b5190201491821592611a17575b505015611a1257600190565b600290565b6fffffffffffffffffffffffffffffffff91925060208291015151169151511611155f80611a06565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169080516040602083015192015192803b156101de575f92611ad892611aea604051968795869485947f41493c600000000000000000000000000000000000000000000000000000000086526004860152606060248601526064850190610e35565b90600319848303016044850152610e35565b03915afa8015611b0557611afb5750565b5f61198191611079565b6040513d5f823e3d90fd5b805f525f60205260405f2073ffffffffffffffffffffffffffffffffffffffff83165f5260205260ff60405f205416155f14611bdc57805f525f60205260405f2073ffffffffffffffffffffffffffffffffffffffff83165f5260205260405f2060017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0082541617905573ffffffffffffffffffffffffffffffffffffffff339216907f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d5f80a4600190565b50505f90565b805f525f60205260405f2073ffffffffffffffffffffffffffffffffffffffff83165f5260205260ff60405f2054165f14611bdc57805f525f60205260405f2073ffffffffffffffffffffffffffffffffffffffff83165f5260205260405f207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00815416905573ffffffffffffffffffffffffffffffffffffffff339216907ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b5f80a4600190565b3567ffffffffffffffff811681036101de5790565b929190611ccb81611772565b93611cd96040519586611079565b602085838152019160051b8101918383116101de5781905b838210611cff575050505050565b813567ffffffffffffffff81116101de57602091611d2087849387016110f8565b815201910190611cf1565b90949291939480156125a5578101906020818303126101de5780359067ffffffffffffffff82116101de57016040818303126101de5760405191611d6e83610fc0565b813560028110156101de578352602082013567ffffffffffffffff81116101de57611d9992016110f8565b90602081019182528051611dac8161109c565b611db58161109c565b612022575051908151820160208101926020818303126101de57602081015167ffffffffffffffff81116101de570190608090829003126101de5760405192611dfd84610fc0565b602082015167ffffffffffffffff81116101de5782611e26836020604094611e2e9701016129d0565b8652016113a2565b9460208301958652611e658351517f00000000000000000000000000000000000000000000000000000000000000008082146111c6565b6020835101519182518301926020818503126101de5760208101519067ffffffffffffffff82116101de5701926040848203126101de5760405193611ea985610fc0565b6020810151855260408101519167ffffffffffffffff83116101de57611ed6926020809201920101612a36565b94611ef06020850196808852518015158061201657612b83565b5f805b87518051831015611fe357611f0b83611f1e9261178a565b5151611f18368888611cbf565b90612db8565b15611fd957508694611f7d611f92956fffffffffffffffffffffffffffffffff9a9895611f7661159b966020633b9aca009f9d8198611f5d915161178a565b51015190815181518082149182611fc5575b5050612bc1565b6001612c0f565b51950194611f8a86611caa565b875191612e2a565b516001815111611fa6575b50505151160490565b611fb2611fbe92611caa565b90848451511691612eba565b5f80611f9d565b909150898401209089830120145f80611f6f565b9060010190611ef3565b5061159b92506020915094611f7d611f92956fffffffffffffffffffffffffffffffff9a9895633b9aca009c9a98612c0f565b5061ffff811115612b83565b949060018695939495516120358161109c565b61203e8161109c565b146120855760ff86516120508161109c565b6120598161109c565b7fd3a2e6c9000000000000000000000000000000000000000000000000000000005f521660045260245ffd5b90919293945051926060602060405161209d81610fc0565b6040516120a981611009565b6040516120b58161105d565b8481526040516120c481610fc0565b5f81525f85820152848201526040516120dc81610fc0565b5f81525f8582015260408201525f858201525f60808201525f60a08201525f60c0820152815261210a612998565b83820152612116612998565b60408201525f8482015260405161212c81610fc0565b5f81525f84820152608082015260405161214581610fc0565b5f81525f8482015260a08201528152015283518401936020818603126101de5760208101519067ffffffffffffffff82116101de5701936020858203126101de576040519461219386611025565b60208101519067ffffffffffffffff82116101de5760206121bc92816121e995019201016129d0565b808652517f00000000000000000000000000000000000000000000000000000000000000008082146111c6565b602084510151948551860160208101966020818303126101de57602081015167ffffffffffffffff81116101de570190604090829003126101de576040519661223188610fc0565b602082015167ffffffffffffffff81116101de57816020612254928501016113db565b885260408201519167ffffffffffffffff83116101de576122789201602001612a36565b936122926020880195808752518015158061201657612b83565b60208101956122a087611caa565b67ffffffffffffffff60a08a5101519181602084015116918291161480612586575b6122cb85611caa565b9267ffffffffffffffff6122de8c611caa565b915116911561253857505050506122f99061159b89516118f0565b6123038751611983565b6003811015610c4f5780612507575061231b86611caa565b67ffffffffffffffff8060035460401c169116116124b4575b5060408651015160405161237d8161157860208201948591909160408060608301946fffffffffffffffffffffffffffffffff8151168452602081015160208501520151910152565b51902067ffffffffffffffff61239287611caa565b165f52600560205260405f20555b5f805b8551805183101561248957611f0b836123bb9261178a565b1561247f5750633b9aca0096936fffffffffffffffffffffffffffffffff9693611f76879460206123f261240a9660409b5161178a565b51015190815181518082149182612469575050612bc1565b6124318351858101519067ffffffffffffffff602060a08185015193015101511690612e2a565b516001815111612447575b505051015151160490565b61245361246292611caa565b90858585510151511691612eba565b5f8061243c565b9091506020840120906020830120145f80611f6f565b90600101906123a3565b50604095925061240a9150936fffffffffffffffffffffffffffffffff9693633b9aca009895612c0f565b6124c06124f591611caa565b67ffffffffffffffff167fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000006003541617600355565b6125016115e086611caa565b5f612334565b60019150036123a0577f59bc8fd3000000000000000000000000000000000000000000000000000000005f5260045ffd5b6084945067ffffffffffffffff9081604051957fb8d8167e00000000000000000000000000000000000000000000000000000000875216600486015216602484015260448301526064820152fd5b5061259084611caa565b67ffffffffffffffff808451169116146122c2565b505090916125b860206125cd9201611caa565b91604051946125c686610fc0565b3691611cbf565b8352602083019182526040516125ec81611578866020830195866128ca565b5190205c915190518215612606575050633b9aca00900490565b9061265a612648926040519384937ff06fc33b000000000000000000000000000000000000000000000000000000008552604060048601526044850190610e5a565b90600319848303016024850152610e35565b0390fd5b906fffffffffffffffffffffffffffffffff633b9aca0091160442811161289b5780420342811161286e576107081061283f57508051516126a0600154610eb2565b1480612818575b815190156127d85750602081015160ff815116906002549160ff83169283821492836127bf575b6020015160ff169215612777575050505063ffffffff606082015116906004549163ffffffff831680820361274957505063ffffffff608081920151169160201c1680820361271b575050565b7f1eb5c1eb000000000000000000000000000000000000000000000000000000005f5260045260245260445ffd5b7f73b1bde3000000000000000000000000000000000000000000000000000000005f5260045260245260445ffd5b6084945060ff90604051947fd382033a000000000000000000000000000000000000000000000000000000008652600486015260081c16602484015260448301526064820152fd5b6020810151600883901c60ff90811691161493506126ce565b61265a906040519182917ff6b6676b0000000000000000000000000000000000000000000000000000000083526040600484015261264860448401610f03565b508051602081519101206040516128328161059a81610f03565b60208151910120146126a7565b7f12e74add000000000000000000000000000000000000000000000000000000005f524260045260245260445ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b7f20daedb6000000000000000000000000000000000000000000000000000000005f524260045260245260445ffd5b9067ffffffffffffffff90939293168152604060208201526080810190835191604080830152825180915260a0820190602060a08260051b8501019401915f905b82821061294f57505050506020611113939401519060607fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc082850301910152610e35565b9091929460208061298a837fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6089600196030186528951610e35565b97019201920190929161290b565b604051906129a582611041565b5f6040838281528260208201520152565b9080601f830112156101de578151611113926020016111fd565b91906060838203126101de57604051906129e982611041565b819380518352602081015167ffffffffffffffff81116101de5782612a0f9183016129b6565b602084015260408101519167ffffffffffffffff83116101de5760409261128792016129b6565b9080601f830112156101de57815191612a4e83611772565b92612a5c6040519485611079565b80845260208085019160051b830101918383116101de5760208101915b838310612a8857505050505090565b825167ffffffffffffffff81116101de578201906040601f1983880301126101de5760405190612ab782610fc0565b602083015167ffffffffffffffff81116101de5760209084010187601f820112156101de578051612ae781611772565b91612af56040519384611079565b81835260208084019260051b820101918a83116101de5760208201905b838210612b555750505050825260408301519167ffffffffffffffff83116101de57612b46886020809695819601016129b6565b83820152815201920191612a79565b815167ffffffffffffffff81116101de57602091612b788e8480948801016129b6565b815201910190612b12565b15612b8b5750565b7fb0369c31000000000000000000000000000000000000000000000000000000005f52600452600160245261ffff60445260645ffd5b91909115612bcd575050565b9061265a612648926040519384937f5f1ca381000000000000000000000000000000000000000000000000000000008552604060048601526044850190610e35565b91909115612c1b575050565b604051907ffef760c700000000000000000000000000000000000000000000000000000000825280602483016020600485015252604482019260448260051b84010191815f907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1813603015b838310612c945786860387fd5b90919293947fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbc8782030188528535828112156101de578301906020823592019167ffffffffffffffff81116101de5780360383136101de57602082601f19601f8480600198869897879852868601375f85828601015201160101970198019301919096939296612c87565b90612d5c5750805115612d3457602081519101fd5b7fd6bda275000000000000000000000000000000000000000000000000000000005f5260045ffd5b81511580612daf575b612d6d575090565b73ffffffffffffffffffffffffffffffffffffffff907f9996b315000000000000000000000000000000000000000000000000000000005f521660045260245ffd5b50803b15612d65565b908151815103611bdc575f5b8251811015612e2257612dd7818461178a565b5151612de3828461178a565b515103612e1b57612df4818461178a565b5160208151910120612e06828461178a565b516020815191012003612e1b57600101612dc4565b5050505f90565b505050600190565b91612e7f60209261197960405185810190612e7681611578888591909160408060608301946fffffffffffffffffffffffffffffffff8151168452602081015160208501520151910152565b51902091611686565b0151808203612e8c575050565b7f4b2dfe98000000000000000000000000000000000000000000000000000000005f5260045260245260445ffd5b929190925f5b8451811015612ef8578083612ed76001938861178a565b51604051612eee81611578602082019489866128ca565b5190205d01612ec0565b505050905056fea164736f6c634300081c000a","sourceMap":"1355:25496:45:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;1355:25496:45;;;;;;;;4960:23;;;;1355:25496;;;;;;4960:23;1355:25496;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4960:23;1355:25496;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;4960:23;-1:-1:-1;;4960:23:45;;;;;;:::i;:::-;1355:25496;;;;;4960:23;1355:25496;;4960:23;1355:25496;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;1355:25496:45;;;;;;;;1648:48;1355:25496;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;9619:70;;1355:25496;;;26731:42;26727:105;;1355:25496;9619:70;;;;:::i;:::-;9699:196;9720:30;;1355:25496;9759:25;9720:64;;;9699:196;:::i;:::-;1355:25496;9982:30;;:43;;1355:25496;;9971:95;;1355:25496;9971:95;;1355:25496;;;;;;;;;9971:95;;1355:25496;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;;;;;;;;19046:18;1355:25496;;;;19066:11;;;:::i;:::-;19282:29;1355:25496;;;;;;;;19271:41;;;1355:25496;;;;;;;;;;;;;;;;;;;;;;;19271:41;;;;1355:25496;;19271:41;:::i;:::-;1355:25496;19261:52;;19381:21;;1355:25496;19381:36;1355:25496;;;19359:59;;;:::i;:::-;19428:179;;19449:54;;;;19428:179;:::i;:::-;19811:29;1355:25496;;;;;;;;19800:41;;;1355:25496;;;;;;;;;;;;;;;;;;;;;;;19800:41;;;;1355:25496;;19800:41;:::i;:::-;1355:25496;19790:52;;19910:21;;1355:25496;19910:36;1355:25496;;;19888:59;;;:::i;:::-;19957:179;;19978:54;;;;19957:179;:::i;:::-;10139:30;;;;:::i;:::-;1355:25496;;;;;;;;;26727:105;26800:20;;:::i;:::-;26727:105;;1355:25496;;;;;;;;;;;4723:26:92;1355:25496:45;;;:::i;:::-;4693:18:92;2484:4;4693:18;;3877:6;1355:25496:45;3877:6:92;1355:25496:45;;3877:22:92;1355:25496:45;3877:6:92;1355:25496:45;3877:22:92;1355:25496:45;3786:120:92;;4693:18;2484:4;:::i;:::-;4723:26;:::i;:::-;1355:25496:45;;;;;;-1:-1:-1;;1355:25496:45;;;;;;;;1551:51;1355:25496;;;;;;;;-1:-1:-1;;1355:25496:45;;;;;;;;;;;;:::i;:::-;;;;:::i;:::-;;;;;;;:::i;:::-;2095:51;1355:25496;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;2095:51;1355:25496;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;1355:25496:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;-1:-1:-1;;1355:25496:45;;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;-1:-1:-1;;1355:25496:45;;;:::i;:::-;;;;;;;;;;1528:13:123;;;1355:25496:45;1560:3:123;1543:15;;;;;;1349:26;1355:25496:45;4107:55:118;1355:25496:45;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;1355:25496:45;;;;;;:::i;:::-;4065:25:118;1629:4:123;;4065:25:118;;1355:25496:45;;;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;;;1629:4:123;4107:55:118;:::i;:::-;1579:88:123;;;;:::i;:::-;;;;;;:::i;:::-;;1355:25496:45;1528:13:123;;1355:25496:45;;;;;1543:15:123;1355:25496:45;;;;;;;;;;1543:15:123;1355:25496:45;:::i;:::-;;;;;;;;;;;;;;;;;;-1:-1:-1;;1355:25496:45;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;2930:29:92;1355:25496:45;-1:-1:-1;1355:25496:45;;;;;;-1:-1:-1;1355:25496:45;;;;;;;;;;;;;;;;-1:-1:-1;;1355:25496:45;;;;;;;;;;;;;;;;-1:-1:-1;;1355:25496:45;;;;;;;;;;;;;;;;;;;;;;;;;26731:42;26727:105;;1355:25496;7188:10;;;;;;;;:::i;:::-;:21;;;1355:25496;;;7253:10;;;;7241:64;7253:10;;:::i;:::-;7265:16;1355:25496;7294:10;7283:9;;;;;;:::i;:::-;7294:10;;;;:::i;:::-;1355:25496;;;:::i;:::-;7265:16;;7241:64;;:::i;:::-;1355:25496;;;;;;;;;;;;;26727:105;26800:20;;:::i;:::-;26727:105;;1355:25496;;;;;-1:-1:-1;;1355:25496:45;;;;;;;;2576:33;1355:25496;;;;;;;;-1:-1:-1;;1355:25496:45;;;;;;;;;;;;;;;;-1:-1:-1;;1355:25496:45;;;;;;;;;;;;;;;;;;;;;;;;;;;7544:63;;1355:25496;;;;26731:42;26727:105;;1355:25496;7586:9;7556:10;;;;:::i;:::-;7586:9;;;;;;;;:::i;:::-;1355:25496;;;7568:16;1355:25496;;;;;;;:::i;:::-;;;;7568:16;7544:63;;:::i;26727:105::-;26800:20;;:::i;:::-;26727:105;;1355:25496;;;;;;;:::i;:::-;735:10:120;1355:25496:45;;;5397:34:92;5393:102;;5505:37;;;:::i;5393:102::-;5454:30;1355:25496:45;5454:30:92;1355:25496:45;;5454:30:92;1355:25496:45;;;;;-1:-1:-1;;1355:25496:45;;;;;;;;1854:50;1355:25496;;;;;;;4306:25:92;1355:25496:45;;;:::i;:::-;4276:18:92;2484:4;4276:18;;3877:6;1355:25496:45;3877:6:92;1355:25496:45;;3877:22:92;1355:25496:45;3877:6:92;1355:25496:45;3877:22:92;1355:25496:45;3786:120:92;;2484:4;4306:25;:::i;1355:25496:45:-;;;;;-1:-1:-1;;1355:25496:45;;;;;;;;2472:10;1355:25496;;;;;;;;-1:-1:-1;;1355:25496:45;;;;;;;;;3877:6:92;1355:25496:45;3877:6:92;1355:25496:45;;3877:22:92;1355:25496:45;3877:6:92;1355:25496:45;3877:22:92;1355:25496:45;3786:120:92;;1355:25496:45;;;;;-1:-1:-1;;1355:25496:45;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;5401:1560;;1355:25496;;;26731:42;26727:105;;5401:1560;:::i;:::-;1355:25496;;;;;;;;;;;;;;;;;;;;;;;26727:105;26800:20;;:::i;:::-;5401:1560;:::i;1355:25496::-;;;;;-1:-1:-1;;1355:25496:45;;;;;;;;;1950:38;1355:25496;;;;;;;;;-1:-1:-1;;1355:25496:45;;;;;;;;1742:66;1355:25496;;;;;;;;-1:-1:-1;;1355:25496:45;;;;;;;;;;;;;;;;2649:47:92;2664:32;1355:25496:45;2649:47:92;;:87;;;;;1355:25496:45;;;;;;;2649:87:92;844:25:130;829:40;;;2649:87:92;;;1355:25496:45;;;-1:-1:-1;;1355:25496:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;-1:-1:-1;;1355:25496:45;;;;;;;;;;;;;;;;;;;:::o;:::-;;-1:-1:-1;;1355:25496:45;;;;;;;;;;;;;;;;;-1:-1:-1;1355:25496:45;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1355:25496:45;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;-1:-1:-1;;1355:25496:45;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;2095:51;1355:25496;;;;;;;:::i;:::-;;;;;2095:51;1355:25496;;;2095:51;;;;1355:25496;;;;;;;:::o;:::-;2095:51;-1:-1:-1;1355:25496:45;;;;;-1:-1:-1;1355:25496:45;;-1:-1:-1;1355:25496:45;;;;;;;;;;;;;;:::o;:::-;2095:51;1355:25496;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;:::o;:::-;;-1:-1:-1;1355:25496:45;;;;;-1:-1:-1;1355:25496:45;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;:::o;:::-;;;-1:-1:-1;;1355:25496:45;;;;;;;;;;;;;;;;:::o;:::-;;-1:-1:-1;1355:25496:45;;;:::o;:::-;;;;;;;;-1:-1:-1;;1355:25496:45;;;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;-1:-1:-1;1355:25496:45;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;:::i;:::-;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;:::o;:::-;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;-1:-1:-1;1355:25496:45;;;;;;:::o;:::-;;;;;;;;;;:::o;:::-;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;:::i;:::-;;;;:::o;:::-;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;1355:25496:45;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;;;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;;;;;;;;:::i;:::-;;;;;;;:::i;5401:1560::-;5644:58;5401:1560;5644:58;;;;:::i;:::-;5712:186;5733:24;;1355:25496;5766:26;5733:59;;;5712:186;:::i;:::-;5985:37;:24;;:37;;1355:25496;;5974:89;;1355:25496;5985:37;1355:25496;;;;;;5985:37;5974:89;;1355:25496;;;;;;;;5974:89;5985:37;5974:89;;;1355:25496;;;;:::i;:::-;6108:6;;;;:::i;:::-;6171:26;;;:::i;:::-;1355:25496;;;;;;;6211:52;;;6344:16;;1355:25496;5985:37;1355:25496;6344:16;6899:24;6344:16;;;;;:31;;;;1355:25496;;;;;;;;6344:73;;6340:155;;6207:666;6586:24;;;;1355:25496;;6575:36;;;;;;;;1355:25496;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6575:36;;-1:-1:-1;;6575:36:45;;;;;;:::i;:::-;1355:25496;6565:47;;6530:16;;:31;1355:25496;;-1:-1:-1;1355:25496:45;6508:21;5985:37;1355:25496;;-1:-1:-1;1355:25496:45;;6207:666;6899:24;;:::i;6340:155::-;1355:25496;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6340:155;;;;6207:666;-1:-1:-1;1355:25496:45;6633:58;;1355:25496;;6899:24;1355:25496;;;6707:20;1355:25496;;;6707:20;1355:25496;6207:666;;6629:244;6771:34;6755:50;;6751:122;;6899:24;6629:244;6207:666;;6751:122;6821:41;;6771:34;6821:41;:::o;5036:228::-;1355:25496;;-1:-1:-1;1355:25496:45;5145:21;1355:25496;;;-1:-1:-1;1355:25496:45;;5200:9;;1355:25496;;5036:228;:::o;1355:25496::-;;-1:-1:-1;1355:25496:45;;-1:-1:-1;1355:25496:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;3175:103:92;735:10:120;2930:6:92;1355:25496:45;;;;;;;;;;;;3495:23:92;3491:108;;3175:103::o;3491:108::-;3541:47;2930:6;3541:47;735:10:120;3541:47:92;1355:25496:45;2576:33;1355:25496;;;2930:6:92;3541:47;3175:103;1355:25496:45;2930:6:92;1355:25496:45;2930:6:92;1355:25496:45;;;2930:6:92;1355:25496:45;;735:10:120;1355:25496:45;-1:-1:-1;1355:25496:45;;;;;-1:-1:-1;1355:25496:45;;;3495:23:92;3491:108;;3175:103;:::o;3491:108::-;3541:47;2930:6;3541:47;735:10:120;3541:47:92;1355:25496:45;;;;2930:6:92;3541:47;1355:25496:45;;;;;;:::o;:::-;;;;;;;;;;;18217:570;18605:175;18217:570;18383:11;18363:18;;1355:25496;18383:11;;;1355:25496;;18383:11;;:::i;:::-;18537:58;1355:25496;18462:28;18559:20;18462:28;;;;1355:25496;;18451:40;;;;;;;;1355:25496;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18451:40;1355:25496;18441:51;;18559:20;;;:35;1355:25496;;18537:58;:::i;:::-;18626:52;;;18605:175;:::i;:::-;18217:570::o;22962:1028::-;1355:25496;23184:31;:16;;;;:31;1355:25496;;;;23162:21;23184:31;1355:25496;;;;;23230:32;;23226:758;23230:32;;;23350:43;;1355:25496;23350:43;:::o;23226:758::-;1355:25496;23470:24;;;;;1355:25496;;23459:36;;;23184:31;23459:36;;;;1355:25496;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23459:36;1355:25496;23449:47;;23427:69;;;;:165;;;23226:758;-1:-1:-1;;23410:574:45;;;23768:42;23761:49;:::o;23410:574::-;23939:34;23932:41;:::o;23427:165::-;1355:25496;23516:28;;;23184:31;23516:28;;;;1355:25496;;23558:24;;1355:25496;;-1:-1:-1;23516:76:45;23427:165;;;;24151:152;1355:25496;24231:8;1355:25496;;;;24284:11;24264:18;;;;24284:11;;;24231:65;;;;;;-1:-1:-1;1355:25496:45;;;;24284:11;1355:25496;24231:65;;;;;;;1355:25496;24231:65;;;;;1355:25496;;;;;;;;;;;:::i;:::-;;-1:-1:-1;;1355:25496:45;;;;;;;;;:::i;:::-;24231:65;;;;;;;;;;24151:152;:::o;24231:65::-;-1:-1:-1;24231:65:45;;;:::i;:::-;24284:11;1355:25496;;-1:-1:-1;1355:25496:45;;;;;6155:316:92;1355:25496:45;;;;;;;;;;;;-1:-1:-1;1355:25496:45;;;;;-1:-1:-1;1355:25496:45;;;6252:23:92;6248:217;1355:25496:45;;;;;;;;;;;;;;;-1:-1:-1;1355:25496:45;;;;-1:-1:-1;1355:25496:45;6323:4:92;1355:25496:45;;;;;;;;735:10:120;1355:25496:45;;6346:40:92;;1355:25496:45;6346:40:92;;6323:4;6400:11;:::o;6248:217::-;6442:12;;1355:25496:45;6442:12:92;:::o;6708:317::-;1355:25496:45;;;;;;;;;;;;-1:-1:-1;1355:25496:45;;;;;-1:-1:-1;1355:25496:45;;;6802:217:92;1355:25496:45;;;;;;;;;;;;;;;-1:-1:-1;1355:25496:45;;;;-1:-1:-1;1355:25496:45;;;;;;;;735:10:120;1355:25496:45;;6900:40:92;;1355:25496:45;6900:40:92;;1355:25496:45;6954:11:92;:::o;1355:25496:45:-;;;;;;;;;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;8191:1064;;;;;;;8421:17;;8417:181;;8665:52;;1355:25496;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;:::i;:::-;;;;:::i;:::-;8731:83;;8876:21;;1355:25496;;;10929:60;;1355:25496;10929:60;;1355:25496;;;;;;;;;10929:60;;1355:25496;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;:::i;:::-;;;;;;;;10999:160;11020:14;;1355:25496;11043:23;11020:46;;;10999:160;:::i;:::-;1355:25496;11242:14;;:27;;1355:25496;;;11231:75;;1355:25496;;;;;;;;;11231:75;;1355:25496;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;11231:75;1355:25496;11231:75;;;1355:25496;;;;:::i;:::-;;11316:177;1355:25496;;;;;;;;11337:25;;;:70;;;11316:177;:::i;:::-;1355:25496;;11663:3;11640:14;;1355:25496;;11636:25;;;;;11703:17;;11691:43;11703:17;;:::i;:::-;;:22;1355:25496;;;;;:::i;:::-;11691:43;;:::i;:::-;11690:44;11686:99;;11824:14;;;12132:50;12335:14;11824;1355:25496;11824:14;;;11865:185;12280:27;11824:14;1355:25496;26385:3;11824:14;;;;:17;:14;;:17;:::i;:::-;;:23;;1355:25496;;;;;11894:30;;;:72;;;;11663:3;11865:185;;;:::i;:::-;1355:25496;12132:50;:::i;:::-;1355:25496;12252:26;;;;;;:::i;:::-;12280:27;;;;:::i;12335:14::-;12464;1355:25496;;;12464:25;12460:152;;11616:503;12651:27;;;1355:25496;;;8830:81;:::o;12460:152::-;12519:26;12505:96;12519:26;;:::i;:::-;12563:27;;;;1355:25496;;12505:96;;:::i;:::-;12460:152;;;;11894:72;1355:25496;;;;;;11928:16;1355:25496;;;;11948:18;11928:38;11894:72;;;;11686:99;11758:8;1355:25496;;11621:13;;;11636:25;;12280:27;11636:25;;1355:25496;11636:25;;;12132:50;12335:14;11636:25;1355:25496;11636:25;;;26385:3;11636:25;;;12132:50;:::i;11337:70::-;11366:41;1355:25496;11366:41;;;11316:177;:::i;8727:421::-;1355:25496;;;;;;;;;;;;:::i;:::-;;;;:::i;:::-;8932:98;8928:220;;1355:25496;8727:421;1355:25496;;;;:::i;:::-;;;;:::i;:::-;9188:60;1355:25496;9188:60;1355:25496;9188:60;1355:25496;;;9188:60;8928:220;9102:21;;;;;;;1355:25496;;;;;;;;:::i;:::-;;;;;;:::i;:::-;;;;;;:::i;:::-;;;;;;;;;:::i;:::-;-1:-1:-1;1355:25496:45;;-1:-1:-1;1355:25496:45;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;1355:25496:45;;-1:-1:-1;1355:25496:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;1355:25496:45;;-1:-1:-1;1355:25496:45;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;1355:25496:45;;-1:-1:-1;1355:25496:45;;;;;;;;;;;;;;13696:75;;1355:25496;;;;;;;;;13696:75;;1355:25496;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;13696:75;;13785:208;13696:75;;1355:25496;;;;:::i;:::-;;;;;13833:41;13810:64;;;13785:208;:::i;:::-;1355:25496;14028:14;;:27;;1355:25496;;;14017:95;;1355:25496;14017:95;;1355:25496;;;;;;;;;14017:95;;1355:25496;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;:::i;:::-;;14126:189;1355:25496;;;;;;;;14151:25;;;:70;;;14126:189;:::i;:::-;1355:25496;14355:26;;;;;;:::i;:::-;1355:25496;;14385:25;;:35;;:50;;1355:25496;14385:50;;1355:25496;;;;;;14355:80;:184;;;8928:220;14598:26;;;:::i;:::-;14646;1355:25496;14646:26;;;:::i;:::-;1355:25496;;;;;;;14897:25;;;;14954:14;14897:25;;;;;:::i;14954:14::-;15080:45;15099:25;;15080:45;:::i;:::-;1355:25496;;;;;;15143:52;;;15284:26;;;;:::i;:::-;1355:25496;;;;;;;;;15284:68;15280:153;;15139:599;15543:25;1355:25496;15543:25;;:43;;1355:25496;;15532:55;;;1355:25496;15532:55;;;;1355:25496;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15532:55;1355:25496;15522:66;;1355:25496;15472:26;;;:::i;:::-;1355:25496;;;15450:21;1355:25496;;;;;;15139:599;1355:25496;;15927:3;15904:14;;1355:25496;;15900:25;;;;;15967:17;;15955:43;15967:17;;:::i;15955:43::-;15954:44;15950:99;;16088:14;26385:3;16088:14;;1355:25496;16088:14;;16129:185;16088:14;;1355:25496;16088:17;16396:50;16088:14;1355:25496;16088:14;;:17;:::i;:::-;;:23;;1355:25496;;;;;16158:30;;;:72;;;;16129:185;;;:::i;16396:50::-;16632:43;16506:25;;:43;;;;:48;1355:25496;;;16506:48;;;1355:25496;16568:35;;;:50;1355:25496;;16632:43;;:::i;:::-;16799:14;1355:25496;;;16799:25;16795:198;;15880:503;17032:25;;;:43;;1355:25496;;;9046:91;:::o;16795:198::-;16871:26;16840:142;16871:26;;:::i;:::-;16915:25;;;;;:43;;1355:25496;;16840:142;;:::i;:::-;16795:198;;;;16158:72;1355:25496;;;;;;16192:16;1355:25496;;;;16212:18;16192:38;16158:72;;;;15950:99;16022:8;1355:25496;;15885:13;;;15900:25;;1355:25496;15900:25;;;16396:50;15900:25;;;1355:25496;15900:25;;26385:3;15900:25;;16396:50;:::i;15280:153::-;1355:25496;;;;:::i;:::-;;;;;;;;;;;;;;;;:::i;:::-;15280:153;;;15139:599;1355:25496;;;15613:58;15139:599;15609:129;15698:25;1355:25496;15698:25;;1355:25496;15698:25;1355:25496;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14355:184;14459:26;;;;:::i;:::-;1355:25496;;;;;;;14459:80;14355:184;;8417:181;8522:26;;;;;;1355:25496;8522:26;;;:::i;:::-;1355:25496;;;;;;;:::i;:::-;;;;:::i;:::-;;;8522:26;8550:35;;1355:25496;;;;;25522:31;;;;8522:26;25522:31;;;;;:::i;:::-;1355:25496;25512:42;;4288:69:128;25671:11:45;;25684:12;;25632:14;;1355:25496;;8489:98;;26385:3;8489:98;1355:25496;8482:105;:::o;1355:25496::-;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;-1:-1:-1;;1355:25496:45;;;;;;;;;:::i;:::-;;;;20400:2140;;1355:25496;26385:3;20400:2140;1355:25496;;20608:15;20583:40;;1355:25496;;20608:15;;1355:25496;20608:15;1355:25496;;;;2472:10;-1:-1:-1;1355:25496:45;;21386:25;;;1355:25496;;21429:11;1355:25496;;:::i;:::-;21380:76;:180;;;20400:2140;21611:25;;1355:25496;;;;21678:28;;;;;1355:25496;;;;;21720:22;1355:25496;;;;;21678:74;;;;:172;;;;20400:2140;21678:28;22062:40;1355:25496;;;;;;;22157:32;;;;1355:25496;22157:32;;;1355:25496;;;22193:26;1355:25496;;;;;22157:62;;;1355:25496;;22358:33;;1355:25496;22358:33;;;;1355:25496;;;21678:28;1355:25496;;22358:64;;;1355:25496;;20400:2140;;:::o;1355:25496::-;;-1:-1:-1;1355:25496:45;22193:26;1355:25496;;;;-1:-1:-1;1355:25496:45;;;-1:-1:-1;1355:25496:45;22193:26;1355:25496;;;;-1:-1:-1;1355:25496:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21678:172;:28;21772:40;;1355:25496;;;;;;;;;;;21772:78;;-1:-1:-1;21678:172:45;;1355:25496;;;;;;;;;;;;;;;;;;;;;:::i;21380:180::-;21492:25;;;1355:25496;;;;;21476:43;1355:25496;;;;;;;:::i;:::-;;;;;;21523:37;21476:84;21380:180;;1355:25496;;-1:-1:-1;1355:25496:45;20608:15;1355:25496;;;;;-1:-1:-1;1355:25496:45;;;-1:-1:-1;1355:25496:45;;;;;-1:-1:-1;1355:25496:45;;;-1:-1:-1;1355:25496:45;20608:15;1355:25496;;;;;-1:-1:-1;1355:25496:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;1355:25496:45;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;-1:-1:-1;;1355:25496:45;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::o;:::-;;;;;;8961:69;1355:25496;;14284:16;1355:25496;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1355:25496:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;1355:25496:45;;;;;;;;;;;;;;;-1:-1:-1;1355:25496:45;;;;;;;;;;;;;;;;;;;;;;;;4437:582:118;;4609:8;;-1:-1:-1;1355:25496:45;;5690:21:118;:17;;5815:105;;;;;;5686:301;5957:19;5710:1;5957:19;;5710:1;5957:19;4605:408;1355:25496:45;;4857:22:118;:49;;;4605:408;4853:119;;4985:17;;:::o;4853:119::-;1355:25496:45;4933:24:118;;4878:1;4933:24;1355:25496:45;4933:24:118;1355:25496:45;;4878:1:118;4933:24;4857:49;4883:18;;;:23;4857:49;;358:427:54;;1355:25496:45;;;;452:20:54;448:63;;1355:25496:45;554:3:54;1355:25496:45;;540:12:54;;;;;577:4;;;;:::i;:::-;;1355:25496:45;592:4:54;;;;:::i;:::-;;1355:25496:45;577:26:54;573:77;;677:4;;;;:::i;:::-;;1355:25496:45;;;;;667:15:54;696:4;;;;:::i;:::-;;1355:25496:45;;;;;686:15:54;667:34;663:85;;1355:25496:45;;525:13:54;;663:85;721:12;;;1355:25496:45;721:12:54;:::o;540:::-;;;;1355:25496:45;358:427:54;:::o;17339:759:45:-;;17732:177;17609:33;17339:759;17688:34;1355:25496;;17609:33;;;;;;;;;1355:25496;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17609:33;1355:25496;17599:44;;17688:34;;:::i;17732:177::-;17965:26;1355:25496;17941:50;;;1355:25496;;17339:759;;:::o;1355:25496::-;;-1:-1:-1;1355:25496:45;;;;;;-1:-1:-1;1355:25496:45;24776:318;;;;;24914:1;24937:3;1355:25496;;24917:18;;;;;25011:10;;;1355:25496;25011:10;;;:::i;:::-;;1355:25496;;24987:35;;;;;;;;;;:::i;:::-;1355:25496;24977:46;;4520:68:128;1355:25496:45;24902:13;;24917:18;;;;;;24776:318::o","linkReferences":{},"immutableReferences":{"10299":[{"start":1367,"length":32},{"start":5250,"length":32}],"10302":[{"start":505,"length":32},{"start":7742,"length":32}],"10305":[{"start":3312,"length":32},{"start":8642,"length":32}],"10308":[{"start":672,"length":32},{"start":2814,"length":32}],"10312":[{"start":3253,"length":32},{"start":6743,"length":32}]}},"methodIdentifiers":{"ALLOWED_SP1_CLOCK_DRIFT()":"2c3ee474","DEFAULT_ADMIN_ROLE()":"a217fddf","MEMBERSHIP_PROGRAM_VKEY()":"e45a6d0d","MISBEHAVIOUR_PROGRAM_VKEY()":"314d4dff","PROOF_SUBMITTER_ROLE()":"5972185a","UPDATE_CLIENT_AND_MEMBERSHIP_PROGRAM_VKEY()":"0225293e","UPDATE_CLIENT_PROGRAM_VKEY()":"ca7242f9","VERIFIER()":"08c84e70","clientState()":"bd3ce6b0","getClientState()":"ef913a4b","getConsensusStateHash(uint64)":"23842fb8","getRoleAdmin(bytes32)":"248a9ca3","grantRole(bytes32,address)":"2f2ff15d","hasRole(bytes32,address)":"91d14854","misbehaviour(bytes)":"ddba6537","multicall(bytes[])":"ac9650d8","renounceRole(bytes32,address)":"36568abe","revokeRole(bytes32,address)":"d547741f","supportsInterface(bytes4)":"01ffc9a7","updateClient(bytes)":"0bece356","verifyMembership((bytes,(uint64,uint64),bytes[],bytes))":"682ed5f0","verifyNonMembership((bytes,(uint64,uint64),bytes[]))":"4d6d9ffb"},"rawMetadata":"{\"compiler\":{\"version\":\"0.8.28+commit.7893614a\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"updateClientProgramVkey\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"membershipProgramVkey\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"updateClientAndMembershipProgramVkey\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"misbehaviourProgramVkey\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"sp1Verifier\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"_clientState\",\"type\":\"bytes\"},{\"internalType\":\"bytes32\",\"name\":\"_consensusState\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"roleManager\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"AccessControlBadConfirmation\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"internalType\":\"bytes32\",\"name\":\"neededRole\",\"type\":\"bytes32\"}],\"name\":\"AccessControlUnauthorizedAccount\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"target\",\"type\":\"address\"}],\"name\":\"AddressEmptyCode\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"CannotHandleMisbehavior\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"expected\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"actual\",\"type\":\"string\"}],\"name\":\"ChainIdMismatch\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"expected\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"actual\",\"type\":\"bytes\"}],\"name\":\"ClientStateMismatch\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"expected\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"actual\",\"type\":\"bytes32\"}],\"name\":\"ConsensusStateHashMismatch\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ConsensusStateNotFound\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"expected\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"actual\",\"type\":\"bytes32\"}],\"name\":\"ConsensusStateRootMismatch\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"EmptyValue\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"FailedCall\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"FeatureNotSupported\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"FrozenClientState\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidMembershipProof\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes[]\",\"name\":\"path\",\"type\":\"bytes[]\"},{\"internalType\":\"bytes\",\"name\":\"value\",\"type\":\"bytes\"}],\"name\":\"KeyValuePairNotInCache\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"length\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"min\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"max\",\"type\":\"uint256\"}],\"name\":\"LengthIsOutOfRange\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes[]\",\"name\":\"path\",\"type\":\"bytes[]\"}],\"name\":\"MembershipProofKeyNotFound\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"expected\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"actual\",\"type\":\"bytes\"}],\"name\":\"MembershipProofValueMismatch\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"expectedRevisionNumber\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"expectedRevisionHeight\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"actualRevisionNumber\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"actualRevisionHeight\",\"type\":\"uint64\"}],\"name\":\"ProofHeightMismatch\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"now\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"proofTimestamp\",\"type\":\"uint256\"}],\"name\":\"ProofIsInTheFuture\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"now\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"proofTimestamp\",\"type\":\"uint256\"}],\"name\":\"ProofIsTooOld\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"expectedNumerator\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"expectedDenominator\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"actualNumerator\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"actualDenominator\",\"type\":\"uint256\"}],\"name\":\"TrustThresholdMismatch\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"expected\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"actual\",\"type\":\"uint256\"}],\"name\":\"TrustingPeriodMismatch\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"trustingPeriod\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"unbondingPeriod\",\"type\":\"uint256\"}],\"name\":\"TrustingPeriodTooLong\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"expected\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"actual\",\"type\":\"uint256\"}],\"name\":\"UnbondingPeriodMismatch\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint8\",\"name\":\"proofType\",\"type\":\"uint8\"}],\"name\":\"UnknownMembershipProofType\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint8\",\"name\":\"algorithm\",\"type\":\"uint8\"}],\"name\":\"UnknownZkAlgorithm\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"expected\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"actual\",\"type\":\"bytes32\"}],\"name\":\"VerificationKeyMismatch\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"previousAdminRole\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"newAdminRole\",\"type\":\"bytes32\"}],\"name\":\"RoleAdminChanged\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"RoleGranted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"RoleRevoked\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"ALLOWED_SP1_CLOCK_DRIFT\",\"outputs\":[{\"internalType\":\"uint16\",\"name\":\"\",\"type\":\"uint16\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"DEFAULT_ADMIN_ROLE\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"MEMBERSHIP_PROGRAM_VKEY\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"MISBEHAVIOUR_PROGRAM_VKEY\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"PROOF_SUBMITTER_ROLE\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"UPDATE_CLIENT_AND_MEMBERSHIP_PROGRAM_VKEY\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"UPDATE_CLIENT_PROGRAM_VKEY\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"VERIFIER\",\"outputs\":[{\"internalType\":\"contract ISP1Verifier\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"clientState\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"chainId\",\"type\":\"string\"},{\"components\":[{\"internalType\":\"uint8\",\"name\":\"numerator\",\"type\":\"uint8\"},{\"internalType\":\"uint8\",\"name\":\"denominator\",\"type\":\"uint8\"}],\"internalType\":\"struct IICS07TendermintMsgs.TrustThreshold\",\"name\":\"trustLevel\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint64\",\"name\":\"revisionNumber\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"revisionHeight\",\"type\":\"uint64\"}],\"internalType\":\"struct IICS02ClientMsgs.Height\",\"name\":\"latestHeight\",\"type\":\"tuple\"},{\"internalType\":\"uint32\",\"name\":\"trustingPeriod\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"unbondingPeriod\",\"type\":\"uint32\"},{\"internalType\":\"bool\",\"name\":\"isFrozen\",\"type\":\"bool\"},{\"internalType\":\"enum IICS07TendermintMsgs.SupportedZkAlgorithm\",\"name\":\"zkAlgorithm\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getClientState\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"revisionHeight\",\"type\":\"uint64\"}],\"name\":\"getConsensusStateHash\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"}],\"name\":\"getRoleAdmin\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"grantRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"hasRole\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"misbehaviourMsg\",\"type\":\"bytes\"}],\"name\":\"misbehaviour\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes[]\",\"name\":\"data\",\"type\":\"bytes[]\"}],\"name\":\"multicall\",\"outputs\":[{\"internalType\":\"bytes[]\",\"name\":\"results\",\"type\":\"bytes[]\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"callerConfirmation\",\"type\":\"address\"}],\"name\":\"renounceRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"revokeRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes4\",\"name\":\"interfaceId\",\"type\":\"bytes4\"}],\"name\":\"supportsInterface\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"updateMsg\",\"type\":\"bytes\"}],\"name\":\"updateClient\",\"outputs\":[{\"internalType\":\"enum ILightClientMsgs.UpdateResult\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes\",\"name\":\"proof\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"uint64\",\"name\":\"revisionNumber\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"revisionHeight\",\"type\":\"uint64\"}],\"internalType\":\"struct IICS02ClientMsgs.Height\",\"name\":\"proofHeight\",\"type\":\"tuple\"},{\"internalType\":\"bytes[]\",\"name\":\"path\",\"type\":\"bytes[]\"},{\"internalType\":\"bytes\",\"name\":\"value\",\"type\":\"bytes\"}],\"internalType\":\"struct ILightClientMsgs.MsgVerifyMembership\",\"name\":\"msg_\",\"type\":\"tuple\"}],\"name\":\"verifyMembership\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes\",\"name\":\"proof\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"uint64\",\"name\":\"revisionNumber\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"revisionHeight\",\"type\":\"uint64\"}],\"internalType\":\"struct IICS02ClientMsgs.Height\",\"name\":\"proofHeight\",\"type\":\"tuple\"},{\"internalType\":\"bytes[]\",\"name\":\"path\",\"type\":\"bytes[]\"}],\"internalType\":\"struct ILightClientMsgs.MsgVerifyNonMembership\",\"name\":\"msg_\",\"type\":\"tuple\"}],\"name\":\"verifyNonMembership\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"author\":\"srdtrk\",\"errors\":{\"AccessControlBadConfirmation()\":[{\"details\":\"The caller of a function is not the expected one. NOTE: Don't confuse with {AccessControlUnauthorizedAccount}.\"}],\"AccessControlUnauthorizedAccount(address,bytes32)\":[{\"details\":\"The `account` is missing a role.\"}],\"AddressEmptyCode(address)\":[{\"details\":\"There's no code at `target` (it is not a contract).\"}],\"CannotHandleMisbehavior()\":[{\"details\":\"Misbehavior cannot be handled in membership handler, so it is returned as an error.\"}],\"ChainIdMismatch(string,string)\":[{\"params\":{\"actual\":\"The actual chain ID.\",\"expected\":\"The expected chain ID.\"}}],\"ClientStateMismatch(bytes,bytes)\":[{\"params\":{\"actual\":\"The actual client state.\",\"expected\":\"The expected client state.\"}}],\"ConsensusStateHashMismatch(bytes32,bytes32)\":[{\"params\":{\"actual\":\"The actual consensus state hash.\",\"expected\":\"The expected consensus state hash.\"}}],\"ConsensusStateRootMismatch(bytes32,bytes32)\":[{\"params\":{\"actual\":\"The actual consensus state root.\",\"expected\":\"The expected consensus state root.\"}}],\"FailedCall()\":[{\"details\":\"A call to an address target failed. The target may have reverted.\"}],\"KeyValuePairNotInCache(bytes[],bytes)\":[{\"params\":{\"path\":\"The path of the key-value pair.\",\"value\":\"The value of the key-value pair.\"}}],\"LengthIsOutOfRange(uint256,uint256,uint256)\":[{\"params\":{\"length\":\"The length of the value.\",\"max\":\"The maximum length of the value.\",\"min\":\"The minimum length of the value.\"}}],\"MembershipProofKeyNotFound(bytes[])\":[{\"params\":{\"path\":\"The path of the key-value pair.\"}}],\"MembershipProofValueMismatch(bytes,bytes)\":[{\"params\":{\"actual\":\"The actual value.\",\"expected\":\"The expected value.\"}}],\"ProofHeightMismatch(uint64,uint64,uint64,uint64)\":[{\"params\":{\"actualRevisionHeight\":\"The actual revision height.\",\"actualRevisionNumber\":\"The actual revision number.\",\"expectedRevisionHeight\":\"The expected revision height.\",\"expectedRevisionNumber\":\"The expected revision number.\"}}],\"ProofIsInTheFuture(uint256,uint256)\":[{\"params\":{\"now\":\"The current timestamp in seconds.\",\"proofTimestamp\":\"The timestamp in the proof in seconds.\"}}],\"ProofIsTooOld(uint256,uint256)\":[{\"params\":{\"now\":\"The current timestamp in seconds.\",\"proofTimestamp\":\"The timestamp in the proof in seconds.\"}}],\"TrustThresholdMismatch(uint256,uint256,uint256,uint256)\":[{\"params\":{\"actualDenominator\":\"The actual denominator of the trust threshold.\",\"actualNumerator\":\"The actual numerator of the trust threshold.\",\"expectedDenominator\":\"The expected denominator of the trust threshold.\",\"expectedNumerator\":\"The expected numerator of the trust threshold.\"}}],\"TrustingPeriodMismatch(uint256,uint256)\":[{\"params\":{\"actual\":\"The actual trusting period in seconds.\",\"expected\":\"The expected trusting period in seconds.\"}}],\"TrustingPeriodTooLong(uint256,uint256)\":[{\"params\":{\"trustingPeriod\":\"The trusting period in seconds.\",\"unbondingPeriod\":\"The unbonding period in seconds.\"}}],\"UnbondingPeriodMismatch(uint256,uint256)\":[{\"params\":{\"actual\":\"The actual unbonding period in seconds.\",\"expected\":\"The expected unbonding period in seconds.\"}}],\"UnknownMembershipProofType(uint8)\":[{\"params\":{\"proofType\":\"The unknown membership proof type.\"}}],\"UnknownZkAlgorithm(uint8)\":[{\"params\":{\"algorithm\":\"The unknown zk algorithm.\"}}],\"VerificationKeyMismatch(bytes32,bytes32)\":[{\"params\":{\"actual\":\"The actual verification key.\",\"expected\":\"The expected verification key.\"}}]},\"events\":{\"RoleAdminChanged(bytes32,bytes32,bytes32)\":{\"details\":\"Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite {RoleAdminChanged} not being emitted to signal this.\"},\"RoleGranted(bytes32,address,address)\":{\"details\":\"Emitted when `account` is granted `role`. `sender` is the account that originated the contract call. This account bears the admin role (for the granted role). Expected in cases where the role was granted using the internal {AccessControl-_grantRole}.\"},\"RoleRevoked(bytes32,address,address)\":{\"details\":\"Emitted when `account` is revoked `role`. `sender` is the account that originated the contract call: - if using `revokeRole`, it is the admin role bearer - if using `renounceRole`, it is the role bearer (i.e. `account`)\"}},\"kind\":\"dev\",\"methods\":{\"constructor\":{\"params\":{\"_clientState\":\"The encoded initial client state.\",\"_consensusState\":\"The encoded initial consensus state.\",\"membershipProgramVkey\":\"The verification key for the verify (non)membership program.\",\"misbehaviourProgramVkey\":\"The verification key for the misbehaviour program.\",\"roleManager\":\"Manages the proof submitters and can submit proofs. Should be the ICS26Router if used in IBC.\",\"sp1Verifier\":\"The address of the SP1 verifier contract.\",\"updateClientAndMembershipProgramVkey\":\"The verification key for the update client and membership program.\",\"updateClientProgramVkey\":\"The verification key for the update client program.\"}},\"getClientState()\":{\"returns\":{\"_0\":\"The client state.\"}},\"getConsensusStateHash(uint64)\":{\"params\":{\"revisionHeight\":\"The revision height.\"},\"returns\":{\"_0\":\"The consensus state at the given revision height.\"}},\"getRoleAdmin(bytes32)\":{\"details\":\"Returns the admin role that controls `role`. See {grantRole} and {revokeRole}. To change a role's admin, use {_setRoleAdmin}.\"},\"grantRole(bytes32,address)\":{\"details\":\"Grants `role` to `account`. If `account` had not been already granted `role`, emits a {RoleGranted} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleGranted} event.\"},\"hasRole(bytes32,address)\":{\"details\":\"Returns `true` if `account` has been granted `role`.\"},\"misbehaviour(bytes)\":{\"details\":\"The misbehavior is verfied in the sp1 program. Here we only check the public values which contain the trusted headers.\",\"params\":{\"misbehaviourMsg\":\"The misbehaviour message\"}},\"multicall(bytes[])\":{\"custom:oz-upgrades-unsafe-allow-reachable\":\"delegatecall\",\"details\":\"Receives and executes a batch of function calls on this contract.\"},\"renounceRole(bytes32,address)\":{\"details\":\"Revokes `role` from the calling account. Roles are often managed via {grantRole} and {revokeRole}: this function's purpose is to provide a mechanism for accounts to lose their privileges if they are compromised (such as when a trusted device is misplaced). If the calling account had been revoked `role`, emits a {RoleRevoked} event. Requirements: - the caller must be `callerConfirmation`. May emit a {RoleRevoked} event.\"},\"revokeRole(bytes32,address)\":{\"details\":\"Revokes `role` from `account`. If `account` had been granted `role`, emits a {RoleRevoked} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleRevoked} event.\"},\"supportsInterface(bytes4)\":{\"details\":\"Returns true if this contract implements the interface defined by `interfaceId`. See the corresponding https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[ERC section] to learn more about how these ids are created. This function call must use less than 30 000 gas.\"},\"updateClient(bytes)\":{\"details\":\"This function verifies the public values and forwards the proof to the SP1 verifier.\",\"params\":{\"updateMsg\":\"The encoded update message e.g., an SP1 proof.\"},\"returns\":{\"_0\":\"The result of the update operation\"}},\"verifyMembership((bytes,(uint64,uint64),bytes[],bytes))\":{\"details\":\"Notice that this message is not view, as it may update the client state for caching purposes.\",\"params\":{\"msg_\":\"The membership message\"},\"returns\":{\"_0\":\"The unix timestamp of the verification height in the counterparty chain in seconds.\"}},\"verifyNonMembership((bytes,(uint64,uint64),bytes[]))\":{\"details\":\"Notice that this message is not view, as it may update the client state for caching purposes.\",\"params\":{\"msg_\":\"The membership message\"},\"returns\":{\"_0\":\"The unix timestamp of the verification height in the counterparty chain in seconds.\"}}},\"stateVariables\":{\"ALLOWED_SP1_CLOCK_DRIFT\":{\"return\":\"The allowed prover clock drift in seconds.\",\"returns\":{\"_0\":\"The allowed prover clock drift in seconds.\"}},\"MEMBERSHIP_PROGRAM_VKEY\":{\"return\":\"The verification key for the membership program.\",\"returns\":{\"_0\":\"The verification key for the membership program.\"}},\"MISBEHAVIOUR_PROGRAM_VKEY\":{\"return\":\"The verification key for the misbehaviour program.\",\"returns\":{\"_0\":\"The verification key for the misbehaviour program.\"}},\"PROOF_SUBMITTER_ROLE\":{\"details\":\"The proof submitter role is used to whitelist addresses that can submit proofsIf `address(0)` has this role, then anyone can submit proofsIf this client is hooked up to ICS26Router, the router must be given this role\",\"return\":\"The role identifier\",\"returns\":{\"_0\":\"The role identifier\"}},\"UPDATE_CLIENT_AND_MEMBERSHIP_PROGRAM_VKEY\":{\"return\":\"The verification key for the update client and membership program.\",\"returns\":{\"_0\":\"The verification key for the update client and membership program.\"}},\"UPDATE_CLIENT_PROGRAM_VKEY\":{\"return\":\"The verification key for the update client program.\",\"returns\":{\"_0\":\"The verification key for the update client program.\"}},\"VERIFIER\":{\"return\":\"The SP1 verifier contract.\",\"returns\":{\"_0\":\"The SP1 verifier contract.\"}},\"_consensusStateHashes\":{\"details\":\"Revision number need not be keyed as it is not allowed to change.\"}},\"title\":\"SP1 ICS07 Tendermint Light Client\",\"version\":1},\"userdoc\":{\"errors\":{\"CannotHandleMisbehavior()\":[{\"notice\":\"The error that is returned when the update client and membership program contains misbehavior.\"}],\"ChainIdMismatch(string,string)\":[{\"notice\":\"The error that is returned when the chain ID does not match the expected value.\"}],\"ClientStateMismatch(bytes,bytes)\":[{\"notice\":\"The error that is returned when the client state does not match the expected value.\"}],\"ConsensusStateHashMismatch(bytes32,bytes32)\":[{\"notice\":\"The error that is returned when the consensus state hash does not match the expected value.\"}],\"ConsensusStateNotFound()\":[{\"notice\":\"The error that is returned when the consensus state is not found.\"}],\"ConsensusStateRootMismatch(bytes32,bytes32)\":[{\"notice\":\"The error that is returned when the consensus state root does not match the expected value.\"}],\"EmptyValue()\":[{\"notice\":\"Returned when the membership value is empty.\"}],\"FeatureNotSupported()\":[{\"notice\":\"Returned when the feature is not supported.\"}],\"FrozenClientState()\":[{\"notice\":\"The error that is returned when the client state is frozen.\"}],\"InvalidMembershipProof()\":[{\"notice\":\"Returned when the membership proof is invalid.\"}],\"KeyValuePairNotInCache(bytes[],bytes)\":[{\"notice\":\"Returned when a key-value pair is not in the cache.\"}],\"LengthIsOutOfRange(uint256,uint256,uint256)\":[{\"notice\":\"The error that is returned when the length of a value is out of range.\"}],\"MembershipProofKeyNotFound(bytes[])\":[{\"notice\":\"The error that is returned when the key-value pair's path is not contained in the proof.\"}],\"MembershipProofValueMismatch(bytes,bytes)\":[{\"notice\":\"The error that is returned when the key-value pair's value does not match the expected value.\"}],\"ProofHeightMismatch(uint64,uint64,uint64,uint64)\":[{\"notice\":\"The error that is returned when the proof height does not match the expected value.\"}],\"ProofIsInTheFuture(uint256,uint256)\":[{\"notice\":\"The error that is returned when a proof is in the future.\"}],\"ProofIsTooOld(uint256,uint256)\":[{\"notice\":\"The error that is returned when a proof is too old.\"}],\"TrustThresholdMismatch(uint256,uint256,uint256,uint256)\":[{\"notice\":\"The error that is returned when the trust threshold does not match the expected value.\"}],\"TrustingPeriodMismatch(uint256,uint256)\":[{\"notice\":\"The error that is returned when the trusting period does not match the expected value.\"}],\"TrustingPeriodTooLong(uint256,uint256)\":[{\"notice\":\"The error that is returned when the trusting period is longer than the unbonding period.\"}],\"UnbondingPeriodMismatch(uint256,uint256)\":[{\"notice\":\"The error that is returned when the unbonding period does not match the expected value.\"}],\"UnknownMembershipProofType(uint8)\":[{\"notice\":\"The error that is returned when the membership proof type is unknown.\"}],\"UnknownZkAlgorithm(uint8)\":[{\"notice\":\"The error that is returned when the zk algorithm is unknown.\"}],\"VerificationKeyMismatch(bytes32,bytes32)\":[{\"notice\":\"The error that is returned when the verification key does not match the expected value.\"}]},\"kind\":\"user\",\"methods\":{\"ALLOWED_SP1_CLOCK_DRIFT()\":{\"notice\":\"Constant allowed prover clock drift in seconds.\"},\"MEMBERSHIP_PROGRAM_VKEY()\":{\"notice\":\"Immutable membership program verification key.\"},\"MISBEHAVIOUR_PROGRAM_VKEY()\":{\"notice\":\"Immutable misbehaviour program verification key.\"},\"PROOF_SUBMITTER_ROLE()\":{\"notice\":\"The role identifier for the proof submitter role\"},\"UPDATE_CLIENT_AND_MEMBERSHIP_PROGRAM_VKEY()\":{\"notice\":\"Immutable update client and membership program verification key.\"},\"UPDATE_CLIENT_PROGRAM_VKEY()\":{\"notice\":\"Immutable update client program verification key.\"},\"VERIFIER()\":{\"notice\":\"Immutable SP1 verifier contract address.\"},\"clientState()\":{\"notice\":\"The ICS07Tendermint client state\"},\"constructor\":{\"notice\":\"The constructor sets the program verification key and the initial client and consensus states.\"},\"getClientState()\":{\"notice\":\"Returns the client state.\"},\"getConsensusStateHash(uint64)\":{\"notice\":\"Returns the consensus state keccak256 hash at the given revision height.\"},\"misbehaviour(bytes)\":{\"notice\":\"Misbehaviour handling, moves the light client to the frozen state if misbehaviour is detected\"},\"updateClient(bytes)\":{\"notice\":\"Updating the client and consensus state\"},\"verifyMembership((bytes,(uint64,uint64),bytes[],bytes))\":{\"notice\":\"Querying the membership of a key-value pair\"},\"verifyNonMembership((bytes,(uint64,uint64),bytes[]))\":{\"notice\":\"Querying the non-membership of a key\"}},\"notice\":\"This contract implements an ICS07 IBC tendermint light client using SP1.\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/light-clients/sp1-ics07/SP1ICS07Tendermint.sol\":\"SP1ICS07Tendermint\"},\"evmVersion\":\"cancun\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"none\"},\"optimizer\":{\"enabled\":true,\"runs\":10000},\"remappings\":[\":@openzeppelin-contracts/=node_modules/@openzeppelin/contracts/\",\":@openzeppelin-upgradeable/=node_modules/@openzeppelin/contracts-upgradeable/\",\":@openzeppelin/=node_modules/@openzeppelin/\",\":@sp1-contracts/=node_modules/sp1-contracts/contracts/src/\",\":@uniswap/permit2/=node_modules/@uniswap/permit2/\",\":forge-std/=node_modules/forge-std/src/\",\":sp1-contracts/=node_modules/sp1-contracts/\"],\"viaIR\":true},\"sources\":{\"contracts/interfaces/ILightClient.sol\":{\"keccak256\":\"0x1caae9e4f741a86c0056d5f7713a35f3bd96db7a9fd52fc9f1cf79aad76a442f\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://4a536db3b926560f69547c17e4f451a2631ddea0f42bd224c7fd8382d74429f6\",\"dweb:/ipfs/QmcQ33kxcmmowXgMbQGTBgiKBjF7v8UiP4y73bB9hhDizC\"]},\"contracts/light-clients/sp1-ics07/SP1ICS07Tendermint.sol\":{\"keccak256\":\"0x2e03f0f1e058e7184ea70dc2a423a3d32a609620b6a1e8b764ec9c287b0b6187\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://9e3c0b2f3b3af9cfc8a3ab085e0decffcd40230a27530142293f0b79a4aefe51\",\"dweb:/ipfs/Qmf3qEAMWdiGAMEXSae6mzZ7Sncsbr4QzDC4JzMeiNwgei\"]},\"contracts/light-clients/sp1-ics07/errors/ISP1ICS07TendermintErrors.sol\":{\"keccak256\":\"0xe1a0526f9913308f761af480ef7d87091d6038659b9058f89c50083d49768db1\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://a31d6d4a059182b3dfd3e99595d82a134963c448c9152ef35b42c62ccca87635\",\"dweb:/ipfs/QmfQ2Cfa4kxWem3f88o9UnFQgL8oRU6vKkDFWSGmLsVLqN\"]},\"contracts/light-clients/sp1-ics07/interfaces/ISP1ICS07Tendermint.sol\":{\"keccak256\":\"0x0f00aea96b194d1a9db14f708f0de1fe7723fedc7b72bb8ea182e768ffc0a731\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://3111a76ebabf4b57917e93669892df895a54a93a4963e384d8c13a1c47877b44\",\"dweb:/ipfs/QmPCZ7Z4dJpowkzMhizUAW1j8QdJLD3DDjMbYq8G5VeXc1\"]},\"contracts/light-clients/sp1-ics07/msgs/IICS07TendermintMsgs.sol\":{\"keccak256\":\"0xae0ae6ff2742192ebaaee297c7d7473a1e1b4dc73393d45a944b0b7a8a647703\",\"license\":\"UNLICENSED\",\"urls\":[\"bzz-raw://43b2f6492a1f727416bbcf55876d9c08ac1f66f4724efc75b935c5022555be20\",\"dweb:/ipfs/QmfTaPFNSFuUEsEBgJjnF2Jr2knayS7YwatfjP7dgdcAyH\"]},\"contracts/light-clients/sp1-ics07/msgs/IMembershipMsgs.sol\":{\"keccak256\":\"0x9dff6833fddbc11caf27387c9f8cba5dca9d1e430c9643d4e4a2e8eb09924d96\",\"license\":\"UNLICENSED\",\"urls\":[\"bzz-raw://efa6cfc654510dfcef6f4286e3e66446082bcd5671662ae6e1c6fd0f893a5a4a\",\"dweb:/ipfs/QmRWAg1kHvmRtXgDm4ajVC7tEWQnzTWmHeHMYQJfyFuDGq\"]},\"contracts/light-clients/sp1-ics07/msgs/IMisbehaviourMsgs.sol\":{\"keccak256\":\"0x165b37d890b06eccd47558bf1efd6495e18541627758736a1f5b9c33d0333832\",\"license\":\"UNLICENSED\",\"urls\":[\"bzz-raw://15ab15cd5439147abed697bc9644b0175754845608bf3d57c81c2c864d31ce46\",\"dweb:/ipfs/QmYcV88YsM1sZCmhP8LKUFHq3hJ6bsvd66W5axBnsBBoUM\"]},\"contracts/light-clients/sp1-ics07/msgs/ISP1Msgs.sol\":{\"keccak256\":\"0x8ede29b02182df4be9c075b3b48083277e5dd93bb3e7ce1eecfea9728db49aed\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://48edb4bbcd440454fffceb4f85b83c08c3973a212239d7da07c079634fe413dd\",\"dweb:/ipfs/Qmf7ma1nXWghfZKrJJvLpPuY5aN2xZZjHY7kWP3KVFCoDJ\"]},\"contracts/light-clients/sp1-ics07/msgs/IUcAndMembershipMsgs.sol\":{\"keccak256\":\"0xef3619c79de37cabe95d9d8af9d145fc2ea2dd55137407fb4b0082b0491170d0\",\"license\":\"UNLICENSED\",\"urls\":[\"bzz-raw://93646d813cdacf5e38e609e54baa67c60d749f0f111d00cd18b003c3cb328204\",\"dweb:/ipfs/QmVcuwPujbiZ644a4jRw2V1LZxhhGsm2HKMXweVqndwUnZ\"]},\"contracts/light-clients/sp1-ics07/msgs/IUpdateClientMsgs.sol\":{\"keccak256\":\"0x370cdfca1c65f1898c7da80507e66972a6fe51a5d5c4e7aeabdd7060ce875aed\",\"license\":\"UNLICENSED\",\"urls\":[\"bzz-raw://ff34288a142b6f40d6843818b9ec0a542db016bc0d4a7be582eb2e255655c43e\",\"dweb:/ipfs/QmXwbJHDbqZdw3JTT48Le1ZWGqmKAG7omf2ePvDfBHomzj\"]},\"contracts/light-clients/sp1-ics07/utils/Paths.sol\":{\"keccak256\":\"0x0e4eec6cd6cd0ef684383946419a2bf53c8f800033acfc298db81688e5aa178b\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://824b58c13ff96b6ee38b5d25435fcc1305c45735f52df6347dba3dacdc144ffa\",\"dweb:/ipfs/QmT7qomKM46ChfVVwfBQHwjpoHW9vrG9nXkGXsPeZRLJ7w\"]},\"contracts/msgs/IICS02ClientMsgs.sol\":{\"keccak256\":\"0xb5fdb25319d5c32b3f527982d45ec1e9bec5215515581aee034d853006ea01a0\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://6b8939bf552c62c952a491008bcd9b59ab7dda20a9482bf93438e05793881542\",\"dweb:/ipfs/QmfWmzNCp8bd4pP26Lfw5HHp4dSZnCDqZDjVN7SD8P7eDh\"]},\"contracts/msgs/ILightClientMsgs.sol\":{\"keccak256\":\"0xa0565e7748b8b3284d72e1aa6ef4cc8264fcaa5f4e0761d22d64686953db6378\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://c4476010d7090bfaa74127526f2051c6bc82ff42a09b936e848880a1f15a6065\",\"dweb:/ipfs/QmY87JgRsFQXSZdGXNjNHEJCkdTHzFXH4vZEJ3q7MnHuP8\"]},\"node_modules/@openzeppelin/contracts/access/AccessControl.sol\":{\"keccak256\":\"0x1a6b4f6b7798ab80929d491b89d5427a9b3338c0fd1acd0ba325f69c6f1646af\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://7bb7f346c12a14dc622bc105ce3c47202fbc89f4b153a28a63bb68193297330c\",\"dweb:/ipfs/QmagwF8P3bUBXwdo159ueEnY9dLSvEWwK24kk2op58egwG\"]},\"node_modules/@openzeppelin/contracts/access/IAccessControl.sol\":{\"keccak256\":\"0xbff9f59c84e5337689161ce7641c0ef8e872d6a7536fbc1f5133f128887aba3c\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://b308f882e796f7b79c9502deacb0a62983035c6f6f4e962b319ba6a1f4a77d3d\",\"dweb:/ipfs/QmaWCW7ahEQqFjwhSUhV7Ae7WhfNvzSpE7DQ58hvEooqPL\"]},\"node_modules/@openzeppelin/contracts/utils/Address.sol\":{\"keccak256\":\"0x6d0ae6e206645341fd122d278c2cb643dea260c190531f2f3f6a0426e77b00c0\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://032d1201d839435be2c85b72e33206b3ea980c569d6ebf7fa57d811ab580a82f\",\"dweb:/ipfs/QmeqQjAtMvdZT2tG7zm39itcRJkuwu8AEReK6WRnLJ18DD\"]},\"node_modules/@openzeppelin/contracts/utils/Context.sol\":{\"keccak256\":\"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://6a708e8a5bdb1011c2c381c9a5cfd8a9a956d7d0a9dc1bd8bcdaf52f76ef2f12\",\"dweb:/ipfs/Qmax9WHBnVsZP46ZxEMNRQpLQnrdE4dK8LehML1Py8FowF\"]},\"node_modules/@openzeppelin/contracts/utils/Errors.sol\":{\"keccak256\":\"0x6afa713bfd42cf0f7656efa91201007ac465e42049d7de1d50753a373648c123\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://ba1d02f4847670a1b83dec9f7d37f0b0418d6043447b69f3a29a5f9efc547fcf\",\"dweb:/ipfs/QmQ7iH2keLNUKgq2xSWcRmuBE5eZ3F5whYAkAGzCNNoEWB\"]},\"node_modules/@openzeppelin/contracts/utils/Multicall.sol\":{\"keccak256\":\"0xa4c645387f16eae227cd378108e8e0a8acbcf2b600e393629bbd8422241c495f\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://5e272440acfbec7f51afdb60a42597837b267de83ba7bd08d7e4dbc40171567c\",\"dweb:/ipfs/QmPYzRwXpjUJEGRBWaSnzHz8gym1AKJ8yfoCgbo7gcwmEf\"]},\"node_modules/@openzeppelin/contracts/utils/TransientSlot.sol\":{\"keccak256\":\"0xac673fa1e374d9e6107504af363333e3e5f6344d2e83faf57d9bfd41d77cc946\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://5982478dbbb218e9dd5a6e83f5c0e8d1654ddf20178484b43ef21dd2246809de\",\"dweb:/ipfs/QmaB1hS68n2kG8vTbt7EPEzmrGhkUbfiFyykGGLsAr9X22\"]},\"node_modules/@openzeppelin/contracts/utils/introspection/ERC165.sol\":{\"keccak256\":\"0x2d9dc2fe26180f74c11c13663647d38e259e45f95eb88f57b61d2160b0109d3e\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://81233d1f98060113d9922180bb0f14f8335856fe9f339134b09335e9f678c377\",\"dweb:/ipfs/QmWh6R35SarhAn4z2wH8SU456jJSYL2FgucfTFgbHJJN4E\"]},\"node_modules/@openzeppelin/contracts/utils/introspection/IERC165.sol\":{\"keccak256\":\"0x8891738ffe910f0cf2da09566928589bf5d63f4524dd734fd9cedbac3274dd5c\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://971f954442df5c2ef5b5ebf1eb245d7105d9fbacc7386ee5c796df1d45b21617\",\"dweb:/ipfs/QmadRjHbkicwqwwh61raUEapaVEtaLMcYbQZWs9gUkgj3u\"]},\"node_modules/sp1-contracts/contracts/src/ISP1Verifier.sol\":{\"keccak256\":\"0x9e3ba64860bea920772dcf16be7946de2a2900d80bd51e9c0771184138f4f4d3\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://0ec7230ca1fdd74edc6ab597d80bb345282aed3f0db4788ed96b4cc373ff46a3\",\"dweb:/ipfs/QmXPuSS5gzxMhFKWr1gsxBVu6WHh53ZZEvWkGgzrkM6Y7Q\"]}},\"version\":1}","metadata":{"compiler":{"version":"0.8.28+commit.7893614a"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"bytes32","name":"updateClientProgramVkey","type":"bytes32"},{"internalType":"bytes32","name":"membershipProgramVkey","type":"bytes32"},{"internalType":"bytes32","name":"updateClientAndMembershipProgramVkey","type":"bytes32"},{"internalType":"bytes32","name":"misbehaviourProgramVkey","type":"bytes32"},{"internalType":"address","name":"sp1Verifier","type":"address"},{"internalType":"bytes","name":"_clientState","type":"bytes"},{"internalType":"bytes32","name":"_consensusState","type":"bytes32"},{"internalType":"address","name":"roleManager","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"type":"error","name":"AccessControlBadConfirmation"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bytes32","name":"neededRole","type":"bytes32"}],"type":"error","name":"AccessControlUnauthorizedAccount"},{"inputs":[{"internalType":"address","name":"target","type":"address"}],"type":"error","name":"AddressEmptyCode"},{"inputs":[],"type":"error","name":"CannotHandleMisbehavior"},{"inputs":[{"internalType":"string","name":"expected","type":"string"},{"internalType":"string","name":"actual","type":"string"}],"type":"error","name":"ChainIdMismatch"},{"inputs":[{"internalType":"bytes","name":"expected","type":"bytes"},{"internalType":"bytes","name":"actual","type":"bytes"}],"type":"error","name":"ClientStateMismatch"},{"inputs":[{"internalType":"bytes32","name":"expected","type":"bytes32"},{"internalType":"bytes32","name":"actual","type":"bytes32"}],"type":"error","name":"ConsensusStateHashMismatch"},{"inputs":[],"type":"error","name":"ConsensusStateNotFound"},{"inputs":[{"internalType":"bytes32","name":"expected","type":"bytes32"},{"internalType":"bytes32","name":"actual","type":"bytes32"}],"type":"error","name":"ConsensusStateRootMismatch"},{"inputs":[],"type":"error","name":"EmptyValue"},{"inputs":[],"type":"error","name":"FailedCall"},{"inputs":[],"type":"error","name":"FeatureNotSupported"},{"inputs":[],"type":"error","name":"FrozenClientState"},{"inputs":[],"type":"error","name":"InvalidMembershipProof"},{"inputs":[{"internalType":"bytes[]","name":"path","type":"bytes[]"},{"internalType":"bytes","name":"value","type":"bytes"}],"type":"error","name":"KeyValuePairNotInCache"},{"inputs":[{"internalType":"uint256","name":"length","type":"uint256"},{"internalType":"uint256","name":"min","type":"uint256"},{"internalType":"uint256","name":"max","type":"uint256"}],"type":"error","name":"LengthIsOutOfRange"},{"inputs":[{"internalType":"bytes[]","name":"path","type":"bytes[]"}],"type":"error","name":"MembershipProofKeyNotFound"},{"inputs":[{"internalType":"bytes","name":"expected","type":"bytes"},{"internalType":"bytes","name":"actual","type":"bytes"}],"type":"error","name":"MembershipProofValueMismatch"},{"inputs":[{"internalType":"uint64","name":"expectedRevisionNumber","type":"uint64"},{"internalType":"uint64","name":"expectedRevisionHeight","type":"uint64"},{"internalType":"uint64","name":"actualRevisionNumber","type":"uint64"},{"internalType":"uint64","name":"actualRevisionHeight","type":"uint64"}],"type":"error","name":"ProofHeightMismatch"},{"inputs":[{"internalType":"uint256","name":"now","type":"uint256"},{"internalType":"uint256","name":"proofTimestamp","type":"uint256"}],"type":"error","name":"ProofIsInTheFuture"},{"inputs":[{"internalType":"uint256","name":"now","type":"uint256"},{"internalType":"uint256","name":"proofTimestamp","type":"uint256"}],"type":"error","name":"ProofIsTooOld"},{"inputs":[{"internalType":"uint256","name":"expectedNumerator","type":"uint256"},{"internalType":"uint256","name":"expectedDenominator","type":"uint256"},{"internalType":"uint256","name":"actualNumerator","type":"uint256"},{"internalType":"uint256","name":"actualDenominator","type":"uint256"}],"type":"error","name":"TrustThresholdMismatch"},{"inputs":[{"internalType":"uint256","name":"expected","type":"uint256"},{"internalType":"uint256","name":"actual","type":"uint256"}],"type":"error","name":"TrustingPeriodMismatch"},{"inputs":[{"internalType":"uint256","name":"trustingPeriod","type":"uint256"},{"internalType":"uint256","name":"unbondingPeriod","type":"uint256"}],"type":"error","name":"TrustingPeriodTooLong"},{"inputs":[{"internalType":"uint256","name":"expected","type":"uint256"},{"internalType":"uint256","name":"actual","type":"uint256"}],"type":"error","name":"UnbondingPeriodMismatch"},{"inputs":[{"internalType":"uint8","name":"proofType","type":"uint8"}],"type":"error","name":"UnknownMembershipProofType"},{"inputs":[{"internalType":"uint8","name":"algorithm","type":"uint8"}],"type":"error","name":"UnknownZkAlgorithm"},{"inputs":[{"internalType":"bytes32","name":"expected","type":"bytes32"},{"internalType":"bytes32","name":"actual","type":"bytes32"}],"type":"error","name":"VerificationKeyMismatch"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32","indexed":true},{"internalType":"bytes32","name":"previousAdminRole","type":"bytes32","indexed":true},{"internalType":"bytes32","name":"newAdminRole","type":"bytes32","indexed":true}],"type":"event","name":"RoleAdminChanged","anonymous":false},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32","indexed":true},{"internalType":"address","name":"account","type":"address","indexed":true},{"internalType":"address","name":"sender","type":"address","indexed":true}],"type":"event","name":"RoleGranted","anonymous":false},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32","indexed":true},{"internalType":"address","name":"account","type":"address","indexed":true},{"internalType":"address","name":"sender","type":"address","indexed":true}],"type":"event","name":"RoleRevoked","anonymous":false},{"inputs":[],"stateMutability":"view","type":"function","name":"ALLOWED_SP1_CLOCK_DRIFT","outputs":[{"internalType":"uint16","name":"","type":"uint16"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"MEMBERSHIP_PROGRAM_VKEY","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"MISBEHAVIOUR_PROGRAM_VKEY","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"PROOF_SUBMITTER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"UPDATE_CLIENT_AND_MEMBERSHIP_PROGRAM_VKEY","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"UPDATE_CLIENT_PROGRAM_VKEY","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"VERIFIER","outputs":[{"internalType":"contract ISP1Verifier","name":"","type":"address"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"clientState","outputs":[{"internalType":"string","name":"chainId","type":"string"},{"internalType":"struct IICS07TendermintMsgs.TrustThreshold","name":"trustLevel","type":"tuple","components":[{"internalType":"uint8","name":"numerator","type":"uint8"},{"internalType":"uint8","name":"denominator","type":"uint8"}]},{"internalType":"struct IICS02ClientMsgs.Height","name":"latestHeight","type":"tuple","components":[{"internalType":"uint64","name":"revisionNumber","type":"uint64"},{"internalType":"uint64","name":"revisionHeight","type":"uint64"}]},{"internalType":"uint32","name":"trustingPeriod","type":"uint32"},{"internalType":"uint32","name":"unbondingPeriod","type":"uint32"},{"internalType":"bool","name":"isFrozen","type":"bool"},{"internalType":"enum IICS07TendermintMsgs.SupportedZkAlgorithm","name":"zkAlgorithm","type":"uint8"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"getClientState","outputs":[{"internalType":"bytes","name":"","type":"bytes"}]},{"inputs":[{"internalType":"uint64","name":"revisionHeight","type":"uint64"}],"stateMutability":"view","type":"function","name":"getConsensusStateHash","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}]},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"stateMutability":"view","type":"function","name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}]},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"stateMutability":"nonpayable","type":"function","name":"grantRole"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"stateMutability":"view","type":"function","name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}]},{"inputs":[{"internalType":"bytes","name":"misbehaviourMsg","type":"bytes"}],"stateMutability":"nonpayable","type":"function","name":"misbehaviour"},{"inputs":[{"internalType":"bytes[]","name":"data","type":"bytes[]"}],"stateMutability":"nonpayable","type":"function","name":"multicall","outputs":[{"internalType":"bytes[]","name":"results","type":"bytes[]"}]},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"callerConfirmation","type":"address"}],"stateMutability":"nonpayable","type":"function","name":"renounceRole"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"stateMutability":"nonpayable","type":"function","name":"revokeRole"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"stateMutability":"view","type":"function","name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}]},{"inputs":[{"internalType":"bytes","name":"updateMsg","type":"bytes"}],"stateMutability":"nonpayable","type":"function","name":"updateClient","outputs":[{"internalType":"enum ILightClientMsgs.UpdateResult","name":"","type":"uint8"}]},{"inputs":[{"internalType":"struct ILightClientMsgs.MsgVerifyMembership","name":"msg_","type":"tuple","components":[{"internalType":"bytes","name":"proof","type":"bytes"},{"internalType":"struct IICS02ClientMsgs.Height","name":"proofHeight","type":"tuple","components":[{"internalType":"uint64","name":"revisionNumber","type":"uint64"},{"internalType":"uint64","name":"revisionHeight","type":"uint64"}]},{"internalType":"bytes[]","name":"path","type":"bytes[]"},{"internalType":"bytes","name":"value","type":"bytes"}]}],"stateMutability":"nonpayable","type":"function","name":"verifyMembership","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[{"internalType":"struct ILightClientMsgs.MsgVerifyNonMembership","name":"msg_","type":"tuple","components":[{"internalType":"bytes","name":"proof","type":"bytes"},{"internalType":"struct IICS02ClientMsgs.Height","name":"proofHeight","type":"tuple","components":[{"internalType":"uint64","name":"revisionNumber","type":"uint64"},{"internalType":"uint64","name":"revisionHeight","type":"uint64"}]},{"internalType":"bytes[]","name":"path","type":"bytes[]"}]}],"stateMutability":"nonpayable","type":"function","name":"verifyNonMembership","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]}],"devdoc":{"kind":"dev","methods":{"constructor":{"params":{"_clientState":"The encoded initial client state.","_consensusState":"The encoded initial consensus state.","membershipProgramVkey":"The verification key for the verify (non)membership program.","misbehaviourProgramVkey":"The verification key for the misbehaviour program.","roleManager":"Manages the proof submitters and can submit proofs. Should be the ICS26Router if used in IBC.","sp1Verifier":"The address of the SP1 verifier contract.","updateClientAndMembershipProgramVkey":"The verification key for the update client and membership program.","updateClientProgramVkey":"The verification key for the update client program."}},"getClientState()":{"returns":{"_0":"The client state."}},"getConsensusStateHash(uint64)":{"params":{"revisionHeight":"The revision height."},"returns":{"_0":"The consensus state at the given revision height."}},"getRoleAdmin(bytes32)":{"details":"Returns the admin role that controls `role`. See {grantRole} and {revokeRole}. To change a role's admin, use {_setRoleAdmin}."},"grantRole(bytes32,address)":{"details":"Grants `role` to `account`. If `account` had not been already granted `role`, emits a {RoleGranted} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleGranted} event."},"hasRole(bytes32,address)":{"details":"Returns `true` if `account` has been granted `role`."},"misbehaviour(bytes)":{"details":"The misbehavior is verfied in the sp1 program. Here we only check the public values which contain the trusted headers.","params":{"misbehaviourMsg":"The misbehaviour message"}},"multicall(bytes[])":{"custom:oz-upgrades-unsafe-allow-reachable":"delegatecall","details":"Receives and executes a batch of function calls on this contract."},"renounceRole(bytes32,address)":{"details":"Revokes `role` from the calling account. Roles are often managed via {grantRole} and {revokeRole}: this function's purpose is to provide a mechanism for accounts to lose their privileges if they are compromised (such as when a trusted device is misplaced). If the calling account had been revoked `role`, emits a {RoleRevoked} event. Requirements: - the caller must be `callerConfirmation`. May emit a {RoleRevoked} event."},"revokeRole(bytes32,address)":{"details":"Revokes `role` from `account`. If `account` had been granted `role`, emits a {RoleRevoked} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleRevoked} event."},"supportsInterface(bytes4)":{"details":"Returns true if this contract implements the interface defined by `interfaceId`. See the corresponding https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[ERC section] to learn more about how these ids are created. This function call must use less than 30 000 gas."},"updateClient(bytes)":{"details":"This function verifies the public values and forwards the proof to the SP1 verifier.","params":{"updateMsg":"The encoded update message e.g., an SP1 proof."},"returns":{"_0":"The result of the update operation"}},"verifyMembership((bytes,(uint64,uint64),bytes[],bytes))":{"details":"Notice that this message is not view, as it may update the client state for caching purposes.","params":{"msg_":"The membership message"},"returns":{"_0":"The unix timestamp of the verification height in the counterparty chain in seconds."}},"verifyNonMembership((bytes,(uint64,uint64),bytes[]))":{"details":"Notice that this message is not view, as it may update the client state for caching purposes.","params":{"msg_":"The membership message"},"returns":{"_0":"The unix timestamp of the verification height in the counterparty chain in seconds."}}},"version":1},"userdoc":{"kind":"user","methods":{"ALLOWED_SP1_CLOCK_DRIFT()":{"notice":"Constant allowed prover clock drift in seconds."},"MEMBERSHIP_PROGRAM_VKEY()":{"notice":"Immutable membership program verification key."},"MISBEHAVIOUR_PROGRAM_VKEY()":{"notice":"Immutable misbehaviour program verification key."},"PROOF_SUBMITTER_ROLE()":{"notice":"The role identifier for the proof submitter role"},"UPDATE_CLIENT_AND_MEMBERSHIP_PROGRAM_VKEY()":{"notice":"Immutable update client and membership program verification key."},"UPDATE_CLIENT_PROGRAM_VKEY()":{"notice":"Immutable update client program verification key."},"VERIFIER()":{"notice":"Immutable SP1 verifier contract address."},"clientState()":{"notice":"The ICS07Tendermint client state"},"constructor":{"notice":"The constructor sets the program verification key and the initial client and consensus states."},"getClientState()":{"notice":"Returns the client state."},"getConsensusStateHash(uint64)":{"notice":"Returns the consensus state keccak256 hash at the given revision height."},"misbehaviour(bytes)":{"notice":"Misbehaviour handling, moves the light client to the frozen state if misbehaviour is detected"},"updateClient(bytes)":{"notice":"Updating the client and consensus state"},"verifyMembership((bytes,(uint64,uint64),bytes[],bytes))":{"notice":"Querying the membership of a key-value pair"},"verifyNonMembership((bytes,(uint64,uint64),bytes[]))":{"notice":"Querying the non-membership of a key"}},"version":1}},"settings":{"remappings":["@openzeppelin-contracts/=node_modules/@openzeppelin/contracts/","@openzeppelin-upgradeable/=node_modules/@openzeppelin/contracts-upgradeable/","@openzeppelin/=node_modules/@openzeppelin/","@sp1-contracts/=node_modules/sp1-contracts/contracts/src/","@uniswap/permit2/=node_modules/@uniswap/permit2/","forge-std/=node_modules/forge-std/src/","sp1-contracts/=node_modules/sp1-contracts/"],"optimizer":{"enabled":true,"runs":10000},"metadata":{"bytecodeHash":"none"},"compilationTarget":{"contracts/light-clients/sp1-ics07/SP1ICS07Tendermint.sol":"SP1ICS07Tendermint"},"evmVersion":"cancun","libraries":{},"viaIR":true},"sources":{"contracts/interfaces/ILightClient.sol":{"keccak256":"0x1caae9e4f741a86c0056d5f7713a35f3bd96db7a9fd52fc9f1cf79aad76a442f","urls":["bzz-raw://4a536db3b926560f69547c17e4f451a2631ddea0f42bd224c7fd8382d74429f6","dweb:/ipfs/QmcQ33kxcmmowXgMbQGTBgiKBjF7v8UiP4y73bB9hhDizC"],"license":"MIT"},"contracts/light-clients/sp1-ics07/SP1ICS07Tendermint.sol":{"keccak256":"0x2e03f0f1e058e7184ea70dc2a423a3d32a609620b6a1e8b764ec9c287b0b6187","urls":["bzz-raw://9e3c0b2f3b3af9cfc8a3ab085e0decffcd40230a27530142293f0b79a4aefe51","dweb:/ipfs/Qmf3qEAMWdiGAMEXSae6mzZ7Sncsbr4QzDC4JzMeiNwgei"],"license":"MIT"},"contracts/light-clients/sp1-ics07/errors/ISP1ICS07TendermintErrors.sol":{"keccak256":"0xe1a0526f9913308f761af480ef7d87091d6038659b9058f89c50083d49768db1","urls":["bzz-raw://a31d6d4a059182b3dfd3e99595d82a134963c448c9152ef35b42c62ccca87635","dweb:/ipfs/QmfQ2Cfa4kxWem3f88o9UnFQgL8oRU6vKkDFWSGmLsVLqN"],"license":"MIT"},"contracts/light-clients/sp1-ics07/interfaces/ISP1ICS07Tendermint.sol":{"keccak256":"0x0f00aea96b194d1a9db14f708f0de1fe7723fedc7b72bb8ea182e768ffc0a731","urls":["bzz-raw://3111a76ebabf4b57917e93669892df895a54a93a4963e384d8c13a1c47877b44","dweb:/ipfs/QmPCZ7Z4dJpowkzMhizUAW1j8QdJLD3DDjMbYq8G5VeXc1"],"license":"MIT"},"contracts/light-clients/sp1-ics07/msgs/IICS07TendermintMsgs.sol":{"keccak256":"0xae0ae6ff2742192ebaaee297c7d7473a1e1b4dc73393d45a944b0b7a8a647703","urls":["bzz-raw://43b2f6492a1f727416bbcf55876d9c08ac1f66f4724efc75b935c5022555be20","dweb:/ipfs/QmfTaPFNSFuUEsEBgJjnF2Jr2knayS7YwatfjP7dgdcAyH"],"license":"UNLICENSED"},"contracts/light-clients/sp1-ics07/msgs/IMembershipMsgs.sol":{"keccak256":"0x9dff6833fddbc11caf27387c9f8cba5dca9d1e430c9643d4e4a2e8eb09924d96","urls":["bzz-raw://efa6cfc654510dfcef6f4286e3e66446082bcd5671662ae6e1c6fd0f893a5a4a","dweb:/ipfs/QmRWAg1kHvmRtXgDm4ajVC7tEWQnzTWmHeHMYQJfyFuDGq"],"license":"UNLICENSED"},"contracts/light-clients/sp1-ics07/msgs/IMisbehaviourMsgs.sol":{"keccak256":"0x165b37d890b06eccd47558bf1efd6495e18541627758736a1f5b9c33d0333832","urls":["bzz-raw://15ab15cd5439147abed697bc9644b0175754845608bf3d57c81c2c864d31ce46","dweb:/ipfs/QmYcV88YsM1sZCmhP8LKUFHq3hJ6bsvd66W5axBnsBBoUM"],"license":"UNLICENSED"},"contracts/light-clients/sp1-ics07/msgs/ISP1Msgs.sol":{"keccak256":"0x8ede29b02182df4be9c075b3b48083277e5dd93bb3e7ce1eecfea9728db49aed","urls":["bzz-raw://48edb4bbcd440454fffceb4f85b83c08c3973a212239d7da07c079634fe413dd","dweb:/ipfs/Qmf7ma1nXWghfZKrJJvLpPuY5aN2xZZjHY7kWP3KVFCoDJ"],"license":"MIT"},"contracts/light-clients/sp1-ics07/msgs/IUcAndMembershipMsgs.sol":{"keccak256":"0xef3619c79de37cabe95d9d8af9d145fc2ea2dd55137407fb4b0082b0491170d0","urls":["bzz-raw://93646d813cdacf5e38e609e54baa67c60d749f0f111d00cd18b003c3cb328204","dweb:/ipfs/QmVcuwPujbiZ644a4jRw2V1LZxhhGsm2HKMXweVqndwUnZ"],"license":"UNLICENSED"},"contracts/light-clients/sp1-ics07/msgs/IUpdateClientMsgs.sol":{"keccak256":"0x370cdfca1c65f1898c7da80507e66972a6fe51a5d5c4e7aeabdd7060ce875aed","urls":["bzz-raw://ff34288a142b6f40d6843818b9ec0a542db016bc0d4a7be582eb2e255655c43e","dweb:/ipfs/QmXwbJHDbqZdw3JTT48Le1ZWGqmKAG7omf2ePvDfBHomzj"],"license":"UNLICENSED"},"contracts/light-clients/sp1-ics07/utils/Paths.sol":{"keccak256":"0x0e4eec6cd6cd0ef684383946419a2bf53c8f800033acfc298db81688e5aa178b","urls":["bzz-raw://824b58c13ff96b6ee38b5d25435fcc1305c45735f52df6347dba3dacdc144ffa","dweb:/ipfs/QmT7qomKM46ChfVVwfBQHwjpoHW9vrG9nXkGXsPeZRLJ7w"],"license":"MIT"},"contracts/msgs/IICS02ClientMsgs.sol":{"keccak256":"0xb5fdb25319d5c32b3f527982d45ec1e9bec5215515581aee034d853006ea01a0","urls":["bzz-raw://6b8939bf552c62c952a491008bcd9b59ab7dda20a9482bf93438e05793881542","dweb:/ipfs/QmfWmzNCp8bd4pP26Lfw5HHp4dSZnCDqZDjVN7SD8P7eDh"],"license":"MIT"},"contracts/msgs/ILightClientMsgs.sol":{"keccak256":"0xa0565e7748b8b3284d72e1aa6ef4cc8264fcaa5f4e0761d22d64686953db6378","urls":["bzz-raw://c4476010d7090bfaa74127526f2051c6bc82ff42a09b936e848880a1f15a6065","dweb:/ipfs/QmY87JgRsFQXSZdGXNjNHEJCkdTHzFXH4vZEJ3q7MnHuP8"],"license":"MIT"},"node_modules/@openzeppelin/contracts/access/AccessControl.sol":{"keccak256":"0x1a6b4f6b7798ab80929d491b89d5427a9b3338c0fd1acd0ba325f69c6f1646af","urls":["bzz-raw://7bb7f346c12a14dc622bc105ce3c47202fbc89f4b153a28a63bb68193297330c","dweb:/ipfs/QmagwF8P3bUBXwdo159ueEnY9dLSvEWwK24kk2op58egwG"],"license":"MIT"},"node_modules/@openzeppelin/contracts/access/IAccessControl.sol":{"keccak256":"0xbff9f59c84e5337689161ce7641c0ef8e872d6a7536fbc1f5133f128887aba3c","urls":["bzz-raw://b308f882e796f7b79c9502deacb0a62983035c6f6f4e962b319ba6a1f4a77d3d","dweb:/ipfs/QmaWCW7ahEQqFjwhSUhV7Ae7WhfNvzSpE7DQ58hvEooqPL"],"license":"MIT"},"node_modules/@openzeppelin/contracts/utils/Address.sol":{"keccak256":"0x6d0ae6e206645341fd122d278c2cb643dea260c190531f2f3f6a0426e77b00c0","urls":["bzz-raw://032d1201d839435be2c85b72e33206b3ea980c569d6ebf7fa57d811ab580a82f","dweb:/ipfs/QmeqQjAtMvdZT2tG7zm39itcRJkuwu8AEReK6WRnLJ18DD"],"license":"MIT"},"node_modules/@openzeppelin/contracts/utils/Context.sol":{"keccak256":"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2","urls":["bzz-raw://6a708e8a5bdb1011c2c381c9a5cfd8a9a956d7d0a9dc1bd8bcdaf52f76ef2f12","dweb:/ipfs/Qmax9WHBnVsZP46ZxEMNRQpLQnrdE4dK8LehML1Py8FowF"],"license":"MIT"},"node_modules/@openzeppelin/contracts/utils/Errors.sol":{"keccak256":"0x6afa713bfd42cf0f7656efa91201007ac465e42049d7de1d50753a373648c123","urls":["bzz-raw://ba1d02f4847670a1b83dec9f7d37f0b0418d6043447b69f3a29a5f9efc547fcf","dweb:/ipfs/QmQ7iH2keLNUKgq2xSWcRmuBE5eZ3F5whYAkAGzCNNoEWB"],"license":"MIT"},"node_modules/@openzeppelin/contracts/utils/Multicall.sol":{"keccak256":"0xa4c645387f16eae227cd378108e8e0a8acbcf2b600e393629bbd8422241c495f","urls":["bzz-raw://5e272440acfbec7f51afdb60a42597837b267de83ba7bd08d7e4dbc40171567c","dweb:/ipfs/QmPYzRwXpjUJEGRBWaSnzHz8gym1AKJ8yfoCgbo7gcwmEf"],"license":"MIT"},"node_modules/@openzeppelin/contracts/utils/TransientSlot.sol":{"keccak256":"0xac673fa1e374d9e6107504af363333e3e5f6344d2e83faf57d9bfd41d77cc946","urls":["bzz-raw://5982478dbbb218e9dd5a6e83f5c0e8d1654ddf20178484b43ef21dd2246809de","dweb:/ipfs/QmaB1hS68n2kG8vTbt7EPEzmrGhkUbfiFyykGGLsAr9X22"],"license":"MIT"},"node_modules/@openzeppelin/contracts/utils/introspection/ERC165.sol":{"keccak256":"0x2d9dc2fe26180f74c11c13663647d38e259e45f95eb88f57b61d2160b0109d3e","urls":["bzz-raw://81233d1f98060113d9922180bb0f14f8335856fe9f339134b09335e9f678c377","dweb:/ipfs/QmWh6R35SarhAn4z2wH8SU456jJSYL2FgucfTFgbHJJN4E"],"license":"MIT"},"node_modules/@openzeppelin/contracts/utils/introspection/IERC165.sol":{"keccak256":"0x8891738ffe910f0cf2da09566928589bf5d63f4524dd734fd9cedbac3274dd5c","urls":["bzz-raw://971f954442df5c2ef5b5ebf1eb245d7105d9fbacc7386ee5c796df1d45b21617","dweb:/ipfs/QmadRjHbkicwqwwh61raUEapaVEtaLMcYbQZWs9gUkgj3u"],"license":"MIT"},"node_modules/sp1-contracts/contracts/src/ISP1Verifier.sol":{"keccak256":"0x9e3ba64860bea920772dcf16be7946de2a2900d80bd51e9c0771184138f4f4d3","urls":["bzz-raw://0ec7230ca1fdd74edc6ab597d80bb345282aed3f0db4788ed96b4cc373ff46a3","dweb:/ipfs/QmXPuSS5gzxMhFKWr1gsxBVu6WHh53ZZEvWkGgzrkM6Y7Q"],"license":"MIT"}},"version":1},"id":45} \ No newline at end of file +{"abi":[{"type":"constructor","inputs":[{"name":"updateClientProgramVkey","type":"bytes32","internalType":"bytes32"},{"name":"membershipProgramVkey","type":"bytes32","internalType":"bytes32"},{"name":"updateClientAndMembershipProgramVkey","type":"bytes32","internalType":"bytes32"},{"name":"misbehaviourProgramVkey","type":"bytes32","internalType":"bytes32"},{"name":"sp1Verifier","type":"address","internalType":"address"},{"name":"_clientState","type":"bytes","internalType":"bytes"},{"name":"_consensusState","type":"bytes32","internalType":"bytes32"},{"name":"roleManager","type":"address","internalType":"address"}],"stateMutability":"nonpayable"},{"type":"function","name":"ALLOWED_SP1_CLOCK_DRIFT","inputs":[],"outputs":[{"name":"","type":"uint16","internalType":"uint16"}],"stateMutability":"view"},{"type":"function","name":"DEFAULT_ADMIN_ROLE","inputs":[],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"type":"function","name":"MEMBERSHIP_PROGRAM_VKEY","inputs":[],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"type":"function","name":"MISBEHAVIOUR_PROGRAM_VKEY","inputs":[],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"type":"function","name":"PROOF_SUBMITTER_ROLE","inputs":[],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"type":"function","name":"UPDATE_CLIENT_AND_MEMBERSHIP_PROGRAM_VKEY","inputs":[],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"type":"function","name":"UPDATE_CLIENT_PROGRAM_VKEY","inputs":[],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"type":"function","name":"VERIFIER","inputs":[],"outputs":[{"name":"","type":"address","internalType":"contract ISP1Verifier"}],"stateMutability":"view"},{"type":"function","name":"clientState","inputs":[],"outputs":[{"name":"chainId","type":"string","internalType":"string"},{"name":"trustLevel","type":"tuple","internalType":"struct IICS07TendermintMsgs.TrustThreshold","components":[{"name":"numerator","type":"uint8","internalType":"uint8"},{"name":"denominator","type":"uint8","internalType":"uint8"}]},{"name":"latestHeight","type":"tuple","internalType":"struct IICS02ClientMsgs.Height","components":[{"name":"revisionNumber","type":"uint64","internalType":"uint64"},{"name":"revisionHeight","type":"uint64","internalType":"uint64"}]},{"name":"trustingPeriod","type":"uint32","internalType":"uint32"},{"name":"unbondingPeriod","type":"uint32","internalType":"uint32"},{"name":"isFrozen","type":"bool","internalType":"bool"},{"name":"zkAlgorithm","type":"uint8","internalType":"enum IICS07TendermintMsgs.SupportedZkAlgorithm"}],"stateMutability":"view"},{"type":"function","name":"getClientState","inputs":[],"outputs":[{"name":"","type":"bytes","internalType":"bytes"}],"stateMutability":"view"},{"type":"function","name":"getConsensusStateHash","inputs":[{"name":"revisionHeight","type":"uint64","internalType":"uint64"}],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"type":"function","name":"getRoleAdmin","inputs":[{"name":"role","type":"bytes32","internalType":"bytes32"}],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"type":"function","name":"grantRole","inputs":[{"name":"role","type":"bytes32","internalType":"bytes32"},{"name":"account","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"hasRole","inputs":[{"name":"role","type":"bytes32","internalType":"bytes32"},{"name":"account","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"misbehaviour","inputs":[{"name":"misbehaviourMsg","type":"bytes","internalType":"bytes"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"multicall","inputs":[{"name":"data","type":"bytes[]","internalType":"bytes[]"}],"outputs":[{"name":"results","type":"bytes[]","internalType":"bytes[]"}],"stateMutability":"nonpayable"},{"type":"function","name":"renounceRole","inputs":[{"name":"role","type":"bytes32","internalType":"bytes32"},{"name":"callerConfirmation","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"revokeRole","inputs":[{"name":"role","type":"bytes32","internalType":"bytes32"},{"name":"account","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"supportsInterface","inputs":[{"name":"interfaceId","type":"bytes4","internalType":"bytes4"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"updateClient","inputs":[{"name":"updateMsg","type":"bytes","internalType":"bytes"}],"outputs":[{"name":"","type":"uint8","internalType":"enum ILightClientMsgs.UpdateResult"}],"stateMutability":"nonpayable"},{"type":"function","name":"verifyMembership","inputs":[{"name":"msg_","type":"tuple","internalType":"struct ILightClientMsgs.MsgVerifyMembership","components":[{"name":"proof","type":"bytes","internalType":"bytes"},{"name":"proofHeight","type":"tuple","internalType":"struct IICS02ClientMsgs.Height","components":[{"name":"revisionNumber","type":"uint64","internalType":"uint64"},{"name":"revisionHeight","type":"uint64","internalType":"uint64"}]},{"name":"path","type":"bytes[]","internalType":"bytes[]"},{"name":"value","type":"bytes","internalType":"bytes"}]}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"nonpayable"},{"type":"function","name":"verifyNonMembership","inputs":[{"name":"msg_","type":"tuple","internalType":"struct ILightClientMsgs.MsgVerifyNonMembership","components":[{"name":"proof","type":"bytes","internalType":"bytes"},{"name":"proofHeight","type":"tuple","internalType":"struct IICS02ClientMsgs.Height","components":[{"name":"revisionNumber","type":"uint64","internalType":"uint64"},{"name":"revisionHeight","type":"uint64","internalType":"uint64"}]},{"name":"path","type":"bytes[]","internalType":"bytes[]"}]}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"nonpayable"},{"type":"event","name":"RoleAdminChanged","inputs":[{"name":"role","type":"bytes32","indexed":true,"internalType":"bytes32"},{"name":"previousAdminRole","type":"bytes32","indexed":true,"internalType":"bytes32"},{"name":"newAdminRole","type":"bytes32","indexed":true,"internalType":"bytes32"}],"anonymous":false},{"type":"event","name":"RoleGranted","inputs":[{"name":"role","type":"bytes32","indexed":true,"internalType":"bytes32"},{"name":"account","type":"address","indexed":true,"internalType":"address"},{"name":"sender","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"type":"event","name":"RoleRevoked","inputs":[{"name":"role","type":"bytes32","indexed":true,"internalType":"bytes32"},{"name":"account","type":"address","indexed":true,"internalType":"address"},{"name":"sender","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"type":"error","name":"AccessControlBadConfirmation","inputs":[]},{"type":"error","name":"AccessControlUnauthorizedAccount","inputs":[{"name":"account","type":"address","internalType":"address"},{"name":"neededRole","type":"bytes32","internalType":"bytes32"}]},{"type":"error","name":"AddressEmptyCode","inputs":[{"name":"target","type":"address","internalType":"address"}]},{"type":"error","name":"CannotHandleMisbehavior","inputs":[]},{"type":"error","name":"ChainIdMismatch","inputs":[{"name":"expected","type":"string","internalType":"string"},{"name":"actual","type":"string","internalType":"string"}]},{"type":"error","name":"ClientStateMismatch","inputs":[{"name":"expected","type":"bytes","internalType":"bytes"},{"name":"actual","type":"bytes","internalType":"bytes"}]},{"type":"error","name":"ConsensusStateHashMismatch","inputs":[{"name":"expected","type":"bytes32","internalType":"bytes32"},{"name":"actual","type":"bytes32","internalType":"bytes32"}]},{"type":"error","name":"ConsensusStateNotFound","inputs":[]},{"type":"error","name":"ConsensusStateRootMismatch","inputs":[{"name":"expected","type":"bytes32","internalType":"bytes32"},{"name":"actual","type":"bytes32","internalType":"bytes32"}]},{"type":"error","name":"EmptyValue","inputs":[]},{"type":"error","name":"FailedCall","inputs":[]},{"type":"error","name":"FeatureNotSupported","inputs":[]},{"type":"error","name":"FrozenClientState","inputs":[]},{"type":"error","name":"InvalidMembershipProof","inputs":[]},{"type":"error","name":"KeyValuePairNotInCache","inputs":[{"name":"path","type":"bytes[]","internalType":"bytes[]"},{"name":"value","type":"bytes","internalType":"bytes"}]},{"type":"error","name":"LengthIsOutOfRange","inputs":[{"name":"length","type":"uint256","internalType":"uint256"},{"name":"min","type":"uint256","internalType":"uint256"},{"name":"max","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"MembershipProofKeyNotFound","inputs":[{"name":"path","type":"bytes[]","internalType":"bytes[]"}]},{"type":"error","name":"MembershipProofValueMismatch","inputs":[{"name":"expected","type":"bytes","internalType":"bytes"},{"name":"actual","type":"bytes","internalType":"bytes"}]},{"type":"error","name":"ProofHeightMismatch","inputs":[{"name":"expectedRevisionNumber","type":"uint64","internalType":"uint64"},{"name":"expectedRevisionHeight","type":"uint64","internalType":"uint64"},{"name":"actualRevisionNumber","type":"uint64","internalType":"uint64"},{"name":"actualRevisionHeight","type":"uint64","internalType":"uint64"}]},{"type":"error","name":"ProofIsInTheFuture","inputs":[{"name":"now","type":"uint256","internalType":"uint256"},{"name":"proofTimestamp","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"ProofIsTooOld","inputs":[{"name":"now","type":"uint256","internalType":"uint256"},{"name":"proofTimestamp","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"TrustThresholdMismatch","inputs":[{"name":"expectedNumerator","type":"uint256","internalType":"uint256"},{"name":"expectedDenominator","type":"uint256","internalType":"uint256"},{"name":"actualNumerator","type":"uint256","internalType":"uint256"},{"name":"actualDenominator","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"TrustingPeriodMismatch","inputs":[{"name":"expected","type":"uint256","internalType":"uint256"},{"name":"actual","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"TrustingPeriodTooLong","inputs":[{"name":"trustingPeriod","type":"uint256","internalType":"uint256"},{"name":"unbondingPeriod","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"UnbondingPeriodMismatch","inputs":[{"name":"expected","type":"uint256","internalType":"uint256"},{"name":"actual","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"UnknownMembershipProofType","inputs":[{"name":"proofType","type":"uint8","internalType":"uint8"}]},{"type":"error","name":"UnknownZkAlgorithm","inputs":[{"name":"algorithm","type":"uint8","internalType":"uint8"}]},{"type":"error","name":"VerificationKeyMismatch","inputs":[{"name":"expected","type":"bytes32","internalType":"bytes32"},{"name":"actual","type":"bytes32","internalType":"bytes32"}]}],"bytecode":{"object":"0x61012060405234610541576137268038038061001a81610564565b928339810161010082820312610541578151916020810151604082015160608301519061004960808501610589565b60a08501519095906001600160401b0381116105415785019080601f8301121561054157815161007b9260200161059d565b9261008d60e060c08701519601610589565b9660805260a05260c05260e05280518101906020820190602081840312610541576020810151906001600160401b038211610541570191829003601f1981019061012013610541576040519160e083016001600160401b0381118482101761052d5760405260208401516001600160401b038111610541576020908501019080601f830112156105415781516101259260200161059d565b825260408112610541576040610139610545565b916101458286016105dd565b8352610153606086016105dd565b602084015260208401928352603f19011261054157610170610545565b61017c608085016105eb565b815261018a60a085016105eb565b6020820152604083019081526101a260c085016105ff565b90606084019182526101b660e086016105ff565b92608085019384526101008601519586151587036105415760a0860196875261012001519460028610156105415760c08101958652518051906001600160401b03821161052d57600154600181811c91168015610523575b602082101461050f57601f81116104ac575b50602090601f831160011461043f5763ffffffff95949392915f9183610434575b50508160011b915f199060031b1c1916176001555b5160ff81511661ff00602060025493015160081b169161ffff191617176002555160018060401b0381511660035491602068010000000000000000600160801b0391015160401b169160018060801b031916171760035551169267ffffffff00000000600454925160201b169051151560401b92519160028310156104205769ff00000000000000000068ff00000000000000009360481b169469ff000000000000000000199160018060481b0319161716179116171760045560018060401b0360035460401c165f52600560205260405f205560018060a01b03166101005260045463ffffffff8116610708810163ffffffff811161040c5763ffffffff809360201c1692839116116103f757826001600160a01b0381166103de575061037c610706565b505b604051612efd908161078982396080518181816105570152611445015260a0518181816101f90152611e01015260c051818181610cb30152612185015260e0518181816102a00152610ac1015261010051818181610c780152611a1a0152f35b806103eb6103f192610610565b50610686565b5061037e565b6333fae18560e21b5f5260045260245260445ffd5b634e487b7160e01b5f52601160045260245ffd5b634e487b7160e01b5f52602160045260245ffd5b015190505f80610241565b90601f1983169160015f52815f20925f5b818110610494575091600193918563ffffffff99989796941061047c575b505050811b01600155610256565b01515f1960f88460031b161c191690555f808061046e565b92936020600181928786015181550195019301610450565b60015f527fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf6601f840160051c81019160208510610505575b601f0160051c01905b8181106104fa5750610220565b5f81556001016104ed565b90915081906104e4565b634e487b7160e01b5f52602260045260245ffd5b90607f169061020e565b634e487b7160e01b5f52604160045260245ffd5b5f80fd5b60408051919082016001600160401b0381118382101761052d57604052565b6040519190601f01601f191682016001600160401b0381118382101761052d57604052565b51906001600160a01b038216820361054157565b9192916001600160401b03821161052d576105c1601f8301601f1916602001610564565b938285528282011161054157815f926020928387015e84010152565b519060ff8216820361054157565b51906001600160401b038216820361054157565b519063ffffffff8216820361054157565b6001600160a01b0381165f9081525f5160206137065f395f51905f52602052604090205460ff16610681576001600160a01b03165f8181525f5160206137065f395f51905f5260205260408120805460ff191660011790553391905f5160206136865f395f51905f528180a4600190565b505f90565b6001600160a01b0381165f9081525f5160206136a65f395f51905f52602052604090205460ff16610681576001600160a01b03165f8181525f5160206136a65f395f51905f5260205260408120805460ff191660011790553391905f5160206136e65f395f51905f52905f5160206136865f395f51905f529080a4600190565b5f80525f5160206136a65f395f51905f526020525f5160206136c65f395f51905f525460ff16610784575f8080525f5160206136a65f395f51905f526020525f5160206136c65f395f51905f52805460ff1916600117905533905f5160206136e65f395f51905f525f5160206136865f395f51905f528280a4600190565b5f9056fe6080806040526004361015610012575f80fd5b5f3560e01c90816301ffc9a714610cd6575080630225293e14610c9c57806308c84e7014610c4c5780630bece35614610b8957806323842fb814610b59578063248a9ca314610b2f5780632c3ee47414610b135780632f2ff15d14610ae4578063314d4dff14610aaa57806336568abe14610a4e5780634d6d9ffb1461096c5780635972185a14610932578063682ed5f01461080e57806391d14854146107c5578063a217fddf146107ab578063ac9650d81461066a578063bd3ce6b01461057a578063ca7242f914610540578063d547741f1461050a578063ddba65371461021c578063e45a6d0d146101e25763ef913a4b1461010e575f80fd5b346101de575f6003193601126101de576101da60405160208082015261012060408201526101c6816101436101608201610ec6565b60ff600254818116606085015260081c16608083015267ffffffffffffffff60035481811660a085015260401c1660c083015260ff60045463ffffffff811660e085015263ffffffff8160201c16610100850152818160401c16151561012085015260481c166101b28161105f565b61014083015203601f19810183528261103c565b604051918291602083526020830190610df8565b0390f35b5f80fd5b346101de575f6003193601126101de5760206040517f00000000000000000000000000000000000000000000000000000000000000008152f35b346101de5761022a36610d74565b6004549160ff8360401c166104e2575f80527f4c48d1d2b0f4f7485fc28e3db22341d96a20aa29e6efa8149da9751603abd4e06020527f6e0c24a6e293ff9b755263dbaa15ba3796b0b8d3fe17cfb4ddf8143b268eac4754610298929060ff16156104d5575b8101906110d9565b6102c78151517f0000000000000000000000000000000000000000000000000000000000000000808214611189565b6020815101518051810160208101916020818303126101de57602081015167ffffffffffffffff81116101de57019061018090829003126101de576040519061030f82610fcc565b602081015167ffffffffffffffff81116101de57839082016020019061033491611260565b825261034260408201611348565b60208301908152906103578460608301611219565b604084019081529161036c8560a08401611219565b60608501908152946103818160e08501611365565b9260808601938452610140019061039791611365565b9360a081019485525190516fffffffffffffffffffffffffffffffff166103bd916126e8565b516040805182516fffffffffffffffffffffffffffffffff16602080830191825284015182840152919092015160608084019190915282529061040160808261103c565b51902090516020015167ffffffffffffffff1661041d90611649565b61042a919081811461187c565b516040805182516fffffffffffffffffffffffffffffffff16602080830191825284015182840152919092015160608084019190915282529061046e60808261103c565b51902090516020015167ffffffffffffffff1661048a90611649565b610497919081811461187c565b516104a190611a03565b7fffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffff1668010000000000000000176004555f80f35b6104dd61178e565b610290565b7f928b1233000000000000000000000000000000000000000000000000000000005f5260045ffd5b346101de5761053e61051b36610dc5565b90610539610534825f525f602052600160405f20015490565b611816565b611ba5565b005b346101de575f6003193601126101de5760206040517f00000000000000000000000000000000000000000000000000000000000000008152f35b346101de575f6003193601126101de576040516105a18161059a81610ec6565b038261103c565b6101206040516105b081610f83565b60025460ff8116825260ff602083019160081c16815260ff6040516105d481610f83565b67ffffffffffffffff600354818116835281602084019160401c168152816004549385808660481c1697816106146040519d8d8f9e8f9081520190610df8565b9a511660208c0152511660408a0152511660608801525116608086015263ffffffff811660a086015263ffffffff8160201c1660c086015260401c16151560e08401526106608161105f565b6101008301520390f35b346101de5760206003193601126101de5760043567ffffffffffffffff81116101de57366023820112156101de57806004013567ffffffffffffffff81116101de57602482013660248360051b850101116101de5760405160206106ce818361103c565b5f825280820192601f1982013685376106e685611735565b956106f4604051978861103c565b858752601f1961070387611735565b01835f5b82811061079b575050505f5b868110156107885760019061076c61076661073660248460051b87010187611690565b9190888b846040519586948486013783018281015f81528d519283915e01015f815203601f19810183528261103c565b30612621565b610776828b61174d565b52610781818a61174d565b5001610713565b604051848152806101da8187018b610e1d565b606082828c010152018490610707565b346101de575f6003193601126101de5760206040515f8152f35b346101de576107d336610dc5565b905f525f60205273ffffffffffffffffffffffffffffffffffffffff60405f2091165f52602052602060ff60405f2054166040519015158152f35b346101de5760206003193601126101de5760043567ffffffffffffffff81116101de578060040160a060031983360301126101de5760ff60045460401c166104e2575f80527f4c48d1d2b0f4f7485fc28e3db22341d96a20aa29e6efa8149da9751603abd4e06020527f6e0c24a6e293ff9b755263dbaa15ba3796b0b8d3fe17cfb4ddf8143b268eac475460ff1615610925575b60848201916108b18383611690565b9050156108fd57602092826108c9816108f595611690565b60246108ed6108e66108de60648901876116e1565b979096611690565b3691611085565b950191611cee565b604051908152f35b7f1208b21b000000000000000000000000000000000000000000000000000000005f5260045ffd5b61092d61178e565b6108a2565b346101de575f6003193601126101de5760206040517fbd893629a699470e4ec82a5715bb4981fdaacc5d0a728bf5f55b801d8f4ef10b8152f35b346101de5760206003193601126101de5760043567ffffffffffffffff81116101de5780600401608060031983360301126101de5760ff60045460401c166104e2575f80527f4c48d1d2b0f4f7485fc28e3db22341d96a20aa29e6efa8149da9751603abd4e060209081527f6e0c24a6e293ff9b755263dbaa15ba3796b0b8d3fe17cfb4ddf8143b268eac475490926108f592909160ff1615610a41575b610a24610a178280611690565b91909260648501906116e1565b929091602460405195610a37898861103c565b5f87520191611cee565b610a4961178e565b610a0a565b346101de57610a5c36610dc5565b3373ffffffffffffffffffffffffffffffffffffffff821603610a825761053e91611ba5565b7f6697b232000000000000000000000000000000000000000000000000000000005f5260045ffd5b346101de575f6003193601126101de5760206040517f00000000000000000000000000000000000000000000000000000000000000008152f35b346101de5761053e610af536610dc5565b90610b0e610534825f525f602052600160405f20015490565b611ad3565b346101de575f6003193601126101de5760206040516107088152f35b346101de5760206003193601126101de5760206108f56004355f525f602052600160405f20015490565b346101de5760206003193601126101de5760043567ffffffffffffffff811681036101de576108f5602091611649565b346101de57610b9736610d74565b60ff60045460401c166104e2575f80527f4c48d1d2b0f4f7485fc28e3db22341d96a20aa29e6efa8149da9751603abd4e06020527f6e0c24a6e293ff9b755263dbaa15ba3796b0b8d3fe17cfb4ddf8143b268eac4754610bff929060ff1615610c3f57611431565b6040516003821015610c12576020918152f35b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b610c4761178e565b611431565b346101de575f6003193601126101de57602060405173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b346101de575f6003193601126101de5760206040517f00000000000000000000000000000000000000000000000000000000000000008152f35b346101de5760206003193601126101de57600435907fffffffff0000000000000000000000000000000000000000000000000000000082168092036101de57817f7965db0b0000000000000000000000000000000000000000000000000000000060209314908115610d4a575b5015158152f35b7f01ffc9a70000000000000000000000000000000000000000000000000000000091501483610d43565b9060206003198301126101de5760043567ffffffffffffffff81116101de57826023820112156101de5780600401359267ffffffffffffffff84116101de57602484830101116101de576024019190565b60031960409101126101de576004359060243573ffffffffffffffffffffffffffffffffffffffff811681036101de5790565b90601f19601f602080948051918291828752018686015e5f8582860101520116010190565b9080602083519182815201916020808360051b8301019401925f915b838310610e4857505050505090565b9091929394602080610e6683601f1986600196030187528951610df8565b97019301930191939290610e39565b90600182811c92168015610ebc575b6020831014610e8f57565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b91607f1691610e84565b6001545f9291610ed582610e75565b8082529160018116908115610f495750600114610ef0575050565b60015f9081529293509091907fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf65b838310610f2f575060209250010190565b600181602092949394548385870101520191019190610f1e565b60209495507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0091509291921683830152151560051b010190565b6040810190811067ffffffffffffffff821117610f9f57604052565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b60c0810190811067ffffffffffffffff821117610f9f57604052565b6020810190811067ffffffffffffffff821117610f9f57604052565b6060810190811067ffffffffffffffff821117610f9f57604052565b60e0810190811067ffffffffffffffff821117610f9f57604052565b90601f601f19910116810190811067ffffffffffffffff821117610f9f57604052565b60021115610c1257565b67ffffffffffffffff8111610f9f57601f01601f191660200190565b92919261109182611069565b9161109f604051938461103c565b8294818452818301116101de578281602093845f960137010152565b9080601f830112156101de578160206110d693359101611085565b90565b6020818303126101de5780359067ffffffffffffffff82116101de5701906020828203126101de576040519161110e83610fe8565b80359067ffffffffffffffff82116101de57016060818303126101de576040519161113883611004565b81358352602082013567ffffffffffffffff81116101de578161115c9184016110bb565b6020840152604082013567ffffffffffffffff81116101de5761117f92016110bb565b6040820152815290565b15611192575050565b7fd56bdc26000000000000000000000000000000000000000000000000000000005f5260045260245260445ffd5b9291926111cc82611069565b916111da604051938461103c565b8294818452818301116101de578281602093845f96015e010152565b519060ff821682036101de57565b519067ffffffffffffffff821682036101de57565b91908260409103126101de5760405161123181610f83565b602061124a81839561124281611204565b855201611204565b910152565b519063ffffffff821682036101de57565b91908281039261012084126101de576040519161127c83611020565b8294825167ffffffffffffffff81116101de57830182601f820112156101de576040916112b284836020601f19955191016111c0565b865201126101de576112f7906040516112ca81610f83565b6112d6602085016111f6565b81526112e4604085016111f6565b6020820152602085015260608301611219565b604083015261130860a0820161124f565b606083015261131960c0820161124f565b608083015260e08101519081151582036101de576101009160a084015201519060028210156101de5760c00152565b51906fffffffffffffffffffffffffffffffff821682036101de57565b91908260609103126101de5760405161137d81611004565b604080829461138b81611348565b8452602081015160208501520151910152565b9190610180838203126101de57604051906113b882610fcc565b819380519167ffffffffffffffff83116101de57610140826113e18360a09661124a9601611260565b86526113f08360208301611365565b60208701526114028360808301611365565b604087015261141360e08201611348565b6060870152611426836101008301611219565b608087015201611219565b61143d918101906110d9565b61146c8151517f0000000000000000000000000000000000000000000000000000000000000000808214611189565b60208151015180518101906020818303126101de5760208101519167ffffffffffffffff83116101de576114a792602080920192010161139e565b906114b1826118b3565b6114ba82611946565b916003831015610c1257826115ec57908167ffffffffffffffff6020604060a06110d6960193845184848201511685600354851c168111611564575b505001516040516115498161153b858201948591909160408060608301946fffffffffffffffffffffffffffffffff8151168452602081015160208501520151910152565b03601f19810183528261103c565b51902092510151165f52600560205260405f20555b51611a03565b6115a3866115e593511667ffffffffffffffff167fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000006003541617600355565b7fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff6fffffffffffffffff00000000000000006003549260401b16911617600355565b5f806114f6565b5060018203611631576110d690680100000000000000007fffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffff600454161760045561155e565b60028214611642576110d69061155e565b5050600290565b67ffffffffffffffff165f52600560205260405f205480156116685790565b7f5b48b457000000000000000000000000000000000000000000000000000000005f5260045ffd5b9035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1813603018212156101de570180359067ffffffffffffffff82116101de576020019181360383136101de57565b9035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1813603018212156101de570180359067ffffffffffffffff82116101de57602001918160051b360383136101de57565b67ffffffffffffffff8111610f9f5760051b60200190565b80518210156117615760209160051b010190565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b335f9081527f4c48d1d2b0f4f7485fc28e3db22341d96a20aa29e6efa8149da9751603abd4e0602052604090205460ff16156117c657565b7fe2517d3f000000000000000000000000000000000000000000000000000000005f52336004527fbd893629a699470e4ec82a5715bb4981fdaacc5d0a728bf5f55b801d8f4ef10b60245260445ffd5b805f525f60205260405f2073ffffffffffffffffffffffffffffffffffffffff33165f5260205260ff60405f2054161561184d5750565b7fe2517d3f000000000000000000000000000000000000000000000000000000005f523360045260245260445ffd5b15611885575050565b7f6d23e8a3000000000000000000000000000000000000000000000000000000005f5260045260245260445ffd5b611944906118d981516fffffffffffffffffffffffffffffffff606084015116906126e8565b61193c67ffffffffffffffff602060808185015160405161192e8161153b868201948591909160408060608301946fffffffffffffffffffffffffffffffff8151168452602081015160208501520151910152565b519020940151015116611649565b80821461187c565b565b67ffffffffffffffff602060a08301510151165f52600560205260405f205480155f146119735750505f90565b604082019081516040516119bc8161153b60208201948591909160408060608301946fffffffffffffffffffffffffffffffff8151168452602081015160208501520151910152565b51902014918215926119da575b5050156119d557600190565b600290565b6fffffffffffffffffffffffffffffffff91925060208291015151169151511611155f806119c9565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169080516040602083015192015192803b156101de575f92611a9b92611aad604051968795869485947f41493c600000000000000000000000000000000000000000000000000000000086526004860152606060248601526064850190610df8565b90600319848303016044850152610df8565b03915afa8015611ac857611abe5750565b5f6119449161103c565b6040513d5f823e3d90fd5b805f525f60205260405f2073ffffffffffffffffffffffffffffffffffffffff83165f5260205260ff60405f205416155f14611b9f57805f525f60205260405f2073ffffffffffffffffffffffffffffffffffffffff83165f5260205260405f2060017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0082541617905573ffffffffffffffffffffffffffffffffffffffff339216907f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d5f80a4600190565b50505f90565b805f525f60205260405f2073ffffffffffffffffffffffffffffffffffffffff83165f5260205260ff60405f2054165f14611b9f57805f525f60205260405f2073ffffffffffffffffffffffffffffffffffffffff83165f5260205260405f207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00815416905573ffffffffffffffffffffffffffffffffffffffff339216907ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b5f80a4600190565b3567ffffffffffffffff811681036101de5790565b929190611c8e81611735565b93611c9c604051958661103c565b602085838152019160051b8101918383116101de5781905b838210611cc2575050505050565b813567ffffffffffffffff81116101de57602091611ce387849387016110bb565b815201910190611cb4565b9094929193948015612568578101906020818303126101de5780359067ffffffffffffffff82116101de57016040818303126101de5760405191611d3183610f83565b813560028110156101de578352602082013567ffffffffffffffff81116101de57611d5c92016110bb565b90602081019182528051611d6f8161105f565b611d788161105f565b611fe5575051908151820160208101926020818303126101de57602081015167ffffffffffffffff81116101de570190608090829003126101de5760405192611dc084610f83565b602082015167ffffffffffffffff81116101de5782611de9836020604094611df1970101612a5a565b865201611365565b9460208301958652611e288351517f0000000000000000000000000000000000000000000000000000000000000000808214611189565b6020835101519182518301926020818503126101de5760208101519067ffffffffffffffff82116101de5701926040848203126101de5760405193611e6c85610f83565b6020810151855260408101519167ffffffffffffffff83116101de57611e99926020809201920101612ac0565b94611eb360208501968088525180151580611fd957612c0d565b5f805b87518051831015611fa657611ece83611ee19261174d565b5151611edb368888611c82565b90612da9565b15611f9c57508694611f40611f55956fffffffffffffffffffffffffffffffff9a9895611f3961155e966020633b9aca009f9d8198611f20915161174d565b51015190815181518082149182611f88575b5050612c4b565b6001612c99565b51950194611f4d86611c6d565b875191612e1b565b516001815111611f69575b50505151160490565b611f75611f8192611c6d565b90848451511691612eab565b5f80611f60565b909150898401209089830120145f80611f32565b9060010190611eb6565b5061155e92506020915094611f40611f55956fffffffffffffffffffffffffffffffff9a9895633b9aca009c9a98612c99565b5061ffff811115612c0d565b94906001869593949551611ff88161105f565b6120018161105f565b146120485760ff86516120138161105f565b61201c8161105f565b7fd3a2e6c9000000000000000000000000000000000000000000000000000000005f521660045260245ffd5b90919293945051926060602060405161206081610f83565b60405161206c81610fcc565b60405161207881611020565b84815260405161208781610f83565b5f81525f858201528482015260405161209f81610f83565b5f81525f8582015260408201525f858201525f60808201525f60a08201525f60c082015281526120cd612a22565b838201526120d9612a22565b60408201525f848201526040516120ef81610f83565b5f81525f84820152608082015260405161210881610f83565b5f81525f8482015260a08201528152015283518401936020818603126101de5760208101519067ffffffffffffffff82116101de5701936020858203126101de576040519461215686610fe8565b60208101519067ffffffffffffffff82116101de57602061217f92816121ac9501920101612a5a565b808652517f0000000000000000000000000000000000000000000000000000000000000000808214611189565b602084510151948551860160208101966020818303126101de57602081015167ffffffffffffffff81116101de570190604090829003126101de57604051966121f488610f83565b602082015167ffffffffffffffff81116101de578160206122179285010161139e565b885260408201519167ffffffffffffffff83116101de5761223b9201602001612ac0565b9361225560208801958087525180151580611fd957612c0d565b602081019561226387611c6d565b67ffffffffffffffff60a08a5101519181602084015116918291161480612549575b61228e85611c6d565b9267ffffffffffffffff6122a18c611c6d565b91511691156124fb57505050506122bc9061155e89516118b3565b6122c68751611946565b6003811015610c1257806124ca57506122de86611c6d565b67ffffffffffffffff8060035460401c16911611612477575b506040865101516040516123408161153b60208201948591909160408060608301946fffffffffffffffffffffffffffffffff8151168452602081015160208501520151910152565b51902067ffffffffffffffff61235587611c6d565b165f52600560205260405f20555b5f805b8551805183101561244c57611ece8361237e9261174d565b156124425750633b9aca0096936fffffffffffffffffffffffffffffffff9693611f39879460206123b56123cd9660409b5161174d565b5101519081518151808214918261242c575050612c4b565b6123f48351858101519067ffffffffffffffff602060a08185015193015101511690612e1b565b51600181511161240a575b505051015151160490565b61241661242592611c6d565b90858585510151511691612eab565b5f806123ff565b9091506020840120906020830120145f80611f32565b9060010190612366565b5060409592506123cd9150936fffffffffffffffffffffffffffffffff9693633b9aca009895612c99565b6124836124b891611c6d565b67ffffffffffffffff167fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000006003541617600355565b6124c46115a386611c6d565b5f6122f7565b6001915003612363577f59bc8fd3000000000000000000000000000000000000000000000000000000005f5260045ffd5b6084945067ffffffffffffffff9081604051957fb8d8167e00000000000000000000000000000000000000000000000000000000875216600486015216602484015260448301526064820152fd5b5061255384611c6d565b67ffffffffffffffff80845116911614612285565b5050909161257b60206125909201611c6d565b916040519461258986610f83565b3691611c82565b8352602083019182526040516125af8161153b86602083019586612954565b5190205c9151905182156125c9575050633b9aca00900490565b9061261d61260b926040519384937ff06fc33b000000000000000000000000000000000000000000000000000000008552604060048601526044850190610e1d565b90600319848303016024850152610df8565b0390fd5b905f8091602081519101845af480806126d5575b156126555750506040513d81523d5f602083013e60203d82010160405290565b1561269c5773ffffffffffffffffffffffffffffffffffffffff907f9996b315000000000000000000000000000000000000000000000000000000005f521660045260245ffd5b3d156126ad576040513d5f823e3d90fd5b7fd6bda275000000000000000000000000000000000000000000000000000000005f5260045ffd5b503d1515806126355750813b1515612635565b906fffffffffffffffffffffffffffffffff633b9aca00911604428111612925578042034281116128f857610708106128c9575080515161272a600154610e75565b14806128a2575b815190156128625750602081015160ff815116906002549160ff8316928382149283612849575b6020015160ff169215612801575050505063ffffffff606082015116906004549163ffffffff83168082036127d357505063ffffffff608081920151169160201c168082036127a5575050565b7f1eb5c1eb000000000000000000000000000000000000000000000000000000005f5260045260245260445ffd5b7f73b1bde3000000000000000000000000000000000000000000000000000000005f5260045260245260445ffd5b6084945060ff90604051947fd382033a000000000000000000000000000000000000000000000000000000008652600486015260081c16602484015260448301526064820152fd5b6020810151600883901c60ff9081169116149350612758565b61261d906040519182917ff6b6676b0000000000000000000000000000000000000000000000000000000083526040600484015261260b60448401610ec6565b508051602081519101206040516128bc8161059a81610ec6565b6020815191012014612731565b7f12e74add000000000000000000000000000000000000000000000000000000005f524260045260245260445ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b7f20daedb6000000000000000000000000000000000000000000000000000000005f524260045260245260445ffd5b9067ffffffffffffffff90939293168152604060208201526080810190835191604080830152825180915260a0820190602060a08260051b8501019401915f905b8282106129d9575050505060206110d6939401519060607fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc082850301910152610df8565b90919294602080612a14837fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6089600196030186528951610df8565b970192019201909291612995565b60405190612a2f82611004565b5f6040838281528260208201520152565b9080601f830112156101de5781516110d6926020016111c0565b91906060838203126101de5760405190612a7382611004565b819380518352602081015167ffffffffffffffff81116101de5782612a99918301612a40565b602084015260408101519167ffffffffffffffff83116101de5760409261124a9201612a40565b9080601f830112156101de57815191612ad883611735565b92612ae6604051948561103c565b80845260208085019160051b830101918383116101de5760208101915b838310612b1257505050505090565b825167ffffffffffffffff81116101de578201906040601f1983880301126101de5760405190612b4182610f83565b602083015167ffffffffffffffff81116101de5760209084010187601f820112156101de578051612b7181611735565b91612b7f604051938461103c565b81835260208084019260051b820101918a83116101de5760208201905b838210612bdf5750505050825260408301519167ffffffffffffffff83116101de57612bd088602080969581960101612a40565b83820152815201920191612b03565b815167ffffffffffffffff81116101de57602091612c028e848094880101612a40565b815201910190612b9c565b15612c155750565b7fb0369c31000000000000000000000000000000000000000000000000000000005f52600452600160245261ffff60445260645ffd5b91909115612c57575050565b9061261d61260b926040519384937f5f1ca381000000000000000000000000000000000000000000000000000000008552604060048601526044850190610df8565b91909115612ca5575050565b604051907ffef760c700000000000000000000000000000000000000000000000000000000825280602483016020600485015252604482019260448260051b84010191815f907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1813603015b838310612d1e5786860387fd5b90919293947fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbc8782030188528535828112156101de578301906020823592019167ffffffffffffffff81116101de5780360383136101de57602082601f19601f8480600198869897879852868601375f85828601015201160101970198019301919096939296612d11565b908151815103611b9f575f5b8251811015612e1357612dc8818461174d565b5151612dd4828461174d565b515103612e0c57612de5818461174d565b5160208151910120612df7828461174d565b516020815191012003612e0c57600101612db5565b5050505f90565b505050600190565b91612e7060209261193c60405185810190612e678161153b888591909160408060608301946fffffffffffffffffffffffffffffffff8151168452602081015160208501520151910152565b51902091611649565b0151808203612e7d575050565b7f4b2dfe98000000000000000000000000000000000000000000000000000000005f5260045260245260445ffd5b929190925f5b8451811015612ee9578083612ec86001938861174d565b51604051612edf8161153b60208201948986612954565b5190205d01612eb1565b505050905056fea164736f6c634300081c000a2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d4c48d1d2b0f4f7485fc28e3db22341d96a20aa29e6efa8149da9751603abd4e06e0c24a6e293ff9b755263dbaa15ba3796b0b8d3fe17cfb4ddf8143b268eac47bd893629a699470e4ec82a5715bb4981fdaacc5d0a728bf5f55b801d8f4ef10bad3228b676f7d3cd4284a5443f17f1962b36e491b30a40b2405849e597ba5fb5","sourceMap":"1362:25496:46:-:0;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;-1:-1:-1;;;;;1362:25496:46;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;:::i;:::-;3781:52;1362:25496;3781:52;1362:25496;3843:47;1362:25496;3900:80;1362:25496;3990:51;1362:25496;;4066:60;;;1362:25496;4066:60;;1362:25496;;;;;;;;;4066:60;;1362:25496;;-1:-1:-1;;;;;1362:25496:46;;;;;;;;;-1:-1:-1;;1362:25496:46;;;;-1:-1:-1;1362:25496:46;;;;;;;;-1:-1:-1;;;;;1362:25496:46;;;;;;;;;;;;;;-1:-1:-1;;;;;1362:25496:46;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;1362:25496:46;;;;;;;;;;;;;;;;-1:-1:-1;1362:25496:46;;;;;;;;;;;-1:-1:-1;1362:25496:46;;;;;;;;;;;;;;;;-1:-1:-1;;1362:25496:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1362:25496:46;4136:21;1362:25496;;;-1:-1:-1;1362:25496:46;;;;;;;;;4227:36;1362:25496;;;;;2479:10;;;1362:25496;2479:10;;;;1362:25496;2479:10;;1362:25496;2479:10;1362:25496;;;;;4295:83;2479:10;;1362:25496;-1:-1:-1;;;;;1362:25496:46;;;;4536:44;;;:::i;:::-;;4491:351;1362:25496;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4491:351;4644:43;;4743:45;4644:43;;:::i;:::-;;4743:45;:::i;:::-;;4491:351;;2479:10;;;;-1:-1:-1;2479:10:46;1362:25496;2479:10;;;;-1:-1:-1;2479:10:46;;1362:25496;;;-1:-1:-1;2479:10:46;;1362:25496;2479:10;;-1:-1:-1;2479:10:46;1362:25496;;;;-1:-1:-1;1362:25496:46;;;;;-1:-1:-1;1362:25496:46;;;;;-1:-1:-1;1362:25496:46;;;;;;;;;;;;-1:-1:-1;1362:25496:46;;-1:-1:-1;1362:25496:46;;-1:-1:-1;1362:25496:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1362:25496:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1362:25496:46;;;;;;;;;-1:-1:-1;1362:25496:46;;;;;;;;-1:-1:-1;1362:25496:46;;;;;-1:-1:-1;1362:25496:46;;;;;;;;;;;;-1:-1:-1;1362:25496:46;;;;;-1:-1:-1;1362:25496:46;;-1:-1:-1;1362:25496:46;;;;;;;;;;-1:-1:-1;;;;;1362:25496:46;;;;;;;;;;:::o;:::-;;;;;;;-1:-1:-1;;1362:25496:46;;;-1:-1:-1;;;;;1362:25496:46;;;;;;;;;;:::o;:::-;;;-1:-1:-1;;;;;1362:25496:46;;;;;;:::o;:::-;;;;-1:-1:-1;;;;;1362:25496:46;;;;;;;;-1:-1:-1;;1362:25496:46;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;:::o;:::-;;;-1:-1:-1;;;;;1362:25496:46;;;;;;:::o;:::-;;;;;;;;;;:::o;6145:316:93:-;-1:-1:-1;;;;;1362:25496:46;;;;;;-1:-1:-1;;;;;;;;;;;1362:25496:46;;;;;;;;;;-1:-1:-1;;;;;1362:25496:46;;;;;-1:-1:-1;;;;;;;;;;;1362:25496:46;;;;;;;-1:-1:-1;;1362:25496:46;;;;;735:10:121;;1362:25496:46;-1:-1:-1;;;;;;;;;;;1362:25496:46;;6336:40:93;6313:4;6390:11;:::o;6238:217::-;6432:12;1362:25496:46;6432:12:93;:::o;6145:316::-;-1:-1:-1;;;;;1362:25496:46;;;;;;-1:-1:-1;;;;;;;;;;;1362:25496:46;;;;;;;;;;-1:-1:-1;;;;;1362:25496:46;;;;;-1:-1:-1;;;;;;;;;;;1362:25496:46;;;;;;;-1:-1:-1;;1362:25496:46;;;;;735:10:121;;1362:25496:46;-1:-1:-1;;;;;;;;;;;2583:33:46;-1:-1:-1;;;;;;;;;;;6336:40:93;1362:25496:46;6336:40:93;6313:4;6390:11;:::o;6145:316::-;1362:25496:46;;;-1:-1:-1;;;;;;;;;;;1362:25496:46;;-1:-1:-1;;;;;;;;;;;1362:25496:46;;;;;;;;;-1:-1:-1;;;;;;;;;;;1362:25496:46;;-1:-1:-1;;;;;;;;;;;1362:25496:46;;-1:-1:-1;;1362:25496:46;6313:4:93;1362:25496:46;;;735:10:121;;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;1362:25496:46;;6336:40:93;6313:4;6390:11;:::o;6238:217::-;1362:25496:46;6432:12:93;:::o","linkReferences":{}},"deployedBytecode":{"object":"0x6080806040526004361015610012575f80fd5b5f3560e01c90816301ffc9a714610cd6575080630225293e14610c9c57806308c84e7014610c4c5780630bece35614610b8957806323842fb814610b59578063248a9ca314610b2f5780632c3ee47414610b135780632f2ff15d14610ae4578063314d4dff14610aaa57806336568abe14610a4e5780634d6d9ffb1461096c5780635972185a14610932578063682ed5f01461080e57806391d14854146107c5578063a217fddf146107ab578063ac9650d81461066a578063bd3ce6b01461057a578063ca7242f914610540578063d547741f1461050a578063ddba65371461021c578063e45a6d0d146101e25763ef913a4b1461010e575f80fd5b346101de575f6003193601126101de576101da60405160208082015261012060408201526101c6816101436101608201610ec6565b60ff600254818116606085015260081c16608083015267ffffffffffffffff60035481811660a085015260401c1660c083015260ff60045463ffffffff811660e085015263ffffffff8160201c16610100850152818160401c16151561012085015260481c166101b28161105f565b61014083015203601f19810183528261103c565b604051918291602083526020830190610df8565b0390f35b5f80fd5b346101de575f6003193601126101de5760206040517f00000000000000000000000000000000000000000000000000000000000000008152f35b346101de5761022a36610d74565b6004549160ff8360401c166104e2575f80527f4c48d1d2b0f4f7485fc28e3db22341d96a20aa29e6efa8149da9751603abd4e06020527f6e0c24a6e293ff9b755263dbaa15ba3796b0b8d3fe17cfb4ddf8143b268eac4754610298929060ff16156104d5575b8101906110d9565b6102c78151517f0000000000000000000000000000000000000000000000000000000000000000808214611189565b6020815101518051810160208101916020818303126101de57602081015167ffffffffffffffff81116101de57019061018090829003126101de576040519061030f82610fcc565b602081015167ffffffffffffffff81116101de57839082016020019061033491611260565b825261034260408201611348565b60208301908152906103578460608301611219565b604084019081529161036c8560a08401611219565b60608501908152946103818160e08501611365565b9260808601938452610140019061039791611365565b9360a081019485525190516fffffffffffffffffffffffffffffffff166103bd916126e8565b516040805182516fffffffffffffffffffffffffffffffff16602080830191825284015182840152919092015160608084019190915282529061040160808261103c565b51902090516020015167ffffffffffffffff1661041d90611649565b61042a919081811461187c565b516040805182516fffffffffffffffffffffffffffffffff16602080830191825284015182840152919092015160608084019190915282529061046e60808261103c565b51902090516020015167ffffffffffffffff1661048a90611649565b610497919081811461187c565b516104a190611a03565b7fffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffff1668010000000000000000176004555f80f35b6104dd61178e565b610290565b7f928b1233000000000000000000000000000000000000000000000000000000005f5260045ffd5b346101de5761053e61051b36610dc5565b90610539610534825f525f602052600160405f20015490565b611816565b611ba5565b005b346101de575f6003193601126101de5760206040517f00000000000000000000000000000000000000000000000000000000000000008152f35b346101de575f6003193601126101de576040516105a18161059a81610ec6565b038261103c565b6101206040516105b081610f83565b60025460ff8116825260ff602083019160081c16815260ff6040516105d481610f83565b67ffffffffffffffff600354818116835281602084019160401c168152816004549385808660481c1697816106146040519d8d8f9e8f9081520190610df8565b9a511660208c0152511660408a0152511660608801525116608086015263ffffffff811660a086015263ffffffff8160201c1660c086015260401c16151560e08401526106608161105f565b6101008301520390f35b346101de5760206003193601126101de5760043567ffffffffffffffff81116101de57366023820112156101de57806004013567ffffffffffffffff81116101de57602482013660248360051b850101116101de5760405160206106ce818361103c565b5f825280820192601f1982013685376106e685611735565b956106f4604051978861103c565b858752601f1961070387611735565b01835f5b82811061079b575050505f5b868110156107885760019061076c61076661073660248460051b87010187611690565b9190888b846040519586948486013783018281015f81528d519283915e01015f815203601f19810183528261103c565b30612621565b610776828b61174d565b52610781818a61174d565b5001610713565b604051848152806101da8187018b610e1d565b606082828c010152018490610707565b346101de575f6003193601126101de5760206040515f8152f35b346101de576107d336610dc5565b905f525f60205273ffffffffffffffffffffffffffffffffffffffff60405f2091165f52602052602060ff60405f2054166040519015158152f35b346101de5760206003193601126101de5760043567ffffffffffffffff81116101de578060040160a060031983360301126101de5760ff60045460401c166104e2575f80527f4c48d1d2b0f4f7485fc28e3db22341d96a20aa29e6efa8149da9751603abd4e06020527f6e0c24a6e293ff9b755263dbaa15ba3796b0b8d3fe17cfb4ddf8143b268eac475460ff1615610925575b60848201916108b18383611690565b9050156108fd57602092826108c9816108f595611690565b60246108ed6108e66108de60648901876116e1565b979096611690565b3691611085565b950191611cee565b604051908152f35b7f1208b21b000000000000000000000000000000000000000000000000000000005f5260045ffd5b61092d61178e565b6108a2565b346101de575f6003193601126101de5760206040517fbd893629a699470e4ec82a5715bb4981fdaacc5d0a728bf5f55b801d8f4ef10b8152f35b346101de5760206003193601126101de5760043567ffffffffffffffff81116101de5780600401608060031983360301126101de5760ff60045460401c166104e2575f80527f4c48d1d2b0f4f7485fc28e3db22341d96a20aa29e6efa8149da9751603abd4e060209081527f6e0c24a6e293ff9b755263dbaa15ba3796b0b8d3fe17cfb4ddf8143b268eac475490926108f592909160ff1615610a41575b610a24610a178280611690565b91909260648501906116e1565b929091602460405195610a37898861103c565b5f87520191611cee565b610a4961178e565b610a0a565b346101de57610a5c36610dc5565b3373ffffffffffffffffffffffffffffffffffffffff821603610a825761053e91611ba5565b7f6697b232000000000000000000000000000000000000000000000000000000005f5260045ffd5b346101de575f6003193601126101de5760206040517f00000000000000000000000000000000000000000000000000000000000000008152f35b346101de5761053e610af536610dc5565b90610b0e610534825f525f602052600160405f20015490565b611ad3565b346101de575f6003193601126101de5760206040516107088152f35b346101de5760206003193601126101de5760206108f56004355f525f602052600160405f20015490565b346101de5760206003193601126101de5760043567ffffffffffffffff811681036101de576108f5602091611649565b346101de57610b9736610d74565b60ff60045460401c166104e2575f80527f4c48d1d2b0f4f7485fc28e3db22341d96a20aa29e6efa8149da9751603abd4e06020527f6e0c24a6e293ff9b755263dbaa15ba3796b0b8d3fe17cfb4ddf8143b268eac4754610bff929060ff1615610c3f57611431565b6040516003821015610c12576020918152f35b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b610c4761178e565b611431565b346101de575f6003193601126101de57602060405173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b346101de575f6003193601126101de5760206040517f00000000000000000000000000000000000000000000000000000000000000008152f35b346101de5760206003193601126101de57600435907fffffffff0000000000000000000000000000000000000000000000000000000082168092036101de57817f7965db0b0000000000000000000000000000000000000000000000000000000060209314908115610d4a575b5015158152f35b7f01ffc9a70000000000000000000000000000000000000000000000000000000091501483610d43565b9060206003198301126101de5760043567ffffffffffffffff81116101de57826023820112156101de5780600401359267ffffffffffffffff84116101de57602484830101116101de576024019190565b60031960409101126101de576004359060243573ffffffffffffffffffffffffffffffffffffffff811681036101de5790565b90601f19601f602080948051918291828752018686015e5f8582860101520116010190565b9080602083519182815201916020808360051b8301019401925f915b838310610e4857505050505090565b9091929394602080610e6683601f1986600196030187528951610df8565b97019301930191939290610e39565b90600182811c92168015610ebc575b6020831014610e8f57565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b91607f1691610e84565b6001545f9291610ed582610e75565b8082529160018116908115610f495750600114610ef0575050565b60015f9081529293509091907fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf65b838310610f2f575060209250010190565b600181602092949394548385870101520191019190610f1e565b60209495507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0091509291921683830152151560051b010190565b6040810190811067ffffffffffffffff821117610f9f57604052565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b60c0810190811067ffffffffffffffff821117610f9f57604052565b6020810190811067ffffffffffffffff821117610f9f57604052565b6060810190811067ffffffffffffffff821117610f9f57604052565b60e0810190811067ffffffffffffffff821117610f9f57604052565b90601f601f19910116810190811067ffffffffffffffff821117610f9f57604052565b60021115610c1257565b67ffffffffffffffff8111610f9f57601f01601f191660200190565b92919261109182611069565b9161109f604051938461103c565b8294818452818301116101de578281602093845f960137010152565b9080601f830112156101de578160206110d693359101611085565b90565b6020818303126101de5780359067ffffffffffffffff82116101de5701906020828203126101de576040519161110e83610fe8565b80359067ffffffffffffffff82116101de57016060818303126101de576040519161113883611004565b81358352602082013567ffffffffffffffff81116101de578161115c9184016110bb565b6020840152604082013567ffffffffffffffff81116101de5761117f92016110bb565b6040820152815290565b15611192575050565b7fd56bdc26000000000000000000000000000000000000000000000000000000005f5260045260245260445ffd5b9291926111cc82611069565b916111da604051938461103c565b8294818452818301116101de578281602093845f96015e010152565b519060ff821682036101de57565b519067ffffffffffffffff821682036101de57565b91908260409103126101de5760405161123181610f83565b602061124a81839561124281611204565b855201611204565b910152565b519063ffffffff821682036101de57565b91908281039261012084126101de576040519161127c83611020565b8294825167ffffffffffffffff81116101de57830182601f820112156101de576040916112b284836020601f19955191016111c0565b865201126101de576112f7906040516112ca81610f83565b6112d6602085016111f6565b81526112e4604085016111f6565b6020820152602085015260608301611219565b604083015261130860a0820161124f565b606083015261131960c0820161124f565b608083015260e08101519081151582036101de576101009160a084015201519060028210156101de5760c00152565b51906fffffffffffffffffffffffffffffffff821682036101de57565b91908260609103126101de5760405161137d81611004565b604080829461138b81611348565b8452602081015160208501520151910152565b9190610180838203126101de57604051906113b882610fcc565b819380519167ffffffffffffffff83116101de57610140826113e18360a09661124a9601611260565b86526113f08360208301611365565b60208701526114028360808301611365565b604087015261141360e08201611348565b6060870152611426836101008301611219565b608087015201611219565b61143d918101906110d9565b61146c8151517f0000000000000000000000000000000000000000000000000000000000000000808214611189565b60208151015180518101906020818303126101de5760208101519167ffffffffffffffff83116101de576114a792602080920192010161139e565b906114b1826118b3565b6114ba82611946565b916003831015610c1257826115ec57908167ffffffffffffffff6020604060a06110d6960193845184848201511685600354851c168111611564575b505001516040516115498161153b858201948591909160408060608301946fffffffffffffffffffffffffffffffff8151168452602081015160208501520151910152565b03601f19810183528261103c565b51902092510151165f52600560205260405f20555b51611a03565b6115a3866115e593511667ffffffffffffffff167fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000006003541617600355565b7fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff6fffffffffffffffff00000000000000006003549260401b16911617600355565b5f806114f6565b5060018203611631576110d690680100000000000000007fffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffff600454161760045561155e565b60028214611642576110d69061155e565b5050600290565b67ffffffffffffffff165f52600560205260405f205480156116685790565b7f5b48b457000000000000000000000000000000000000000000000000000000005f5260045ffd5b9035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1813603018212156101de570180359067ffffffffffffffff82116101de576020019181360383136101de57565b9035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1813603018212156101de570180359067ffffffffffffffff82116101de57602001918160051b360383136101de57565b67ffffffffffffffff8111610f9f5760051b60200190565b80518210156117615760209160051b010190565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b335f9081527f4c48d1d2b0f4f7485fc28e3db22341d96a20aa29e6efa8149da9751603abd4e0602052604090205460ff16156117c657565b7fe2517d3f000000000000000000000000000000000000000000000000000000005f52336004527fbd893629a699470e4ec82a5715bb4981fdaacc5d0a728bf5f55b801d8f4ef10b60245260445ffd5b805f525f60205260405f2073ffffffffffffffffffffffffffffffffffffffff33165f5260205260ff60405f2054161561184d5750565b7fe2517d3f000000000000000000000000000000000000000000000000000000005f523360045260245260445ffd5b15611885575050565b7f6d23e8a3000000000000000000000000000000000000000000000000000000005f5260045260245260445ffd5b611944906118d981516fffffffffffffffffffffffffffffffff606084015116906126e8565b61193c67ffffffffffffffff602060808185015160405161192e8161153b868201948591909160408060608301946fffffffffffffffffffffffffffffffff8151168452602081015160208501520151910152565b519020940151015116611649565b80821461187c565b565b67ffffffffffffffff602060a08301510151165f52600560205260405f205480155f146119735750505f90565b604082019081516040516119bc8161153b60208201948591909160408060608301946fffffffffffffffffffffffffffffffff8151168452602081015160208501520151910152565b51902014918215926119da575b5050156119d557600190565b600290565b6fffffffffffffffffffffffffffffffff91925060208291015151169151511611155f806119c9565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169080516040602083015192015192803b156101de575f92611a9b92611aad604051968795869485947f41493c600000000000000000000000000000000000000000000000000000000086526004860152606060248601526064850190610df8565b90600319848303016044850152610df8565b03915afa8015611ac857611abe5750565b5f6119449161103c565b6040513d5f823e3d90fd5b805f525f60205260405f2073ffffffffffffffffffffffffffffffffffffffff83165f5260205260ff60405f205416155f14611b9f57805f525f60205260405f2073ffffffffffffffffffffffffffffffffffffffff83165f5260205260405f2060017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0082541617905573ffffffffffffffffffffffffffffffffffffffff339216907f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d5f80a4600190565b50505f90565b805f525f60205260405f2073ffffffffffffffffffffffffffffffffffffffff83165f5260205260ff60405f2054165f14611b9f57805f525f60205260405f2073ffffffffffffffffffffffffffffffffffffffff83165f5260205260405f207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00815416905573ffffffffffffffffffffffffffffffffffffffff339216907ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b5f80a4600190565b3567ffffffffffffffff811681036101de5790565b929190611c8e81611735565b93611c9c604051958661103c565b602085838152019160051b8101918383116101de5781905b838210611cc2575050505050565b813567ffffffffffffffff81116101de57602091611ce387849387016110bb565b815201910190611cb4565b9094929193948015612568578101906020818303126101de5780359067ffffffffffffffff82116101de57016040818303126101de5760405191611d3183610f83565b813560028110156101de578352602082013567ffffffffffffffff81116101de57611d5c92016110bb565b90602081019182528051611d6f8161105f565b611d788161105f565b611fe5575051908151820160208101926020818303126101de57602081015167ffffffffffffffff81116101de570190608090829003126101de5760405192611dc084610f83565b602082015167ffffffffffffffff81116101de5782611de9836020604094611df1970101612a5a565b865201611365565b9460208301958652611e288351517f0000000000000000000000000000000000000000000000000000000000000000808214611189565b6020835101519182518301926020818503126101de5760208101519067ffffffffffffffff82116101de5701926040848203126101de5760405193611e6c85610f83565b6020810151855260408101519167ffffffffffffffff83116101de57611e99926020809201920101612ac0565b94611eb360208501968088525180151580611fd957612c0d565b5f805b87518051831015611fa657611ece83611ee19261174d565b5151611edb368888611c82565b90612da9565b15611f9c57508694611f40611f55956fffffffffffffffffffffffffffffffff9a9895611f3961155e966020633b9aca009f9d8198611f20915161174d565b51015190815181518082149182611f88575b5050612c4b565b6001612c99565b51950194611f4d86611c6d565b875191612e1b565b516001815111611f69575b50505151160490565b611f75611f8192611c6d565b90848451511691612eab565b5f80611f60565b909150898401209089830120145f80611f32565b9060010190611eb6565b5061155e92506020915094611f40611f55956fffffffffffffffffffffffffffffffff9a9895633b9aca009c9a98612c99565b5061ffff811115612c0d565b94906001869593949551611ff88161105f565b6120018161105f565b146120485760ff86516120138161105f565b61201c8161105f565b7fd3a2e6c9000000000000000000000000000000000000000000000000000000005f521660045260245ffd5b90919293945051926060602060405161206081610f83565b60405161206c81610fcc565b60405161207881611020565b84815260405161208781610f83565b5f81525f858201528482015260405161209f81610f83565b5f81525f8582015260408201525f858201525f60808201525f60a08201525f60c082015281526120cd612a22565b838201526120d9612a22565b60408201525f848201526040516120ef81610f83565b5f81525f84820152608082015260405161210881610f83565b5f81525f8482015260a08201528152015283518401936020818603126101de5760208101519067ffffffffffffffff82116101de5701936020858203126101de576040519461215686610fe8565b60208101519067ffffffffffffffff82116101de57602061217f92816121ac9501920101612a5a565b808652517f0000000000000000000000000000000000000000000000000000000000000000808214611189565b602084510151948551860160208101966020818303126101de57602081015167ffffffffffffffff81116101de570190604090829003126101de57604051966121f488610f83565b602082015167ffffffffffffffff81116101de578160206122179285010161139e565b885260408201519167ffffffffffffffff83116101de5761223b9201602001612ac0565b9361225560208801958087525180151580611fd957612c0d565b602081019561226387611c6d565b67ffffffffffffffff60a08a5101519181602084015116918291161480612549575b61228e85611c6d565b9267ffffffffffffffff6122a18c611c6d565b91511691156124fb57505050506122bc9061155e89516118b3565b6122c68751611946565b6003811015610c1257806124ca57506122de86611c6d565b67ffffffffffffffff8060035460401c16911611612477575b506040865101516040516123408161153b60208201948591909160408060608301946fffffffffffffffffffffffffffffffff8151168452602081015160208501520151910152565b51902067ffffffffffffffff61235587611c6d565b165f52600560205260405f20555b5f805b8551805183101561244c57611ece8361237e9261174d565b156124425750633b9aca0096936fffffffffffffffffffffffffffffffff9693611f39879460206123b56123cd9660409b5161174d565b5101519081518151808214918261242c575050612c4b565b6123f48351858101519067ffffffffffffffff602060a08185015193015101511690612e1b565b51600181511161240a575b505051015151160490565b61241661242592611c6d565b90858585510151511691612eab565b5f806123ff565b9091506020840120906020830120145f80611f32565b9060010190612366565b5060409592506123cd9150936fffffffffffffffffffffffffffffffff9693633b9aca009895612c99565b6124836124b891611c6d565b67ffffffffffffffff167fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000006003541617600355565b6124c46115a386611c6d565b5f6122f7565b6001915003612363577f59bc8fd3000000000000000000000000000000000000000000000000000000005f5260045ffd5b6084945067ffffffffffffffff9081604051957fb8d8167e00000000000000000000000000000000000000000000000000000000875216600486015216602484015260448301526064820152fd5b5061255384611c6d565b67ffffffffffffffff80845116911614612285565b5050909161257b60206125909201611c6d565b916040519461258986610f83565b3691611c82565b8352602083019182526040516125af8161153b86602083019586612954565b5190205c9151905182156125c9575050633b9aca00900490565b9061261d61260b926040519384937ff06fc33b000000000000000000000000000000000000000000000000000000008552604060048601526044850190610e1d565b90600319848303016024850152610df8565b0390fd5b905f8091602081519101845af480806126d5575b156126555750506040513d81523d5f602083013e60203d82010160405290565b1561269c5773ffffffffffffffffffffffffffffffffffffffff907f9996b315000000000000000000000000000000000000000000000000000000005f521660045260245ffd5b3d156126ad576040513d5f823e3d90fd5b7fd6bda275000000000000000000000000000000000000000000000000000000005f5260045ffd5b503d1515806126355750813b1515612635565b906fffffffffffffffffffffffffffffffff633b9aca00911604428111612925578042034281116128f857610708106128c9575080515161272a600154610e75565b14806128a2575b815190156128625750602081015160ff815116906002549160ff8316928382149283612849575b6020015160ff169215612801575050505063ffffffff606082015116906004549163ffffffff83168082036127d357505063ffffffff608081920151169160201c168082036127a5575050565b7f1eb5c1eb000000000000000000000000000000000000000000000000000000005f5260045260245260445ffd5b7f73b1bde3000000000000000000000000000000000000000000000000000000005f5260045260245260445ffd5b6084945060ff90604051947fd382033a000000000000000000000000000000000000000000000000000000008652600486015260081c16602484015260448301526064820152fd5b6020810151600883901c60ff9081169116149350612758565b61261d906040519182917ff6b6676b0000000000000000000000000000000000000000000000000000000083526040600484015261260b60448401610ec6565b508051602081519101206040516128bc8161059a81610ec6565b6020815191012014612731565b7f12e74add000000000000000000000000000000000000000000000000000000005f524260045260245260445ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b7f20daedb6000000000000000000000000000000000000000000000000000000005f524260045260245260445ffd5b9067ffffffffffffffff90939293168152604060208201526080810190835191604080830152825180915260a0820190602060a08260051b8501019401915f905b8282106129d9575050505060206110d6939401519060607fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc082850301910152610df8565b90919294602080612a14837fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6089600196030186528951610df8565b970192019201909291612995565b60405190612a2f82611004565b5f6040838281528260208201520152565b9080601f830112156101de5781516110d6926020016111c0565b91906060838203126101de5760405190612a7382611004565b819380518352602081015167ffffffffffffffff81116101de5782612a99918301612a40565b602084015260408101519167ffffffffffffffff83116101de5760409261124a9201612a40565b9080601f830112156101de57815191612ad883611735565b92612ae6604051948561103c565b80845260208085019160051b830101918383116101de5760208101915b838310612b1257505050505090565b825167ffffffffffffffff81116101de578201906040601f1983880301126101de5760405190612b4182610f83565b602083015167ffffffffffffffff81116101de5760209084010187601f820112156101de578051612b7181611735565b91612b7f604051938461103c565b81835260208084019260051b820101918a83116101de5760208201905b838210612bdf5750505050825260408301519167ffffffffffffffff83116101de57612bd088602080969581960101612a40565b83820152815201920191612b03565b815167ffffffffffffffff81116101de57602091612c028e848094880101612a40565b815201910190612b9c565b15612c155750565b7fb0369c31000000000000000000000000000000000000000000000000000000005f52600452600160245261ffff60445260645ffd5b91909115612c57575050565b9061261d61260b926040519384937f5f1ca381000000000000000000000000000000000000000000000000000000008552604060048601526044850190610df8565b91909115612ca5575050565b604051907ffef760c700000000000000000000000000000000000000000000000000000000825280602483016020600485015252604482019260448260051b84010191815f907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1813603015b838310612d1e5786860387fd5b90919293947fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbc8782030188528535828112156101de578301906020823592019167ffffffffffffffff81116101de5780360383136101de57602082601f19601f8480600198869897879852868601375f85828601015201160101970198019301919096939296612d11565b908151815103611b9f575f5b8251811015612e1357612dc8818461174d565b5151612dd4828461174d565b515103612e0c57612de5818461174d565b5160208151910120612df7828461174d565b516020815191012003612e0c57600101612db5565b5050505f90565b505050600190565b91612e7060209261193c60405185810190612e678161153b888591909160408060608301946fffffffffffffffffffffffffffffffff8151168452602081015160208501520151910152565b51902091611649565b0151808203612e7d575050565b7f4b2dfe98000000000000000000000000000000000000000000000000000000005f5260045260245260445ffd5b929190925f5b8451811015612ee9578083612ec86001938861174d565b51604051612edf8161153b60208201948986612954565b5190205d01612eb1565b505050905056fea164736f6c634300081c000a","sourceMap":"1362:25496:46:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;1362:25496:46;;;;;;;;4967:23;;;;1362:25496;;;;;;4967:23;1362:25496;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4967:23;1362:25496;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;4967:23;-1:-1:-1;;4967:23:46;;;;;;:::i;:::-;1362:25496;;;;;4967:23;1362:25496;;4967:23;1362:25496;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;1362:25496:46;;;;;;;;1655:48;1362:25496;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;9626:70;;1362:25496;;;26738:42;26734:105;;1362:25496;9626:70;;;;:::i;:::-;9706:196;9727:30;;1362:25496;9766:25;9727:64;;;9706:196;:::i;:::-;1362:25496;9989:30;;:43;;1362:25496;;9978:95;;1362:25496;9978:95;;1362:25496;;;;;;;;;9978:95;;1362:25496;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;;;;;;;;19053:18;1362:25496;;;;19073:11;;;:::i;:::-;19289:29;1362:25496;;;;;;;;19278:41;;;1362:25496;;;;;;;;;;;;;;;;;;;;;;;19278:41;;;;1362:25496;;19278:41;:::i;:::-;1362:25496;19268:52;;19388:21;;1362:25496;19388:36;1362:25496;;;19366:59;;;:::i;:::-;19435:179;;19456:54;;;;19435:179;:::i;:::-;19818:29;1362:25496;;;;;;;;19807:41;;;1362:25496;;;;;;;;;;;;;;;;;;;;;;;19807:41;;;;1362:25496;;19807:41;:::i;:::-;1362:25496;19797:52;;19917:21;;1362:25496;19917:36;1362:25496;;;19895:59;;;:::i;:::-;19964:179;;19985:54;;;;19964:179;:::i;:::-;10146:30;;;;:::i;:::-;1362:25496;;;;;;;;;26734:105;26807:20;;:::i;:::-;26734:105;;1362:25496;;;;;;;;;;;4713:26:93;1362:25496:46;;;:::i;:::-;4683:18:93;2475:4;4683:18;;3867:6;1362:25496:46;3867:6:93;1362:25496:46;;3867:22:93;1362:25496:46;3867:6:93;1362:25496:46;3867:22:93;1362:25496:46;3776:120:93;;4683:18;2475:4;:::i;:::-;4713:26;:::i;:::-;1362:25496:46;;;;;;-1:-1:-1;;1362:25496:46;;;;;;;;1558:51;1362:25496;;;;;;;;-1:-1:-1;;1362:25496:46;;;;;;;;;;;;:::i;:::-;;;;:::i;:::-;;;;;;;:::i;:::-;2102:51;1362:25496;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;2102:51;1362:25496;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;1362:25496:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;-1:-1:-1;;1362:25496:46;;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;-1:-1:-1;;1362:25496:46;;;:::i;:::-;;;;;;;;;;1526:13:125;;;1362:25496:46;1558:3:125;1541:15;;;;;;1347:26;1362:25496:46;1590:75:125;1362:25496:46;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;1362:25496:46;;;;;;:::i;:::-;1627:4:125;1590:75;:::i;:::-;1577:88;;;;:::i;:::-;;;;;;:::i;:::-;;1362:25496:46;1526:13:125;;1541:15;1362:25496:46;;;;;;;;;;1541:15:125;1362:25496:46;:::i;:::-;;;;;;;;;;;;;;;;;;-1:-1:-1;;1362:25496:46;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;2920:29:93;1362:25496:46;-1:-1:-1;1362:25496:46;;;;;;-1:-1:-1;1362:25496:46;;;;;;;;;;;;;;;;-1:-1:-1;;1362:25496:46;;;;;;;;;;;;;;;;-1:-1:-1;;1362:25496:46;;;;;;;;;;;;;;;;;;;;;;;;;26738:42;26734:105;;1362:25496;7195:10;;;;;;;;:::i;:::-;:21;;;1362:25496;;;7260:10;;;;7248:64;7260:10;;:::i;:::-;7272:16;1362:25496;7301:10;7290:9;;;;;;:::i;:::-;7301:10;;;;:::i;:::-;1362:25496;;;:::i;:::-;7272:16;;7248:64;;:::i;:::-;1362:25496;;;;;;;;;;;;;26734:105;26807:20;;:::i;:::-;26734:105;;1362:25496;;;;;-1:-1:-1;;1362:25496:46;;;;;;;;2583:33;1362:25496;;;;;;;;-1:-1:-1;;1362:25496:46;;;;;;;;;;;;;;;;-1:-1:-1;;1362:25496:46;;;;;;;;;;;;;;;;;;;;;;;;;;;7551:63;;1362:25496;;;;26738:42;26734:105;;1362:25496;7593:9;7563:10;;;;:::i;:::-;7593:9;;;;;;;;:::i;:::-;1362:25496;;;7575:16;1362:25496;;;;;;;:::i;:::-;;;;7575:16;7551:63;;:::i;26734:105::-;26807:20;;:::i;:::-;26734:105;;1362:25496;;;;;;;:::i;:::-;735:10:121;1362:25496:46;;;5387:34:93;5383:102;;5495:37;;;:::i;5383:102::-;5444:30;1362:25496:46;5444:30:93;1362:25496:46;;5444:30:93;1362:25496:46;;;;;-1:-1:-1;;1362:25496:46;;;;;;;;1861:50;1362:25496;;;;;;;4296:25:93;1362:25496:46;;;:::i;:::-;4266:18:93;2475:4;4266:18;;3867:6;1362:25496:46;3867:6:93;1362:25496:46;;3867:22:93;1362:25496:46;3867:6:93;1362:25496:46;3867:22:93;1362:25496:46;3776:120:93;;2475:4;4296:25;:::i;1362:25496:46:-;;;;;-1:-1:-1;;1362:25496:46;;;;;;;;2479:10;1362:25496;;;;;;;;-1:-1:-1;;1362:25496:46;;;;;;;;;3867:6:93;1362:25496:46;3867:6:93;1362:25496:46;;3867:22:93;1362:25496:46;3867:6:93;1362:25496:46;3867:22:93;1362:25496:46;3776:120:93;;1362:25496:46;;;;;-1:-1:-1;;1362:25496:46;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;5408:1560;;1362:25496;;;26738:42;26734:105;;5408:1560;:::i;:::-;1362:25496;;;;;;;;;;;;;;;;;;;;;;;26734:105;26807:20;;:::i;:::-;5408:1560;:::i;1362:25496::-;;;;;-1:-1:-1;;1362:25496:46;;;;;;;;;1957:38;1362:25496;;;;;;;;;-1:-1:-1;;1362:25496:46;;;;;;;;1749:66;1362:25496;;;;;;;;-1:-1:-1;;1362:25496:46;;;;;;;;;;;;;;;;2639:47:93;2654:32;1362:25496:46;2639:47:93;;:87;;;;;1362:25496:46;;;;;;;2639:87:93;844:25:133;829:40;;;2639:87:93;;;1362:25496:46;;;-1:-1:-1;;1362:25496:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;-1:-1:-1;;1362:25496:46;;;;;;;;;;;;;;;;;;;:::o;:::-;;-1:-1:-1;;1362:25496:46;;;;;;;;;;;;;;;;;-1:-1:-1;1362:25496:46;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1362:25496:46;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;-1:-1:-1;;1362:25496:46;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;2102:51;1362:25496;;;;;;;:::i;:::-;;;;;2102:51;1362:25496;;;2102:51;;;;1362:25496;;;;;;;:::o;:::-;2102:51;-1:-1:-1;1362:25496:46;;;;;-1:-1:-1;1362:25496:46;;-1:-1:-1;1362:25496:46;;;;;;;;;;;;;;:::o;:::-;2102:51;1362:25496;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;:::o;:::-;;-1:-1:-1;1362:25496:46;;;;;-1:-1:-1;1362:25496:46;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;:::o;:::-;;;-1:-1:-1;;1362:25496:46;;;;;;;;;;;;;;;;:::o;:::-;;-1:-1:-1;1362:25496:46;;;:::o;:::-;;;;;;;;-1:-1:-1;;1362:25496:46;;;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;-1:-1:-1;1362:25496:46;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;:::i;:::-;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;:::o;:::-;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;-1:-1:-1;1362:25496:46;;;;;;:::o;:::-;;;;;;;;;;:::o;:::-;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;:::i;:::-;;;;:::o;:::-;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;1362:25496:46;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;;;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;;;;;;;;:::i;:::-;;;;;;;:::i;5408:1560::-;5651:58;5408:1560;5651:58;;;;:::i;:::-;5719:186;5740:24;;1362:25496;5773:26;5740:59;;;5719:186;:::i;:::-;5992:37;:24;;:37;;1362:25496;;5981:89;;1362:25496;5992:37;1362:25496;;;;;;5992:37;5981:89;;1362:25496;;;;;;;;5981:89;5992:37;5981:89;;;1362:25496;;;;:::i;:::-;6115:6;;;;:::i;:::-;6178:26;;;:::i;:::-;1362:25496;;;;;;;6218:52;;;6351:16;;1362:25496;5992:37;1362:25496;6351:16;6906:24;6351:16;;;;;:31;;;;1362:25496;;;;;;;;6351:73;;6347:155;;6214:666;6593:24;;;;1362:25496;;6582:36;;;;;;;;1362:25496;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6582:36;;-1:-1:-1;;6582:36:46;;;;;;:::i;:::-;1362:25496;6572:47;;6537:16;;:31;1362:25496;;-1:-1:-1;1362:25496:46;6515:21;5992:37;1362:25496;;-1:-1:-1;1362:25496:46;;6214:666;6906:24;;:::i;6347:155::-;1362:25496;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6347:155;;;;6214:666;-1:-1:-1;1362:25496:46;6640:58;;1362:25496;;6906:24;1362:25496;;;6714:20;1362:25496;;;6714:20;1362:25496;6214:666;;6636:244;6778:34;6762:50;;6758:122;;6906:24;6636:244;6214:666;;6758:122;6828:41;;6778:34;6828:41;:::o;5043:228::-;1362:25496;;-1:-1:-1;1362:25496:46;5152:21;1362:25496;;;-1:-1:-1;1362:25496:46;;5207:9;;1362:25496;;5043:228;:::o;1362:25496::-;;-1:-1:-1;1362:25496:46;;-1:-1:-1;1362:25496:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;3165:103:93;735:10:121;2920:6:93;1362:25496:46;;;;;;;;;;;;3485:23:93;3481:108;;3165:103::o;3481:108::-;3531:47;2920:6;3531:47;735:10:121;3531:47:93;1362:25496:46;2583:33;1362:25496;;;2920:6:93;3531:47;3165:103;1362:25496:46;2920:6:93;1362:25496:46;2920:6:93;1362:25496:46;;;2920:6:93;1362:25496:46;;735:10:121;1362:25496:46;-1:-1:-1;1362:25496:46;;;;;-1:-1:-1;1362:25496:46;;;3485:23:93;3481:108;;3165:103;:::o;3481:108::-;3531:47;2920:6;3531:47;735:10:121;3531:47:93;1362:25496:46;;;;2920:6:93;3531:47;1362:25496:46;;;;;;:::o;:::-;;;;;;;;;;;18224:570;18612:175;18224:570;18390:11;18370:18;;1362:25496;18390:11;;;1362:25496;;18390:11;;:::i;:::-;18544:58;1362:25496;18469:28;18566:20;18469:28;;;;1362:25496;;18458:40;;;;;;;;1362:25496;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18458:40;1362:25496;18448:51;;18566:20;;;:35;1362:25496;;18544:58;:::i;:::-;18633:52;;;18612:175;:::i;:::-;18224:570::o;22969:1028::-;1362:25496;23191:31;:16;;;;:31;1362:25496;;;;23169:21;23191:31;1362:25496;;;;;23237:32;;23233:758;23237:32;;;23357:43;;1362:25496;23357:43;:::o;23233:758::-;1362:25496;23477:24;;;;;1362:25496;;23466:36;;;23191:31;23466:36;;;;1362:25496;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23466:36;1362:25496;23456:47;;23434:69;;;;:165;;;23233:758;-1:-1:-1;;23417:574:46;;;23775:42;23768:49;:::o;23417:574::-;23946:34;23939:41;:::o;23434:165::-;1362:25496;23523:28;;;23191:31;23523:28;;;;1362:25496;;23565:24;;1362:25496;;-1:-1:-1;23523:76:46;23434:165;;;;24158:152;1362:25496;24238:8;1362:25496;;;;24291:11;24271:18;;;;24291:11;;;24238:65;;;;;;-1:-1:-1;1362:25496:46;;;;24291:11;1362:25496;24238:65;;;;;;;1362:25496;24238:65;;;;;1362:25496;;;;;;;;;;;:::i;:::-;;-1:-1:-1;;1362:25496:46;;;;;;;;;:::i;:::-;24238:65;;;;;;;;;;24158:152;:::o;24238:65::-;-1:-1:-1;24238:65:46;;;:::i;:::-;24291:11;1362:25496;;-1:-1:-1;1362:25496:46;;;;;6145:316:93;1362:25496:46;;;;;;;;;;;;-1:-1:-1;1362:25496:46;;;;;-1:-1:-1;1362:25496:46;;;6242:23:93;6238:217;1362:25496:46;;;;;;;;;;;;;;;-1:-1:-1;1362:25496:46;;;;-1:-1:-1;1362:25496:46;6313:4:93;1362:25496:46;;;;;;;;735:10:121;1362:25496:46;;6336:40:93;;1362:25496:46;6336:40:93;;6313:4;6390:11;:::o;6238:217::-;6432:12;;1362:25496:46;6432:12:93;:::o;6698:317::-;1362:25496:46;;;;;;;;;;;;-1:-1:-1;1362:25496:46;;;;;-1:-1:-1;1362:25496:46;;;6792:217:93;1362:25496:46;;;;;;;;;;;;;;;-1:-1:-1;1362:25496:46;;;;-1:-1:-1;1362:25496:46;;;;;;;;735:10:121;1362:25496:46;;6890:40:93;;1362:25496:46;6890:40:93;;1362:25496:46;6944:11:93;:::o;1362:25496:46:-;;;;;;;;;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;8198:1064;;;;;;;8428:17;;8424:181;;8672:52;;1362:25496;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;:::i;:::-;;;;:::i;:::-;8738:83;;8883:21;;1362:25496;;;10936:60;;1362:25496;10936:60;;1362:25496;;;;;;;;;10936:60;;1362:25496;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;:::i;:::-;;;;;;;;11006:160;11027:14;;1362:25496;11050:23;11027:46;;;11006:160;:::i;:::-;1362:25496;11249:14;;:27;;1362:25496;;;11238:75;;1362:25496;;;;;;;;;11238:75;;1362:25496;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;11238:75;1362:25496;11238:75;;;1362:25496;;;;:::i;:::-;;11323:177;1362:25496;;;;;;;;11344:25;;;:70;;;11323:177;:::i;:::-;1362:25496;;11670:3;11647:14;;1362:25496;;11643:25;;;;;11710:17;;11698:43;11710:17;;:::i;:::-;;:22;1362:25496;;;;;:::i;:::-;11698:43;;:::i;:::-;11697:44;11693:99;;11831:14;;;12139:50;12342:14;11831;1362:25496;11831:14;;;11872:185;12287:27;11831:14;1362:25496;26392:3;11831:14;;;;:17;:14;;:17;:::i;:::-;;:23;;1362:25496;;;;;11901:30;;;:72;;;;11670:3;11872:185;;;:::i;:::-;1362:25496;12139:50;:::i;:::-;1362:25496;12259:26;;;;;;:::i;:::-;12287:27;;;;:::i;12342:14::-;12471;1362:25496;;;12471:25;12467:152;;11623:503;12658:27;;;1362:25496;;;8837:81;:::o;12467:152::-;12526:26;12512:96;12526:26;;:::i;:::-;12570:27;;;;1362:25496;;12512:96;;:::i;:::-;12467:152;;;;11901:72;1362:25496;;;;;;11935:16;1362:25496;;;;11955:18;11935:38;11901:72;;;;11693:99;11765:8;1362:25496;;11628:13;;;11643:25;;12287:27;11643:25;;1362:25496;11643:25;;;12139:50;12342:14;11643:25;1362:25496;11643:25;;;26392:3;11643:25;;;12139:50;:::i;11344:70::-;11373:41;1362:25496;11373:41;;;11323:177;:::i;8734:421::-;1362:25496;;;;;;;;;;;;:::i;:::-;;;;:::i;:::-;8939:98;8935:220;;1362:25496;8734:421;1362:25496;;;;:::i;:::-;;;;:::i;:::-;9195:60;1362:25496;9195:60;1362:25496;9195:60;1362:25496;;;9195:60;8935:220;9109:21;;;;;;;1362:25496;;;;;;;;:::i;:::-;;;;;;:::i;:::-;;;;;;:::i;:::-;;;;;;;;;:::i;:::-;-1:-1:-1;1362:25496:46;;-1:-1:-1;1362:25496:46;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;1362:25496:46;;-1:-1:-1;1362:25496:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;1362:25496:46;;-1:-1:-1;1362:25496:46;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;1362:25496:46;;-1:-1:-1;1362:25496:46;;;;;;;;;;;;;;13703:75;;1362:25496;;;;;;;;;13703:75;;1362:25496;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;13703:75;;13792:208;13703:75;;1362:25496;;;;:::i;:::-;;;;;13840:41;13817:64;;;13792:208;:::i;:::-;1362:25496;14035:14;;:27;;1362:25496;;;14024:95;;1362:25496;14024:95;;1362:25496;;;;;;;;;14024:95;;1362:25496;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;:::i;:::-;;14133:189;1362:25496;;;;;;;;14158:25;;;:70;;;14133:189;:::i;:::-;1362:25496;14362:26;;;;;;:::i;:::-;1362:25496;;14392:25;;:35;;:50;;1362:25496;14392:50;;1362:25496;;;;;;14362:80;:184;;;8935:220;14605:26;;;:::i;:::-;14653;1362:25496;14653:26;;;:::i;:::-;1362:25496;;;;;;;14904:25;;;;14961:14;14904:25;;;;;:::i;14961:14::-;15087:45;15106:25;;15087:45;:::i;:::-;1362:25496;;;;;;15150:52;;;15291:26;;;;:::i;:::-;1362:25496;;;;;;;;;15291:68;15287:153;;15146:599;15550:25;1362:25496;15550:25;;:43;;1362:25496;;15539:55;;;1362:25496;15539:55;;;;1362:25496;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15539:55;1362:25496;15529:66;;1362:25496;15479:26;;;:::i;:::-;1362:25496;;;15457:21;1362:25496;;;;;;15146:599;1362:25496;;15934:3;15911:14;;1362:25496;;15907:25;;;;;15974:17;;15962:43;15974:17;;:::i;15962:43::-;15961:44;15957:99;;16095:14;26392:3;16095:14;;1362:25496;16095:14;;16136:185;16095:14;;1362:25496;16095:17;16403:50;16095:14;1362:25496;16095:14;;:17;:::i;:::-;;:23;;1362:25496;;;;;16165:30;;;:72;;;;16136:185;;;:::i;16403:50::-;16639:43;16513:25;;:43;;;;:48;1362:25496;;;16513:48;;;1362:25496;16575:35;;;:50;1362:25496;;16639:43;;:::i;:::-;16806:14;1362:25496;;;16806:25;16802:198;;15887:503;17039:25;;;:43;;1362:25496;;;9053:91;:::o;16802:198::-;16878:26;16847:142;16878:26;;:::i;:::-;16922:25;;;;;:43;;1362:25496;;16847:142;;:::i;:::-;16802:198;;;;16165:72;1362:25496;;;;;;16199:16;1362:25496;;;;16219:18;16199:38;16165:72;;;;15957:99;16029:8;1362:25496;;15892:13;;;15907:25;;1362:25496;15907:25;;;16403:50;15907:25;;;1362:25496;15907:25;;26392:3;15907:25;;16403:50;:::i;15287:153::-;1362:25496;;;;:::i;:::-;;;;;;;;;;;;;;;;:::i;:::-;15287:153;;;15146:599;1362:25496;;;15620:58;15146:599;15616:129;15705:25;1362:25496;15705:25;;1362:25496;15705:25;1362:25496;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14362:184;14466:26;;;;:::i;:::-;1362:25496;;;;;;;14466:80;14362:184;;8424:181;8529:26;;;;;;1362:25496;8529:26;;;:::i;:::-;1362:25496;;;;;;;:::i;:::-;;;;:::i;:::-;;;8529:26;8557:35;;1362:25496;;;;;25529:31;;;;8529:26;25529:31;;;;;:::i;:::-;1362:25496;25519:42;;4288:69:130;25678:11:46;;25691:12;;25639:14;;1362:25496;;8496:98;;26392:3;8496:98;1362:25496;8489:105;:::o;1362:25496::-;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;-1:-1:-1;;1362:25496:46;;;;;;;;;:::i;:::-;;;;4691:549:119;;-1:-1:-1;4691:549:119;;3526:129:124;;;;;;;;;;4874:72:119;;4691:549;4870:364;;;4816:252:124;;;;;;;;-1:-1:-1;3526:129:124;4816:252;;;3526:129;4816:252;;;;;;4962:32:119;:::o;4870:364::-;5011:223;;;1362:25496:46;5045:24:119;;-1:-1:-1;5045:24:119;1362:25496:46;5045:24:119;1362:25496:46;;-1:-1:-1;5045:24:119;5011:223;4578:73:124;5090:33:119;4578:73:124;;1362:25496:46;;;-1:-1:-1;1362:25496:46;;;;;5086:148:119;5204:19;-1:-1:-1;5204:19:119;;-1:-1:-1;5204:19:119;4874:72;-1:-1:-1;4578:73:124;4886:33:119;;;4874:72;4886:59;4923:18;;;:22;;4874:72;;20407:2140:46;;1362:25496;26392:3;20407:2140;1362:25496;;20615:15;20590:40;;1362:25496;;20615:15;;1362:25496;20615:15;1362:25496;;;;2479:10;-1:-1:-1;1362:25496:46;;21393:25;;;1362:25496;;21436:11;1362:25496;;:::i;:::-;21387:76;:180;;;20407:2140;21618:25;;1362:25496;;;;21685:28;;;;;1362:25496;;;;;21727:22;1362:25496;;;;;21685:74;;;;:172;;;;20407:2140;21685:28;22069:40;1362:25496;;;;;;;22164:32;;;;1362:25496;22164:32;;;1362:25496;;;22200:26;1362:25496;;;;;22164:62;;;1362:25496;;22365:33;;1362:25496;22365:33;;;;1362:25496;;;21685:28;1362:25496;;22365:64;;;1362:25496;;20407:2140;;:::o;1362:25496::-;;-1:-1:-1;1362:25496:46;22200:26;1362:25496;;;;-1:-1:-1;1362:25496:46;;;-1:-1:-1;1362:25496:46;22200:26;1362:25496;;;;-1:-1:-1;1362:25496:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21685:172;:28;21779:40;;1362:25496;;;;;;;;;;;21779:78;;-1:-1:-1;21685:172:46;;1362:25496;;;;;;;;;;;;;;;;;;;;;:::i;21387:180::-;21499:25;;;1362:25496;;;;;21483:43;1362:25496;;;;;;;:::i;:::-;;;;;;21530:37;21483:84;21387:180;;1362:25496;;-1:-1:-1;1362:25496:46;20615:15;1362:25496;;;;;-1:-1:-1;1362:25496:46;;;-1:-1:-1;1362:25496:46;;;;;-1:-1:-1;1362:25496:46;;;-1:-1:-1;1362:25496:46;20615:15;1362:25496;;;;;-1:-1:-1;1362:25496:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;1362:25496:46;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;-1:-1:-1;;1362:25496:46;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::o;:::-;;;;;;8968:69;1362:25496;;14291:16;1362:25496;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1362:25496:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;1362:25496:46;;;;;;;;;;;;;;;-1:-1:-1;1362:25496:46;;;;;;;;;;;;;;;;;;;;;;;;365:427:55;;1362:25496:46;;;;459:20:55;455:63;;1362:25496:46;561:3:55;1362:25496:46;;547:12:55;;;;;584:4;;;;:::i;:::-;;1362:25496:46;599:4:55;;;;:::i;:::-;;1362:25496:46;584:26:55;580:77;;684:4;;;;:::i;:::-;;1362:25496:46;;;;;674:15:55;703:4;;;;:::i;:::-;;1362:25496:46;;;;;693:15:55;674:34;670:85;;1362:25496:46;;532:13:55;;670:85;728:12;;;1362:25496:46;728:12:55;:::o;547:::-;;;;1362:25496:46;365:427:55;:::o;17346:759:46:-;;17739:177;17616:33;17346:759;17695:34;1362:25496;;17616:33;;;;;;;;;1362:25496;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17616:33;1362:25496;17606:44;;17695:34;;:::i;17739:177::-;17972:26;1362:25496;17948:50;;;1362:25496;;17346:759;;:::o;1362:25496::-;;-1:-1:-1;1362:25496:46;;;;;;-1:-1:-1;1362:25496:46;24783:318;;;;;24921:1;24944:3;1362:25496;;24924:18;;;;;25018:10;;;1362:25496;25018:10;;;:::i;:::-;;1362:25496;;24994:35;;;;;;;;;;:::i;:::-;1362:25496;24984:46;;4520:68:130;1362:25496:46;24909:13;;24924:18;;;;;;24783:318::o","linkReferences":{},"immutableReferences":{"10759":[{"start":1367,"length":32},{"start":5189,"length":32}],"10762":[{"start":505,"length":32},{"start":7681,"length":32}],"10765":[{"start":3251,"length":32},{"start":8581,"length":32}],"10768":[{"start":672,"length":32},{"start":2753,"length":32}],"10772":[{"start":3192,"length":32},{"start":6682,"length":32}]}},"methodIdentifiers":{"ALLOWED_SP1_CLOCK_DRIFT()":"2c3ee474","DEFAULT_ADMIN_ROLE()":"a217fddf","MEMBERSHIP_PROGRAM_VKEY()":"e45a6d0d","MISBEHAVIOUR_PROGRAM_VKEY()":"314d4dff","PROOF_SUBMITTER_ROLE()":"5972185a","UPDATE_CLIENT_AND_MEMBERSHIP_PROGRAM_VKEY()":"0225293e","UPDATE_CLIENT_PROGRAM_VKEY()":"ca7242f9","VERIFIER()":"08c84e70","clientState()":"bd3ce6b0","getClientState()":"ef913a4b","getConsensusStateHash(uint64)":"23842fb8","getRoleAdmin(bytes32)":"248a9ca3","grantRole(bytes32,address)":"2f2ff15d","hasRole(bytes32,address)":"91d14854","misbehaviour(bytes)":"ddba6537","multicall(bytes[])":"ac9650d8","renounceRole(bytes32,address)":"36568abe","revokeRole(bytes32,address)":"d547741f","supportsInterface(bytes4)":"01ffc9a7","updateClient(bytes)":"0bece356","verifyMembership((bytes,(uint64,uint64),bytes[],bytes))":"682ed5f0","verifyNonMembership((bytes,(uint64,uint64),bytes[]))":"4d6d9ffb"},"rawMetadata":"{\"compiler\":{\"version\":\"0.8.28+commit.7893614a\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"updateClientProgramVkey\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"membershipProgramVkey\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"updateClientAndMembershipProgramVkey\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"misbehaviourProgramVkey\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"sp1Verifier\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"_clientState\",\"type\":\"bytes\"},{\"internalType\":\"bytes32\",\"name\":\"_consensusState\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"roleManager\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"AccessControlBadConfirmation\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"internalType\":\"bytes32\",\"name\":\"neededRole\",\"type\":\"bytes32\"}],\"name\":\"AccessControlUnauthorizedAccount\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"target\",\"type\":\"address\"}],\"name\":\"AddressEmptyCode\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"CannotHandleMisbehavior\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"expected\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"actual\",\"type\":\"string\"}],\"name\":\"ChainIdMismatch\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"expected\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"actual\",\"type\":\"bytes\"}],\"name\":\"ClientStateMismatch\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"expected\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"actual\",\"type\":\"bytes32\"}],\"name\":\"ConsensusStateHashMismatch\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ConsensusStateNotFound\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"expected\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"actual\",\"type\":\"bytes32\"}],\"name\":\"ConsensusStateRootMismatch\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"EmptyValue\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"FailedCall\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"FeatureNotSupported\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"FrozenClientState\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidMembershipProof\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes[]\",\"name\":\"path\",\"type\":\"bytes[]\"},{\"internalType\":\"bytes\",\"name\":\"value\",\"type\":\"bytes\"}],\"name\":\"KeyValuePairNotInCache\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"length\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"min\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"max\",\"type\":\"uint256\"}],\"name\":\"LengthIsOutOfRange\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes[]\",\"name\":\"path\",\"type\":\"bytes[]\"}],\"name\":\"MembershipProofKeyNotFound\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"expected\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"actual\",\"type\":\"bytes\"}],\"name\":\"MembershipProofValueMismatch\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"expectedRevisionNumber\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"expectedRevisionHeight\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"actualRevisionNumber\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"actualRevisionHeight\",\"type\":\"uint64\"}],\"name\":\"ProofHeightMismatch\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"now\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"proofTimestamp\",\"type\":\"uint256\"}],\"name\":\"ProofIsInTheFuture\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"now\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"proofTimestamp\",\"type\":\"uint256\"}],\"name\":\"ProofIsTooOld\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"expectedNumerator\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"expectedDenominator\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"actualNumerator\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"actualDenominator\",\"type\":\"uint256\"}],\"name\":\"TrustThresholdMismatch\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"expected\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"actual\",\"type\":\"uint256\"}],\"name\":\"TrustingPeriodMismatch\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"trustingPeriod\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"unbondingPeriod\",\"type\":\"uint256\"}],\"name\":\"TrustingPeriodTooLong\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"expected\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"actual\",\"type\":\"uint256\"}],\"name\":\"UnbondingPeriodMismatch\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint8\",\"name\":\"proofType\",\"type\":\"uint8\"}],\"name\":\"UnknownMembershipProofType\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint8\",\"name\":\"algorithm\",\"type\":\"uint8\"}],\"name\":\"UnknownZkAlgorithm\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"expected\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"actual\",\"type\":\"bytes32\"}],\"name\":\"VerificationKeyMismatch\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"previousAdminRole\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"newAdminRole\",\"type\":\"bytes32\"}],\"name\":\"RoleAdminChanged\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"RoleGranted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"RoleRevoked\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"ALLOWED_SP1_CLOCK_DRIFT\",\"outputs\":[{\"internalType\":\"uint16\",\"name\":\"\",\"type\":\"uint16\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"DEFAULT_ADMIN_ROLE\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"MEMBERSHIP_PROGRAM_VKEY\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"MISBEHAVIOUR_PROGRAM_VKEY\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"PROOF_SUBMITTER_ROLE\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"UPDATE_CLIENT_AND_MEMBERSHIP_PROGRAM_VKEY\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"UPDATE_CLIENT_PROGRAM_VKEY\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"VERIFIER\",\"outputs\":[{\"internalType\":\"contract ISP1Verifier\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"clientState\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"chainId\",\"type\":\"string\"},{\"components\":[{\"internalType\":\"uint8\",\"name\":\"numerator\",\"type\":\"uint8\"},{\"internalType\":\"uint8\",\"name\":\"denominator\",\"type\":\"uint8\"}],\"internalType\":\"struct IICS07TendermintMsgs.TrustThreshold\",\"name\":\"trustLevel\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint64\",\"name\":\"revisionNumber\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"revisionHeight\",\"type\":\"uint64\"}],\"internalType\":\"struct IICS02ClientMsgs.Height\",\"name\":\"latestHeight\",\"type\":\"tuple\"},{\"internalType\":\"uint32\",\"name\":\"trustingPeriod\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"unbondingPeriod\",\"type\":\"uint32\"},{\"internalType\":\"bool\",\"name\":\"isFrozen\",\"type\":\"bool\"},{\"internalType\":\"enum IICS07TendermintMsgs.SupportedZkAlgorithm\",\"name\":\"zkAlgorithm\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getClientState\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"revisionHeight\",\"type\":\"uint64\"}],\"name\":\"getConsensusStateHash\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"}],\"name\":\"getRoleAdmin\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"grantRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"hasRole\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"misbehaviourMsg\",\"type\":\"bytes\"}],\"name\":\"misbehaviour\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes[]\",\"name\":\"data\",\"type\":\"bytes[]\"}],\"name\":\"multicall\",\"outputs\":[{\"internalType\":\"bytes[]\",\"name\":\"results\",\"type\":\"bytes[]\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"callerConfirmation\",\"type\":\"address\"}],\"name\":\"renounceRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"revokeRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes4\",\"name\":\"interfaceId\",\"type\":\"bytes4\"}],\"name\":\"supportsInterface\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"updateMsg\",\"type\":\"bytes\"}],\"name\":\"updateClient\",\"outputs\":[{\"internalType\":\"enum ILightClientMsgs.UpdateResult\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes\",\"name\":\"proof\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"uint64\",\"name\":\"revisionNumber\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"revisionHeight\",\"type\":\"uint64\"}],\"internalType\":\"struct IICS02ClientMsgs.Height\",\"name\":\"proofHeight\",\"type\":\"tuple\"},{\"internalType\":\"bytes[]\",\"name\":\"path\",\"type\":\"bytes[]\"},{\"internalType\":\"bytes\",\"name\":\"value\",\"type\":\"bytes\"}],\"internalType\":\"struct ILightClientMsgs.MsgVerifyMembership\",\"name\":\"msg_\",\"type\":\"tuple\"}],\"name\":\"verifyMembership\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes\",\"name\":\"proof\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"uint64\",\"name\":\"revisionNumber\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"revisionHeight\",\"type\":\"uint64\"}],\"internalType\":\"struct IICS02ClientMsgs.Height\",\"name\":\"proofHeight\",\"type\":\"tuple\"},{\"internalType\":\"bytes[]\",\"name\":\"path\",\"type\":\"bytes[]\"}],\"internalType\":\"struct ILightClientMsgs.MsgVerifyNonMembership\",\"name\":\"msg_\",\"type\":\"tuple\"}],\"name\":\"verifyNonMembership\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"author\":\"srdtrk\",\"errors\":{\"AccessControlBadConfirmation()\":[{\"details\":\"The caller of a function is not the expected one. NOTE: Don't confuse with {AccessControlUnauthorizedAccount}.\"}],\"AccessControlUnauthorizedAccount(address,bytes32)\":[{\"details\":\"The `account` is missing a role.\"}],\"AddressEmptyCode(address)\":[{\"details\":\"There's no code at `target` (it is not a contract).\"}],\"CannotHandleMisbehavior()\":[{\"details\":\"Misbehavior cannot be handled in membership handler, so it is returned as an error.\"}],\"ChainIdMismatch(string,string)\":[{\"params\":{\"actual\":\"The actual chain ID.\",\"expected\":\"The expected chain ID.\"}}],\"ClientStateMismatch(bytes,bytes)\":[{\"params\":{\"actual\":\"The actual client state.\",\"expected\":\"The expected client state.\"}}],\"ConsensusStateHashMismatch(bytes32,bytes32)\":[{\"params\":{\"actual\":\"The actual consensus state hash.\",\"expected\":\"The expected consensus state hash.\"}}],\"ConsensusStateRootMismatch(bytes32,bytes32)\":[{\"params\":{\"actual\":\"The actual consensus state root.\",\"expected\":\"The expected consensus state root.\"}}],\"FailedCall()\":[{\"details\":\"A call to an address target failed. The target may have reverted.\"}],\"KeyValuePairNotInCache(bytes[],bytes)\":[{\"params\":{\"path\":\"The path of the key-value pair.\",\"value\":\"The value of the key-value pair.\"}}],\"LengthIsOutOfRange(uint256,uint256,uint256)\":[{\"params\":{\"length\":\"The length of the value.\",\"max\":\"The maximum length of the value.\",\"min\":\"The minimum length of the value.\"}}],\"MembershipProofKeyNotFound(bytes[])\":[{\"params\":{\"path\":\"The path of the key-value pair.\"}}],\"MembershipProofValueMismatch(bytes,bytes)\":[{\"params\":{\"actual\":\"The actual value.\",\"expected\":\"The expected value.\"}}],\"ProofHeightMismatch(uint64,uint64,uint64,uint64)\":[{\"params\":{\"actualRevisionHeight\":\"The actual revision height.\",\"actualRevisionNumber\":\"The actual revision number.\",\"expectedRevisionHeight\":\"The expected revision height.\",\"expectedRevisionNumber\":\"The expected revision number.\"}}],\"ProofIsInTheFuture(uint256,uint256)\":[{\"params\":{\"now\":\"The current timestamp in seconds.\",\"proofTimestamp\":\"The timestamp in the proof in seconds.\"}}],\"ProofIsTooOld(uint256,uint256)\":[{\"params\":{\"now\":\"The current timestamp in seconds.\",\"proofTimestamp\":\"The timestamp in the proof in seconds.\"}}],\"TrustThresholdMismatch(uint256,uint256,uint256,uint256)\":[{\"params\":{\"actualDenominator\":\"The actual denominator of the trust threshold.\",\"actualNumerator\":\"The actual numerator of the trust threshold.\",\"expectedDenominator\":\"The expected denominator of the trust threshold.\",\"expectedNumerator\":\"The expected numerator of the trust threshold.\"}}],\"TrustingPeriodMismatch(uint256,uint256)\":[{\"params\":{\"actual\":\"The actual trusting period in seconds.\",\"expected\":\"The expected trusting period in seconds.\"}}],\"TrustingPeriodTooLong(uint256,uint256)\":[{\"params\":{\"trustingPeriod\":\"The trusting period in seconds.\",\"unbondingPeriod\":\"The unbonding period in seconds.\"}}],\"UnbondingPeriodMismatch(uint256,uint256)\":[{\"params\":{\"actual\":\"The actual unbonding period in seconds.\",\"expected\":\"The expected unbonding period in seconds.\"}}],\"UnknownMembershipProofType(uint8)\":[{\"params\":{\"proofType\":\"The unknown membership proof type.\"}}],\"UnknownZkAlgorithm(uint8)\":[{\"params\":{\"algorithm\":\"The unknown zk algorithm.\"}}],\"VerificationKeyMismatch(bytes32,bytes32)\":[{\"params\":{\"actual\":\"The actual verification key.\",\"expected\":\"The expected verification key.\"}}]},\"events\":{\"RoleAdminChanged(bytes32,bytes32,bytes32)\":{\"details\":\"Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite {RoleAdminChanged} not being emitted to signal this.\"},\"RoleGranted(bytes32,address,address)\":{\"details\":\"Emitted when `account` is granted `role`. `sender` is the account that originated the contract call. This account bears the admin role (for the granted role). Expected in cases where the role was granted using the internal {AccessControl-_grantRole}.\"},\"RoleRevoked(bytes32,address,address)\":{\"details\":\"Emitted when `account` is revoked `role`. `sender` is the account that originated the contract call: - if using `revokeRole`, it is the admin role bearer - if using `renounceRole`, it is the role bearer (i.e. `account`)\"}},\"kind\":\"dev\",\"methods\":{\"constructor\":{\"params\":{\"_clientState\":\"The encoded initial client state.\",\"_consensusState\":\"The encoded initial consensus state.\",\"membershipProgramVkey\":\"The verification key for the verify (non)membership program.\",\"misbehaviourProgramVkey\":\"The verification key for the misbehaviour program.\",\"roleManager\":\"Manages the proof submitters and can submit proofs. Should be the ICS26Router if used in IBC.\",\"sp1Verifier\":\"The address of the SP1 verifier contract.\",\"updateClientAndMembershipProgramVkey\":\"The verification key for the update client and membership program.\",\"updateClientProgramVkey\":\"The verification key for the update client program.\"}},\"getClientState()\":{\"returns\":{\"_0\":\"The client state.\"}},\"getConsensusStateHash(uint64)\":{\"params\":{\"revisionHeight\":\"The revision height.\"},\"returns\":{\"_0\":\"The consensus state at the given revision height.\"}},\"getRoleAdmin(bytes32)\":{\"details\":\"Returns the admin role that controls `role`. See {grantRole} and {revokeRole}. To change a role's admin, use {_setRoleAdmin}.\"},\"grantRole(bytes32,address)\":{\"details\":\"Grants `role` to `account`. If `account` had not been already granted `role`, emits a {RoleGranted} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleGranted} event.\"},\"hasRole(bytes32,address)\":{\"details\":\"Returns `true` if `account` has been granted `role`.\"},\"misbehaviour(bytes)\":{\"details\":\"The misbehavior is verfied in the sp1 program. Here we only check the public values which contain the trusted headers.\",\"params\":{\"misbehaviourMsg\":\"The misbehaviour message\"}},\"multicall(bytes[])\":{\"custom:oz-upgrades-unsafe-allow-reachable\":\"delegatecall\",\"details\":\"Receives and executes a batch of function calls on this contract.\"},\"renounceRole(bytes32,address)\":{\"details\":\"Revokes `role` from the calling account. Roles are often managed via {grantRole} and {revokeRole}: this function's purpose is to provide a mechanism for accounts to lose their privileges if they are compromised (such as when a trusted device is misplaced). If the calling account had been revoked `role`, emits a {RoleRevoked} event. Requirements: - the caller must be `callerConfirmation`. May emit a {RoleRevoked} event.\"},\"revokeRole(bytes32,address)\":{\"details\":\"Revokes `role` from `account`. If `account` had been granted `role`, emits a {RoleRevoked} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleRevoked} event.\"},\"supportsInterface(bytes4)\":{\"details\":\"Returns true if this contract implements the interface defined by `interfaceId`. See the corresponding https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[ERC section] to learn more about how these ids are created. This function call must use less than 30 000 gas.\"},\"updateClient(bytes)\":{\"details\":\"This function verifies the public values and forwards the proof to the SP1 verifier.\",\"params\":{\"updateMsg\":\"The encoded update message e.g., an SP1 proof.\"},\"returns\":{\"_0\":\"The result of the update operation\"}},\"verifyMembership((bytes,(uint64,uint64),bytes[],bytes))\":{\"details\":\"Notice that this message is not view, as it may update the client state for caching purposes.\",\"params\":{\"msg_\":\"The membership message\"},\"returns\":{\"_0\":\"The unix timestamp of the verification height in the counterparty chain in seconds.\"}},\"verifyNonMembership((bytes,(uint64,uint64),bytes[]))\":{\"details\":\"Notice that this message is not view, as it may update the client state for caching purposes.\",\"params\":{\"msg_\":\"The membership message\"},\"returns\":{\"_0\":\"The unix timestamp of the verification height in the counterparty chain in seconds.\"}}},\"stateVariables\":{\"ALLOWED_SP1_CLOCK_DRIFT\":{\"return\":\"The allowed prover clock drift in seconds.\",\"returns\":{\"_0\":\"The allowed prover clock drift in seconds.\"}},\"MEMBERSHIP_PROGRAM_VKEY\":{\"return\":\"The verification key for the membership program.\",\"returns\":{\"_0\":\"The verification key for the membership program.\"}},\"MISBEHAVIOUR_PROGRAM_VKEY\":{\"return\":\"The verification key for the misbehaviour program.\",\"returns\":{\"_0\":\"The verification key for the misbehaviour program.\"}},\"PROOF_SUBMITTER_ROLE\":{\"details\":\"The proof submitter role is used to whitelist addresses that can submit proofsIf `address(0)` has this role, then anyone can submit proofsIf this client is hooked up to ICS26Router, the router must be given this role\",\"return\":\"The role identifier\",\"returns\":{\"_0\":\"The role identifier\"}},\"UPDATE_CLIENT_AND_MEMBERSHIP_PROGRAM_VKEY\":{\"return\":\"The verification key for the update client and membership program.\",\"returns\":{\"_0\":\"The verification key for the update client and membership program.\"}},\"UPDATE_CLIENT_PROGRAM_VKEY\":{\"return\":\"The verification key for the update client program.\",\"returns\":{\"_0\":\"The verification key for the update client program.\"}},\"VERIFIER\":{\"return\":\"The SP1 verifier contract.\",\"returns\":{\"_0\":\"The SP1 verifier contract.\"}},\"_consensusStateHashes\":{\"details\":\"Revision number need not be keyed as it is not allowed to change.\"}},\"title\":\"SP1 ICS07 Tendermint Light Client\",\"version\":1},\"userdoc\":{\"errors\":{\"CannotHandleMisbehavior()\":[{\"notice\":\"The error that is returned when the update client and membership program contains misbehavior.\"}],\"ChainIdMismatch(string,string)\":[{\"notice\":\"The error that is returned when the chain ID does not match the expected value.\"}],\"ClientStateMismatch(bytes,bytes)\":[{\"notice\":\"The error that is returned when the client state does not match the expected value.\"}],\"ConsensusStateHashMismatch(bytes32,bytes32)\":[{\"notice\":\"The error that is returned when the consensus state hash does not match the expected value.\"}],\"ConsensusStateNotFound()\":[{\"notice\":\"The error that is returned when the consensus state is not found.\"}],\"ConsensusStateRootMismatch(bytes32,bytes32)\":[{\"notice\":\"The error that is returned when the consensus state root does not match the expected value.\"}],\"EmptyValue()\":[{\"notice\":\"Returned when the membership value is empty.\"}],\"FeatureNotSupported()\":[{\"notice\":\"Returned when the feature is not supported.\"}],\"FrozenClientState()\":[{\"notice\":\"The error that is returned when the client state is frozen.\"}],\"InvalidMembershipProof()\":[{\"notice\":\"Returned when the membership proof is invalid.\"}],\"KeyValuePairNotInCache(bytes[],bytes)\":[{\"notice\":\"Returned when a key-value pair is not in the cache.\"}],\"LengthIsOutOfRange(uint256,uint256,uint256)\":[{\"notice\":\"The error that is returned when the length of a value is out of range.\"}],\"MembershipProofKeyNotFound(bytes[])\":[{\"notice\":\"The error that is returned when the key-value pair's path is not contained in the proof.\"}],\"MembershipProofValueMismatch(bytes,bytes)\":[{\"notice\":\"The error that is returned when the key-value pair's value does not match the expected value.\"}],\"ProofHeightMismatch(uint64,uint64,uint64,uint64)\":[{\"notice\":\"The error that is returned when the proof height does not match the expected value.\"}],\"ProofIsInTheFuture(uint256,uint256)\":[{\"notice\":\"The error that is returned when a proof is in the future.\"}],\"ProofIsTooOld(uint256,uint256)\":[{\"notice\":\"The error that is returned when a proof is too old.\"}],\"TrustThresholdMismatch(uint256,uint256,uint256,uint256)\":[{\"notice\":\"The error that is returned when the trust threshold does not match the expected value.\"}],\"TrustingPeriodMismatch(uint256,uint256)\":[{\"notice\":\"The error that is returned when the trusting period does not match the expected value.\"}],\"TrustingPeriodTooLong(uint256,uint256)\":[{\"notice\":\"The error that is returned when the trusting period is longer than the unbonding period.\"}],\"UnbondingPeriodMismatch(uint256,uint256)\":[{\"notice\":\"The error that is returned when the unbonding period does not match the expected value.\"}],\"UnknownMembershipProofType(uint8)\":[{\"notice\":\"The error that is returned when the membership proof type is unknown.\"}],\"UnknownZkAlgorithm(uint8)\":[{\"notice\":\"The error that is returned when the zk algorithm is unknown.\"}],\"VerificationKeyMismatch(bytes32,bytes32)\":[{\"notice\":\"The error that is returned when the verification key does not match the expected value.\"}]},\"kind\":\"user\",\"methods\":{\"ALLOWED_SP1_CLOCK_DRIFT()\":{\"notice\":\"Constant allowed prover clock drift in seconds.\"},\"MEMBERSHIP_PROGRAM_VKEY()\":{\"notice\":\"Immutable membership program verification key.\"},\"MISBEHAVIOUR_PROGRAM_VKEY()\":{\"notice\":\"Immutable misbehaviour program verification key.\"},\"PROOF_SUBMITTER_ROLE()\":{\"notice\":\"The role identifier for the proof submitter role\"},\"UPDATE_CLIENT_AND_MEMBERSHIP_PROGRAM_VKEY()\":{\"notice\":\"Immutable update client and membership program verification key.\"},\"UPDATE_CLIENT_PROGRAM_VKEY()\":{\"notice\":\"Immutable update client program verification key.\"},\"VERIFIER()\":{\"notice\":\"Immutable SP1 verifier contract address.\"},\"clientState()\":{\"notice\":\"The ICS07Tendermint client state\"},\"constructor\":{\"notice\":\"The constructor sets the program verification key and the initial client and consensus states.\"},\"getClientState()\":{\"notice\":\"Returns the client state.\"},\"getConsensusStateHash(uint64)\":{\"notice\":\"Returns the consensus state keccak256 hash at the given revision height.\"},\"misbehaviour(bytes)\":{\"notice\":\"Misbehaviour handling, moves the light client to the frozen state if misbehaviour is detected\"},\"updateClient(bytes)\":{\"notice\":\"Updating the client and consensus state\"},\"verifyMembership((bytes,(uint64,uint64),bytes[],bytes))\":{\"notice\":\"Querying the membership of a key-value pair\"},\"verifyNonMembership((bytes,(uint64,uint64),bytes[]))\":{\"notice\":\"Querying the non-membership of a key\"}},\"notice\":\"This contract implements an ICS07 IBC tendermint light client using SP1.\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/light-clients/sp1-ics07/SP1ICS07Tendermint.sol\":\"SP1ICS07Tendermint\"},\"evmVersion\":\"cancun\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"none\"},\"optimizer\":{\"enabled\":true,\"runs\":10000},\"remappings\":[\":@openzeppelin-contracts/=node_modules/@openzeppelin/contracts/\",\":@openzeppelin-upgradeable/=node_modules/@openzeppelin/contracts-upgradeable/\",\":@openzeppelin/=node_modules/@openzeppelin/\",\":@sp1-contracts/=node_modules/sp1-contracts/contracts/src/\",\":@uniswap/permit2/=node_modules/@uniswap/permit2/\",\":forge-std/=node_modules/forge-std/src/\",\":sp1-contracts/=node_modules/sp1-contracts/\"],\"viaIR\":true},\"sources\":{\"contracts/interfaces/ILightClient.sol\":{\"keccak256\":\"0x3b2361546ee834a442d844c979fbad3458ee13146b093f585587a09e19a266af\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://5b5d53101bb598f14a79cb1092479736fa18e8f84945ea6ef80f4dac84466042\",\"dweb:/ipfs/QmaTCo6M3Z9aYCSX65AQtixo1sB4ymQUDAgTXSKHqJHGDh\"]},\"contracts/light-clients/sp1-ics07/SP1ICS07Tendermint.sol\":{\"keccak256\":\"0x3e2b4354c5d91484f6a77473b5ce478de3d7156a2d267cb3799ce8f052a4ffba\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://990de6d73b4e7560a9eaa879481feda3917f47ab6af035868b1af396e67ec198\",\"dweb:/ipfs/QmZutWg3B1fofn7VzpTqXi8Qknobdr592KSxCAVKUJDJg5\"]},\"contracts/light-clients/sp1-ics07/errors/ISP1ICS07TendermintErrors.sol\":{\"keccak256\":\"0x3460656846878c1e2ce7dbfd2b4ecb4e32906cc3703b1a3401ce665cd756dcc3\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://c6d3fc12f236e9cf823a882338e1f87ca97384a5c3d5b1150eb39d35ab527d87\",\"dweb:/ipfs/QmVRrav4NbauHVShNtA5SvrrhZSUrwXX3rqDayrMiqKUWJ\"]},\"contracts/light-clients/sp1-ics07/interfaces/ISP1ICS07Tendermint.sol\":{\"keccak256\":\"0x54c633827f1a455060d941aecf4ddd629c3ed2d422c309c2eaa8b5c9536329e8\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://6c5cf4ff32cf8c7d392dc24eb4d959e487104b0539bfc1f62a3899b72ce7afe4\",\"dweb:/ipfs/QmQPXSJ6x26gXUg9Dso9bktAdG4E7wMhReupFMyGLMMaFX\"]},\"contracts/light-clients/sp1-ics07/msgs/IICS07TendermintMsgs.sol\":{\"keccak256\":\"0x8d77a9f176e2897a85a349afdc7661d48bc62fd403e8e41794578c25b611b599\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://d96574ec9152f4c26e5f9a666d1887d3db25265f46ddd10c619433aa075ff97e\",\"dweb:/ipfs/QmfWEtkZspYtRKzgB4ppkN9DwAPVqDsBZcViUJYExyprL4\"]},\"contracts/light-clients/sp1-ics07/msgs/IMembershipMsgs.sol\":{\"keccak256\":\"0x1314aa3eb8567d0f26f303e7b6341009a0bc755bf4293b9326e5e607b5eb8bf5\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://e3b01f086562ba146a54b8e1255d3ba356cd9ac47a9e31650ebca0ea7e0c21da\",\"dweb:/ipfs/Qma43UYbSA2FwYJKvY1APDZAqvEQccE7gtYtNHYMwMXj9o\"]},\"contracts/light-clients/sp1-ics07/msgs/IMisbehaviourMsgs.sol\":{\"keccak256\":\"0x0e67f4b02ca8314bea5d9cb1b86a56961871a35fab8bfa420ad6e9a534918d2b\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://ebb8a2af8276cc1b9fd23877d0cace5270e8bdb0ae38c033a373d97d1fa3bf5e\",\"dweb:/ipfs/QmYHqw3iTKKN7kw1foeP896XwB1SxE1xQD1RcpsoS2uorp\"]},\"contracts/light-clients/sp1-ics07/msgs/ISP1Msgs.sol\":{\"keccak256\":\"0xdb31e69fad51c6875c51240f10e4b9de73869e3175c86f9d21eefa68737f3511\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://b5a7128f622d096dc914232268b01fbb95e3bd988bf78f1072e5d54341be4029\",\"dweb:/ipfs/QmU4GeqmToWLeZYRsJ4g6zdA9can54n1fHSASF4uFBT7XT\"]},\"contracts/light-clients/sp1-ics07/msgs/IUcAndMembershipMsgs.sol\":{\"keccak256\":\"0x59c5842f974c4fbe8b1fd4ee672313dd1e071971499d791742485eb76d090c8d\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://eccb269297161eaf02cb5a42e9b19b87e523e438c18086f224696a699f78166b\",\"dweb:/ipfs/QmaxyatbUphRHxcnBx8CQtQB8htiHRvAPeopSMtvHutM44\"]},\"contracts/light-clients/sp1-ics07/msgs/IUpdateClientMsgs.sol\":{\"keccak256\":\"0x48b559036506205363c5363564a3e33d774f748a52323517fe9c47359169ddb9\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://c323ba40ced44e2979fd95acb9c3ff2808dcb930913dc6692fe7912266f25f57\",\"dweb:/ipfs/QmYwHJLYXs9qSc9XCBpLFR94Rg43NsACZTDdZioPFDmkGS\"]},\"contracts/light-clients/sp1-ics07/utils/Paths.sol\":{\"keccak256\":\"0xbb62ada9681458b6eb50cf57d867091d9807b2fcad86c0e7bb76131c15dc3c36\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://58a47a038a5ec37dcdc72b6b0fde15c5059325a68f0044da73ba88caa3525e24\",\"dweb:/ipfs/QmPZQxnSSrUJ9LjrKZSwXFCb7NXtUs9kB285m2B8LW7gF4\"]},\"contracts/msgs/IICS02ClientMsgs.sol\":{\"keccak256\":\"0x03d1265eae327c3744d774bf22a30d845233d50664921c9aa57cef2d71fd89d2\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://89900781cc5c60540a237d92d42745ea6165765ee8fb4d50e8137a717195cc75\",\"dweb:/ipfs/Qmbx5p8gZ8sEMMeZytXsLee49JUayhAaoJ2yxX93WUrvQo\"]},\"contracts/msgs/ILightClientMsgs.sol\":{\"keccak256\":\"0x8d1e56ab166a7b4aa6999708e3214a4645ebbc3835c2b2a4c255c9923eebafde\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://8bd4200dc04d950c0f050623fa9a8accdbec877fd446c039d4dd6c678bdf1513\",\"dweb:/ipfs/QmZQTViaA7N6BVNDzJ1Z6w799PrPoE4ajPueZSPwX4sGZ9\"]},\"node_modules/@openzeppelin/contracts/access/AccessControl.sol\":{\"keccak256\":\"0x4686ec784d75f95beaf2bf5b5f26e5f946d4c864aaee9c3c62bdc18381f5e017\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://26710ca191913f3c9df542079c4a6dcff02968e92d4f7357daefef9fbe72a19c\",\"dweb:/ipfs/QmanHbeWuBbVEqXySHa1zhm2rExjYpChDBubBaJNTCa2JB\"]},\"node_modules/@openzeppelin/contracts/access/IAccessControl.sol\":{\"keccak256\":\"0xbff9f59c84e5337689161ce7641c0ef8e872d6a7536fbc1f5133f128887aba3c\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://b308f882e796f7b79c9502deacb0a62983035c6f6f4e962b319ba6a1f4a77d3d\",\"dweb:/ipfs/QmaWCW7ahEQqFjwhSUhV7Ae7WhfNvzSpE7DQ58hvEooqPL\"]},\"node_modules/@openzeppelin/contracts/utils/Address.sol\":{\"keccak256\":\"0x0fa9e0d3a859900b5a46f70a03c73adf259603d5e05027a37fe0b45529d85346\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://c2add4da0240c9f2ce47649c8bb6b11b40e98cf6f88b8bdc76b2704e89391710\",\"dweb:/ipfs/QmNQTwF2uVzu4CRtNxr8bxyP9XuW6VsZuo2Nr4KR2bZr3d\"]},\"node_modules/@openzeppelin/contracts/utils/Context.sol\":{\"keccak256\":\"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://6a708e8a5bdb1011c2c381c9a5cfd8a9a956d7d0a9dc1bd8bcdaf52f76ef2f12\",\"dweb:/ipfs/Qmax9WHBnVsZP46ZxEMNRQpLQnrdE4dK8LehML1Py8FowF\"]},\"node_modules/@openzeppelin/contracts/utils/Errors.sol\":{\"keccak256\":\"0x6afa713bfd42cf0f7656efa91201007ac465e42049d7de1d50753a373648c123\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://ba1d02f4847670a1b83dec9f7d37f0b0418d6043447b69f3a29a5f9efc547fcf\",\"dweb:/ipfs/QmQ7iH2keLNUKgq2xSWcRmuBE5eZ3F5whYAkAGzCNNoEWB\"]},\"node_modules/@openzeppelin/contracts/utils/LowLevelCall.sol\":{\"keccak256\":\"0x6ba3db1346fc75a832aa6cd075e12f6f1fa172fa2122a020f324c319fe5be75e\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://ab92e9e1cb08144c43fa3a383a87c48f49a652d51156950b928c2a50bee6b3a5\",\"dweb:/ipfs/QmWeKkKZBgLDKgRFGKCzsKybYF7C8g9ysg5kU1b1p7QFBi\"]},\"node_modules/@openzeppelin/contracts/utils/Multicall.sol\":{\"keccak256\":\"0x72a5499dfae7676e4298a7299bccd3b27438ba1a4c72df5cd69c1c343c7ea20d\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://de0fb51ccae3a0ff377ed185d187440fc612a71bf8e42fdb0e032ce747fa3eef\",\"dweb:/ipfs/QmPNBaiVsAiUhz8qfXcSy27S7CqBbtSd8rPqmaykKBhw7Q\"]},\"node_modules/@openzeppelin/contracts/utils/TransientSlot.sol\":{\"keccak256\":\"0xac673fa1e374d9e6107504af363333e3e5f6344d2e83faf57d9bfd41d77cc946\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://5982478dbbb218e9dd5a6e83f5c0e8d1654ddf20178484b43ef21dd2246809de\",\"dweb:/ipfs/QmaB1hS68n2kG8vTbt7EPEzmrGhkUbfiFyykGGLsAr9X22\"]},\"node_modules/@openzeppelin/contracts/utils/introspection/ERC165.sol\":{\"keccak256\":\"0x2d9dc2fe26180f74c11c13663647d38e259e45f95eb88f57b61d2160b0109d3e\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://81233d1f98060113d9922180bb0f14f8335856fe9f339134b09335e9f678c377\",\"dweb:/ipfs/QmWh6R35SarhAn4z2wH8SU456jJSYL2FgucfTFgbHJJN4E\"]},\"node_modules/@openzeppelin/contracts/utils/introspection/IERC165.sol\":{\"keccak256\":\"0x8891738ffe910f0cf2da09566928589bf5d63f4524dd734fd9cedbac3274dd5c\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://971f954442df5c2ef5b5ebf1eb245d7105d9fbacc7386ee5c796df1d45b21617\",\"dweb:/ipfs/QmadRjHbkicwqwwh61raUEapaVEtaLMcYbQZWs9gUkgj3u\"]},\"node_modules/sp1-contracts/contracts/src/ISP1Verifier.sol\":{\"keccak256\":\"0x9e3ba64860bea920772dcf16be7946de2a2900d80bd51e9c0771184138f4f4d3\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://0ec7230ca1fdd74edc6ab597d80bb345282aed3f0db4788ed96b4cc373ff46a3\",\"dweb:/ipfs/QmXPuSS5gzxMhFKWr1gsxBVu6WHh53ZZEvWkGgzrkM6Y7Q\"]}},\"version\":1}","metadata":{"compiler":{"version":"0.8.28+commit.7893614a"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"bytes32","name":"updateClientProgramVkey","type":"bytes32"},{"internalType":"bytes32","name":"membershipProgramVkey","type":"bytes32"},{"internalType":"bytes32","name":"updateClientAndMembershipProgramVkey","type":"bytes32"},{"internalType":"bytes32","name":"misbehaviourProgramVkey","type":"bytes32"},{"internalType":"address","name":"sp1Verifier","type":"address"},{"internalType":"bytes","name":"_clientState","type":"bytes"},{"internalType":"bytes32","name":"_consensusState","type":"bytes32"},{"internalType":"address","name":"roleManager","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"type":"error","name":"AccessControlBadConfirmation"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bytes32","name":"neededRole","type":"bytes32"}],"type":"error","name":"AccessControlUnauthorizedAccount"},{"inputs":[{"internalType":"address","name":"target","type":"address"}],"type":"error","name":"AddressEmptyCode"},{"inputs":[],"type":"error","name":"CannotHandleMisbehavior"},{"inputs":[{"internalType":"string","name":"expected","type":"string"},{"internalType":"string","name":"actual","type":"string"}],"type":"error","name":"ChainIdMismatch"},{"inputs":[{"internalType":"bytes","name":"expected","type":"bytes"},{"internalType":"bytes","name":"actual","type":"bytes"}],"type":"error","name":"ClientStateMismatch"},{"inputs":[{"internalType":"bytes32","name":"expected","type":"bytes32"},{"internalType":"bytes32","name":"actual","type":"bytes32"}],"type":"error","name":"ConsensusStateHashMismatch"},{"inputs":[],"type":"error","name":"ConsensusStateNotFound"},{"inputs":[{"internalType":"bytes32","name":"expected","type":"bytes32"},{"internalType":"bytes32","name":"actual","type":"bytes32"}],"type":"error","name":"ConsensusStateRootMismatch"},{"inputs":[],"type":"error","name":"EmptyValue"},{"inputs":[],"type":"error","name":"FailedCall"},{"inputs":[],"type":"error","name":"FeatureNotSupported"},{"inputs":[],"type":"error","name":"FrozenClientState"},{"inputs":[],"type":"error","name":"InvalidMembershipProof"},{"inputs":[{"internalType":"bytes[]","name":"path","type":"bytes[]"},{"internalType":"bytes","name":"value","type":"bytes"}],"type":"error","name":"KeyValuePairNotInCache"},{"inputs":[{"internalType":"uint256","name":"length","type":"uint256"},{"internalType":"uint256","name":"min","type":"uint256"},{"internalType":"uint256","name":"max","type":"uint256"}],"type":"error","name":"LengthIsOutOfRange"},{"inputs":[{"internalType":"bytes[]","name":"path","type":"bytes[]"}],"type":"error","name":"MembershipProofKeyNotFound"},{"inputs":[{"internalType":"bytes","name":"expected","type":"bytes"},{"internalType":"bytes","name":"actual","type":"bytes"}],"type":"error","name":"MembershipProofValueMismatch"},{"inputs":[{"internalType":"uint64","name":"expectedRevisionNumber","type":"uint64"},{"internalType":"uint64","name":"expectedRevisionHeight","type":"uint64"},{"internalType":"uint64","name":"actualRevisionNumber","type":"uint64"},{"internalType":"uint64","name":"actualRevisionHeight","type":"uint64"}],"type":"error","name":"ProofHeightMismatch"},{"inputs":[{"internalType":"uint256","name":"now","type":"uint256"},{"internalType":"uint256","name":"proofTimestamp","type":"uint256"}],"type":"error","name":"ProofIsInTheFuture"},{"inputs":[{"internalType":"uint256","name":"now","type":"uint256"},{"internalType":"uint256","name":"proofTimestamp","type":"uint256"}],"type":"error","name":"ProofIsTooOld"},{"inputs":[{"internalType":"uint256","name":"expectedNumerator","type":"uint256"},{"internalType":"uint256","name":"expectedDenominator","type":"uint256"},{"internalType":"uint256","name":"actualNumerator","type":"uint256"},{"internalType":"uint256","name":"actualDenominator","type":"uint256"}],"type":"error","name":"TrustThresholdMismatch"},{"inputs":[{"internalType":"uint256","name":"expected","type":"uint256"},{"internalType":"uint256","name":"actual","type":"uint256"}],"type":"error","name":"TrustingPeriodMismatch"},{"inputs":[{"internalType":"uint256","name":"trustingPeriod","type":"uint256"},{"internalType":"uint256","name":"unbondingPeriod","type":"uint256"}],"type":"error","name":"TrustingPeriodTooLong"},{"inputs":[{"internalType":"uint256","name":"expected","type":"uint256"},{"internalType":"uint256","name":"actual","type":"uint256"}],"type":"error","name":"UnbondingPeriodMismatch"},{"inputs":[{"internalType":"uint8","name":"proofType","type":"uint8"}],"type":"error","name":"UnknownMembershipProofType"},{"inputs":[{"internalType":"uint8","name":"algorithm","type":"uint8"}],"type":"error","name":"UnknownZkAlgorithm"},{"inputs":[{"internalType":"bytes32","name":"expected","type":"bytes32"},{"internalType":"bytes32","name":"actual","type":"bytes32"}],"type":"error","name":"VerificationKeyMismatch"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32","indexed":true},{"internalType":"bytes32","name":"previousAdminRole","type":"bytes32","indexed":true},{"internalType":"bytes32","name":"newAdminRole","type":"bytes32","indexed":true}],"type":"event","name":"RoleAdminChanged","anonymous":false},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32","indexed":true},{"internalType":"address","name":"account","type":"address","indexed":true},{"internalType":"address","name":"sender","type":"address","indexed":true}],"type":"event","name":"RoleGranted","anonymous":false},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32","indexed":true},{"internalType":"address","name":"account","type":"address","indexed":true},{"internalType":"address","name":"sender","type":"address","indexed":true}],"type":"event","name":"RoleRevoked","anonymous":false},{"inputs":[],"stateMutability":"view","type":"function","name":"ALLOWED_SP1_CLOCK_DRIFT","outputs":[{"internalType":"uint16","name":"","type":"uint16"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"MEMBERSHIP_PROGRAM_VKEY","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"MISBEHAVIOUR_PROGRAM_VKEY","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"PROOF_SUBMITTER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"UPDATE_CLIENT_AND_MEMBERSHIP_PROGRAM_VKEY","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"UPDATE_CLIENT_PROGRAM_VKEY","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"VERIFIER","outputs":[{"internalType":"contract ISP1Verifier","name":"","type":"address"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"clientState","outputs":[{"internalType":"string","name":"chainId","type":"string"},{"internalType":"struct IICS07TendermintMsgs.TrustThreshold","name":"trustLevel","type":"tuple","components":[{"internalType":"uint8","name":"numerator","type":"uint8"},{"internalType":"uint8","name":"denominator","type":"uint8"}]},{"internalType":"struct IICS02ClientMsgs.Height","name":"latestHeight","type":"tuple","components":[{"internalType":"uint64","name":"revisionNumber","type":"uint64"},{"internalType":"uint64","name":"revisionHeight","type":"uint64"}]},{"internalType":"uint32","name":"trustingPeriod","type":"uint32"},{"internalType":"uint32","name":"unbondingPeriod","type":"uint32"},{"internalType":"bool","name":"isFrozen","type":"bool"},{"internalType":"enum IICS07TendermintMsgs.SupportedZkAlgorithm","name":"zkAlgorithm","type":"uint8"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"getClientState","outputs":[{"internalType":"bytes","name":"","type":"bytes"}]},{"inputs":[{"internalType":"uint64","name":"revisionHeight","type":"uint64"}],"stateMutability":"view","type":"function","name":"getConsensusStateHash","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}]},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"stateMutability":"view","type":"function","name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}]},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"stateMutability":"nonpayable","type":"function","name":"grantRole"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"stateMutability":"view","type":"function","name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}]},{"inputs":[{"internalType":"bytes","name":"misbehaviourMsg","type":"bytes"}],"stateMutability":"nonpayable","type":"function","name":"misbehaviour"},{"inputs":[{"internalType":"bytes[]","name":"data","type":"bytes[]"}],"stateMutability":"nonpayable","type":"function","name":"multicall","outputs":[{"internalType":"bytes[]","name":"results","type":"bytes[]"}]},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"callerConfirmation","type":"address"}],"stateMutability":"nonpayable","type":"function","name":"renounceRole"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"stateMutability":"nonpayable","type":"function","name":"revokeRole"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"stateMutability":"view","type":"function","name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}]},{"inputs":[{"internalType":"bytes","name":"updateMsg","type":"bytes"}],"stateMutability":"nonpayable","type":"function","name":"updateClient","outputs":[{"internalType":"enum ILightClientMsgs.UpdateResult","name":"","type":"uint8"}]},{"inputs":[{"internalType":"struct ILightClientMsgs.MsgVerifyMembership","name":"msg_","type":"tuple","components":[{"internalType":"bytes","name":"proof","type":"bytes"},{"internalType":"struct IICS02ClientMsgs.Height","name":"proofHeight","type":"tuple","components":[{"internalType":"uint64","name":"revisionNumber","type":"uint64"},{"internalType":"uint64","name":"revisionHeight","type":"uint64"}]},{"internalType":"bytes[]","name":"path","type":"bytes[]"},{"internalType":"bytes","name":"value","type":"bytes"}]}],"stateMutability":"nonpayable","type":"function","name":"verifyMembership","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[{"internalType":"struct ILightClientMsgs.MsgVerifyNonMembership","name":"msg_","type":"tuple","components":[{"internalType":"bytes","name":"proof","type":"bytes"},{"internalType":"struct IICS02ClientMsgs.Height","name":"proofHeight","type":"tuple","components":[{"internalType":"uint64","name":"revisionNumber","type":"uint64"},{"internalType":"uint64","name":"revisionHeight","type":"uint64"}]},{"internalType":"bytes[]","name":"path","type":"bytes[]"}]}],"stateMutability":"nonpayable","type":"function","name":"verifyNonMembership","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]}],"devdoc":{"kind":"dev","methods":{"constructor":{"params":{"_clientState":"The encoded initial client state.","_consensusState":"The encoded initial consensus state.","membershipProgramVkey":"The verification key for the verify (non)membership program.","misbehaviourProgramVkey":"The verification key for the misbehaviour program.","roleManager":"Manages the proof submitters and can submit proofs. Should be the ICS26Router if used in IBC.","sp1Verifier":"The address of the SP1 verifier contract.","updateClientAndMembershipProgramVkey":"The verification key for the update client and membership program.","updateClientProgramVkey":"The verification key for the update client program."}},"getClientState()":{"returns":{"_0":"The client state."}},"getConsensusStateHash(uint64)":{"params":{"revisionHeight":"The revision height."},"returns":{"_0":"The consensus state at the given revision height."}},"getRoleAdmin(bytes32)":{"details":"Returns the admin role that controls `role`. See {grantRole} and {revokeRole}. To change a role's admin, use {_setRoleAdmin}."},"grantRole(bytes32,address)":{"details":"Grants `role` to `account`. If `account` had not been already granted `role`, emits a {RoleGranted} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleGranted} event."},"hasRole(bytes32,address)":{"details":"Returns `true` if `account` has been granted `role`."},"misbehaviour(bytes)":{"details":"The misbehavior is verfied in the sp1 program. Here we only check the public values which contain the trusted headers.","params":{"misbehaviourMsg":"The misbehaviour message"}},"multicall(bytes[])":{"custom:oz-upgrades-unsafe-allow-reachable":"delegatecall","details":"Receives and executes a batch of function calls on this contract."},"renounceRole(bytes32,address)":{"details":"Revokes `role` from the calling account. Roles are often managed via {grantRole} and {revokeRole}: this function's purpose is to provide a mechanism for accounts to lose their privileges if they are compromised (such as when a trusted device is misplaced). If the calling account had been revoked `role`, emits a {RoleRevoked} event. Requirements: - the caller must be `callerConfirmation`. May emit a {RoleRevoked} event."},"revokeRole(bytes32,address)":{"details":"Revokes `role` from `account`. If `account` had been granted `role`, emits a {RoleRevoked} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleRevoked} event."},"supportsInterface(bytes4)":{"details":"Returns true if this contract implements the interface defined by `interfaceId`. See the corresponding https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[ERC section] to learn more about how these ids are created. This function call must use less than 30 000 gas."},"updateClient(bytes)":{"details":"This function verifies the public values and forwards the proof to the SP1 verifier.","params":{"updateMsg":"The encoded update message e.g., an SP1 proof."},"returns":{"_0":"The result of the update operation"}},"verifyMembership((bytes,(uint64,uint64),bytes[],bytes))":{"details":"Notice that this message is not view, as it may update the client state for caching purposes.","params":{"msg_":"The membership message"},"returns":{"_0":"The unix timestamp of the verification height in the counterparty chain in seconds."}},"verifyNonMembership((bytes,(uint64,uint64),bytes[]))":{"details":"Notice that this message is not view, as it may update the client state for caching purposes.","params":{"msg_":"The membership message"},"returns":{"_0":"The unix timestamp of the verification height in the counterparty chain in seconds."}}},"version":1},"userdoc":{"kind":"user","methods":{"ALLOWED_SP1_CLOCK_DRIFT()":{"notice":"Constant allowed prover clock drift in seconds."},"MEMBERSHIP_PROGRAM_VKEY()":{"notice":"Immutable membership program verification key."},"MISBEHAVIOUR_PROGRAM_VKEY()":{"notice":"Immutable misbehaviour program verification key."},"PROOF_SUBMITTER_ROLE()":{"notice":"The role identifier for the proof submitter role"},"UPDATE_CLIENT_AND_MEMBERSHIP_PROGRAM_VKEY()":{"notice":"Immutable update client and membership program verification key."},"UPDATE_CLIENT_PROGRAM_VKEY()":{"notice":"Immutable update client program verification key."},"VERIFIER()":{"notice":"Immutable SP1 verifier contract address."},"clientState()":{"notice":"The ICS07Tendermint client state"},"constructor":{"notice":"The constructor sets the program verification key and the initial client and consensus states."},"getClientState()":{"notice":"Returns the client state."},"getConsensusStateHash(uint64)":{"notice":"Returns the consensus state keccak256 hash at the given revision height."},"misbehaviour(bytes)":{"notice":"Misbehaviour handling, moves the light client to the frozen state if misbehaviour is detected"},"updateClient(bytes)":{"notice":"Updating the client and consensus state"},"verifyMembership((bytes,(uint64,uint64),bytes[],bytes))":{"notice":"Querying the membership of a key-value pair"},"verifyNonMembership((bytes,(uint64,uint64),bytes[]))":{"notice":"Querying the non-membership of a key"}},"version":1}},"settings":{"remappings":["@openzeppelin-contracts/=node_modules/@openzeppelin/contracts/","@openzeppelin-upgradeable/=node_modules/@openzeppelin/contracts-upgradeable/","@openzeppelin/=node_modules/@openzeppelin/","@sp1-contracts/=node_modules/sp1-contracts/contracts/src/","@uniswap/permit2/=node_modules/@uniswap/permit2/","forge-std/=node_modules/forge-std/src/","sp1-contracts/=node_modules/sp1-contracts/"],"optimizer":{"enabled":true,"runs":10000},"metadata":{"bytecodeHash":"none"},"compilationTarget":{"contracts/light-clients/sp1-ics07/SP1ICS07Tendermint.sol":"SP1ICS07Tendermint"},"evmVersion":"cancun","libraries":{},"viaIR":true},"sources":{"contracts/interfaces/ILightClient.sol":{"keccak256":"0x3b2361546ee834a442d844c979fbad3458ee13146b093f585587a09e19a266af","urls":["bzz-raw://5b5d53101bb598f14a79cb1092479736fa18e8f84945ea6ef80f4dac84466042","dweb:/ipfs/QmaTCo6M3Z9aYCSX65AQtixo1sB4ymQUDAgTXSKHqJHGDh"],"license":"Apache-2.0"},"contracts/light-clients/sp1-ics07/SP1ICS07Tendermint.sol":{"keccak256":"0x3e2b4354c5d91484f6a77473b5ce478de3d7156a2d267cb3799ce8f052a4ffba","urls":["bzz-raw://990de6d73b4e7560a9eaa879481feda3917f47ab6af035868b1af396e67ec198","dweb:/ipfs/QmZutWg3B1fofn7VzpTqXi8Qknobdr592KSxCAVKUJDJg5"],"license":"Apache-2.0"},"contracts/light-clients/sp1-ics07/errors/ISP1ICS07TendermintErrors.sol":{"keccak256":"0x3460656846878c1e2ce7dbfd2b4ecb4e32906cc3703b1a3401ce665cd756dcc3","urls":["bzz-raw://c6d3fc12f236e9cf823a882338e1f87ca97384a5c3d5b1150eb39d35ab527d87","dweb:/ipfs/QmVRrav4NbauHVShNtA5SvrrhZSUrwXX3rqDayrMiqKUWJ"],"license":"Apache-2.0"},"contracts/light-clients/sp1-ics07/interfaces/ISP1ICS07Tendermint.sol":{"keccak256":"0x54c633827f1a455060d941aecf4ddd629c3ed2d422c309c2eaa8b5c9536329e8","urls":["bzz-raw://6c5cf4ff32cf8c7d392dc24eb4d959e487104b0539bfc1f62a3899b72ce7afe4","dweb:/ipfs/QmQPXSJ6x26gXUg9Dso9bktAdG4E7wMhReupFMyGLMMaFX"],"license":"Apache-2.0"},"contracts/light-clients/sp1-ics07/msgs/IICS07TendermintMsgs.sol":{"keccak256":"0x8d77a9f176e2897a85a349afdc7661d48bc62fd403e8e41794578c25b611b599","urls":["bzz-raw://d96574ec9152f4c26e5f9a666d1887d3db25265f46ddd10c619433aa075ff97e","dweb:/ipfs/QmfWEtkZspYtRKzgB4ppkN9DwAPVqDsBZcViUJYExyprL4"],"license":"Apache-2.0"},"contracts/light-clients/sp1-ics07/msgs/IMembershipMsgs.sol":{"keccak256":"0x1314aa3eb8567d0f26f303e7b6341009a0bc755bf4293b9326e5e607b5eb8bf5","urls":["bzz-raw://e3b01f086562ba146a54b8e1255d3ba356cd9ac47a9e31650ebca0ea7e0c21da","dweb:/ipfs/Qma43UYbSA2FwYJKvY1APDZAqvEQccE7gtYtNHYMwMXj9o"],"license":"Apache-2.0"},"contracts/light-clients/sp1-ics07/msgs/IMisbehaviourMsgs.sol":{"keccak256":"0x0e67f4b02ca8314bea5d9cb1b86a56961871a35fab8bfa420ad6e9a534918d2b","urls":["bzz-raw://ebb8a2af8276cc1b9fd23877d0cace5270e8bdb0ae38c033a373d97d1fa3bf5e","dweb:/ipfs/QmYHqw3iTKKN7kw1foeP896XwB1SxE1xQD1RcpsoS2uorp"],"license":"Apache-2.0"},"contracts/light-clients/sp1-ics07/msgs/ISP1Msgs.sol":{"keccak256":"0xdb31e69fad51c6875c51240f10e4b9de73869e3175c86f9d21eefa68737f3511","urls":["bzz-raw://b5a7128f622d096dc914232268b01fbb95e3bd988bf78f1072e5d54341be4029","dweb:/ipfs/QmU4GeqmToWLeZYRsJ4g6zdA9can54n1fHSASF4uFBT7XT"],"license":"Apache-2.0"},"contracts/light-clients/sp1-ics07/msgs/IUcAndMembershipMsgs.sol":{"keccak256":"0x59c5842f974c4fbe8b1fd4ee672313dd1e071971499d791742485eb76d090c8d","urls":["bzz-raw://eccb269297161eaf02cb5a42e9b19b87e523e438c18086f224696a699f78166b","dweb:/ipfs/QmaxyatbUphRHxcnBx8CQtQB8htiHRvAPeopSMtvHutM44"],"license":"Apache-2.0"},"contracts/light-clients/sp1-ics07/msgs/IUpdateClientMsgs.sol":{"keccak256":"0x48b559036506205363c5363564a3e33d774f748a52323517fe9c47359169ddb9","urls":["bzz-raw://c323ba40ced44e2979fd95acb9c3ff2808dcb930913dc6692fe7912266f25f57","dweb:/ipfs/QmYwHJLYXs9qSc9XCBpLFR94Rg43NsACZTDdZioPFDmkGS"],"license":"Apache-2.0"},"contracts/light-clients/sp1-ics07/utils/Paths.sol":{"keccak256":"0xbb62ada9681458b6eb50cf57d867091d9807b2fcad86c0e7bb76131c15dc3c36","urls":["bzz-raw://58a47a038a5ec37dcdc72b6b0fde15c5059325a68f0044da73ba88caa3525e24","dweb:/ipfs/QmPZQxnSSrUJ9LjrKZSwXFCb7NXtUs9kB285m2B8LW7gF4"],"license":"Apache-2.0"},"contracts/msgs/IICS02ClientMsgs.sol":{"keccak256":"0x03d1265eae327c3744d774bf22a30d845233d50664921c9aa57cef2d71fd89d2","urls":["bzz-raw://89900781cc5c60540a237d92d42745ea6165765ee8fb4d50e8137a717195cc75","dweb:/ipfs/Qmbx5p8gZ8sEMMeZytXsLee49JUayhAaoJ2yxX93WUrvQo"],"license":"Apache-2.0"},"contracts/msgs/ILightClientMsgs.sol":{"keccak256":"0x8d1e56ab166a7b4aa6999708e3214a4645ebbc3835c2b2a4c255c9923eebafde","urls":["bzz-raw://8bd4200dc04d950c0f050623fa9a8accdbec877fd446c039d4dd6c678bdf1513","dweb:/ipfs/QmZQTViaA7N6BVNDzJ1Z6w799PrPoE4ajPueZSPwX4sGZ9"],"license":"Apache-2.0"},"node_modules/@openzeppelin/contracts/access/AccessControl.sol":{"keccak256":"0x4686ec784d75f95beaf2bf5b5f26e5f946d4c864aaee9c3c62bdc18381f5e017","urls":["bzz-raw://26710ca191913f3c9df542079c4a6dcff02968e92d4f7357daefef9fbe72a19c","dweb:/ipfs/QmanHbeWuBbVEqXySHa1zhm2rExjYpChDBubBaJNTCa2JB"],"license":"MIT"},"node_modules/@openzeppelin/contracts/access/IAccessControl.sol":{"keccak256":"0xbff9f59c84e5337689161ce7641c0ef8e872d6a7536fbc1f5133f128887aba3c","urls":["bzz-raw://b308f882e796f7b79c9502deacb0a62983035c6f6f4e962b319ba6a1f4a77d3d","dweb:/ipfs/QmaWCW7ahEQqFjwhSUhV7Ae7WhfNvzSpE7DQ58hvEooqPL"],"license":"MIT"},"node_modules/@openzeppelin/contracts/utils/Address.sol":{"keccak256":"0x0fa9e0d3a859900b5a46f70a03c73adf259603d5e05027a37fe0b45529d85346","urls":["bzz-raw://c2add4da0240c9f2ce47649c8bb6b11b40e98cf6f88b8bdc76b2704e89391710","dweb:/ipfs/QmNQTwF2uVzu4CRtNxr8bxyP9XuW6VsZuo2Nr4KR2bZr3d"],"license":"MIT"},"node_modules/@openzeppelin/contracts/utils/Context.sol":{"keccak256":"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2","urls":["bzz-raw://6a708e8a5bdb1011c2c381c9a5cfd8a9a956d7d0a9dc1bd8bcdaf52f76ef2f12","dweb:/ipfs/Qmax9WHBnVsZP46ZxEMNRQpLQnrdE4dK8LehML1Py8FowF"],"license":"MIT"},"node_modules/@openzeppelin/contracts/utils/Errors.sol":{"keccak256":"0x6afa713bfd42cf0f7656efa91201007ac465e42049d7de1d50753a373648c123","urls":["bzz-raw://ba1d02f4847670a1b83dec9f7d37f0b0418d6043447b69f3a29a5f9efc547fcf","dweb:/ipfs/QmQ7iH2keLNUKgq2xSWcRmuBE5eZ3F5whYAkAGzCNNoEWB"],"license":"MIT"},"node_modules/@openzeppelin/contracts/utils/LowLevelCall.sol":{"keccak256":"0x6ba3db1346fc75a832aa6cd075e12f6f1fa172fa2122a020f324c319fe5be75e","urls":["bzz-raw://ab92e9e1cb08144c43fa3a383a87c48f49a652d51156950b928c2a50bee6b3a5","dweb:/ipfs/QmWeKkKZBgLDKgRFGKCzsKybYF7C8g9ysg5kU1b1p7QFBi"],"license":"MIT"},"node_modules/@openzeppelin/contracts/utils/Multicall.sol":{"keccak256":"0x72a5499dfae7676e4298a7299bccd3b27438ba1a4c72df5cd69c1c343c7ea20d","urls":["bzz-raw://de0fb51ccae3a0ff377ed185d187440fc612a71bf8e42fdb0e032ce747fa3eef","dweb:/ipfs/QmPNBaiVsAiUhz8qfXcSy27S7CqBbtSd8rPqmaykKBhw7Q"],"license":"MIT"},"node_modules/@openzeppelin/contracts/utils/TransientSlot.sol":{"keccak256":"0xac673fa1e374d9e6107504af363333e3e5f6344d2e83faf57d9bfd41d77cc946","urls":["bzz-raw://5982478dbbb218e9dd5a6e83f5c0e8d1654ddf20178484b43ef21dd2246809de","dweb:/ipfs/QmaB1hS68n2kG8vTbt7EPEzmrGhkUbfiFyykGGLsAr9X22"],"license":"MIT"},"node_modules/@openzeppelin/contracts/utils/introspection/ERC165.sol":{"keccak256":"0x2d9dc2fe26180f74c11c13663647d38e259e45f95eb88f57b61d2160b0109d3e","urls":["bzz-raw://81233d1f98060113d9922180bb0f14f8335856fe9f339134b09335e9f678c377","dweb:/ipfs/QmWh6R35SarhAn4z2wH8SU456jJSYL2FgucfTFgbHJJN4E"],"license":"MIT"},"node_modules/@openzeppelin/contracts/utils/introspection/IERC165.sol":{"keccak256":"0x8891738ffe910f0cf2da09566928589bf5d63f4524dd734fd9cedbac3274dd5c","urls":["bzz-raw://971f954442df5c2ef5b5ebf1eb245d7105d9fbacc7386ee5c796df1d45b21617","dweb:/ipfs/QmadRjHbkicwqwwh61raUEapaVEtaLMcYbQZWs9gUkgj3u"],"license":"MIT"},"node_modules/sp1-contracts/contracts/src/ISP1Verifier.sol":{"keccak256":"0x9e3ba64860bea920772dcf16be7946de2a2900d80bd51e9c0771184138f4f4d3","urls":["bzz-raw://0ec7230ca1fdd74edc6ab597d80bb345282aed3f0db4788ed96b4cc373ff46a3","dweb:/ipfs/QmXPuSS5gzxMhFKWr1gsxBVu6WHh53ZZEvWkGgzrkM6Y7Q"],"license":"MIT"}},"version":1},"id":46} \ No newline at end of file diff --git a/ibc-solidity/contracts/light-clients/besu/BesuIBFT2LightClient.sol b/ibc-solidity/contracts/light-clients/besu/BesuIBFT2LightClient.sol index af08bef04..16a0307eb 100644 --- a/ibc-solidity/contracts/light-clients/besu/BesuIBFT2LightClient.sol +++ b/ibc-solidity/contracts/light-clients/besu/BesuIBFT2LightClient.sol @@ -1,4 +1,4 @@ -// SPDX-License-Identifier: MIT +// SPDX-License-Identifier: Apache-2.0 pragma solidity ^0.8.28; import { BesuLightClientBase } from "./BesuLightClientBase.sol"; diff --git a/ibc-solidity/contracts/light-clients/besu/BesuLightClientBase.sol b/ibc-solidity/contracts/light-clients/besu/BesuLightClientBase.sol index 898f59f97..0aadd31e8 100644 --- a/ibc-solidity/contracts/light-clients/besu/BesuLightClientBase.sol +++ b/ibc-solidity/contracts/light-clients/besu/BesuLightClientBase.sol @@ -1,4 +1,4 @@ -// SPDX-License-Identifier: MIT +// SPDX-License-Identifier: Apache-2.0 pragma solidity ^0.8.28; // solhint-disable gas-struct-packing, named-parameters-mapping, gas-strict-inequalities, code-complexity @@ -351,8 +351,8 @@ abstract contract BesuLightClientBase is ILightClient, IBesuLightClientErrors, I if (uint8(seal[64]) < 27) { seal[64] = bytes1(uint8(seal[64]) + 27); } - (address signer, ECDSA.RecoverError err,) = ECDSA.tryRecover(digest, seal); - if (err != ECDSA.RecoverError.NoError || signer == address(0)) { + (address signer, ECDSA.RecoverError err, bytes32 errorArgument) = ECDSA.tryRecover(digest, seal); + if (err != ECDSA.RecoverError.NoError || errorArgument != bytes32(0) || signer == address(0)) { revert InvalidCommitSeal(); } return signer; @@ -368,7 +368,7 @@ abstract contract BesuLightClientBase is ILightClient, IBesuLightClientErrors, I internal view { - uint256 actual; + uint256 actual = 0; for (uint256 i = 0; i < signers.length; ++i) { if (_containsStorage(trustedValidators, signers[i])) { ++actual; @@ -385,7 +385,7 @@ abstract contract BesuLightClientBase is ILightClient, IBesuLightClientErrors, I /// @param signers The recovered commit seal signers. /// @param validators The validator set from the submitted header. function _checkValidatorQuorum(address[] memory signers, address[] memory validators) internal pure { - uint256 actual; + uint256 actual = 0; for (uint256 i = 0; i < signers.length; ++i) { if (_containsMemory(validators, signers[i])) { ++actual; @@ -517,7 +517,7 @@ abstract contract BesuLightClientBase is ILightClient, IBesuLightClientErrors, I /// @param items RLP-encoded list items. /// @return The RLP-encoded list. function _encodeRlpList(bytes[] memory items) internal pure returns (bytes memory) { - bytes memory payload; + bytes memory payload = new bytes(0); for (uint256 i = 0; i < items.length; ++i) { payload = bytes.concat(payload, items[i]); } diff --git a/ibc-solidity/contracts/light-clients/besu/BesuQBFTLightClient.sol b/ibc-solidity/contracts/light-clients/besu/BesuQBFTLightClient.sol index 01e0a0843..bf6955694 100644 --- a/ibc-solidity/contracts/light-clients/besu/BesuQBFTLightClient.sol +++ b/ibc-solidity/contracts/light-clients/besu/BesuQBFTLightClient.sol @@ -1,4 +1,4 @@ -// SPDX-License-Identifier: MIT +// SPDX-License-Identifier: Apache-2.0 pragma solidity ^0.8.28; import { BesuLightClientBase } from "./BesuLightClientBase.sol"; diff --git a/ibc-solidity/contracts/light-clients/besu/MPTProof.sol b/ibc-solidity/contracts/light-clients/besu/MPTProof.sol index 3b761c0b9..a90e87184 100644 --- a/ibc-solidity/contracts/light-clients/besu/MPTProof.sol +++ b/ibc-solidity/contracts/light-clients/besu/MPTProof.sol @@ -58,7 +58,7 @@ library MPTProof { returns (bytes memory value) { uint256 mptKeyOffset = 0; - bytes32 nodeHashHash; + bytes32 nodeHashHash = bytes32(0); RLPReader.RLPItem[] memory node; RLPReader.RLPItem memory rlpValue; diff --git a/ibc-solidity/contracts/light-clients/besu/errors/IBesuLightClientErrors.sol b/ibc-solidity/contracts/light-clients/besu/errors/IBesuLightClientErrors.sol index 7485ccb94..80e26ff9e 100644 --- a/ibc-solidity/contracts/light-clients/besu/errors/IBesuLightClientErrors.sol +++ b/ibc-solidity/contracts/light-clients/besu/errors/IBesuLightClientErrors.sol @@ -1,4 +1,4 @@ -// SPDX-License-Identifier: MIT +// SPDX-License-Identifier: Apache-2.0 pragma solidity ^0.8.28; /// @title Besu Light Client Errors diff --git a/ibc-solidity/contracts/light-clients/besu/msgs/IBesuLightClientMsgs.sol b/ibc-solidity/contracts/light-clients/besu/msgs/IBesuLightClientMsgs.sol index 84f193090..5617e9f65 100644 --- a/ibc-solidity/contracts/light-clients/besu/msgs/IBesuLightClientMsgs.sol +++ b/ibc-solidity/contracts/light-clients/besu/msgs/IBesuLightClientMsgs.sol @@ -1,4 +1,4 @@ -// SPDX-License-Identifier: MIT +// SPDX-License-Identifier: Apache-2.0 pragma solidity ^0.8.28; import { IICS02ClientMsgs } from "../../../msgs/IICS02ClientMsgs.sol"; diff --git a/ibc-solidity/contracts/light-clients/dummy/DummyLightClient.sol b/ibc-solidity/contracts/light-clients/dummy/DummyLightClient.sol index a58700171..631f01fe1 100644 --- a/ibc-solidity/contracts/light-clients/dummy/DummyLightClient.sol +++ b/ibc-solidity/contracts/light-clients/dummy/DummyLightClient.sol @@ -1,4 +1,4 @@ -// SPDX-License-Identifier: MIT +// SPDX-License-Identifier: Apache-2.0 pragma solidity ^0.8.28; import { ILightClient } from "../../interfaces/ILightClient.sol"; diff --git a/ibc-solidity/test/besu-bft/BesuIBFT2LightClient.t.sol b/ibc-solidity/test/besu-bft/BesuIBFT2LightClient.t.sol index 3381d339d..189e7478a 100644 --- a/ibc-solidity/test/besu-bft/BesuIBFT2LightClient.t.sol +++ b/ibc-solidity/test/besu-bft/BesuIBFT2LightClient.t.sol @@ -1,4 +1,4 @@ -// SPDX-License-Identifier: MIT +// SPDX-License-Identifier: Apache-2.0 pragma solidity ^0.8.28; import { BesuIBFT2LightClient } from "../../contracts/light-clients/besu/BesuIBFT2LightClient.sol"; diff --git a/ibc-solidity/test/besu-bft/BesuLightClientTestBase.sol b/ibc-solidity/test/besu-bft/BesuLightClientTestBase.sol index 0ed16eb0c..aeec957c1 100644 --- a/ibc-solidity/test/besu-bft/BesuLightClientTestBase.sol +++ b/ibc-solidity/test/besu-bft/BesuLightClientTestBase.sol @@ -1,4 +1,4 @@ -// SPDX-License-Identifier: MIT +// SPDX-License-Identifier: Apache-2.0 pragma solidity ^0.8.28; // solhint-disable gas-struct-packing diff --git a/ibc-solidity/test/besu-bft/BesuQBFTLightClient.t.sol b/ibc-solidity/test/besu-bft/BesuQBFTLightClient.t.sol index aea974543..4eaf77dc8 100644 --- a/ibc-solidity/test/besu-bft/BesuQBFTLightClient.t.sol +++ b/ibc-solidity/test/besu-bft/BesuQBFTLightClient.t.sol @@ -1,4 +1,4 @@ -// SPDX-License-Identifier: MIT +// SPDX-License-Identifier: Apache-2.0 pragma solidity ^0.8.28; import { BesuIBFT2LightClient } from "../../contracts/light-clients/besu/BesuIBFT2LightClient.sol"; diff --git a/ibc-solidity/test/dummy-lc/DummyLightClientTest.t.sol b/ibc-solidity/test/dummy-lc/DummyLightClientTest.t.sol index 347df198a..14ba7b72b 100644 --- a/ibc-solidity/test/dummy-lc/DummyLightClientTest.t.sol +++ b/ibc-solidity/test/dummy-lc/DummyLightClientTest.t.sol @@ -1,4 +1,4 @@ -// SPDX-License-Identifier: MIT +// SPDX-License-Identifier: Apache-2.0 pragma solidity ^0.8.28; import { Test } from "forge-std/Test.sol"; diff --git a/packages/go-abigen/attestation/contract.go b/packages/go-abigen/attestation/contract.go index 661e57d90..1c48488a5 100644 --- a/packages/go-abigen/attestation/contract.go +++ b/packages/go-abigen/attestation/contract.go @@ -4,9 +4,11 @@ package attestation import ( + "context" "errors" "math/big" "strings" + "time" ethereum "github.com/ethereum/go-ethereum" "github.com/ethereum/go-ethereum/accounts/abi" @@ -27,6 +29,8 @@ var ( _ = types.BloomLookup _ = event.NewSubscription _ = abi.ConvertType + _ = time.Tick + _ = context.Background ) // IICS02ClientMsgsHeight is an auto generated low-level Go binding around an user-defined struct. diff --git a/packages/go-abigen/dummy/contract.go b/packages/go-abigen/dummy/contract.go index 445d3772d..74006c8d2 100644 --- a/packages/go-abigen/dummy/contract.go +++ b/packages/go-abigen/dummy/contract.go @@ -4,9 +4,11 @@ package dummy import ( + "context" "errors" "math/big" "strings" + "time" ethereum "github.com/ethereum/go-ethereum" "github.com/ethereum/go-ethereum/accounts/abi" @@ -27,6 +29,8 @@ var ( _ = types.BloomLookup _ = event.NewSubscription _ = abi.ConvertType + _ = time.Tick + _ = context.Background ) // IICS02ClientMsgsHeight is an auto generated low-level Go binding around an user-defined struct. @@ -53,12 +57,34 @@ type ILightClientMsgsMsgVerifyNonMembership struct { // ContractMetaData contains all meta data concerning the Contract contract. var ContractMetaData = &bind.MetaData{ ABI: "[{\"type\":\"function\",\"name\":\"getClientState\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"misbehaviour\",\"inputs\":[{\"name\":\"\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"updateClient\",\"inputs\":[{\"name\":\"updateMsg\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"enumILightClientMsgs.UpdateResult\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"verifyMembership\",\"inputs\":[{\"name\":\"msg_\",\"type\":\"tuple\",\"internalType\":\"structILightClientMsgs.MsgVerifyMembership\",\"components\":[{\"name\":\"proof\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"proofHeight\",\"type\":\"tuple\",\"internalType\":\"structIICS02ClientMsgs.Height\",\"components\":[{\"name\":\"revisionNumber\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"revisionHeight\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"name\":\"path\",\"type\":\"bytes[]\",\"internalType\":\"bytes[]\"},{\"name\":\"value\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"verifyNonMembership\",\"inputs\":[{\"name\":\"msg_\",\"type\":\"tuple\",\"internalType\":\"structILightClientMsgs.MsgVerifyNonMembership\",\"components\":[{\"name\":\"proof\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"proofHeight\",\"type\":\"tuple\",\"internalType\":\"structIICS02ClientMsgs.Height\",\"components\":[{\"name\":\"revisionNumber\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"revisionHeight\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"name\":\"path\",\"type\":\"bytes[]\",\"internalType\":\"bytes[]\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"error\",\"name\":\"MembershipExists\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"MissingMembership\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"UnknownHeight\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ValueMismatch\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ZeroTimestamp\",\"inputs\":[]}]", + Bin: "0x60808060405234601557610ab7908161001a8239f35b5f80fdfe6080806040526004361015610012575f80fd5b5f3560e01c9081630bece356146102ac575080634d6d9ffb1461020d578063682ed5f0146100d2578063ddba6537146100c25763ef913a4b14610053575f80fd5b346100be575f6003193601126100be576100ba60405167ffffffffffffffff5f54818116602084015260401c16604082015267ffffffffffffffff600154166060820152606081526100a66080826107a9565b604051918291602083526020830190610768565b0390f35b5f80fd5b346100be576100d036610717565b005b346100be5760206003193601126100be5760043567ffffffffffffffff81116100be578036039060a06003198301126100be57602481019161012d61011684610929565b93610127606485018560040161085d565b9161098f565b5f52600360205260405f20549182156101e5577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdd608482013592018212156100be570160048101359067ffffffffffffffff82116100be5760240181360381136100be5761019c9136916107f9565b60208151910120036101bd5760209067ffffffffffffffff60405191168152f35b7fdd8e4af7000000000000000000000000000000000000000000000000000000005f5260045ffd5b7ff6b593a3000000000000000000000000000000000000000000000000000000005f5260045ffd5b346100be5760206003193601126100be5760043567ffffffffffffffff81116100be57608060031982360301126100be5761025f6024820161012761025182610929565b93606481019060040161085d565b5f52600360205260405f20546102845760209067ffffffffffffffff60405191168152f35b7f679fc91d000000000000000000000000000000000000000000000000000000005f5260045ffd5b346100be576102ba36610717565b8101906020818303126100be5780359067ffffffffffffffff82116100be570191828203608081126100be57606082019082821067ffffffffffffffff8311176106ea576040918252126100be576040516103148161078d565b61031d846107cc565b815261032b602085016107cc565b6020820152815261033e604084016107cc565b926020820193845260608101359067ffffffffffffffff82116100be57019180601f840112156100be57823592610374846107e1565b9361038260405195866107a9565b80855260208086019160051b830101918383116100be5760208101915b8383106105ef578787876040810191825267ffffffffffffffff835116156105c757519167ffffffffffffffff80845116916103e3602086019383855116906108b1565b82825116905f52600260205260405f20907fffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000825416179055511680602060405161042c8161078d565b868152015267ffffffffffffffff8451167fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000005f5416175f5581517fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff6fffffffffffffffff00000000000000005f549260401b169116175f557fffffffffffffffffffffffffffffffffffffffffffffffff000000000000000060015416176001555f5b825180518210156105bd576020908260051b010151805160405160208101916040820160208452815180915260608301602060608360051b8601019301915f5b81811061057657505050506001949392826105386020946105599403601f1981018352826107a9565b51902067ffffffffffffffff89511667ffffffffffffffff885116906108e3565b91015160208151910120905f52600360205260405f2055016104cf565b909192936020806105b1837fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa08a600196030188528851610768565b9601940192910161050f565b60206040515f8152f35b7fda16d767000000000000000000000000000000000000000000000000000000005f5260045ffd5b823567ffffffffffffffff81116100be578201906040601f1983880301126100be576040519061061e8261078d565b602083013567ffffffffffffffff81116100be5760209084010187601f820112156100be57803561064e816107e1565b9161065c60405193846107a9565b81835260208084019260051b820101918a83116100be5760208201905b8382106106bc5750505050825260408301359167ffffffffffffffff83116100be576106ad8860208096958196010161083f565b8382015281520192019161039f565b813567ffffffffffffffff81116100be576020916106df8e84809488010161083f565b815201910190610679565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b9060206003198301126100be5760043567ffffffffffffffff81116100be57826023820112156100be5780600401359267ffffffffffffffff84116100be57602484830101116100be576024019190565b90601f19601f602080948051918291828752018686015e5f8582860101520116010190565b6040810190811067ffffffffffffffff8211176106ea57604052565b90601f601f19910116810190811067ffffffffffffffff8211176106ea57604052565b359067ffffffffffffffff821682036100be57565b67ffffffffffffffff81116106ea5760051b60200190565b92919267ffffffffffffffff82116106ea57604051916108236020601f19601f84011601846107a9565b8294818452818301116100be578281602093845f960137010152565b9080601f830112156100be5781602061085a933591016107f9565b90565b9035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1813603018212156100be570180359067ffffffffffffffff82116100be57602001918160051b360383136100be57565b9067ffffffffffffffff60405191816020840194168452166040820152604081526108dd6060826107a9565b51902090565b9167ffffffffffffffff604051928160208501951685521660408301526060820152606081526108dd6080826107a9565b3567ffffffffffffffff811681036100be5790565b61094890610942602061093b83610914565b9201610914565b906108b1565b5f52600260205267ffffffffffffffff60405f20541680156109675790565b7f8da291bd000000000000000000000000000000000000000000000000000000005f5260045ffd5b909291926109a860206109a184610914565b9301610914565b90604051946020860191816040880160208552526060870160608360051b89010192825f907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1813603015b838310610a215750505050505094610a188161085a969703601f1981018352826107a9565b519020916108e3565b9091929394957fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa08c82030186528635828112156100be578301906020823592019167ffffffffffffffff81116100be5780360383136100be57602082601f19601f8480600198869897879852868601375f848201860152011601019801960194930191906109f356fea164736f6c634300081c000a", } // ContractABI is the input ABI used to generate the binding from. // Deprecated: Use ContractMetaData.ABI instead. var ContractABI = ContractMetaData.ABI +// ContractBin is the compiled bytecode used for deploying new contracts. +// Deprecated: Use ContractMetaData.Bin instead. +var ContractBin = ContractMetaData.Bin + +// DeployContract deploys a new Ethereum contract, binding an instance of Contract to it. +func DeployContract(auth *bind.TransactOpts, backend bind.ContractBackend) (common.Address, *types.Transaction, *Contract, error) { + parsed, err := ContractMetaData.GetAbi() + if err != nil { + return common.Address{}, nil, nil, err + } + if parsed == nil { + return common.Address{}, nil, nil, errors.New("GetABI returned nil") + } + + address, tx, contract, err := bind.DeployContract(auth, *parsed, common.FromHex(ContractBin), backend) + if err != nil { + return common.Address{}, nil, nil, err + } + return address, tx, &Contract{ContractCaller: ContractCaller{contract: contract}, ContractTransactor: ContractTransactor{contract: contract}, ContractFilterer: ContractFilterer{contract: contract}}, nil +} + // Contract is an auto generated Go binding around an Ethereum contract. type Contract struct { ContractCaller // Read-only binding to the contract diff --git a/packages/go-abigen/erc1967proxy/contract.go b/packages/go-abigen/erc1967proxy/contract.go index 1c34aaac1..87ce1b508 100644 --- a/packages/go-abigen/erc1967proxy/contract.go +++ b/packages/go-abigen/erc1967proxy/contract.go @@ -4,9 +4,11 @@ package erc1967proxy import ( + "context" "errors" "math/big" "strings" + "time" ethereum "github.com/ethereum/go-ethereum" "github.com/ethereum/go-ethereum/accounts/abi" @@ -27,6 +29,8 @@ var ( _ = types.BloomLookup _ = event.NewSubscription _ = abi.ConvertType + _ = time.Tick + _ = context.Background ) // ContractMetaData contains all meta data concerning the Contract contract. diff --git a/packages/go-abigen/evmiftsendcall/contract.go b/packages/go-abigen/evmiftsendcall/contract.go index 205b2916f..f129cdba6 100644 --- a/packages/go-abigen/evmiftsendcall/contract.go +++ b/packages/go-abigen/evmiftsendcall/contract.go @@ -4,9 +4,11 @@ package evmiftsendcall import ( + "context" "errors" "math/big" "strings" + "time" ethereum "github.com/ethereum/go-ethereum" "github.com/ethereum/go-ethereum/accounts/abi" @@ -27,6 +29,8 @@ var ( _ = types.BloomLookup _ = event.NewSubscription _ = abi.ConvertType + _ = time.Tick + _ = context.Background ) // ContractMetaData contains all meta data concerning the Contract contract. diff --git a/packages/go-abigen/ibcerc20/contract.go b/packages/go-abigen/ibcerc20/contract.go index 7e73737c1..9f23f4366 100644 --- a/packages/go-abigen/ibcerc20/contract.go +++ b/packages/go-abigen/ibcerc20/contract.go @@ -4,9 +4,11 @@ package ibcerc20 import ( + "context" "errors" "math/big" "strings" + "time" ethereum "github.com/ethereum/go-ethereum" "github.com/ethereum/go-ethereum/accounts/abi" @@ -27,6 +29,8 @@ var ( _ = types.BloomLookup _ = event.NewSubscription _ = abi.ConvertType + _ = time.Tick + _ = context.Background ) // ContractMetaData contains all meta data concerning the Contract contract. diff --git a/packages/go-abigen/ics20transfer/contract.go b/packages/go-abigen/ics20transfer/contract.go index 70bc0c028..aa9e9160f 100644 --- a/packages/go-abigen/ics20transfer/contract.go +++ b/packages/go-abigen/ics20transfer/contract.go @@ -4,9 +4,11 @@ package ics20transfer import ( + "context" "errors" "math/big" "strings" + "time" ethereum "github.com/ethereum/go-ethereum" "github.com/ethereum/go-ethereum/accounts/abi" @@ -27,6 +29,8 @@ var ( _ = types.BloomLookup _ = event.NewSubscription _ = abi.ConvertType + _ = time.Tick + _ = context.Background ) // IIBCAppCallbacksOnAcknowledgementPacketCallback is an auto generated low-level Go binding around an user-defined struct. diff --git a/packages/go-abigen/ics26router/contract.go b/packages/go-abigen/ics26router/contract.go index 6ce815e7e..b4164cf2f 100644 --- a/packages/go-abigen/ics26router/contract.go +++ b/packages/go-abigen/ics26router/contract.go @@ -4,9 +4,11 @@ package ics26router import ( + "context" "errors" "math/big" "strings" + "time" ethereum "github.com/ethereum/go-ethereum" "github.com/ethereum/go-ethereum/accounts/abi" @@ -27,6 +29,8 @@ var ( _ = types.BloomLookup _ = event.NewSubscription _ = abi.ConvertType + _ = time.Tick + _ = context.Background ) // IICS02ClientMsgsCounterpartyInfo is an auto generated low-level Go binding around an user-defined struct. diff --git a/packages/go-abigen/ics27account/contract.go b/packages/go-abigen/ics27account/contract.go index aed2c8f60..570e15957 100644 --- a/packages/go-abigen/ics27account/contract.go +++ b/packages/go-abigen/ics27account/contract.go @@ -4,9 +4,11 @@ package ics27account import ( + "context" "errors" "math/big" "strings" + "time" ethereum "github.com/ethereum/go-ethereum" "github.com/ethereum/go-ethereum/accounts/abi" @@ -27,6 +29,8 @@ var ( _ = types.BloomLookup _ = event.NewSubscription _ = abi.ConvertType + _ = time.Tick + _ = context.Background ) // IICS27AccountMsgsCall is an auto generated low-level Go binding around an user-defined struct. diff --git a/packages/go-abigen/ics27gmp/contract.go b/packages/go-abigen/ics27gmp/contract.go index 83e5d82d9..6f1ea3ddf 100644 --- a/packages/go-abigen/ics27gmp/contract.go +++ b/packages/go-abigen/ics27gmp/contract.go @@ -4,9 +4,11 @@ package ics27gmp import ( + "context" "errors" "math/big" "strings" + "time" ethereum "github.com/ethereum/go-ethereum" "github.com/ethereum/go-ethereum/accounts/abi" @@ -27,6 +29,8 @@ var ( _ = types.BloomLookup _ = event.NewSubscription _ = abi.ConvertType + _ = time.Tick + _ = context.Background ) // IIBCAppCallbacksOnAcknowledgementPacketCallback is an auto generated low-level Go binding around an user-defined struct. diff --git a/packages/go-abigen/ift/contract.go b/packages/go-abigen/ift/contract.go index e685abdfa..943e90c0b 100644 --- a/packages/go-abigen/ift/contract.go +++ b/packages/go-abigen/ift/contract.go @@ -4,9 +4,11 @@ package ift import ( + "context" "errors" "math/big" "strings" + "time" ethereum "github.com/ethereum/go-ethereum" "github.com/ethereum/go-ethereum/accounts/abi" @@ -27,6 +29,8 @@ var ( _ = types.BloomLookup _ = event.NewSubscription _ = abi.ConvertType + _ = time.Tick + _ = context.Background ) // IIBCAppCallbacksOnAcknowledgementPacketCallback is an auto generated low-level Go binding around an user-defined struct. diff --git a/packages/go-abigen/relayerhelper/contract.go b/packages/go-abigen/relayerhelper/contract.go index 863149f37..b4f361ea2 100644 --- a/packages/go-abigen/relayerhelper/contract.go +++ b/packages/go-abigen/relayerhelper/contract.go @@ -4,9 +4,11 @@ package relayerhelper import ( + "context" "errors" "math/big" "strings" + "time" ethereum "github.com/ethereum/go-ethereum" "github.com/ethereum/go-ethereum/accounts/abi" @@ -27,6 +29,8 @@ var ( _ = types.BloomLookup _ = event.NewSubscription _ = abi.ConvertType + _ = time.Tick + _ = context.Background ) // IICS26RouterMsgsPacket is an auto generated low-level Go binding around an user-defined struct. diff --git a/packages/go-abigen/sp1ics07tendermint/contract.go b/packages/go-abigen/sp1ics07tendermint/contract.go index 5c63ac60a..3feda0a48 100644 --- a/packages/go-abigen/sp1ics07tendermint/contract.go +++ b/packages/go-abigen/sp1ics07tendermint/contract.go @@ -4,9 +4,11 @@ package sp1ics07tendermint import ( + "context" "errors" "math/big" "strings" + "time" ethereum "github.com/ethereum/go-ethereum" "github.com/ethereum/go-ethereum/accounts/abi" @@ -27,6 +29,8 @@ var ( _ = types.BloomLookup _ = event.NewSubscription _ = abi.ConvertType + _ = time.Tick + _ = context.Background ) // IICS02ClientMsgsHeight is an auto generated low-level Go binding around an user-defined struct. diff --git a/packages/proof-api/modules/besu-to-besu/src/lib.rs b/packages/proof-api/modules/besu-to-besu/src/lib.rs index 54196558a..70949b813 100644 --- a/packages/proof-api/modules/besu-to-besu/src/lib.rs +++ b/packages/proof-api/modules/besu-to-besu/src/lib.rs @@ -1,3 +1,5 @@ +// SPDX-License-Identifier: Apache-2.0 + //! One-sided Besu-to-Besu proof API module. #![deny(clippy::nursery, clippy::pedantic, warnings, unused_crate_dependencies)] diff --git a/packages/proof-api/modules/besu-to-besu/src/tx_builder.rs b/packages/proof-api/modules/besu-to-besu/src/tx_builder.rs index f1f208739..3137b8133 100644 --- a/packages/proof-api/modules/besu-to-besu/src/tx_builder.rs +++ b/packages/proof-api/modules/besu-to-besu/src/tx_builder.rs @@ -1,3 +1,5 @@ +// SPDX-License-Identifier: Apache-2.0 + use std::{collections::HashMap, str::FromStr, time::UNIX_EPOCH}; use alloy::{ @@ -10,13 +12,6 @@ use alloy_rlp::Header as RlpHeader; use anyhow::{anyhow, bail, Context, Result}; use ethereum_apis::eth_api::client::EthApiClient; use ethereum_light_client::membership::evm_ics26_commitment_path; -use proof_api_lib::{ - events::EurekaEventWithHeight, - utils::{ - eth_eureka::{src_events_to_recv_and_ack_msgs, target_events_to_timeout_msgs}, - RelayEventsParams, - }, -}; use ibc_eureka_solidity_types::{ besu::{besu_ibft2_light_client, besu_qbft_light_client}, ics26::{ @@ -26,6 +21,13 @@ use ibc_eureka_solidity_types::{ }, msgs::{IBesuLightClientMsgs, IICS02ClientMsgs::Height as MsgHeight}, }; +use proof_api_lib::{ + events::EurekaEventWithHeight, + utils::{ + eth_eureka::{src_events_to_recv_and_ack_msgs, target_events_to_timeout_msgs}, + RelayEventsParams, + }, +}; use rlp::Rlp; use crate::BesuConsensusType; @@ -489,8 +491,8 @@ mod tests { encode_rlp_node_list, extract_validators_from_header_extra_data, select_proof_height, }; use alloy::primitives::{hex, Address, Bytes}; - use proof_api_lib::events::{EurekaEvent, EurekaEventWithHeight}; use ibc_eureka_solidity_types::ics26::IICS26RouterMsgs::{Packet, Payload}; + use proof_api_lib::events::{EurekaEvent, EurekaEventWithHeight}; use serde::Deserialize; use std::str::FromStr; diff --git a/packages/proof-api/modules/evmdummy-to-evmdummy/src/lib.rs b/packages/proof-api/modules/evmdummy-to-evmdummy/src/lib.rs index cf674f12c..eec0a00b4 100644 --- a/packages/proof-api/modules/evmdummy-to-evmdummy/src/lib.rs +++ b/packages/proof-api/modules/evmdummy-to-evmdummy/src/lib.rs @@ -1,3 +1,5 @@ +// SPDX-License-Identifier: Apache-2.0 + //! Local/dev/testing-only one-sided proof API module from EVM dummy to EVM dummy. #![deny(clippy::nursery, clippy::pedantic, warnings, unused_crate_dependencies)] diff --git a/packages/proof-api/modules/evmdummy-to-evmdummy/src/tx_builder.rs b/packages/proof-api/modules/evmdummy-to-evmdummy/src/tx_builder.rs index 55ab0c16d..7fc17c382 100644 --- a/packages/proof-api/modules/evmdummy-to-evmdummy/src/tx_builder.rs +++ b/packages/proof-api/modules/evmdummy-to-evmdummy/src/tx_builder.rs @@ -1,3 +1,5 @@ +// SPDX-License-Identifier: Apache-2.0 + use alloy::{ network::Ethereum, primitives::{Address, Bytes}, @@ -5,10 +7,6 @@ use alloy::{ sol_types::{SolCall, SolValue}, }; use anyhow::{bail, Context, Result}; -use proof_api_lib::utils::{ - eth_eureka::{src_events_to_recv_and_ack_msgs, target_events_to_timeout_msgs}, - RelayEventsParams, -}; use ibc_eureka_solidity_types::{ dummy::{ dummy_light_client, @@ -22,6 +20,10 @@ use ibc_eureka_solidity_types::{ IICS02ClientMsgs::Height, }, }; +use proof_api_lib::utils::{ + eth_eureka::{src_events_to_recv_and_ack_msgs, target_events_to_timeout_msgs}, + RelayEventsParams, +}; pub struct TxBuilder { src_provider: RootProvider, diff --git a/packages/solidity/src/besu.rs b/packages/solidity/src/besu.rs index 789defd4b..576a72701 100644 --- a/packages/solidity/src/besu.rs +++ b/packages/solidity/src/besu.rs @@ -1,3 +1,5 @@ +// SPDX-License-Identifier: Apache-2.0 + pub mod besu_ibft2_light_client { #[cfg(feature = "rpc")] alloy_sol_types::sol!( @@ -8,7 +10,10 @@ pub mod besu_ibft2_light_client { ); #[cfg(not(feature = "rpc"))] - alloy_sol_types::sol!(BesuIBFT2LightClient, "../../ibc-solidity/abi/BesuIBFT2LightClient.json"); + alloy_sol_types::sol!( + BesuIBFT2LightClient, + "../../ibc-solidity/abi/BesuIBFT2LightClient.json" + ); } pub mod besu_qbft_light_client { @@ -21,5 +26,8 @@ pub mod besu_qbft_light_client { ); #[cfg(not(feature = "rpc"))] - alloy_sol_types::sol!(BesuQBFTLightClient, "../../ibc-solidity/abi/BesuQBFTLightClient.json"); + alloy_sol_types::sol!( + BesuQBFTLightClient, + "../../ibc-solidity/abi/BesuQBFTLightClient.json" + ); } diff --git a/packages/solidity/src/dummy.rs b/packages/solidity/src/dummy.rs index 2e279e74b..bfcd39a4e 100644 --- a/packages/solidity/src/dummy.rs +++ b/packages/solidity/src/dummy.rs @@ -1,3 +1,5 @@ +// SPDX-License-Identifier: Apache-2.0 + //! Solidity types for dummy light client. pub mod dummy_light_client { @@ -10,7 +12,10 @@ pub mod dummy_light_client { ); #[cfg(not(feature = "rpc"))] - alloy_sol_types::sol!(DummyLightClient, "../../ibc-solidity/abi/DummyLightClient.json"); + alloy_sol_types::sol!( + DummyLightClient, + "../../ibc-solidity/abi/DummyLightClient.json" + ); } pub mod dummy_light_client_msgs { diff --git a/packages/solidity/src/msgs.rs b/packages/solidity/src/msgs.rs index c0f79f02c..c775ce6f5 100644 --- a/packages/solidity/src/msgs.rs +++ b/packages/solidity/src/msgs.rs @@ -45,7 +45,9 @@ alloy_sol_types::sol!( alloy_sol_types::sol!( "../../ibc-solidity/contracts/light-clients/attestation/msgs/IAttestationLightClientMsgs.sol" ); -alloy_sol_types::sol!("../../ibc-solidity/contracts/light-clients/besu/msgs/IBesuLightClientMsgs.sol"); +alloy_sol_types::sol!( + "../../ibc-solidity/contracts/light-clients/besu/msgs/IBesuLightClientMsgs.sol" +); #[cfg(feature = "rpc")] impl ISP1Msgs::SP1Proof { From 82bda31f38882580b4d47a6d05a31796e731becb Mon Sep 17 00:00:00 2001 From: Gjermund Garaba Date: Fri, 21 Aug 2026 14:04:03 +0200 Subject: [PATCH 05/22] fix(besu): address review findings Signed-off-by: Gjermund Garaba --- e2e/interchaintestv8/besu_to_besu_test.go | 17 +++++++--------- e2e/interchaintestv8/chainconfig/besu_qbft.go | 5 +++-- e2e/interchaintestv8/e2esuite/config.go | 2 +- e2e/interchaintestv8/e2esuite/config_test.go | 20 +++++++++++++++++++ ibc-solidity/abi/BesuIBFT2LightClient.json | 5 +++++ ibc-solidity/abi/BesuQBFTLightClient.json | 5 +++++ .../abi/bytecode/BesuIBFT2LightClient.json | 2 +- .../abi/bytecode/BesuQBFTLightClient.json | 2 +- .../besu/BesuLightClientBase.sol | 3 +++ .../besu/errors/IBesuLightClientErrors.sol | 2 ++ .../test/besu-bft/BesuLightClientQuorum.t.sol | 14 ++++++++++--- .../modules/besu-to-besu/src/tx_builder.rs | 8 +++++++- 12 files changed, 66 insertions(+), 19 deletions(-) create mode 100644 e2e/interchaintestv8/e2esuite/config_test.go diff --git a/e2e/interchaintestv8/besu_to_besu_test.go b/e2e/interchaintestv8/besu_to_besu_test.go index 9e0538528..c5edb1b77 100644 --- a/e2e/interchaintestv8/besu_to_besu_test.go +++ b/e2e/interchaintestv8/besu_to_besu_test.go @@ -89,6 +89,12 @@ func TestWithBesuToBesuTestSuite(t *testing.T) { func (s *BesuToBesuTestSuite) SetupSuite() { ctx := context.Background() + setupComplete := false + s.T().Cleanup(func() { + if !setupComplete { + s.TearDownSuite() + } + }) if os.Getenv(testvalues.EnvKeyRustLog) == "" { os.Setenv(testvalues.EnvKeyRustLog, testvalues.EnvValueRustLog_Info) @@ -105,11 +111,6 @@ func (s *BesuToBesuTestSuite) SetupSuite() { Gateway: "10.42.0.1", ValidatorIPs: besuToBesuChainAIPs, }) - defer func() { - if s.chainA.eth.RPCClient == nil { - s.chainA.network.Destroy(context.Background()) - } - }() s.chainB = s.spinUpChain(ctx, chainconfig.BesuQBFTParams{ ChainID: besuToBesuChainBID, @@ -117,11 +118,6 @@ func (s *BesuToBesuTestSuite) SetupSuite() { Gateway: "10.43.0.1", ValidatorIPs: besuToBesuChainBIPs, }) - defer func() { - if s.chainB.eth.RPCClient == nil { - s.chainB.network.Destroy(context.Background()) - } - }() s.besuFixtureGenerator = e2etypes.NewBesuFixtureGenerator() @@ -136,6 +132,7 @@ func (s *BesuToBesuTestSuite) SetupSuite() { s.createAndRegisterBesuClient(&s.chainB, &s.chainA, besuToBesuClientOnA, besuToBesuClientOnB) s.createAndRegisterBesuClient(&s.chainA, &s.chainB, besuToBesuClientOnB, besuToBesuClientOnA) + setupComplete = true } func (s *BesuToBesuTestSuite) TearDownSuite() { diff --git a/e2e/interchaintestv8/chainconfig/besu_qbft.go b/e2e/interchaintestv8/chainconfig/besu_qbft.go index 6d4c5afb4..21c476a12 100644 --- a/e2e/interchaintestv8/chainconfig/besu_qbft.go +++ b/e2e/interchaintestv8/chainconfig/besu_qbft.go @@ -82,9 +82,10 @@ func SpinUpBesuQBFT(ctx context.Context, params BesuQBFTParams) (chain BesuQBFTC Faucet: faucet, projectDir: projectDir, } + var stack *compose.DockerCompose defer func() { if err != nil { - chain.Destroy(context.Background()) + BesuQBFTChain{stack: stack, projectDir: projectDir}.Destroy(context.Background()) } }() @@ -100,7 +101,7 @@ func SpinUpBesuQBFT(ctx context.Context, params BesuQBFTParams) (chain BesuQBFTC return BesuQBFTChain{}, fmt.Errorf("patch besu qbft compose file: %w", err) } - stack, err := compose.NewDockerComposeWith( + stack, err = compose.NewDockerComposeWith( compose.StackIdentifier(fmt.Sprintf("%s-%d", besuQBFTProjectName, time.Now().UnixNano())), compose.WithStackFiles(filepath.Join(projectDir, besuQBFTComposeFile)), ) diff --git a/e2e/interchaintestv8/e2esuite/config.go b/e2e/interchaintestv8/e2esuite/config.go index 7ad0bea56..a646e1a05 100644 --- a/e2e/interchaintestv8/e2esuite/config.go +++ b/e2e/interchaintestv8/e2esuite/config.go @@ -80,7 +80,7 @@ func (c *setupConfig) validate() error { return nil case testvalues.EthTestnetTypeBesuQBFT: switch ethLcOnCosmos { - case "", testvalues.EthLCOnCosmosTypeDummyWasm, testvalues.EthLCOnCosmosTypeAttestorNative: + case "", testvalues.EthLCOnCosmosTypeAttestorNative: return nil case testvalues.EthLCOnCosmosTypeFullWasm: return fmt.Errorf("invalid config: ETH_TESTNET_TYPE=%s cannot use ETH_LC_ON_COSMOS=%s (Besu QBFT doesn't have beacon chain)", ethTestnetType, ethLcOnCosmos) diff --git a/e2e/interchaintestv8/e2esuite/config_test.go b/e2e/interchaintestv8/e2esuite/config_test.go new file mode 100644 index 000000000..ea3482c30 --- /dev/null +++ b/e2e/interchaintestv8/e2esuite/config_test.go @@ -0,0 +1,20 @@ +// SPDX-License-Identifier: Apache-2.0 + +package e2esuite + +import ( + "testing" + + "github.com/srdtrk/solidity-ibc-eureka/e2e/v8/testvalues" +) + +func TestSetupConfigRejectsBesuQBFTWithDummyLightClient(t *testing.T) { + cfg := setupConfig{ + ethereum: ethereumConfig{testnetType: testvalues.EthTestnetTypeBesuQBFT}, + cosmos: cosmosConfig{lightClientType: testvalues.EthLCOnCosmosTypeDummyWasm}, + } + + if err := cfg.validate(); err == nil { + t.Fatal("expected Besu QBFT with a dummy light client to be rejected") + } +} diff --git a/ibc-solidity/abi/BesuIBFT2LightClient.json b/ibc-solidity/abi/BesuIBFT2LightClient.json index 06eb4679a..b3b7b9852 100644 --- a/ibc-solidity/abi/BesuIBFT2LightClient.json +++ b/ibc-solidity/abi/BesuIBFT2LightClient.json @@ -641,6 +641,11 @@ "name": "InvalidHeaderHeight", "inputs": [] }, + { + "type": "error", + "name": "InvalidHeaderTimestamp", + "inputs": [] + }, { "type": "error", "name": "InvalidMixHash", diff --git a/ibc-solidity/abi/BesuQBFTLightClient.json b/ibc-solidity/abi/BesuQBFTLightClient.json index 06eb4679a..b3b7b9852 100644 --- a/ibc-solidity/abi/BesuQBFTLightClient.json +++ b/ibc-solidity/abi/BesuQBFTLightClient.json @@ -641,6 +641,11 @@ "name": "InvalidHeaderHeight", "inputs": [] }, + { + "type": "error", + "name": "InvalidHeaderTimestamp", + "inputs": [] + }, { "type": "error", "name": "InvalidMixHash", diff --git a/ibc-solidity/abi/bytecode/BesuIBFT2LightClient.json b/ibc-solidity/abi/bytecode/BesuIBFT2LightClient.json index 690569b9d..caa3a619a 100644 --- a/ibc-solidity/abi/bytecode/BesuIBFT2LightClient.json +++ b/ibc-solidity/abi/bytecode/BesuIBFT2LightClient.json @@ -1 +1 @@ -{"abi":[{"type":"constructor","inputs":[{"name":"ibcRouter","type":"address","internalType":"address"},{"name":"initialTrustedHeight","type":"uint64","internalType":"uint64"},{"name":"initialTrustedTimestamp","type":"uint64","internalType":"uint64"},{"name":"initialTrustedStorageRoot","type":"bytes32","internalType":"bytes32"},{"name":"initialTrustedValidators","type":"address[]","internalType":"address[]"},{"name":"trustingPeriod","type":"uint64","internalType":"uint64"},{"name":"maxClockDrift","type":"uint64","internalType":"uint64"},{"name":"roleManager","type":"address","internalType":"address"}],"stateMutability":"nonpayable"},{"type":"function","name":"DEFAULT_ADMIN_ROLE","inputs":[],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"type":"function","name":"PROOF_SUBMITTER_ROLE","inputs":[],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"type":"function","name":"getClientState","inputs":[],"outputs":[{"name":"","type":"bytes","internalType":"bytes"}],"stateMutability":"view"},{"type":"function","name":"getConsensusState","inputs":[{"name":"revisionHeight","type":"uint64","internalType":"uint64"}],"outputs":[{"name":"","type":"bytes","internalType":"bytes"}],"stateMutability":"view"},{"type":"function","name":"getRoleAdmin","inputs":[{"name":"role","type":"bytes32","internalType":"bytes32"}],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"type":"function","name":"grantRole","inputs":[{"name":"role","type":"bytes32","internalType":"bytes32"},{"name":"account","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"hasRole","inputs":[{"name":"role","type":"bytes32","internalType":"bytes32"},{"name":"account","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"misbehaviour","inputs":[{"name":"","type":"bytes","internalType":"bytes"}],"outputs":[],"stateMutability":"view"},{"type":"function","name":"renounceRole","inputs":[{"name":"role","type":"bytes32","internalType":"bytes32"},{"name":"callerConfirmation","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"revokeRole","inputs":[{"name":"role","type":"bytes32","internalType":"bytes32"},{"name":"account","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"supportsInterface","inputs":[{"name":"interfaceId","type":"bytes4","internalType":"bytes4"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"updateClient","inputs":[{"name":"updateMsg","type":"bytes","internalType":"bytes"}],"outputs":[{"name":"","type":"uint8","internalType":"enum ILightClientMsgs.UpdateResult"}],"stateMutability":"nonpayable"},{"type":"function","name":"verifyMembership","inputs":[{"name":"msg_","type":"tuple","internalType":"struct ILightClientMsgs.MsgVerifyMembership","components":[{"name":"proof","type":"bytes","internalType":"bytes"},{"name":"proofHeight","type":"tuple","internalType":"struct IICS02ClientMsgs.Height","components":[{"name":"revisionNumber","type":"uint64","internalType":"uint64"},{"name":"revisionHeight","type":"uint64","internalType":"uint64"}]},{"name":"path","type":"bytes[]","internalType":"bytes[]"},{"name":"value","type":"bytes","internalType":"bytes"}]}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"verifyNonMembership","inputs":[{"name":"msg_","type":"tuple","internalType":"struct ILightClientMsgs.MsgVerifyNonMembership","components":[{"name":"proof","type":"bytes","internalType":"bytes"},{"name":"proofHeight","type":"tuple","internalType":"struct IICS02ClientMsgs.Height","components":[{"name":"revisionNumber","type":"uint64","internalType":"uint64"},{"name":"revisionHeight","type":"uint64","internalType":"uint64"}]},{"name":"path","type":"bytes[]","internalType":"bytes[]"}]}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"event","name":"RoleAdminChanged","inputs":[{"name":"role","type":"bytes32","indexed":true,"internalType":"bytes32"},{"name":"previousAdminRole","type":"bytes32","indexed":true,"internalType":"bytes32"},{"name":"newAdminRole","type":"bytes32","indexed":true,"internalType":"bytes32"}],"anonymous":false},{"type":"event","name":"RoleGranted","inputs":[{"name":"role","type":"bytes32","indexed":true,"internalType":"bytes32"},{"name":"account","type":"address","indexed":true,"internalType":"address"},{"name":"sender","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"type":"event","name":"RoleRevoked","inputs":[{"name":"role","type":"bytes32","indexed":true,"internalType":"bytes32"},{"name":"account","type":"address","indexed":true,"internalType":"address"},{"name":"sender","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"type":"error","name":"AccessControlBadConfirmation","inputs":[]},{"type":"error","name":"AccessControlUnauthorizedAccount","inputs":[{"name":"account","type":"address","internalType":"address"},{"name":"neededRole","type":"bytes32","internalType":"bytes32"}]},{"type":"error","name":"ConflictingConsensusState","inputs":[{"name":"revisionHeight","type":"uint64","internalType":"uint64"}]},{"type":"error","name":"ConsensusStateExpired","inputs":[{"name":"trustedTimestamp","type":"uint64","internalType":"uint64"},{"name":"currentTimestamp","type":"uint256","internalType":"uint256"},{"name":"trustingPeriod","type":"uint64","internalType":"uint64"}]},{"type":"error","name":"ConsensusStateNotFound","inputs":[{"name":"revisionHeight","type":"uint64","internalType":"uint64"}]},{"type":"error","name":"DuplicateCommitSealSigner","inputs":[{"name":"signer","type":"address","internalType":"address"}]},{"type":"error","name":"DuplicateValidator","inputs":[{"name":"validator","type":"address","internalType":"address"}]},{"type":"error","name":"EmptyValidatorSet","inputs":[]},{"type":"error","name":"HeaderFromFuture","inputs":[{"name":"currentTimestamp","type":"uint256","internalType":"uint256"},{"name":"headerTimestamp","type":"uint256","internalType":"uint256"},{"name":"maxClockDrift","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"InsufficientTrustedValidatorOverlap","inputs":[{"name":"actual","type":"uint256","internalType":"uint256"},{"name":"required","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"InsufficientValidatorQuorum","inputs":[{"name":"actual","type":"uint256","internalType":"uint256"},{"name":"required","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"InvalidCommitSeal","inputs":[]},{"type":"error","name":"InvalidCommitmentValue","inputs":[{"name":"expectedValue","type":"bytes32","internalType":"bytes32"},{"name":"actualValue","type":"bytes32","internalType":"bytes32"}]},{"type":"error","name":"InvalidDifficulty","inputs":[{"name":"actualDifficulty","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"InvalidECDSASignatureLength","inputs":[{"name":"length","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"InvalidExtraDataFormat","inputs":[{"name":"itemsLength","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"InvalidHeaderFormat","inputs":[{"name":"itemsLength","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"InvalidHeaderHeight","inputs":[]},{"type":"error","name":"InvalidMixHash","inputs":[{"name":"actualMixHash","type":"bytes32","internalType":"bytes32"}]},{"type":"error","name":"InvalidNonce","inputs":[{"name":"actualNonce","type":"bytes","internalType":"bytes"}]},{"type":"error","name":"InvalidOmmersHash","inputs":[{"name":"actualOmmersHash","type":"bytes32","internalType":"bytes32"}]},{"type":"error","name":"InvalidPathLength","inputs":[{"name":"expectedLength","type":"uint256","internalType":"uint256"},{"name":"actualLength","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"InvalidRevisionNumber","inputs":[{"name":"providedRevisionNumber","type":"uint64","internalType":"uint64"}]},{"type":"error","name":"InvalidValidatorAddress","inputs":[{"name":"validator","type":"address","internalType":"address"}]},{"type":"error","name":"InvalidValidatorAddressLength","inputs":[{"name":"length","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"InvalidValueLength","inputs":[{"name":"expectedLength","type":"uint256","internalType":"uint256"},{"name":"actualLength","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"UnsupportedMisbehaviour","inputs":[]},{"type":"error","name":"ValueExists","inputs":[{"name":"actualValue","type":"bytes32","internalType":"bytes32"}]}],"bytecode":{"object":"0x6080604052346103c0576138ef80380380610019816103c4565b928339810190610100818303126103c057610033816103e9565b61003f602083016103fd565b9061004c604084016103fd565b60608401516080850151909291906001600160401b0381116103c05785019286601f850112156103c0578351966001600160401b038811610376578760051b9460206100998188016103c4565b809a81520190602082978201019283116103c057602001905b8282106103a8575050506100c860a087016103fd565b956100e160e06100da60c084016103fd565b92016103e9565b956001600160401b03169081156103995788511561038a575f5b89518110156101b1576001600160a01b03610116828c610411565b51161561018a575f5b81811061012f57506001016100fb565b6001600160a01b03610141828d610411565b51166001600160a01b03610155848e610411565b5116146101645760010161011f565b6001600160a01b03610176838d610411565b511663107f863360e21b5f5260045260245ffd5b6001600160a01b039061019d908b610411565b51166359bff38760e01b5f5260045260245ffd5b5060408051979896978a979181016001600160401b03811182821017610376576040525f81526020810190848252604051926080840198848a1060018060401b038b1117610376576040998a526001600160a01b031680855260208086018490526001600160401b03928316868c01819052878416606090970196909652600180546001600160a01b031916909217825592516002805495516001600160801b031996871692851692909217918c1b6fffffffffffffffff000000000000000090811692909217815560038054909616909617968b1b16959095179092555f948552600490529590922080546001600160401b03191694861694909417845583019190915592519392019190831161037657680100000000000000008311610376578154838355808410610350575b50905f5260205f205f5b83811061033357846001600160a01b03811661031a575061030961052f565b505b60405161329d90816105b28239f35b8061032761032d92610439565b506104af565b5061030b565b82516001600160a01b0316818301556020909201916001016102ea565b825f528360205f2091820191015b81811061036b57506102e0565b5f815560010161035e565b634e487b7160e01b5f52604160045260245ffd5b63339e1ffb60e01b5f5260045ffd5b6359d119e360e01b5f5260045ffd5b602080916103b5846103e9565b8152019101906100b2565b5f80fd5b6040519190601f01601f191682016001600160401b0381118382101761037657604052565b51906001600160a01b03821682036103c057565b51906001600160401b03821682036103c057565b80518210156104255760209160051b010190565b634e487b7160e01b5f52603260045260245ffd5b6001600160a01b0381165f9081525f5160206138cf5f395f51905f52602052604090205460ff166104aa576001600160a01b03165f8181525f5160206138cf5f395f51905f5260205260408120805460ff191660011790553391905f51602061384f5f395f51905f528180a4600190565b505f90565b6001600160a01b0381165f9081525f51602061386f5f395f51905f52602052604090205460ff166104aa576001600160a01b03165f8181525f51602061386f5f395f51905f5260205260408120805460ff191660011790553391905f5160206138af5f395f51905f52905f51602061384f5f395f51905f529080a4600190565b5f80525f51602061386f5f395f51905f526020525f51602061388f5f395f51905f525460ff166105ad575f8080525f51602061386f5f395f51905f526020525f51602061388f5f395f51905f52805460ff1916600117905533905f5160206138af5f395f51905f525f51602061384f5f395f51905f528280a4600190565b5f9056fe60806040526004361015610011575f80fd5b5f3560e01c806301ffc9a7146100f45780630bece356146100ef578063248a9ca3146100ea5780632f2ff15d146100e557806336568abe146100e05780634d6d9ffb146100db5780635972185a146100d6578063682ed5f0146100d157806391d14854146100cc578063a217fddf146100c7578063d547741f146100c2578063ddba6537146100bd578063edce8bdc146100b85763ef913a4b146100b3575f80fd5b610a16565b61095e565b61088b565b61085c565b610842565b6107f4565b6105e6565b6105ac565b6103ac565b610350565b61031a565b6102b5565b610217565b34610195576020600319360112610195576004357fffffffff00000000000000000000000000000000000000000000000000000000811680910361019557807f7965db0b000000000000000000000000000000000000000000000000000000006020921490811561016b575b506040519015158152f35b7f01ffc9a7000000000000000000000000000000000000000000000000000000009150145f610160565b5f80fd5b9060206003198301126101955760043567ffffffffffffffff811161019557826023820112156101955780600401359267ffffffffffffffff84116101955760248483010111610195576024019190565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b346101955761028161022836610199565b5f80527f4c48d1d2b0f4f7485fc28e3db22341d96a20aa29e6efa8149da9751603abd4e06020527f6e0c24a6e293ff9b755263dbaa15ba3796b0b8d3fe17cfb4ddf8143b268eac475490919060ff161561029957610d9d565b6040516003821015610294576020918152f35b6101ea565b6102a1611287565b610d9d565b90816020910312610195573590565b346101955760206003193601126101955760206102df6004355f525f602052600160405f20015490565b604051908152f35b6003196040910112610195576004359060243573ffffffffffffffffffffffffffffffffffffffff811681036101955790565b346101955761034e61032b366102e7565b90610349610344825f525f602052600160405f20015490565b61130f565b6121c6565b005b346101955761035e366102e7565b3373ffffffffffffffffffffffffffffffffffffffff8216036103845761034e9161229d565b7f6697b232000000000000000000000000000000000000000000000000000000005f5260045ffd5b346101955760206003193601126101955760043567ffffffffffffffff8111610195578060040160806003198336030112610195575f80527f4c48d1d2b0f4f7485fc28e3db22341d96a20aa29e6efa8149da9751603abd4e060205260ff7f6e0c24a6e293ff9b755263dbaa15ba3796b0b8d3fe17cfb4ddf8143b268eac4754161561059f575b61044761044260248401611192565b61137c565b60648201916001610458848461119c565b90500361056157906104a96104966104a261049d61049661049061048961048460446104e09a01611192565b611b30565b988761119c565b9061126e565b3691610b4d565b612372565b928061121d565b906001840154906040516104d7816104c960208201948560209181520190565b03601f198101835282610afd565b51902091612400565b805161051f5761051b61050b6104fe845467ffffffffffffffff1690565b67ffffffffffffffff1690565b6040519081529081906020820190565b0390f35b61053361052e61055e92612545565b612572565b7fd039601e000000000000000000000000000000000000000000000000000000005f52600452602490565b5ffd5b61055e61056e848461119c565b7f88b3170e000000000000000000000000000000000000000000000000000000005f52600160045260245250604490565b6105a7611287565b610433565b34610195575f6003193601126101955760206040517fbd893629a699470e4ec82a5715bb4981fdaacc5d0a728bf5f55b801d8f4ef10b8152f35b346101955760206003193601126101955760043567ffffffffffffffff8111610195578060040160a06003198336030112610195575f80527f4c48d1d2b0f4f7485fc28e3db22341d96a20aa29e6efa8149da9751603abd4e060205260ff7f6e0c24a6e293ff9b755263dbaa15ba3796b0b8d3fe17cfb4ddf8143b268eac475416156107e7575b61067c61044260248401611192565b6064820191600161068d848461119c565b90500361056157608481019060206106a5838561121d565b9050036107a957906106f46104966106ed6106e56106de61049d6104966104906106d761048460446107149c01611192565b9b8b61119c565b948761121d565b8101906102a6565b948061121d565b906001850154906040516104d7816104c960208201948560209181520190565b8051156107755761052e61072791612545565b908082036107475761051b61050b6104fe855467ffffffffffffffff1690565b7f56ed1b63000000000000000000000000000000000000000000000000000000005f5260045260245260445ffd5b61055e827f56ed1b63000000000000000000000000000000000000000000000000000000005f52906044916004525f602452565b61055e6107b6838561121d565b7f24fadac8000000000000000000000000000000000000000000000000000000005f52602060045260245250604490565b6107ef611287565b61066d565b3461019557602060ff610836610809366102e7565b905f525f845260405f209073ffffffffffffffffffffffffffffffffffffffff165f5260205260405f2090565b54166040519015158152f35b34610195575f6003193601126101955760206040515f8152f35b346101955761034e61086d366102e7565b90610886610344825f525f602052600160405f20015490565b61229d565b346101955761089936610199565b50505f80527f4c48d1d2b0f4f7485fc28e3db22341d96a20aa29e6efa8149da9751603abd4e06020527f6e0c24a6e293ff9b755263dbaa15ba3796b0b8d3fe17cfb4ddf8143b268eac475460ff1615610915575b7f2c1ed462000000000000000000000000000000000000000000000000000000005f5260045ffd5b61091d611287565b6108ed565b67ffffffffffffffff81160361019557565b601f19601f602060409481855280519182918282880152018686015e5f8582860101520116010190565b346101955760206003193601126101955761097e60043561048481610922565b67ffffffffffffffff8154166002600183015492019060405192608084019160208501526040840152606080840152815480915260a08301915f5260205f20905f5b8181106109ea5761051b856109de818703601f198101835282610afd565b60405191829182610934565b825473ffffffffffffffffffffffffffffffffffffffff168452602090930192600192830192016109c0565b34610195575f6003193601126101955761051b60405173ffffffffffffffffffffffffffffffffffffffff60015416602082015267ffffffffffffffff600254818116604084015260401c16606082015267ffffffffffffffff600354818116608084015260401c1660a082015260a081526109de60c082610afd565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b6060810190811067ffffffffffffffff821117610adc57604052565b610a93565b6040810190811067ffffffffffffffff821117610adc57604052565b90601f601f19910116810190811067ffffffffffffffff821117610adc57604052565b60405190610b2f604083610afd565b565b67ffffffffffffffff8111610adc57601f01601f191660200190565b929192610b5982610b31565b91610b676040519384610afd565b829481845281830111610195578281602093845f960137010152565b9080601f8301121561019557816020610b9e93359101610b4d565b90565b6020818303126101955780359067ffffffffffffffff8211610195570180820391608083126101955760405192610bd784610ac0565b823567ffffffffffffffff811161019557604091610bfa84601f19938701610b83565b8652011261019557604051610c0e81610ae1565b6020830135610c1c81610922565b81526040830135610c2c81610922565b60208201526020840152606082013567ffffffffffffffff811161019557610c549201610b83565b604082015290565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b9060018201809211610c9757565b610c5c565b60c001908160c011610c9757565b60f701908160f711610c9757565b6080019081608011610c9757565b60b701908160b711610c9757565b91908201809211610c9757565b908160011b9180830460021490151715610c9757565b81519167ffffffffffffffff8311610adc57680100000000000000008311610adc578154838355808410610d77575b506020610d389101915f5260205f2090565b5f5b838110610d475750505050565b6001906020610d6a855173ffffffffffffffffffffffffffffffffffffffff1690565b9401938184015501610d3a565b825f528360205f2091820191015b818110610d925750610d26565b5f8155600101610d85565b610da991810190610ba1565b9060208201610dc461044282515167ffffffffffffffff1690565b610dce8351611614565b92606084019367ffffffffffffffff610def865167ffffffffffffffff1690565b161561116a5760035491604083901c67ffffffffffffffff1693610e1d67ffffffffffffffff861642610cd4565b9460a0840195610e35875167ffffffffffffffff1690565b9067ffffffffffffffff82161161112b5750505160200151610e7290610e649067ffffffffffffffff16611b30565b9367ffffffffffffffff1690565b67ffffffffffffffff81168015159081611102575b506110ad575090610ef591610eb66002610eae610ea385611b87565b60e086015190611ca1565b950185611eba565b610ec660c0830194855190611fdf565b60406080610ee960015473ffffffffffffffffffffffffffffffffffffffff1690565b93015191015191612082565b610f22610f0a865167ffffffffffffffff1690565b67ffffffffffffffff165f52600460205260405f2090565b610f376104fe825467ffffffffffffffff1690565b61103b5750916002610fb5928694610fa8610f73610f64610f0a610fc39a9b5167ffffffffffffffff1690565b955167ffffffffffffffff1690565b859067ffffffffffffffff167fffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000825416179055565b6001840155519101610cf7565b5167ffffffffffffffff1690565b600254610fdc9060401c67ffffffffffffffff166104fe565b67ffffffffffffffff821611610ff157505f90565b611037907fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff6fffffffffffffffff00000000000000006002549260401b16911617600255565b5f90565b91611051611059945167ffffffffffffffff1690565b9051926120f8565b6110a75761055e611072835167ffffffffffffffff1690565b7fc1aea5f7000000000000000000000000000000000000000000000000000000005f5267ffffffffffffffff16600452602490565b60029150565b61055e906110c3855467ffffffffffffffff1690565b7feae35725000000000000000000000000000000000000000000000000000000005f5267ffffffffffffffff9081166004524260245216604452606490565b9050611123429161111e6104fe885467ffffffffffffffff1690565b610cd4565b11155f610e87565b7f9b772277000000000000000000000000000000000000000000000000000000005f524260045267ffffffffffffffff9081166024521660445260645ffd5b7f59d119e3000000000000000000000000000000000000000000000000000000005f5260045ffd5b35610b9e81610922565b9035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe181360301821215610195570180359067ffffffffffffffff821161019557602001918160051b3603831361019557565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b9035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe181360301821215610195570180359067ffffffffffffffff82116101955760200191813603831361019557565b9015611282578061127e9161121d565b9091565b6111f0565b335f9081527f4c48d1d2b0f4f7485fc28e3db22341d96a20aa29e6efa8149da9751603abd4e0602052604090205460ff16156112bf57565b7fe2517d3f000000000000000000000000000000000000000000000000000000005f52336004527fbd893629a699470e4ec82a5715bb4981fdaacc5d0a728bf5f55b801d8f4ef10b60245260445ffd5b805f525f60205260ff6113433360405f209073ffffffffffffffffffffffffffffffffffffffff165f5260205260405f2090565b54161561134d5750565b7fe2517d3f000000000000000000000000000000000000000000000000000000005f523360045260245260445ffd5b67ffffffffffffffff168061138e5750565b7f3ce598a9000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b60405190610100820182811067ffffffffffffffff821117610adc57604052606060e0838281528260208201528260408201525f838201525f60808201525f60a08201528260c08201520152565b8051600110156112825760400190565b805160071015611282576101000190565b8051600d1015611282576101c00190565b8051600e1015611282576101e00190565b805160081015611282576101200190565b8051600310156112825760800190565b8051600b1015611282576101800190565b8051600c1015611282576101a00190565b8051600410156112825760a00190565b8051156112825760200190565b8051600210156112825760600190565b805160101015611282576102200190565b80518210156112825760209160051b010190565b67ffffffffffffffff8111610adc5760051b60200190565b90611501826114df565b61150e6040519182610afd565b828152601f1961151e82946114df565b0190602036910137565b90602082519201517fffffffffffffffffffffffffffffffffffffffff00000000000000000000000081169260148110611560575050565b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000929350829060140360031b1b161690565b60405160a091906115a38382610afd565b6004815291601f1901825f5b8281106115bb57505050565b8060606020809385010152016115af565b906115d6826114df565b6115e36040519182610afd565b828152601f196115f382946114df565b01905f5b82811061160357505050565b8060606020809385010152016115f7565b61163061162b6116226113b9565b92808452612545565b6125b4565b602082019080825251600f8110611b0557507f1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d493476116766116708351611407565b5161267f565b03611aca57600161169061168a8351611417565b51612572565b03611a8f577f63746963616c2062797a616e74696e65206661756c7420746f6c6572616e63656116c36116708351611428565b03611a54576116db6116d58251611439565b5161269b565b80516008811490811591611a24575b506119ea575061162b61175d6116d5836117216117106104fe61168a611762985161144a565b67ffffffffffffffff166060880152565b61172e611670825161145b565b60808701526117576117466104fe61168a845161146b565b67ffffffffffffffff1660a0880152565b5161147c565b612545565b90604081019180835251600581036119bf57506117886117828351611407565b516125b4565b908151156119975761179a82516114f7565b9360c082019485525f5b8351811015611933576117ba6116d582866114cb565b80516014810361190857506117d16117d791611528565b60601c90565b73ffffffffffffffffffffffffffffffffffffffff811680156118c6575f5b8381106118325750509061182c600192611811838a516114cb565b9073ffffffffffffffffffffffffffffffffffffffff169052565b016117a4565b8161187761185e611844848d516114cb565b5173ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff1690565b14611884576001016117f6565b7f41fe18cc000000000000000000000000000000000000000000000000000000005f5273ffffffffffffffffffffffffffffffffffffffff831660045260245ffd5b7f59bff387000000000000000000000000000000000000000000000000000000005f5273ffffffffffffffffffffffffffffffffffffffff821660045260245ffd5b7f83e46ad2000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b509261178291945061194692505161148d565b61195081516115cc565b9260e081019384525f5b8251811015611991578061198a816119776116d5600195886114cb565b88519061198483836114cb565b526114cb565b500161195a565b50925050565b7f339e1ffb000000000000000000000000000000000000000000000000000000005f5260045ffd5b7f30c6792a000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b611a20906040519182917fd5edd2a500000000000000000000000000000000000000000000000000000000835260048301610934565b0390fd5b7f011b4d03dd8c01f1049143cf9c4c817e4b167f1d1b83e5c6f0f10d89ba1e7bce9150602083012014155f6116ea565b611a6461167061055e9251611428565b7fa19e609c000000000000000000000000000000000000000000000000000000005f52600452602490565b611a9f61168a61055e9251611417565b7ff71b722f000000000000000000000000000000000000000000000000000000005f52600452602490565b611ada61167061055e9251611407565b7fb8120dca000000000000000000000000000000000000000000000000000000005f52600452602490565b7fbc277732000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b67ffffffffffffffff1690815f52600460205260405f209167ffffffffffffffff83541615611b5c5750565b7ff761631b000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b6020611c26611b94611592565b611c0d611bab60408601611bb1611bab825161149d565b51612fa2565b611bba8561149d565b52611bc48461149d565b50611bd2611bab8251611407565b611bdb85611407565b52611be584611407565b50611bf3611bab82516114aa565b611bfc856114aa565b52611c06846114aa565b505161145b565b611c168261145b565b52611c208161145b565b50612771565b910190611c348251516115cc565b905f5b83518051821015611c8a579080600192600c82145f14611c78575050611c5c83612829565b611c6682866114cb565b52611c7181856114cb565b5001611c37565b611c8591611bab916114cb565b611c5c565b505050611c979150612771565b6020815191012090565b919091611cae83516114f7565b925f5b8151811015611ea757611cc481836114cb565b51805160418103611e7c575080601b60ff611d13611d0d611ce7611d2096612808565b517fff000000000000000000000000000000000000000000000000000000000000001690565b60f81c90565b1610611e29575b84613050565b90611d2a816128a3565b1590811591611e1f575b508015611e01575b611dd95773ffffffffffffffffffffffffffffffffffffffff81165f5b838110611d7957505090611d7360019261181183896114cb565b01611cb1565b81611d8a61185e611844848c6114cb565b14611d9757600101611d59565b7f33af0d5f000000000000000000000000000000000000000000000000000000005f5273ffffffffffffffffffffffffffffffffffffffff831660045260245ffd5b7f09cb44e6000000000000000000000000000000000000000000000000000000005f5260045ffd5b5073ffffffffffffffffffffffffffffffffffffffff811615611d3c565b905015155f611d34565b611e6b611e43611e3e611d0d611ce785612808565b612891565b60f81b7fff000000000000000000000000000000000000000000000000000000000000001690565b5f1a611e7682612808565b53611d1a565b7ff2db9ce1000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b505050565b5f198114610c975760010190565b905f915f5b8151811015611f1357611ef273ffffffffffffffffffffffffffffffffffffffff611eea83856114cb565b5116846128ad565b611eff575b600101611ebf565b92611f0b600191611eac565b939050611ef7565b50506003611f22915404610c89565b90818110611f2e575050565b7fe2dcb1b9000000000000000000000000000000000000000000000000000000005f5260045260245260445ffd5b905f198201918211610c9757565b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff408201918211610c9757565b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff808201918211610c9757565b6020039060208211610c9757565b91908203918211610c9757565b905f915f5b81518110156120385761201773ffffffffffffffffffffffffffffffffffffffff61200f83856114cb565b511684612904565b612024575b600101611fe4565b92612030600191611eac565b93905061201c565b50505190600382048203918211610c9757818110612054575050565b7f7818f4e4000000000000000000000000000000000000000000000000000000005f5260045260245260445ffd5b6120cc9261162b9261175d926040517fffffffffffffffffffffffffffffffffffffffff000000000000000000000000602082019260601b168252601481526104d7603482610afd565b805160021015611282576060610b9e91015161267f565b8054821015611282575f5260205f2001905f90565b919067ffffffffffffffff80612116855467ffffffffffffffff1690565b9216911614908115916121b7575b506121b1576002019081548151036121b1575f5b81518110156121a95761216e61214e82856120e3565b905473ffffffffffffffffffffffffffffffffffffffff9160031b1c1690565b73ffffffffffffffffffffffffffffffffffffffff61219361185e61184485876114cb565b9116036121a257600101612138565b5050505f90565b505050600190565b50505f90565b9050600182015414155f612124565b805f525f60205260ff6121fa8360405f209073ffffffffffffffffffffffffffffffffffffffff165f5260205260405f2090565b54166121b157805f525f6020526122328260405f209073ffffffffffffffffffffffffffffffffffffffff165f5260205260405f2090565b60017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0082541617905573ffffffffffffffffffffffffffffffffffffffff339216907f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d5f80a4600190565b805f525f60205260ff6122d18360405f209073ffffffffffffffffffffffffffffffffffffffff165f5260205260405f2090565b5416156121b157805f525f60205261230a8260405f209073ffffffffffffffffffffffffffffffffffffffff165f5260205260405f2090565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00815416905573ffffffffffffffffffffffffffffffffffffffff339216907ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b5f80a4600190565b60208151910120604051602081019182527f1260944489272988d9df285149b5aa1b0f48f2136d6f416159f840a3e07476006040820152604081526123b8606082610afd565b51902090565b604051906123cd602083610afd565b5f808352366020840137565b906123e382610b31565b6123f06040519182610afd565b828152601f1961151e8294610b31565b61162b612442919493946124146020610b31565b956124226040519788610afd565b602087526124306020610b31565b601f1960208901910136823752612545565b9061244d8451610ce1565b918451151580612525575b6124619061256b565b61247361246e5f85611fd2565b6123d9565b925f19015f5b81811061248d575050610b9e939450612a78565b8061250f600f6124d2612509611d0d611ce78d6124ac60029960011c90565b908d6125038a6124fb8a6124d26124c9611d0d611ce78a8a612818565b60041c600f1690565b1660f81b7fff000000000000000000000000000000000000000000000000000000000000001690565b5f1a92612818565b53612818565b60ff1690565b5f1a61251e6001830188612818565b5301612479565b506001612458565b6040519061253a82610ae1565b5f6020838281520152565b61254d61252d565b5060208151916040519261256084610ae1565b835201602082015290565b1561019557565b805180151590816125a8575b50156101955761258d90612d4e565b9051906020811061259c575090565b6020036101000a900490565b6021915011155f61257e565b6125bd81612d7a565b15610195576125cb81612d9a565b6125d4816114df565b916125e26040519384610afd565b818352601f196125f1836114df565b015f5b818110612668575050602061261491015161260e81612dfb565b90610cd4565b5f905b8282106126245750505090565b61266081612633600193612e66565b9061263c610b20565b82815281602082015261264f86896114cb565b5261265a85886114cb565b50610cd4565b910190612617565b60209061267361252d565b828288010152016125f4565b6021815103610195576020015160018101809111610c97575190565b805115610195576126ae610b9e91612d4e565b6126ba819392936123d9565b928360200190612f2f565b805191908290602001825e015f815290565b610b2f906126f96126f3949360405195869360208501906126c5565b906126c5565b03601f198101845283610afd565b6001907fff00000000000000000000000000000000000000000000000000000000000000610b9e949316815201906126c5565b916001610b9e94937fff000000000000000000000000000000000000000000000000000000000000006126f39416815201906126c5565b6127796123be565b905f915b81518310156127a55761279d60019161279685856114cb565b51906126d7565b92019161277d565b9150508051603881106127e45750610b9e6127c08251612fce565b916104c96127d4611e436125098651610caa565b916040519485936020850161273a565b6127f6611e43612509610b9e93610c9c565b6104c960405193849260208401612707565b8051604010156112825760600190565b908151811015611282570160200190565b600181511480612876575b610b9e578051603881106128645750610b9e6128508251612fce565b916104c96127d4611e436125098651610cc6565b6127f6611e43612509610b9e93610cb8565b50608060ff61288a611d0d611ce78561149d565b1610612834565b60ff601b9116019060ff8211610c9757565b6004111561029457565b905f5b82548110156121a25773ffffffffffffffffffffffffffffffffffffffff6128d882856120e3565b90549060031b1c1673ffffffffffffffffffffffffffffffffffffffff8316146121a9576001016128b0565b905f5b82518110156121a25773ffffffffffffffffffffffffffffffffffffffff61292f82856114cb565b511673ffffffffffffffffffffffffffffffffffffffff8316146121a957600101612907565b91906129618351610ce1565b908351151580612a6e575b6129759061256b565b61298261246e8284611fd2565b938192600180841614612a0c575b5f19869101935b8481106129a5575050505050565b83612a0360016129f9600f6124d2612509611d0d611ce78b60029b6129f26129e5886124d28f611d0d611ce76129de6124c99360011c90565b8099612818565b9b8d03809c5f1a92612818565b538c612818565b5f1a920189612818565b53018590612997565b92507f0f00000000000000000000000000000000000000000000000000000000000000612a4b612509611d0d611ce7612a458760011c90565b86612818565b60f81b165f1a612a5a8661149d565b535f19612a6683611eac565b939050612990565b508181111561296c565b915f915f612a8461252d565b50845115612d155790935f915b81518310156101955782158080612cff575b61019557159081612ce2575b5061019557612ac161178283836114cb565b948551600281145f14612bbe5750612ae3612ade6116d58861149d565b6130e5565b95612af9612af2888884613152565b8092610cd4565b965111612ba05715612b305750612b109051611f5c565b11610195575111612b27576116d5610b9e91611407565b50610b9e6123be565b919094612b3d8651611f5c565b82146101955780612b5f612b5b612b55600194611407565b51612d7a565b1590565b15612b8157612b70612b7691611407565b516130d7565b915b01919490612a91565b612b8d612b9a91611407565b5160208101519051902090565b91612b78565b505091509250612bb1915051611f5c565b1161019557610b9e6123be565b929491939192601103612c835781518314612c6557612bef612be9612509611d0d611ce78787612818565b93610c89565b92601081101561019557612c0c612c0682896114cb565b516130c1565b15612c2e5750505050612c2191925051611f5c565b0361019557610b9e6123be565b86612c46612b5b612b5584600196989a97999b6114cb565b15612c5857612b9a91612b70916114cb565b612b9a91612b8d916114cb565b505050612c729051611f5c565b03610195576116d5610b9e916114ba565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f696e76616c6964206e6f6465206c656e677468000000000000000000000000006044820152606490fd5b9050612cf7612cf184846114cb565b5161308a565b14155f612aaf565b50612d0d612b8d85856114cb565b871415612aa3565b509050612d4692507f56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b42191501461256b565b610b9e6123be565b906020820191612d5e8351612dfb565b925190838201809211610c975751928303928311610c97579190565b805115612d9557602060c0910151515f1a1061103757600190565b505f90565b805115612d95575f9060208101908151612db381612dfb565b8101809111610c9757915190518101809111610c975791905b828110612dd95750905090565b612de281612e66565b8101809111610c9757612df59091611eac565b90612dcc565b515f1a6080811015612e0c57505f90565b60b881108015612e50575b15612e225750600190565b60c0811015612e4157610b9e90612e3c9060b75b90611fd2565b610c89565b610b9e90612e3c9060f7612e36565b5060c08110158015612e17575060f88110612e17565b80515f1a906080821015612e7b575050600190565b60b8821015612e915750612e3c610b9e91611f97565b60c0821015612ed25760010151602082900360b7016101000a9004017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff4a0190565b60f8821015612ee85750612e3c610b9e91611f6a565b60010151602082900360f7016101000a9004017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0a0190565b601f8111610c97576101000a90565b90918015611ea7575b6020811015612f725780612f4b57505050565b612f5f612f5a612f6492611fc4565b612f20565b611f5c565b905182518216911916179052565b91908051825260208101809111610c97579060208101809111610c975791601f19810190811115612f3857610c5c565b612fac81516123d9565b90815115612fca57806020610b9e9201519051908360200190612f2f565b5090565b5f81805b61303c5750612fe0816123d9565b91815b612fec57505090565b612ff582611f5c565b6130277fff000000000000000000000000000000000000000000000000000000000000008360f81b165f1a9185612818565b5360081c908015610c97575f19019081612fe3565b9061304690611eac565b9060081c80612fd2565b8151919060418303613080576130799250602082015190606060408401519301515f1a906131f6565b9192909190565b50505f9160029190565b805160208110156130a2575060208101519051902090565b90602001512060405160208101918252602081526123b8604082610afd565b6001815103612d955760200151515f1a60801490565b6130e090612d4e565b902090565b9081511561019557600f6131016124c9611d0d611ce78661149d565b16806131145750610b9e60025f93612955565b600181036131295750610b9e60015f93612955565b6002810361313f5750610b9e6002600193612955565b60030361019557610b9e60018093612955565b91905f5b838101808211610c975782518110806131ec575b156131e45761319a7fff000000000000000000000000000000000000000000000000000000000000009184612818565b51167fff000000000000000000000000000000000000000000000000000000000000006131c78386612818565b511690036131dd576131d890611eac565b613156565b9250505090565b509250505090565b508351821061316a565b91907f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08411613285579160209360809260ff5f9560405194855216868401526040830152606082015282805260015afa1561327a575f5173ffffffffffffffffffffffffffffffffffffffff81161561327057905f905f90565b505f906001905f90565b6040513d5f823e3d90fd5b5050505f916003919056fea164736f6c634300081c000a2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d4c48d1d2b0f4f7485fc28e3db22341d96a20aa29e6efa8149da9751603abd4e06e0c24a6e293ff9b755263dbaa15ba3796b0b8d3fe17cfb4ddf8143b268eac47bd893629a699470e4ec82a5715bb4981fdaacc5d0a728bf5f55b801d8f4ef10bad3228b676f7d3cd4284a5443f17f1962b36e491b30a40b2405849e597ba5fb5","sourceMap":"242:2275:34:-:0;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;242:2275:34;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;242:2275:34;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;:::i;:::-;;-1:-1:-1;;;;;242:2275:34;;3952:25:35;;3948:84;;242:2275:34;;17667:22:35;17663:79;;-1:-1:-1;17794:3:35;242:2275:34;;17771:21:35;;;;;-1:-1:-1;;;;;17817:13:35;;;;:::i;:::-;242:2275:34;;17817:27:35;17813:111;;-1:-1:-1;17957:5:35;;;;;;17794:3;242:2275:34;;17756:13:35;;17964:3;-1:-1:-1;;;;;17991:13:35;;;;:::i;:::-;242:2275:34;;-1:-1:-1;;;;;18008:13:35;242:2275:34;;18008:13:35;:::i;:::-;242:2275:34;;17991:30:35;17987:117;;242:2275:34;;17942:13:35;;17987:117;-1:-1:-1;;;;;18071:13:35;242:2275:34;;18071:13:35;:::i;:::-;242:2275:34;;18052:33:35;;;-1:-1:-1;18052:33:35;;242:2275:34;;-1:-1:-1;18052:33:35;17813:111;-1:-1:-1;;;;;242:2275:34;17895:13:35;;242:2275:34;17895:13:35;:::i;:::-;242:2275:34;;17871:38:35;;;-1:-1:-1;17871:38:35;;242:2275:34;;-1:-1:-1;17871:38:35;17771:21;-1:-1:-1;242:2275:34;;;17771:21:35;;;;;;;242:2275:34;;-1:-1:-1;;;;;242:2275:34;;;;;;;;;;-1:-1:-1;242:2275:34;;;4186:84:35;;242:2275:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;242:2275:34;;;;;4112:255:35;;;242:2275:34;;;-1:-1:-1;;;;;242:2275:34;;;4112:255:35;;;242:2275:34;;;;;;;4112:255:35;;;242:2275:34;;;;;;;-1:-1:-1;;;;;;242:2275:34;;;;;;;;;;;;;-1:-1:-1;;;;;;242:2275:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;242:2275:34;;;4418:15:35;242:2275:34;;;;;;;;-1:-1:-1;;;;;;242:2275:34;;;;;;;;;;4525:26:35;;242:2275:34;;;;;;;4589:25:35;;;242:2275:34;;;;;;;;;;;;;;;;;;;;17751:377:35;242:2275:34;;-1:-1:-1;242:2275:34;;-1:-1:-1;242:2275:34;-1:-1:-1;242:2275:34;;;;;;;-1:-1:-1;;;;;242:2275:34;;;;4697:44:35;;;:::i;:::-;;4652:233;242:2275:34;;;;;;;;;4652:233:35;4772:43;;4829:45;4772:43;;:::i;:::-;;4829:45;:::i;:::-;;4652:233;;242:2275:34;;;-1:-1:-1;;;;;242:2275:34;;;;;;;;;;;;;;;;-1:-1:-1;242:2275:34;;;-1:-1:-1;242:2275:34;;;;;;;;;;;;;;;;-1:-1:-1;242:2275:34;;;;;;;;;;-1:-1:-1;242:2275:34;;4418:15:35;242:2275:34;;-1:-1:-1;242:2275:34;17663:79:35;17712:19;;;-1:-1:-1;17712:19:35;;-1:-1:-1;17712:19:35;3948:84;4000:21;;;-1:-1:-1;4000:21:35;;-1:-1:-1;4000:21:35;242:2275:34;;;;;;;:::i;:::-;;;;;;;;;;-1:-1:-1;242:2275:34;;;;;;;;;-1:-1:-1;;242:2275:34;;;-1:-1:-1;;;;;242:2275:34;;;;;;;;;;:::o;:::-;;;-1:-1:-1;;;;;242:2275:34;;;;;;:::o;:::-;;;-1:-1:-1;;;;;242:2275:34;;;;;;:::o;:::-;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;6145:316:93;-1:-1:-1;;;;;242:2275:34;;3976:1:35;242:2275:34;;;-1:-1:-1;;;;;;;;;;;242:2275:34;;;;;;;;;;-1:-1:-1;;;;;242:2275:34;3976:1:35;242:2275:34;;;-1:-1:-1;;;;;;;;;;;242:2275:34;;;;;;;-1:-1:-1;;242:2275:34;;;;;735:10:121;;242:2275:34;-1:-1:-1;;;;;;;;;;;3976:1:35;;6336:40:93;6313:4;6390:11;:::o;6238:217::-;6432:12;3976:1:35;6432:12:93;:::o;6145:316::-;-1:-1:-1;;;;;242:2275:34;;;;;;-1:-1:-1;;;;;;;;;;;242:2275:34;;;;;;;;;;-1:-1:-1;;;;;242:2275:34;;;;;-1:-1:-1;;;;;;;;;;;242:2275:34;;;;;;;-1:-1:-1;;242:2275:34;;;;;735:10:121;;242:2275:34;-1:-1:-1;;;;;;;;;;;2089:33:35;-1:-1:-1;;;;;;;;;;;6336:40:93;242:2275:34;6336:40:93;6313:4;6390:11;:::o;6145:316::-;242:2275:34;;;-1:-1:-1;;;;;;;;;;;242:2275:34;;-1:-1:-1;;;;;;;;;;;242:2275:34;;;;;;;;;-1:-1:-1;;;;;;;;;;;242:2275:34;;-1:-1:-1;;;;;;;;;;;242:2275:34;;-1:-1:-1;;242:2275:34;6313:4:93;242:2275:34;;;735:10:121;;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;242:2275:34;;6336:40:93;6313:4;6390:11;:::o;6238:217::-;242:2275:34;6432:12:93;:::o","linkReferences":{}},"deployedBytecode":{"object":"0x60806040526004361015610011575f80fd5b5f3560e01c806301ffc9a7146100f45780630bece356146100ef578063248a9ca3146100ea5780632f2ff15d146100e557806336568abe146100e05780634d6d9ffb146100db5780635972185a146100d6578063682ed5f0146100d157806391d14854146100cc578063a217fddf146100c7578063d547741f146100c2578063ddba6537146100bd578063edce8bdc146100b85763ef913a4b146100b3575f80fd5b610a16565b61095e565b61088b565b61085c565b610842565b6107f4565b6105e6565b6105ac565b6103ac565b610350565b61031a565b6102b5565b610217565b34610195576020600319360112610195576004357fffffffff00000000000000000000000000000000000000000000000000000000811680910361019557807f7965db0b000000000000000000000000000000000000000000000000000000006020921490811561016b575b506040519015158152f35b7f01ffc9a7000000000000000000000000000000000000000000000000000000009150145f610160565b5f80fd5b9060206003198301126101955760043567ffffffffffffffff811161019557826023820112156101955780600401359267ffffffffffffffff84116101955760248483010111610195576024019190565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b346101955761028161022836610199565b5f80527f4c48d1d2b0f4f7485fc28e3db22341d96a20aa29e6efa8149da9751603abd4e06020527f6e0c24a6e293ff9b755263dbaa15ba3796b0b8d3fe17cfb4ddf8143b268eac475490919060ff161561029957610d9d565b6040516003821015610294576020918152f35b6101ea565b6102a1611287565b610d9d565b90816020910312610195573590565b346101955760206003193601126101955760206102df6004355f525f602052600160405f20015490565b604051908152f35b6003196040910112610195576004359060243573ffffffffffffffffffffffffffffffffffffffff811681036101955790565b346101955761034e61032b366102e7565b90610349610344825f525f602052600160405f20015490565b61130f565b6121c6565b005b346101955761035e366102e7565b3373ffffffffffffffffffffffffffffffffffffffff8216036103845761034e9161229d565b7f6697b232000000000000000000000000000000000000000000000000000000005f5260045ffd5b346101955760206003193601126101955760043567ffffffffffffffff8111610195578060040160806003198336030112610195575f80527f4c48d1d2b0f4f7485fc28e3db22341d96a20aa29e6efa8149da9751603abd4e060205260ff7f6e0c24a6e293ff9b755263dbaa15ba3796b0b8d3fe17cfb4ddf8143b268eac4754161561059f575b61044761044260248401611192565b61137c565b60648201916001610458848461119c565b90500361056157906104a96104966104a261049d61049661049061048961048460446104e09a01611192565b611b30565b988761119c565b9061126e565b3691610b4d565b612372565b928061121d565b906001840154906040516104d7816104c960208201948560209181520190565b03601f198101835282610afd565b51902091612400565b805161051f5761051b61050b6104fe845467ffffffffffffffff1690565b67ffffffffffffffff1690565b6040519081529081906020820190565b0390f35b61053361052e61055e92612545565b612572565b7fd039601e000000000000000000000000000000000000000000000000000000005f52600452602490565b5ffd5b61055e61056e848461119c565b7f88b3170e000000000000000000000000000000000000000000000000000000005f52600160045260245250604490565b6105a7611287565b610433565b34610195575f6003193601126101955760206040517fbd893629a699470e4ec82a5715bb4981fdaacc5d0a728bf5f55b801d8f4ef10b8152f35b346101955760206003193601126101955760043567ffffffffffffffff8111610195578060040160a06003198336030112610195575f80527f4c48d1d2b0f4f7485fc28e3db22341d96a20aa29e6efa8149da9751603abd4e060205260ff7f6e0c24a6e293ff9b755263dbaa15ba3796b0b8d3fe17cfb4ddf8143b268eac475416156107e7575b61067c61044260248401611192565b6064820191600161068d848461119c565b90500361056157608481019060206106a5838561121d565b9050036107a957906106f46104966106ed6106e56106de61049d6104966104906106d761048460446107149c01611192565b9b8b61119c565b948761121d565b8101906102a6565b948061121d565b906001850154906040516104d7816104c960208201948560209181520190565b8051156107755761052e61072791612545565b908082036107475761051b61050b6104fe855467ffffffffffffffff1690565b7f56ed1b63000000000000000000000000000000000000000000000000000000005f5260045260245260445ffd5b61055e827f56ed1b63000000000000000000000000000000000000000000000000000000005f52906044916004525f602452565b61055e6107b6838561121d565b7f24fadac8000000000000000000000000000000000000000000000000000000005f52602060045260245250604490565b6107ef611287565b61066d565b3461019557602060ff610836610809366102e7565b905f525f845260405f209073ffffffffffffffffffffffffffffffffffffffff165f5260205260405f2090565b54166040519015158152f35b34610195575f6003193601126101955760206040515f8152f35b346101955761034e61086d366102e7565b90610886610344825f525f602052600160405f20015490565b61229d565b346101955761089936610199565b50505f80527f4c48d1d2b0f4f7485fc28e3db22341d96a20aa29e6efa8149da9751603abd4e06020527f6e0c24a6e293ff9b755263dbaa15ba3796b0b8d3fe17cfb4ddf8143b268eac475460ff1615610915575b7f2c1ed462000000000000000000000000000000000000000000000000000000005f5260045ffd5b61091d611287565b6108ed565b67ffffffffffffffff81160361019557565b601f19601f602060409481855280519182918282880152018686015e5f8582860101520116010190565b346101955760206003193601126101955761097e60043561048481610922565b67ffffffffffffffff8154166002600183015492019060405192608084019160208501526040840152606080840152815480915260a08301915f5260205f20905f5b8181106109ea5761051b856109de818703601f198101835282610afd565b60405191829182610934565b825473ffffffffffffffffffffffffffffffffffffffff168452602090930192600192830192016109c0565b34610195575f6003193601126101955761051b60405173ffffffffffffffffffffffffffffffffffffffff60015416602082015267ffffffffffffffff600254818116604084015260401c16606082015267ffffffffffffffff600354818116608084015260401c1660a082015260a081526109de60c082610afd565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b6060810190811067ffffffffffffffff821117610adc57604052565b610a93565b6040810190811067ffffffffffffffff821117610adc57604052565b90601f601f19910116810190811067ffffffffffffffff821117610adc57604052565b60405190610b2f604083610afd565b565b67ffffffffffffffff8111610adc57601f01601f191660200190565b929192610b5982610b31565b91610b676040519384610afd565b829481845281830111610195578281602093845f960137010152565b9080601f8301121561019557816020610b9e93359101610b4d565b90565b6020818303126101955780359067ffffffffffffffff8211610195570180820391608083126101955760405192610bd784610ac0565b823567ffffffffffffffff811161019557604091610bfa84601f19938701610b83565b8652011261019557604051610c0e81610ae1565b6020830135610c1c81610922565b81526040830135610c2c81610922565b60208201526020840152606082013567ffffffffffffffff811161019557610c549201610b83565b604082015290565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b9060018201809211610c9757565b610c5c565b60c001908160c011610c9757565b60f701908160f711610c9757565b6080019081608011610c9757565b60b701908160b711610c9757565b91908201809211610c9757565b908160011b9180830460021490151715610c9757565b81519167ffffffffffffffff8311610adc57680100000000000000008311610adc578154838355808410610d77575b506020610d389101915f5260205f2090565b5f5b838110610d475750505050565b6001906020610d6a855173ffffffffffffffffffffffffffffffffffffffff1690565b9401938184015501610d3a565b825f528360205f2091820191015b818110610d925750610d26565b5f8155600101610d85565b610da991810190610ba1565b9060208201610dc461044282515167ffffffffffffffff1690565b610dce8351611614565b92606084019367ffffffffffffffff610def865167ffffffffffffffff1690565b161561116a5760035491604083901c67ffffffffffffffff1693610e1d67ffffffffffffffff861642610cd4565b9460a0840195610e35875167ffffffffffffffff1690565b9067ffffffffffffffff82161161112b5750505160200151610e7290610e649067ffffffffffffffff16611b30565b9367ffffffffffffffff1690565b67ffffffffffffffff81168015159081611102575b506110ad575090610ef591610eb66002610eae610ea385611b87565b60e086015190611ca1565b950185611eba565b610ec660c0830194855190611fdf565b60406080610ee960015473ffffffffffffffffffffffffffffffffffffffff1690565b93015191015191612082565b610f22610f0a865167ffffffffffffffff1690565b67ffffffffffffffff165f52600460205260405f2090565b610f376104fe825467ffffffffffffffff1690565b61103b5750916002610fb5928694610fa8610f73610f64610f0a610fc39a9b5167ffffffffffffffff1690565b955167ffffffffffffffff1690565b859067ffffffffffffffff167fffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000825416179055565b6001840155519101610cf7565b5167ffffffffffffffff1690565b600254610fdc9060401c67ffffffffffffffff166104fe565b67ffffffffffffffff821611610ff157505f90565b611037907fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff6fffffffffffffffff00000000000000006002549260401b16911617600255565b5f90565b91611051611059945167ffffffffffffffff1690565b9051926120f8565b6110a75761055e611072835167ffffffffffffffff1690565b7fc1aea5f7000000000000000000000000000000000000000000000000000000005f5267ffffffffffffffff16600452602490565b60029150565b61055e906110c3855467ffffffffffffffff1690565b7feae35725000000000000000000000000000000000000000000000000000000005f5267ffffffffffffffff9081166004524260245216604452606490565b9050611123429161111e6104fe885467ffffffffffffffff1690565b610cd4565b11155f610e87565b7f9b772277000000000000000000000000000000000000000000000000000000005f524260045267ffffffffffffffff9081166024521660445260645ffd5b7f59d119e3000000000000000000000000000000000000000000000000000000005f5260045ffd5b35610b9e81610922565b9035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe181360301821215610195570180359067ffffffffffffffff821161019557602001918160051b3603831361019557565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b9035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe181360301821215610195570180359067ffffffffffffffff82116101955760200191813603831361019557565b9015611282578061127e9161121d565b9091565b6111f0565b335f9081527f4c48d1d2b0f4f7485fc28e3db22341d96a20aa29e6efa8149da9751603abd4e0602052604090205460ff16156112bf57565b7fe2517d3f000000000000000000000000000000000000000000000000000000005f52336004527fbd893629a699470e4ec82a5715bb4981fdaacc5d0a728bf5f55b801d8f4ef10b60245260445ffd5b805f525f60205260ff6113433360405f209073ffffffffffffffffffffffffffffffffffffffff165f5260205260405f2090565b54161561134d5750565b7fe2517d3f000000000000000000000000000000000000000000000000000000005f523360045260245260445ffd5b67ffffffffffffffff168061138e5750565b7f3ce598a9000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b60405190610100820182811067ffffffffffffffff821117610adc57604052606060e0838281528260208201528260408201525f838201525f60808201525f60a08201528260c08201520152565b8051600110156112825760400190565b805160071015611282576101000190565b8051600d1015611282576101c00190565b8051600e1015611282576101e00190565b805160081015611282576101200190565b8051600310156112825760800190565b8051600b1015611282576101800190565b8051600c1015611282576101a00190565b8051600410156112825760a00190565b8051156112825760200190565b8051600210156112825760600190565b805160101015611282576102200190565b80518210156112825760209160051b010190565b67ffffffffffffffff8111610adc5760051b60200190565b90611501826114df565b61150e6040519182610afd565b828152601f1961151e82946114df565b0190602036910137565b90602082519201517fffffffffffffffffffffffffffffffffffffffff00000000000000000000000081169260148110611560575050565b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000929350829060140360031b1b161690565b60405160a091906115a38382610afd565b6004815291601f1901825f5b8281106115bb57505050565b8060606020809385010152016115af565b906115d6826114df565b6115e36040519182610afd565b828152601f196115f382946114df565b01905f5b82811061160357505050565b8060606020809385010152016115f7565b61163061162b6116226113b9565b92808452612545565b6125b4565b602082019080825251600f8110611b0557507f1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d493476116766116708351611407565b5161267f565b03611aca57600161169061168a8351611417565b51612572565b03611a8f577f63746963616c2062797a616e74696e65206661756c7420746f6c6572616e63656116c36116708351611428565b03611a54576116db6116d58251611439565b5161269b565b80516008811490811591611a24575b506119ea575061162b61175d6116d5836117216117106104fe61168a611762985161144a565b67ffffffffffffffff166060880152565b61172e611670825161145b565b60808701526117576117466104fe61168a845161146b565b67ffffffffffffffff1660a0880152565b5161147c565b612545565b90604081019180835251600581036119bf57506117886117828351611407565b516125b4565b908151156119975761179a82516114f7565b9360c082019485525f5b8351811015611933576117ba6116d582866114cb565b80516014810361190857506117d16117d791611528565b60601c90565b73ffffffffffffffffffffffffffffffffffffffff811680156118c6575f5b8381106118325750509061182c600192611811838a516114cb565b9073ffffffffffffffffffffffffffffffffffffffff169052565b016117a4565b8161187761185e611844848d516114cb565b5173ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff1690565b14611884576001016117f6565b7f41fe18cc000000000000000000000000000000000000000000000000000000005f5273ffffffffffffffffffffffffffffffffffffffff831660045260245ffd5b7f59bff387000000000000000000000000000000000000000000000000000000005f5273ffffffffffffffffffffffffffffffffffffffff821660045260245ffd5b7f83e46ad2000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b509261178291945061194692505161148d565b61195081516115cc565b9260e081019384525f5b8251811015611991578061198a816119776116d5600195886114cb565b88519061198483836114cb565b526114cb565b500161195a565b50925050565b7f339e1ffb000000000000000000000000000000000000000000000000000000005f5260045ffd5b7f30c6792a000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b611a20906040519182917fd5edd2a500000000000000000000000000000000000000000000000000000000835260048301610934565b0390fd5b7f011b4d03dd8c01f1049143cf9c4c817e4b167f1d1b83e5c6f0f10d89ba1e7bce9150602083012014155f6116ea565b611a6461167061055e9251611428565b7fa19e609c000000000000000000000000000000000000000000000000000000005f52600452602490565b611a9f61168a61055e9251611417565b7ff71b722f000000000000000000000000000000000000000000000000000000005f52600452602490565b611ada61167061055e9251611407565b7fb8120dca000000000000000000000000000000000000000000000000000000005f52600452602490565b7fbc277732000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b67ffffffffffffffff1690815f52600460205260405f209167ffffffffffffffff83541615611b5c5750565b7ff761631b000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b6020611c26611b94611592565b611c0d611bab60408601611bb1611bab825161149d565b51612fa2565b611bba8561149d565b52611bc48461149d565b50611bd2611bab8251611407565b611bdb85611407565b52611be584611407565b50611bf3611bab82516114aa565b611bfc856114aa565b52611c06846114aa565b505161145b565b611c168261145b565b52611c208161145b565b50612771565b910190611c348251516115cc565b905f5b83518051821015611c8a579080600192600c82145f14611c78575050611c5c83612829565b611c6682866114cb565b52611c7181856114cb565b5001611c37565b611c8591611bab916114cb565b611c5c565b505050611c979150612771565b6020815191012090565b919091611cae83516114f7565b925f5b8151811015611ea757611cc481836114cb565b51805160418103611e7c575080601b60ff611d13611d0d611ce7611d2096612808565b517fff000000000000000000000000000000000000000000000000000000000000001690565b60f81c90565b1610611e29575b84613050565b90611d2a816128a3565b1590811591611e1f575b508015611e01575b611dd95773ffffffffffffffffffffffffffffffffffffffff81165f5b838110611d7957505090611d7360019261181183896114cb565b01611cb1565b81611d8a61185e611844848c6114cb565b14611d9757600101611d59565b7f33af0d5f000000000000000000000000000000000000000000000000000000005f5273ffffffffffffffffffffffffffffffffffffffff831660045260245ffd5b7f09cb44e6000000000000000000000000000000000000000000000000000000005f5260045ffd5b5073ffffffffffffffffffffffffffffffffffffffff811615611d3c565b905015155f611d34565b611e6b611e43611e3e611d0d611ce785612808565b612891565b60f81b7fff000000000000000000000000000000000000000000000000000000000000001690565b5f1a611e7682612808565b53611d1a565b7ff2db9ce1000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b505050565b5f198114610c975760010190565b905f915f5b8151811015611f1357611ef273ffffffffffffffffffffffffffffffffffffffff611eea83856114cb565b5116846128ad565b611eff575b600101611ebf565b92611f0b600191611eac565b939050611ef7565b50506003611f22915404610c89565b90818110611f2e575050565b7fe2dcb1b9000000000000000000000000000000000000000000000000000000005f5260045260245260445ffd5b905f198201918211610c9757565b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff408201918211610c9757565b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff808201918211610c9757565b6020039060208211610c9757565b91908203918211610c9757565b905f915f5b81518110156120385761201773ffffffffffffffffffffffffffffffffffffffff61200f83856114cb565b511684612904565b612024575b600101611fe4565b92612030600191611eac565b93905061201c565b50505190600382048203918211610c9757818110612054575050565b7f7818f4e4000000000000000000000000000000000000000000000000000000005f5260045260245260445ffd5b6120cc9261162b9261175d926040517fffffffffffffffffffffffffffffffffffffffff000000000000000000000000602082019260601b168252601481526104d7603482610afd565b805160021015611282576060610b9e91015161267f565b8054821015611282575f5260205f2001905f90565b919067ffffffffffffffff80612116855467ffffffffffffffff1690565b9216911614908115916121b7575b506121b1576002019081548151036121b1575f5b81518110156121a95761216e61214e82856120e3565b905473ffffffffffffffffffffffffffffffffffffffff9160031b1c1690565b73ffffffffffffffffffffffffffffffffffffffff61219361185e61184485876114cb565b9116036121a257600101612138565b5050505f90565b505050600190565b50505f90565b9050600182015414155f612124565b805f525f60205260ff6121fa8360405f209073ffffffffffffffffffffffffffffffffffffffff165f5260205260405f2090565b54166121b157805f525f6020526122328260405f209073ffffffffffffffffffffffffffffffffffffffff165f5260205260405f2090565b60017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0082541617905573ffffffffffffffffffffffffffffffffffffffff339216907f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d5f80a4600190565b805f525f60205260ff6122d18360405f209073ffffffffffffffffffffffffffffffffffffffff165f5260205260405f2090565b5416156121b157805f525f60205261230a8260405f209073ffffffffffffffffffffffffffffffffffffffff165f5260205260405f2090565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00815416905573ffffffffffffffffffffffffffffffffffffffff339216907ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b5f80a4600190565b60208151910120604051602081019182527f1260944489272988d9df285149b5aa1b0f48f2136d6f416159f840a3e07476006040820152604081526123b8606082610afd565b51902090565b604051906123cd602083610afd565b5f808352366020840137565b906123e382610b31565b6123f06040519182610afd565b828152601f1961151e8294610b31565b61162b612442919493946124146020610b31565b956124226040519788610afd565b602087526124306020610b31565b601f1960208901910136823752612545565b9061244d8451610ce1565b918451151580612525575b6124619061256b565b61247361246e5f85611fd2565b6123d9565b925f19015f5b81811061248d575050610b9e939450612a78565b8061250f600f6124d2612509611d0d611ce78d6124ac60029960011c90565b908d6125038a6124fb8a6124d26124c9611d0d611ce78a8a612818565b60041c600f1690565b1660f81b7fff000000000000000000000000000000000000000000000000000000000000001690565b5f1a92612818565b53612818565b60ff1690565b5f1a61251e6001830188612818565b5301612479565b506001612458565b6040519061253a82610ae1565b5f6020838281520152565b61254d61252d565b5060208151916040519261256084610ae1565b835201602082015290565b1561019557565b805180151590816125a8575b50156101955761258d90612d4e565b9051906020811061259c575090565b6020036101000a900490565b6021915011155f61257e565b6125bd81612d7a565b15610195576125cb81612d9a565b6125d4816114df565b916125e26040519384610afd565b818352601f196125f1836114df565b015f5b818110612668575050602061261491015161260e81612dfb565b90610cd4565b5f905b8282106126245750505090565b61266081612633600193612e66565b9061263c610b20565b82815281602082015261264f86896114cb565b5261265a85886114cb565b50610cd4565b910190612617565b60209061267361252d565b828288010152016125f4565b6021815103610195576020015160018101809111610c97575190565b805115610195576126ae610b9e91612d4e565b6126ba819392936123d9565b928360200190612f2f565b805191908290602001825e015f815290565b610b2f906126f96126f3949360405195869360208501906126c5565b906126c5565b03601f198101845283610afd565b6001907fff00000000000000000000000000000000000000000000000000000000000000610b9e949316815201906126c5565b916001610b9e94937fff000000000000000000000000000000000000000000000000000000000000006126f39416815201906126c5565b6127796123be565b905f915b81518310156127a55761279d60019161279685856114cb565b51906126d7565b92019161277d565b9150508051603881106127e45750610b9e6127c08251612fce565b916104c96127d4611e436125098651610caa565b916040519485936020850161273a565b6127f6611e43612509610b9e93610c9c565b6104c960405193849260208401612707565b8051604010156112825760600190565b908151811015611282570160200190565b600181511480612876575b610b9e578051603881106128645750610b9e6128508251612fce565b916104c96127d4611e436125098651610cc6565b6127f6611e43612509610b9e93610cb8565b50608060ff61288a611d0d611ce78561149d565b1610612834565b60ff601b9116019060ff8211610c9757565b6004111561029457565b905f5b82548110156121a25773ffffffffffffffffffffffffffffffffffffffff6128d882856120e3565b90549060031b1c1673ffffffffffffffffffffffffffffffffffffffff8316146121a9576001016128b0565b905f5b82518110156121a25773ffffffffffffffffffffffffffffffffffffffff61292f82856114cb565b511673ffffffffffffffffffffffffffffffffffffffff8316146121a957600101612907565b91906129618351610ce1565b908351151580612a6e575b6129759061256b565b61298261246e8284611fd2565b938192600180841614612a0c575b5f19869101935b8481106129a5575050505050565b83612a0360016129f9600f6124d2612509611d0d611ce78b60029b6129f26129e5886124d28f611d0d611ce76129de6124c99360011c90565b8099612818565b9b8d03809c5f1a92612818565b538c612818565b5f1a920189612818565b53018590612997565b92507f0f00000000000000000000000000000000000000000000000000000000000000612a4b612509611d0d611ce7612a458760011c90565b86612818565b60f81b165f1a612a5a8661149d565b535f19612a6683611eac565b939050612990565b508181111561296c565b915f915f612a8461252d565b50845115612d155790935f915b81518310156101955782158080612cff575b61019557159081612ce2575b5061019557612ac161178283836114cb565b948551600281145f14612bbe5750612ae3612ade6116d58861149d565b6130e5565b95612af9612af2888884613152565b8092610cd4565b965111612ba05715612b305750612b109051611f5c565b11610195575111612b27576116d5610b9e91611407565b50610b9e6123be565b919094612b3d8651611f5c565b82146101955780612b5f612b5b612b55600194611407565b51612d7a565b1590565b15612b8157612b70612b7691611407565b516130d7565b915b01919490612a91565b612b8d612b9a91611407565b5160208101519051902090565b91612b78565b505091509250612bb1915051611f5c565b1161019557610b9e6123be565b929491939192601103612c835781518314612c6557612bef612be9612509611d0d611ce78787612818565b93610c89565b92601081101561019557612c0c612c0682896114cb565b516130c1565b15612c2e5750505050612c2191925051611f5c565b0361019557610b9e6123be565b86612c46612b5b612b5584600196989a97999b6114cb565b15612c5857612b9a91612b70916114cb565b612b9a91612b8d916114cb565b505050612c729051611f5c565b03610195576116d5610b9e916114ba565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f696e76616c6964206e6f6465206c656e677468000000000000000000000000006044820152606490fd5b9050612cf7612cf184846114cb565b5161308a565b14155f612aaf565b50612d0d612b8d85856114cb565b871415612aa3565b509050612d4692507f56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b42191501461256b565b610b9e6123be565b906020820191612d5e8351612dfb565b925190838201809211610c975751928303928311610c97579190565b805115612d9557602060c0910151515f1a1061103757600190565b505f90565b805115612d95575f9060208101908151612db381612dfb565b8101809111610c9757915190518101809111610c975791905b828110612dd95750905090565b612de281612e66565b8101809111610c9757612df59091611eac565b90612dcc565b515f1a6080811015612e0c57505f90565b60b881108015612e50575b15612e225750600190565b60c0811015612e4157610b9e90612e3c9060b75b90611fd2565b610c89565b610b9e90612e3c9060f7612e36565b5060c08110158015612e17575060f88110612e17565b80515f1a906080821015612e7b575050600190565b60b8821015612e915750612e3c610b9e91611f97565b60c0821015612ed25760010151602082900360b7016101000a9004017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff4a0190565b60f8821015612ee85750612e3c610b9e91611f6a565b60010151602082900360f7016101000a9004017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0a0190565b601f8111610c97576101000a90565b90918015611ea7575b6020811015612f725780612f4b57505050565b612f5f612f5a612f6492611fc4565b612f20565b611f5c565b905182518216911916179052565b91908051825260208101809111610c97579060208101809111610c975791601f19810190811115612f3857610c5c565b612fac81516123d9565b90815115612fca57806020610b9e9201519051908360200190612f2f565b5090565b5f81805b61303c5750612fe0816123d9565b91815b612fec57505090565b612ff582611f5c565b6130277fff000000000000000000000000000000000000000000000000000000000000008360f81b165f1a9185612818565b5360081c908015610c97575f19019081612fe3565b9061304690611eac565b9060081c80612fd2565b8151919060418303613080576130799250602082015190606060408401519301515f1a906131f6565b9192909190565b50505f9160029190565b805160208110156130a2575060208101519051902090565b90602001512060405160208101918252602081526123b8604082610afd565b6001815103612d955760200151515f1a60801490565b6130e090612d4e565b902090565b9081511561019557600f6131016124c9611d0d611ce78661149d565b16806131145750610b9e60025f93612955565b600181036131295750610b9e60015f93612955565b6002810361313f5750610b9e6002600193612955565b60030361019557610b9e60018093612955565b91905f5b838101808211610c975782518110806131ec575b156131e45761319a7fff000000000000000000000000000000000000000000000000000000000000009184612818565b51167fff000000000000000000000000000000000000000000000000000000000000006131c78386612818565b511690036131dd576131d890611eac565b613156565b9250505090565b509250505090565b508351821061316a565b91907f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08411613285579160209360809260ff5f9560405194855216868401526040830152606082015282805260015afa1561327a575f5173ffffffffffffffffffffffffffffffffffffffff81161561327057905f905f90565b505f906001905f90565b6040513d5f823e3d90fd5b5050505f916003919056fea164736f6c634300081c000a","sourceMap":"242:2275:34:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;;;;-1:-1:-1;;242:2275:34;;;;;;;;;;;;;;;2639:47:93;2654:32;242:2275:34;2639:47:93;;:87;;;;;242:2275:34;;;;;;;;;;2639:87:93;844:25:133;829:40;;;2639:87:93;;;242:2275:34;-1:-1:-1;242:2275:34;;;;;-1:-1:-1;;242:2275:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;5606:2265:35;242:2275:34;;;:::i;:::-;-1:-1:-1;242:2275:34;;;;;;;;;;;;23225:42:35;23221:105;;5606:2265;:::i;:::-;242:2275:34;;;;;;;;;;;;;;;:::i;23221:105:35:-;23294:20;;:::i;:::-;5606:2265;:::i;242:2275:34:-;;;;;;;;;;;:::o;:::-;;;;;-1:-1:-1;;242:2275:34;;;;;;;;;3867:6:93;242:2275:34;3867:6:93;242:2275:34;;3867:22:93;242:2275:34;3867:6:93;242:2275:34;3867:22:93;242:2275:34;3776:120:93;;242:2275:34;;;;;;;;-1:-1:-1;;242:2275:34;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;4296:25:93;242:2275:34;;;:::i;:::-;4266:18:93;2475:4;4266:18;;3867:6;242:2275:34;3867:6:93;242:2275:34;;3867:22:93;242:2275:34;3867:6:93;242:2275:34;3867:22:93;242:2275:34;3776:120:93;;4266:18;2475:4;:::i;:::-;4296:25;:::i;:::-;242:2275:34;;;;;;;;:::i;:::-;735:10:121;242:2275:34;;;5387:34:93;5383:102;;5495:37;;;:::i;5383:102::-;5444:30;;;242:2275:34;5444:30:93;;242:2275:34;;;;;-1:-1:-1;;242:2275:34;;;;;;;;;;;;;;;;-1:-1:-1;;242:2275:34;;;;;;;-1:-1:-1;242:2275:34;;;;;;;;;23225:42:35;23221:105;;242:2275:34;9334:31:35;;:16;;;:31;:::i;:::-;;:::i;:::-;9380:9;;;;9400:1;9380:9;;;;:::i;:::-;:21;;;9376:97;;9542:31;242:2275:34;9688:10:35;9606:36;242:2275:34;9629:12:35;:9;9523:51;9542:31;;9688:95;9542:31;;;:::i;:::-;9523:51;:::i;:::-;9629:9;;;:::i;:::-;:12;;:::i;:::-;242:2275:34;;;:::i;:::-;9606:36:35;:::i;:::-;9688:10;;;:::i;242:2275:34:-;9714:26:35;9400:1;9714:26;;242:2275:34;;;;9752:29:35;;;242:2275:34;9752:29:35;;;;242:2275:34;;;;;;;9752:29:35;;-1:-1:-1;;9752:29:35;;;;;;:::i;:::-;242:2275:34;9742:40:35;;9688:95;;:::i;:::-;242:2275:34;;9793:109:35;;242:2275:34;9911:31:35;242:2275:34;;;;;;;;;;;;9911:31:35;242:2275:34;;;;;;;;;;;;;;;;;9793:109:35;9860:29;:20;9840:51;9860:20;;:::i;:::-;:29;:::i;:::-;9840:51;-1:-1:-1;9840:51:35;242:2275:34;;;;;9840:51:35;-1:-1:-1;9840:51:35;9376:97;9424:38;9445:9;;;;:::i;:::-;9424:38;-1:-1:-1;9424:38:35;9400:1;242:2275:34;;;;-1:-1:-1;242:2275:34;;;23221:105:35;23294:20;;:::i;:::-;23221:105;;242:2275:34;;;;;-1:-1:-1;;242:2275:34;;;;;;;;2089:33:35;242:2275:34;;;;;;;;-1:-1:-1;;242:2275:34;;;;;;;;;;;;;;;;-1:-1:-1;;242:2275:34;;;;;;;-1:-1:-1;242:2275:34;;;;;;;;;23225:42:35;23221:105;;242:2275:34;8106:31:35;;:16;;;:31;:::i;:::-;8152:9;;;;8172:1;8152:9;;;;:::i;:::-;:21;;;8148:97;;8258:10;;;;242:2275:34;8258:10:35;;;;:::i;:::-;:23;;;8254:102;;8425:31;242:2275:34;8638:10:35;8559:33;8570:10;8489:36;242:2275:34;8512:12:35;:9;8406:51;8425:31;;8638:95;8425:31;;;:::i;8406:51::-;8512:9;;;:::i;8489:36::-;8570:10;;;:::i;:::-;8559:33;;;;:::i;:::-;8638:10;;;:::i;242:2275:34:-;8664:26:35;8172:1;8664:26;;242:2275:34;;;;8702:29:35;;;242:2275:34;8702:29:35;;;;242:2275:34;;;;;;;8638:95:35;242:2275:34;;8747:20:35;8743:107;;8890:20;:29;:20;;:::i;:29::-;8934:28;;;;8930:116;;242:2275:34;9055:31:35;242:2275:34;;;;;;;8930:116:35;8985:50;-1:-1:-1;8985:50:35;242:2275:34;;;;;-1:-1:-1;9840:51:35;8743:107;8790:49;;;-1:-1:-1;8790:49:35;242:2275:34;;;;;-1:-1:-1;242:2275:34;;;8254:102:35;8304:41;8327:10;;;;:::i;:::-;8304:41;-1:-1:-1;8304:41:35;242:2275:34;;;;;-1:-1:-1;242:2275:34;;;23221:105:35;23294:20;;:::i;:::-;23221:105;;242:2275:34;;;;;;2920:29:93;242:2275:34;;;:::i;:::-;;2920:6:93;242:2275:34;2920:6:93;242:2275:34;;;2920:6:93;242:2275:34;;;;;;;;;;;;;2920:29:93;242:2275:34;;;;;;;;;;;;;;;-1:-1:-1;;242:2275:34;;;;;;;;;;;;;;;;4713:26:93;242:2275:34;;;:::i;:::-;4683:18:93;2475:4;4683:18;;3867:6;242:2275:34;3867:6:93;242:2275:34;;3867:22:93;242:2275:34;3867:6:93;242:2275:34;3867:22:93;242:2275:34;3776:120:93;;2475:4;4713:26;:::i;242:2275:34:-;;;;;;;:::i;:::-;-1:-1:-1;;23264:1:35;242:2275:34;;;;;;;;;23225:42:35;23221:105;;242:2275:34;10076:25:35;23264:1;10076:25;242:2275:34;23264:1:35;10076:25;23221:105;23294:20;;:::i;:::-;23221:105;;242:2275:34;;;;;;;:::o;:::-;-1:-1:-1;;242:2275:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;-1:-1:-1;;242:2275:34;;;;;5418:34:35;242:2275:34;;;;;:::i;5418:34:35:-;242:2275:34;;;;5534:25:35;5506:26;;;242:2275:34;5534:25:35;;242:2275:34;;;;;;;5469:91:35;242:2275:34;5469:91:35;;242:2275:34;;;;;;;;;;;;;;;;;;;-1:-1:-1;242:2275:34;;-1:-1:-1;242:2275:34;;-1:-1:-1;242:2275:34;;;;;;;5469:91:35;;;;;-1:-1:-1;;5469:91:35;;;;;;:::i;:::-;242:2275:34;;;;;;;:::i;:::-;;;;;;;;;;;;5506:26:35;242:2275:34;;;;;;;;;;;;-1:-1:-1;;242:2275:34;;;;;;;;;5021:11:35;242:2275:34;;5010:23:35;;;242:2275:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5010:23:35;;;;;;:::i;242:2275:34:-;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;:::i;:::-;;;;;;;;;;;;;;;:::o;:::-;;;-1:-1:-1;;242:2275:34;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;:::i;:::-;:::o;:::-;;;;;;;;-1:-1:-1;;242:2275:34;;;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;-1:-1:-1;242:2275:34;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;:::i;:::-;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;-1:-1:-1;;242:2275:34;;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;:::o;:::-;;;;;;;;;;;;2219:66:35;242:2275:34;;;;;;;:::o;:::-;;:::i;:::-;22287:4:35;242:2275:34;;;22287:4:35;242:2275:34;;;:::o;:::-;22441:4:35;242:2275:34;;;22441:4:35;242:2275:34;;;:::o;:::-;21614:4:35;242:2275:34;;;21614:4:35;242:2275:34;;;:::o;:::-;21756:4:35;242:2275:34;;;21756:4:35;242:2275:34;;;:::o;:::-;;;;;;;;;;:::o;:::-;;;;;;;;;8605:1:37;242:2275:34;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;242:2275:34;;;-1:-1:-1;242:2275:34;;;;;;;;;;;;;;;;-1:-1:-1;242:2275:34;;;;;;5606:2265:35;5790:40;5606:2265;5790:40;;;;:::i;:::-;5861:18;;;;:33;242:2275:34;5861:18:35;;242:2275:34;;;;;5861:33:35;5935:28;5948:14;;5935:28;:::i;:::-;5977:13;;;;242:2275:34;;;;;;;;;;;5977:18:35;5973:77;;6081:25;242:2275:34;;;;;;;;6063:43:35;;242:2275:34;;;6063:15:35;:43;:::i;:::-;6109:16;;;;242:2275:34;;;;;;;;;6063:62:35;242:2275:34;;;-1:-1:-1;6059:178:35;;-1:-1:-1;;6313:18:35;5861;6313:33;242:2275:34;;;6294:53:35;;242:2275:34;;9523:51:35;:::i;6294:53::-;242:2275:34;;;;;;;;;6374:31:35;;;:139;;;;5606:2265;6357:298;;;6708:25;;6928:79;6708:25;6764:72;6081:25;6692:62;6708:25;;;:::i;:::-;6735:18;;;;6692:62;;:::i;:::-;6803:32;;6764:72;;:::i;:::-;6877:17;;;;;;;;;:::i;:::-;6989;6971:16;242:2275:34;6081:11:35;242:2275:34;;;;;;6971:16:35;;242:2275:34;6989:17:35;;;6928:79;;:::i;:::-;7066:30;242:2275:34;;;;;;;;;;;;7066:15:35;242:2275:34;;;;;;;7066:30:35;7110:37;242:2275:34;;;;;;;7110:37:35;7106:303;;242:2275:34;;6081:25:35;242:2275:34;;;;7502:46:35;242:2275:34;7462:30:35;242:2275:34;;;;;;;;;7462:30:35;242:2275:34;;;;;;;7502:46:35;242:2275:34;;;;;;;;;;;7502:46:35;6081:11;7558:29;;242:2275:34;7642:17:35;7611:28;;242:2275:34;:::i;:::-;;;;;;;6081:25:35;242:2275:34;7674:55:35;;242:2275:34;;;;;;7674:55:35;242:2275:34;;;7674:55:35;7670:141;;7821:43;5861:33;5606:2265;:::o;7670:141::-;7745:55;;242:2275:34;;6081:25:35;242:2275:34;;;;;;;;6081:25:35;242:2275:34;;7745:55:35;5861:33;5606:2265;:::o;7106:303::-;242:2275:34;;7167:95:35;242:2275:34;;;;;;;7244:17:35;;7167:95;;:::i;:::-;7163:175;;7358:40;242:2275:34;;;;;;;;7358:40:35;5861:33;7358:40;242:2275:34;;7066:15:35;242:2275:34;;;;7163:175:35;6081:25;;-1:-1:-1;7282:41:35:o;6357:298::-;6545:99;242:2275:34;;;;;;;;;6545:99:35;5861:33;6545:99;242:2275:34;;;;6545:99:35;242:2275:34;6063:15:35;242:2275:34;;;;;;;;6374:139:35;6063:15;;6425:69;6063:15;242:2275:34;6425:40:35;242:2275:34;;;;;;;6425:40:35;:69;:::i;:::-;:88;;6374:139;;;6059:178;6148:78;5861:33;6148:78;6063:15;6148:78;242:2275:34;;;;;;;;;;;-1:-1:-1;9840:51:35;5973:77;6018:21;5861:33;6018:21;;5861:33;6018:21;242:2275:34;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;:::i;:::-;;;:::o;:::-;;:::i;3165:103:93:-;735:10:121;2920:6:93;242:2275:34;;;;;;;;;;;;3485:23:93;3481:108;;3165:103::o;3481:108::-;3531:47;2920:6;3531:47;735:10:121;3531:47:93;242:2275:34;2089:33:35;242:2275:34;;;2920:6:93;3531:47;3165:103;242:2275:34;2920:6:93;242:2275:34;2920:6:93;242:2275:34;;;2920:29:93;735:10:121;242:2275:34;2920:6:93;242:2275:34;;;;;;;;;;;;;2920:29:93;242:2275:34;;3485:23:93;3481:108;;3165:103;:::o;3481:108::-;3531:47;2920:6;3531:47;735:10:121;3531:47:93;242:2275:34;;;;2920:6:93;3531:47;19777:177:35;242:2275:34;;19858:19:35;19854:94;;19777:177;:::o;19854:94::-;19900:37;19876:1;19900:37;;242:2275:34;;19876:1:35;19900:37;242:2275:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;242:2275:34;;;;-1:-1:-1;242:2275:34;;;;-1:-1:-1;242:2275:34;;;;;;;;;;;:::o;:::-;;;10971:1:35;242:2275:34;;;;;;;:::o;:::-;;;11140:1:35;242:2275:34;;;;;;;:::o;:::-;;;11279:2:35;242:2275:34;;;;;;;:::o;:::-;;;11465:2:35;242:2275:34;;;;;;;:::o;:::-;;;11508:1:35;242:2275:34;;;;;;;:::o;:::-;;;11738:1:35;242:2275:34;;;;;;;:::o;:::-;;;11811:2:35;242:2275:34;;;;;;;:::o;:::-;;;11879:2:35;242:2275:34;;;;;;;:::o;:::-;;;13110:1:35;242:2275:34;;;;;;;:::o;:::-;;;;;;;;;:::o;:::-;;;2050:1;242:2275;;;;;;;:::o;:::-;;;7571:2:37;242:2275:34;;;;;;;:::o;:::-;;;;;;;;;;;;;;;:::o;2219:66:35:-;;;;;;;;;;;:::o;:::-;;;;;:::i;:::-;242:2275:34;;;;;;:::i;:::-;2219:66:35;;;-1:-1:-1;;2219:66:35;;;;:::i;:::-;;;;;;;;:::o;:::-;;242:2275:34;;;;;2219:66:35;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;242:2275:34;2219:66:35;;;:::o;:::-;242:2275:34;;2219:66:35;;242:2275:34;;2219:66:35;242:2275:34;;:::i;:::-;1856:1;2219:66:35;;;-1:-1:-1;;2219:66:35;;-1:-1:-1;2219:66:35;;;;;;;;;:::o;:::-;;242:2275:34;2219:66:35;;;;;;;;;;;;;;;:::i;:::-;242:2275:34;;;;;;:::i;:::-;2219:66:35;;;-1:-1:-1;;2219:66:35;;;;:::i;:::-;;;-1:-1:-1;2219:66:35;;;;;;;;;:::o;:::-;;242:2275:34;2219:66:35;;;;;;;;;;10610:2705;10776:30;:21;242:2275:34;;:::i;:::-;10717:28:35;;;;10776:21;:::i;:::-;:30;:::i;:::-;10755:18;;;:51;;;;242:2275:34;10848:2:35;10820:30;;10816:114;;10952:18;2401:66;10952:36;:21;:18;;:21;:::i;:::-;;:36;:::i;:::-;10944:66;10940:168;;10971:1;11121:30;:21;:18;;:21;:::i;:::-;;:30;:::i;:::-;:35;11117:122;;2219:66;11260:37;:22;:18;;:22;:::i;:37::-;11252:67;11248:167;;11446:32;:22;:18;;:22;:::i;:::-;;:32;:::i;:::-;242:2275:34;;11508:1:35;11492:17;;;;;:73;;;10610:2705;11488:130;;;11651:18;11926:21;11860:32;:22;11651:18;11628:54;11644:38;11651:30;:21;11926:30;11651:18;;:21;:::i;11644:38::-;242:2275:34;;11628:13:35;;;2219:66;;11628:54;11719:36;:21;:18;;:21;:::i;:36::-;11692:16;;;2219:66;11766:58;11785:39;11792:31;:22;:18;;:22;:::i;11785:39::-;242:2275:34;;11766:16:35;;;2219:66;;11766:58;11860:18;:22;:::i;:32::-;11926:21;:::i;:30::-;11902:21;;;;:54;;;;242:2275:34;12002:1:35;11970:33;;11966:123;;12143:21;:33;:24;:21;;:24;:::i;:::-;;:33;:::i;:::-;242:2275:34;;;12190:26:35;12186:83;;12299:36;242:2275:34;;12299:36:35;:::i;:::-;12279:17;;;;:56;;;-1:-1:-1;12392:3:35;242:2275:34;;12365:25:35;;;;;12441:27;:17;;;;:::i;:27::-;242:2275:34;;12511:2:35;12486:27;;12482:125;;12649:23;;12641:32;12649:23;;:::i;:::-;2219:66;;;;12641:32;242:2275:34;;;12691:23:35;;12687:103;;-1:-1:-1;12823:5:35;;;;;;12996:17;;;:32;10971:1;12996:17;:32;:17;;;:32;:::i;:::-;2219:66;242:2275:34;;2219:66:35;;;12996:32;2219:66;12350:13;;12830:3;12857:17;:33;:20;;:17;;;:20;:::i;:::-;242:2275:34;;;;;12857:20:35;242:2275:34;;;;12857:33:35;;12853:116;;10971:1;2219:66;12808:13;;12853:116;12921:29;-1:-1:-1;12921:29:35;242:2275:34;;;12741:34:35;242:2275:34;2219:66:35;-1:-1:-1;9840:51:35;12687:103;12741:34;-1:-1:-1;12741:34:35;242:2275:34;;;12741:34:35;242:2275:34;2219:66:35;-1:-1:-1;9840:51:35;12482:125;12540:52;-1:-1:-1;12540:52:35;242:2275:34;;;-1:-1:-1;9840:51:35;12365:25;;;13088:24;12365:25;;;13088:33;12365:25;;13088:21;:24;:::i;:33::-;13152:29;242:2275:34;;13152:29:35;:::i;:::-;13131:18;;;;:50;;;-1:-1:-1;13233:3:35;242:2275:34;;13211:20:35;;;;;13276:12;13252:46;13276:12;:22;:12;10971:1;13276:12;;;:::i;:22::-;13252:18;;:46;;;;;:::i;:::-;;;:::i;:::-;;2219:66;13196:13;;13211:20;;;;;10610:2705::o;12186:83::-;12239:19;-1:-1:-1;12239:19:35;;-1:-1:-1;12239:19:35;11966:123;12026:52;-1:-1:-1;12026:52:35;242:2275:34;;;-1:-1:-1;9840:51:35;11488:130;11588:19;242:2275:34;;;11588:19:35;;;;;;;;;;:::i;:::-;;;;11492:73;11533:32;242:2275:34;;10755:18:35;242:2275:34;;11513:16:35;:52;;11492:73;;;11248:167;11365:37;:22;11342:62;11365:18;;:22;:::i;:37::-;11342:62;-1:-1:-1;11342:62:35;242:2275:34;;;;;11117:122:35;11197:30;:21;11179:49;11197:18;;:21;:::i;:30::-;11179:49;-1:-1:-1;11179:49:35;242:2275:34;;;;;10940:168:35;11059:36;:21;11033:64;11059:18;;:21;:::i;:36::-;11033:64;-1:-1:-1;11033:64:35;242:2275:34;;;;;10816:114:35;10873:46;10717:16;10873:46;242:2275:34;;;-1:-1:-1;9840:51:35;19356:292;242:2275:34;;;;-1:-1:-1;242:2275:34;19496:15:35;242:2275:34;;;-1:-1:-1;242:2275:34;;;;;;19541:29:35;19537:105;;19356:292;:::o;19537:105::-;19593:38;-1:-1:-1;19593:38:35;19496:15;242:2275:34;;-1:-1:-1;19593:38:35;1710:805:34;2238:18;2161:26;1844:14;;:::i;:::-;21201:17:35;2093:24:34;1898:21;;;21201:17:35;1898:24:34;:21;;:24;:::i;:::-;;21201:17:35;:::i;:::-;1868:55:34;;;:::i;:::-;;;;;:::i;:::-;;21201:17:35;1963:24:34;:21;;:24;:::i;21201:17:35:-;1933:55:34;;;:::i;:::-;;;;;:::i;:::-;;21201:17:35;2028:24:34;:21;;:24;:::i;21201:17:35:-;1998:55:34;;;:::i;:::-;;;;;:::i;:::-;;2093:21;:24;:::i;21201:17:35:-;2063:55:34;;;:::i;:::-;;;;;:::i;:::-;;2161:26;:::i;:::-;2238:18;;;2226:38;2238:18;;242:2275;2226:38;:::i;:::-;2279:13;1920:1;2325:3;2298:18;;242:2275;;2294:29;;;;;2361:82;;1985:1;2361:82;2366:2;2361:7;;:82;2366:2;;;2371:33;;;;;:::i;:::-;2344:99;;;;:::i;:::-;;;;;;:::i;:::-;;2219:66:35;2279:13:34;;2361:82;21201:17:35;2421:21:34;;;;:::i;21201:17:35:-;2361:82:34;;2294:29;;;;2480:27;2294:29;;2480:27;:::i;:::-;2238:18;242:2275;;;;2470:38;1710:805;:::o;14632:509:35:-;;;;14764:27;242:2275:34;;14764:27:35;:::i;:::-;14806:13;14818:1;14839:3;242:2275:34;;14821:16:35;;;;;14898:8;;;;:::i;:::-;;242:2275:34;;15459:2:35;15444:17;;15440:95;;15554:8;;15566:2;242:2275:34;15548:15:35;15554:8;;15709:30;15554:8;;:::i;:::-;242:2275:34;;;;;15554:8:35;242:2275:34;;;;15548:15:35;242:2275:34;15548:20:35;15544:90;;14839:3;15709:30;;:::i;:::-;242:2275:34;;;;:::i;:::-;15753:33:35;;;;:64;;;14839:3;15753:88;;;;;14839:3;15749:145;;242:2275:34;;;14818:1:35;14941:5;;;;;;15105:19;;;;2219:66;15105:19;;;;;:::i;:::-;2219:66;14806:13;;14948:3;14975:10;:20;:10;;;;;:::i;:20::-;;14971:107;;2219:66;;14926:13;;14971:107;15026:33;14818:1;15026:33;242:2275:34;;;12741:34:35;242:2275:34;2219:66:35;-1:-1:-1;9840:51:35;15749:145;15864:19;14818:1;15864:19;;14818:1;15864:19;15753:88;242:2275:34;;;;15821:20:35;15753:88;;:64;15790:27;;;;15753:64;;;15544:90;15595:28;15602:20;:15;15608:8;;;;:::i;15602:15::-;:20;:::i;:::-;242:2275:34;;;;;;15595:28:35;14818:1;15584:39;;;;:::i;:::-;;15544:90;;15440:95;15484:40;14818:1;15484:40;242:2275:34;;;-1:-1:-1;9840:51:35;14821:16;;;;14632:509::o;242:2275:34:-;-1:-1:-1;;242:2275:34;;;;;;;:::o;16130:544:35:-;;16315:1;16331:13;16315:1;16366:3;242:2275:34;;16346:18:35;;;;;16389:47;242:2275:34;16425:10:35;;;;:::i;:::-;242:2275:34;;16389:47:35;;:::i;:::-;16385:94;;16366:3;2219:66;;16331:13;;16385:94;16456:8;;2219:66;16456:8;;:::i;:::-;16385:94;;;;;16346:18;;;16545:1;16518:32;16346:18;242:2275:34;;16518:32:35;:::i;:::-;16564:17;;;;16560:108;;16130:544;;:::o;16560:108::-;16604:53;16315:1;16604:53;242:2275:34;;;;;16315:1:35;16604:53;242:2275:34;;-1:-1:-1;;242:2275:34;;;;;;;:::o;:::-;;;;;;;;;;:::o;:::-;;;;;;;;;;:::o;:::-;;;;;;;;;:::o;:::-;;;;;;;;;;:::o;16897:549:35:-;;17024:1;17040:13;17024:1;17075:3;242:2275:34;;17055:18:35;;;;;17098:39;242:2275:34;17126:10:35;;;;:::i;:::-;242:2275:34;;17098:39:35;;:::i;:::-;17094:86;;17075:3;2219:66;;17040:13;;17094:86;17157:8;;2219:66;17157:8;;:::i;:::-;17094:86;;;;;17055:18;;;242:2275:34;;17329:1:35;242:2275:34;;;;;;;;;17344:17:35;;;17340:100;;16897:549;;:::o;17340:100::-;17384:45;17024:1;17384:45;242:2275:34;;;;;17024:1:35;17384:45;13610:440;13956:31;13610:440;13956:22;13610:440;13828:76;13610:440;242:2275:34;;;13877:25:35;;;242:2275:34;;;;;;13877:25:35;;;;;;;:::i;13956:31::-;242:2275:34;;14025:1:35;242:2275:34;;;;;14012:30:35;242:2275:34;;14012:15:35;:30;:::i;242:2275:34:-;;;;;;;;-1:-1:-1;242:2275:34;;-1:-1:-1;242:2275:34;;;-1:-1:-1;242:2275:34;:::o;18469:677:35:-;;;242:2275:34;;;;;;;;;;;;;;18716:37:35;;;;:82;;;18469:677;18712:125;;;18850:25;;242:2275:34;;;;;18850:53:35;18846:96;;242:2275:34;18994:3:35;242:2275:34;;18971:21:35;;;;;242:2275:34;19017:28:35;;;;:::i;:::-;242:2275:34;;;;;;;;;;;;19017:45:35;19049:13;;;;;:::i;19017:45::-;242:2275:34;;19017:45:35;19013:96;;2219:66;;18956:13;;19013:96;19082:12;;;242:2275:34;19082:12:35;:::o;18971:21::-;;;;2219:66;18469:677;:::o;18846:96::-;18919:12;;242:2275:34;18919:12:35;:::o;18716:82::-;18757:26;;;;;242:2275:34;18757:41:35;;18716:82;;;6145:316:93;242:2275:34;;;;;;;2920:29:93;242:2275:34;;;;;;;;;;;;;;;;2920:29:93;242:2275:34;;;;;;;;;;6281:29:93;242:2275:34;;;;;;;;;;;;;;;;6281:29:93;6313:4;242:2275:34;;;;;;;;735:10:121;242:2275:34;;6336:40:93;;242:2275:34;6336:40:93;;6313:4;6390:11;:::o;6698:317::-;242:2275:34;;;;;;;2920:29:93;242:2275:34;;;;;;;;;;;;;;;;2920:29:93;242:2275:34;;;;;;;;;;;6834:29:93;242:2275:34;;;;;;;;;;;;;;;;6834:29:93;242:2275:34;;;;;;;735:10:121;242:2275:34;;6890:40:93;;242:2275:34;6890:40:93;;242:2275:34;6944:11:93;:::o;14234:174:35:-;242:2275:34;;;;;14358:18:35;242:2275:34;;;14347:53:35;;242:2275:34;;;2612:66:35;242:2275:34;;;;;14347:53:35;;;;;;:::i;:::-;242:2275:34;14337:64:35;;14234:174;:::o;242:2275:34:-;;;;;;;;:::i;:::-;22080:1:35;242:2275:34;;;2219:66:35;242:2275:34;;;2219:66:35;242:2275:34:o;:::-;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;-1:-1:-1;;242:2275:34;;;;:::i;1287:390:37:-;1607:20;:29;1287:390;;;;242:2275:34;1508:2:37;242:2275:34;:::i;:::-;;;;;;;;:::i;:::-;1508:2:37;242:2275:34;;;1508:2:37;242:2275:34;:::i;:::-;-1:-1:-1;;1508:2:37;242:2275:34;;;;2219:66:35;;;1521:63:37;1607:20;:::i;:29::-;1648:21;8593:13;242:2275:34;;8593:13:37;:::i;:::-;242:2275:34;;;8624:13:37;;:33;;;1287:390;8616:42;;;:::i;:::-;8679:26;8689:15;-1:-1:-1;8689:15:37;;:::i;:::-;8679:26;:::i;:::-;8715:18;-1:-1:-1;;242:2275:34;1667:1:37;8901:14;;;;;;1600:70;;;;;;;:::i;8917:6::-;8982:5;9046:37;8998:3;9054:21;:16;9060:9;;8982:5;;8605:1;8982:5;242:2275:34;;;;8982:5:37;8979:9;;8943:59;8979:9;8965:37;8979:9;8973:21;:16;8979:9;;;;;:::i;8973:16::-;242:2275:34;;;;;;8973:21:37;8972:29;242:2275:34;;;;;;8965:37:37;1667:1;8943:59;;;:::i;:::-;;9060:9;:::i;9054:16::-;242:2275:34;;;;9046:37:37;1667:1;9020:63;;8756:1;242:2275:34;;9020:63:37;;:::i;:::-;;242:2275:34;8894:204:37;;8624:33;-1:-1:-1;8641:16:37;8624:33;;242:2275:34;;;;;;;:::i;:::-;-1:-1:-1;242:2275:34;;;;;;;:::o;2457:221:38:-;242:2275:34;;:::i;:::-;;2568:58:38;242:2275:34;;;;;;;;;:::i;:::-;2219:66:35;;2568:58:38;;2643:28;;2219:66:35;2457:221:38;:::o;242:2275:34:-;;;;:::o;7796:439:38:-;242:2275:34;;7883:12:38;;;:30;;;;7796:439;242:2275:34;;;;7957:21:38;;;:::i;:::-;7989:14;8013:192;;;;;;;8215:13;7796:439;:::o;8013:192::-;;;;;;;7796:439;:::o;7883:30::-;7911:2;7899:14;;;;7883:30;;;4170:519;4266:12;;;:::i;:::-;242:2275:34;;;4306:14:38;;;:::i;:::-;2219:66:35;;;:::i;:::-;242:2275:34;;;;;;;:::i;:::-;2219:66:35;;;-1:-1:-1;;242:2275:34;;;:::i;:::-;;-1:-1:-1;242:2275:34;;;;;;4404:11:38;;242:2275:34;4404:41:38;:11;;242:2275:34;4418:27:38;;;:::i;:::-;4404:41;;:::i;:::-;-1:-1:-1;4480:179:38;4500:9;;;;;;4669:13;;;4170:519;:::o;4511:3::-;4632:16;4540:19;;2219:66:35;4540:19:38;;:::i;:::-;242:2275:34;;;:::i;:::-;2219:66:35;;;4585:24:38;242:2275:34;4585:24:38;;2219:66:35;4573:36:38;;;;:::i;:::-;;;;;;:::i;:::-;;4632:16;:::i;:::-;4511:3;2219:66:35;4485:13:38;;;242:2275:34;;;;;:::i;:::-;;;;;;;;;;8413:298:38;8545:2;242:2275:34;;8533:14:38;242:2275:34;;8600:11:38;;242:2275:34;8614:1:38;242:2275:34;;;;;;;8625:56:38;8413:298;:::o;8857:379::-;242:2275:34;;8950:12:38;242:2275:34;;9006:21:38;9202:3;9006:21;;:::i;:::-;9059:14;;;;;;:::i;:::-;9109:61;;;;9202:3;;:::i;242:2275:34:-;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;:::i;:::-;;;:::i;:::-;;-1:-1:-1;;242:2275:34;;;;;;:::i;:::-;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;21954:538:35:-;22070:12;;:::i;:::-;22097:13;22080:1;22092:109;22130:3;242:2275:34;;22112:16:35;;;;;22159:31;2219:66;22181:8;;;;;:::i;:::-;;22159:31;;:::i;:::-;22130:3;2219:66;22097:13;;;22112:16;;;;242:2275:34;;22232:2:35;22215:19;;22211:120;;242:2275:34;22411:74:35;22365:29;242:2275:34;;22365:29:35;:::i;:::-;242:2275:34;22411:74:35;22428:37;22435:29;22441:22;242:2275:34;;22441:22:35;:::i;22428:37::-;242:2275:34;;;22411:74:35;;;;;;;:::i;22211:120::-;22274:36;22281:28;22287:21;22257:63;22287:21;;:::i;22274:36::-;22257:63;242:2275:34;;22257:63:35;;;;;;;:::i;242:2275:34:-;;;15559:2:35;242:2275:34;;;;;;;:::o;:::-;;;;;;;;;;;;;:::o;21363:440:35:-;21471:1;242:2275:34;;21457:15:35;:39;;;21363:440;21453:80;;242:2275:34;;21559:2:35;21546:15;;21542:108;;242:2275:34;21726:70:35;21684:25;242:2275:34;;21684:25:35;:::i;:::-;242:2275:34;21726:70:35;21743:37;21750:29;21756:22;242:2275:34;;21756:22:35;:::i;21542:108::-;21601:32;21608:24;21614:17;21584:55;21614:17;;:::i;21457:39::-;21482:6;21492:4;242:2275:34;21476:13:35;21482:6;;;;:::i;21476:13::-;242:2275:34;21476:20:35;21457:39;;242:2275:34;;;;;;;;;;;;:::o;:::-;;-1:-1:-1;242:2275:34;;;:::o;20174:284:35:-;;242:2275:34;20328:3:35;242:2275:34;;20305:21:35;;;;;242:2275:34;20351:13:35;;;;:::i;:::-;242:2275:34;;;;;;;;;;20351:23:35;20347:73;;2219:66;;20290:13;;20676:282;;242:2275:34;20828:3:35;242:2275:34;;20805:21:35;;;;;242:2275:34;20851:13:35;;;;:::i;:::-;242:2275:34;;;;;20851:23:35;20847:73;;2219:66;;20790:13;;8465:649:37;;;8593:13;242:2275:34;;8593:13:37;:::i;:::-;242:2275:34;;;8624:13:37;;:33;;;8465:649;8616:42;;;:::i;:::-;8679:26;8689:15;;;;:::i;8679:26::-;8715:18;;8747:10;8756:1;8747:10;;;:15;8743:118;;8465:649;-1:-1:-1;;242:2275:34;;;8894:204:37;8901:14;;;;;;8465:649;;;;;:::o;8917:6::-;8982:5;9020:63;8756:1;9046:37;8998:3;9054:21;:16;9060:9;;8982:5;8605:1;8982:5;8943:59;8965:37;8982:5;8973:21;8982:5;8979:9;;8982:5;8973:16;8982:5;242:2275:34;;;;8982:5:37;8979:9;;;:::i;8965:37::-;242:2275:34;;;8943:59:37;;8636:1;8943:59;;;:::i;:::-;;9060:9;;:::i;9046:37::-;8636:1;9020:63;242:2275:34;;9020:63:37;;:::i;:::-;;242:2275:34;8894:204:37;;;;8743:118;8808:10;;242:2275:34;8799:26:37;:21;8805:14;;8808:10;;242:2275:34;;;;8808:10:37;8805:14;;:::i;8799:26::-;242:2275:34;;;8636:1:37;8778:55;;;;:::i;:::-;;-1:-1:-1;;8847:3:37;;;:::i;:::-;8743:118;;;;;8624:33;-1:-1:-1;8641:16:37;;;;8624:33;;2316:5431;;2546:1;2557:33;2546:1;242:2275:34;;:::i;:::-;;;;2689:17:37;2685:223;;2976:13;;2546:1;2971:4724;3009:3;242:2275:34;;2991:16:37;;;;;3091:6;;;;:50;;3009:3;3087:97;;3298:6;:47;;;;3009:3;3294:94;;;3514:17;:8;;;;:::i;:17::-;242:2275:34;;;3565:1:37;3550:16;;3546:4139;3565:1;;;3744:7;3716:46;3744:17;:7;;;:::i;:17::-;3716:46;:::i;:::-;3804:56;3878:28;3804:56;;;;;:::i;:::-;3878:28;;;:::i;:::-;242:2275:34;;-1:-1:-1;3925:994:37;;4937:1185;;;242:2275:34;5015:16:37;242:2275:34;;5015:16:37;:::i;:::-;-1:-1:-1;5007:144:37;;242:2275:34;-1:-1:-1;5173:109:37;;5315:7;5351:18;5315:7;;:::i;5173:109::-;5247:12;;;:::i;4937:1185::-;242:2275:34;;;5494:16:37;242:2275:34;;5494:16:37;:::i;:::-;5489:21;;5485:138;;5650:7;5649:17;5650:16;:7;2219:66:35;5650:7:37;;:::i;:::-;;:16;:::i;:::-;5649:17;;242:2275:34;5649:17:37;5650:7;;;5837;:26;:7;;:::i;:::-;;:26;:::i;:::-;5645:459;;2219:66:35;2976:13:37;;;;;5645:459;6054:7;:27;:7;;:::i;:::-;;5445:11:38;;;242:2275:34;;;5522:62:38;;5341:272;;6054:27:37;5645:459;;;3925:994;242:2275:34;;;;;;4718:16:37;242:2275:34;;;4718:16:37;:::i;:::-;-1:-1:-1;4710:149:37;;4888:12;;:::i;3546:4139::-;6146:17;;;;;;6161:2;6146:17;6161:2;;242:2275:34;;6219:36:37;;6235:20;;6451:17;6386:43;6394:34;6400:27;;;;;:::i;6386:43::-;6451:17;;:::i;:::-;6494:12;6504:2;6494:12;;;6490:146;;6662:33;6682:12;;;;:::i;:::-;;6662:33;:::i;:::-;6682:12;;;242:2275:34;;;;6766:16:37;242:2275:34;;;;6766:16:37;:::i;:::-;6761:21;6757:157;;6947:12;;:::i;6658:555::-;6993:12;6992:22;6993:21;:12;;2219:66:35;6993:12:37;;;;;;;:::i;6992:22::-;6993:12;;;7057:31;:12;;;;:::i;6988:225::-;7158:32;:12;;;;:::i;6215:1388::-;242:2275:34;;;7411:16:37;242:2275:34;;7411:16:37;:::i;:::-;7406:21;7402:135;;7566:8;:18;:8;;:::i;6142:1543::-;242:2275:34;;7641:29:37;;;242:2275:34;7641:29:37;;;242:2275:34;;;;;;;;;;;;;11588:19:35;3298:47:37;3336:8;;3324:21;3336:8;;;;:::i;:::-;;3324:21;:::i;:::-;3308:37;;3298:47;;;3091:50;3113:8;:28;:8;;;;:::i;:28::-;3101:40;;;3091:50;;2685:223;2785:78;;;2777:87;2785:78;;2797:66;2785:78;;;2777:87;:::i;:::-;2885:12;;:::i;3469:281:38:-;;3598:11;;;242:2275:34;3583:27:38;242:2275:34;;3583:27:38;:::i;:::-;242:2275:34;;;;;;;;;;;;;;;;;;;;3723:20:38;3469:281;:::o;4838:321::-;242:2275:34;;4918:13:38;4914:31;;4994:11;868:4;4994:11;;242:2275:34;5015:64:38;242:2275:34;5015:64:38;5093:24;5089:42;;5148:4;4838:321;:::o;4914:31::-;4933:12;242:2275:34;4933:12:38;:::o;9434:424::-;242:2275:34;;9518:13:38;9514:27;;242:2275:34;9597:11:38;;;;242:2275:34;;;9611:27:38;;;:::i;:::-;242:2275:34;;;;;;;;;;;;;;;;;;9697:132:38;;9704:16;;;;;;9839:12;;;9434:424;:::o;9697:132::-;9756:20;;;:::i;:::-;242:2275:34;;;;;;;9811:7:38;9736:40;9811:7;;:::i;:::-;9697:132;;;11485:581;11589:64;242:2275:34;11589:64:38;682:4;11667:26;;682:4;;;11709:8;242:2275:34;11709:8:38;:::o;11663:397::-;776:4;11738:25;;:83;;;;11663:397;11734:326;;;11837:8;11844:1;11837:8;:::o;11734:326::-;868:4;11866:24;;868:4;;;11943:35;;:31;;958:4;11943:31;;;:::i;:::-;:35;:::i;11862:198::-;12016:33;;:29;;958:4;12016:29;242:2275:34;11738:83:38;11768:25;868:4;11768:25;;;:52;;11738:83;11768:52;11797:23;958:4;11797:23;;11738:83;;10045:1263;10171:64;;-1:-1:-1;10171:64:38;;682:4;10249:26;;682:4;;;10291:11;;10301:1;10045:1263;:::o;10245:1032::-;776:4;10323:25;;776:4;;;10374:26;;:30;:26;;:::i;10319:958::-;868:4;10425:24;;868:4;;;10465:385;;;;;;;;;;;;;;;;242:2275:34;:::o;10421:856:38:-;958:4;10870:23;;958:4;;;10919:24;;:28;:24;;:::i;10866:411::-;10978:289;;;;;;;;;;;;;;;;242:2275:34;:::o;1035:2:38:-;;;;;;;;;:::o;12279:770::-;;;12360:8;;12356:21;;12441:16;1035:2;12441:16;;;;;12642:7;12638:405;;12279:770;;;:::o;12638:405::-;12764:24;12772:15;12764:28;12772:15;;:::i;:::-;12764:24;:::i;:::-;:28;:::i;:::-;12806:227;;;;;;;;;;;;12279:770::o;12459:16::-;12491:65;;;;;;1035:2;242:2275:34;;;;;;;12600:17:38;1035:2;242:2275:34;;;;;;;12459:16:38;-1:-1:-1;;242:2275:34;;;;;;12434:194:38;242:2275:34;;:::i;6262:337:38:-;6372:19;242:2275:34;;6372:19:38;:::i;:::-;242:2275:34;;;6405:18:38;6401:37;;6542:11;6470:57;6560:8;6542:11;;242:2275:34;;;6470:57:38;;;;6560:8;;:::i;6401:37::-;6425:13;;:::o;22655:430:35:-;-1:-1:-1;22740:19:35;;22800:8;;;22895:17;;;;:::i;:::-;22922:11;22943:116;22968:5;;;23068:10;;22655:430;:::o;22975:3::-;22998:5;;;:::i;:::-;22994:31;242:2275:34;;;;;-1:-1:-1;22994:31:35;;;;:::i;:::-;;242:2275:34;;22975:3:35;242:2275:34;;;;-1:-1:-1;;242:2275:34;22948:18:35;;;;22793:73;22824:8;;;;:::i;:::-;242:2275:34;22854:1:35;242:2275:34;22793:73:35;;;2419:778:131;242:2275:34;;;2419:778:131;2609:2;2589:22;;2609:2;;3041:25;2825:196;;;;;;;;;;;;;;;-1:-1:-1;2825:196:131;3041:25;;:::i;:::-;3034:32;;;;;:::o;2585:606::-;3097:83;;3113:1;3097:83;3117:35;3097:83;;:::o;10983:270:37:-;242:2275:34;;11094:2:37;11082:14;;11094:2;;;5445:11:38;11094:2:37;5445:11:38;;242:2275:34;;;5522:62:38;;11112:32:37;:::o;11078:169::-;5445:11:38;11094:2:37;5445:11:38;242:2275:34;5522:62:38;242:2275:34;;11094:2:37;11192:43;;242:2275:34;;;11094:2:37;11192:43;;;242:2275:34;11192:43:37;;:::i;7932:335::-;8047:1;242:2275:34;;8035:13:37;8031:56;;8130:11;;242:2275:34;8151:60:37;242:2275:34;8151:60:37;8232:4;8227:9;;7932:335::o;5788:270:38:-;5909:21;5788:270;5909:21;:::i;:::-;5964:65;;5788:270;:::o;9355:729:37:-;;242:2275:34;;9485:13:37;242:2275:34;;9551:3:37;9531:17;:12;9537:5;;;;:::i;9531:17::-;:23;9596:16;;;9628:10;10051:25;9637:1;242:2275:34;9592:434:37;10051:25;:::i;9592:434::-;9702:1;9687:16;;9702:1;;9719:10;10051:25;9702:1;242:2275:34;9683:343:37;10051:25;:::i;9683:343::-;9793:1;9778:16;;9793:1;;9810:10;10051:25;9793:1;9702;9774:252;10051:25;:::i;9774:252::-;9883:1;9868:16;9883:1;;10051:25;9702:1;9924:13;9864:162;10051:25;:::i;10366:320::-;;;242:2275:34;10561:3:37;242:2275:34;;;;;;;;;;10518:24:37;;:41;;;10561:3;10518:41;;;10584:16;242:2275:34;;10584:16:37;;:::i;:::-;242:2275:34;;;10604:5:37;;;;:::i;:::-;242:2275:34;;10584:25:37;;10580:72;;10561:3;;;:::i;:::-;10511:151;;10580:72;10629:8;;;;;:::o;10518:41::-;;;;;;10366:320;:::o;10518:41::-;242:2275:34;;;10546:13:37;;10518:41;;7129:1551:131;;;8209:66;8196:79;;8192:164;;242:2275:34;;;;;;-1:-1:-1;242:2275:34;;;;;;;;;;;;;;;;;;;8467:24:131;;;;;;;;;-1:-1:-1;8467:24:131;242:2275:34;;;8505:20:131;8501:113;;8624:49;-1:-1:-1;8624:49:131;-1:-1:-1;7129:1551:131;:::o;8501:113::-;8541:62;-1:-1:-1;8541:62:131;8467:24;8541:62;-1:-1:-1;8541:62:131;:::o;8467:24::-;242:2275:34;;;;;;;;;8192:164:131;8291:54;;;8307:1;8291:54;8311:30;8291:54;;:::o","linkReferences":{}},"methodIdentifiers":{"DEFAULT_ADMIN_ROLE()":"a217fddf","PROOF_SUBMITTER_ROLE()":"5972185a","getClientState()":"ef913a4b","getConsensusState(uint64)":"edce8bdc","getRoleAdmin(bytes32)":"248a9ca3","grantRole(bytes32,address)":"2f2ff15d","hasRole(bytes32,address)":"91d14854","misbehaviour(bytes)":"ddba6537","renounceRole(bytes32,address)":"36568abe","revokeRole(bytes32,address)":"d547741f","supportsInterface(bytes4)":"01ffc9a7","updateClient(bytes)":"0bece356","verifyMembership((bytes,(uint64,uint64),bytes[],bytes))":"682ed5f0","verifyNonMembership((bytes,(uint64,uint64),bytes[]))":"4d6d9ffb"},"rawMetadata":"{\"compiler\":{\"version\":\"0.8.28+commit.7893614a\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"ibcRouter\",\"type\":\"address\"},{\"internalType\":\"uint64\",\"name\":\"initialTrustedHeight\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"initialTrustedTimestamp\",\"type\":\"uint64\"},{\"internalType\":\"bytes32\",\"name\":\"initialTrustedStorageRoot\",\"type\":\"bytes32\"},{\"internalType\":\"address[]\",\"name\":\"initialTrustedValidators\",\"type\":\"address[]\"},{\"internalType\":\"uint64\",\"name\":\"trustingPeriod\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"maxClockDrift\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"roleManager\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"AccessControlBadConfirmation\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"internalType\":\"bytes32\",\"name\":\"neededRole\",\"type\":\"bytes32\"}],\"name\":\"AccessControlUnauthorizedAccount\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"revisionHeight\",\"type\":\"uint64\"}],\"name\":\"ConflictingConsensusState\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"trustedTimestamp\",\"type\":\"uint64\"},{\"internalType\":\"uint256\",\"name\":\"currentTimestamp\",\"type\":\"uint256\"},{\"internalType\":\"uint64\",\"name\":\"trustingPeriod\",\"type\":\"uint64\"}],\"name\":\"ConsensusStateExpired\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"revisionHeight\",\"type\":\"uint64\"}],\"name\":\"ConsensusStateNotFound\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"signer\",\"type\":\"address\"}],\"name\":\"DuplicateCommitSealSigner\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"validator\",\"type\":\"address\"}],\"name\":\"DuplicateValidator\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"EmptyValidatorSet\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"currentTimestamp\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"headerTimestamp\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxClockDrift\",\"type\":\"uint256\"}],\"name\":\"HeaderFromFuture\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"actual\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"required\",\"type\":\"uint256\"}],\"name\":\"InsufficientTrustedValidatorOverlap\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"actual\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"required\",\"type\":\"uint256\"}],\"name\":\"InsufficientValidatorQuorum\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidCommitSeal\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"expectedValue\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"actualValue\",\"type\":\"bytes32\"}],\"name\":\"InvalidCommitmentValue\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"actualDifficulty\",\"type\":\"uint256\"}],\"name\":\"InvalidDifficulty\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"length\",\"type\":\"uint256\"}],\"name\":\"InvalidECDSASignatureLength\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"itemsLength\",\"type\":\"uint256\"}],\"name\":\"InvalidExtraDataFormat\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"itemsLength\",\"type\":\"uint256\"}],\"name\":\"InvalidHeaderFormat\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidHeaderHeight\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"actualMixHash\",\"type\":\"bytes32\"}],\"name\":\"InvalidMixHash\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"actualNonce\",\"type\":\"bytes\"}],\"name\":\"InvalidNonce\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"actualOmmersHash\",\"type\":\"bytes32\"}],\"name\":\"InvalidOmmersHash\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"expectedLength\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"actualLength\",\"type\":\"uint256\"}],\"name\":\"InvalidPathLength\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"providedRevisionNumber\",\"type\":\"uint64\"}],\"name\":\"InvalidRevisionNumber\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"validator\",\"type\":\"address\"}],\"name\":\"InvalidValidatorAddress\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"length\",\"type\":\"uint256\"}],\"name\":\"InvalidValidatorAddressLength\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"expectedLength\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"actualLength\",\"type\":\"uint256\"}],\"name\":\"InvalidValueLength\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"UnsupportedMisbehaviour\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"actualValue\",\"type\":\"bytes32\"}],\"name\":\"ValueExists\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"previousAdminRole\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"newAdminRole\",\"type\":\"bytes32\"}],\"name\":\"RoleAdminChanged\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"RoleGranted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"RoleRevoked\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"DEFAULT_ADMIN_ROLE\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"PROOF_SUBMITTER_ROLE\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getClientState\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"revisionHeight\",\"type\":\"uint64\"}],\"name\":\"getConsensusState\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"}],\"name\":\"getRoleAdmin\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"grantRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"hasRole\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"name\":\"misbehaviour\",\"outputs\":[],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"callerConfirmation\",\"type\":\"address\"}],\"name\":\"renounceRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"revokeRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes4\",\"name\":\"interfaceId\",\"type\":\"bytes4\"}],\"name\":\"supportsInterface\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"updateMsg\",\"type\":\"bytes\"}],\"name\":\"updateClient\",\"outputs\":[{\"internalType\":\"enum ILightClientMsgs.UpdateResult\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes\",\"name\":\"proof\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"uint64\",\"name\":\"revisionNumber\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"revisionHeight\",\"type\":\"uint64\"}],\"internalType\":\"struct IICS02ClientMsgs.Height\",\"name\":\"proofHeight\",\"type\":\"tuple\"},{\"internalType\":\"bytes[]\",\"name\":\"path\",\"type\":\"bytes[]\"},{\"internalType\":\"bytes\",\"name\":\"value\",\"type\":\"bytes\"}],\"internalType\":\"struct ILightClientMsgs.MsgVerifyMembership\",\"name\":\"msg_\",\"type\":\"tuple\"}],\"name\":\"verifyMembership\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes\",\"name\":\"proof\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"uint64\",\"name\":\"revisionNumber\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"revisionHeight\",\"type\":\"uint64\"}],\"internalType\":\"struct IICS02ClientMsgs.Height\",\"name\":\"proofHeight\",\"type\":\"tuple\"},{\"internalType\":\"bytes[]\",\"name\":\"path\",\"type\":\"bytes[]\"}],\"internalType\":\"struct ILightClientMsgs.MsgVerifyNonMembership\",\"name\":\"msg_\",\"type\":\"tuple\"}],\"name\":\"verifyNonMembership\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"errors\":{\"AccessControlBadConfirmation()\":[{\"details\":\"The caller of a function is not the expected one. NOTE: Don't confuse with {AccessControlUnauthorizedAccount}.\"}],\"AccessControlUnauthorizedAccount(address,bytes32)\":[{\"details\":\"The `account` is missing a role.\"}],\"ConflictingConsensusState(uint64)\":[{\"params\":{\"revisionHeight\":\"The conflicting revision height.\"}}],\"ConsensusStateExpired(uint64,uint256,uint64)\":[{\"params\":{\"currentTimestamp\":\"The current block timestamp.\",\"trustedTimestamp\":\"Timestamp of the trusted consensus state.\",\"trustingPeriod\":\"The configured trusting period.\"}}],\"ConsensusStateNotFound(uint64)\":[{\"params\":{\"revisionHeight\":\"The requested revision height.\"}}],\"DuplicateCommitSealSigner(address)\":[{\"params\":{\"signer\":\"The duplicate signer address.\"}}],\"DuplicateValidator(address)\":[{\"params\":{\"validator\":\"The duplicate validator address.\"}}],\"HeaderFromFuture(uint256,uint256,uint256)\":[{\"params\":{\"currentTimestamp\":\"The current block timestamp.\",\"headerTimestamp\":\"The submitted header timestamp.\",\"maxClockDrift\":\"The configured maximum clock drift.\"}}],\"InsufficientTrustedValidatorOverlap(uint256,uint256)\":[{\"params\":{\"actual\":\"The number of trusted validators that signed.\",\"required\":\"The minimum required trusted signer count.\"}}],\"InsufficientValidatorQuorum(uint256,uint256)\":[{\"params\":{\"actual\":\"The number of new validators that signed.\",\"required\":\"The minimum required signer count.\"}}],\"InvalidCommitmentValue(bytes32,bytes32)\":[{\"params\":{\"actualValue\":\"The proven commitment value.\",\"expectedValue\":\"The expected commitment value.\"}}],\"InvalidDifficulty(uint256)\":[{\"params\":{\"actualDifficulty\":\"The difficulty found in the header.\"}}],\"InvalidECDSASignatureLength(uint256)\":[{\"params\":{\"length\":\"The invalid signature length.\"}}],\"InvalidExtraDataFormat(uint256)\":[{\"params\":{\"itemsLength\":\"The decoded `extraData` item count.\"}}],\"InvalidHeaderFormat(uint256)\":[{\"params\":{\"itemsLength\":\"The decoded header item count.\"}}],\"InvalidMixHash(bytes32)\":[{\"params\":{\"actualMixHash\":\"The mix hash found in the header.\"}}],\"InvalidNonce(bytes)\":[{\"params\":{\"actualNonce\":\"The nonce found in the header.\"}}],\"InvalidOmmersHash(bytes32)\":[{\"params\":{\"actualOmmersHash\":\"The ommers hash found in the header.\"}}],\"InvalidPathLength(uint256,uint256)\":[{\"params\":{\"actualLength\":\"The actual path length.\",\"expectedLength\":\"The expected path length.\"}}],\"InvalidRevisionNumber(uint64)\":[{\"params\":{\"providedRevisionNumber\":\"The non-zero revision number.\"}}],\"InvalidValidatorAddress(address)\":[{\"params\":{\"validator\":\"The invalid validator address.\"}}],\"InvalidValidatorAddressLength(uint256)\":[{\"params\":{\"length\":\"The decoded validator address length.\"}}],\"InvalidValueLength(uint256,uint256)\":[{\"params\":{\"actualLength\":\"The actual value length.\",\"expectedLength\":\"The expected value length.\"}}],\"ValueExists(bytes32)\":[{\"params\":{\"actualValue\":\"The value found at the proven storage slot.\"}}]},\"events\":{\"RoleAdminChanged(bytes32,bytes32,bytes32)\":{\"details\":\"Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite {RoleAdminChanged} not being emitted to signal this.\"},\"RoleGranted(bytes32,address,address)\":{\"details\":\"Emitted when `account` is granted `role`. `sender` is the account that originated the contract call. This account bears the admin role (for the granted role). Expected in cases where the role was granted using the internal {AccessControl-_grantRole}.\"},\"RoleRevoked(bytes32,address,address)\":{\"details\":\"Emitted when `account` is revoked `role`. `sender` is the account that originated the contract call: - if using `revokeRole`, it is the admin role bearer - if using `renounceRole`, it is the role bearer (i.e. `account`)\"}},\"kind\":\"dev\",\"methods\":{\"constructor\":{\"params\":{\"ibcRouter\":\"Counterparty ICS26 router address whose storage is proven.\",\"initialTrustedHeight\":\"Initial trusted Besu height.\",\"initialTrustedStorageRoot\":\"Initial trusted storage root of `ibcRouter`.\",\"initialTrustedTimestamp\":\"Initial trusted header timestamp in seconds.\",\"initialTrustedValidators\":\"Initial trusted validator set.\",\"maxClockDrift\":\"Maximum allowed future drift in seconds for submitted headers.\",\"roleManager\":\"Address that administers proof submission; if zero, proof submission is open.\",\"trustingPeriod\":\"Maximum age in seconds for trusted consensus states.\"}},\"getClientState()\":{\"returns\":{\"_0\":\"The client state.\"}},\"getConsensusState(uint64)\":{\"params\":{\"revisionHeight\":\"The revision height to query.\"},\"returns\":{\"_0\":\"The ABI-encoded consensus state.\"}},\"getRoleAdmin(bytes32)\":{\"details\":\"Returns the admin role that controls `role`. See {grantRole} and {revokeRole}. To change a role's admin, use {_setRoleAdmin}.\"},\"grantRole(bytes32,address)\":{\"details\":\"Grants `role` to `account`. If `account` had not been already granted `role`, emits a {RoleGranted} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleGranted} event.\"},\"hasRole(bytes32,address)\":{\"details\":\"Returns `true` if `account` has been granted `role`.\"},\"misbehaviour(bytes)\":{\"params\":{\"misbehaviourMsg\":\"The misbehaviour message\"}},\"renounceRole(bytes32,address)\":{\"details\":\"Revokes `role` from the calling account. Roles are often managed via {grantRole} and {revokeRole}: this function's purpose is to provide a mechanism for accounts to lose their privileges if they are compromised (such as when a trusted device is misplaced). If the calling account had been revoked `role`, emits a {RoleRevoked} event. Requirements: - the caller must be `callerConfirmation`. May emit a {RoleRevoked} event.\"},\"revokeRole(bytes32,address)\":{\"details\":\"Revokes `role` from `account`. If `account` had been granted `role`, emits a {RoleRevoked} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleRevoked} event.\"},\"supportsInterface(bytes4)\":{\"details\":\"Returns true if this contract implements the interface defined by `interfaceId`. See the corresponding https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[ERC section] to learn more about how these ids are created. This function call must use less than 30 000 gas.\"},\"updateClient(bytes)\":{\"params\":{\"updateMsg\":\"The encoded update message e.g., an SP1 proof.\"},\"returns\":{\"_0\":\"The result of the update operation\"}},\"verifyMembership((bytes,(uint64,uint64),bytes[],bytes))\":{\"details\":\"Notice that this message is not view, as it may update the client state for caching purposes.\",\"params\":{\"msg_\":\"The membership message\"},\"returns\":{\"_0\":\"The unix timestamp of the verification height in the counterparty chain in seconds.\"}},\"verifyNonMembership((bytes,(uint64,uint64),bytes[]))\":{\"details\":\"Notice that this message is not view, as it may update the client state for caching purposes.\",\"params\":{\"msg_\":\"The membership message\"},\"returns\":{\"_0\":\"The unix timestamp of the verification height in the counterparty chain in seconds.\"}}},\"title\":\"Besu IBFT2 Light Client\",\"version\":1},\"userdoc\":{\"errors\":{\"ConflictingConsensusState(uint64)\":[{\"notice\":\"A different consensus state already exists at the submitted height.\"}],\"ConsensusStateExpired(uint64,uint256,uint64)\":[{\"notice\":\"The trusted consensus state is outside the trusting period.\"}],\"ConsensusStateNotFound(uint64)\":[{\"notice\":\"No consensus state exists for the requested height.\"}],\"DuplicateCommitSealSigner(address)\":[{\"notice\":\"A commit seal signer appears more than once.\"}],\"DuplicateValidator(address)\":[{\"notice\":\"A validator appears more than once.\"}],\"EmptyValidatorSet()\":[{\"notice\":\"The validator set is empty.\"}],\"HeaderFromFuture(uint256,uint256,uint256)\":[{\"notice\":\"The submitted header timestamp is too far in the future.\"}],\"InsufficientTrustedValidatorOverlap(uint256,uint256)\":[{\"notice\":\"The submitted signers do not overlap enough with the trusted validator set.\"}],\"InsufficientValidatorQuorum(uint256,uint256)\":[{\"notice\":\"The submitted signers do not meet quorum for the new validator set.\"}],\"InvalidCommitSeal()\":[{\"notice\":\"A commit seal did not recover a valid signer.\"}],\"InvalidCommitmentValue(bytes32,bytes32)\":[{\"notice\":\"A proven commitment value does not match the expected value.\"}],\"InvalidDifficulty(uint256)\":[{\"notice\":\"The Besu BFT difficulty is invalid.\"}],\"InvalidECDSASignatureLength(uint256)\":[{\"notice\":\"An ECDSA signature has an invalid length.\"}],\"InvalidExtraDataFormat(uint256)\":[{\"notice\":\"The submitted `extraData` field has an invalid RLP item count.\"}],\"InvalidHeaderFormat(uint256)\":[{\"notice\":\"The submitted header has an invalid RLP item count.\"}],\"InvalidHeaderHeight()\":[{\"notice\":\"The submitted header height is zero.\"}],\"InvalidMixHash(bytes32)\":[{\"notice\":\"The Besu BFT mix hash is invalid.\"}],\"InvalidNonce(bytes)\":[{\"notice\":\"The Besu BFT nonce is invalid.\"}],\"InvalidOmmersHash(bytes32)\":[{\"notice\":\"The ommers hash is invalid.\"}],\"InvalidPathLength(uint256,uint256)\":[{\"notice\":\"A proof path has an invalid length.\"}],\"InvalidRevisionNumber(uint64)\":[{\"notice\":\"The revision number must be zero for Besu light client heights.\"}],\"InvalidValidatorAddress(address)\":[{\"notice\":\"A validator address is invalid.\"}],\"InvalidValidatorAddressLength(uint256)\":[{\"notice\":\"A validator address has an invalid byte length.\"}],\"InvalidValueLength(uint256,uint256)\":[{\"notice\":\"A membership value has an invalid length.\"}],\"UnsupportedMisbehaviour()\":[{\"notice\":\"Misbehaviour handling is not supported by this client.\"}],\"ValueExists(bytes32)\":[{\"notice\":\"A non-membership proof found an existing value.\"}]},\"kind\":\"user\",\"methods\":{\"PROOF_SUBMITTER_ROLE()\":{\"notice\":\"Role allowed to submit client updates and proof verifications.\"},\"constructor\":{\"notice\":\"Creates a Besu IBFT2 light client from an initial trusted consensus state.\"},\"getClientState()\":{\"notice\":\"Returns the client state.\"},\"getConsensusState(uint64)\":{\"notice\":\"Returns the encoded consensus state for a revision height.\"},\"misbehaviour(bytes)\":{\"notice\":\"Misbehaviour handling, moves the light client to the frozen state if misbehaviour is detected\"},\"updateClient(bytes)\":{\"notice\":\"Updating the client and consensus state\"},\"verifyMembership((bytes,(uint64,uint64),bytes[],bytes))\":{\"notice\":\"Querying the membership of a key-value pair\"},\"verifyNonMembership((bytes,(uint64,uint64),bytes[]))\":{\"notice\":\"Querying the non-membership of a key\"}},\"notice\":\"Verifies Besu IBFT 2.0 headers and ICS26 router storage proofs.\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/light-clients/besu/BesuIBFT2LightClient.sol\":\"BesuIBFT2LightClient\"},\"evmVersion\":\"cancun\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"none\"},\"optimizer\":{\"enabled\":true,\"runs\":10000},\"remappings\":[\":@openzeppelin-contracts/=node_modules/@openzeppelin/contracts/\",\":@openzeppelin-upgradeable/=node_modules/@openzeppelin/contracts-upgradeable/\",\":@openzeppelin/=node_modules/@openzeppelin/\",\":@sp1-contracts/=node_modules/sp1-contracts/contracts/src/\",\":@uniswap/permit2/=node_modules/@uniswap/permit2/\",\":forge-std/=node_modules/forge-std/src/\",\":sp1-contracts/=node_modules/sp1-contracts/\"],\"viaIR\":true},\"sources\":{\"contracts/interfaces/ILightClient.sol\":{\"keccak256\":\"0x3b2361546ee834a442d844c979fbad3458ee13146b093f585587a09e19a266af\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://5b5d53101bb598f14a79cb1092479736fa18e8f84945ea6ef80f4dac84466042\",\"dweb:/ipfs/QmaTCo6M3Z9aYCSX65AQtixo1sB4ymQUDAgTXSKHqJHGDh\"]},\"contracts/light-clients/besu/BesuIBFT2LightClient.sol\":{\"keccak256\":\"0xc8536dfc90aa5a55d128e40d6d9715a9fbd55cef5353001da2e773cc9810160e\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://8790efb3e5909701669411298cdc72cc4e8ccdb8fcb6797e1d50e218e76a625d\",\"dweb:/ipfs/QmNiFBhRfaHHG3Tj3R8Y1nvojGs3sVCdL5ANBSgKfVj9Fz\"]},\"contracts/light-clients/besu/BesuLightClientBase.sol\":{\"keccak256\":\"0xc6e53bf0a6dc8d40d819e2f735bbae57c97454974d622901eb2361143b388529\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://c1c65ba0c1b91751f62c769a6d892371cc8af598116217643acab4a3ce470435\",\"dweb:/ipfs/Qmf1pqQC7iELqiKnSyjAPsTFYFsyWzxHez7FLjs8jax7Km\"]},\"contracts/light-clients/besu/MPTProof.sol\":{\"keccak256\":\"0x9ab26e6445b20541e8725b190006444d3b16eb3e021174e280451f934d9535c6\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://b6f3fd58b06b942a454bb9b21e9be40a2dab8a09f78e75ff4357c8afbc7e2d5b\",\"dweb:/ipfs/QmPeUwNScDiU91Xx4UQduYjyCPALYLPq73ZUMEn8Nr1rTG\"]},\"contracts/light-clients/besu/RLPReader.sol\":{\"keccak256\":\"0xa64ad17e6da7fed2bd206df52189286694339a8061dc5d158e717eda982af1d9\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://7020db2fe854e90e1b791e0e587610fc26bed3073ba1811faa275a1d8bf3c2c7\",\"dweb:/ipfs/QmdXdKghNFZSX7N9qD6BsKuJQdrFoqatsVWvHRL7vJCmeP\"]},\"contracts/light-clients/besu/errors/IBesuLightClientErrors.sol\":{\"keccak256\":\"0xfb8d8e28c81a48e1165b9d9e69406208fbb0ced1b30d9ef3293112562ffbb448\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://0d3d314a005ada41d997a6e5b254ebd70066c3ccd2e6306249c258c4a13c3623\",\"dweb:/ipfs/QmbRH23Vh7Xp1eXQmfnafMyTebuihQTLfRYeq6BbGJfYnY\"]},\"contracts/light-clients/besu/msgs/IBesuLightClientMsgs.sol\":{\"keccak256\":\"0x3fc43a3daaae2f89dca4cadbc99ea71086282f987b47a95c13489ae3384532cf\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://36083aa6833eb30d26023f7dc0b2e22b7d0723d922fcd50cf86999edc9aeb474\",\"dweb:/ipfs/QmbPv9KJj5AuJkgppuyuoaTHtiw91Qkx1tdkf1R5D4wad2\"]},\"contracts/msgs/IICS02ClientMsgs.sol\":{\"keccak256\":\"0x03d1265eae327c3744d774bf22a30d845233d50664921c9aa57cef2d71fd89d2\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://89900781cc5c60540a237d92d42745ea6165765ee8fb4d50e8137a717195cc75\",\"dweb:/ipfs/Qmbx5p8gZ8sEMMeZytXsLee49JUayhAaoJ2yxX93WUrvQo\"]},\"contracts/msgs/ILightClientMsgs.sol\":{\"keccak256\":\"0x8d1e56ab166a7b4aa6999708e3214a4645ebbc3835c2b2a4c255c9923eebafde\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://8bd4200dc04d950c0f050623fa9a8accdbec877fd446c039d4dd6c678bdf1513\",\"dweb:/ipfs/QmZQTViaA7N6BVNDzJ1Z6w799PrPoE4ajPueZSPwX4sGZ9\"]},\"node_modules/@openzeppelin/contracts/access/AccessControl.sol\":{\"keccak256\":\"0x4686ec784d75f95beaf2bf5b5f26e5f946d4c864aaee9c3c62bdc18381f5e017\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://26710ca191913f3c9df542079c4a6dcff02968e92d4f7357daefef9fbe72a19c\",\"dweb:/ipfs/QmanHbeWuBbVEqXySHa1zhm2rExjYpChDBubBaJNTCa2JB\"]},\"node_modules/@openzeppelin/contracts/access/IAccessControl.sol\":{\"keccak256\":\"0xbff9f59c84e5337689161ce7641c0ef8e872d6a7536fbc1f5133f128887aba3c\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://b308f882e796f7b79c9502deacb0a62983035c6f6f4e962b319ba6a1f4a77d3d\",\"dweb:/ipfs/QmaWCW7ahEQqFjwhSUhV7Ae7WhfNvzSpE7DQ58hvEooqPL\"]},\"node_modules/@openzeppelin/contracts/utils/Context.sol\":{\"keccak256\":\"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://6a708e8a5bdb1011c2c381c9a5cfd8a9a956d7d0a9dc1bd8bcdaf52f76ef2f12\",\"dweb:/ipfs/Qmax9WHBnVsZP46ZxEMNRQpLQnrdE4dK8LehML1Py8FowF\"]},\"node_modules/@openzeppelin/contracts/utils/cryptography/ECDSA.sol\":{\"keccak256\":\"0xbeb5cad8aaabe0d35d2ec1a8414d91e81e5a8ca679add4cf57e2f33476861f40\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://ebb272a5ee2da4e8bd5551334e0ce8dce4e9c56a04570d6bf046d260fab3116a\",\"dweb:/ipfs/QmNw6RyM769qcqFocDq6HJMG2WiEnQbvizpRaUXsACHho2\"]},\"node_modules/@openzeppelin/contracts/utils/introspection/ERC165.sol\":{\"keccak256\":\"0x2d9dc2fe26180f74c11c13663647d38e259e45f95eb88f57b61d2160b0109d3e\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://81233d1f98060113d9922180bb0f14f8335856fe9f339134b09335e9f678c377\",\"dweb:/ipfs/QmWh6R35SarhAn4z2wH8SU456jJSYL2FgucfTFgbHJJN4E\"]},\"node_modules/@openzeppelin/contracts/utils/introspection/IERC165.sol\":{\"keccak256\":\"0x8891738ffe910f0cf2da09566928589bf5d63f4524dd734fd9cedbac3274dd5c\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://971f954442df5c2ef5b5ebf1eb245d7105d9fbacc7386ee5c796df1d45b21617\",\"dweb:/ipfs/QmadRjHbkicwqwwh61raUEapaVEtaLMcYbQZWs9gUkgj3u\"]}},\"version\":1}","metadata":{"compiler":{"version":"0.8.28+commit.7893614a"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"address","name":"ibcRouter","type":"address"},{"internalType":"uint64","name":"initialTrustedHeight","type":"uint64"},{"internalType":"uint64","name":"initialTrustedTimestamp","type":"uint64"},{"internalType":"bytes32","name":"initialTrustedStorageRoot","type":"bytes32"},{"internalType":"address[]","name":"initialTrustedValidators","type":"address[]"},{"internalType":"uint64","name":"trustingPeriod","type":"uint64"},{"internalType":"uint64","name":"maxClockDrift","type":"uint64"},{"internalType":"address","name":"roleManager","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"type":"error","name":"AccessControlBadConfirmation"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bytes32","name":"neededRole","type":"bytes32"}],"type":"error","name":"AccessControlUnauthorizedAccount"},{"inputs":[{"internalType":"uint64","name":"revisionHeight","type":"uint64"}],"type":"error","name":"ConflictingConsensusState"},{"inputs":[{"internalType":"uint64","name":"trustedTimestamp","type":"uint64"},{"internalType":"uint256","name":"currentTimestamp","type":"uint256"},{"internalType":"uint64","name":"trustingPeriod","type":"uint64"}],"type":"error","name":"ConsensusStateExpired"},{"inputs":[{"internalType":"uint64","name":"revisionHeight","type":"uint64"}],"type":"error","name":"ConsensusStateNotFound"},{"inputs":[{"internalType":"address","name":"signer","type":"address"}],"type":"error","name":"DuplicateCommitSealSigner"},{"inputs":[{"internalType":"address","name":"validator","type":"address"}],"type":"error","name":"DuplicateValidator"},{"inputs":[],"type":"error","name":"EmptyValidatorSet"},{"inputs":[{"internalType":"uint256","name":"currentTimestamp","type":"uint256"},{"internalType":"uint256","name":"headerTimestamp","type":"uint256"},{"internalType":"uint256","name":"maxClockDrift","type":"uint256"}],"type":"error","name":"HeaderFromFuture"},{"inputs":[{"internalType":"uint256","name":"actual","type":"uint256"},{"internalType":"uint256","name":"required","type":"uint256"}],"type":"error","name":"InsufficientTrustedValidatorOverlap"},{"inputs":[{"internalType":"uint256","name":"actual","type":"uint256"},{"internalType":"uint256","name":"required","type":"uint256"}],"type":"error","name":"InsufficientValidatorQuorum"},{"inputs":[],"type":"error","name":"InvalidCommitSeal"},{"inputs":[{"internalType":"bytes32","name":"expectedValue","type":"bytes32"},{"internalType":"bytes32","name":"actualValue","type":"bytes32"}],"type":"error","name":"InvalidCommitmentValue"},{"inputs":[{"internalType":"uint256","name":"actualDifficulty","type":"uint256"}],"type":"error","name":"InvalidDifficulty"},{"inputs":[{"internalType":"uint256","name":"length","type":"uint256"}],"type":"error","name":"InvalidECDSASignatureLength"},{"inputs":[{"internalType":"uint256","name":"itemsLength","type":"uint256"}],"type":"error","name":"InvalidExtraDataFormat"},{"inputs":[{"internalType":"uint256","name":"itemsLength","type":"uint256"}],"type":"error","name":"InvalidHeaderFormat"},{"inputs":[],"type":"error","name":"InvalidHeaderHeight"},{"inputs":[{"internalType":"bytes32","name":"actualMixHash","type":"bytes32"}],"type":"error","name":"InvalidMixHash"},{"inputs":[{"internalType":"bytes","name":"actualNonce","type":"bytes"}],"type":"error","name":"InvalidNonce"},{"inputs":[{"internalType":"bytes32","name":"actualOmmersHash","type":"bytes32"}],"type":"error","name":"InvalidOmmersHash"},{"inputs":[{"internalType":"uint256","name":"expectedLength","type":"uint256"},{"internalType":"uint256","name":"actualLength","type":"uint256"}],"type":"error","name":"InvalidPathLength"},{"inputs":[{"internalType":"uint64","name":"providedRevisionNumber","type":"uint64"}],"type":"error","name":"InvalidRevisionNumber"},{"inputs":[{"internalType":"address","name":"validator","type":"address"}],"type":"error","name":"InvalidValidatorAddress"},{"inputs":[{"internalType":"uint256","name":"length","type":"uint256"}],"type":"error","name":"InvalidValidatorAddressLength"},{"inputs":[{"internalType":"uint256","name":"expectedLength","type":"uint256"},{"internalType":"uint256","name":"actualLength","type":"uint256"}],"type":"error","name":"InvalidValueLength"},{"inputs":[],"type":"error","name":"UnsupportedMisbehaviour"},{"inputs":[{"internalType":"bytes32","name":"actualValue","type":"bytes32"}],"type":"error","name":"ValueExists"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32","indexed":true},{"internalType":"bytes32","name":"previousAdminRole","type":"bytes32","indexed":true},{"internalType":"bytes32","name":"newAdminRole","type":"bytes32","indexed":true}],"type":"event","name":"RoleAdminChanged","anonymous":false},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32","indexed":true},{"internalType":"address","name":"account","type":"address","indexed":true},{"internalType":"address","name":"sender","type":"address","indexed":true}],"type":"event","name":"RoleGranted","anonymous":false},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32","indexed":true},{"internalType":"address","name":"account","type":"address","indexed":true},{"internalType":"address","name":"sender","type":"address","indexed":true}],"type":"event","name":"RoleRevoked","anonymous":false},{"inputs":[],"stateMutability":"view","type":"function","name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"PROOF_SUBMITTER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"getClientState","outputs":[{"internalType":"bytes","name":"","type":"bytes"}]},{"inputs":[{"internalType":"uint64","name":"revisionHeight","type":"uint64"}],"stateMutability":"view","type":"function","name":"getConsensusState","outputs":[{"internalType":"bytes","name":"","type":"bytes"}]},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"stateMutability":"view","type":"function","name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}]},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"stateMutability":"nonpayable","type":"function","name":"grantRole"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"stateMutability":"view","type":"function","name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}]},{"inputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function","name":"misbehaviour"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"callerConfirmation","type":"address"}],"stateMutability":"nonpayable","type":"function","name":"renounceRole"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"stateMutability":"nonpayable","type":"function","name":"revokeRole"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"stateMutability":"view","type":"function","name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}]},{"inputs":[{"internalType":"bytes","name":"updateMsg","type":"bytes"}],"stateMutability":"nonpayable","type":"function","name":"updateClient","outputs":[{"internalType":"enum ILightClientMsgs.UpdateResult","name":"","type":"uint8"}]},{"inputs":[{"internalType":"struct ILightClientMsgs.MsgVerifyMembership","name":"msg_","type":"tuple","components":[{"internalType":"bytes","name":"proof","type":"bytes"},{"internalType":"struct IICS02ClientMsgs.Height","name":"proofHeight","type":"tuple","components":[{"internalType":"uint64","name":"revisionNumber","type":"uint64"},{"internalType":"uint64","name":"revisionHeight","type":"uint64"}]},{"internalType":"bytes[]","name":"path","type":"bytes[]"},{"internalType":"bytes","name":"value","type":"bytes"}]}],"stateMutability":"view","type":"function","name":"verifyMembership","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[{"internalType":"struct ILightClientMsgs.MsgVerifyNonMembership","name":"msg_","type":"tuple","components":[{"internalType":"bytes","name":"proof","type":"bytes"},{"internalType":"struct IICS02ClientMsgs.Height","name":"proofHeight","type":"tuple","components":[{"internalType":"uint64","name":"revisionNumber","type":"uint64"},{"internalType":"uint64","name":"revisionHeight","type":"uint64"}]},{"internalType":"bytes[]","name":"path","type":"bytes[]"}]}],"stateMutability":"view","type":"function","name":"verifyNonMembership","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]}],"devdoc":{"kind":"dev","methods":{"constructor":{"params":{"ibcRouter":"Counterparty ICS26 router address whose storage is proven.","initialTrustedHeight":"Initial trusted Besu height.","initialTrustedStorageRoot":"Initial trusted storage root of `ibcRouter`.","initialTrustedTimestamp":"Initial trusted header timestamp in seconds.","initialTrustedValidators":"Initial trusted validator set.","maxClockDrift":"Maximum allowed future drift in seconds for submitted headers.","roleManager":"Address that administers proof submission; if zero, proof submission is open.","trustingPeriod":"Maximum age in seconds for trusted consensus states."}},"getClientState()":{"returns":{"_0":"The client state."}},"getConsensusState(uint64)":{"params":{"revisionHeight":"The revision height to query."},"returns":{"_0":"The ABI-encoded consensus state."}},"getRoleAdmin(bytes32)":{"details":"Returns the admin role that controls `role`. See {grantRole} and {revokeRole}. To change a role's admin, use {_setRoleAdmin}."},"grantRole(bytes32,address)":{"details":"Grants `role` to `account`. If `account` had not been already granted `role`, emits a {RoleGranted} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleGranted} event."},"hasRole(bytes32,address)":{"details":"Returns `true` if `account` has been granted `role`."},"misbehaviour(bytes)":{"params":{"misbehaviourMsg":"The misbehaviour message"}},"renounceRole(bytes32,address)":{"details":"Revokes `role` from the calling account. Roles are often managed via {grantRole} and {revokeRole}: this function's purpose is to provide a mechanism for accounts to lose their privileges if they are compromised (such as when a trusted device is misplaced). If the calling account had been revoked `role`, emits a {RoleRevoked} event. Requirements: - the caller must be `callerConfirmation`. May emit a {RoleRevoked} event."},"revokeRole(bytes32,address)":{"details":"Revokes `role` from `account`. If `account` had been granted `role`, emits a {RoleRevoked} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleRevoked} event."},"supportsInterface(bytes4)":{"details":"Returns true if this contract implements the interface defined by `interfaceId`. See the corresponding https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[ERC section] to learn more about how these ids are created. This function call must use less than 30 000 gas."},"updateClient(bytes)":{"params":{"updateMsg":"The encoded update message e.g., an SP1 proof."},"returns":{"_0":"The result of the update operation"}},"verifyMembership((bytes,(uint64,uint64),bytes[],bytes))":{"details":"Notice that this message is not view, as it may update the client state for caching purposes.","params":{"msg_":"The membership message"},"returns":{"_0":"The unix timestamp of the verification height in the counterparty chain in seconds."}},"verifyNonMembership((bytes,(uint64,uint64),bytes[]))":{"details":"Notice that this message is not view, as it may update the client state for caching purposes.","params":{"msg_":"The membership message"},"returns":{"_0":"The unix timestamp of the verification height in the counterparty chain in seconds."}}},"version":1},"userdoc":{"kind":"user","methods":{"PROOF_SUBMITTER_ROLE()":{"notice":"Role allowed to submit client updates and proof verifications."},"constructor":{"notice":"Creates a Besu IBFT2 light client from an initial trusted consensus state."},"getClientState()":{"notice":"Returns the client state."},"getConsensusState(uint64)":{"notice":"Returns the encoded consensus state for a revision height."},"misbehaviour(bytes)":{"notice":"Misbehaviour handling, moves the light client to the frozen state if misbehaviour is detected"},"updateClient(bytes)":{"notice":"Updating the client and consensus state"},"verifyMembership((bytes,(uint64,uint64),bytes[],bytes))":{"notice":"Querying the membership of a key-value pair"},"verifyNonMembership((bytes,(uint64,uint64),bytes[]))":{"notice":"Querying the non-membership of a key"}},"version":1}},"settings":{"remappings":["@openzeppelin-contracts/=node_modules/@openzeppelin/contracts/","@openzeppelin-upgradeable/=node_modules/@openzeppelin/contracts-upgradeable/","@openzeppelin/=node_modules/@openzeppelin/","@sp1-contracts/=node_modules/sp1-contracts/contracts/src/","@uniswap/permit2/=node_modules/@uniswap/permit2/","forge-std/=node_modules/forge-std/src/","sp1-contracts/=node_modules/sp1-contracts/"],"optimizer":{"enabled":true,"runs":10000},"metadata":{"bytecodeHash":"none"},"compilationTarget":{"contracts/light-clients/besu/BesuIBFT2LightClient.sol":"BesuIBFT2LightClient"},"evmVersion":"cancun","libraries":{},"viaIR":true},"sources":{"contracts/interfaces/ILightClient.sol":{"keccak256":"0x3b2361546ee834a442d844c979fbad3458ee13146b093f585587a09e19a266af","urls":["bzz-raw://5b5d53101bb598f14a79cb1092479736fa18e8f84945ea6ef80f4dac84466042","dweb:/ipfs/QmaTCo6M3Z9aYCSX65AQtixo1sB4ymQUDAgTXSKHqJHGDh"],"license":"Apache-2.0"},"contracts/light-clients/besu/BesuIBFT2LightClient.sol":{"keccak256":"0xc8536dfc90aa5a55d128e40d6d9715a9fbd55cef5353001da2e773cc9810160e","urls":["bzz-raw://8790efb3e5909701669411298cdc72cc4e8ccdb8fcb6797e1d50e218e76a625d","dweb:/ipfs/QmNiFBhRfaHHG3Tj3R8Y1nvojGs3sVCdL5ANBSgKfVj9Fz"],"license":"Apache-2.0"},"contracts/light-clients/besu/BesuLightClientBase.sol":{"keccak256":"0xc6e53bf0a6dc8d40d819e2f735bbae57c97454974d622901eb2361143b388529","urls":["bzz-raw://c1c65ba0c1b91751f62c769a6d892371cc8af598116217643acab4a3ce470435","dweb:/ipfs/Qmf1pqQC7iELqiKnSyjAPsTFYFsyWzxHez7FLjs8jax7Km"],"license":"Apache-2.0"},"contracts/light-clients/besu/MPTProof.sol":{"keccak256":"0x9ab26e6445b20541e8725b190006444d3b16eb3e021174e280451f934d9535c6","urls":["bzz-raw://b6f3fd58b06b942a454bb9b21e9be40a2dab8a09f78e75ff4357c8afbc7e2d5b","dweb:/ipfs/QmPeUwNScDiU91Xx4UQduYjyCPALYLPq73ZUMEn8Nr1rTG"],"license":"Apache-2.0"},"contracts/light-clients/besu/RLPReader.sol":{"keccak256":"0xa64ad17e6da7fed2bd206df52189286694339a8061dc5d158e717eda982af1d9","urls":["bzz-raw://7020db2fe854e90e1b791e0e587610fc26bed3073ba1811faa275a1d8bf3c2c7","dweb:/ipfs/QmdXdKghNFZSX7N9qD6BsKuJQdrFoqatsVWvHRL7vJCmeP"],"license":"Apache-2.0"},"contracts/light-clients/besu/errors/IBesuLightClientErrors.sol":{"keccak256":"0xfb8d8e28c81a48e1165b9d9e69406208fbb0ced1b30d9ef3293112562ffbb448","urls":["bzz-raw://0d3d314a005ada41d997a6e5b254ebd70066c3ccd2e6306249c258c4a13c3623","dweb:/ipfs/QmbRH23Vh7Xp1eXQmfnafMyTebuihQTLfRYeq6BbGJfYnY"],"license":"Apache-2.0"},"contracts/light-clients/besu/msgs/IBesuLightClientMsgs.sol":{"keccak256":"0x3fc43a3daaae2f89dca4cadbc99ea71086282f987b47a95c13489ae3384532cf","urls":["bzz-raw://36083aa6833eb30d26023f7dc0b2e22b7d0723d922fcd50cf86999edc9aeb474","dweb:/ipfs/QmbPv9KJj5AuJkgppuyuoaTHtiw91Qkx1tdkf1R5D4wad2"],"license":"Apache-2.0"},"contracts/msgs/IICS02ClientMsgs.sol":{"keccak256":"0x03d1265eae327c3744d774bf22a30d845233d50664921c9aa57cef2d71fd89d2","urls":["bzz-raw://89900781cc5c60540a237d92d42745ea6165765ee8fb4d50e8137a717195cc75","dweb:/ipfs/Qmbx5p8gZ8sEMMeZytXsLee49JUayhAaoJ2yxX93WUrvQo"],"license":"Apache-2.0"},"contracts/msgs/ILightClientMsgs.sol":{"keccak256":"0x8d1e56ab166a7b4aa6999708e3214a4645ebbc3835c2b2a4c255c9923eebafde","urls":["bzz-raw://8bd4200dc04d950c0f050623fa9a8accdbec877fd446c039d4dd6c678bdf1513","dweb:/ipfs/QmZQTViaA7N6BVNDzJ1Z6w799PrPoE4ajPueZSPwX4sGZ9"],"license":"Apache-2.0"},"node_modules/@openzeppelin/contracts/access/AccessControl.sol":{"keccak256":"0x4686ec784d75f95beaf2bf5b5f26e5f946d4c864aaee9c3c62bdc18381f5e017","urls":["bzz-raw://26710ca191913f3c9df542079c4a6dcff02968e92d4f7357daefef9fbe72a19c","dweb:/ipfs/QmanHbeWuBbVEqXySHa1zhm2rExjYpChDBubBaJNTCa2JB"],"license":"MIT"},"node_modules/@openzeppelin/contracts/access/IAccessControl.sol":{"keccak256":"0xbff9f59c84e5337689161ce7641c0ef8e872d6a7536fbc1f5133f128887aba3c","urls":["bzz-raw://b308f882e796f7b79c9502deacb0a62983035c6f6f4e962b319ba6a1f4a77d3d","dweb:/ipfs/QmaWCW7ahEQqFjwhSUhV7Ae7WhfNvzSpE7DQ58hvEooqPL"],"license":"MIT"},"node_modules/@openzeppelin/contracts/utils/Context.sol":{"keccak256":"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2","urls":["bzz-raw://6a708e8a5bdb1011c2c381c9a5cfd8a9a956d7d0a9dc1bd8bcdaf52f76ef2f12","dweb:/ipfs/Qmax9WHBnVsZP46ZxEMNRQpLQnrdE4dK8LehML1Py8FowF"],"license":"MIT"},"node_modules/@openzeppelin/contracts/utils/cryptography/ECDSA.sol":{"keccak256":"0xbeb5cad8aaabe0d35d2ec1a8414d91e81e5a8ca679add4cf57e2f33476861f40","urls":["bzz-raw://ebb272a5ee2da4e8bd5551334e0ce8dce4e9c56a04570d6bf046d260fab3116a","dweb:/ipfs/QmNw6RyM769qcqFocDq6HJMG2WiEnQbvizpRaUXsACHho2"],"license":"MIT"},"node_modules/@openzeppelin/contracts/utils/introspection/ERC165.sol":{"keccak256":"0x2d9dc2fe26180f74c11c13663647d38e259e45f95eb88f57b61d2160b0109d3e","urls":["bzz-raw://81233d1f98060113d9922180bb0f14f8335856fe9f339134b09335e9f678c377","dweb:/ipfs/QmWh6R35SarhAn4z2wH8SU456jJSYL2FgucfTFgbHJJN4E"],"license":"MIT"},"node_modules/@openzeppelin/contracts/utils/introspection/IERC165.sol":{"keccak256":"0x8891738ffe910f0cf2da09566928589bf5d63f4524dd734fd9cedbac3274dd5c","urls":["bzz-raw://971f954442df5c2ef5b5ebf1eb245d7105d9fbacc7386ee5c796df1d45b21617","dweb:/ipfs/QmadRjHbkicwqwwh61raUEapaVEtaLMcYbQZWs9gUkgj3u"],"license":"MIT"}},"version":1},"id":34} \ No newline at end of file +{"abi":[{"type":"constructor","inputs":[{"name":"ibcRouter","type":"address","internalType":"address"},{"name":"initialTrustedHeight","type":"uint64","internalType":"uint64"},{"name":"initialTrustedTimestamp","type":"uint64","internalType":"uint64"},{"name":"initialTrustedStorageRoot","type":"bytes32","internalType":"bytes32"},{"name":"initialTrustedValidators","type":"address[]","internalType":"address[]"},{"name":"trustingPeriod","type":"uint64","internalType":"uint64"},{"name":"maxClockDrift","type":"uint64","internalType":"uint64"},{"name":"roleManager","type":"address","internalType":"address"}],"stateMutability":"nonpayable"},{"type":"function","name":"DEFAULT_ADMIN_ROLE","inputs":[],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"type":"function","name":"PROOF_SUBMITTER_ROLE","inputs":[],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"type":"function","name":"getClientState","inputs":[],"outputs":[{"name":"","type":"bytes","internalType":"bytes"}],"stateMutability":"view"},{"type":"function","name":"getConsensusState","inputs":[{"name":"revisionHeight","type":"uint64","internalType":"uint64"}],"outputs":[{"name":"","type":"bytes","internalType":"bytes"}],"stateMutability":"view"},{"type":"function","name":"getRoleAdmin","inputs":[{"name":"role","type":"bytes32","internalType":"bytes32"}],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"type":"function","name":"grantRole","inputs":[{"name":"role","type":"bytes32","internalType":"bytes32"},{"name":"account","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"hasRole","inputs":[{"name":"role","type":"bytes32","internalType":"bytes32"},{"name":"account","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"misbehaviour","inputs":[{"name":"","type":"bytes","internalType":"bytes"}],"outputs":[],"stateMutability":"view"},{"type":"function","name":"renounceRole","inputs":[{"name":"role","type":"bytes32","internalType":"bytes32"},{"name":"callerConfirmation","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"revokeRole","inputs":[{"name":"role","type":"bytes32","internalType":"bytes32"},{"name":"account","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"supportsInterface","inputs":[{"name":"interfaceId","type":"bytes4","internalType":"bytes4"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"updateClient","inputs":[{"name":"updateMsg","type":"bytes","internalType":"bytes"}],"outputs":[{"name":"","type":"uint8","internalType":"enum ILightClientMsgs.UpdateResult"}],"stateMutability":"nonpayable"},{"type":"function","name":"verifyMembership","inputs":[{"name":"msg_","type":"tuple","internalType":"struct ILightClientMsgs.MsgVerifyMembership","components":[{"name":"proof","type":"bytes","internalType":"bytes"},{"name":"proofHeight","type":"tuple","internalType":"struct IICS02ClientMsgs.Height","components":[{"name":"revisionNumber","type":"uint64","internalType":"uint64"},{"name":"revisionHeight","type":"uint64","internalType":"uint64"}]},{"name":"path","type":"bytes[]","internalType":"bytes[]"},{"name":"value","type":"bytes","internalType":"bytes"}]}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"verifyNonMembership","inputs":[{"name":"msg_","type":"tuple","internalType":"struct ILightClientMsgs.MsgVerifyNonMembership","components":[{"name":"proof","type":"bytes","internalType":"bytes"},{"name":"proofHeight","type":"tuple","internalType":"struct IICS02ClientMsgs.Height","components":[{"name":"revisionNumber","type":"uint64","internalType":"uint64"},{"name":"revisionHeight","type":"uint64","internalType":"uint64"}]},{"name":"path","type":"bytes[]","internalType":"bytes[]"}]}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"event","name":"RoleAdminChanged","inputs":[{"name":"role","type":"bytes32","indexed":true,"internalType":"bytes32"},{"name":"previousAdminRole","type":"bytes32","indexed":true,"internalType":"bytes32"},{"name":"newAdminRole","type":"bytes32","indexed":true,"internalType":"bytes32"}],"anonymous":false},{"type":"event","name":"RoleGranted","inputs":[{"name":"role","type":"bytes32","indexed":true,"internalType":"bytes32"},{"name":"account","type":"address","indexed":true,"internalType":"address"},{"name":"sender","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"type":"event","name":"RoleRevoked","inputs":[{"name":"role","type":"bytes32","indexed":true,"internalType":"bytes32"},{"name":"account","type":"address","indexed":true,"internalType":"address"},{"name":"sender","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"type":"error","name":"AccessControlBadConfirmation","inputs":[]},{"type":"error","name":"AccessControlUnauthorizedAccount","inputs":[{"name":"account","type":"address","internalType":"address"},{"name":"neededRole","type":"bytes32","internalType":"bytes32"}]},{"type":"error","name":"ConflictingConsensusState","inputs":[{"name":"revisionHeight","type":"uint64","internalType":"uint64"}]},{"type":"error","name":"ConsensusStateExpired","inputs":[{"name":"trustedTimestamp","type":"uint64","internalType":"uint64"},{"name":"currentTimestamp","type":"uint256","internalType":"uint256"},{"name":"trustingPeriod","type":"uint64","internalType":"uint64"}]},{"type":"error","name":"ConsensusStateNotFound","inputs":[{"name":"revisionHeight","type":"uint64","internalType":"uint64"}]},{"type":"error","name":"DuplicateCommitSealSigner","inputs":[{"name":"signer","type":"address","internalType":"address"}]},{"type":"error","name":"DuplicateValidator","inputs":[{"name":"validator","type":"address","internalType":"address"}]},{"type":"error","name":"EmptyValidatorSet","inputs":[]},{"type":"error","name":"HeaderFromFuture","inputs":[{"name":"currentTimestamp","type":"uint256","internalType":"uint256"},{"name":"headerTimestamp","type":"uint256","internalType":"uint256"},{"name":"maxClockDrift","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"InsufficientTrustedValidatorOverlap","inputs":[{"name":"actual","type":"uint256","internalType":"uint256"},{"name":"required","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"InsufficientValidatorQuorum","inputs":[{"name":"actual","type":"uint256","internalType":"uint256"},{"name":"required","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"InvalidCommitSeal","inputs":[]},{"type":"error","name":"InvalidCommitmentValue","inputs":[{"name":"expectedValue","type":"bytes32","internalType":"bytes32"},{"name":"actualValue","type":"bytes32","internalType":"bytes32"}]},{"type":"error","name":"InvalidDifficulty","inputs":[{"name":"actualDifficulty","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"InvalidECDSASignatureLength","inputs":[{"name":"length","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"InvalidExtraDataFormat","inputs":[{"name":"itemsLength","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"InvalidHeaderFormat","inputs":[{"name":"itemsLength","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"InvalidHeaderHeight","inputs":[]},{"type":"error","name":"InvalidHeaderTimestamp","inputs":[]},{"type":"error","name":"InvalidMixHash","inputs":[{"name":"actualMixHash","type":"bytes32","internalType":"bytes32"}]},{"type":"error","name":"InvalidNonce","inputs":[{"name":"actualNonce","type":"bytes","internalType":"bytes"}]},{"type":"error","name":"InvalidOmmersHash","inputs":[{"name":"actualOmmersHash","type":"bytes32","internalType":"bytes32"}]},{"type":"error","name":"InvalidPathLength","inputs":[{"name":"expectedLength","type":"uint256","internalType":"uint256"},{"name":"actualLength","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"InvalidRevisionNumber","inputs":[{"name":"providedRevisionNumber","type":"uint64","internalType":"uint64"}]},{"type":"error","name":"InvalidValidatorAddress","inputs":[{"name":"validator","type":"address","internalType":"address"}]},{"type":"error","name":"InvalidValidatorAddressLength","inputs":[{"name":"length","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"InvalidValueLength","inputs":[{"name":"expectedLength","type":"uint256","internalType":"uint256"},{"name":"actualLength","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"UnsupportedMisbehaviour","inputs":[]},{"type":"error","name":"ValueExists","inputs":[{"name":"actualValue","type":"bytes32","internalType":"bytes32"}]}],"bytecode":{"object":"0x6080604052346103d85761390780380380610019816103dc565b928339810190610100818303126103d85761003381610401565b9061004060208201610415565b9061004d60408201610415565b92606082015191608081015160018060401b0381116103d85781019286601f850112156103d8578351966001600160401b03881161037f578760051b9460206100978188016103dc565b809a81520190602082978201019283116103d857602001905b8282106103c0575050506100c660a08301610415565b956100df60e06100d860c08601610415565b9401610401565b956001600160401b03169081156103b1576001600160401b03169283156103a257885115610393575f5b89518110156101bf576001600160a01b03610124828c610429565b511615610198575f5b81811061013d5750600101610109565b6001600160a01b0361014f828d610429565b51166001600160a01b03610163848e610429565b5116146101725760010161012d565b6001600160a01b03610184838d610429565b511663107f863360e21b5f5260045260245ffd5b6001600160a01b03906101ab908b610429565b51166359bff38760e01b5f5260045260245ffd5b5060408051979896978a979181016001600160401b0381118282101761037f576040525f81526020810190848252604051926080840198848a1060018060401b038b111761037f576040998a526001600160a01b031680855260208086018490526001600160401b03928316868c01819052878416606090970196909652600180546001600160a01b031916909217825592516002805495516fffffffffffffffff0000000000000000908d1b81169285166001600160801b03199788161792909217815560038054988d1b90921697909516909517959095179093555f948552600490529590922080546001600160401b031916949094178455830191909155925193910191831161037f5768010000000000000000831161037f578154838355808410610359575b50905f5260205f205f5b83811061033c57846001600160a01b0381166103235750610312610547565b505b60405161329d90816105ca8239f35b8061033061033692610451565b506104c7565b50610314565b82516001600160a01b0316818301556020909201916001016102f3565b825f528360205f2091820191015b81811061037457506102e9565b5f8155600101610367565b634e487b7160e01b5f52604160045260245ffd5b63339e1ffb60e01b5f5260045ffd5b63574f4e6160e01b5f5260045ffd5b6359d119e360e01b5f5260045ffd5b602080916103cd84610401565b8152019101906100b0565b5f80fd5b6040519190601f01601f191682016001600160401b0381118382101761037f57604052565b51906001600160a01b03821682036103d857565b51906001600160401b03821682036103d857565b805182101561043d5760209160051b010190565b634e487b7160e01b5f52603260045260245ffd5b6001600160a01b0381165f9081525f5160206138e75f395f51905f52602052604090205460ff166104c2576001600160a01b03165f8181525f5160206138e75f395f51905f5260205260408120805460ff191660011790553391905f5160206138675f395f51905f528180a4600190565b505f90565b6001600160a01b0381165f9081525f5160206138875f395f51905f52602052604090205460ff166104c2576001600160a01b03165f8181525f5160206138875f395f51905f5260205260408120805460ff191660011790553391905f5160206138c75f395f51905f52905f5160206138675f395f51905f529080a4600190565b5f80525f5160206138875f395f51905f526020525f5160206138a75f395f51905f525460ff166105c5575f8080525f5160206138875f395f51905f526020525f5160206138a75f395f51905f52805460ff1916600117905533905f5160206138c75f395f51905f525f5160206138675f395f51905f528280a4600190565b5f9056fe60806040526004361015610011575f80fd5b5f3560e01c806301ffc9a7146100f45780630bece356146100ef578063248a9ca3146100ea5780632f2ff15d146100e557806336568abe146100e05780634d6d9ffb146100db5780635972185a146100d6578063682ed5f0146100d157806391d14854146100cc578063a217fddf146100c7578063d547741f146100c2578063ddba6537146100bd578063edce8bdc146100b85763ef913a4b146100b3575f80fd5b610a16565b61095e565b61088b565b61085c565b610842565b6107f4565b6105e6565b6105ac565b6103ac565b610350565b61031a565b6102b5565b610217565b34610195576020600319360112610195576004357fffffffff00000000000000000000000000000000000000000000000000000000811680910361019557807f7965db0b000000000000000000000000000000000000000000000000000000006020921490811561016b575b506040519015158152f35b7f01ffc9a7000000000000000000000000000000000000000000000000000000009150145f610160565b5f80fd5b9060206003198301126101955760043567ffffffffffffffff811161019557826023820112156101955780600401359267ffffffffffffffff84116101955760248483010111610195576024019190565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b346101955761028161022836610199565b5f80527f4c48d1d2b0f4f7485fc28e3db22341d96a20aa29e6efa8149da9751603abd4e06020527f6e0c24a6e293ff9b755263dbaa15ba3796b0b8d3fe17cfb4ddf8143b268eac475490919060ff161561029957610d9d565b6040516003821015610294576020918152f35b6101ea565b6102a1611287565b610d9d565b90816020910312610195573590565b346101955760206003193601126101955760206102df6004355f525f602052600160405f20015490565b604051908152f35b6003196040910112610195576004359060243573ffffffffffffffffffffffffffffffffffffffff811681036101955790565b346101955761034e61032b366102e7565b90610349610344825f525f602052600160405f20015490565b61130f565b6121c6565b005b346101955761035e366102e7565b3373ffffffffffffffffffffffffffffffffffffffff8216036103845761034e9161229d565b7f6697b232000000000000000000000000000000000000000000000000000000005f5260045ffd5b346101955760206003193601126101955760043567ffffffffffffffff8111610195578060040160806003198336030112610195575f80527f4c48d1d2b0f4f7485fc28e3db22341d96a20aa29e6efa8149da9751603abd4e060205260ff7f6e0c24a6e293ff9b755263dbaa15ba3796b0b8d3fe17cfb4ddf8143b268eac4754161561059f575b61044761044260248401611192565b61137c565b60648201916001610458848461119c565b90500361056157906104a96104966104a261049d61049661049061048961048460446104e09a01611192565b611b30565b988761119c565b9061126e565b3691610b4d565b612372565b928061121d565b906001840154906040516104d7816104c960208201948560209181520190565b03601f198101835282610afd565b51902091612400565b805161051f5761051b61050b6104fe845467ffffffffffffffff1690565b67ffffffffffffffff1690565b6040519081529081906020820190565b0390f35b61053361052e61055e92612545565b612572565b7fd039601e000000000000000000000000000000000000000000000000000000005f52600452602490565b5ffd5b61055e61056e848461119c565b7f88b3170e000000000000000000000000000000000000000000000000000000005f52600160045260245250604490565b6105a7611287565b610433565b34610195575f6003193601126101955760206040517fbd893629a699470e4ec82a5715bb4981fdaacc5d0a728bf5f55b801d8f4ef10b8152f35b346101955760206003193601126101955760043567ffffffffffffffff8111610195578060040160a06003198336030112610195575f80527f4c48d1d2b0f4f7485fc28e3db22341d96a20aa29e6efa8149da9751603abd4e060205260ff7f6e0c24a6e293ff9b755263dbaa15ba3796b0b8d3fe17cfb4ddf8143b268eac475416156107e7575b61067c61044260248401611192565b6064820191600161068d848461119c565b90500361056157608481019060206106a5838561121d565b9050036107a957906106f46104966106ed6106e56106de61049d6104966104906106d761048460446107149c01611192565b9b8b61119c565b948761121d565b8101906102a6565b948061121d565b906001850154906040516104d7816104c960208201948560209181520190565b8051156107755761052e61072791612545565b908082036107475761051b61050b6104fe855467ffffffffffffffff1690565b7f56ed1b63000000000000000000000000000000000000000000000000000000005f5260045260245260445ffd5b61055e827f56ed1b63000000000000000000000000000000000000000000000000000000005f52906044916004525f602452565b61055e6107b6838561121d565b7f24fadac8000000000000000000000000000000000000000000000000000000005f52602060045260245250604490565b6107ef611287565b61066d565b3461019557602060ff610836610809366102e7565b905f525f845260405f209073ffffffffffffffffffffffffffffffffffffffff165f5260205260405f2090565b54166040519015158152f35b34610195575f6003193601126101955760206040515f8152f35b346101955761034e61086d366102e7565b90610886610344825f525f602052600160405f20015490565b61229d565b346101955761089936610199565b50505f80527f4c48d1d2b0f4f7485fc28e3db22341d96a20aa29e6efa8149da9751603abd4e06020527f6e0c24a6e293ff9b755263dbaa15ba3796b0b8d3fe17cfb4ddf8143b268eac475460ff1615610915575b7f2c1ed462000000000000000000000000000000000000000000000000000000005f5260045ffd5b61091d611287565b6108ed565b67ffffffffffffffff81160361019557565b601f19601f602060409481855280519182918282880152018686015e5f8582860101520116010190565b346101955760206003193601126101955761097e60043561048481610922565b67ffffffffffffffff8154166002600183015492019060405192608084019160208501526040840152606080840152815480915260a08301915f5260205f20905f5b8181106109ea5761051b856109de818703601f198101835282610afd565b60405191829182610934565b825473ffffffffffffffffffffffffffffffffffffffff168452602090930192600192830192016109c0565b34610195575f6003193601126101955761051b60405173ffffffffffffffffffffffffffffffffffffffff60015416602082015267ffffffffffffffff600254818116604084015260401c16606082015267ffffffffffffffff600354818116608084015260401c1660a082015260a081526109de60c082610afd565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b6060810190811067ffffffffffffffff821117610adc57604052565b610a93565b6040810190811067ffffffffffffffff821117610adc57604052565b90601f601f19910116810190811067ffffffffffffffff821117610adc57604052565b60405190610b2f604083610afd565b565b67ffffffffffffffff8111610adc57601f01601f191660200190565b929192610b5982610b31565b91610b676040519384610afd565b829481845281830111610195578281602093845f960137010152565b9080601f8301121561019557816020610b9e93359101610b4d565b90565b6020818303126101955780359067ffffffffffffffff8211610195570180820391608083126101955760405192610bd784610ac0565b823567ffffffffffffffff811161019557604091610bfa84601f19938701610b83565b8652011261019557604051610c0e81610ae1565b6020830135610c1c81610922565b81526040830135610c2c81610922565b60208201526020840152606082013567ffffffffffffffff811161019557610c549201610b83565b604082015290565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b9060018201809211610c9757565b610c5c565b60c001908160c011610c9757565b60f701908160f711610c9757565b6080019081608011610c9757565b60b701908160b711610c9757565b91908201809211610c9757565b908160011b9180830460021490151715610c9757565b81519167ffffffffffffffff8311610adc57680100000000000000008311610adc578154838355808410610d77575b506020610d389101915f5260205f2090565b5f5b838110610d475750505050565b6001906020610d6a855173ffffffffffffffffffffffffffffffffffffffff1690565b9401938184015501610d3a565b825f528360205f2091820191015b818110610d925750610d26565b5f8155600101610d85565b610da991810190610ba1565b9060208201610dc461044282515167ffffffffffffffff1690565b610dce8351611614565b92606084019367ffffffffffffffff610def865167ffffffffffffffff1690565b161561116a5760035491604083901c67ffffffffffffffff1693610e1d67ffffffffffffffff861642610cd4565b9460a0840195610e35875167ffffffffffffffff1690565b9067ffffffffffffffff82161161112b5750505160200151610e7290610e649067ffffffffffffffff16611b30565b9367ffffffffffffffff1690565b67ffffffffffffffff81168015159081611102575b506110ad575090610ef591610eb66002610eae610ea385611b87565b60e086015190611ca1565b950185611eba565b610ec660c0830194855190611fdf565b60406080610ee960015473ffffffffffffffffffffffffffffffffffffffff1690565b93015191015191612082565b610f22610f0a865167ffffffffffffffff1690565b67ffffffffffffffff165f52600460205260405f2090565b610f376104fe825467ffffffffffffffff1690565b61103b5750916002610fb5928694610fa8610f73610f64610f0a610fc39a9b5167ffffffffffffffff1690565b955167ffffffffffffffff1690565b859067ffffffffffffffff167fffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000825416179055565b6001840155519101610cf7565b5167ffffffffffffffff1690565b600254610fdc9060401c67ffffffffffffffff166104fe565b67ffffffffffffffff821611610ff157505f90565b611037907fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff6fffffffffffffffff00000000000000006002549260401b16911617600255565b5f90565b91611051611059945167ffffffffffffffff1690565b9051926120f8565b6110a75761055e611072835167ffffffffffffffff1690565b7fc1aea5f7000000000000000000000000000000000000000000000000000000005f5267ffffffffffffffff16600452602490565b60029150565b61055e906110c3855467ffffffffffffffff1690565b7feae35725000000000000000000000000000000000000000000000000000000005f5267ffffffffffffffff9081166004524260245216604452606490565b9050611123429161111e6104fe885467ffffffffffffffff1690565b610cd4565b11155f610e87565b7f9b772277000000000000000000000000000000000000000000000000000000005f524260045267ffffffffffffffff9081166024521660445260645ffd5b7f59d119e3000000000000000000000000000000000000000000000000000000005f5260045ffd5b35610b9e81610922565b9035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe181360301821215610195570180359067ffffffffffffffff821161019557602001918160051b3603831361019557565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b9035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe181360301821215610195570180359067ffffffffffffffff82116101955760200191813603831361019557565b9015611282578061127e9161121d565b9091565b6111f0565b335f9081527f4c48d1d2b0f4f7485fc28e3db22341d96a20aa29e6efa8149da9751603abd4e0602052604090205460ff16156112bf57565b7fe2517d3f000000000000000000000000000000000000000000000000000000005f52336004527fbd893629a699470e4ec82a5715bb4981fdaacc5d0a728bf5f55b801d8f4ef10b60245260445ffd5b805f525f60205260ff6113433360405f209073ffffffffffffffffffffffffffffffffffffffff165f5260205260405f2090565b54161561134d5750565b7fe2517d3f000000000000000000000000000000000000000000000000000000005f523360045260245260445ffd5b67ffffffffffffffff168061138e5750565b7f3ce598a9000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b60405190610100820182811067ffffffffffffffff821117610adc57604052606060e0838281528260208201528260408201525f838201525f60808201525f60a08201528260c08201520152565b8051600110156112825760400190565b805160071015611282576101000190565b8051600d1015611282576101c00190565b8051600e1015611282576101e00190565b805160081015611282576101200190565b8051600310156112825760800190565b8051600b1015611282576101800190565b8051600c1015611282576101a00190565b8051600410156112825760a00190565b8051156112825760200190565b8051600210156112825760600190565b805160101015611282576102200190565b80518210156112825760209160051b010190565b67ffffffffffffffff8111610adc5760051b60200190565b90611501826114df565b61150e6040519182610afd565b828152601f1961151e82946114df565b0190602036910137565b90602082519201517fffffffffffffffffffffffffffffffffffffffff00000000000000000000000081169260148110611560575050565b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000929350829060140360031b1b161690565b60405160a091906115a38382610afd565b6004815291601f1901825f5b8281106115bb57505050565b8060606020809385010152016115af565b906115d6826114df565b6115e36040519182610afd565b828152601f196115f382946114df565b01905f5b82811061160357505050565b8060606020809385010152016115f7565b61163061162b6116226113b9565b92808452612545565b6125b4565b602082019080825251600f8110611b0557507f1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d493476116766116708351611407565b5161267f565b03611aca57600161169061168a8351611417565b51612572565b03611a8f577f63746963616c2062797a616e74696e65206661756c7420746f6c6572616e63656116c36116708351611428565b03611a54576116db6116d58251611439565b5161269b565b80516008811490811591611a24575b506119ea575061162b61175d6116d5836117216117106104fe61168a611762985161144a565b67ffffffffffffffff166060880152565b61172e611670825161145b565b60808701526117576117466104fe61168a845161146b565b67ffffffffffffffff1660a0880152565b5161147c565b612545565b90604081019180835251600581036119bf57506117886117828351611407565b516125b4565b908151156119975761179a82516114f7565b9360c082019485525f5b8351811015611933576117ba6116d582866114cb565b80516014810361190857506117d16117d791611528565b60601c90565b73ffffffffffffffffffffffffffffffffffffffff811680156118c6575f5b8381106118325750509061182c600192611811838a516114cb565b9073ffffffffffffffffffffffffffffffffffffffff169052565b016117a4565b8161187761185e611844848d516114cb565b5173ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff1690565b14611884576001016117f6565b7f41fe18cc000000000000000000000000000000000000000000000000000000005f5273ffffffffffffffffffffffffffffffffffffffff831660045260245ffd5b7f59bff387000000000000000000000000000000000000000000000000000000005f5273ffffffffffffffffffffffffffffffffffffffff821660045260245ffd5b7f83e46ad2000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b509261178291945061194692505161148d565b61195081516115cc565b9260e081019384525f5b8251811015611991578061198a816119776116d5600195886114cb565b88519061198483836114cb565b526114cb565b500161195a565b50925050565b7f339e1ffb000000000000000000000000000000000000000000000000000000005f5260045ffd5b7f30c6792a000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b611a20906040519182917fd5edd2a500000000000000000000000000000000000000000000000000000000835260048301610934565b0390fd5b7f011b4d03dd8c01f1049143cf9c4c817e4b167f1d1b83e5c6f0f10d89ba1e7bce9150602083012014155f6116ea565b611a6461167061055e9251611428565b7fa19e609c000000000000000000000000000000000000000000000000000000005f52600452602490565b611a9f61168a61055e9251611417565b7ff71b722f000000000000000000000000000000000000000000000000000000005f52600452602490565b611ada61167061055e9251611407565b7fb8120dca000000000000000000000000000000000000000000000000000000005f52600452602490565b7fbc277732000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b67ffffffffffffffff1690815f52600460205260405f209167ffffffffffffffff83541615611b5c5750565b7ff761631b000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b6020611c26611b94611592565b611c0d611bab60408601611bb1611bab825161149d565b51612fa2565b611bba8561149d565b52611bc48461149d565b50611bd2611bab8251611407565b611bdb85611407565b52611be584611407565b50611bf3611bab82516114aa565b611bfc856114aa565b52611c06846114aa565b505161145b565b611c168261145b565b52611c208161145b565b50612771565b910190611c348251516115cc565b905f5b83518051821015611c8a579080600192600c82145f14611c78575050611c5c83612829565b611c6682866114cb565b52611c7181856114cb565b5001611c37565b611c8591611bab916114cb565b611c5c565b505050611c979150612771565b6020815191012090565b919091611cae83516114f7565b925f5b8151811015611ea757611cc481836114cb565b51805160418103611e7c575080601b60ff611d13611d0d611ce7611d2096612808565b517fff000000000000000000000000000000000000000000000000000000000000001690565b60f81c90565b1610611e29575b84613050565b90611d2a816128a3565b1590811591611e1f575b508015611e01575b611dd95773ffffffffffffffffffffffffffffffffffffffff81165f5b838110611d7957505090611d7360019261181183896114cb565b01611cb1565b81611d8a61185e611844848c6114cb565b14611d9757600101611d59565b7f33af0d5f000000000000000000000000000000000000000000000000000000005f5273ffffffffffffffffffffffffffffffffffffffff831660045260245ffd5b7f09cb44e6000000000000000000000000000000000000000000000000000000005f5260045ffd5b5073ffffffffffffffffffffffffffffffffffffffff811615611d3c565b905015155f611d34565b611e6b611e43611e3e611d0d611ce785612808565b612891565b60f81b7fff000000000000000000000000000000000000000000000000000000000000001690565b5f1a611e7682612808565b53611d1a565b7ff2db9ce1000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b505050565b5f198114610c975760010190565b905f915f5b8151811015611f1357611ef273ffffffffffffffffffffffffffffffffffffffff611eea83856114cb565b5116846128ad565b611eff575b600101611ebf565b92611f0b600191611eac565b939050611ef7565b50506003611f22915404610c89565b90818110611f2e575050565b7fe2dcb1b9000000000000000000000000000000000000000000000000000000005f5260045260245260445ffd5b905f198201918211610c9757565b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff408201918211610c9757565b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff808201918211610c9757565b6020039060208211610c9757565b91908203918211610c9757565b905f915f5b81518110156120385761201773ffffffffffffffffffffffffffffffffffffffff61200f83856114cb565b511684612904565b612024575b600101611fe4565b92612030600191611eac565b93905061201c565b50505190600382048203918211610c9757818110612054575050565b7f7818f4e4000000000000000000000000000000000000000000000000000000005f5260045260245260445ffd5b6120cc9261162b9261175d926040517fffffffffffffffffffffffffffffffffffffffff000000000000000000000000602082019260601b168252601481526104d7603482610afd565b805160021015611282576060610b9e91015161267f565b8054821015611282575f5260205f2001905f90565b919067ffffffffffffffff80612116855467ffffffffffffffff1690565b9216911614908115916121b7575b506121b1576002019081548151036121b1575f5b81518110156121a95761216e61214e82856120e3565b905473ffffffffffffffffffffffffffffffffffffffff9160031b1c1690565b73ffffffffffffffffffffffffffffffffffffffff61219361185e61184485876114cb565b9116036121a257600101612138565b5050505f90565b505050600190565b50505f90565b9050600182015414155f612124565b805f525f60205260ff6121fa8360405f209073ffffffffffffffffffffffffffffffffffffffff165f5260205260405f2090565b54166121b157805f525f6020526122328260405f209073ffffffffffffffffffffffffffffffffffffffff165f5260205260405f2090565b60017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0082541617905573ffffffffffffffffffffffffffffffffffffffff339216907f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d5f80a4600190565b805f525f60205260ff6122d18360405f209073ffffffffffffffffffffffffffffffffffffffff165f5260205260405f2090565b5416156121b157805f525f60205261230a8260405f209073ffffffffffffffffffffffffffffffffffffffff165f5260205260405f2090565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00815416905573ffffffffffffffffffffffffffffffffffffffff339216907ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b5f80a4600190565b60208151910120604051602081019182527f1260944489272988d9df285149b5aa1b0f48f2136d6f416159f840a3e07476006040820152604081526123b8606082610afd565b51902090565b604051906123cd602083610afd565b5f808352366020840137565b906123e382610b31565b6123f06040519182610afd565b828152601f1961151e8294610b31565b61162b612442919493946124146020610b31565b956124226040519788610afd565b602087526124306020610b31565b601f1960208901910136823752612545565b9061244d8451610ce1565b918451151580612525575b6124619061256b565b61247361246e5f85611fd2565b6123d9565b925f19015f5b81811061248d575050610b9e939450612a78565b8061250f600f6124d2612509611d0d611ce78d6124ac60029960011c90565b908d6125038a6124fb8a6124d26124c9611d0d611ce78a8a612818565b60041c600f1690565b1660f81b7fff000000000000000000000000000000000000000000000000000000000000001690565b5f1a92612818565b53612818565b60ff1690565b5f1a61251e6001830188612818565b5301612479565b506001612458565b6040519061253a82610ae1565b5f6020838281520152565b61254d61252d565b5060208151916040519261256084610ae1565b835201602082015290565b1561019557565b805180151590816125a8575b50156101955761258d90612d4e565b9051906020811061259c575090565b6020036101000a900490565b6021915011155f61257e565b6125bd81612d7a565b15610195576125cb81612d9a565b6125d4816114df565b916125e26040519384610afd565b818352601f196125f1836114df565b015f5b818110612668575050602061261491015161260e81612dfb565b90610cd4565b5f905b8282106126245750505090565b61266081612633600193612e66565b9061263c610b20565b82815281602082015261264f86896114cb565b5261265a85886114cb565b50610cd4565b910190612617565b60209061267361252d565b828288010152016125f4565b6021815103610195576020015160018101809111610c97575190565b805115610195576126ae610b9e91612d4e565b6126ba819392936123d9565b928360200190612f2f565b805191908290602001825e015f815290565b610b2f906126f96126f3949360405195869360208501906126c5565b906126c5565b03601f198101845283610afd565b6001907fff00000000000000000000000000000000000000000000000000000000000000610b9e949316815201906126c5565b916001610b9e94937fff000000000000000000000000000000000000000000000000000000000000006126f39416815201906126c5565b6127796123be565b905f915b81518310156127a55761279d60019161279685856114cb565b51906126d7565b92019161277d565b9150508051603881106127e45750610b9e6127c08251612fce565b916104c96127d4611e436125098651610caa565b916040519485936020850161273a565b6127f6611e43612509610b9e93610c9c565b6104c960405193849260208401612707565b8051604010156112825760600190565b908151811015611282570160200190565b600181511480612876575b610b9e578051603881106128645750610b9e6128508251612fce565b916104c96127d4611e436125098651610cc6565b6127f6611e43612509610b9e93610cb8565b50608060ff61288a611d0d611ce78561149d565b1610612834565b60ff601b9116019060ff8211610c9757565b6004111561029457565b905f5b82548110156121a25773ffffffffffffffffffffffffffffffffffffffff6128d882856120e3565b90549060031b1c1673ffffffffffffffffffffffffffffffffffffffff8316146121a9576001016128b0565b905f5b82518110156121a25773ffffffffffffffffffffffffffffffffffffffff61292f82856114cb565b511673ffffffffffffffffffffffffffffffffffffffff8316146121a957600101612907565b91906129618351610ce1565b908351151580612a6e575b6129759061256b565b61298261246e8284611fd2565b938192600180841614612a0c575b5f19869101935b8481106129a5575050505050565b83612a0360016129f9600f6124d2612509611d0d611ce78b60029b6129f26129e5886124d28f611d0d611ce76129de6124c99360011c90565b8099612818565b9b8d03809c5f1a92612818565b538c612818565b5f1a920189612818565b53018590612997565b92507f0f00000000000000000000000000000000000000000000000000000000000000612a4b612509611d0d611ce7612a458760011c90565b86612818565b60f81b165f1a612a5a8661149d565b535f19612a6683611eac565b939050612990565b508181111561296c565b915f915f612a8461252d565b50845115612d155790935f915b81518310156101955782158080612cff575b61019557159081612ce2575b5061019557612ac161178283836114cb565b948551600281145f14612bbe5750612ae3612ade6116d58861149d565b6130e5565b95612af9612af2888884613152565b8092610cd4565b965111612ba05715612b305750612b109051611f5c565b11610195575111612b27576116d5610b9e91611407565b50610b9e6123be565b919094612b3d8651611f5c565b82146101955780612b5f612b5b612b55600194611407565b51612d7a565b1590565b15612b8157612b70612b7691611407565b516130d7565b915b01919490612a91565b612b8d612b9a91611407565b5160208101519051902090565b91612b78565b505091509250612bb1915051611f5c565b1161019557610b9e6123be565b929491939192601103612c835781518314612c6557612bef612be9612509611d0d611ce78787612818565b93610c89565b92601081101561019557612c0c612c0682896114cb565b516130c1565b15612c2e5750505050612c2191925051611f5c565b0361019557610b9e6123be565b86612c46612b5b612b5584600196989a97999b6114cb565b15612c5857612b9a91612b70916114cb565b612b9a91612b8d916114cb565b505050612c729051611f5c565b03610195576116d5610b9e916114ba565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f696e76616c6964206e6f6465206c656e677468000000000000000000000000006044820152606490fd5b9050612cf7612cf184846114cb565b5161308a565b14155f612aaf565b50612d0d612b8d85856114cb565b871415612aa3565b509050612d4692507f56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b42191501461256b565b610b9e6123be565b906020820191612d5e8351612dfb565b925190838201809211610c975751928303928311610c97579190565b805115612d9557602060c0910151515f1a1061103757600190565b505f90565b805115612d95575f9060208101908151612db381612dfb565b8101809111610c9757915190518101809111610c975791905b828110612dd95750905090565b612de281612e66565b8101809111610c9757612df59091611eac565b90612dcc565b515f1a6080811015612e0c57505f90565b60b881108015612e50575b15612e225750600190565b60c0811015612e4157610b9e90612e3c9060b75b90611fd2565b610c89565b610b9e90612e3c9060f7612e36565b5060c08110158015612e17575060f88110612e17565b80515f1a906080821015612e7b575050600190565b60b8821015612e915750612e3c610b9e91611f97565b60c0821015612ed25760010151602082900360b7016101000a9004017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff4a0190565b60f8821015612ee85750612e3c610b9e91611f6a565b60010151602082900360f7016101000a9004017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0a0190565b601f8111610c97576101000a90565b90918015611ea7575b6020811015612f725780612f4b57505050565b612f5f612f5a612f6492611fc4565b612f20565b611f5c565b905182518216911916179052565b91908051825260208101809111610c97579060208101809111610c975791601f19810190811115612f3857610c5c565b612fac81516123d9565b90815115612fca57806020610b9e9201519051908360200190612f2f565b5090565b5f81805b61303c5750612fe0816123d9565b91815b612fec57505090565b612ff582611f5c565b6130277fff000000000000000000000000000000000000000000000000000000000000008360f81b165f1a9185612818565b5360081c908015610c97575f19019081612fe3565b9061304690611eac565b9060081c80612fd2565b8151919060418303613080576130799250602082015190606060408401519301515f1a906131f6565b9192909190565b50505f9160029190565b805160208110156130a2575060208101519051902090565b90602001512060405160208101918252602081526123b8604082610afd565b6001815103612d955760200151515f1a60801490565b6130e090612d4e565b902090565b9081511561019557600f6131016124c9611d0d611ce78661149d565b16806131145750610b9e60025f93612955565b600181036131295750610b9e60015f93612955565b6002810361313f5750610b9e6002600193612955565b60030361019557610b9e60018093612955565b91905f5b838101808211610c975782518110806131ec575b156131e45761319a7fff000000000000000000000000000000000000000000000000000000000000009184612818565b51167fff000000000000000000000000000000000000000000000000000000000000006131c78386612818565b511690036131dd576131d890611eac565b613156565b9250505090565b509250505090565b508351821061316a565b91907f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08411613285579160209360809260ff5f9560405194855216868401526040830152606082015282805260015afa1561327a575f5173ffffffffffffffffffffffffffffffffffffffff81161561327057905f905f90565b505f906001905f90565b6040513d5f823e3d90fd5b5050505f916003919056fea164736f6c634300081c000a2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d4c48d1d2b0f4f7485fc28e3db22341d96a20aa29e6efa8149da9751603abd4e06e0c24a6e293ff9b755263dbaa15ba3796b0b8d3fe17cfb4ddf8143b268eac47bd893629a699470e4ec82a5715bb4981fdaacc5d0a728bf5f55b801d8f4ef10bad3228b676f7d3cd4284a5443f17f1962b36e491b30a40b2405849e597ba5fb5","sourceMap":"242:2275:34:-:0;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;242:2275:34;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;:::i;:::-;;-1:-1:-1;;;;;242:2275:34;;3952:25:35;;3948:84;;-1:-1:-1;;;;;242:2275:34;;4045:28:35;;4041:90;;242:2275:34;;17766:22:35;17762:79;;-1:-1:-1;17893:3:35;242:2275:34;;17870:21:35;;;;;-1:-1:-1;;;;;17916:13:35;;;;:::i;:::-;242:2275:34;;17916:27:35;17912:111;;-1:-1:-1;18056:5:35;;;;;;17893:3;242:2275:34;;17855:13:35;;18063:3;-1:-1:-1;;;;;18090:13:35;;;;:::i;:::-;242:2275:34;;-1:-1:-1;;;;;18107:13:35;242:2275:34;;18107:13:35;:::i;:::-;242:2275:34;;18090:30:35;18086:117;;242:2275:34;;18041:13:35;;18086:117;-1:-1:-1;;;;;18170:13:35;242:2275:34;;18170:13:35;:::i;:::-;242:2275:34;;18151:33:35;;;-1:-1:-1;18151:33:35;;242:2275:34;;-1:-1:-1;18151:33:35;17912:111;-1:-1:-1;;;;;242:2275:34;17994:13:35;;242:2275:34;17994:13:35;:::i;:::-;242:2275:34;;17970:38:35;;;-1:-1:-1;17970:38:35;;242:2275:34;;-1:-1:-1;17970:38:35;17870:21;-1:-1:-1;242:2275:34;;;17870:21:35;;;;;;;242:2275:34;;-1:-1:-1;;;;;242:2275:34;;;;;;;;;;-1:-1:-1;242:2275:34;;;4285:84:35;;242:2275:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;242:2275:34;;;;;4211:255:35;;;242:2275:34;;;-1:-1:-1;;;;;242:2275:34;;;4211:255:35;;;242:2275:34;;;;;;;4211:255:35;;;242:2275:34;;;;;;;-1:-1:-1;;;;;;242:2275:34;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;242:2275:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;242:2275:34;;;4517:15:35;242:2275:34;;;;;;;;-1:-1:-1;;;;;;242:2275:34;;;;;;;4624:26:35;;242:2275:34;;;;;;;4688:25:35;;;242:2275:34;;;;;;;;;;;;;;;;;;;17850:377:35;242:2275:34;;-1:-1:-1;242:2275:34;;-1:-1:-1;242:2275:34;-1:-1:-1;242:2275:34;;;;;;;-1:-1:-1;;;;;242:2275:34;;;;4796:44:35;;;:::i;:::-;;4751:233;242:2275:34;;;;;;;;;4751:233:35;4871:43;;4928:45;4871:43;;:::i;:::-;;4928:45;:::i;:::-;;4751:233;;242:2275:34;;;-1:-1:-1;;;;;242:2275:34;;;;;;;;;;;;;;;;-1:-1:-1;242:2275:34;;;-1:-1:-1;242:2275:34;;;;;;;;;;;;;;;;-1:-1:-1;242:2275:34;;;;;;;;;;-1:-1:-1;242:2275:34;;4517:15:35;242:2275:34;;-1:-1:-1;242:2275:34;17762:79:35;17811:19;;;-1:-1:-1;17811:19:35;;-1:-1:-1;17811:19:35;4041:90;4096:24;;;-1:-1:-1;4096:24:35;;-1:-1:-1;4096:24:35;3948:84;4000:21;;;-1:-1:-1;4000:21:35;;-1:-1:-1;4000:21:35;242:2275:34;;;;;;;:::i;:::-;;;;;;;;;;-1:-1:-1;242:2275:34;;;;;;;;;-1:-1:-1;;242:2275:34;;;-1:-1:-1;;;;;242:2275:34;;;;;;;;;;:::o;:::-;;;-1:-1:-1;;;;;242:2275:34;;;;;;:::o;:::-;;;-1:-1:-1;;;;;242:2275:34;;;;;;:::o;:::-;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;6145:316:93;-1:-1:-1;;;;;242:2275:34;;3976:1:35;242:2275:34;;;-1:-1:-1;;;;;;;;;;;242:2275:34;;;;;;;;;;-1:-1:-1;;;;;242:2275:34;3976:1:35;242:2275:34;;;-1:-1:-1;;;;;;;;;;;242:2275:34;;;;;;;-1:-1:-1;;242:2275:34;;;;;735:10:121;;242:2275:34;-1:-1:-1;;;;;;;;;;;3976:1:35;;6336:40:93;6313:4;6390:11;:::o;6238:217::-;6432:12;3976:1:35;6432:12:93;:::o;6145:316::-;-1:-1:-1;;;;;242:2275:34;;;;;;-1:-1:-1;;;;;;;;;;;242:2275:34;;;;;;;;;;-1:-1:-1;;;;;242:2275:34;;;;;-1:-1:-1;;;;;;;;;;;242:2275:34;;;;;;;-1:-1:-1;;242:2275:34;;;;;735:10:121;;242:2275:34;-1:-1:-1;;;;;;;;;;;2089:33:35;-1:-1:-1;;;;;;;;;;;6336:40:93;242:2275:34;6336:40:93;6313:4;6390:11;:::o;6145:316::-;242:2275:34;;;-1:-1:-1;;;;;;;;;;;242:2275:34;;-1:-1:-1;;;;;;;;;;;242:2275:34;;;;;;;;;-1:-1:-1;;;;;;;;;;;242:2275:34;;-1:-1:-1;;;;;;;;;;;242:2275:34;;-1:-1:-1;;242:2275:34;6313:4:93;242:2275:34;;;735:10:121;;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;242:2275:34;;6336:40:93;6313:4;6390:11;:::o;6238:217::-;242:2275:34;6432:12:93;:::o","linkReferences":{}},"deployedBytecode":{"object":"0x60806040526004361015610011575f80fd5b5f3560e01c806301ffc9a7146100f45780630bece356146100ef578063248a9ca3146100ea5780632f2ff15d146100e557806336568abe146100e05780634d6d9ffb146100db5780635972185a146100d6578063682ed5f0146100d157806391d14854146100cc578063a217fddf146100c7578063d547741f146100c2578063ddba6537146100bd578063edce8bdc146100b85763ef913a4b146100b3575f80fd5b610a16565b61095e565b61088b565b61085c565b610842565b6107f4565b6105e6565b6105ac565b6103ac565b610350565b61031a565b6102b5565b610217565b34610195576020600319360112610195576004357fffffffff00000000000000000000000000000000000000000000000000000000811680910361019557807f7965db0b000000000000000000000000000000000000000000000000000000006020921490811561016b575b506040519015158152f35b7f01ffc9a7000000000000000000000000000000000000000000000000000000009150145f610160565b5f80fd5b9060206003198301126101955760043567ffffffffffffffff811161019557826023820112156101955780600401359267ffffffffffffffff84116101955760248483010111610195576024019190565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b346101955761028161022836610199565b5f80527f4c48d1d2b0f4f7485fc28e3db22341d96a20aa29e6efa8149da9751603abd4e06020527f6e0c24a6e293ff9b755263dbaa15ba3796b0b8d3fe17cfb4ddf8143b268eac475490919060ff161561029957610d9d565b6040516003821015610294576020918152f35b6101ea565b6102a1611287565b610d9d565b90816020910312610195573590565b346101955760206003193601126101955760206102df6004355f525f602052600160405f20015490565b604051908152f35b6003196040910112610195576004359060243573ffffffffffffffffffffffffffffffffffffffff811681036101955790565b346101955761034e61032b366102e7565b90610349610344825f525f602052600160405f20015490565b61130f565b6121c6565b005b346101955761035e366102e7565b3373ffffffffffffffffffffffffffffffffffffffff8216036103845761034e9161229d565b7f6697b232000000000000000000000000000000000000000000000000000000005f5260045ffd5b346101955760206003193601126101955760043567ffffffffffffffff8111610195578060040160806003198336030112610195575f80527f4c48d1d2b0f4f7485fc28e3db22341d96a20aa29e6efa8149da9751603abd4e060205260ff7f6e0c24a6e293ff9b755263dbaa15ba3796b0b8d3fe17cfb4ddf8143b268eac4754161561059f575b61044761044260248401611192565b61137c565b60648201916001610458848461119c565b90500361056157906104a96104966104a261049d61049661049061048961048460446104e09a01611192565b611b30565b988761119c565b9061126e565b3691610b4d565b612372565b928061121d565b906001840154906040516104d7816104c960208201948560209181520190565b03601f198101835282610afd565b51902091612400565b805161051f5761051b61050b6104fe845467ffffffffffffffff1690565b67ffffffffffffffff1690565b6040519081529081906020820190565b0390f35b61053361052e61055e92612545565b612572565b7fd039601e000000000000000000000000000000000000000000000000000000005f52600452602490565b5ffd5b61055e61056e848461119c565b7f88b3170e000000000000000000000000000000000000000000000000000000005f52600160045260245250604490565b6105a7611287565b610433565b34610195575f6003193601126101955760206040517fbd893629a699470e4ec82a5715bb4981fdaacc5d0a728bf5f55b801d8f4ef10b8152f35b346101955760206003193601126101955760043567ffffffffffffffff8111610195578060040160a06003198336030112610195575f80527f4c48d1d2b0f4f7485fc28e3db22341d96a20aa29e6efa8149da9751603abd4e060205260ff7f6e0c24a6e293ff9b755263dbaa15ba3796b0b8d3fe17cfb4ddf8143b268eac475416156107e7575b61067c61044260248401611192565b6064820191600161068d848461119c565b90500361056157608481019060206106a5838561121d565b9050036107a957906106f46104966106ed6106e56106de61049d6104966104906106d761048460446107149c01611192565b9b8b61119c565b948761121d565b8101906102a6565b948061121d565b906001850154906040516104d7816104c960208201948560209181520190565b8051156107755761052e61072791612545565b908082036107475761051b61050b6104fe855467ffffffffffffffff1690565b7f56ed1b63000000000000000000000000000000000000000000000000000000005f5260045260245260445ffd5b61055e827f56ed1b63000000000000000000000000000000000000000000000000000000005f52906044916004525f602452565b61055e6107b6838561121d565b7f24fadac8000000000000000000000000000000000000000000000000000000005f52602060045260245250604490565b6107ef611287565b61066d565b3461019557602060ff610836610809366102e7565b905f525f845260405f209073ffffffffffffffffffffffffffffffffffffffff165f5260205260405f2090565b54166040519015158152f35b34610195575f6003193601126101955760206040515f8152f35b346101955761034e61086d366102e7565b90610886610344825f525f602052600160405f20015490565b61229d565b346101955761089936610199565b50505f80527f4c48d1d2b0f4f7485fc28e3db22341d96a20aa29e6efa8149da9751603abd4e06020527f6e0c24a6e293ff9b755263dbaa15ba3796b0b8d3fe17cfb4ddf8143b268eac475460ff1615610915575b7f2c1ed462000000000000000000000000000000000000000000000000000000005f5260045ffd5b61091d611287565b6108ed565b67ffffffffffffffff81160361019557565b601f19601f602060409481855280519182918282880152018686015e5f8582860101520116010190565b346101955760206003193601126101955761097e60043561048481610922565b67ffffffffffffffff8154166002600183015492019060405192608084019160208501526040840152606080840152815480915260a08301915f5260205f20905f5b8181106109ea5761051b856109de818703601f198101835282610afd565b60405191829182610934565b825473ffffffffffffffffffffffffffffffffffffffff168452602090930192600192830192016109c0565b34610195575f6003193601126101955761051b60405173ffffffffffffffffffffffffffffffffffffffff60015416602082015267ffffffffffffffff600254818116604084015260401c16606082015267ffffffffffffffff600354818116608084015260401c1660a082015260a081526109de60c082610afd565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b6060810190811067ffffffffffffffff821117610adc57604052565b610a93565b6040810190811067ffffffffffffffff821117610adc57604052565b90601f601f19910116810190811067ffffffffffffffff821117610adc57604052565b60405190610b2f604083610afd565b565b67ffffffffffffffff8111610adc57601f01601f191660200190565b929192610b5982610b31565b91610b676040519384610afd565b829481845281830111610195578281602093845f960137010152565b9080601f8301121561019557816020610b9e93359101610b4d565b90565b6020818303126101955780359067ffffffffffffffff8211610195570180820391608083126101955760405192610bd784610ac0565b823567ffffffffffffffff811161019557604091610bfa84601f19938701610b83565b8652011261019557604051610c0e81610ae1565b6020830135610c1c81610922565b81526040830135610c2c81610922565b60208201526020840152606082013567ffffffffffffffff811161019557610c549201610b83565b604082015290565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b9060018201809211610c9757565b610c5c565b60c001908160c011610c9757565b60f701908160f711610c9757565b6080019081608011610c9757565b60b701908160b711610c9757565b91908201809211610c9757565b908160011b9180830460021490151715610c9757565b81519167ffffffffffffffff8311610adc57680100000000000000008311610adc578154838355808410610d77575b506020610d389101915f5260205f2090565b5f5b838110610d475750505050565b6001906020610d6a855173ffffffffffffffffffffffffffffffffffffffff1690565b9401938184015501610d3a565b825f528360205f2091820191015b818110610d925750610d26565b5f8155600101610d85565b610da991810190610ba1565b9060208201610dc461044282515167ffffffffffffffff1690565b610dce8351611614565b92606084019367ffffffffffffffff610def865167ffffffffffffffff1690565b161561116a5760035491604083901c67ffffffffffffffff1693610e1d67ffffffffffffffff861642610cd4565b9460a0840195610e35875167ffffffffffffffff1690565b9067ffffffffffffffff82161161112b5750505160200151610e7290610e649067ffffffffffffffff16611b30565b9367ffffffffffffffff1690565b67ffffffffffffffff81168015159081611102575b506110ad575090610ef591610eb66002610eae610ea385611b87565b60e086015190611ca1565b950185611eba565b610ec660c0830194855190611fdf565b60406080610ee960015473ffffffffffffffffffffffffffffffffffffffff1690565b93015191015191612082565b610f22610f0a865167ffffffffffffffff1690565b67ffffffffffffffff165f52600460205260405f2090565b610f376104fe825467ffffffffffffffff1690565b61103b5750916002610fb5928694610fa8610f73610f64610f0a610fc39a9b5167ffffffffffffffff1690565b955167ffffffffffffffff1690565b859067ffffffffffffffff167fffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000825416179055565b6001840155519101610cf7565b5167ffffffffffffffff1690565b600254610fdc9060401c67ffffffffffffffff166104fe565b67ffffffffffffffff821611610ff157505f90565b611037907fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff6fffffffffffffffff00000000000000006002549260401b16911617600255565b5f90565b91611051611059945167ffffffffffffffff1690565b9051926120f8565b6110a75761055e611072835167ffffffffffffffff1690565b7fc1aea5f7000000000000000000000000000000000000000000000000000000005f5267ffffffffffffffff16600452602490565b60029150565b61055e906110c3855467ffffffffffffffff1690565b7feae35725000000000000000000000000000000000000000000000000000000005f5267ffffffffffffffff9081166004524260245216604452606490565b9050611123429161111e6104fe885467ffffffffffffffff1690565b610cd4565b11155f610e87565b7f9b772277000000000000000000000000000000000000000000000000000000005f524260045267ffffffffffffffff9081166024521660445260645ffd5b7f59d119e3000000000000000000000000000000000000000000000000000000005f5260045ffd5b35610b9e81610922565b9035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe181360301821215610195570180359067ffffffffffffffff821161019557602001918160051b3603831361019557565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b9035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe181360301821215610195570180359067ffffffffffffffff82116101955760200191813603831361019557565b9015611282578061127e9161121d565b9091565b6111f0565b335f9081527f4c48d1d2b0f4f7485fc28e3db22341d96a20aa29e6efa8149da9751603abd4e0602052604090205460ff16156112bf57565b7fe2517d3f000000000000000000000000000000000000000000000000000000005f52336004527fbd893629a699470e4ec82a5715bb4981fdaacc5d0a728bf5f55b801d8f4ef10b60245260445ffd5b805f525f60205260ff6113433360405f209073ffffffffffffffffffffffffffffffffffffffff165f5260205260405f2090565b54161561134d5750565b7fe2517d3f000000000000000000000000000000000000000000000000000000005f523360045260245260445ffd5b67ffffffffffffffff168061138e5750565b7f3ce598a9000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b60405190610100820182811067ffffffffffffffff821117610adc57604052606060e0838281528260208201528260408201525f838201525f60808201525f60a08201528260c08201520152565b8051600110156112825760400190565b805160071015611282576101000190565b8051600d1015611282576101c00190565b8051600e1015611282576101e00190565b805160081015611282576101200190565b8051600310156112825760800190565b8051600b1015611282576101800190565b8051600c1015611282576101a00190565b8051600410156112825760a00190565b8051156112825760200190565b8051600210156112825760600190565b805160101015611282576102200190565b80518210156112825760209160051b010190565b67ffffffffffffffff8111610adc5760051b60200190565b90611501826114df565b61150e6040519182610afd565b828152601f1961151e82946114df565b0190602036910137565b90602082519201517fffffffffffffffffffffffffffffffffffffffff00000000000000000000000081169260148110611560575050565b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000929350829060140360031b1b161690565b60405160a091906115a38382610afd565b6004815291601f1901825f5b8281106115bb57505050565b8060606020809385010152016115af565b906115d6826114df565b6115e36040519182610afd565b828152601f196115f382946114df565b01905f5b82811061160357505050565b8060606020809385010152016115f7565b61163061162b6116226113b9565b92808452612545565b6125b4565b602082019080825251600f8110611b0557507f1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d493476116766116708351611407565b5161267f565b03611aca57600161169061168a8351611417565b51612572565b03611a8f577f63746963616c2062797a616e74696e65206661756c7420746f6c6572616e63656116c36116708351611428565b03611a54576116db6116d58251611439565b5161269b565b80516008811490811591611a24575b506119ea575061162b61175d6116d5836117216117106104fe61168a611762985161144a565b67ffffffffffffffff166060880152565b61172e611670825161145b565b60808701526117576117466104fe61168a845161146b565b67ffffffffffffffff1660a0880152565b5161147c565b612545565b90604081019180835251600581036119bf57506117886117828351611407565b516125b4565b908151156119975761179a82516114f7565b9360c082019485525f5b8351811015611933576117ba6116d582866114cb565b80516014810361190857506117d16117d791611528565b60601c90565b73ffffffffffffffffffffffffffffffffffffffff811680156118c6575f5b8381106118325750509061182c600192611811838a516114cb565b9073ffffffffffffffffffffffffffffffffffffffff169052565b016117a4565b8161187761185e611844848d516114cb565b5173ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff1690565b14611884576001016117f6565b7f41fe18cc000000000000000000000000000000000000000000000000000000005f5273ffffffffffffffffffffffffffffffffffffffff831660045260245ffd5b7f59bff387000000000000000000000000000000000000000000000000000000005f5273ffffffffffffffffffffffffffffffffffffffff821660045260245ffd5b7f83e46ad2000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b509261178291945061194692505161148d565b61195081516115cc565b9260e081019384525f5b8251811015611991578061198a816119776116d5600195886114cb565b88519061198483836114cb565b526114cb565b500161195a565b50925050565b7f339e1ffb000000000000000000000000000000000000000000000000000000005f5260045ffd5b7f30c6792a000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b611a20906040519182917fd5edd2a500000000000000000000000000000000000000000000000000000000835260048301610934565b0390fd5b7f011b4d03dd8c01f1049143cf9c4c817e4b167f1d1b83e5c6f0f10d89ba1e7bce9150602083012014155f6116ea565b611a6461167061055e9251611428565b7fa19e609c000000000000000000000000000000000000000000000000000000005f52600452602490565b611a9f61168a61055e9251611417565b7ff71b722f000000000000000000000000000000000000000000000000000000005f52600452602490565b611ada61167061055e9251611407565b7fb8120dca000000000000000000000000000000000000000000000000000000005f52600452602490565b7fbc277732000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b67ffffffffffffffff1690815f52600460205260405f209167ffffffffffffffff83541615611b5c5750565b7ff761631b000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b6020611c26611b94611592565b611c0d611bab60408601611bb1611bab825161149d565b51612fa2565b611bba8561149d565b52611bc48461149d565b50611bd2611bab8251611407565b611bdb85611407565b52611be584611407565b50611bf3611bab82516114aa565b611bfc856114aa565b52611c06846114aa565b505161145b565b611c168261145b565b52611c208161145b565b50612771565b910190611c348251516115cc565b905f5b83518051821015611c8a579080600192600c82145f14611c78575050611c5c83612829565b611c6682866114cb565b52611c7181856114cb565b5001611c37565b611c8591611bab916114cb565b611c5c565b505050611c979150612771565b6020815191012090565b919091611cae83516114f7565b925f5b8151811015611ea757611cc481836114cb565b51805160418103611e7c575080601b60ff611d13611d0d611ce7611d2096612808565b517fff000000000000000000000000000000000000000000000000000000000000001690565b60f81c90565b1610611e29575b84613050565b90611d2a816128a3565b1590811591611e1f575b508015611e01575b611dd95773ffffffffffffffffffffffffffffffffffffffff81165f5b838110611d7957505090611d7360019261181183896114cb565b01611cb1565b81611d8a61185e611844848c6114cb565b14611d9757600101611d59565b7f33af0d5f000000000000000000000000000000000000000000000000000000005f5273ffffffffffffffffffffffffffffffffffffffff831660045260245ffd5b7f09cb44e6000000000000000000000000000000000000000000000000000000005f5260045ffd5b5073ffffffffffffffffffffffffffffffffffffffff811615611d3c565b905015155f611d34565b611e6b611e43611e3e611d0d611ce785612808565b612891565b60f81b7fff000000000000000000000000000000000000000000000000000000000000001690565b5f1a611e7682612808565b53611d1a565b7ff2db9ce1000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b505050565b5f198114610c975760010190565b905f915f5b8151811015611f1357611ef273ffffffffffffffffffffffffffffffffffffffff611eea83856114cb565b5116846128ad565b611eff575b600101611ebf565b92611f0b600191611eac565b939050611ef7565b50506003611f22915404610c89565b90818110611f2e575050565b7fe2dcb1b9000000000000000000000000000000000000000000000000000000005f5260045260245260445ffd5b905f198201918211610c9757565b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff408201918211610c9757565b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff808201918211610c9757565b6020039060208211610c9757565b91908203918211610c9757565b905f915f5b81518110156120385761201773ffffffffffffffffffffffffffffffffffffffff61200f83856114cb565b511684612904565b612024575b600101611fe4565b92612030600191611eac565b93905061201c565b50505190600382048203918211610c9757818110612054575050565b7f7818f4e4000000000000000000000000000000000000000000000000000000005f5260045260245260445ffd5b6120cc9261162b9261175d926040517fffffffffffffffffffffffffffffffffffffffff000000000000000000000000602082019260601b168252601481526104d7603482610afd565b805160021015611282576060610b9e91015161267f565b8054821015611282575f5260205f2001905f90565b919067ffffffffffffffff80612116855467ffffffffffffffff1690565b9216911614908115916121b7575b506121b1576002019081548151036121b1575f5b81518110156121a95761216e61214e82856120e3565b905473ffffffffffffffffffffffffffffffffffffffff9160031b1c1690565b73ffffffffffffffffffffffffffffffffffffffff61219361185e61184485876114cb565b9116036121a257600101612138565b5050505f90565b505050600190565b50505f90565b9050600182015414155f612124565b805f525f60205260ff6121fa8360405f209073ffffffffffffffffffffffffffffffffffffffff165f5260205260405f2090565b54166121b157805f525f6020526122328260405f209073ffffffffffffffffffffffffffffffffffffffff165f5260205260405f2090565b60017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0082541617905573ffffffffffffffffffffffffffffffffffffffff339216907f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d5f80a4600190565b805f525f60205260ff6122d18360405f209073ffffffffffffffffffffffffffffffffffffffff165f5260205260405f2090565b5416156121b157805f525f60205261230a8260405f209073ffffffffffffffffffffffffffffffffffffffff165f5260205260405f2090565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00815416905573ffffffffffffffffffffffffffffffffffffffff339216907ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b5f80a4600190565b60208151910120604051602081019182527f1260944489272988d9df285149b5aa1b0f48f2136d6f416159f840a3e07476006040820152604081526123b8606082610afd565b51902090565b604051906123cd602083610afd565b5f808352366020840137565b906123e382610b31565b6123f06040519182610afd565b828152601f1961151e8294610b31565b61162b612442919493946124146020610b31565b956124226040519788610afd565b602087526124306020610b31565b601f1960208901910136823752612545565b9061244d8451610ce1565b918451151580612525575b6124619061256b565b61247361246e5f85611fd2565b6123d9565b925f19015f5b81811061248d575050610b9e939450612a78565b8061250f600f6124d2612509611d0d611ce78d6124ac60029960011c90565b908d6125038a6124fb8a6124d26124c9611d0d611ce78a8a612818565b60041c600f1690565b1660f81b7fff000000000000000000000000000000000000000000000000000000000000001690565b5f1a92612818565b53612818565b60ff1690565b5f1a61251e6001830188612818565b5301612479565b506001612458565b6040519061253a82610ae1565b5f6020838281520152565b61254d61252d565b5060208151916040519261256084610ae1565b835201602082015290565b1561019557565b805180151590816125a8575b50156101955761258d90612d4e565b9051906020811061259c575090565b6020036101000a900490565b6021915011155f61257e565b6125bd81612d7a565b15610195576125cb81612d9a565b6125d4816114df565b916125e26040519384610afd565b818352601f196125f1836114df565b015f5b818110612668575050602061261491015161260e81612dfb565b90610cd4565b5f905b8282106126245750505090565b61266081612633600193612e66565b9061263c610b20565b82815281602082015261264f86896114cb565b5261265a85886114cb565b50610cd4565b910190612617565b60209061267361252d565b828288010152016125f4565b6021815103610195576020015160018101809111610c97575190565b805115610195576126ae610b9e91612d4e565b6126ba819392936123d9565b928360200190612f2f565b805191908290602001825e015f815290565b610b2f906126f96126f3949360405195869360208501906126c5565b906126c5565b03601f198101845283610afd565b6001907fff00000000000000000000000000000000000000000000000000000000000000610b9e949316815201906126c5565b916001610b9e94937fff000000000000000000000000000000000000000000000000000000000000006126f39416815201906126c5565b6127796123be565b905f915b81518310156127a55761279d60019161279685856114cb565b51906126d7565b92019161277d565b9150508051603881106127e45750610b9e6127c08251612fce565b916104c96127d4611e436125098651610caa565b916040519485936020850161273a565b6127f6611e43612509610b9e93610c9c565b6104c960405193849260208401612707565b8051604010156112825760600190565b908151811015611282570160200190565b600181511480612876575b610b9e578051603881106128645750610b9e6128508251612fce565b916104c96127d4611e436125098651610cc6565b6127f6611e43612509610b9e93610cb8565b50608060ff61288a611d0d611ce78561149d565b1610612834565b60ff601b9116019060ff8211610c9757565b6004111561029457565b905f5b82548110156121a25773ffffffffffffffffffffffffffffffffffffffff6128d882856120e3565b90549060031b1c1673ffffffffffffffffffffffffffffffffffffffff8316146121a9576001016128b0565b905f5b82518110156121a25773ffffffffffffffffffffffffffffffffffffffff61292f82856114cb565b511673ffffffffffffffffffffffffffffffffffffffff8316146121a957600101612907565b91906129618351610ce1565b908351151580612a6e575b6129759061256b565b61298261246e8284611fd2565b938192600180841614612a0c575b5f19869101935b8481106129a5575050505050565b83612a0360016129f9600f6124d2612509611d0d611ce78b60029b6129f26129e5886124d28f611d0d611ce76129de6124c99360011c90565b8099612818565b9b8d03809c5f1a92612818565b538c612818565b5f1a920189612818565b53018590612997565b92507f0f00000000000000000000000000000000000000000000000000000000000000612a4b612509611d0d611ce7612a458760011c90565b86612818565b60f81b165f1a612a5a8661149d565b535f19612a6683611eac565b939050612990565b508181111561296c565b915f915f612a8461252d565b50845115612d155790935f915b81518310156101955782158080612cff575b61019557159081612ce2575b5061019557612ac161178283836114cb565b948551600281145f14612bbe5750612ae3612ade6116d58861149d565b6130e5565b95612af9612af2888884613152565b8092610cd4565b965111612ba05715612b305750612b109051611f5c565b11610195575111612b27576116d5610b9e91611407565b50610b9e6123be565b919094612b3d8651611f5c565b82146101955780612b5f612b5b612b55600194611407565b51612d7a565b1590565b15612b8157612b70612b7691611407565b516130d7565b915b01919490612a91565b612b8d612b9a91611407565b5160208101519051902090565b91612b78565b505091509250612bb1915051611f5c565b1161019557610b9e6123be565b929491939192601103612c835781518314612c6557612bef612be9612509611d0d611ce78787612818565b93610c89565b92601081101561019557612c0c612c0682896114cb565b516130c1565b15612c2e5750505050612c2191925051611f5c565b0361019557610b9e6123be565b86612c46612b5b612b5584600196989a97999b6114cb565b15612c5857612b9a91612b70916114cb565b612b9a91612b8d916114cb565b505050612c729051611f5c565b03610195576116d5610b9e916114ba565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f696e76616c6964206e6f6465206c656e677468000000000000000000000000006044820152606490fd5b9050612cf7612cf184846114cb565b5161308a565b14155f612aaf565b50612d0d612b8d85856114cb565b871415612aa3565b509050612d4692507f56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b42191501461256b565b610b9e6123be565b906020820191612d5e8351612dfb565b925190838201809211610c975751928303928311610c97579190565b805115612d9557602060c0910151515f1a1061103757600190565b505f90565b805115612d95575f9060208101908151612db381612dfb565b8101809111610c9757915190518101809111610c975791905b828110612dd95750905090565b612de281612e66565b8101809111610c9757612df59091611eac565b90612dcc565b515f1a6080811015612e0c57505f90565b60b881108015612e50575b15612e225750600190565b60c0811015612e4157610b9e90612e3c9060b75b90611fd2565b610c89565b610b9e90612e3c9060f7612e36565b5060c08110158015612e17575060f88110612e17565b80515f1a906080821015612e7b575050600190565b60b8821015612e915750612e3c610b9e91611f97565b60c0821015612ed25760010151602082900360b7016101000a9004017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff4a0190565b60f8821015612ee85750612e3c610b9e91611f6a565b60010151602082900360f7016101000a9004017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0a0190565b601f8111610c97576101000a90565b90918015611ea7575b6020811015612f725780612f4b57505050565b612f5f612f5a612f6492611fc4565b612f20565b611f5c565b905182518216911916179052565b91908051825260208101809111610c97579060208101809111610c975791601f19810190811115612f3857610c5c565b612fac81516123d9565b90815115612fca57806020610b9e9201519051908360200190612f2f565b5090565b5f81805b61303c5750612fe0816123d9565b91815b612fec57505090565b612ff582611f5c565b6130277fff000000000000000000000000000000000000000000000000000000000000008360f81b165f1a9185612818565b5360081c908015610c97575f19019081612fe3565b9061304690611eac565b9060081c80612fd2565b8151919060418303613080576130799250602082015190606060408401519301515f1a906131f6565b9192909190565b50505f9160029190565b805160208110156130a2575060208101519051902090565b90602001512060405160208101918252602081526123b8604082610afd565b6001815103612d955760200151515f1a60801490565b6130e090612d4e565b902090565b9081511561019557600f6131016124c9611d0d611ce78661149d565b16806131145750610b9e60025f93612955565b600181036131295750610b9e60015f93612955565b6002810361313f5750610b9e6002600193612955565b60030361019557610b9e60018093612955565b91905f5b838101808211610c975782518110806131ec575b156131e45761319a7fff000000000000000000000000000000000000000000000000000000000000009184612818565b51167fff000000000000000000000000000000000000000000000000000000000000006131c78386612818565b511690036131dd576131d890611eac565b613156565b9250505090565b509250505090565b508351821061316a565b91907f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08411613285579160209360809260ff5f9560405194855216868401526040830152606082015282805260015afa1561327a575f5173ffffffffffffffffffffffffffffffffffffffff81161561327057905f905f90565b505f906001905f90565b6040513d5f823e3d90fd5b5050505f916003919056fea164736f6c634300081c000a","sourceMap":"242:2275:34:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;;;;-1:-1:-1;;242:2275:34;;;;;;;;;;;;;;;2639:47:93;2654:32;242:2275:34;2639:47:93;;:87;;;;;242:2275:34;;;;;;;;;;2639:87:93;844:25:133;829:40;;;2639:87:93;;;242:2275:34;-1:-1:-1;242:2275:34;;;;;-1:-1:-1;;242:2275:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;5705:2265:35;242:2275:34;;;:::i;:::-;-1:-1:-1;242:2275:34;;;;;;;;;;;;23324:42:35;23320:105;;5705:2265;:::i;:::-;242:2275:34;;;;;;;;;;;;;;;:::i;23320:105:35:-;23393:20;;:::i;:::-;5705:2265;:::i;242:2275:34:-;;;;;;;;;;;:::o;:::-;;;;;-1:-1:-1;;242:2275:34;;;;;;;;;3867:6:93;242:2275:34;3867:6:93;242:2275:34;;3867:22:93;242:2275:34;3867:6:93;242:2275:34;3867:22:93;242:2275:34;3776:120:93;;242:2275:34;;;;;;;;-1:-1:-1;;242:2275:34;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;4296:25:93;242:2275:34;;;:::i;:::-;4266:18:93;2475:4;4266:18;;3867:6;242:2275:34;3867:6:93;242:2275:34;;3867:22:93;242:2275:34;3867:6:93;242:2275:34;3867:22:93;242:2275:34;3776:120:93;;4266:18;2475:4;:::i;:::-;4296:25;:::i;:::-;242:2275:34;;;;;;;;:::i;:::-;735:10:121;242:2275:34;;;5387:34:93;5383:102;;5495:37;;;:::i;5383:102::-;5444:30;;;242:2275:34;5444:30:93;;242:2275:34;;;;;-1:-1:-1;;242:2275:34;;;;;;;;;;;;;;;;-1:-1:-1;;242:2275:34;;;;;;;-1:-1:-1;242:2275:34;;;;;;;;;23324:42:35;23320:105;;242:2275:34;9433:31:35;;:16;;;:31;:::i;:::-;;:::i;:::-;9479:9;;;;9499:1;9479:9;;;;:::i;:::-;:21;;;9475:97;;9641:31;242:2275:34;9787:10:35;9705:36;242:2275:34;9728:12:35;:9;9622:51;9641:31;;9787:95;9641:31;;;:::i;:::-;9622:51;:::i;:::-;9728:9;;;:::i;:::-;:12;;:::i;:::-;242:2275:34;;;:::i;:::-;9705:36:35;:::i;:::-;9787:10;;;:::i;242:2275:34:-;9813:26:35;9499:1;9813:26;;242:2275:34;;;;9851:29:35;;;242:2275:34;9851:29:35;;;;242:2275:34;;;;;;;9851:29:35;;-1:-1:-1;;9851:29:35;;;;;;:::i;:::-;242:2275:34;9841:40:35;;9787:95;;:::i;:::-;242:2275:34;;9892:109:35;;242:2275:34;10010:31:35;242:2275:34;;;;;;;;;;;;10010:31:35;242:2275:34;;;;;;;;;;;;;;;;;9892:109:35;9959:29;:20;9939:51;9959:20;;:::i;:::-;:29;:::i;:::-;9939:51;-1:-1:-1;9939:51:35;242:2275:34;;;;;9939:51:35;-1:-1:-1;9939:51:35;9475:97;9523:38;9544:9;;;;:::i;:::-;9523:38;-1:-1:-1;9523:38:35;9499:1;242:2275:34;;;;-1:-1:-1;242:2275:34;;;23320:105:35;23393:20;;:::i;:::-;23320:105;;242:2275:34;;;;;-1:-1:-1;;242:2275:34;;;;;;;;2089:33:35;242:2275:34;;;;;;;;-1:-1:-1;;242:2275:34;;;;;;;;;;;;;;;;-1:-1:-1;;242:2275:34;;;;;;;-1:-1:-1;242:2275:34;;;;;;;;;23324:42:35;23320:105;;242:2275:34;8205:31:35;;:16;;;:31;:::i;:::-;8251:9;;;;8271:1;8251:9;;;;:::i;:::-;:21;;;8247:97;;8357:10;;;;242:2275:34;8357:10:35;;;;:::i;:::-;:23;;;8353:102;;8524:31;242:2275:34;8737:10:35;8658:33;8669:10;8588:36;242:2275:34;8611:12:35;:9;8505:51;8524:31;;8737:95;8524:31;;;:::i;8505:51::-;8611:9;;;:::i;8588:36::-;8669:10;;;:::i;:::-;8658:33;;;;:::i;:::-;8737:10;;;:::i;242:2275:34:-;8763:26:35;8271:1;8763:26;;242:2275:34;;;;8801:29:35;;;242:2275:34;8801:29:35;;;;242:2275:34;;;;;;;8737:95:35;242:2275:34;;8846:20:35;8842:107;;8989:20;:29;:20;;:::i;:29::-;9033:28;;;;9029:116;;242:2275:34;9154:31:35;242:2275:34;;;;;;;9029:116:35;9084:50;-1:-1:-1;9084:50:35;242:2275:34;;;;;-1:-1:-1;9939:51:35;8842:107;8889:49;;;-1:-1:-1;8889:49:35;242:2275:34;;;;;-1:-1:-1;242:2275:34;;;8353:102:35;8403:41;8426:10;;;;:::i;:::-;8403:41;-1:-1:-1;8403:41:35;242:2275:34;;;;;-1:-1:-1;242:2275:34;;;23320:105:35;23393:20;;:::i;:::-;23320:105;;242:2275:34;;;;;;2920:29:93;242:2275:34;;;:::i;:::-;;2920:6:93;242:2275:34;2920:6:93;242:2275:34;;;2920:6:93;242:2275:34;;;;;;;;;;;;;2920:29:93;242:2275:34;;;;;;;;;;;;;;;-1:-1:-1;;242:2275:34;;;;;;;;;;;;;;;;4713:26:93;242:2275:34;;;:::i;:::-;4683:18:93;2475:4;4683:18;;3867:6;242:2275:34;3867:6:93;242:2275:34;;3867:22:93;242:2275:34;3867:6:93;242:2275:34;3867:22:93;242:2275:34;3776:120:93;;2475:4;4713:26;:::i;242:2275:34:-;;;;;;;:::i;:::-;-1:-1:-1;;23363:1:35;242:2275:34;;;;;;;;;23324:42:35;23320:105;;242:2275:34;10175:25:35;23363:1;10175:25;242:2275:34;23363:1:35;10175:25;23320:105;23393:20;;:::i;:::-;23320:105;;242:2275:34;;;;;;;:::o;:::-;-1:-1:-1;;242:2275:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;-1:-1:-1;;242:2275:34;;;;;5517:34:35;242:2275:34;;;;;:::i;5517:34:35:-;242:2275:34;;;;5633:25:35;5605:26;;;242:2275:34;5633:25:35;;242:2275:34;;;;;;;5568:91:35;242:2275:34;5568:91:35;;242:2275:34;;;;;;;;;;;;;;;;;;;-1:-1:-1;242:2275:34;;-1:-1:-1;242:2275:34;;-1:-1:-1;242:2275:34;;;;;;;5568:91:35;;;;;-1:-1:-1;;5568:91:35;;;;;;:::i;:::-;242:2275:34;;;;;;;:::i;:::-;;;;;;;;;;;;5605:26:35;242:2275:34;;;;;;;;;;;;-1:-1:-1;;242:2275:34;;;;;;;;;5120:11:35;242:2275:34;;5109:23:35;;;242:2275:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5109:23:35;;;;;;:::i;242:2275:34:-;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;:::i;:::-;;;;;;;;;;;;;;;:::o;:::-;;;-1:-1:-1;;242:2275:34;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;:::i;:::-;:::o;:::-;;;;;;;;-1:-1:-1;;242:2275:34;;;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;-1:-1:-1;242:2275:34;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;:::i;:::-;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;-1:-1:-1;;242:2275:34;;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;:::o;:::-;;;;;;;;;;;;2219:66:35;242:2275:34;;;;;;;:::o;:::-;;:::i;:::-;22386:4:35;242:2275:34;;;22386:4:35;242:2275:34;;;:::o;:::-;22540:4:35;242:2275:34;;;22540:4:35;242:2275:34;;;:::o;:::-;21713:4:35;242:2275:34;;;21713:4:35;242:2275:34;;;:::o;:::-;21855:4:35;242:2275:34;;;21855:4:35;242:2275:34;;;:::o;:::-;;;;;;;;;;:::o;:::-;;;;;;;;;8605:1:37;242:2275:34;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;242:2275:34;;;-1:-1:-1;242:2275:34;;;;;;;;;;;;;;;;-1:-1:-1;242:2275:34;;;;;;5705:2265:35;5889:40;5705:2265;5889:40;;;;:::i;:::-;5960:18;;;;:33;242:2275:34;5960:18:35;;242:2275:34;;;;;5960:33:35;6034:28;6047:14;;6034:28;:::i;:::-;6076:13;;;;242:2275:34;;;;;;;;;;;6076:18:35;6072:77;;6180:25;242:2275:34;;;;;;;;6162:43:35;;242:2275:34;;;6162:15:35;:43;:::i;:::-;6208:16;;;;242:2275:34;;;;;;;;;6162:62:35;242:2275:34;;;-1:-1:-1;6158:178:35;;-1:-1:-1;;6412:18:35;5960;6412:33;242:2275:34;;;6393:53:35;;242:2275:34;;9622:51:35;:::i;6393:53::-;242:2275:34;;;;;;;;;6473:31:35;;;:139;;;;5705:2265;6456:298;;;6807:25;;7027:79;6807:25;6863:72;6180:25;6791:62;6807:25;;;:::i;:::-;6834:18;;;;6791:62;;:::i;:::-;6902:32;;6863:72;;:::i;:::-;6976:17;;;;;;;;;:::i;:::-;7088;7070:16;242:2275:34;6180:11:35;242:2275:34;;;;;;7070:16:35;;242:2275:34;7088:17:35;;;7027:79;;:::i;:::-;7165:30;242:2275:34;;;;;;;;;;;;7165:15:35;242:2275:34;;;;;;;7165:30:35;7209:37;242:2275:34;;;;;;;7209:37:35;7205:303;;242:2275:34;;6180:25:35;242:2275:34;;;;7601:46:35;242:2275:34;7561:30:35;242:2275:34;;;;;;;;;7561:30:35;242:2275:34;;;;;;;7601:46:35;242:2275:34;;;;;;;;;;;7601:46:35;6180:11;7657:29;;242:2275:34;7741:17:35;7710:28;;242:2275:34;:::i;:::-;;;;;;;6180:25:35;242:2275:34;7773:55:35;;242:2275:34;;;;;;7773:55:35;242:2275:34;;;7773:55:35;7769:141;;7920:43;5960:33;5705:2265;:::o;7769:141::-;7844:55;;242:2275:34;;6180:25:35;242:2275:34;;;;;;;;6180:25:35;242:2275:34;;7844:55:35;5960:33;5705:2265;:::o;7205:303::-;242:2275:34;;7266:95:35;242:2275:34;;;;;;;7343:17:35;;7266:95;;:::i;:::-;7262:175;;7457:40;242:2275:34;;;;;;;;7457:40:35;5960:33;7457:40;242:2275:34;;7165:15:35;242:2275:34;;;;7262:175:35;6180:25;;-1:-1:-1;7381:41:35:o;6456:298::-;6644:99;242:2275:34;;;;;;;;;6644:99:35;5960:33;6644:99;242:2275:34;;;;6644:99:35;242:2275:34;6162:15:35;242:2275:34;;;;;;;;6473:139:35;6162:15;;6524:69;6162:15;242:2275:34;6524:40:35;242:2275:34;;;;;;;6524:40:35;:69;:::i;:::-;:88;;6473:139;;;6158:178;6247:78;5960:33;6247:78;6162:15;6247:78;242:2275:34;;;;;;;;;;;-1:-1:-1;9939:51:35;6072:77;6117:21;5960:33;6117:21;;5960:33;6117:21;242:2275:34;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;:::i;:::-;;;:::o;:::-;;:::i;3165:103:93:-;735:10:121;2920:6:93;242:2275:34;;;;;;;;;;;;3485:23:93;3481:108;;3165:103::o;3481:108::-;3531:47;2920:6;3531:47;735:10:121;3531:47:93;242:2275:34;2089:33:35;242:2275:34;;;2920:6:93;3531:47;3165:103;242:2275:34;2920:6:93;242:2275:34;2920:6:93;242:2275:34;;;2920:29:93;735:10:121;242:2275:34;2920:6:93;242:2275:34;;;;;;;;;;;;;2920:29:93;242:2275:34;;3485:23:93;3481:108;;3165:103;:::o;3481:108::-;3531:47;2920:6;3531:47;735:10:121;3531:47:93;242:2275:34;;;;2920:6:93;3531:47;19876:177:35;242:2275:34;;19957:19:35;19953:94;;19876:177;:::o;19953:94::-;19999:37;19975:1;19999:37;;242:2275:34;;19975:1:35;19999:37;242:2275:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;242:2275:34;;;;-1:-1:-1;242:2275:34;;;;-1:-1:-1;242:2275:34;;;;;;;;;;;:::o;:::-;;;11070:1:35;242:2275:34;;;;;;;:::o;:::-;;;11239:1:35;242:2275:34;;;;;;;:::o;:::-;;;11378:2:35;242:2275:34;;;;;;;:::o;:::-;;;11564:2:35;242:2275:34;;;;;;;:::o;:::-;;;11607:1:35;242:2275:34;;;;;;;:::o;:::-;;;11837:1:35;242:2275:34;;;;;;;:::o;:::-;;;11910:2:35;242:2275:34;;;;;;;:::o;:::-;;;11978:2:35;242:2275:34;;;;;;;:::o;:::-;;;13209:1:35;242:2275:34;;;;;;;:::o;:::-;;;;;;;;;:::o;:::-;;;2050:1;242:2275;;;;;;;:::o;:::-;;;7571:2:37;242:2275:34;;;;;;;:::o;:::-;;;;;;;;;;;;;;;:::o;2219:66:35:-;;;;;;;;;;;:::o;:::-;;;;;:::i;:::-;242:2275:34;;;;;;:::i;:::-;2219:66:35;;;-1:-1:-1;;2219:66:35;;;;:::i;:::-;;;;;;;;:::o;:::-;;242:2275:34;;;;;2219:66:35;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;242:2275:34;2219:66:35;;;:::o;:::-;242:2275:34;;2219:66:35;;242:2275:34;;2219:66:35;242:2275:34;;:::i;:::-;1856:1;2219:66:35;;;-1:-1:-1;;2219:66:35;;-1:-1:-1;2219:66:35;;;;;;;;;:::o;:::-;;242:2275:34;2219:66:35;;;;;;;;;;;;;;;:::i;:::-;242:2275:34;;;;;;:::i;:::-;2219:66:35;;;-1:-1:-1;;2219:66:35;;;;:::i;:::-;;;-1:-1:-1;2219:66:35;;;;;;;;;:::o;:::-;;242:2275:34;2219:66:35;;;;;;;;;;10709:2705;10875:30;:21;242:2275:34;;:::i;:::-;10816:28:35;;;;10875:21;:::i;:::-;:30;:::i;:::-;10854:18;;;:51;;;;242:2275:34;10947:2:35;10919:30;;10915:114;;11051:18;2401:66;11051:36;:21;:18;;:21;:::i;:::-;;:36;:::i;:::-;11043:66;11039:168;;11070:1;11220:30;:21;:18;;:21;:::i;:::-;;:30;:::i;:::-;:35;11216:122;;2219:66;11359:37;:22;:18;;:22;:::i;:37::-;11351:67;11347:167;;11545:32;:22;:18;;:22;:::i;:::-;;:32;:::i;:::-;242:2275:34;;11607:1:35;11591:17;;;;;:73;;;10709:2705;11587:130;;;11750:18;12025:21;11959:32;:22;11750:18;11727:54;11743:38;11750:30;:21;12025:30;11750:18;;:21;:::i;11743:38::-;242:2275:34;;11727:13:35;;;2219:66;;11727:54;11818:36;:21;:18;;:21;:::i;:36::-;11791:16;;;2219:66;11865:58;11884:39;11891:31;:22;:18;;:22;:::i;11884:39::-;242:2275:34;;11865:16:35;;;2219:66;;11865:58;11959:18;:22;:::i;:32::-;12025:21;:::i;:30::-;12001:21;;;;:54;;;;242:2275:34;12101:1:35;12069:33;;12065:123;;12242:21;:33;:24;:21;;:24;:::i;:::-;;:33;:::i;:::-;242:2275:34;;;12289:26:35;12285:83;;12398:36;242:2275:34;;12398:36:35;:::i;:::-;12378:17;;;;:56;;;-1:-1:-1;12491:3:35;242:2275:34;;12464:25:35;;;;;12540:27;:17;;;;:::i;:27::-;242:2275:34;;12610:2:35;12585:27;;12581:125;;12748:23;;12740:32;12748:23;;:::i;:::-;2219:66;;;;12740:32;242:2275:34;;;12790:23:35;;12786:103;;-1:-1:-1;12922:5:35;;;;;;13095:17;;;:32;11070:1;13095:17;:32;:17;;;:32;:::i;:::-;2219:66;242:2275:34;;2219:66:35;;;13095:32;2219:66;12449:13;;12929:3;12956:17;:33;:20;;:17;;;:20;:::i;:::-;242:2275:34;;;;;12956:20:35;242:2275:34;;;;12956:33:35;;12952:116;;11070:1;2219:66;12907:13;;12952:116;13020:29;-1:-1:-1;13020:29:35;242:2275:34;;;12840:34:35;242:2275:34;2219:66:35;-1:-1:-1;9939:51:35;12786:103;12840:34;-1:-1:-1;12840:34:35;242:2275:34;;;12840:34:35;242:2275:34;2219:66:35;-1:-1:-1;9939:51:35;12581:125;12639:52;-1:-1:-1;12639:52:35;242:2275:34;;;-1:-1:-1;9939:51:35;12464:25;;;13187:24;12464:25;;;13187:33;12464:25;;13187:21;:24;:::i;:33::-;13251:29;242:2275:34;;13251:29:35;:::i;:::-;13230:18;;;;:50;;;-1:-1:-1;13332:3:35;242:2275:34;;13310:20:35;;;;;13375:12;13351:46;13375:12;:22;:12;11070:1;13375:12;;;:::i;:22::-;13351:18;;:46;;;;;:::i;:::-;;;:::i;:::-;;2219:66;13295:13;;13310:20;;;;;10709:2705::o;12285:83::-;12338:19;-1:-1:-1;12338:19:35;;-1:-1:-1;12338:19:35;12065:123;12125:52;-1:-1:-1;12125:52:35;242:2275:34;;;-1:-1:-1;9939:51:35;11587:130;11687:19;242:2275:34;;;11687:19:35;;;;;;;;;;:::i;:::-;;;;11591:73;11632:32;242:2275:34;;10854:18:35;242:2275:34;;11612:16:35;:52;;11591:73;;;11347:167;11464:37;:22;11441:62;11464:18;;:22;:::i;:37::-;11441:62;-1:-1:-1;11441:62:35;242:2275:34;;;;;11216:122:35;11296:30;:21;11278:49;11296:18;;:21;:::i;:30::-;11278:49;-1:-1:-1;11278:49:35;242:2275:34;;;;;11039:168:35;11158:36;:21;11132:64;11158:18;;:21;:::i;:36::-;11132:64;-1:-1:-1;11132:64:35;242:2275:34;;;;;10915:114:35;10972:46;10816:16;10972:46;242:2275:34;;;-1:-1:-1;9939:51:35;19455:292;242:2275:34;;;;-1:-1:-1;242:2275:34;19595:15:35;242:2275:34;;;-1:-1:-1;242:2275:34;;;;;;19640:29:35;19636:105;;19455:292;:::o;19636:105::-;19692:38;-1:-1:-1;19692:38:35;19595:15;242:2275:34;;-1:-1:-1;19692:38:35;1710:805:34;2238:18;2161:26;1844:14;;:::i;:::-;21300:17:35;2093:24:34;1898:21;;;21300:17:35;1898:24:34;:21;;:24;:::i;:::-;;21300:17:35;:::i;:::-;1868:55:34;;;:::i;:::-;;;;;:::i;:::-;;21300:17:35;1963:24:34;:21;;:24;:::i;21300:17:35:-;1933:55:34;;;:::i;:::-;;;;;:::i;:::-;;21300:17:35;2028:24:34;:21;;:24;:::i;21300:17:35:-;1998:55:34;;;:::i;:::-;;;;;:::i;:::-;;2093:21;:24;:::i;21300:17:35:-;2063:55:34;;;:::i;:::-;;;;;:::i;:::-;;2161:26;:::i;:::-;2238:18;;;2226:38;2238:18;;242:2275;2226:38;:::i;:::-;2279:13;1920:1;2325:3;2298:18;;242:2275;;2294:29;;;;;2361:82;;1985:1;2361:82;2366:2;2361:7;;:82;2366:2;;;2371:33;;;;;:::i;:::-;2344:99;;;;:::i;:::-;;;;;;:::i;:::-;;2219:66:35;2279:13:34;;2361:82;21300:17:35;2421:21:34;;;;:::i;21300:17:35:-;2361:82:34;;2294:29;;;;2480:27;2294:29;;2480:27;:::i;:::-;2238:18;242:2275;;;;2470:38;1710:805;:::o;14731:509:35:-;;;;14863:27;242:2275:34;;14863:27:35;:::i;:::-;14905:13;14917:1;14938:3;242:2275:34;;14920:16:35;;;;;14997:8;;;;:::i;:::-;;242:2275:34;;15558:2:35;15543:17;;15539:95;;15653:8;;15665:2;242:2275:34;15647:15:35;15653:8;;15808:30;15653:8;;:::i;:::-;242:2275:34;;;;;15653:8:35;242:2275:34;;;;15647:15:35;242:2275:34;15647:20:35;15643:90;;14938:3;15808:30;;:::i;:::-;242:2275:34;;;;:::i;:::-;15852:33:35;;;;:64;;;14938:3;15852:88;;;;;14938:3;15848:145;;242:2275:34;;;14917:1:35;15040:5;;;;;;15204:19;;;;2219:66;15204:19;;;;;:::i;:::-;2219:66;14905:13;;15047:3;15074:10;:20;:10;;;;;:::i;:20::-;;15070:107;;2219:66;;15025:13;;15070:107;15125:33;14917:1;15125:33;242:2275:34;;;12840:34:35;242:2275:34;2219:66:35;-1:-1:-1;9939:51:35;15848:145;15963:19;14917:1;15963:19;;14917:1;15963:19;15852:88;242:2275:34;;;;15920:20:35;15852:88;;:64;15889:27;;;;15852:64;;;15643:90;15694:28;15701:20;:15;15707:8;;;;:::i;15701:15::-;:20;:::i;:::-;242:2275:34;;;;;;15694:28:35;14917:1;15683:39;;;;:::i;:::-;;15643:90;;15539:95;15583:40;14917:1;15583:40;242:2275:34;;;-1:-1:-1;9939:51:35;14920:16;;;;14731:509::o;242:2275:34:-;-1:-1:-1;;242:2275:34;;;;;;;:::o;16229:544:35:-;;16414:1;16430:13;16414:1;16465:3;242:2275:34;;16445:18:35;;;;;16488:47;242:2275:34;16524:10:35;;;;:::i;:::-;242:2275:34;;16488:47:35;;:::i;:::-;16484:94;;16465:3;2219:66;;16430:13;;16484:94;16555:8;;2219:66;16555:8;;:::i;:::-;16484:94;;;;;16445:18;;;16644:1;16617:32;16445:18;242:2275:34;;16617:32:35;:::i;:::-;16663:17;;;;16659:108;;16229:544;;:::o;16659:108::-;16703:53;16414:1;16703:53;242:2275:34;;;;;16414:1:35;16703:53;242:2275:34;;-1:-1:-1;;242:2275:34;;;;;;;:::o;:::-;;;;;;;;;;:::o;:::-;;;;;;;;;;:::o;:::-;;;;;;;;;:::o;:::-;;;;;;;;;;:::o;16996:549:35:-;;17123:1;17139:13;17123:1;17174:3;242:2275:34;;17154:18:35;;;;;17197:39;242:2275:34;17225:10:35;;;;:::i;:::-;242:2275:34;;17197:39:35;;:::i;:::-;17193:86;;17174:3;2219:66;;17139:13;;17193:86;17256:8;;2219:66;17256:8;;:::i;:::-;17193:86;;;;;17154:18;;;242:2275:34;;17428:1:35;242:2275:34;;;;;;;;;17443:17:35;;;17439:100;;16996:549;;:::o;17439:100::-;17483:45;17123:1;17483:45;242:2275:34;;;;;17123:1:35;17483:45;13709:440;14055:31;13709:440;14055:22;13709:440;13927:76;13709:440;242:2275:34;;;13976:25:35;;;242:2275:34;;;;;;13976:25:35;;;;;;;:::i;14055:31::-;242:2275:34;;14124:1:35;242:2275:34;;;;;14111:30:35;242:2275:34;;14111:15:35;:30;:::i;242:2275:34:-;;;;;;;;-1:-1:-1;242:2275:34;;-1:-1:-1;242:2275:34;;;-1:-1:-1;242:2275:34;:::o;18568:677:35:-;;;242:2275:34;;;;;;;;;;;;;;18815:37:35;;;;:82;;;18568:677;18811:125;;;18949:25;;242:2275:34;;;;;18949:53:35;18945:96;;242:2275:34;19093:3:35;242:2275:34;;19070:21:35;;;;;242:2275:34;19116:28:35;;;;:::i;:::-;242:2275:34;;;;;;;;;;;;19116:45:35;19148:13;;;;;:::i;19116:45::-;242:2275:34;;19116:45:35;19112:96;;2219:66;;19055:13;;19112:96;19181:12;;;242:2275:34;19181:12:35;:::o;19070:21::-;;;;2219:66;18568:677;:::o;18945:96::-;19018:12;;242:2275:34;19018:12:35;:::o;18815:82::-;18856:26;;;;;242:2275:34;18856:41:35;;18815:82;;;6145:316:93;242:2275:34;;;;;;;2920:29:93;242:2275:34;;;;;;;;;;;;;;;;2920:29:93;242:2275:34;;;;;;;;;;6281:29:93;242:2275:34;;;;;;;;;;;;;;;;6281:29:93;6313:4;242:2275:34;;;;;;;;735:10:121;242:2275:34;;6336:40:93;;242:2275:34;6336:40:93;;6313:4;6390:11;:::o;6698:317::-;242:2275:34;;;;;;;2920:29:93;242:2275:34;;;;;;;;;;;;;;;;2920:29:93;242:2275:34;;;;;;;;;;;6834:29:93;242:2275:34;;;;;;;;;;;;;;;;6834:29:93;242:2275:34;;;;;;;735:10:121;242:2275:34;;6890:40:93;;242:2275:34;6890:40:93;;242:2275:34;6944:11:93;:::o;14333:174:35:-;242:2275:34;;;;;14457:18:35;242:2275:34;;;14446:53:35;;242:2275:34;;;2612:66:35;242:2275:34;;;;;14446:53:35;;;;;;:::i;:::-;242:2275:34;14436:64:35;;14333:174;:::o;242:2275:34:-;;;;;;;;:::i;:::-;22179:1:35;242:2275:34;;;2219:66:35;242:2275:34;;;2219:66:35;242:2275:34:o;:::-;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;-1:-1:-1;;242:2275:34;;;;:::i;1287:390:37:-;1607:20;:29;1287:390;;;;242:2275:34;1508:2:37;242:2275:34;:::i;:::-;;;;;;;;:::i;:::-;1508:2:37;242:2275:34;;;1508:2:37;242:2275:34;:::i;:::-;-1:-1:-1;;1508:2:37;242:2275:34;;;;2219:66:35;;;1521:63:37;1607:20;:::i;:29::-;1648:21;8593:13;242:2275:34;;8593:13:37;:::i;:::-;242:2275:34;;;8624:13:37;;:33;;;1287:390;8616:42;;;:::i;:::-;8679:26;8689:15;-1:-1:-1;8689:15:37;;:::i;:::-;8679:26;:::i;:::-;8715:18;-1:-1:-1;;242:2275:34;1667:1:37;8901:14;;;;;;1600:70;;;;;;;:::i;8917:6::-;8982:5;9046:37;8998:3;9054:21;:16;9060:9;;8982:5;;8605:1;8982:5;242:2275:34;;;;8982:5:37;8979:9;;8943:59;8979:9;8965:37;8979:9;8973:21;:16;8979:9;;;;;:::i;8973:16::-;242:2275:34;;;;;;8973:21:37;8972:29;242:2275:34;;;;;;8965:37:37;1667:1;8943:59;;;:::i;:::-;;9060:9;:::i;9054:16::-;242:2275:34;;;;9046:37:37;1667:1;9020:63;;8756:1;242:2275:34;;9020:63:37;;:::i;:::-;;242:2275:34;8894:204:37;;8624:33;-1:-1:-1;8641:16:37;8624:33;;242:2275:34;;;;;;;:::i;:::-;-1:-1:-1;242:2275:34;;;;;;;:::o;2457:221:38:-;242:2275:34;;:::i;:::-;;2568:58:38;242:2275:34;;;;;;;;;:::i;:::-;2219:66:35;;2568:58:38;;2643:28;;2219:66:35;2457:221:38;:::o;242:2275:34:-;;;;:::o;7796:439:38:-;242:2275:34;;7883:12:38;;;:30;;;;7796:439;242:2275:34;;;;7957:21:38;;;:::i;:::-;7989:14;8013:192;;;;;;;8215:13;7796:439;:::o;8013:192::-;;;;;;;7796:439;:::o;7883:30::-;7911:2;7899:14;;;;7883:30;;;4170:519;4266:12;;;:::i;:::-;242:2275:34;;;4306:14:38;;;:::i;:::-;2219:66:35;;;:::i;:::-;242:2275:34;;;;;;;:::i;:::-;2219:66:35;;;-1:-1:-1;;242:2275:34;;;:::i;:::-;;-1:-1:-1;242:2275:34;;;;;;4404:11:38;;242:2275:34;4404:41:38;:11;;242:2275:34;4418:27:38;;;:::i;:::-;4404:41;;:::i;:::-;-1:-1:-1;4480:179:38;4500:9;;;;;;4669:13;;;4170:519;:::o;4511:3::-;4632:16;4540:19;;2219:66:35;4540:19:38;;:::i;:::-;242:2275:34;;;:::i;:::-;2219:66:35;;;4585:24:38;242:2275:34;4585:24:38;;2219:66:35;4573:36:38;;;;:::i;:::-;;;;;;:::i;:::-;;4632:16;:::i;:::-;4511:3;2219:66:35;4485:13:38;;;242:2275:34;;;;;:::i;:::-;;;;;;;;;;8413:298:38;8545:2;242:2275:34;;8533:14:38;242:2275:34;;8600:11:38;;242:2275:34;8614:1:38;242:2275:34;;;;;;;8625:56:38;8413:298;:::o;8857:379::-;242:2275:34;;8950:12:38;242:2275:34;;9006:21:38;9202:3;9006:21;;:::i;:::-;9059:14;;;;;;:::i;:::-;9109:61;;;;9202:3;;:::i;242:2275:34:-;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;:::i;:::-;;;:::i;:::-;;-1:-1:-1;;242:2275:34;;;;;;:::i;:::-;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;22053:538:35:-;22169:12;;:::i;:::-;22196:13;22179:1;22191:109;22229:3;242:2275:34;;22211:16:35;;;;;22258:31;2219:66;22280:8;;;;;:::i;:::-;;22258:31;;:::i;:::-;22229:3;2219:66;22196:13;;;22211:16;;;;242:2275:34;;22331:2:35;22314:19;;22310:120;;242:2275:34;22510:74:35;22464:29;242:2275:34;;22464:29:35;:::i;:::-;242:2275:34;22510:74:35;22527:37;22534:29;22540:22;242:2275:34;;22540:22:35;:::i;22527:37::-;242:2275:34;;;22510:74:35;;;;;;;:::i;22310:120::-;22373:36;22380:28;22386:21;22356:63;22386:21;;:::i;22373:36::-;22356:63;242:2275:34;;22356:63:35;;;;;;;:::i;242:2275:34:-;;;15658:2:35;242:2275:34;;;;;;;:::o;:::-;;;;;;;;;;;;;:::o;21462:440:35:-;21570:1;242:2275:34;;21556:15:35;:39;;;21462:440;21552:80;;242:2275:34;;21658:2:35;21645:15;;21641:108;;242:2275:34;21825:70:35;21783:25;242:2275:34;;21783:25:35;:::i;:::-;242:2275:34;21825:70:35;21842:37;21849:29;21855:22;242:2275:34;;21855:22:35;:::i;21641:108::-;21700:32;21707:24;21713:17;21683:55;21713:17;;:::i;21556:39::-;21581:6;21591:4;242:2275:34;21575:13:35;21581:6;;;;:::i;21575:13::-;242:2275:34;21575:20:35;21556:39;;242:2275:34;;;;;;;;;;;;:::o;:::-;;-1:-1:-1;242:2275:34;;;:::o;20273:284:35:-;;242:2275:34;20427:3:35;242:2275:34;;20404:21:35;;;;;242:2275:34;20450:13:35;;;;:::i;:::-;242:2275:34;;;;;;;;;;20450:23:35;20446:73;;2219:66;;20389:13;;20775:282;;242:2275:34;20927:3:35;242:2275:34;;20904:21:35;;;;;242:2275:34;20950:13:35;;;;:::i;:::-;242:2275:34;;;;;20950:23:35;20946:73;;2219:66;;20889:13;;8465:649:37;;;8593:13;242:2275:34;;8593:13:37;:::i;:::-;242:2275:34;;;8624:13:37;;:33;;;8465:649;8616:42;;;:::i;:::-;8679:26;8689:15;;;;:::i;8679:26::-;8715:18;;8747:10;8756:1;8747:10;;;:15;8743:118;;8465:649;-1:-1:-1;;242:2275:34;;;8894:204:37;8901:14;;;;;;8465:649;;;;;:::o;8917:6::-;8982:5;9020:63;8756:1;9046:37;8998:3;9054:21;:16;9060:9;;8982:5;8605:1;8982:5;8943:59;8965:37;8982:5;8973:21;8982:5;8979:9;;8982:5;8973:16;8982:5;242:2275:34;;;;8982:5:37;8979:9;;;:::i;8965:37::-;242:2275:34;;;8943:59:37;;8636:1;8943:59;;;:::i;:::-;;9060:9;;:::i;9046:37::-;8636:1;9020:63;242:2275:34;;9020:63:37;;:::i;:::-;;242:2275:34;8894:204:37;;;;8743:118;8808:10;;242:2275:34;8799:26:37;:21;8805:14;;8808:10;;242:2275:34;;;;8808:10:37;8805:14;;:::i;8799:26::-;242:2275:34;;;8636:1:37;8778:55;;;;:::i;:::-;;-1:-1:-1;;8847:3:37;;;:::i;:::-;8743:118;;;;;8624:33;-1:-1:-1;8641:16:37;;;;8624:33;;2316:5431;;2546:1;2557:33;2546:1;242:2275:34;;:::i;:::-;;;;2689:17:37;2685:223;;2976:13;;2546:1;2971:4724;3009:3;242:2275:34;;2991:16:37;;;;;3091:6;;;;:50;;3009:3;3087:97;;3298:6;:47;;;;3009:3;3294:94;;;3514:17;:8;;;;:::i;:17::-;242:2275:34;;;3565:1:37;3550:16;;3546:4139;3565:1;;;3744:7;3716:46;3744:17;:7;;;:::i;:17::-;3716:46;:::i;:::-;3804:56;3878:28;3804:56;;;;;:::i;:::-;3878:28;;;:::i;:::-;242:2275:34;;-1:-1:-1;3925:994:37;;4937:1185;;;242:2275:34;5015:16:37;242:2275:34;;5015:16:37;:::i;:::-;-1:-1:-1;5007:144:37;;242:2275:34;-1:-1:-1;5173:109:37;;5315:7;5351:18;5315:7;;:::i;5173:109::-;5247:12;;;:::i;4937:1185::-;242:2275:34;;;5494:16:37;242:2275:34;;5494:16:37;:::i;:::-;5489:21;;5485:138;;5650:7;5649:17;5650:16;:7;2219:66:35;5650:7:37;;:::i;:::-;;:16;:::i;:::-;5649:17;;242:2275:34;5649:17:37;5650:7;;;5837;:26;:7;;:::i;:::-;;:26;:::i;:::-;5645:459;;2219:66:35;2976:13:37;;;;;5645:459;6054:7;:27;:7;;:::i;:::-;;5445:11:38;;;242:2275:34;;;5522:62:38;;5341:272;;6054:27:37;5645:459;;;3925:994;242:2275:34;;;;;;4718:16:37;242:2275:34;;;4718:16:37;:::i;:::-;-1:-1:-1;4710:149:37;;4888:12;;:::i;3546:4139::-;6146:17;;;;;;6161:2;6146:17;6161:2;;242:2275:34;;6219:36:37;;6235:20;;6451:17;6386:43;6394:34;6400:27;;;;;:::i;6386:43::-;6451:17;;:::i;:::-;6494:12;6504:2;6494:12;;;6490:146;;6662:33;6682:12;;;;:::i;:::-;;6662:33;:::i;:::-;6682:12;;;242:2275:34;;;;6766:16:37;242:2275:34;;;;6766:16:37;:::i;:::-;6761:21;6757:157;;6947:12;;:::i;6658:555::-;6993:12;6992:22;6993:21;:12;;2219:66:35;6993:12:37;;;;;;;:::i;6992:22::-;6993:12;;;7057:31;:12;;;;:::i;6988:225::-;7158:32;:12;;;;:::i;6215:1388::-;242:2275:34;;;7411:16:37;242:2275:34;;7411:16:37;:::i;:::-;7406:21;7402:135;;7566:8;:18;:8;;:::i;6142:1543::-;242:2275:34;;7641:29:37;;;242:2275:34;7641:29:37;;;242:2275:34;;;;;;;;;;;;;11687:19:35;3298:47:37;3336:8;;3324:21;3336:8;;;;:::i;:::-;;3324:21;:::i;:::-;3308:37;;3298:47;;;3091:50;3113:8;:28;:8;;;;:::i;:28::-;3101:40;;;3091:50;;2685:223;2785:78;;;2777:87;2785:78;;2797:66;2785:78;;;2777:87;:::i;:::-;2885:12;;:::i;3469:281:38:-;;3598:11;;;242:2275:34;3583:27:38;242:2275:34;;3583:27:38;:::i;:::-;242:2275:34;;;;;;;;;;;;;;;;;;;;3723:20:38;3469:281;:::o;4838:321::-;242:2275:34;;4918:13:38;4914:31;;4994:11;868:4;4994:11;;242:2275:34;5015:64:38;242:2275:34;5015:64:38;5093:24;5089:42;;5148:4;4838:321;:::o;4914:31::-;4933:12;242:2275:34;4933:12:38;:::o;9434:424::-;242:2275:34;;9518:13:38;9514:27;;242:2275:34;9597:11:38;;;;242:2275:34;;;9611:27:38;;;:::i;:::-;242:2275:34;;;;;;;;;;;;;;;;;;9697:132:38;;9704:16;;;;;;9839:12;;;9434:424;:::o;9697:132::-;9756:20;;;:::i;:::-;242:2275:34;;;;;;;9811:7:38;9736:40;9811:7;;:::i;:::-;9697:132;;;11485:581;11589:64;242:2275:34;11589:64:38;682:4;11667:26;;682:4;;;11709:8;242:2275:34;11709:8:38;:::o;11663:397::-;776:4;11738:25;;:83;;;;11663:397;11734:326;;;11837:8;11844:1;11837:8;:::o;11734:326::-;868:4;11866:24;;868:4;;;11943:35;;:31;;958:4;11943:31;;;:::i;:::-;:35;:::i;11862:198::-;12016:33;;:29;;958:4;12016:29;242:2275:34;11738:83:38;11768:25;868:4;11768:25;;;:52;;11738:83;11768:52;11797:23;958:4;11797:23;;11738:83;;10045:1263;10171:64;;-1:-1:-1;10171:64:38;;682:4;10249:26;;682:4;;;10291:11;;10301:1;10045:1263;:::o;10245:1032::-;776:4;10323:25;;776:4;;;10374:26;;:30;:26;;:::i;10319:958::-;868:4;10425:24;;868:4;;;10465:385;;;;;;;;;;;;;;;;242:2275:34;:::o;10421:856:38:-;958:4;10870:23;;958:4;;;10919:24;;:28;:24;;:::i;10866:411::-;10978:289;;;;;;;;;;;;;;;;242:2275:34;:::o;1035:2:38:-;;;;;;;;;:::o;12279:770::-;;;12360:8;;12356:21;;12441:16;1035:2;12441:16;;;;;12642:7;12638:405;;12279:770;;;:::o;12638:405::-;12764:24;12772:15;12764:28;12772:15;;:::i;:::-;12764:24;:::i;:::-;:28;:::i;:::-;12806:227;;;;;;;;;;;;12279:770::o;12459:16::-;12491:65;;;;;;1035:2;242:2275:34;;;;;;;12600:17:38;1035:2;242:2275:34;;;;;;;12459:16:38;-1:-1:-1;;242:2275:34;;;;;;12434:194:38;242:2275:34;;:::i;6262:337:38:-;6372:19;242:2275:34;;6372:19:38;:::i;:::-;242:2275:34;;;6405:18:38;6401:37;;6542:11;6470:57;6560:8;6542:11;;242:2275:34;;;6470:57:38;;;;6560:8;;:::i;6401:37::-;6425:13;;:::o;22754:430:35:-;-1:-1:-1;22839:19:35;;22899:8;;;22994:17;;;;:::i;:::-;23021:11;23042:116;23067:5;;;23167:10;;22754:430;:::o;23074:3::-;23097:5;;;:::i;:::-;23093:31;242:2275:34;;;;;-1:-1:-1;23093:31:35;;;;:::i;:::-;;242:2275:34;;23074:3:35;242:2275:34;;;;-1:-1:-1;;242:2275:34;23047:18:35;;;;22892:73;22923:8;;;;:::i;:::-;242:2275:34;22953:1:35;242:2275:34;22892:73:35;;;2419:778:131;242:2275:34;;;2419:778:131;2609:2;2589:22;;2609:2;;3041:25;2825:196;;;;;;;;;;;;;;;-1:-1:-1;2825:196:131;3041:25;;:::i;:::-;3034:32;;;;;:::o;2585:606::-;3097:83;;3113:1;3097:83;3117:35;3097:83;;:::o;10983:270:37:-;242:2275:34;;11094:2:37;11082:14;;11094:2;;;5445:11:38;11094:2:37;5445:11:38;;242:2275:34;;;5522:62:38;;11112:32:37;:::o;11078:169::-;5445:11:38;11094:2:37;5445:11:38;242:2275:34;5522:62:38;242:2275:34;;11094:2:37;11192:43;;242:2275:34;;;11094:2:37;11192:43;;;242:2275:34;11192:43:37;;:::i;7932:335::-;8047:1;242:2275:34;;8035:13:37;8031:56;;8130:11;;242:2275:34;8151:60:37;242:2275:34;8151:60:37;8232:4;8227:9;;7932:335::o;5788:270:38:-;5909:21;5788:270;5909:21;:::i;:::-;5964:65;;5788:270;:::o;9355:729:37:-;;242:2275:34;;9485:13:37;242:2275:34;;9551:3:37;9531:17;:12;9537:5;;;;:::i;9531:17::-;:23;9596:16;;;9628:10;10051:25;9637:1;242:2275:34;9592:434:37;10051:25;:::i;9592:434::-;9702:1;9687:16;;9702:1;;9719:10;10051:25;9702:1;242:2275:34;9683:343:37;10051:25;:::i;9683:343::-;9793:1;9778:16;;9793:1;;9810:10;10051:25;9793:1;9702;9774:252;10051:25;:::i;9774:252::-;9883:1;9868:16;9883:1;;10051:25;9702:1;9924:13;9864:162;10051:25;:::i;10366:320::-;;;242:2275:34;10561:3:37;242:2275:34;;;;;;;;;;10518:24:37;;:41;;;10561:3;10518:41;;;10584:16;242:2275:34;;10584:16:37;;:::i;:::-;242:2275:34;;;10604:5:37;;;;:::i;:::-;242:2275:34;;10584:25:37;;10580:72;;10561:3;;;:::i;:::-;10511:151;;10580:72;10629:8;;;;;:::o;10518:41::-;;;;;;10366:320;:::o;10518:41::-;242:2275:34;;;10546:13:37;;10518:41;;7129:1551:131;;;8209:66;8196:79;;8192:164;;242:2275:34;;;;;;-1:-1:-1;242:2275:34;;;;;;;;;;;;;;;;;;;8467:24:131;;;;;;;;;-1:-1:-1;8467:24:131;242:2275:34;;;8505:20:131;8501:113;;8624:49;-1:-1:-1;8624:49:131;-1:-1:-1;7129:1551:131;:::o;8501:113::-;8541:62;-1:-1:-1;8541:62:131;8467:24;8541:62;-1:-1:-1;8541:62:131;:::o;8467:24::-;242:2275:34;;;;;;;;;8192:164:131;8291:54;;;8307:1;8291:54;8311:30;8291:54;;:::o","linkReferences":{}},"methodIdentifiers":{"DEFAULT_ADMIN_ROLE()":"a217fddf","PROOF_SUBMITTER_ROLE()":"5972185a","getClientState()":"ef913a4b","getConsensusState(uint64)":"edce8bdc","getRoleAdmin(bytes32)":"248a9ca3","grantRole(bytes32,address)":"2f2ff15d","hasRole(bytes32,address)":"91d14854","misbehaviour(bytes)":"ddba6537","renounceRole(bytes32,address)":"36568abe","revokeRole(bytes32,address)":"d547741f","supportsInterface(bytes4)":"01ffc9a7","updateClient(bytes)":"0bece356","verifyMembership((bytes,(uint64,uint64),bytes[],bytes))":"682ed5f0","verifyNonMembership((bytes,(uint64,uint64),bytes[]))":"4d6d9ffb"},"rawMetadata":"{\"compiler\":{\"version\":\"0.8.28+commit.7893614a\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"ibcRouter\",\"type\":\"address\"},{\"internalType\":\"uint64\",\"name\":\"initialTrustedHeight\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"initialTrustedTimestamp\",\"type\":\"uint64\"},{\"internalType\":\"bytes32\",\"name\":\"initialTrustedStorageRoot\",\"type\":\"bytes32\"},{\"internalType\":\"address[]\",\"name\":\"initialTrustedValidators\",\"type\":\"address[]\"},{\"internalType\":\"uint64\",\"name\":\"trustingPeriod\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"maxClockDrift\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"roleManager\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"AccessControlBadConfirmation\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"internalType\":\"bytes32\",\"name\":\"neededRole\",\"type\":\"bytes32\"}],\"name\":\"AccessControlUnauthorizedAccount\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"revisionHeight\",\"type\":\"uint64\"}],\"name\":\"ConflictingConsensusState\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"trustedTimestamp\",\"type\":\"uint64\"},{\"internalType\":\"uint256\",\"name\":\"currentTimestamp\",\"type\":\"uint256\"},{\"internalType\":\"uint64\",\"name\":\"trustingPeriod\",\"type\":\"uint64\"}],\"name\":\"ConsensusStateExpired\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"revisionHeight\",\"type\":\"uint64\"}],\"name\":\"ConsensusStateNotFound\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"signer\",\"type\":\"address\"}],\"name\":\"DuplicateCommitSealSigner\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"validator\",\"type\":\"address\"}],\"name\":\"DuplicateValidator\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"EmptyValidatorSet\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"currentTimestamp\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"headerTimestamp\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxClockDrift\",\"type\":\"uint256\"}],\"name\":\"HeaderFromFuture\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"actual\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"required\",\"type\":\"uint256\"}],\"name\":\"InsufficientTrustedValidatorOverlap\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"actual\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"required\",\"type\":\"uint256\"}],\"name\":\"InsufficientValidatorQuorum\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidCommitSeal\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"expectedValue\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"actualValue\",\"type\":\"bytes32\"}],\"name\":\"InvalidCommitmentValue\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"actualDifficulty\",\"type\":\"uint256\"}],\"name\":\"InvalidDifficulty\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"length\",\"type\":\"uint256\"}],\"name\":\"InvalidECDSASignatureLength\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"itemsLength\",\"type\":\"uint256\"}],\"name\":\"InvalidExtraDataFormat\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"itemsLength\",\"type\":\"uint256\"}],\"name\":\"InvalidHeaderFormat\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidHeaderHeight\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidHeaderTimestamp\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"actualMixHash\",\"type\":\"bytes32\"}],\"name\":\"InvalidMixHash\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"actualNonce\",\"type\":\"bytes\"}],\"name\":\"InvalidNonce\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"actualOmmersHash\",\"type\":\"bytes32\"}],\"name\":\"InvalidOmmersHash\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"expectedLength\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"actualLength\",\"type\":\"uint256\"}],\"name\":\"InvalidPathLength\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"providedRevisionNumber\",\"type\":\"uint64\"}],\"name\":\"InvalidRevisionNumber\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"validator\",\"type\":\"address\"}],\"name\":\"InvalidValidatorAddress\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"length\",\"type\":\"uint256\"}],\"name\":\"InvalidValidatorAddressLength\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"expectedLength\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"actualLength\",\"type\":\"uint256\"}],\"name\":\"InvalidValueLength\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"UnsupportedMisbehaviour\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"actualValue\",\"type\":\"bytes32\"}],\"name\":\"ValueExists\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"previousAdminRole\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"newAdminRole\",\"type\":\"bytes32\"}],\"name\":\"RoleAdminChanged\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"RoleGranted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"RoleRevoked\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"DEFAULT_ADMIN_ROLE\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"PROOF_SUBMITTER_ROLE\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getClientState\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"revisionHeight\",\"type\":\"uint64\"}],\"name\":\"getConsensusState\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"}],\"name\":\"getRoleAdmin\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"grantRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"hasRole\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"name\":\"misbehaviour\",\"outputs\":[],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"callerConfirmation\",\"type\":\"address\"}],\"name\":\"renounceRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"revokeRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes4\",\"name\":\"interfaceId\",\"type\":\"bytes4\"}],\"name\":\"supportsInterface\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"updateMsg\",\"type\":\"bytes\"}],\"name\":\"updateClient\",\"outputs\":[{\"internalType\":\"enum ILightClientMsgs.UpdateResult\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes\",\"name\":\"proof\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"uint64\",\"name\":\"revisionNumber\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"revisionHeight\",\"type\":\"uint64\"}],\"internalType\":\"struct IICS02ClientMsgs.Height\",\"name\":\"proofHeight\",\"type\":\"tuple\"},{\"internalType\":\"bytes[]\",\"name\":\"path\",\"type\":\"bytes[]\"},{\"internalType\":\"bytes\",\"name\":\"value\",\"type\":\"bytes\"}],\"internalType\":\"struct ILightClientMsgs.MsgVerifyMembership\",\"name\":\"msg_\",\"type\":\"tuple\"}],\"name\":\"verifyMembership\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes\",\"name\":\"proof\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"uint64\",\"name\":\"revisionNumber\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"revisionHeight\",\"type\":\"uint64\"}],\"internalType\":\"struct IICS02ClientMsgs.Height\",\"name\":\"proofHeight\",\"type\":\"tuple\"},{\"internalType\":\"bytes[]\",\"name\":\"path\",\"type\":\"bytes[]\"}],\"internalType\":\"struct ILightClientMsgs.MsgVerifyNonMembership\",\"name\":\"msg_\",\"type\":\"tuple\"}],\"name\":\"verifyNonMembership\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"errors\":{\"AccessControlBadConfirmation()\":[{\"details\":\"The caller of a function is not the expected one. NOTE: Don't confuse with {AccessControlUnauthorizedAccount}.\"}],\"AccessControlUnauthorizedAccount(address,bytes32)\":[{\"details\":\"The `account` is missing a role.\"}],\"ConflictingConsensusState(uint64)\":[{\"params\":{\"revisionHeight\":\"The conflicting revision height.\"}}],\"ConsensusStateExpired(uint64,uint256,uint64)\":[{\"params\":{\"currentTimestamp\":\"The current block timestamp.\",\"trustedTimestamp\":\"Timestamp of the trusted consensus state.\",\"trustingPeriod\":\"The configured trusting period.\"}}],\"ConsensusStateNotFound(uint64)\":[{\"params\":{\"revisionHeight\":\"The requested revision height.\"}}],\"DuplicateCommitSealSigner(address)\":[{\"params\":{\"signer\":\"The duplicate signer address.\"}}],\"DuplicateValidator(address)\":[{\"params\":{\"validator\":\"The duplicate validator address.\"}}],\"HeaderFromFuture(uint256,uint256,uint256)\":[{\"params\":{\"currentTimestamp\":\"The current block timestamp.\",\"headerTimestamp\":\"The submitted header timestamp.\",\"maxClockDrift\":\"The configured maximum clock drift.\"}}],\"InsufficientTrustedValidatorOverlap(uint256,uint256)\":[{\"params\":{\"actual\":\"The number of trusted validators that signed.\",\"required\":\"The minimum required trusted signer count.\"}}],\"InsufficientValidatorQuorum(uint256,uint256)\":[{\"params\":{\"actual\":\"The number of new validators that signed.\",\"required\":\"The minimum required signer count.\"}}],\"InvalidCommitmentValue(bytes32,bytes32)\":[{\"params\":{\"actualValue\":\"The proven commitment value.\",\"expectedValue\":\"The expected commitment value.\"}}],\"InvalidDifficulty(uint256)\":[{\"params\":{\"actualDifficulty\":\"The difficulty found in the header.\"}}],\"InvalidECDSASignatureLength(uint256)\":[{\"params\":{\"length\":\"The invalid signature length.\"}}],\"InvalidExtraDataFormat(uint256)\":[{\"params\":{\"itemsLength\":\"The decoded `extraData` item count.\"}}],\"InvalidHeaderFormat(uint256)\":[{\"params\":{\"itemsLength\":\"The decoded header item count.\"}}],\"InvalidMixHash(bytes32)\":[{\"params\":{\"actualMixHash\":\"The mix hash found in the header.\"}}],\"InvalidNonce(bytes)\":[{\"params\":{\"actualNonce\":\"The nonce found in the header.\"}}],\"InvalidOmmersHash(bytes32)\":[{\"params\":{\"actualOmmersHash\":\"The ommers hash found in the header.\"}}],\"InvalidPathLength(uint256,uint256)\":[{\"params\":{\"actualLength\":\"The actual path length.\",\"expectedLength\":\"The expected path length.\"}}],\"InvalidRevisionNumber(uint64)\":[{\"params\":{\"providedRevisionNumber\":\"The non-zero revision number.\"}}],\"InvalidValidatorAddress(address)\":[{\"params\":{\"validator\":\"The invalid validator address.\"}}],\"InvalidValidatorAddressLength(uint256)\":[{\"params\":{\"length\":\"The decoded validator address length.\"}}],\"InvalidValueLength(uint256,uint256)\":[{\"params\":{\"actualLength\":\"The actual value length.\",\"expectedLength\":\"The expected value length.\"}}],\"ValueExists(bytes32)\":[{\"params\":{\"actualValue\":\"The value found at the proven storage slot.\"}}]},\"events\":{\"RoleAdminChanged(bytes32,bytes32,bytes32)\":{\"details\":\"Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite {RoleAdminChanged} not being emitted to signal this.\"},\"RoleGranted(bytes32,address,address)\":{\"details\":\"Emitted when `account` is granted `role`. `sender` is the account that originated the contract call. This account bears the admin role (for the granted role). Expected in cases where the role was granted using the internal {AccessControl-_grantRole}.\"},\"RoleRevoked(bytes32,address,address)\":{\"details\":\"Emitted when `account` is revoked `role`. `sender` is the account that originated the contract call: - if using `revokeRole`, it is the admin role bearer - if using `renounceRole`, it is the role bearer (i.e. `account`)\"}},\"kind\":\"dev\",\"methods\":{\"constructor\":{\"params\":{\"ibcRouter\":\"Counterparty ICS26 router address whose storage is proven.\",\"initialTrustedHeight\":\"Initial trusted Besu height.\",\"initialTrustedStorageRoot\":\"Initial trusted storage root of `ibcRouter`.\",\"initialTrustedTimestamp\":\"Initial trusted header timestamp in seconds.\",\"initialTrustedValidators\":\"Initial trusted validator set.\",\"maxClockDrift\":\"Maximum allowed future drift in seconds for submitted headers.\",\"roleManager\":\"Address that administers proof submission; if zero, proof submission is open.\",\"trustingPeriod\":\"Maximum age in seconds for trusted consensus states.\"}},\"getClientState()\":{\"returns\":{\"_0\":\"The client state.\"}},\"getConsensusState(uint64)\":{\"params\":{\"revisionHeight\":\"The revision height to query.\"},\"returns\":{\"_0\":\"The ABI-encoded consensus state.\"}},\"getRoleAdmin(bytes32)\":{\"details\":\"Returns the admin role that controls `role`. See {grantRole} and {revokeRole}. To change a role's admin, use {_setRoleAdmin}.\"},\"grantRole(bytes32,address)\":{\"details\":\"Grants `role` to `account`. If `account` had not been already granted `role`, emits a {RoleGranted} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleGranted} event.\"},\"hasRole(bytes32,address)\":{\"details\":\"Returns `true` if `account` has been granted `role`.\"},\"misbehaviour(bytes)\":{\"params\":{\"misbehaviourMsg\":\"The misbehaviour message\"}},\"renounceRole(bytes32,address)\":{\"details\":\"Revokes `role` from the calling account. Roles are often managed via {grantRole} and {revokeRole}: this function's purpose is to provide a mechanism for accounts to lose their privileges if they are compromised (such as when a trusted device is misplaced). If the calling account had been revoked `role`, emits a {RoleRevoked} event. Requirements: - the caller must be `callerConfirmation`. May emit a {RoleRevoked} event.\"},\"revokeRole(bytes32,address)\":{\"details\":\"Revokes `role` from `account`. If `account` had been granted `role`, emits a {RoleRevoked} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleRevoked} event.\"},\"supportsInterface(bytes4)\":{\"details\":\"Returns true if this contract implements the interface defined by `interfaceId`. See the corresponding https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[ERC section] to learn more about how these ids are created. This function call must use less than 30 000 gas.\"},\"updateClient(bytes)\":{\"params\":{\"updateMsg\":\"The encoded update message e.g., an SP1 proof.\"},\"returns\":{\"_0\":\"The result of the update operation\"}},\"verifyMembership((bytes,(uint64,uint64),bytes[],bytes))\":{\"details\":\"Notice that this message is not view, as it may update the client state for caching purposes.\",\"params\":{\"msg_\":\"The membership message\"},\"returns\":{\"_0\":\"The unix timestamp of the verification height in the counterparty chain in seconds.\"}},\"verifyNonMembership((bytes,(uint64,uint64),bytes[]))\":{\"details\":\"Notice that this message is not view, as it may update the client state for caching purposes.\",\"params\":{\"msg_\":\"The membership message\"},\"returns\":{\"_0\":\"The unix timestamp of the verification height in the counterparty chain in seconds.\"}}},\"title\":\"Besu IBFT2 Light Client\",\"version\":1},\"userdoc\":{\"errors\":{\"ConflictingConsensusState(uint64)\":[{\"notice\":\"A different consensus state already exists at the submitted height.\"}],\"ConsensusStateExpired(uint64,uint256,uint64)\":[{\"notice\":\"The trusted consensus state is outside the trusting period.\"}],\"ConsensusStateNotFound(uint64)\":[{\"notice\":\"No consensus state exists for the requested height.\"}],\"DuplicateCommitSealSigner(address)\":[{\"notice\":\"A commit seal signer appears more than once.\"}],\"DuplicateValidator(address)\":[{\"notice\":\"A validator appears more than once.\"}],\"EmptyValidatorSet()\":[{\"notice\":\"The validator set is empty.\"}],\"HeaderFromFuture(uint256,uint256,uint256)\":[{\"notice\":\"The submitted header timestamp is too far in the future.\"}],\"InsufficientTrustedValidatorOverlap(uint256,uint256)\":[{\"notice\":\"The submitted signers do not overlap enough with the trusted validator set.\"}],\"InsufficientValidatorQuorum(uint256,uint256)\":[{\"notice\":\"The submitted signers do not meet quorum for the new validator set.\"}],\"InvalidCommitSeal()\":[{\"notice\":\"A commit seal did not recover a valid signer.\"}],\"InvalidCommitmentValue(bytes32,bytes32)\":[{\"notice\":\"A proven commitment value does not match the expected value.\"}],\"InvalidDifficulty(uint256)\":[{\"notice\":\"The Besu BFT difficulty is invalid.\"}],\"InvalidECDSASignatureLength(uint256)\":[{\"notice\":\"An ECDSA signature has an invalid length.\"}],\"InvalidExtraDataFormat(uint256)\":[{\"notice\":\"The submitted `extraData` field has an invalid RLP item count.\"}],\"InvalidHeaderFormat(uint256)\":[{\"notice\":\"The submitted header has an invalid RLP item count.\"}],\"InvalidHeaderHeight()\":[{\"notice\":\"The submitted header height is zero.\"}],\"InvalidHeaderTimestamp()\":[{\"notice\":\"The submitted header timestamp is zero.\"}],\"InvalidMixHash(bytes32)\":[{\"notice\":\"The Besu BFT mix hash is invalid.\"}],\"InvalidNonce(bytes)\":[{\"notice\":\"The Besu BFT nonce is invalid.\"}],\"InvalidOmmersHash(bytes32)\":[{\"notice\":\"The ommers hash is invalid.\"}],\"InvalidPathLength(uint256,uint256)\":[{\"notice\":\"A proof path has an invalid length.\"}],\"InvalidRevisionNumber(uint64)\":[{\"notice\":\"The revision number must be zero for Besu light client heights.\"}],\"InvalidValidatorAddress(address)\":[{\"notice\":\"A validator address is invalid.\"}],\"InvalidValidatorAddressLength(uint256)\":[{\"notice\":\"A validator address has an invalid byte length.\"}],\"InvalidValueLength(uint256,uint256)\":[{\"notice\":\"A membership value has an invalid length.\"}],\"UnsupportedMisbehaviour()\":[{\"notice\":\"Misbehaviour handling is not supported by this client.\"}],\"ValueExists(bytes32)\":[{\"notice\":\"A non-membership proof found an existing value.\"}]},\"kind\":\"user\",\"methods\":{\"PROOF_SUBMITTER_ROLE()\":{\"notice\":\"Role allowed to submit client updates and proof verifications.\"},\"constructor\":{\"notice\":\"Creates a Besu IBFT2 light client from an initial trusted consensus state.\"},\"getClientState()\":{\"notice\":\"Returns the client state.\"},\"getConsensusState(uint64)\":{\"notice\":\"Returns the encoded consensus state for a revision height.\"},\"misbehaviour(bytes)\":{\"notice\":\"Misbehaviour handling, moves the light client to the frozen state if misbehaviour is detected\"},\"updateClient(bytes)\":{\"notice\":\"Updating the client and consensus state\"},\"verifyMembership((bytes,(uint64,uint64),bytes[],bytes))\":{\"notice\":\"Querying the membership of a key-value pair\"},\"verifyNonMembership((bytes,(uint64,uint64),bytes[]))\":{\"notice\":\"Querying the non-membership of a key\"}},\"notice\":\"Verifies Besu IBFT 2.0 headers and ICS26 router storage proofs.\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/light-clients/besu/BesuIBFT2LightClient.sol\":\"BesuIBFT2LightClient\"},\"evmVersion\":\"cancun\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"none\"},\"optimizer\":{\"enabled\":true,\"runs\":10000},\"remappings\":[\":@openzeppelin-contracts/=node_modules/@openzeppelin/contracts/\",\":@openzeppelin-upgradeable/=node_modules/@openzeppelin/contracts-upgradeable/\",\":@openzeppelin/=node_modules/@openzeppelin/\",\":@sp1-contracts/=node_modules/sp1-contracts/contracts/src/\",\":@uniswap/permit2/=node_modules/@uniswap/permit2/\",\":forge-std/=node_modules/forge-std/src/\",\":sp1-contracts/=node_modules/sp1-contracts/\"],\"viaIR\":true},\"sources\":{\"contracts/interfaces/ILightClient.sol\":{\"keccak256\":\"0x3b2361546ee834a442d844c979fbad3458ee13146b093f585587a09e19a266af\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://5b5d53101bb598f14a79cb1092479736fa18e8f84945ea6ef80f4dac84466042\",\"dweb:/ipfs/QmaTCo6M3Z9aYCSX65AQtixo1sB4ymQUDAgTXSKHqJHGDh\"]},\"contracts/light-clients/besu/BesuIBFT2LightClient.sol\":{\"keccak256\":\"0xc8536dfc90aa5a55d128e40d6d9715a9fbd55cef5353001da2e773cc9810160e\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://8790efb3e5909701669411298cdc72cc4e8ccdb8fcb6797e1d50e218e76a625d\",\"dweb:/ipfs/QmNiFBhRfaHHG3Tj3R8Y1nvojGs3sVCdL5ANBSgKfVj9Fz\"]},\"contracts/light-clients/besu/BesuLightClientBase.sol\":{\"keccak256\":\"0x0e2957f1e184e52c1f007f7bbbe5279fe46aa54e02b7fea9ad96c06639fc704d\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://cfa0d54ac2be000860a378a9119f70d72615e7627c80862033684e2f90d32e15\",\"dweb:/ipfs/QmefzqCmWMghrgTQRoGkM7DSRZ3E8dUDFBCrHUhphPJCwB\"]},\"contracts/light-clients/besu/MPTProof.sol\":{\"keccak256\":\"0x9ab26e6445b20541e8725b190006444d3b16eb3e021174e280451f934d9535c6\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://b6f3fd58b06b942a454bb9b21e9be40a2dab8a09f78e75ff4357c8afbc7e2d5b\",\"dweb:/ipfs/QmPeUwNScDiU91Xx4UQduYjyCPALYLPq73ZUMEn8Nr1rTG\"]},\"contracts/light-clients/besu/RLPReader.sol\":{\"keccak256\":\"0xa64ad17e6da7fed2bd206df52189286694339a8061dc5d158e717eda982af1d9\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://7020db2fe854e90e1b791e0e587610fc26bed3073ba1811faa275a1d8bf3c2c7\",\"dweb:/ipfs/QmdXdKghNFZSX7N9qD6BsKuJQdrFoqatsVWvHRL7vJCmeP\"]},\"contracts/light-clients/besu/errors/IBesuLightClientErrors.sol\":{\"keccak256\":\"0x66eff5c2f400de52896b24768de7a157eae68ca951aca2b0c271b8e03015986b\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://3a13f7651324fab436f31dcaa25cea7d4c0cd432ddecd6e17b6876b1c80c6408\",\"dweb:/ipfs/QmQHcMexxFzKcgfbE5rcFKq31PYBprppUEsy76dU8MRPvN\"]},\"contracts/light-clients/besu/msgs/IBesuLightClientMsgs.sol\":{\"keccak256\":\"0x3fc43a3daaae2f89dca4cadbc99ea71086282f987b47a95c13489ae3384532cf\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://36083aa6833eb30d26023f7dc0b2e22b7d0723d922fcd50cf86999edc9aeb474\",\"dweb:/ipfs/QmbPv9KJj5AuJkgppuyuoaTHtiw91Qkx1tdkf1R5D4wad2\"]},\"contracts/msgs/IICS02ClientMsgs.sol\":{\"keccak256\":\"0x03d1265eae327c3744d774bf22a30d845233d50664921c9aa57cef2d71fd89d2\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://89900781cc5c60540a237d92d42745ea6165765ee8fb4d50e8137a717195cc75\",\"dweb:/ipfs/Qmbx5p8gZ8sEMMeZytXsLee49JUayhAaoJ2yxX93WUrvQo\"]},\"contracts/msgs/ILightClientMsgs.sol\":{\"keccak256\":\"0x8d1e56ab166a7b4aa6999708e3214a4645ebbc3835c2b2a4c255c9923eebafde\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://8bd4200dc04d950c0f050623fa9a8accdbec877fd446c039d4dd6c678bdf1513\",\"dweb:/ipfs/QmZQTViaA7N6BVNDzJ1Z6w799PrPoE4ajPueZSPwX4sGZ9\"]},\"node_modules/@openzeppelin/contracts/access/AccessControl.sol\":{\"keccak256\":\"0x4686ec784d75f95beaf2bf5b5f26e5f946d4c864aaee9c3c62bdc18381f5e017\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://26710ca191913f3c9df542079c4a6dcff02968e92d4f7357daefef9fbe72a19c\",\"dweb:/ipfs/QmanHbeWuBbVEqXySHa1zhm2rExjYpChDBubBaJNTCa2JB\"]},\"node_modules/@openzeppelin/contracts/access/IAccessControl.sol\":{\"keccak256\":\"0xbff9f59c84e5337689161ce7641c0ef8e872d6a7536fbc1f5133f128887aba3c\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://b308f882e796f7b79c9502deacb0a62983035c6f6f4e962b319ba6a1f4a77d3d\",\"dweb:/ipfs/QmaWCW7ahEQqFjwhSUhV7Ae7WhfNvzSpE7DQ58hvEooqPL\"]},\"node_modules/@openzeppelin/contracts/utils/Context.sol\":{\"keccak256\":\"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://6a708e8a5bdb1011c2c381c9a5cfd8a9a956d7d0a9dc1bd8bcdaf52f76ef2f12\",\"dweb:/ipfs/Qmax9WHBnVsZP46ZxEMNRQpLQnrdE4dK8LehML1Py8FowF\"]},\"node_modules/@openzeppelin/contracts/utils/cryptography/ECDSA.sol\":{\"keccak256\":\"0xbeb5cad8aaabe0d35d2ec1a8414d91e81e5a8ca679add4cf57e2f33476861f40\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://ebb272a5ee2da4e8bd5551334e0ce8dce4e9c56a04570d6bf046d260fab3116a\",\"dweb:/ipfs/QmNw6RyM769qcqFocDq6HJMG2WiEnQbvizpRaUXsACHho2\"]},\"node_modules/@openzeppelin/contracts/utils/introspection/ERC165.sol\":{\"keccak256\":\"0x2d9dc2fe26180f74c11c13663647d38e259e45f95eb88f57b61d2160b0109d3e\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://81233d1f98060113d9922180bb0f14f8335856fe9f339134b09335e9f678c377\",\"dweb:/ipfs/QmWh6R35SarhAn4z2wH8SU456jJSYL2FgucfTFgbHJJN4E\"]},\"node_modules/@openzeppelin/contracts/utils/introspection/IERC165.sol\":{\"keccak256\":\"0x8891738ffe910f0cf2da09566928589bf5d63f4524dd734fd9cedbac3274dd5c\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://971f954442df5c2ef5b5ebf1eb245d7105d9fbacc7386ee5c796df1d45b21617\",\"dweb:/ipfs/QmadRjHbkicwqwwh61raUEapaVEtaLMcYbQZWs9gUkgj3u\"]}},\"version\":1}","metadata":{"compiler":{"version":"0.8.28+commit.7893614a"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"address","name":"ibcRouter","type":"address"},{"internalType":"uint64","name":"initialTrustedHeight","type":"uint64"},{"internalType":"uint64","name":"initialTrustedTimestamp","type":"uint64"},{"internalType":"bytes32","name":"initialTrustedStorageRoot","type":"bytes32"},{"internalType":"address[]","name":"initialTrustedValidators","type":"address[]"},{"internalType":"uint64","name":"trustingPeriod","type":"uint64"},{"internalType":"uint64","name":"maxClockDrift","type":"uint64"},{"internalType":"address","name":"roleManager","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"type":"error","name":"AccessControlBadConfirmation"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bytes32","name":"neededRole","type":"bytes32"}],"type":"error","name":"AccessControlUnauthorizedAccount"},{"inputs":[{"internalType":"uint64","name":"revisionHeight","type":"uint64"}],"type":"error","name":"ConflictingConsensusState"},{"inputs":[{"internalType":"uint64","name":"trustedTimestamp","type":"uint64"},{"internalType":"uint256","name":"currentTimestamp","type":"uint256"},{"internalType":"uint64","name":"trustingPeriod","type":"uint64"}],"type":"error","name":"ConsensusStateExpired"},{"inputs":[{"internalType":"uint64","name":"revisionHeight","type":"uint64"}],"type":"error","name":"ConsensusStateNotFound"},{"inputs":[{"internalType":"address","name":"signer","type":"address"}],"type":"error","name":"DuplicateCommitSealSigner"},{"inputs":[{"internalType":"address","name":"validator","type":"address"}],"type":"error","name":"DuplicateValidator"},{"inputs":[],"type":"error","name":"EmptyValidatorSet"},{"inputs":[{"internalType":"uint256","name":"currentTimestamp","type":"uint256"},{"internalType":"uint256","name":"headerTimestamp","type":"uint256"},{"internalType":"uint256","name":"maxClockDrift","type":"uint256"}],"type":"error","name":"HeaderFromFuture"},{"inputs":[{"internalType":"uint256","name":"actual","type":"uint256"},{"internalType":"uint256","name":"required","type":"uint256"}],"type":"error","name":"InsufficientTrustedValidatorOverlap"},{"inputs":[{"internalType":"uint256","name":"actual","type":"uint256"},{"internalType":"uint256","name":"required","type":"uint256"}],"type":"error","name":"InsufficientValidatorQuorum"},{"inputs":[],"type":"error","name":"InvalidCommitSeal"},{"inputs":[{"internalType":"bytes32","name":"expectedValue","type":"bytes32"},{"internalType":"bytes32","name":"actualValue","type":"bytes32"}],"type":"error","name":"InvalidCommitmentValue"},{"inputs":[{"internalType":"uint256","name":"actualDifficulty","type":"uint256"}],"type":"error","name":"InvalidDifficulty"},{"inputs":[{"internalType":"uint256","name":"length","type":"uint256"}],"type":"error","name":"InvalidECDSASignatureLength"},{"inputs":[{"internalType":"uint256","name":"itemsLength","type":"uint256"}],"type":"error","name":"InvalidExtraDataFormat"},{"inputs":[{"internalType":"uint256","name":"itemsLength","type":"uint256"}],"type":"error","name":"InvalidHeaderFormat"},{"inputs":[],"type":"error","name":"InvalidHeaderHeight"},{"inputs":[],"type":"error","name":"InvalidHeaderTimestamp"},{"inputs":[{"internalType":"bytes32","name":"actualMixHash","type":"bytes32"}],"type":"error","name":"InvalidMixHash"},{"inputs":[{"internalType":"bytes","name":"actualNonce","type":"bytes"}],"type":"error","name":"InvalidNonce"},{"inputs":[{"internalType":"bytes32","name":"actualOmmersHash","type":"bytes32"}],"type":"error","name":"InvalidOmmersHash"},{"inputs":[{"internalType":"uint256","name":"expectedLength","type":"uint256"},{"internalType":"uint256","name":"actualLength","type":"uint256"}],"type":"error","name":"InvalidPathLength"},{"inputs":[{"internalType":"uint64","name":"providedRevisionNumber","type":"uint64"}],"type":"error","name":"InvalidRevisionNumber"},{"inputs":[{"internalType":"address","name":"validator","type":"address"}],"type":"error","name":"InvalidValidatorAddress"},{"inputs":[{"internalType":"uint256","name":"length","type":"uint256"}],"type":"error","name":"InvalidValidatorAddressLength"},{"inputs":[{"internalType":"uint256","name":"expectedLength","type":"uint256"},{"internalType":"uint256","name":"actualLength","type":"uint256"}],"type":"error","name":"InvalidValueLength"},{"inputs":[],"type":"error","name":"UnsupportedMisbehaviour"},{"inputs":[{"internalType":"bytes32","name":"actualValue","type":"bytes32"}],"type":"error","name":"ValueExists"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32","indexed":true},{"internalType":"bytes32","name":"previousAdminRole","type":"bytes32","indexed":true},{"internalType":"bytes32","name":"newAdminRole","type":"bytes32","indexed":true}],"type":"event","name":"RoleAdminChanged","anonymous":false},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32","indexed":true},{"internalType":"address","name":"account","type":"address","indexed":true},{"internalType":"address","name":"sender","type":"address","indexed":true}],"type":"event","name":"RoleGranted","anonymous":false},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32","indexed":true},{"internalType":"address","name":"account","type":"address","indexed":true},{"internalType":"address","name":"sender","type":"address","indexed":true}],"type":"event","name":"RoleRevoked","anonymous":false},{"inputs":[],"stateMutability":"view","type":"function","name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"PROOF_SUBMITTER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"getClientState","outputs":[{"internalType":"bytes","name":"","type":"bytes"}]},{"inputs":[{"internalType":"uint64","name":"revisionHeight","type":"uint64"}],"stateMutability":"view","type":"function","name":"getConsensusState","outputs":[{"internalType":"bytes","name":"","type":"bytes"}]},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"stateMutability":"view","type":"function","name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}]},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"stateMutability":"nonpayable","type":"function","name":"grantRole"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"stateMutability":"view","type":"function","name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}]},{"inputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function","name":"misbehaviour"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"callerConfirmation","type":"address"}],"stateMutability":"nonpayable","type":"function","name":"renounceRole"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"stateMutability":"nonpayable","type":"function","name":"revokeRole"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"stateMutability":"view","type":"function","name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}]},{"inputs":[{"internalType":"bytes","name":"updateMsg","type":"bytes"}],"stateMutability":"nonpayable","type":"function","name":"updateClient","outputs":[{"internalType":"enum ILightClientMsgs.UpdateResult","name":"","type":"uint8"}]},{"inputs":[{"internalType":"struct ILightClientMsgs.MsgVerifyMembership","name":"msg_","type":"tuple","components":[{"internalType":"bytes","name":"proof","type":"bytes"},{"internalType":"struct IICS02ClientMsgs.Height","name":"proofHeight","type":"tuple","components":[{"internalType":"uint64","name":"revisionNumber","type":"uint64"},{"internalType":"uint64","name":"revisionHeight","type":"uint64"}]},{"internalType":"bytes[]","name":"path","type":"bytes[]"},{"internalType":"bytes","name":"value","type":"bytes"}]}],"stateMutability":"view","type":"function","name":"verifyMembership","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[{"internalType":"struct ILightClientMsgs.MsgVerifyNonMembership","name":"msg_","type":"tuple","components":[{"internalType":"bytes","name":"proof","type":"bytes"},{"internalType":"struct IICS02ClientMsgs.Height","name":"proofHeight","type":"tuple","components":[{"internalType":"uint64","name":"revisionNumber","type":"uint64"},{"internalType":"uint64","name":"revisionHeight","type":"uint64"}]},{"internalType":"bytes[]","name":"path","type":"bytes[]"}]}],"stateMutability":"view","type":"function","name":"verifyNonMembership","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]}],"devdoc":{"kind":"dev","methods":{"constructor":{"params":{"ibcRouter":"Counterparty ICS26 router address whose storage is proven.","initialTrustedHeight":"Initial trusted Besu height.","initialTrustedStorageRoot":"Initial trusted storage root of `ibcRouter`.","initialTrustedTimestamp":"Initial trusted header timestamp in seconds.","initialTrustedValidators":"Initial trusted validator set.","maxClockDrift":"Maximum allowed future drift in seconds for submitted headers.","roleManager":"Address that administers proof submission; if zero, proof submission is open.","trustingPeriod":"Maximum age in seconds for trusted consensus states."}},"getClientState()":{"returns":{"_0":"The client state."}},"getConsensusState(uint64)":{"params":{"revisionHeight":"The revision height to query."},"returns":{"_0":"The ABI-encoded consensus state."}},"getRoleAdmin(bytes32)":{"details":"Returns the admin role that controls `role`. See {grantRole} and {revokeRole}. To change a role's admin, use {_setRoleAdmin}."},"grantRole(bytes32,address)":{"details":"Grants `role` to `account`. If `account` had not been already granted `role`, emits a {RoleGranted} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleGranted} event."},"hasRole(bytes32,address)":{"details":"Returns `true` if `account` has been granted `role`."},"misbehaviour(bytes)":{"params":{"misbehaviourMsg":"The misbehaviour message"}},"renounceRole(bytes32,address)":{"details":"Revokes `role` from the calling account. Roles are often managed via {grantRole} and {revokeRole}: this function's purpose is to provide a mechanism for accounts to lose their privileges if they are compromised (such as when a trusted device is misplaced). If the calling account had been revoked `role`, emits a {RoleRevoked} event. Requirements: - the caller must be `callerConfirmation`. May emit a {RoleRevoked} event."},"revokeRole(bytes32,address)":{"details":"Revokes `role` from `account`. If `account` had been granted `role`, emits a {RoleRevoked} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleRevoked} event."},"supportsInterface(bytes4)":{"details":"Returns true if this contract implements the interface defined by `interfaceId`. See the corresponding https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[ERC section] to learn more about how these ids are created. This function call must use less than 30 000 gas."},"updateClient(bytes)":{"params":{"updateMsg":"The encoded update message e.g., an SP1 proof."},"returns":{"_0":"The result of the update operation"}},"verifyMembership((bytes,(uint64,uint64),bytes[],bytes))":{"details":"Notice that this message is not view, as it may update the client state for caching purposes.","params":{"msg_":"The membership message"},"returns":{"_0":"The unix timestamp of the verification height in the counterparty chain in seconds."}},"verifyNonMembership((bytes,(uint64,uint64),bytes[]))":{"details":"Notice that this message is not view, as it may update the client state for caching purposes.","params":{"msg_":"The membership message"},"returns":{"_0":"The unix timestamp of the verification height in the counterparty chain in seconds."}}},"version":1},"userdoc":{"kind":"user","methods":{"PROOF_SUBMITTER_ROLE()":{"notice":"Role allowed to submit client updates and proof verifications."},"constructor":{"notice":"Creates a Besu IBFT2 light client from an initial trusted consensus state."},"getClientState()":{"notice":"Returns the client state."},"getConsensusState(uint64)":{"notice":"Returns the encoded consensus state for a revision height."},"misbehaviour(bytes)":{"notice":"Misbehaviour handling, moves the light client to the frozen state if misbehaviour is detected"},"updateClient(bytes)":{"notice":"Updating the client and consensus state"},"verifyMembership((bytes,(uint64,uint64),bytes[],bytes))":{"notice":"Querying the membership of a key-value pair"},"verifyNonMembership((bytes,(uint64,uint64),bytes[]))":{"notice":"Querying the non-membership of a key"}},"version":1}},"settings":{"remappings":["@openzeppelin-contracts/=node_modules/@openzeppelin/contracts/","@openzeppelin-upgradeable/=node_modules/@openzeppelin/contracts-upgradeable/","@openzeppelin/=node_modules/@openzeppelin/","@sp1-contracts/=node_modules/sp1-contracts/contracts/src/","@uniswap/permit2/=node_modules/@uniswap/permit2/","forge-std/=node_modules/forge-std/src/","sp1-contracts/=node_modules/sp1-contracts/"],"optimizer":{"enabled":true,"runs":10000},"metadata":{"bytecodeHash":"none"},"compilationTarget":{"contracts/light-clients/besu/BesuIBFT2LightClient.sol":"BesuIBFT2LightClient"},"evmVersion":"cancun","libraries":{},"viaIR":true},"sources":{"contracts/interfaces/ILightClient.sol":{"keccak256":"0x3b2361546ee834a442d844c979fbad3458ee13146b093f585587a09e19a266af","urls":["bzz-raw://5b5d53101bb598f14a79cb1092479736fa18e8f84945ea6ef80f4dac84466042","dweb:/ipfs/QmaTCo6M3Z9aYCSX65AQtixo1sB4ymQUDAgTXSKHqJHGDh"],"license":"Apache-2.0"},"contracts/light-clients/besu/BesuIBFT2LightClient.sol":{"keccak256":"0xc8536dfc90aa5a55d128e40d6d9715a9fbd55cef5353001da2e773cc9810160e","urls":["bzz-raw://8790efb3e5909701669411298cdc72cc4e8ccdb8fcb6797e1d50e218e76a625d","dweb:/ipfs/QmNiFBhRfaHHG3Tj3R8Y1nvojGs3sVCdL5ANBSgKfVj9Fz"],"license":"Apache-2.0"},"contracts/light-clients/besu/BesuLightClientBase.sol":{"keccak256":"0x0e2957f1e184e52c1f007f7bbbe5279fe46aa54e02b7fea9ad96c06639fc704d","urls":["bzz-raw://cfa0d54ac2be000860a378a9119f70d72615e7627c80862033684e2f90d32e15","dweb:/ipfs/QmefzqCmWMghrgTQRoGkM7DSRZ3E8dUDFBCrHUhphPJCwB"],"license":"Apache-2.0"},"contracts/light-clients/besu/MPTProof.sol":{"keccak256":"0x9ab26e6445b20541e8725b190006444d3b16eb3e021174e280451f934d9535c6","urls":["bzz-raw://b6f3fd58b06b942a454bb9b21e9be40a2dab8a09f78e75ff4357c8afbc7e2d5b","dweb:/ipfs/QmPeUwNScDiU91Xx4UQduYjyCPALYLPq73ZUMEn8Nr1rTG"],"license":"Apache-2.0"},"contracts/light-clients/besu/RLPReader.sol":{"keccak256":"0xa64ad17e6da7fed2bd206df52189286694339a8061dc5d158e717eda982af1d9","urls":["bzz-raw://7020db2fe854e90e1b791e0e587610fc26bed3073ba1811faa275a1d8bf3c2c7","dweb:/ipfs/QmdXdKghNFZSX7N9qD6BsKuJQdrFoqatsVWvHRL7vJCmeP"],"license":"Apache-2.0"},"contracts/light-clients/besu/errors/IBesuLightClientErrors.sol":{"keccak256":"0x66eff5c2f400de52896b24768de7a157eae68ca951aca2b0c271b8e03015986b","urls":["bzz-raw://3a13f7651324fab436f31dcaa25cea7d4c0cd432ddecd6e17b6876b1c80c6408","dweb:/ipfs/QmQHcMexxFzKcgfbE5rcFKq31PYBprppUEsy76dU8MRPvN"],"license":"Apache-2.0"},"contracts/light-clients/besu/msgs/IBesuLightClientMsgs.sol":{"keccak256":"0x3fc43a3daaae2f89dca4cadbc99ea71086282f987b47a95c13489ae3384532cf","urls":["bzz-raw://36083aa6833eb30d26023f7dc0b2e22b7d0723d922fcd50cf86999edc9aeb474","dweb:/ipfs/QmbPv9KJj5AuJkgppuyuoaTHtiw91Qkx1tdkf1R5D4wad2"],"license":"Apache-2.0"},"contracts/msgs/IICS02ClientMsgs.sol":{"keccak256":"0x03d1265eae327c3744d774bf22a30d845233d50664921c9aa57cef2d71fd89d2","urls":["bzz-raw://89900781cc5c60540a237d92d42745ea6165765ee8fb4d50e8137a717195cc75","dweb:/ipfs/Qmbx5p8gZ8sEMMeZytXsLee49JUayhAaoJ2yxX93WUrvQo"],"license":"Apache-2.0"},"contracts/msgs/ILightClientMsgs.sol":{"keccak256":"0x8d1e56ab166a7b4aa6999708e3214a4645ebbc3835c2b2a4c255c9923eebafde","urls":["bzz-raw://8bd4200dc04d950c0f050623fa9a8accdbec877fd446c039d4dd6c678bdf1513","dweb:/ipfs/QmZQTViaA7N6BVNDzJ1Z6w799PrPoE4ajPueZSPwX4sGZ9"],"license":"Apache-2.0"},"node_modules/@openzeppelin/contracts/access/AccessControl.sol":{"keccak256":"0x4686ec784d75f95beaf2bf5b5f26e5f946d4c864aaee9c3c62bdc18381f5e017","urls":["bzz-raw://26710ca191913f3c9df542079c4a6dcff02968e92d4f7357daefef9fbe72a19c","dweb:/ipfs/QmanHbeWuBbVEqXySHa1zhm2rExjYpChDBubBaJNTCa2JB"],"license":"MIT"},"node_modules/@openzeppelin/contracts/access/IAccessControl.sol":{"keccak256":"0xbff9f59c84e5337689161ce7641c0ef8e872d6a7536fbc1f5133f128887aba3c","urls":["bzz-raw://b308f882e796f7b79c9502deacb0a62983035c6f6f4e962b319ba6a1f4a77d3d","dweb:/ipfs/QmaWCW7ahEQqFjwhSUhV7Ae7WhfNvzSpE7DQ58hvEooqPL"],"license":"MIT"},"node_modules/@openzeppelin/contracts/utils/Context.sol":{"keccak256":"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2","urls":["bzz-raw://6a708e8a5bdb1011c2c381c9a5cfd8a9a956d7d0a9dc1bd8bcdaf52f76ef2f12","dweb:/ipfs/Qmax9WHBnVsZP46ZxEMNRQpLQnrdE4dK8LehML1Py8FowF"],"license":"MIT"},"node_modules/@openzeppelin/contracts/utils/cryptography/ECDSA.sol":{"keccak256":"0xbeb5cad8aaabe0d35d2ec1a8414d91e81e5a8ca679add4cf57e2f33476861f40","urls":["bzz-raw://ebb272a5ee2da4e8bd5551334e0ce8dce4e9c56a04570d6bf046d260fab3116a","dweb:/ipfs/QmNw6RyM769qcqFocDq6HJMG2WiEnQbvizpRaUXsACHho2"],"license":"MIT"},"node_modules/@openzeppelin/contracts/utils/introspection/ERC165.sol":{"keccak256":"0x2d9dc2fe26180f74c11c13663647d38e259e45f95eb88f57b61d2160b0109d3e","urls":["bzz-raw://81233d1f98060113d9922180bb0f14f8335856fe9f339134b09335e9f678c377","dweb:/ipfs/QmWh6R35SarhAn4z2wH8SU456jJSYL2FgucfTFgbHJJN4E"],"license":"MIT"},"node_modules/@openzeppelin/contracts/utils/introspection/IERC165.sol":{"keccak256":"0x8891738ffe910f0cf2da09566928589bf5d63f4524dd734fd9cedbac3274dd5c","urls":["bzz-raw://971f954442df5c2ef5b5ebf1eb245d7105d9fbacc7386ee5c796df1d45b21617","dweb:/ipfs/QmadRjHbkicwqwwh61raUEapaVEtaLMcYbQZWs9gUkgj3u"],"license":"MIT"}},"version":1},"id":34} \ No newline at end of file diff --git a/ibc-solidity/abi/bytecode/BesuQBFTLightClient.json b/ibc-solidity/abi/bytecode/BesuQBFTLightClient.json index c205ef201..e41e1bc63 100644 --- a/ibc-solidity/abi/bytecode/BesuQBFTLightClient.json +++ b/ibc-solidity/abi/bytecode/BesuQBFTLightClient.json @@ -1 +1 @@ -{"abi":[{"type":"constructor","inputs":[{"name":"ibcRouter","type":"address","internalType":"address"},{"name":"initialTrustedHeight","type":"uint64","internalType":"uint64"},{"name":"initialTrustedTimestamp","type":"uint64","internalType":"uint64"},{"name":"initialTrustedStorageRoot","type":"bytes32","internalType":"bytes32"},{"name":"initialTrustedValidators","type":"address[]","internalType":"address[]"},{"name":"trustingPeriod","type":"uint64","internalType":"uint64"},{"name":"maxClockDrift","type":"uint64","internalType":"uint64"},{"name":"roleManager","type":"address","internalType":"address"}],"stateMutability":"nonpayable"},{"type":"function","name":"DEFAULT_ADMIN_ROLE","inputs":[],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"type":"function","name":"PROOF_SUBMITTER_ROLE","inputs":[],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"type":"function","name":"getClientState","inputs":[],"outputs":[{"name":"","type":"bytes","internalType":"bytes"}],"stateMutability":"view"},{"type":"function","name":"getConsensusState","inputs":[{"name":"revisionHeight","type":"uint64","internalType":"uint64"}],"outputs":[{"name":"","type":"bytes","internalType":"bytes"}],"stateMutability":"view"},{"type":"function","name":"getRoleAdmin","inputs":[{"name":"role","type":"bytes32","internalType":"bytes32"}],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"type":"function","name":"grantRole","inputs":[{"name":"role","type":"bytes32","internalType":"bytes32"},{"name":"account","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"hasRole","inputs":[{"name":"role","type":"bytes32","internalType":"bytes32"},{"name":"account","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"misbehaviour","inputs":[{"name":"","type":"bytes","internalType":"bytes"}],"outputs":[],"stateMutability":"view"},{"type":"function","name":"renounceRole","inputs":[{"name":"role","type":"bytes32","internalType":"bytes32"},{"name":"callerConfirmation","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"revokeRole","inputs":[{"name":"role","type":"bytes32","internalType":"bytes32"},{"name":"account","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"supportsInterface","inputs":[{"name":"interfaceId","type":"bytes4","internalType":"bytes4"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"updateClient","inputs":[{"name":"updateMsg","type":"bytes","internalType":"bytes"}],"outputs":[{"name":"","type":"uint8","internalType":"enum ILightClientMsgs.UpdateResult"}],"stateMutability":"nonpayable"},{"type":"function","name":"verifyMembership","inputs":[{"name":"msg_","type":"tuple","internalType":"struct ILightClientMsgs.MsgVerifyMembership","components":[{"name":"proof","type":"bytes","internalType":"bytes"},{"name":"proofHeight","type":"tuple","internalType":"struct IICS02ClientMsgs.Height","components":[{"name":"revisionNumber","type":"uint64","internalType":"uint64"},{"name":"revisionHeight","type":"uint64","internalType":"uint64"}]},{"name":"path","type":"bytes[]","internalType":"bytes[]"},{"name":"value","type":"bytes","internalType":"bytes"}]}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"verifyNonMembership","inputs":[{"name":"msg_","type":"tuple","internalType":"struct ILightClientMsgs.MsgVerifyNonMembership","components":[{"name":"proof","type":"bytes","internalType":"bytes"},{"name":"proofHeight","type":"tuple","internalType":"struct IICS02ClientMsgs.Height","components":[{"name":"revisionNumber","type":"uint64","internalType":"uint64"},{"name":"revisionHeight","type":"uint64","internalType":"uint64"}]},{"name":"path","type":"bytes[]","internalType":"bytes[]"}]}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"event","name":"RoleAdminChanged","inputs":[{"name":"role","type":"bytes32","indexed":true,"internalType":"bytes32"},{"name":"previousAdminRole","type":"bytes32","indexed":true,"internalType":"bytes32"},{"name":"newAdminRole","type":"bytes32","indexed":true,"internalType":"bytes32"}],"anonymous":false},{"type":"event","name":"RoleGranted","inputs":[{"name":"role","type":"bytes32","indexed":true,"internalType":"bytes32"},{"name":"account","type":"address","indexed":true,"internalType":"address"},{"name":"sender","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"type":"event","name":"RoleRevoked","inputs":[{"name":"role","type":"bytes32","indexed":true,"internalType":"bytes32"},{"name":"account","type":"address","indexed":true,"internalType":"address"},{"name":"sender","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"type":"error","name":"AccessControlBadConfirmation","inputs":[]},{"type":"error","name":"AccessControlUnauthorizedAccount","inputs":[{"name":"account","type":"address","internalType":"address"},{"name":"neededRole","type":"bytes32","internalType":"bytes32"}]},{"type":"error","name":"ConflictingConsensusState","inputs":[{"name":"revisionHeight","type":"uint64","internalType":"uint64"}]},{"type":"error","name":"ConsensusStateExpired","inputs":[{"name":"trustedTimestamp","type":"uint64","internalType":"uint64"},{"name":"currentTimestamp","type":"uint256","internalType":"uint256"},{"name":"trustingPeriod","type":"uint64","internalType":"uint64"}]},{"type":"error","name":"ConsensusStateNotFound","inputs":[{"name":"revisionHeight","type":"uint64","internalType":"uint64"}]},{"type":"error","name":"DuplicateCommitSealSigner","inputs":[{"name":"signer","type":"address","internalType":"address"}]},{"type":"error","name":"DuplicateValidator","inputs":[{"name":"validator","type":"address","internalType":"address"}]},{"type":"error","name":"EmptyValidatorSet","inputs":[]},{"type":"error","name":"HeaderFromFuture","inputs":[{"name":"currentTimestamp","type":"uint256","internalType":"uint256"},{"name":"headerTimestamp","type":"uint256","internalType":"uint256"},{"name":"maxClockDrift","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"InsufficientTrustedValidatorOverlap","inputs":[{"name":"actual","type":"uint256","internalType":"uint256"},{"name":"required","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"InsufficientValidatorQuorum","inputs":[{"name":"actual","type":"uint256","internalType":"uint256"},{"name":"required","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"InvalidCommitSeal","inputs":[]},{"type":"error","name":"InvalidCommitmentValue","inputs":[{"name":"expectedValue","type":"bytes32","internalType":"bytes32"},{"name":"actualValue","type":"bytes32","internalType":"bytes32"}]},{"type":"error","name":"InvalidDifficulty","inputs":[{"name":"actualDifficulty","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"InvalidECDSASignatureLength","inputs":[{"name":"length","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"InvalidExtraDataFormat","inputs":[{"name":"itemsLength","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"InvalidHeaderFormat","inputs":[{"name":"itemsLength","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"InvalidHeaderHeight","inputs":[]},{"type":"error","name":"InvalidMixHash","inputs":[{"name":"actualMixHash","type":"bytes32","internalType":"bytes32"}]},{"type":"error","name":"InvalidNonce","inputs":[{"name":"actualNonce","type":"bytes","internalType":"bytes"}]},{"type":"error","name":"InvalidOmmersHash","inputs":[{"name":"actualOmmersHash","type":"bytes32","internalType":"bytes32"}]},{"type":"error","name":"InvalidPathLength","inputs":[{"name":"expectedLength","type":"uint256","internalType":"uint256"},{"name":"actualLength","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"InvalidRevisionNumber","inputs":[{"name":"providedRevisionNumber","type":"uint64","internalType":"uint64"}]},{"type":"error","name":"InvalidValidatorAddress","inputs":[{"name":"validator","type":"address","internalType":"address"}]},{"type":"error","name":"InvalidValidatorAddressLength","inputs":[{"name":"length","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"InvalidValueLength","inputs":[{"name":"expectedLength","type":"uint256","internalType":"uint256"},{"name":"actualLength","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"UnsupportedMisbehaviour","inputs":[]},{"type":"error","name":"ValueExists","inputs":[{"name":"actualValue","type":"bytes32","internalType":"bytes32"}]}],"bytecode":{"object":"0x6080604052346103c05761394680380380610019816103c4565b928339810190610100818303126103c057610033816103e9565b61003f602083016103fd565b9061004c604084016103fd565b60608401516080850151909291906001600160401b0381116103c05785019286601f850112156103c0578351966001600160401b038811610376578760051b9460206100998188016103c4565b809a81520190602082978201019283116103c057602001905b8282106103a8575050506100c860a087016103fd565b956100e160e06100da60c084016103fd565b92016103e9565b956001600160401b03169081156103995788511561038a575f5b89518110156101b1576001600160a01b03610116828c610411565b51161561018a575f5b81811061012f57506001016100fb565b6001600160a01b03610141828d610411565b51166001600160a01b03610155848e610411565b5116146101645760010161011f565b6001600160a01b03610176838d610411565b511663107f863360e21b5f5260045260245ffd5b6001600160a01b039061019d908b610411565b51166359bff38760e01b5f5260045260245ffd5b5060408051979896978a979181016001600160401b03811182821017610376576040525f81526020810190848252604051926080840198848a1060018060401b038b1117610376576040998a526001600160a01b031680855260208086018490526001600160401b03928316868c01819052878416606090970196909652600180546001600160a01b031916909217825592516002805495516001600160801b031996871692851692909217918c1b6fffffffffffffffff000000000000000090811692909217815560038054909616909617968b1b16959095179092555f948552600490529590922080546001600160401b03191694861694909417845583019190915592519392019190831161037657680100000000000000008311610376578154838355808410610350575b50905f5260205f205f5b83811061033357846001600160a01b03811661031a575061030961052f565b505b6040516132f490816105b28239f35b8061032761032d92610439565b506104af565b5061030b565b82516001600160a01b0316818301556020909201916001016102ea565b825f528360205f2091820191015b81811061036b57506102e0565b5f815560010161035e565b634e487b7160e01b5f52604160045260245ffd5b63339e1ffb60e01b5f5260045ffd5b6359d119e360e01b5f5260045ffd5b602080916103b5846103e9565b8152019101906100b2565b5f80fd5b6040519190601f01601f191682016001600160401b0381118382101761037657604052565b51906001600160a01b03821682036103c057565b51906001600160401b03821682036103c057565b80518210156104255760209160051b010190565b634e487b7160e01b5f52603260045260245ffd5b6001600160a01b0381165f9081525f5160206139265f395f51905f52602052604090205460ff166104aa576001600160a01b03165f8181525f5160206139265f395f51905f5260205260408120805460ff191660011790553391905f5160206138a65f395f51905f528180a4600190565b505f90565b6001600160a01b0381165f9081525f5160206138c65f395f51905f52602052604090205460ff166104aa576001600160a01b03165f8181525f5160206138c65f395f51905f5260205260408120805460ff191660011790553391905f5160206139065f395f51905f52905f5160206138a65f395f51905f529080a4600190565b5f80525f5160206138c65f395f51905f526020525f5160206138e65f395f51905f525460ff166105ad575f8080525f5160206138c65f395f51905f526020525f5160206138e65f395f51905f52805460ff1916600117905533905f5160206139065f395f51905f525f5160206138a65f395f51905f528280a4600190565b5f9056fe60806040526004361015610011575f80fd5b5f3560e01c806301ffc9a7146100f45780630bece356146100ef578063248a9ca3146100ea5780632f2ff15d146100e557806336568abe146100e05780634d6d9ffb146100db5780635972185a146100d6578063682ed5f0146100d157806391d14854146100cc578063a217fddf146100c7578063d547741f146100c2578063ddba6537146100bd578063edce8bdc146100b85763ef913a4b146100b3575f80fd5b610a16565b61095e565b61088b565b61085c565b610842565b6107f4565b6105e6565b6105ac565b6103ac565b610350565b61031a565b6102b5565b610217565b34610195576020600319360112610195576004357fffffffff00000000000000000000000000000000000000000000000000000000811680910361019557807f7965db0b000000000000000000000000000000000000000000000000000000006020921490811561016b575b506040519015158152f35b7f01ffc9a7000000000000000000000000000000000000000000000000000000009150145f610160565b5f80fd5b9060206003198301126101955760043567ffffffffffffffff811161019557826023820112156101955780600401359267ffffffffffffffff84116101955760248483010111610195576024019190565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b346101955761028161022836610199565b5f80527f4c48d1d2b0f4f7485fc28e3db22341d96a20aa29e6efa8149da9751603abd4e06020527f6e0c24a6e293ff9b755263dbaa15ba3796b0b8d3fe17cfb4ddf8143b268eac475490919060ff161561029957610d9d565b6040516003821015610294576020918152f35b6101ea565b6102a1611287565b610d9d565b90816020910312610195573590565b346101955760206003193601126101955760206102df6004355f525f602052600160405f20015490565b604051908152f35b6003196040910112610195576004359060243573ffffffffffffffffffffffffffffffffffffffff811681036101955790565b346101955761034e61032b366102e7565b90610349610344825f525f602052600160405f20015490565b61130f565b61221d565b005b346101955761035e366102e7565b3373ffffffffffffffffffffffffffffffffffffffff8216036103845761034e916122f4565b7f6697b232000000000000000000000000000000000000000000000000000000005f5260045ffd5b346101955760206003193601126101955760043567ffffffffffffffff8111610195578060040160806003198336030112610195575f80527f4c48d1d2b0f4f7485fc28e3db22341d96a20aa29e6efa8149da9751603abd4e060205260ff7f6e0c24a6e293ff9b755263dbaa15ba3796b0b8d3fe17cfb4ddf8143b268eac4754161561059f575b61044761044260248401611192565b61137c565b60648201916001610458848461119c565b90500361056157906104a96104966104a261049d61049661049061048961048460446104e09a01611192565b611b30565b988761119c565b9061126e565b3691610b4d565b6123c9565b928061121d565b906001840154906040516104d7816104c960208201948560209181520190565b03601f198101835282610afd565b51902091612457565b805161051f5761051b61050b6104fe845467ffffffffffffffff1690565b67ffffffffffffffff1690565b6040519081529081906020820190565b0390f35b61053361052e61055e9261259c565b6125c9565b7fd039601e000000000000000000000000000000000000000000000000000000005f52600452602490565b5ffd5b61055e61056e848461119c565b7f88b3170e000000000000000000000000000000000000000000000000000000005f52600160045260245250604490565b6105a7611287565b610433565b34610195575f6003193601126101955760206040517fbd893629a699470e4ec82a5715bb4981fdaacc5d0a728bf5f55b801d8f4ef10b8152f35b346101955760206003193601126101955760043567ffffffffffffffff8111610195578060040160a06003198336030112610195575f80527f4c48d1d2b0f4f7485fc28e3db22341d96a20aa29e6efa8149da9751603abd4e060205260ff7f6e0c24a6e293ff9b755263dbaa15ba3796b0b8d3fe17cfb4ddf8143b268eac475416156107e7575b61067c61044260248401611192565b6064820191600161068d848461119c565b90500361056157608481019060206106a5838561121d565b9050036107a957906106f46104966106ed6106e56106de61049d6104966104906106d761048460446107149c01611192565b9b8b61119c565b948761121d565b8101906102a6565b948061121d565b906001850154906040516104d7816104c960208201948560209181520190565b8051156107755761052e6107279161259c565b908082036107475761051b61050b6104fe855467ffffffffffffffff1690565b7f56ed1b63000000000000000000000000000000000000000000000000000000005f5260045260245260445ffd5b61055e827f56ed1b63000000000000000000000000000000000000000000000000000000005f52906044916004525f602452565b61055e6107b6838561121d565b7f24fadac8000000000000000000000000000000000000000000000000000000005f52602060045260245250604490565b6107ef611287565b61066d565b3461019557602060ff610836610809366102e7565b905f525f845260405f209073ffffffffffffffffffffffffffffffffffffffff165f5260205260405f2090565b54166040519015158152f35b34610195575f6003193601126101955760206040515f8152f35b346101955761034e61086d366102e7565b90610886610344825f525f602052600160405f20015490565b6122f4565b346101955761089936610199565b50505f80527f4c48d1d2b0f4f7485fc28e3db22341d96a20aa29e6efa8149da9751603abd4e06020527f6e0c24a6e293ff9b755263dbaa15ba3796b0b8d3fe17cfb4ddf8143b268eac475460ff1615610915575b7f2c1ed462000000000000000000000000000000000000000000000000000000005f5260045ffd5b61091d611287565b6108ed565b67ffffffffffffffff81160361019557565b601f19601f602060409481855280519182918282880152018686015e5f8582860101520116010190565b346101955760206003193601126101955761097e60043561048481610922565b67ffffffffffffffff8154166002600183015492019060405192608084019160208501526040840152606080840152815480915260a08301915f5260205f20905f5b8181106109ea5761051b856109de818703601f198101835282610afd565b60405191829182610934565b825473ffffffffffffffffffffffffffffffffffffffff168452602090930192600192830192016109c0565b34610195575f6003193601126101955761051b60405173ffffffffffffffffffffffffffffffffffffffff60015416602082015267ffffffffffffffff600254818116604084015260401c16606082015267ffffffffffffffff600354818116608084015260401c1660a082015260a081526109de60c082610afd565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b6060810190811067ffffffffffffffff821117610adc57604052565b610a93565b6040810190811067ffffffffffffffff821117610adc57604052565b90601f601f19910116810190811067ffffffffffffffff821117610adc57604052565b60405190610b2f604083610afd565b565b67ffffffffffffffff8111610adc57601f01601f191660200190565b929192610b5982610b31565b91610b676040519384610afd565b829481845281830111610195578281602093845f960137010152565b9080601f8301121561019557816020610b9e93359101610b4d565b90565b6020818303126101955780359067ffffffffffffffff8211610195570180820391608083126101955760405192610bd784610ac0565b823567ffffffffffffffff811161019557604091610bfa84601f19938701610b83565b8652011261019557604051610c0e81610ae1565b6020830135610c1c81610922565b81526040830135610c2c81610922565b60208201526020840152606082013567ffffffffffffffff811161019557610c549201610b83565b604082015290565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b9060018201809211610c9757565b610c5c565b60c001908160c011610c9757565b60f701908160f711610c9757565b6080019081608011610c9757565b60b701908160b711610c9757565b91908201809211610c9757565b908160011b9180830460021490151715610c9757565b81519167ffffffffffffffff8311610adc57680100000000000000008311610adc578154838355808410610d77575b506020610d389101915f5260205f2090565b5f5b838110610d475750505050565b6001906020610d6a855173ffffffffffffffffffffffffffffffffffffffff1690565b9401938184015501610d3a565b825f528360205f2091820191015b818110610d925750610d26565b5f8155600101610d85565b610da991810190610ba1565b9060208201610dc461044282515167ffffffffffffffff1690565b610dce8351611614565b92606084019367ffffffffffffffff610def865167ffffffffffffffff1690565b161561116a5760035491604083901c67ffffffffffffffff1693610e1d67ffffffffffffffff861642610cd4565b9460a0840195610e35875167ffffffffffffffff1690565b9067ffffffffffffffff82161161112b5750505160200151610e7290610e649067ffffffffffffffff16611b30565b9367ffffffffffffffff1690565b67ffffffffffffffff81168015159081611102575b506110ad575090610ef591610eb66002610eae610ea385611bc2565b60e086015190611cf8565b950185611f11565b610ec660c0830194855190612036565b60406080610ee960015473ffffffffffffffffffffffffffffffffffffffff1690565b930151910151916120d9565b610f22610f0a865167ffffffffffffffff1690565b67ffffffffffffffff165f52600460205260405f2090565b610f376104fe825467ffffffffffffffff1690565b61103b5750916002610fb5928694610fa8610f73610f64610f0a610fc39a9b5167ffffffffffffffff1690565b955167ffffffffffffffff1690565b859067ffffffffffffffff167fffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000825416179055565b6001840155519101610cf7565b5167ffffffffffffffff1690565b600254610fdc9060401c67ffffffffffffffff166104fe565b67ffffffffffffffff821611610ff157505f90565b611037907fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff6fffffffffffffffff00000000000000006002549260401b16911617600255565b5f90565b91611051611059945167ffffffffffffffff1690565b90519261214f565b6110a75761055e611072835167ffffffffffffffff1690565b7fc1aea5f7000000000000000000000000000000000000000000000000000000005f5267ffffffffffffffff16600452602490565b60029150565b61055e906110c3855467ffffffffffffffff1690565b7feae35725000000000000000000000000000000000000000000000000000000005f5267ffffffffffffffff9081166004524260245216604452606490565b9050611123429161111e6104fe885467ffffffffffffffff1690565b610cd4565b11155f610e87565b7f9b772277000000000000000000000000000000000000000000000000000000005f524260045267ffffffffffffffff9081166024521660445260645ffd5b7f59d119e3000000000000000000000000000000000000000000000000000000005f5260045ffd5b35610b9e81610922565b9035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe181360301821215610195570180359067ffffffffffffffff821161019557602001918160051b3603831361019557565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b9035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe181360301821215610195570180359067ffffffffffffffff82116101955760200191813603831361019557565b9015611282578061127e9161121d565b9091565b6111f0565b335f9081527f4c48d1d2b0f4f7485fc28e3db22341d96a20aa29e6efa8149da9751603abd4e0602052604090205460ff16156112bf57565b7fe2517d3f000000000000000000000000000000000000000000000000000000005f52336004527fbd893629a699470e4ec82a5715bb4981fdaacc5d0a728bf5f55b801d8f4ef10b60245260445ffd5b805f525f60205260ff6113433360405f209073ffffffffffffffffffffffffffffffffffffffff165f5260205260405f2090565b54161561134d5750565b7fe2517d3f000000000000000000000000000000000000000000000000000000005f523360045260245260445ffd5b67ffffffffffffffff168061138e5750565b7f3ce598a9000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b60405190610100820182811067ffffffffffffffff821117610adc57604052606060e0838281528260208201528260408201525f838201525f60808201525f60a08201528260c08201520152565b8051600110156112825760400190565b805160071015611282576101000190565b8051600d1015611282576101c00190565b8051600e1015611282576101e00190565b805160081015611282576101200190565b8051600310156112825760800190565b8051600b1015611282576101800190565b8051600c1015611282576101a00190565b8051600410156112825760a00190565b8051156112825760200190565b8051600210156112825760600190565b805160101015611282576102200190565b80518210156112825760209160051b010190565b67ffffffffffffffff8111610adc5760051b60200190565b90611501826114df565b61150e6040519182610afd565b828152601f1961151e82946114df565b0190602036910137565b90602082519201517fffffffffffffffffffffffffffffffffffffffff00000000000000000000000081169260148110611560575050565b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000929350829060140360031b1b161690565b60405160c091906115a38382610afd565b6005815291601f1901825f5b8281106115bb57505050565b8060606020809385010152016115af565b906115d6826114df565b6115e36040519182610afd565b828152601f196115f382946114df565b01905f5b82811061160357505050565b8060606020809385010152016115f7565b61163061162b6116226113b9565b9280845261259c565b61260b565b602082019080825251600f8110611b0557507f1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d493476116766116708351611407565b516126d6565b03611aca57600161169061168a8351611417565b516125c9565b03611a8f577f63746963616c2062797a616e74696e65206661756c7420746f6c6572616e63656116c36116708351611428565b03611a54576116db6116d58251611439565b516126f2565b80516008811490811591611a24575b506119ea575061162b61175d6116d5836117216117106104fe61168a611762985161144a565b67ffffffffffffffff166060880152565b61172e611670825161145b565b60808701526117576117466104fe61168a845161146b565b67ffffffffffffffff1660a0880152565b5161147c565b61259c565b90604081019180835251600581036119bf57506117886117828351611407565b5161260b565b908151156119975761179a82516114f7565b9360c082019485525f5b8351811015611933576117ba6116d582866114cb565b80516014810361190857506117d16117d791611528565b60601c90565b73ffffffffffffffffffffffffffffffffffffffff811680156118c6575f5b8381106118325750509061182c600192611811838a516114cb565b9073ffffffffffffffffffffffffffffffffffffffff169052565b016117a4565b8161187761185e611844848d516114cb565b5173ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff1690565b14611884576001016117f6565b7f41fe18cc000000000000000000000000000000000000000000000000000000005f5273ffffffffffffffffffffffffffffffffffffffff831660045260245ffd5b7f59bff387000000000000000000000000000000000000000000000000000000005f5273ffffffffffffffffffffffffffffffffffffffff821660045260245ffd5b7f83e46ad2000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b509261178291945061194692505161148d565b61195081516115cc565b9260e081019384525f5b8251811015611991578061198a816119776116d5600195886114cb565b88519061198483836114cb565b526114cb565b500161195a565b50925050565b7f339e1ffb000000000000000000000000000000000000000000000000000000005f5260045ffd5b7f30c6792a000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b611a20906040519182917fd5edd2a500000000000000000000000000000000000000000000000000000000835260048301610934565b0390fd5b7f011b4d03dd8c01f1049143cf9c4c817e4b167f1d1b83e5c6f0f10d89ba1e7bce9150602083012014155f6116ea565b611a6461167061055e9251611428565b7fa19e609c000000000000000000000000000000000000000000000000000000005f52600452602490565b611a9f61168a61055e9251611417565b7ff71b722f000000000000000000000000000000000000000000000000000000005f52600452602490565b611ada61167061055e9251611407565b7fb8120dca000000000000000000000000000000000000000000000000000000005f52600452602490565b7fbc277732000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b67ffffffffffffffff1690815f52600460205260405f209167ffffffffffffffff83541615611b5c5750565b7ff761631b000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b60405190611b96604083610afd565b600182527fc0000000000000000000000000000000000000000000000000000000000000006020830152565b6020611c7d611bcf611592565b611c48611be660408601611bec611be6825161149d565b51612ff9565b611bf58561149d565b52611bff8461149d565b50611c0d611be68251611407565b611c1685611407565b52611c2084611407565b50611c2e611be682516114aa565b611c37856114aa565b52611c41846114aa565b505161145b565b611c518261145b565b52611c5b8161145b565b50611c64611b87565b611c6d8261148d565b52611c778161148d565b506127c8565b910190611c8b8251516115cc565b905f5b83518051821015611ce1579080600192600c82145f14611ccf575050611cb383612880565b611cbd82866114cb565b52611cc881856114cb565b5001611c8e565b611cdc91611be6916114cb565b611cb3565b505050611cee91506127c8565b6020815191012090565b919091611d0583516114f7565b925f5b8151811015611efe57611d1b81836114cb565b51805160418103611ed3575080601b60ff611d6a611d64611d3e611d779661285f565b517fff000000000000000000000000000000000000000000000000000000000000001690565b60f81c90565b1610611e80575b846130a7565b90611d81816128fa565b1590811591611e76575b508015611e58575b611e305773ffffffffffffffffffffffffffffffffffffffff81165f5b838110611dd057505090611dca60019261181183896114cb565b01611d08565b81611de161185e611844848c6114cb565b14611dee57600101611db0565b7f33af0d5f000000000000000000000000000000000000000000000000000000005f5273ffffffffffffffffffffffffffffffffffffffff831660045260245ffd5b7f09cb44e6000000000000000000000000000000000000000000000000000000005f5260045ffd5b5073ffffffffffffffffffffffffffffffffffffffff811615611d93565b905015155f611d8b565b611ec2611e9a611e95611d64611d3e8561285f565b6128e8565b60f81b7fff000000000000000000000000000000000000000000000000000000000000001690565b5f1a611ecd8261285f565b53611d71565b7ff2db9ce1000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b505050565b5f198114610c975760010190565b905f915f5b8151811015611f6a57611f4973ffffffffffffffffffffffffffffffffffffffff611f4183856114cb565b511684612904565b611f56575b600101611f16565b92611f62600191611f03565b939050611f4e565b50506003611f79915404610c89565b90818110611f85575050565b7fe2dcb1b9000000000000000000000000000000000000000000000000000000005f5260045260245260445ffd5b905f198201918211610c9757565b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff408201918211610c9757565b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff808201918211610c9757565b6020039060208211610c9757565b91908203918211610c9757565b905f915f5b815181101561208f5761206e73ffffffffffffffffffffffffffffffffffffffff61206683856114cb565b51168461295b565b61207b575b60010161203b565b92612087600191611f03565b939050612073565b50505190600382048203918211610c97578181106120ab575050565b7f7818f4e4000000000000000000000000000000000000000000000000000000005f5260045260245260445ffd5b6121239261162b9261175d926040517fffffffffffffffffffffffffffffffffffffffff000000000000000000000000602082019260601b168252601481526104d7603482610afd565b805160021015611282576060610b9e9101516126d6565b8054821015611282575f5260205f2001905f90565b919067ffffffffffffffff8061216d855467ffffffffffffffff1690565b92169116149081159161220e575b5061220857600201908154815103612208575f5b8151811015612200576121c56121a5828561213a565b905473ffffffffffffffffffffffffffffffffffffffff9160031b1c1690565b73ffffffffffffffffffffffffffffffffffffffff6121ea61185e61184485876114cb565b9116036121f95760010161218f565b5050505f90565b505050600190565b50505f90565b9050600182015414155f61217b565b805f525f60205260ff6122518360405f209073ffffffffffffffffffffffffffffffffffffffff165f5260205260405f2090565b541661220857805f525f6020526122898260405f209073ffffffffffffffffffffffffffffffffffffffff165f5260205260405f2090565b60017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0082541617905573ffffffffffffffffffffffffffffffffffffffff339216907f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d5f80a4600190565b805f525f60205260ff6123288360405f209073ffffffffffffffffffffffffffffffffffffffff165f5260205260405f2090565b54161561220857805f525f6020526123618260405f209073ffffffffffffffffffffffffffffffffffffffff165f5260205260405f2090565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00815416905573ffffffffffffffffffffffffffffffffffffffff339216907ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b5f80a4600190565b60208151910120604051602081019182527f1260944489272988d9df285149b5aa1b0f48f2136d6f416159f840a3e074760060408201526040815261240f606082610afd565b51902090565b60405190612424602083610afd565b5f808352366020840137565b9061243a82610b31565b6124476040519182610afd565b828152601f1961151e8294610b31565b61162b6124999194939461246b6020610b31565b956124796040519788610afd565b602087526124876020610b31565b601f196020890191013682375261259c565b906124a48451610ce1565b91845115158061257c575b6124b8906125c2565b6124ca6124c55f85612029565b612430565b925f19015f5b8181106124e4575050610b9e939450612acf565b80612566600f612529612560611d64611d3e8d61250360029960011c90565b908d61255a8a6125528a612529612520611d64611d3e8a8a61286f565b60041c600f1690565b1660f81b7fff000000000000000000000000000000000000000000000000000000000000001690565b5f1a9261286f565b5361286f565b60ff1690565b5f1a612575600183018861286f565b53016124d0565b5060016124af565b6040519061259182610ae1565b5f6020838281520152565b6125a4612584565b506020815191604051926125b784610ae1565b835201602082015290565b1561019557565b805180151590816125ff575b5015610195576125e490612da5565b905190602081106125f3575090565b6020036101000a900490565b6021915011155f6125d5565b61261481612dd1565b156101955761262281612df1565b61262b816114df565b916126396040519384610afd565b818352601f19612648836114df565b015f5b8181106126bf575050602061266b91015161266581612e52565b90610cd4565b5f905b82821061267b5750505090565b6126b78161268a600193612ebd565b90612693610b20565b8281528160208201526126a686896114cb565b526126b185886114cb565b50610cd4565b91019061266e565b6020906126ca612584565b8282880101520161264b565b6021815103610195576020015160018101809111610c97575190565b80511561019557612705610b9e91612da5565b61271181939293612430565b928360200190612f86565b805191908290602001825e015f815290565b610b2f9061275061274a9493604051958693602085019061271c565b9061271c565b03601f198101845283610afd565b6001907fff00000000000000000000000000000000000000000000000000000000000000610b9e9493168152019061271c565b916001610b9e94937fff0000000000000000000000000000000000000000000000000000000000000061274a94168152019061271c565b6127d0612415565b905f915b81518310156127fc576127f46001916127ed85856114cb565b519061272e565b9201916127d4565b91505080516038811061283b5750610b9e6128178251613025565b916104c961282b611e9a6125608651610caa565b9160405194859360208501612791565b61284d611e9a612560610b9e93610c9c565b6104c96040519384926020840161275e565b8051604010156112825760600190565b908151811015611282570160200190565b6001815114806128cd575b610b9e578051603881106128bb5750610b9e6128a78251613025565b916104c961282b611e9a6125608651610cc6565b61284d611e9a612560610b9e93610cb8565b50608060ff6128e1611d64611d3e8561149d565b161061288b565b60ff601b9116019060ff8211610c9757565b6004111561029457565b905f5b82548110156121f95773ffffffffffffffffffffffffffffffffffffffff61292f828561213a565b90549060031b1c1673ffffffffffffffffffffffffffffffffffffffff83161461220057600101612907565b905f5b82518110156121f95773ffffffffffffffffffffffffffffffffffffffff61298682856114cb565b511673ffffffffffffffffffffffffffffffffffffffff8316146122005760010161295e565b91906129b88351610ce1565b908351151580612ac5575b6129cc906125c2565b6129d96124c58284612029565b938192600180841614612a63575b5f19869101935b8481106129fc575050505050565b83612a5a6001612a50600f612529612560611d64611d3e8b60029b612a49612a3c886125298f611d64611d3e612a356125209360011c90565b809961286f565b9b8d03809c5f1a9261286f565b538c61286f565b5f1a92018961286f565b530185906129ee565b92507f0f00000000000000000000000000000000000000000000000000000000000000612aa2612560611d64611d3e612a9c8760011c90565b8661286f565b60f81b165f1a612ab18661149d565b535f19612abd83611f03565b9390506129e7565b50818111156129c3565b915f915f612adb612584565b50845115612d6c5790935f915b81518310156101955782158080612d56575b61019557159081612d39575b5061019557612b1861178283836114cb565b948551600281145f14612c155750612b3a612b356116d58861149d565b61313c565b95612b50612b498888846131a9565b8092610cd4565b965111612bf75715612b875750612b679051611fb3565b11610195575111612b7e576116d5610b9e91611407565b50610b9e612415565b919094612b948651611fb3565b82146101955780612bb6612bb2612bac600194611407565b51612dd1565b1590565b15612bd857612bc7612bcd91611407565b5161312e565b915b01919490612ae8565b612be4612bf191611407565b5160208101519051902090565b91612bcf565b505091509250612c08915051611fb3565b1161019557610b9e612415565b929491939192601103612cda5781518314612cbc57612c46612c40612560611d64611d3e878761286f565b93610c89565b92601081101561019557612c63612c5d82896114cb565b51613118565b15612c855750505050612c7891925051611fb3565b0361019557610b9e612415565b86612c9d612bb2612bac84600196989a97999b6114cb565b15612caf57612bf191612bc7916114cb565b612bf191612be4916114cb565b505050612cc99051611fb3565b03610195576116d5610b9e916114ba565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f696e76616c6964206e6f6465206c656e677468000000000000000000000000006044820152606490fd5b9050612d4e612d4884846114cb565b516130e1565b14155f612b06565b50612d64612be485856114cb565b871415612afa565b509050612d9d92507f56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b4219150146125c2565b610b9e612415565b906020820191612db58351612e52565b925190838201809211610c975751928303928311610c97579190565b805115612dec57602060c0910151515f1a1061103757600190565b505f90565b805115612dec575f9060208101908151612e0a81612e52565b8101809111610c9757915190518101809111610c975791905b828110612e305750905090565b612e3981612ebd565b8101809111610c9757612e4c9091611f03565b90612e23565b515f1a6080811015612e6357505f90565b60b881108015612ea7575b15612e795750600190565b60c0811015612e9857610b9e90612e939060b75b90612029565b610c89565b610b9e90612e939060f7612e8d565b5060c08110158015612e6e575060f88110612e6e565b80515f1a906080821015612ed2575050600190565b60b8821015612ee85750612e93610b9e91611fee565b60c0821015612f295760010151602082900360b7016101000a9004017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff4a0190565b60f8821015612f3f5750612e93610b9e91611fc1565b60010151602082900360f7016101000a9004017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0a0190565b601f8111610c97576101000a90565b90918015611efe575b6020811015612fc95780612fa257505050565b612fb6612fb1612fbb9261201b565b612f77565b611fb3565b905182518216911916179052565b91908051825260208101809111610c97579060208101809111610c975791601f19810190811115612f8f57610c5c565b6130038151612430565b9081511561302157806020610b9e9201519051908360200190612f86565b5090565b5f81805b613093575061303781612430565b91815b61304357505090565b61304c82611fb3565b61307e7fff000000000000000000000000000000000000000000000000000000000000008360f81b165f1a918561286f565b5360081c908015610c97575f1901908161303a565b9061309d90611f03565b9060081c80613029565b81519190604183036130d7576130d09250602082015190606060408401519301515f1a9061324d565b9192909190565b50505f9160029190565b805160208110156130f9575060208101519051902090565b906020015120604051602081019182526020815261240f604082610afd565b6001815103612dec5760200151515f1a60801490565b61313790612da5565b902090565b9081511561019557600f613158612520611d64611d3e8661149d565b168061316b5750610b9e60025f936129ac565b600181036131805750610b9e60015f936129ac565b600281036131965750610b9e60026001936129ac565b60030361019557610b9e600180936129ac565b91905f5b838101808211610c97578251811080613243575b1561323b576131f17fff00000000000000000000000000000000000000000000000000000000000000918461286f565b51167fff0000000000000000000000000000000000000000000000000000000000000061321e838661286f565b511690036132345761322f90611f03565b6131ad565b9250505090565b509250505090565b50835182106131c1565b91907f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a084116132dc579160209360809260ff5f9560405194855216868401526040830152606082015282805260015afa156132d1575f5173ffffffffffffffffffffffffffffffffffffffff8116156132c757905f905f90565b505f906001905f90565b6040513d5f823e3d90fd5b5050505f916003919056fea164736f6c634300081c000a2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d4c48d1d2b0f4f7485fc28e3db22341d96a20aa29e6efa8149da9751603abd4e06e0c24a6e293ff9b755263dbaa15ba3796b0b8d3fe17cfb4ddf8143b268eac47bd893629a699470e4ec82a5715bb4981fdaacc5d0a728bf5f55b801d8f4ef10bad3228b676f7d3cd4284a5443f17f1962b36e491b30a40b2405849e597ba5fb5","sourceMap":"237:2306:36:-:0;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;237:2306:36;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;237:2306:36;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;:::i;:::-;;-1:-1:-1;;;;;237:2306:36;;3952:25:35;;3948:84;;237:2306:36;;17667:22:35;17663:79;;-1:-1:-1;17794:3:35;237:2306:36;;17771:21:35;;;;;-1:-1:-1;;;;;17817:13:35;;;;:::i;:::-;237:2306:36;;17817:27:35;17813:111;;-1:-1:-1;17957:5:35;;;;;;17794:3;237:2306:36;;17756:13:35;;17964:3;-1:-1:-1;;;;;17991:13:35;;;;:::i;:::-;237:2306:36;;-1:-1:-1;;;;;18008:13:35;237:2306:36;;18008:13:35;:::i;:::-;237:2306:36;;17991:30:35;17987:117;;237:2306:36;;17942:13:35;;17987:117;-1:-1:-1;;;;;18071:13:35;237:2306:36;;18071:13:35;:::i;:::-;237:2306:36;;18052:33:35;;;-1:-1:-1;18052:33:35;;237:2306:36;;-1:-1:-1;18052:33:35;17813:111;-1:-1:-1;;;;;237:2306:36;17895:13:35;;237:2306:36;17895:13:35;:::i;:::-;237:2306:36;;17871:38:35;;;-1:-1:-1;17871:38:35;;237:2306:36;;-1:-1:-1;17871:38:35;17771:21;-1:-1:-1;237:2306:36;;;17771:21:35;;;;;;;237:2306:36;;-1:-1:-1;;;;;237:2306:36;;;;;;;;;;-1:-1:-1;237:2306:36;;;4186:84:35;;237:2306:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;237:2306:36;;;;;4112:255:35;;;237:2306:36;;;-1:-1:-1;;;;;237:2306:36;;;4112:255:35;;;237:2306:36;;;;;;;4112:255:35;;;237:2306:36;;;;;;;-1:-1:-1;;;;;;237:2306:36;;;;;;;;;;;;;-1:-1:-1;;;;;;237:2306:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;237:2306:36;;;4418:15:35;237:2306:36;;;;;;;;-1:-1:-1;;;;;;237:2306:36;;;;;;;;;;4525:26:35;;237:2306:36;;;;;;;4589:25:35;;;237:2306:36;;;;;;;;;;;;;;;;;;;;17751:377:35;237:2306:36;;-1:-1:-1;237:2306:36;;-1:-1:-1;237:2306:36;-1:-1:-1;237:2306:36;;;;;;;-1:-1:-1;;;;;237:2306:36;;;;4697:44:35;;;:::i;:::-;;4652:233;237:2306:36;;;;;;;;;4652:233:35;4772:43;;4829:45;4772:43;;:::i;:::-;;4829:45;:::i;:::-;;4652:233;;237:2306:36;;;-1:-1:-1;;;;;237:2306:36;;;;;;;;;;;;;;;;-1:-1:-1;237:2306:36;;;-1:-1:-1;237:2306:36;;;;;;;;;;;;;;;;-1:-1:-1;237:2306:36;;;;;;;;;;-1:-1:-1;237:2306:36;;4418:15:35;237:2306:36;;-1:-1:-1;237:2306:36;17663:79:35;17712:19;;;-1:-1:-1;17712:19:35;;-1:-1:-1;17712:19:35;3948:84;4000:21;;;-1:-1:-1;4000:21:35;;-1:-1:-1;4000:21:35;237:2306:36;;;;;;;:::i;:::-;;;;;;;;;;-1:-1:-1;237:2306:36;;;;;;;;;-1:-1:-1;;237:2306:36;;;-1:-1:-1;;;;;237:2306:36;;;;;;;;;;:::o;:::-;;;-1:-1:-1;;;;;237:2306:36;;;;;;:::o;:::-;;;-1:-1:-1;;;;;237:2306:36;;;;;;:::o;:::-;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;6145:316:93;-1:-1:-1;;;;;237:2306:36;;3976:1:35;237:2306:36;;;-1:-1:-1;;;;;;;;;;;237:2306:36;;;;;;;;;;-1:-1:-1;;;;;237:2306:36;3976:1:35;237:2306:36;;;-1:-1:-1;;;;;;;;;;;237:2306:36;;;;;;;-1:-1:-1;;237:2306:36;;;;;735:10:121;;237:2306:36;-1:-1:-1;;;;;;;;;;;3976:1:35;;6336:40:93;6313:4;6390:11;:::o;6238:217::-;6432:12;3976:1:35;6432:12:93;:::o;6145:316::-;-1:-1:-1;;;;;237:2306:36;;;;;;-1:-1:-1;;;;;;;;;;;237:2306:36;;;;;;;;;;-1:-1:-1;;;;;237:2306:36;;;;;-1:-1:-1;;;;;;;;;;;237:2306:36;;;;;;;-1:-1:-1;;237:2306:36;;;;;735:10:121;;237:2306:36;-1:-1:-1;;;;;;;;;;;2089:33:35;-1:-1:-1;;;;;;;;;;;6336:40:93;237:2306:36;6336:40:93;6313:4;6390:11;:::o;6145:316::-;237:2306:36;;;-1:-1:-1;;;;;;;;;;;237:2306:36;;-1:-1:-1;;;;;;;;;;;237:2306:36;;;;;;;;;-1:-1:-1;;;;;;;;;;;237:2306:36;;-1:-1:-1;;;;;;;;;;;237:2306:36;;-1:-1:-1;;237:2306:36;6313:4:93;237:2306:36;;;735:10:121;;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;237:2306:36;;6336:40:93;6313:4;6390:11;:::o;6238:217::-;237:2306:36;6432:12:93;:::o","linkReferences":{}},"deployedBytecode":{"object":"0x60806040526004361015610011575f80fd5b5f3560e01c806301ffc9a7146100f45780630bece356146100ef578063248a9ca3146100ea5780632f2ff15d146100e557806336568abe146100e05780634d6d9ffb146100db5780635972185a146100d6578063682ed5f0146100d157806391d14854146100cc578063a217fddf146100c7578063d547741f146100c2578063ddba6537146100bd578063edce8bdc146100b85763ef913a4b146100b3575f80fd5b610a16565b61095e565b61088b565b61085c565b610842565b6107f4565b6105e6565b6105ac565b6103ac565b610350565b61031a565b6102b5565b610217565b34610195576020600319360112610195576004357fffffffff00000000000000000000000000000000000000000000000000000000811680910361019557807f7965db0b000000000000000000000000000000000000000000000000000000006020921490811561016b575b506040519015158152f35b7f01ffc9a7000000000000000000000000000000000000000000000000000000009150145f610160565b5f80fd5b9060206003198301126101955760043567ffffffffffffffff811161019557826023820112156101955780600401359267ffffffffffffffff84116101955760248483010111610195576024019190565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b346101955761028161022836610199565b5f80527f4c48d1d2b0f4f7485fc28e3db22341d96a20aa29e6efa8149da9751603abd4e06020527f6e0c24a6e293ff9b755263dbaa15ba3796b0b8d3fe17cfb4ddf8143b268eac475490919060ff161561029957610d9d565b6040516003821015610294576020918152f35b6101ea565b6102a1611287565b610d9d565b90816020910312610195573590565b346101955760206003193601126101955760206102df6004355f525f602052600160405f20015490565b604051908152f35b6003196040910112610195576004359060243573ffffffffffffffffffffffffffffffffffffffff811681036101955790565b346101955761034e61032b366102e7565b90610349610344825f525f602052600160405f20015490565b61130f565b61221d565b005b346101955761035e366102e7565b3373ffffffffffffffffffffffffffffffffffffffff8216036103845761034e916122f4565b7f6697b232000000000000000000000000000000000000000000000000000000005f5260045ffd5b346101955760206003193601126101955760043567ffffffffffffffff8111610195578060040160806003198336030112610195575f80527f4c48d1d2b0f4f7485fc28e3db22341d96a20aa29e6efa8149da9751603abd4e060205260ff7f6e0c24a6e293ff9b755263dbaa15ba3796b0b8d3fe17cfb4ddf8143b268eac4754161561059f575b61044761044260248401611192565b61137c565b60648201916001610458848461119c565b90500361056157906104a96104966104a261049d61049661049061048961048460446104e09a01611192565b611b30565b988761119c565b9061126e565b3691610b4d565b6123c9565b928061121d565b906001840154906040516104d7816104c960208201948560209181520190565b03601f198101835282610afd565b51902091612457565b805161051f5761051b61050b6104fe845467ffffffffffffffff1690565b67ffffffffffffffff1690565b6040519081529081906020820190565b0390f35b61053361052e61055e9261259c565b6125c9565b7fd039601e000000000000000000000000000000000000000000000000000000005f52600452602490565b5ffd5b61055e61056e848461119c565b7f88b3170e000000000000000000000000000000000000000000000000000000005f52600160045260245250604490565b6105a7611287565b610433565b34610195575f6003193601126101955760206040517fbd893629a699470e4ec82a5715bb4981fdaacc5d0a728bf5f55b801d8f4ef10b8152f35b346101955760206003193601126101955760043567ffffffffffffffff8111610195578060040160a06003198336030112610195575f80527f4c48d1d2b0f4f7485fc28e3db22341d96a20aa29e6efa8149da9751603abd4e060205260ff7f6e0c24a6e293ff9b755263dbaa15ba3796b0b8d3fe17cfb4ddf8143b268eac475416156107e7575b61067c61044260248401611192565b6064820191600161068d848461119c565b90500361056157608481019060206106a5838561121d565b9050036107a957906106f46104966106ed6106e56106de61049d6104966104906106d761048460446107149c01611192565b9b8b61119c565b948761121d565b8101906102a6565b948061121d565b906001850154906040516104d7816104c960208201948560209181520190565b8051156107755761052e6107279161259c565b908082036107475761051b61050b6104fe855467ffffffffffffffff1690565b7f56ed1b63000000000000000000000000000000000000000000000000000000005f5260045260245260445ffd5b61055e827f56ed1b63000000000000000000000000000000000000000000000000000000005f52906044916004525f602452565b61055e6107b6838561121d565b7f24fadac8000000000000000000000000000000000000000000000000000000005f52602060045260245250604490565b6107ef611287565b61066d565b3461019557602060ff610836610809366102e7565b905f525f845260405f209073ffffffffffffffffffffffffffffffffffffffff165f5260205260405f2090565b54166040519015158152f35b34610195575f6003193601126101955760206040515f8152f35b346101955761034e61086d366102e7565b90610886610344825f525f602052600160405f20015490565b6122f4565b346101955761089936610199565b50505f80527f4c48d1d2b0f4f7485fc28e3db22341d96a20aa29e6efa8149da9751603abd4e06020527f6e0c24a6e293ff9b755263dbaa15ba3796b0b8d3fe17cfb4ddf8143b268eac475460ff1615610915575b7f2c1ed462000000000000000000000000000000000000000000000000000000005f5260045ffd5b61091d611287565b6108ed565b67ffffffffffffffff81160361019557565b601f19601f602060409481855280519182918282880152018686015e5f8582860101520116010190565b346101955760206003193601126101955761097e60043561048481610922565b67ffffffffffffffff8154166002600183015492019060405192608084019160208501526040840152606080840152815480915260a08301915f5260205f20905f5b8181106109ea5761051b856109de818703601f198101835282610afd565b60405191829182610934565b825473ffffffffffffffffffffffffffffffffffffffff168452602090930192600192830192016109c0565b34610195575f6003193601126101955761051b60405173ffffffffffffffffffffffffffffffffffffffff60015416602082015267ffffffffffffffff600254818116604084015260401c16606082015267ffffffffffffffff600354818116608084015260401c1660a082015260a081526109de60c082610afd565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b6060810190811067ffffffffffffffff821117610adc57604052565b610a93565b6040810190811067ffffffffffffffff821117610adc57604052565b90601f601f19910116810190811067ffffffffffffffff821117610adc57604052565b60405190610b2f604083610afd565b565b67ffffffffffffffff8111610adc57601f01601f191660200190565b929192610b5982610b31565b91610b676040519384610afd565b829481845281830111610195578281602093845f960137010152565b9080601f8301121561019557816020610b9e93359101610b4d565b90565b6020818303126101955780359067ffffffffffffffff8211610195570180820391608083126101955760405192610bd784610ac0565b823567ffffffffffffffff811161019557604091610bfa84601f19938701610b83565b8652011261019557604051610c0e81610ae1565b6020830135610c1c81610922565b81526040830135610c2c81610922565b60208201526020840152606082013567ffffffffffffffff811161019557610c549201610b83565b604082015290565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b9060018201809211610c9757565b610c5c565b60c001908160c011610c9757565b60f701908160f711610c9757565b6080019081608011610c9757565b60b701908160b711610c9757565b91908201809211610c9757565b908160011b9180830460021490151715610c9757565b81519167ffffffffffffffff8311610adc57680100000000000000008311610adc578154838355808410610d77575b506020610d389101915f5260205f2090565b5f5b838110610d475750505050565b6001906020610d6a855173ffffffffffffffffffffffffffffffffffffffff1690565b9401938184015501610d3a565b825f528360205f2091820191015b818110610d925750610d26565b5f8155600101610d85565b610da991810190610ba1565b9060208201610dc461044282515167ffffffffffffffff1690565b610dce8351611614565b92606084019367ffffffffffffffff610def865167ffffffffffffffff1690565b161561116a5760035491604083901c67ffffffffffffffff1693610e1d67ffffffffffffffff861642610cd4565b9460a0840195610e35875167ffffffffffffffff1690565b9067ffffffffffffffff82161161112b5750505160200151610e7290610e649067ffffffffffffffff16611b30565b9367ffffffffffffffff1690565b67ffffffffffffffff81168015159081611102575b506110ad575090610ef591610eb66002610eae610ea385611bc2565b60e086015190611cf8565b950185611f11565b610ec660c0830194855190612036565b60406080610ee960015473ffffffffffffffffffffffffffffffffffffffff1690565b930151910151916120d9565b610f22610f0a865167ffffffffffffffff1690565b67ffffffffffffffff165f52600460205260405f2090565b610f376104fe825467ffffffffffffffff1690565b61103b5750916002610fb5928694610fa8610f73610f64610f0a610fc39a9b5167ffffffffffffffff1690565b955167ffffffffffffffff1690565b859067ffffffffffffffff167fffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000825416179055565b6001840155519101610cf7565b5167ffffffffffffffff1690565b600254610fdc9060401c67ffffffffffffffff166104fe565b67ffffffffffffffff821611610ff157505f90565b611037907fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff6fffffffffffffffff00000000000000006002549260401b16911617600255565b5f90565b91611051611059945167ffffffffffffffff1690565b90519261214f565b6110a75761055e611072835167ffffffffffffffff1690565b7fc1aea5f7000000000000000000000000000000000000000000000000000000005f5267ffffffffffffffff16600452602490565b60029150565b61055e906110c3855467ffffffffffffffff1690565b7feae35725000000000000000000000000000000000000000000000000000000005f5267ffffffffffffffff9081166004524260245216604452606490565b9050611123429161111e6104fe885467ffffffffffffffff1690565b610cd4565b11155f610e87565b7f9b772277000000000000000000000000000000000000000000000000000000005f524260045267ffffffffffffffff9081166024521660445260645ffd5b7f59d119e3000000000000000000000000000000000000000000000000000000005f5260045ffd5b35610b9e81610922565b9035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe181360301821215610195570180359067ffffffffffffffff821161019557602001918160051b3603831361019557565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b9035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe181360301821215610195570180359067ffffffffffffffff82116101955760200191813603831361019557565b9015611282578061127e9161121d565b9091565b6111f0565b335f9081527f4c48d1d2b0f4f7485fc28e3db22341d96a20aa29e6efa8149da9751603abd4e0602052604090205460ff16156112bf57565b7fe2517d3f000000000000000000000000000000000000000000000000000000005f52336004527fbd893629a699470e4ec82a5715bb4981fdaacc5d0a728bf5f55b801d8f4ef10b60245260445ffd5b805f525f60205260ff6113433360405f209073ffffffffffffffffffffffffffffffffffffffff165f5260205260405f2090565b54161561134d5750565b7fe2517d3f000000000000000000000000000000000000000000000000000000005f523360045260245260445ffd5b67ffffffffffffffff168061138e5750565b7f3ce598a9000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b60405190610100820182811067ffffffffffffffff821117610adc57604052606060e0838281528260208201528260408201525f838201525f60808201525f60a08201528260c08201520152565b8051600110156112825760400190565b805160071015611282576101000190565b8051600d1015611282576101c00190565b8051600e1015611282576101e00190565b805160081015611282576101200190565b8051600310156112825760800190565b8051600b1015611282576101800190565b8051600c1015611282576101a00190565b8051600410156112825760a00190565b8051156112825760200190565b8051600210156112825760600190565b805160101015611282576102200190565b80518210156112825760209160051b010190565b67ffffffffffffffff8111610adc5760051b60200190565b90611501826114df565b61150e6040519182610afd565b828152601f1961151e82946114df565b0190602036910137565b90602082519201517fffffffffffffffffffffffffffffffffffffffff00000000000000000000000081169260148110611560575050565b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000929350829060140360031b1b161690565b60405160c091906115a38382610afd565b6005815291601f1901825f5b8281106115bb57505050565b8060606020809385010152016115af565b906115d6826114df565b6115e36040519182610afd565b828152601f196115f382946114df565b01905f5b82811061160357505050565b8060606020809385010152016115f7565b61163061162b6116226113b9565b9280845261259c565b61260b565b602082019080825251600f8110611b0557507f1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d493476116766116708351611407565b516126d6565b03611aca57600161169061168a8351611417565b516125c9565b03611a8f577f63746963616c2062797a616e74696e65206661756c7420746f6c6572616e63656116c36116708351611428565b03611a54576116db6116d58251611439565b516126f2565b80516008811490811591611a24575b506119ea575061162b61175d6116d5836117216117106104fe61168a611762985161144a565b67ffffffffffffffff166060880152565b61172e611670825161145b565b60808701526117576117466104fe61168a845161146b565b67ffffffffffffffff1660a0880152565b5161147c565b61259c565b90604081019180835251600581036119bf57506117886117828351611407565b5161260b565b908151156119975761179a82516114f7565b9360c082019485525f5b8351811015611933576117ba6116d582866114cb565b80516014810361190857506117d16117d791611528565b60601c90565b73ffffffffffffffffffffffffffffffffffffffff811680156118c6575f5b8381106118325750509061182c600192611811838a516114cb565b9073ffffffffffffffffffffffffffffffffffffffff169052565b016117a4565b8161187761185e611844848d516114cb565b5173ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff1690565b14611884576001016117f6565b7f41fe18cc000000000000000000000000000000000000000000000000000000005f5273ffffffffffffffffffffffffffffffffffffffff831660045260245ffd5b7f59bff387000000000000000000000000000000000000000000000000000000005f5273ffffffffffffffffffffffffffffffffffffffff821660045260245ffd5b7f83e46ad2000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b509261178291945061194692505161148d565b61195081516115cc565b9260e081019384525f5b8251811015611991578061198a816119776116d5600195886114cb565b88519061198483836114cb565b526114cb565b500161195a565b50925050565b7f339e1ffb000000000000000000000000000000000000000000000000000000005f5260045ffd5b7f30c6792a000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b611a20906040519182917fd5edd2a500000000000000000000000000000000000000000000000000000000835260048301610934565b0390fd5b7f011b4d03dd8c01f1049143cf9c4c817e4b167f1d1b83e5c6f0f10d89ba1e7bce9150602083012014155f6116ea565b611a6461167061055e9251611428565b7fa19e609c000000000000000000000000000000000000000000000000000000005f52600452602490565b611a9f61168a61055e9251611417565b7ff71b722f000000000000000000000000000000000000000000000000000000005f52600452602490565b611ada61167061055e9251611407565b7fb8120dca000000000000000000000000000000000000000000000000000000005f52600452602490565b7fbc277732000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b67ffffffffffffffff1690815f52600460205260405f209167ffffffffffffffff83541615611b5c5750565b7ff761631b000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b60405190611b96604083610afd565b600182527fc0000000000000000000000000000000000000000000000000000000000000006020830152565b6020611c7d611bcf611592565b611c48611be660408601611bec611be6825161149d565b51612ff9565b611bf58561149d565b52611bff8461149d565b50611c0d611be68251611407565b611c1685611407565b52611c2084611407565b50611c2e611be682516114aa565b611c37856114aa565b52611c41846114aa565b505161145b565b611c518261145b565b52611c5b8161145b565b50611c64611b87565b611c6d8261148d565b52611c778161148d565b506127c8565b910190611c8b8251516115cc565b905f5b83518051821015611ce1579080600192600c82145f14611ccf575050611cb383612880565b611cbd82866114cb565b52611cc881856114cb565b5001611c8e565b611cdc91611be6916114cb565b611cb3565b505050611cee91506127c8565b6020815191012090565b919091611d0583516114f7565b925f5b8151811015611efe57611d1b81836114cb565b51805160418103611ed3575080601b60ff611d6a611d64611d3e611d779661285f565b517fff000000000000000000000000000000000000000000000000000000000000001690565b60f81c90565b1610611e80575b846130a7565b90611d81816128fa565b1590811591611e76575b508015611e58575b611e305773ffffffffffffffffffffffffffffffffffffffff81165f5b838110611dd057505090611dca60019261181183896114cb565b01611d08565b81611de161185e611844848c6114cb565b14611dee57600101611db0565b7f33af0d5f000000000000000000000000000000000000000000000000000000005f5273ffffffffffffffffffffffffffffffffffffffff831660045260245ffd5b7f09cb44e6000000000000000000000000000000000000000000000000000000005f5260045ffd5b5073ffffffffffffffffffffffffffffffffffffffff811615611d93565b905015155f611d8b565b611ec2611e9a611e95611d64611d3e8561285f565b6128e8565b60f81b7fff000000000000000000000000000000000000000000000000000000000000001690565b5f1a611ecd8261285f565b53611d71565b7ff2db9ce1000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b505050565b5f198114610c975760010190565b905f915f5b8151811015611f6a57611f4973ffffffffffffffffffffffffffffffffffffffff611f4183856114cb565b511684612904565b611f56575b600101611f16565b92611f62600191611f03565b939050611f4e565b50506003611f79915404610c89565b90818110611f85575050565b7fe2dcb1b9000000000000000000000000000000000000000000000000000000005f5260045260245260445ffd5b905f198201918211610c9757565b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff408201918211610c9757565b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff808201918211610c9757565b6020039060208211610c9757565b91908203918211610c9757565b905f915f5b815181101561208f5761206e73ffffffffffffffffffffffffffffffffffffffff61206683856114cb565b51168461295b565b61207b575b60010161203b565b92612087600191611f03565b939050612073565b50505190600382048203918211610c97578181106120ab575050565b7f7818f4e4000000000000000000000000000000000000000000000000000000005f5260045260245260445ffd5b6121239261162b9261175d926040517fffffffffffffffffffffffffffffffffffffffff000000000000000000000000602082019260601b168252601481526104d7603482610afd565b805160021015611282576060610b9e9101516126d6565b8054821015611282575f5260205f2001905f90565b919067ffffffffffffffff8061216d855467ffffffffffffffff1690565b92169116149081159161220e575b5061220857600201908154815103612208575f5b8151811015612200576121c56121a5828561213a565b905473ffffffffffffffffffffffffffffffffffffffff9160031b1c1690565b73ffffffffffffffffffffffffffffffffffffffff6121ea61185e61184485876114cb565b9116036121f95760010161218f565b5050505f90565b505050600190565b50505f90565b9050600182015414155f61217b565b805f525f60205260ff6122518360405f209073ffffffffffffffffffffffffffffffffffffffff165f5260205260405f2090565b541661220857805f525f6020526122898260405f209073ffffffffffffffffffffffffffffffffffffffff165f5260205260405f2090565b60017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0082541617905573ffffffffffffffffffffffffffffffffffffffff339216907f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d5f80a4600190565b805f525f60205260ff6123288360405f209073ffffffffffffffffffffffffffffffffffffffff165f5260205260405f2090565b54161561220857805f525f6020526123618260405f209073ffffffffffffffffffffffffffffffffffffffff165f5260205260405f2090565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00815416905573ffffffffffffffffffffffffffffffffffffffff339216907ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b5f80a4600190565b60208151910120604051602081019182527f1260944489272988d9df285149b5aa1b0f48f2136d6f416159f840a3e074760060408201526040815261240f606082610afd565b51902090565b60405190612424602083610afd565b5f808352366020840137565b9061243a82610b31565b6124476040519182610afd565b828152601f1961151e8294610b31565b61162b6124999194939461246b6020610b31565b956124796040519788610afd565b602087526124876020610b31565b601f196020890191013682375261259c565b906124a48451610ce1565b91845115158061257c575b6124b8906125c2565b6124ca6124c55f85612029565b612430565b925f19015f5b8181106124e4575050610b9e939450612acf565b80612566600f612529612560611d64611d3e8d61250360029960011c90565b908d61255a8a6125528a612529612520611d64611d3e8a8a61286f565b60041c600f1690565b1660f81b7fff000000000000000000000000000000000000000000000000000000000000001690565b5f1a9261286f565b5361286f565b60ff1690565b5f1a612575600183018861286f565b53016124d0565b5060016124af565b6040519061259182610ae1565b5f6020838281520152565b6125a4612584565b506020815191604051926125b784610ae1565b835201602082015290565b1561019557565b805180151590816125ff575b5015610195576125e490612da5565b905190602081106125f3575090565b6020036101000a900490565b6021915011155f6125d5565b61261481612dd1565b156101955761262281612df1565b61262b816114df565b916126396040519384610afd565b818352601f19612648836114df565b015f5b8181106126bf575050602061266b91015161266581612e52565b90610cd4565b5f905b82821061267b5750505090565b6126b78161268a600193612ebd565b90612693610b20565b8281528160208201526126a686896114cb565b526126b185886114cb565b50610cd4565b91019061266e565b6020906126ca612584565b8282880101520161264b565b6021815103610195576020015160018101809111610c97575190565b80511561019557612705610b9e91612da5565b61271181939293612430565b928360200190612f86565b805191908290602001825e015f815290565b610b2f9061275061274a9493604051958693602085019061271c565b9061271c565b03601f198101845283610afd565b6001907fff00000000000000000000000000000000000000000000000000000000000000610b9e9493168152019061271c565b916001610b9e94937fff0000000000000000000000000000000000000000000000000000000000000061274a94168152019061271c565b6127d0612415565b905f915b81518310156127fc576127f46001916127ed85856114cb565b519061272e565b9201916127d4565b91505080516038811061283b5750610b9e6128178251613025565b916104c961282b611e9a6125608651610caa565b9160405194859360208501612791565b61284d611e9a612560610b9e93610c9c565b6104c96040519384926020840161275e565b8051604010156112825760600190565b908151811015611282570160200190565b6001815114806128cd575b610b9e578051603881106128bb5750610b9e6128a78251613025565b916104c961282b611e9a6125608651610cc6565b61284d611e9a612560610b9e93610cb8565b50608060ff6128e1611d64611d3e8561149d565b161061288b565b60ff601b9116019060ff8211610c9757565b6004111561029457565b905f5b82548110156121f95773ffffffffffffffffffffffffffffffffffffffff61292f828561213a565b90549060031b1c1673ffffffffffffffffffffffffffffffffffffffff83161461220057600101612907565b905f5b82518110156121f95773ffffffffffffffffffffffffffffffffffffffff61298682856114cb565b511673ffffffffffffffffffffffffffffffffffffffff8316146122005760010161295e565b91906129b88351610ce1565b908351151580612ac5575b6129cc906125c2565b6129d96124c58284612029565b938192600180841614612a63575b5f19869101935b8481106129fc575050505050565b83612a5a6001612a50600f612529612560611d64611d3e8b60029b612a49612a3c886125298f611d64611d3e612a356125209360011c90565b809961286f565b9b8d03809c5f1a9261286f565b538c61286f565b5f1a92018961286f565b530185906129ee565b92507f0f00000000000000000000000000000000000000000000000000000000000000612aa2612560611d64611d3e612a9c8760011c90565b8661286f565b60f81b165f1a612ab18661149d565b535f19612abd83611f03565b9390506129e7565b50818111156129c3565b915f915f612adb612584565b50845115612d6c5790935f915b81518310156101955782158080612d56575b61019557159081612d39575b5061019557612b1861178283836114cb565b948551600281145f14612c155750612b3a612b356116d58861149d565b61313c565b95612b50612b498888846131a9565b8092610cd4565b965111612bf75715612b875750612b679051611fb3565b11610195575111612b7e576116d5610b9e91611407565b50610b9e612415565b919094612b948651611fb3565b82146101955780612bb6612bb2612bac600194611407565b51612dd1565b1590565b15612bd857612bc7612bcd91611407565b5161312e565b915b01919490612ae8565b612be4612bf191611407565b5160208101519051902090565b91612bcf565b505091509250612c08915051611fb3565b1161019557610b9e612415565b929491939192601103612cda5781518314612cbc57612c46612c40612560611d64611d3e878761286f565b93610c89565b92601081101561019557612c63612c5d82896114cb565b51613118565b15612c855750505050612c7891925051611fb3565b0361019557610b9e612415565b86612c9d612bb2612bac84600196989a97999b6114cb565b15612caf57612bf191612bc7916114cb565b612bf191612be4916114cb565b505050612cc99051611fb3565b03610195576116d5610b9e916114ba565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f696e76616c6964206e6f6465206c656e677468000000000000000000000000006044820152606490fd5b9050612d4e612d4884846114cb565b516130e1565b14155f612b06565b50612d64612be485856114cb565b871415612afa565b509050612d9d92507f56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b4219150146125c2565b610b9e612415565b906020820191612db58351612e52565b925190838201809211610c975751928303928311610c97579190565b805115612dec57602060c0910151515f1a1061103757600190565b505f90565b805115612dec575f9060208101908151612e0a81612e52565b8101809111610c9757915190518101809111610c975791905b828110612e305750905090565b612e3981612ebd565b8101809111610c9757612e4c9091611f03565b90612e23565b515f1a6080811015612e6357505f90565b60b881108015612ea7575b15612e795750600190565b60c0811015612e9857610b9e90612e939060b75b90612029565b610c89565b610b9e90612e939060f7612e8d565b5060c08110158015612e6e575060f88110612e6e565b80515f1a906080821015612ed2575050600190565b60b8821015612ee85750612e93610b9e91611fee565b60c0821015612f295760010151602082900360b7016101000a9004017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff4a0190565b60f8821015612f3f5750612e93610b9e91611fc1565b60010151602082900360f7016101000a9004017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0a0190565b601f8111610c97576101000a90565b90918015611efe575b6020811015612fc95780612fa257505050565b612fb6612fb1612fbb9261201b565b612f77565b611fb3565b905182518216911916179052565b91908051825260208101809111610c97579060208101809111610c975791601f19810190811115612f8f57610c5c565b6130038151612430565b9081511561302157806020610b9e9201519051908360200190612f86565b5090565b5f81805b613093575061303781612430565b91815b61304357505090565b61304c82611fb3565b61307e7fff000000000000000000000000000000000000000000000000000000000000008360f81b165f1a918561286f565b5360081c908015610c97575f1901908161303a565b9061309d90611f03565b9060081c80613029565b81519190604183036130d7576130d09250602082015190606060408401519301515f1a9061324d565b9192909190565b50505f9160029190565b805160208110156130f9575060208101519051902090565b906020015120604051602081019182526020815261240f604082610afd565b6001815103612dec5760200151515f1a60801490565b61313790612da5565b902090565b9081511561019557600f613158612520611d64611d3e8661149d565b168061316b5750610b9e60025f936129ac565b600181036131805750610b9e60015f936129ac565b600281036131965750610b9e60026001936129ac565b60030361019557610b9e600180936129ac565b91905f5b838101808211610c97578251811080613243575b1561323b576131f17fff00000000000000000000000000000000000000000000000000000000000000918461286f565b51167fff0000000000000000000000000000000000000000000000000000000000000061321e838661286f565b511690036132345761322f90611f03565b6131ad565b9250505090565b509250505090565b50835182106131c1565b91907f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a084116132dc579160209360809260ff5f9560405194855216868401526040830152606082015282805260015afa156132d1575f5173ffffffffffffffffffffffffffffffffffffffff8116156132c757905f905f90565b505f906001905f90565b6040513d5f823e3d90fd5b5050505f916003919056fea164736f6c634300081c000a","sourceMap":"237:2306:36:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;;;;-1:-1:-1;;237:2306:36;;;;;;;;;;;;;;;2639:47:93;2654:32;237:2306:36;2639:47:93;;:87;;;;;237:2306:36;;;;;;;;;;2639:87:93;844:25:133;829:40;;;2639:87:93;;;237:2306:36;-1:-1:-1;237:2306:36;;;;;-1:-1:-1;;237:2306:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;5606:2265:35;237:2306:36;;;:::i;:::-;-1:-1:-1;237:2306:36;;;;;;;;;;;;23225:42:35;23221:105;;5606:2265;:::i;:::-;237:2306:36;;;;;;;;;;;;;;;:::i;23221:105:35:-;23294:20;;:::i;:::-;5606:2265;:::i;237:2306:36:-;;;;;;;;;;;:::o;:::-;;;;;-1:-1:-1;;237:2306:36;;;;;;;;;3867:6:93;237:2306:36;3867:6:93;237:2306:36;;3867:22:93;237:2306:36;3867:6:93;237:2306:36;3867:22:93;237:2306:36;3776:120:93;;237:2306:36;;;;;;;;-1:-1:-1;;237:2306:36;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;4296:25:93;237:2306:36;;;:::i;:::-;4266:18:93;2475:4;4266:18;;3867:6;237:2306:36;3867:6:93;237:2306:36;;3867:22:93;237:2306:36;3867:6:93;237:2306:36;3867:22:93;237:2306:36;3776:120:93;;4266:18;2475:4;:::i;:::-;4296:25;:::i;:::-;237:2306:36;;;;;;;;:::i;:::-;735:10:121;237:2306:36;;;5387:34:93;5383:102;;5495:37;;;:::i;5383:102::-;5444:30;;;237:2306:36;5444:30:93;;237:2306:36;;;;;-1:-1:-1;;237:2306:36;;;;;;;;;;;;;;;;-1:-1:-1;;237:2306:36;;;;;;;-1:-1:-1;237:2306:36;;;;;;;;;23225:42:35;23221:105;;237:2306:36;9334:31:35;;:16;;;:31;:::i;:::-;;:::i;:::-;9380:9;;;;9400:1;9380:9;;;;:::i;:::-;:21;;;9376:97;;9542:31;237:2306:36;9688:10:35;9606:36;237:2306:36;9629:12:35;:9;9523:51;9542:31;;9688:95;9542:31;;;:::i;:::-;9523:51;:::i;:::-;9629:9;;;:::i;:::-;:12;;:::i;:::-;237:2306:36;;;:::i;:::-;9606:36:35;:::i;:::-;9688:10;;;:::i;237:2306:36:-;9714:26:35;9400:1;9714:26;;237:2306:36;;;;9752:29:35;;;237:2306:36;9752:29:35;;;;237:2306:36;;;;;;;9752:29:35;;-1:-1:-1;;9752:29:35;;;;;;:::i;:::-;237:2306:36;9742:40:35;;9688:95;;:::i;:::-;237:2306:36;;9793:109:35;;237:2306:36;9911:31:35;237:2306:36;;;;;;;;;;;;9911:31:35;237:2306:36;;;;;;;;;;;;;;;;;9793:109:35;9860:29;:20;9840:51;9860:20;;:::i;:::-;:29;:::i;:::-;9840:51;-1:-1:-1;9840:51:35;237:2306:36;;;;;9840:51:35;-1:-1:-1;9840:51:35;9376:97;9424:38;9445:9;;;;:::i;:::-;9424:38;-1:-1:-1;9424:38:35;9400:1;237:2306:36;;;;-1:-1:-1;237:2306:36;;;23221:105:35;23294:20;;:::i;:::-;23221:105;;237:2306:36;;;;;-1:-1:-1;;237:2306:36;;;;;;;;2089:33:35;237:2306:36;;;;;;;;-1:-1:-1;;237:2306:36;;;;;;;;;;;;;;;;-1:-1:-1;;237:2306:36;;;;;;;-1:-1:-1;237:2306:36;;;;;;;;;23225:42:35;23221:105;;237:2306:36;8106:31:35;;:16;;;:31;:::i;:::-;8152:9;;;;8172:1;8152:9;;;;:::i;:::-;:21;;;8148:97;;8258:10;;;;237:2306:36;8258:10:35;;;;:::i;:::-;:23;;;8254:102;;8425:31;237:2306:36;8638:10:35;8559:33;8570:10;8489:36;237:2306:36;8512:12:35;:9;8406:51;8425:31;;8638:95;8425:31;;;:::i;8406:51::-;8512:9;;;:::i;8489:36::-;8570:10;;;:::i;:::-;8559:33;;;;:::i;:::-;8638:10;;;:::i;237:2306:36:-;8664:26:35;8172:1;8664:26;;237:2306:36;;;;8702:29:35;;;237:2306:36;8702:29:35;;;;237:2306:36;;;;;;;8638:95:35;237:2306:36;;8747:20:35;8743:107;;8890:20;:29;:20;;:::i;:29::-;8934:28;;;;8930:116;;237:2306:36;9055:31:35;237:2306:36;;;;;;;8930:116:35;8985:50;-1:-1:-1;8985:50:35;237:2306:36;;;;;-1:-1:-1;9840:51:35;8743:107;8790:49;;;-1:-1:-1;8790:49:35;237:2306:36;;;;;-1:-1:-1;237:2306:36;;;8254:102:35;8304:41;8327:10;;;;:::i;:::-;8304:41;-1:-1:-1;8304:41:35;237:2306:36;;;;;-1:-1:-1;237:2306:36;;;23221:105:35;23294:20;;:::i;:::-;23221:105;;237:2306:36;;;;;;2920:29:93;237:2306:36;;;:::i;:::-;;2920:6:93;237:2306:36;2920:6:93;237:2306:36;;;2920:6:93;237:2306:36;;;;;;;;;;;;;2920:29:93;237:2306:36;;;;;;;;;;;;;;;-1:-1:-1;;237:2306:36;;;;;;;;;;;;;;;;4713:26:93;237:2306:36;;;:::i;:::-;4683:18:93;2475:4;4683:18;;3867:6;237:2306:36;3867:6:93;237:2306:36;;3867:22:93;237:2306:36;3867:6:93;237:2306:36;3867:22:93;237:2306:36;3776:120:93;;2475:4;4713:26;:::i;237:2306:36:-;;;;;;;:::i;:::-;-1:-1:-1;;23264:1:35;237:2306:36;;;;;;;;;23225:42:35;23221:105;;237:2306:36;10076:25:35;23264:1;10076:25;237:2306:36;23264:1:35;10076:25;23221:105;23294:20;;:::i;:::-;23221:105;;237:2306:36;;;;;;;:::o;:::-;-1:-1:-1;;237:2306:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;-1:-1:-1;;237:2306:36;;;;;5418:34:35;237:2306:36;;;;;:::i;5418:34:35:-;237:2306:36;;;;5534:25:35;5506:26;;;237:2306:36;5534:25:35;;237:2306:36;;;;;;;5469:91:35;237:2306:36;5469:91:35;;237:2306:36;;;;;;;;;;;;;;;;;;;-1:-1:-1;237:2306:36;;-1:-1:-1;237:2306:36;;-1:-1:-1;237:2306:36;;;;;;;5469:91:35;;;;;-1:-1:-1;;5469:91:35;;;;;;:::i;:::-;237:2306:36;;;;;;;:::i;:::-;;;;;;;;;;;;5506:26:35;237:2306:36;;;;;;;;;;;;-1:-1:-1;;237:2306:36;;;;;;;;;5021:11:35;237:2306:36;;5010:23:35;;;237:2306:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5010:23:35;;;;;;:::i;237:2306:36:-;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;:::i;:::-;;;;;;;;;;;;;;;:::o;:::-;;;-1:-1:-1;;237:2306:36;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;:::i;:::-;:::o;:::-;;;;;;;;-1:-1:-1;;237:2306:36;;;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;-1:-1:-1;237:2306:36;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;:::i;:::-;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;-1:-1:-1;;237:2306:36;;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;:::o;:::-;;;;;;;;;;;;2219:66:35;237:2306:36;;;;;;;:::o;:::-;;:::i;:::-;22287:4:35;237:2306:36;;;22287:4:35;237:2306:36;;;:::o;:::-;22441:4:35;237:2306:36;;;22441:4:35;237:2306:36;;;:::o;:::-;21614:4:35;237:2306:36;;;21614:4:35;237:2306:36;;;:::o;:::-;21756:4:35;237:2306:36;;;21756:4:35;237:2306:36;;;:::o;:::-;;;;;;;;;;:::o;:::-;;;;;;;;;8605:1:37;237:2306:36;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;237:2306:36;;;-1:-1:-1;237:2306:36;;;;;;;;;;;;;;;;-1:-1:-1;237:2306:36;;;;;;5606:2265:35;5790:40;5606:2265;5790:40;;;;:::i;:::-;5861:18;;;;:33;237:2306:36;5861:18:35;;237:2306:36;;;;;5861:33:35;5935:28;5948:14;;5935:28;:::i;:::-;5977:13;;;;237:2306:36;;;;;;;;;;;5977:18:35;5973:77;;6081:25;237:2306:36;;;;;;;;6063:43:35;;237:2306:36;;;6063:15:35;:43;:::i;:::-;6109:16;;;;237:2306:36;;;;;;;;;6063:62:35;237:2306:36;;;-1:-1:-1;6059:178:35;;-1:-1:-1;;6313:18:35;5861;6313:33;237:2306:36;;;6294:53:35;;237:2306:36;;9523:51:35;:::i;6294:53::-;237:2306:36;;;;;;;;;6374:31:35;;;:139;;;;5606:2265;6357:298;;;6708:25;;6928:79;6708:25;6764:72;6081:25;6692:62;6708:25;;;:::i;:::-;6735:18;;;;6692:62;;:::i;:::-;6803:32;;6764:72;;:::i;:::-;6877:17;;;;;;;;;:::i;:::-;6989;6971:16;237:2306:36;6081:11:35;237:2306:36;;;;;;6971:16:35;;237:2306:36;6989:17:35;;;6928:79;;:::i;:::-;7066:30;237:2306:36;;;;;;;;;;;;7066:15:35;237:2306:36;;;;;;;7066:30:35;7110:37;237:2306:36;;;;;;;7110:37:35;7106:303;;237:2306:36;;6081:25:35;237:2306:36;;;;7502:46:35;237:2306:36;7462:30:35;237:2306:36;;;;;;;;;7462:30:35;237:2306:36;;;;;;;7502:46:35;237:2306:36;;;;;;;;;;;7502:46:35;6081:11;7558:29;;237:2306:36;7642:17:35;7611:28;;237:2306:36;:::i;:::-;;;;;;;6081:25:35;237:2306:36;7674:55:35;;237:2306:36;;;;;;7674:55:35;237:2306:36;;;7674:55:35;7670:141;;7821:43;5861:33;5606:2265;:::o;7670:141::-;7745:55;;237:2306:36;;6081:25:35;237:2306:36;;;;;;;;6081:25:35;237:2306:36;;7745:55:35;5861:33;5606:2265;:::o;7106:303::-;237:2306:36;;7167:95:35;237:2306:36;;;;;;;7244:17:35;;7167:95;;:::i;:::-;7163:175;;7358:40;237:2306:36;;;;;;;;7358:40:35;5861:33;7358:40;237:2306:36;;7066:15:35;237:2306:36;;;;7163:175:35;6081:25;;-1:-1:-1;7282:41:35:o;6357:298::-;6545:99;237:2306:36;;;;;;;;;6545:99:35;5861:33;6545:99;237:2306:36;;;;6545:99:35;237:2306:36;6063:15:35;237:2306:36;;;;;;;;6374:139:35;6063:15;;6425:69;6063:15;237:2306:36;6425:40:35;237:2306:36;;;;;;;6425:40:35;:69;:::i;:::-;:88;;6374:139;;;6059:178;6148:78;5861:33;6148:78;6063:15;6148:78;237:2306:36;;;;;;;;;;;-1:-1:-1;9840:51:35;5973:77;6018:21;5861:33;6018:21;;5861:33;6018:21;237:2306:36;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;:::i;:::-;;;:::o;:::-;;:::i;3165:103:93:-;735:10:121;2920:6:93;237:2306:36;;;;;;;;;;;;3485:23:93;3481:108;;3165:103::o;3481:108::-;3531:47;2920:6;3531:47;735:10:121;3531:47:93;237:2306:36;2089:33:35;237:2306:36;;;2920:6:93;3531:47;3165:103;237:2306:36;2920:6:93;237:2306:36;2920:6:93;237:2306:36;;;2920:29:93;735:10:121;237:2306:36;2920:6:93;237:2306:36;;;;;;;;;;;;;2920:29:93;237:2306:36;;3485:23:93;3481:108;;3165:103;:::o;3481:108::-;3531:47;2920:6;3531:47;735:10:121;3531:47:93;237:2306:36;;;;2920:6:93;3531:47;19777:177:35;237:2306:36;;19858:19:35;19854:94;;19777:177;:::o;19854:94::-;19900:37;19876:1;19900:37;;237:2306:36;;19876:1:35;19900:37;237:2306:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;237:2306:36;;;;-1:-1:-1;237:2306:36;;;;-1:-1:-1;237:2306:36;;;;;;;;;;;:::o;:::-;;;10971:1:35;237:2306:36;;;;;;;:::o;:::-;;;11140:1:35;237:2306:36;;;;;;;:::o;:::-;;;11279:2:35;237:2306:36;;;;;;;:::o;:::-;;;11465:2:35;237:2306:36;;;;;;;:::o;:::-;;;11508:1:35;237:2306:36;;;;;;;:::o;:::-;;;11738:1:35;237:2306:36;;;;;;;:::o;:::-;;;11811:2:35;237:2306:36;;;;;;;:::o;:::-;;;11879:2:35;237:2306:36;;;;;;;:::o;:::-;;;13110:1:35;237:2306:36;;;;;;;:::o;:::-;;;;;;;;;:::o;:::-;;;2043:1;237:2306;;;;;;;:::o;:::-;;;7571:2:37;237:2306:36;;;;;;;:::o;:::-;;;;;;;;;;;;;;;:::o;2219:66:35:-;;;;;;;;;;;:::o;:::-;;;;;:::i;:::-;237:2306:36;;;;;;:::i;:::-;2219:66:35;;;-1:-1:-1;;2219:66:35;;;;:::i;:::-;;;;;;;;:::o;:::-;;237:2306:36;;;;;2219:66:35;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;237:2306:36;2219:66:35;;;:::o;:::-;237:2306:36;;2219:66:35;;237:2306:36;;2219:66:35;237:2306:36;;:::i;:::-;1849:1;2219:66:35;;;-1:-1:-1;;2219:66:35;;-1:-1:-1;2219:66:35;;;;;;;;;:::o;:::-;;237:2306:36;2219:66:35;;;;;;;;;;;;;;;:::i;:::-;237:2306:36;;;;;;:::i;:::-;2219:66:35;;;-1:-1:-1;;2219:66:35;;;;:::i;:::-;;;-1:-1:-1;2219:66:35;;;;;;;;;:::o;:::-;;237:2306:36;2219:66:35;;;;;;;;;;10610:2705;10776:30;:21;237:2306:36;;:::i;:::-;10717:28:35;;;;10776:21;:::i;:::-;:30;:::i;:::-;10755:18;;;:51;;;;237:2306:36;10848:2:35;10820:30;;10816:114;;10952:18;2401:66;10952:36;:21;:18;;:21;:::i;:::-;;:36;:::i;:::-;10944:66;10940:168;;10971:1;11121:30;:21;:18;;:21;:::i;:::-;;:30;:::i;:::-;:35;11117:122;;2219:66;11260:37;:22;:18;;:22;:::i;:37::-;11252:67;11248:167;;11446:32;:22;:18;;:22;:::i;:::-;;:32;:::i;:::-;237:2306:36;;11508:1:35;11492:17;;;;;:73;;;10610:2705;11488:130;;;11651:18;11926:21;11860:32;:22;11651:18;11628:54;11644:38;11651:30;:21;11926:30;11651:18;;:21;:::i;11644:38::-;237:2306:36;;11628:13:35;;;2219:66;;11628:54;11719:36;:21;:18;;:21;:::i;:36::-;11692:16;;;2219:66;11766:58;11785:39;11792:31;:22;:18;;:22;:::i;11785:39::-;237:2306:36;;11766:16:35;;;2219:66;;11766:58;11860:18;:22;:::i;:32::-;11926:21;:::i;:30::-;11902:21;;;;:54;;;;237:2306:36;12002:1:35;11970:33;;11966:123;;12143:21;:33;:24;:21;;:24;:::i;:::-;;:33;:::i;:::-;237:2306:36;;;12190:26:35;12186:83;;12299:36;237:2306:36;;12299:36:35;:::i;:::-;12279:17;;;;:56;;;-1:-1:-1;12392:3:35;237:2306:36;;12365:25:35;;;;;12441:27;:17;;;;:::i;:27::-;237:2306:36;;12511:2:35;12486:27;;12482:125;;12649:23;;12641:32;12649:23;;:::i;:::-;2219:66;;;;12641:32;237:2306:36;;;12691:23:35;;12687:103;;-1:-1:-1;12823:5:35;;;;;;12996:17;;;:32;10971:1;12996:17;:32;:17;;;:32;:::i;:::-;2219:66;237:2306:36;;2219:66:35;;;12996:32;2219:66;12350:13;;12830:3;12857:17;:33;:20;;:17;;;:20;:::i;:::-;237:2306:36;;;;;12857:20:35;237:2306:36;;;;12857:33:35;;12853:116;;10971:1;2219:66;12808:13;;12853:116;12921:29;-1:-1:-1;12921:29:35;237:2306:36;;;12741:34:35;237:2306:36;2219:66:35;-1:-1:-1;9840:51:35;12687:103;12741:34;-1:-1:-1;12741:34:35;237:2306:36;;;12741:34:35;237:2306:36;2219:66:35;-1:-1:-1;9840:51:35;12482:125;12540:52;-1:-1:-1;12540:52:35;237:2306:36;;;-1:-1:-1;9840:51:35;12365:25;;;13088:24;12365:25;;;13088:33;12365:25;;13088:21;:24;:::i;:33::-;13152:29;237:2306:36;;13152:29:35;:::i;:::-;13131:18;;;;:50;;;-1:-1:-1;13233:3:35;237:2306:36;;13211:20:35;;;;;13276:12;13252:46;13276:12;:22;:12;10971:1;13276:12;;;:::i;:22::-;13252:18;;:46;;;;;:::i;:::-;;;:::i;:::-;;2219:66;13196:13;;13211:20;;;;;10610:2705::o;12186:83::-;12239:19;-1:-1:-1;12239:19:35;;-1:-1:-1;12239:19:35;11966:123;12026:52;-1:-1:-1;12026:52:35;237:2306:36;;;-1:-1:-1;9840:51:35;11488:130;11588:19;237:2306:36;;;11588:19:35;;;;;;;;;;:::i;:::-;;;;11492:73;11533:32;237:2306:36;;10755:18:35;237:2306:36;;11513:16:35;:52;;11492:73;;;11248:167;11365:37;:22;11342:62;11365:18;;:22;:::i;:37::-;11342:62;-1:-1:-1;11342:62:35;237:2306:36;;;;;11117:122:35;11197:30;:21;11179:49;11197:18;;:21;:::i;:30::-;11179:49;-1:-1:-1;11179:49:35;237:2306:36;;;;;10940:168:35;11059:36;:21;11033:64;11059:18;;:21;:::i;:36::-;11033:64;-1:-1:-1;11033:64:35;237:2306:36;;;;;10816:114:35;10873:46;10717:16;10873:46;237:2306:36;;;-1:-1:-1;9840:51:35;19356:292;237:2306:36;;;;-1:-1:-1;237:2306:36;19496:15:35;237:2306:36;;;-1:-1:-1;237:2306:36;;;;;;19541:29:35;19537:105;;19356:292;:::o;19537:105::-;19593:38;-1:-1:-1;19593:38:35;19496:15;237:2306:36;;-1:-1:-1;19593:38:35;237:2306:36;;;;;;;;:::i;:::-;;;;;;;;;:::o;1703:838::-;2264:18;2187:26;1837:14;;:::i;:::-;21201:17:35;2086:24:36;1891:21;;;21201:17:35;1891:24:36;:21;;:24;:::i;:::-;;21201:17:35;:::i;:::-;1861:55:36;;;:::i;:::-;;;;;:::i;:::-;;21201:17:35;1956:24:36;:21;;:24;:::i;21201:17:35:-;1926:55:36;;;:::i;:::-;;;;;:::i;:::-;;21201:17:35;2021:24:36;:21;;:24;:::i;21201:17:35:-;1991:55:36;;;:::i;:::-;;;;;:::i;:::-;;2086:21;:24;:::i;21201:17:35:-;2056:55:36;;;:::i;:::-;;;;;:::i;:::-;;2121:23;;:::i;:::-;;;;:::i;:::-;2219:66:35;2121:23:36;;;:::i;:::-;;2187:26;:::i;:::-;2264:18;;;2252:38;2264:18;;237:2306;2252:38;:::i;:::-;2305:13;1913:1;2351:3;2324:18;;237:2306;;2320:29;;;;;2387:82;;1978:1;2387:82;2392:2;2387:7;;:82;2392:2;;;2397:33;;;;;:::i;:::-;2370:99;;;;:::i;:::-;;;;;;:::i;:::-;;2219:66:35;2305:13:36;;2387:82;21201:17:35;2447:21:36;;;;:::i;21201:17:35:-;2387:82:36;;2320:29;;;;2506:27;2320:29;;2506:27;:::i;:::-;2264:18;237:2306;;;;2496:38;1703:838;:::o;14632:509:35:-;;;;14764:27;237:2306:36;;14764:27:35;:::i;:::-;14806:13;14818:1;14839:3;237:2306:36;;14821:16:35;;;;;14898:8;;;;:::i;:::-;;237:2306:36;;15459:2:35;15444:17;;15440:95;;15554:8;;15566:2;237:2306:36;15548:15:35;15554:8;;15709:30;15554:8;;:::i;:::-;237:2306:36;;;;;15554:8:35;237:2306:36;;;;15548:15:35;237:2306:36;15548:20:35;15544:90;;14839:3;15709:30;;:::i;:::-;237:2306:36;;;;:::i;:::-;15753:33:35;;;;:64;;;14839:3;15753:88;;;;;14839:3;15749:145;;237:2306:36;;;14818:1:35;14941:5;;;;;;15105:19;;;;2219:66;15105:19;;;;;:::i;:::-;2219:66;14806:13;;14948:3;14975:10;:20;:10;;;;;:::i;:20::-;;14971:107;;2219:66;;14926:13;;14971:107;15026:33;14818:1;15026:33;237:2306:36;;;12741:34:35;237:2306:36;2219:66:35;-1:-1:-1;9840:51:35;15749:145;15864:19;14818:1;15864:19;;14818:1;15864:19;15753:88;237:2306:36;;;;15821:20:35;15753:88;;:64;15790:27;;;;15753:64;;;15544:90;15595:28;15602:20;:15;15608:8;;;;:::i;15602:15::-;:20;:::i;:::-;237:2306:36;;;;;;15595:28:35;14818:1;15584:39;;;;:::i;:::-;;15544:90;;15440:95;15484:40;14818:1;15484:40;237:2306:36;;;-1:-1:-1;9840:51:35;14821:16;;;;14632:509::o;237:2306:36:-;-1:-1:-1;;237:2306:36;;;;;;;:::o;16130:544:35:-;;16315:1;16331:13;16315:1;16366:3;237:2306:36;;16346:18:35;;;;;16389:47;237:2306:36;16425:10:35;;;;:::i;:::-;237:2306:36;;16389:47:35;;:::i;:::-;16385:94;;16366:3;2219:66;;16331:13;;16385:94;16456:8;;2219:66;16456:8;;:::i;:::-;16385:94;;;;;16346:18;;;16545:1;16518:32;16346:18;237:2306:36;;16518:32:35;:::i;:::-;16564:17;;;;16560:108;;16130:544;;:::o;16560:108::-;16604:53;16315:1;16604:53;237:2306:36;;;;;16315:1:35;16604:53;237:2306:36;;-1:-1:-1;;237:2306:36;;;;;;;:::o;:::-;;;;;;;;;;:::o;:::-;;;;;;;;;;:::o;:::-;;;;;;;;;:::o;:::-;;;;;;;;;;:::o;16897:549:35:-;;17024:1;17040:13;17024:1;17075:3;237:2306:36;;17055:18:35;;;;;17098:39;237:2306:36;17126:10:35;;;;:::i;:::-;237:2306:36;;17098:39:35;;:::i;:::-;17094:86;;17075:3;2219:66;;17040:13;;17094:86;17157:8;;2219:66;17157:8;;:::i;:::-;17094:86;;;;;17055:18;;;237:2306:36;;17329:1:35;237:2306:36;;;;;;;;;17344:17:35;;;17340:100;;16897:549;;:::o;17340:100::-;17384:45;17024:1;17384:45;237:2306:36;;;;;17024:1:35;17384:45;13610:440;13956:31;13610:440;13956:22;13610:440;13828:76;13610:440;237:2306:36;;;13877:25:35;;;237:2306:36;;;;;;13877:25:35;;;;;;;:::i;13956:31::-;237:2306:36;;14025:1:35;237:2306:36;;;;;14012:30:35;237:2306:36;;14012:15:35;:30;:::i;237:2306:36:-;;;;;;;;-1:-1:-1;237:2306:36;;-1:-1:-1;237:2306:36;;;-1:-1:-1;237:2306:36;:::o;18469:677:35:-;;;237:2306:36;;;;;;;;;;;;;;18716:37:35;;;;:82;;;18469:677;18712:125;;;18850:25;;237:2306:36;;;;;18850:53:35;18846:96;;237:2306:36;18994:3:35;237:2306:36;;18971:21:35;;;;;237:2306:36;19017:28:35;;;;:::i;:::-;237:2306:36;;;;;;;;;;;;19017:45:35;19049:13;;;;;:::i;19017:45::-;237:2306:36;;19017:45:35;19013:96;;2219:66;;18956:13;;19013:96;19082:12;;;237:2306:36;19082:12:35;:::o;18971:21::-;;;;2219:66;18469:677;:::o;18846:96::-;18919:12;;237:2306:36;18919:12:35;:::o;18716:82::-;18757:26;;;;;237:2306:36;18757:41:35;;18716:82;;;6145:316:93;237:2306:36;;;;;;;2920:29:93;237:2306:36;;;;;;;;;;;;;;;;2920:29:93;237:2306:36;;;;;;;;;;6281:29:93;237:2306:36;;;;;;;;;;;;;;;;6281:29:93;6313:4;237:2306:36;;;;;;;;735:10:121;237:2306:36;;6336:40:93;;237:2306:36;6336:40:93;;6313:4;6390:11;:::o;6698:317::-;237:2306:36;;;;;;;2920:29:93;237:2306:36;;;;;;;;;;;;;;;;2920:29:93;237:2306:36;;;;;;;;;;;6834:29:93;237:2306:36;;;;;;;;;;;;;;;;6834:29:93;237:2306:36;;;;;;;735:10:121;237:2306:36;;6890:40:93;;237:2306:36;6890:40:93;;237:2306:36;6944:11:93;:::o;14234:174:35:-;237:2306:36;;;;;14358:18:35;237:2306:36;;;14347:53:35;;237:2306:36;;;2612:66:35;237:2306:36;;;;;14347:53:35;;;;;;:::i;:::-;237:2306:36;14337:64:35;;14234:174;:::o;237:2306:36:-;;;;;;;;:::i;:::-;22080:1:35;237:2306:36;;;2219:66:35;237:2306:36;;;2219:66:35;237:2306:36:o;:::-;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;-1:-1:-1;;237:2306:36;;;;:::i;1287:390:37:-;1607:20;:29;1287:390;;;;237:2306:36;1508:2:37;237:2306:36;:::i;:::-;;;;;;;;:::i;:::-;1508:2:37;237:2306:36;;;1508:2:37;237:2306:36;:::i;:::-;-1:-1:-1;;1508:2:37;237:2306:36;;;;2219:66:35;;;1521:63:37;1607:20;:::i;:29::-;1648:21;8593:13;237:2306:36;;8593:13:37;:::i;:::-;237:2306:36;;;8624:13:37;;:33;;;1287:390;8616:42;;;:::i;:::-;8679:26;8689:15;-1:-1:-1;8689:15:37;;:::i;:::-;8679:26;:::i;:::-;8715:18;-1:-1:-1;;237:2306:36;1667:1:37;8901:14;;;;;;1600:70;;;;;;;:::i;8917:6::-;8982:5;9046:37;8998:3;9054:21;:16;9060:9;;8982:5;;8605:1;8982:5;237:2306:36;;;;8982:5:37;8979:9;;8943:59;8979:9;8965:37;8979:9;8973:21;:16;8979:9;;;;;:::i;8973:16::-;237:2306:36;;;;;;8973:21:37;8972:29;237:2306:36;;;;;;8965:37:37;1667:1;8943:59;;;:::i;:::-;;9060:9;:::i;9054:16::-;237:2306:36;;;;9046:37:37;1667:1;9020:63;;8756:1;237:2306:36;;9020:63:37;;:::i;:::-;;237:2306:36;8894:204:37;;8624:33;-1:-1:-1;8641:16:37;8624:33;;237:2306:36;;;;;;;:::i;:::-;-1:-1:-1;237:2306:36;;;;;;;:::o;2457:221:38:-;237:2306:36;;:::i;:::-;;2568:58:38;237:2306:36;;;;;;;;;:::i;:::-;2219:66:35;;2568:58:38;;2643:28;;2219:66:35;2457:221:38;:::o;237:2306:36:-;;;;:::o;7796:439:38:-;237:2306:36;;7883:12:38;;;:30;;;;7796:439;237:2306:36;;;;7957:21:38;;;:::i;:::-;7989:14;8013:192;;;;;;;8215:13;7796:439;:::o;8013:192::-;;;;;;;7796:439;:::o;7883:30::-;7911:2;7899:14;;;;7883:30;;;4170:519;4266:12;;;:::i;:::-;237:2306:36;;;4306:14:38;;;:::i;:::-;2219:66:35;;;:::i;:::-;237:2306:36;;;;;;;:::i;:::-;2219:66:35;;;-1:-1:-1;;237:2306:36;;;:::i;:::-;;-1:-1:-1;237:2306:36;;;;;;4404:11:38;;237:2306:36;4404:41:38;:11;;237:2306:36;4418:27:38;;;:::i;:::-;4404:41;;:::i;:::-;-1:-1:-1;4480:179:38;4500:9;;;;;;4669:13;;;4170:519;:::o;4511:3::-;4632:16;4540:19;;2219:66:35;4540:19:38;;:::i;:::-;237:2306:36;;;:::i;:::-;2219:66:35;;;4585:24:38;237:2306:36;4585:24:38;;2219:66:35;4573:36:38;;;;:::i;:::-;;;;;;:::i;:::-;;4632:16;:::i;:::-;4511:3;2219:66:35;4485:13:38;;;237:2306:36;;;;;:::i;:::-;;;;;;;;;;8413:298:38;8545:2;237:2306:36;;8533:14:38;237:2306:36;;8600:11:38;;237:2306:36;8614:1:38;237:2306:36;;;;;;;8625:56:38;8413:298;:::o;8857:379::-;237:2306:36;;8950:12:38;237:2306:36;;9006:21:38;9202:3;9006:21;;:::i;:::-;9059:14;;;;;;:::i;:::-;9109:61;;;;9202:3;;:::i;237:2306:36:-;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;:::i;:::-;;;:::i;:::-;;-1:-1:-1;;237:2306:36;;;;;;:::i;:::-;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;21954:538:35:-;22070:12;;:::i;:::-;22097:13;22080:1;22092:109;22130:3;237:2306:36;;22112:16:35;;;;;22159:31;2219:66;22181:8;;;;;:::i;:::-;;22159:31;;:::i;:::-;22130:3;2219:66;22097:13;;;22112:16;;;;237:2306:36;;22232:2:35;22215:19;;22211:120;;237:2306:36;22411:74:35;22365:29;237:2306:36;;22365:29:35;:::i;:::-;237:2306:36;22411:74:35;22428:37;22435:29;22441:22;237:2306:36;;22441:22:35;:::i;22428:37::-;237:2306:36;;;22411:74:35;;;;;;;:::i;22211:120::-;22274:36;22281:28;22287:21;22257:63;22287:21;;:::i;22274:36::-;22257:63;237:2306:36;;22257:63:35;;;;;;;:::i;237:2306:36:-;;;15559:2:35;237:2306:36;;;;;;;:::o;:::-;;;;;;;;;;;;;:::o;21363:440:35:-;21471:1;237:2306:36;;21457:15:35;:39;;;21363:440;21453:80;;237:2306:36;;21559:2:35;21546:15;;21542:108;;237:2306:36;21726:70:35;21684:25;237:2306:36;;21684:25:35;:::i;:::-;237:2306:36;21726:70:35;21743:37;21750:29;21756:22;237:2306:36;;21756:22:35;:::i;21542:108::-;21601:32;21608:24;21614:17;21584:55;21614:17;;:::i;21457:39::-;21482:6;21492:4;237:2306:36;21476:13:35;21482:6;;;;:::i;21476:13::-;237:2306:36;21476:20:35;21457:39;;237:2306:36;;;;;;;;;;;;:::o;:::-;;-1:-1:-1;237:2306:36;;;:::o;20174:284:35:-;;237:2306:36;20328:3:35;237:2306:36;;20305:21:35;;;;;237:2306:36;20351:13:35;;;;:::i;:::-;237:2306:36;;;;;;;;;;20351:23:35;20347:73;;2219:66;;20290:13;;20676:282;;237:2306:36;20828:3:35;237:2306:36;;20805:21:35;;;;;237:2306:36;20851:13:35;;;;:::i;:::-;237:2306:36;;;;;20851:23:35;20847:73;;2219:66;;20790:13;;8465:649:37;;;8593:13;237:2306:36;;8593:13:37;:::i;:::-;237:2306:36;;;8624:13:37;;:33;;;8465:649;8616:42;;;:::i;:::-;8679:26;8689:15;;;;:::i;8679:26::-;8715:18;;8747:10;8756:1;8747:10;;;:15;8743:118;;8465:649;-1:-1:-1;;237:2306:36;;;8894:204:37;8901:14;;;;;;8465:649;;;;;:::o;8917:6::-;8982:5;9020:63;8756:1;9046:37;8998:3;9054:21;:16;9060:9;;8982:5;8605:1;8982:5;8943:59;8965:37;8982:5;8973:21;8982:5;8979:9;;8982:5;8973:16;8982:5;237:2306:36;;;;8982:5:37;8979:9;;;:::i;8965:37::-;237:2306:36;;;8943:59:37;;8636:1;8943:59;;;:::i;:::-;;9060:9;;:::i;9046:37::-;8636:1;9020:63;237:2306:36;;9020:63:37;;:::i;:::-;;237:2306:36;8894:204:37;;;;8743:118;8808:10;;237:2306:36;8799:26:37;:21;8805:14;;8808:10;;237:2306:36;;;;8808:10:37;8805:14;;:::i;8799:26::-;237:2306:36;;;8636:1:37;8778:55;;;;:::i;:::-;;-1:-1:-1;;8847:3:37;;;:::i;:::-;8743:118;;;;;8624:33;-1:-1:-1;8641:16:37;;;;8624:33;;2316:5431;;2546:1;2557:33;2546:1;237:2306:36;;:::i;:::-;;;;2689:17:37;2685:223;;2976:13;;2546:1;2971:4724;3009:3;237:2306:36;;2991:16:37;;;;;3091:6;;;;:50;;3009:3;3087:97;;3298:6;:47;;;;3009:3;3294:94;;;3514:17;:8;;;;:::i;:17::-;237:2306:36;;;3565:1:37;3550:16;;3546:4139;3565:1;;;3744:7;3716:46;3744:17;:7;;;:::i;:17::-;3716:46;:::i;:::-;3804:56;3878:28;3804:56;;;;;:::i;:::-;3878:28;;;:::i;:::-;237:2306:36;;-1:-1:-1;3925:994:37;;4937:1185;;;237:2306:36;5015:16:37;237:2306:36;;5015:16:37;:::i;:::-;-1:-1:-1;5007:144:37;;237:2306:36;-1:-1:-1;5173:109:37;;5315:7;5351:18;5315:7;;:::i;5173:109::-;5247:12;;;:::i;4937:1185::-;237:2306:36;;;5494:16:37;237:2306:36;;5494:16:37;:::i;:::-;5489:21;;5485:138;;5650:7;5649:17;5650:16;:7;2219:66:35;5650:7:37;;:::i;:::-;;:16;:::i;:::-;5649:17;;237:2306:36;5649:17:37;5650:7;;;5837;:26;:7;;:::i;:::-;;:26;:::i;:::-;5645:459;;2219:66:35;2976:13:37;;;;;5645:459;6054:7;:27;:7;;:::i;:::-;;5445:11:38;;;237:2306:36;;;5522:62:38;;5341:272;;6054:27:37;5645:459;;;3925:994;237:2306:36;;;;;;4718:16:37;237:2306:36;;;4718:16:37;:::i;:::-;-1:-1:-1;4710:149:37;;4888:12;;:::i;3546:4139::-;6146:17;;;;;;6161:2;6146:17;6161:2;;237:2306:36;;6219:36:37;;6235:20;;6451:17;6386:43;6394:34;6400:27;;;;;:::i;6386:43::-;6451:17;;:::i;:::-;6494:12;6504:2;6494:12;;;6490:146;;6662:33;6682:12;;;;:::i;:::-;;6662:33;:::i;:::-;6682:12;;;237:2306:36;;;;6766:16:37;237:2306:36;;;;6766:16:37;:::i;:::-;6761:21;6757:157;;6947:12;;:::i;6658:555::-;6993:12;6992:22;6993:21;:12;;2219:66:35;6993:12:37;;;;;;;:::i;6992:22::-;6993:12;;;7057:31;:12;;;;:::i;6988:225::-;7158:32;:12;;;;:::i;6215:1388::-;237:2306:36;;;7411:16:37;237:2306:36;;7411:16:37;:::i;:::-;7406:21;7402:135;;7566:8;:18;:8;;:::i;6142:1543::-;237:2306:36;;7641:29:37;;;237:2306:36;7641:29:37;;;237:2306:36;;;;;;;;;;;;;11588:19:35;3298:47:37;3336:8;;3324:21;3336:8;;;;:::i;:::-;;3324:21;:::i;:::-;3308:37;;3298:47;;;3091:50;3113:8;:28;:8;;;;:::i;:28::-;3101:40;;;3091:50;;2685:223;2785:78;;;2777:87;2785:78;;2797:66;2785:78;;;2777:87;:::i;:::-;2885:12;;:::i;3469:281:38:-;;3598:11;;;237:2306:36;3583:27:38;237:2306:36;;3583:27:38;:::i;:::-;237:2306:36;;;;;;;;;;;;;;;;;;;;3723:20:38;3469:281;:::o;4838:321::-;237:2306:36;;4918:13:38;4914:31;;4994:11;868:4;4994:11;;237:2306:36;5015:64:38;237:2306:36;5015:64:38;5093:24;5089:42;;5148:4;4838:321;:::o;4914:31::-;4933:12;237:2306:36;4933:12:38;:::o;9434:424::-;237:2306:36;;9518:13:38;9514:27;;237:2306:36;9597:11:38;;;;237:2306:36;;;9611:27:38;;;:::i;:::-;237:2306:36;;;;;;;;;;;;;;;;;;9697:132:38;;9704:16;;;;;;9839:12;;;9434:424;:::o;9697:132::-;9756:20;;;:::i;:::-;237:2306:36;;;;;;;9811:7:38;9736:40;9811:7;;:::i;:::-;9697:132;;;11485:581;11589:64;237:2306:36;11589:64:38;682:4;11667:26;;682:4;;;11709:8;237:2306:36;11709:8:38;:::o;11663:397::-;776:4;11738:25;;:83;;;;11663:397;11734:326;;;11837:8;11844:1;11837:8;:::o;11734:326::-;868:4;11866:24;;868:4;;;11943:35;;:31;;958:4;11943:31;;;:::i;:::-;:35;:::i;11862:198::-;12016:33;;:29;;958:4;12016:29;237:2306:36;11738:83:38;11768:25;868:4;11768:25;;;:52;;11738:83;11768:52;11797:23;958:4;11797:23;;11738:83;;10045:1263;10171:64;;-1:-1:-1;10171:64:38;;682:4;10249:26;;682:4;;;10291:11;;10301:1;10045:1263;:::o;10245:1032::-;776:4;10323:25;;776:4;;;10374:26;;:30;:26;;:::i;10319:958::-;868:4;10425:24;;868:4;;;10465:385;;;;;;;;;;;;;;;;237:2306:36;:::o;10421:856:38:-;958:4;10870:23;;958:4;;;10919:24;;:28;:24;;:::i;10866:411::-;10978:289;;;;;;;;;;;;;;;;237:2306:36;:::o;1035:2:38:-;;;;;;;;;:::o;12279:770::-;;;12360:8;;12356:21;;12441:16;1035:2;12441:16;;;;;12642:7;12638:405;;12279:770;;;:::o;12638:405::-;12764:24;12772:15;12764:28;12772:15;;:::i;:::-;12764:24;:::i;:::-;:28;:::i;:::-;12806:227;;;;;;;;;;;;12279:770::o;12459:16::-;12491:65;;;;;;1035:2;237:2306:36;;;;;;;12600:17:38;1035:2;237:2306:36;;;;;;;12459:16:38;-1:-1:-1;;237:2306:36;;;;;;12434:194:38;237:2306:36;;:::i;6262:337:38:-;6372:19;237:2306:36;;6372:19:38;:::i;:::-;237:2306:36;;;6405:18:38;6401:37;;6542:11;6470:57;6560:8;6542:11;;237:2306:36;;;6470:57:38;;;;6560:8;;:::i;6401:37::-;6425:13;;:::o;22655:430:35:-;-1:-1:-1;22740:19:35;;22800:8;;;22895:17;;;;:::i;:::-;22922:11;22943:116;22968:5;;;23068:10;;22655:430;:::o;22975:3::-;22998:5;;;:::i;:::-;22994:31;237:2306:36;;;;;-1:-1:-1;22994:31:35;;;;:::i;:::-;;237:2306:36;;22975:3:35;237:2306:36;;;;-1:-1:-1;;237:2306:36;22948:18:35;;;;22793:73;22824:8;;;;:::i;:::-;237:2306:36;22854:1:35;237:2306:36;22793:73:35;;;2419:778:131;237:2306:36;;;2419:778:131;2609:2;2589:22;;2609:2;;3041:25;2825:196;;;;;;;;;;;;;;;-1:-1:-1;2825:196:131;3041:25;;:::i;:::-;3034:32;;;;;:::o;2585:606::-;3097:83;;3113:1;3097:83;3117:35;3097:83;;:::o;10983:270:37:-;237:2306:36;;11094:2:37;11082:14;;11094:2;;;5445:11:38;11094:2:37;5445:11:38;;237:2306:36;;;5522:62:38;;11112:32:37;:::o;11078:169::-;5445:11:38;11094:2:37;5445:11:38;237:2306:36;5522:62:38;237:2306:36;;11094:2:37;11192:43;;237:2306:36;;;11094:2:37;11192:43;;;237:2306:36;11192:43:37;;:::i;7932:335::-;8047:1;237:2306:36;;8035:13:37;8031:56;;8130:11;;237:2306:36;8151:60:37;237:2306:36;8151:60:37;8232:4;8227:9;;7932:335::o;5788:270:38:-;5909:21;5788:270;5909:21;:::i;:::-;5964:65;;5788:270;:::o;9355:729:37:-;;237:2306:36;;9485:13:37;237:2306:36;;9551:3:37;9531:17;:12;9537:5;;;;:::i;9531:17::-;:23;9596:16;;;9628:10;10051:25;9637:1;237:2306:36;9592:434:37;10051:25;:::i;9592:434::-;9702:1;9687:16;;9702:1;;9719:10;10051:25;9702:1;237:2306:36;9683:343:37;10051:25;:::i;9683:343::-;9793:1;9778:16;;9793:1;;9810:10;10051:25;9793:1;9702;9774:252;10051:25;:::i;9774:252::-;9883:1;9868:16;9883:1;;10051:25;9702:1;9924:13;9864:162;10051:25;:::i;10366:320::-;;;237:2306:36;10561:3:37;237:2306:36;;;;;;;;;;10518:24:37;;:41;;;10561:3;10518:41;;;10584:16;237:2306:36;;10584:16:37;;:::i;:::-;237:2306:36;;;10604:5:37;;;;:::i;:::-;237:2306:36;;10584:25:37;;10580:72;;10561:3;;;:::i;:::-;10511:151;;10580:72;10629:8;;;;;:::o;10518:41::-;;;;;;10366:320;:::o;10518:41::-;237:2306:36;;;10546:13:37;;10518:41;;7129:1551:131;;;8209:66;8196:79;;8192:164;;237:2306:36;;;;;;-1:-1:-1;237:2306:36;;;;;;;;;;;;;;;;;;;8467:24:131;;;;;;;;;-1:-1:-1;8467:24:131;237:2306:36;;;8505:20:131;8501:113;;8624:49;-1:-1:-1;8624:49:131;-1:-1:-1;7129:1551:131;:::o;8501:113::-;8541:62;-1:-1:-1;8541:62:131;8467:24;8541:62;-1:-1:-1;8541:62:131;:::o;8467:24::-;237:2306:36;;;;;;;;;8192:164:131;8291:54;;;8307:1;8291:54;8311:30;8291:54;;:::o","linkReferences":{}},"methodIdentifiers":{"DEFAULT_ADMIN_ROLE()":"a217fddf","PROOF_SUBMITTER_ROLE()":"5972185a","getClientState()":"ef913a4b","getConsensusState(uint64)":"edce8bdc","getRoleAdmin(bytes32)":"248a9ca3","grantRole(bytes32,address)":"2f2ff15d","hasRole(bytes32,address)":"91d14854","misbehaviour(bytes)":"ddba6537","renounceRole(bytes32,address)":"36568abe","revokeRole(bytes32,address)":"d547741f","supportsInterface(bytes4)":"01ffc9a7","updateClient(bytes)":"0bece356","verifyMembership((bytes,(uint64,uint64),bytes[],bytes))":"682ed5f0","verifyNonMembership((bytes,(uint64,uint64),bytes[]))":"4d6d9ffb"},"rawMetadata":"{\"compiler\":{\"version\":\"0.8.28+commit.7893614a\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"ibcRouter\",\"type\":\"address\"},{\"internalType\":\"uint64\",\"name\":\"initialTrustedHeight\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"initialTrustedTimestamp\",\"type\":\"uint64\"},{\"internalType\":\"bytes32\",\"name\":\"initialTrustedStorageRoot\",\"type\":\"bytes32\"},{\"internalType\":\"address[]\",\"name\":\"initialTrustedValidators\",\"type\":\"address[]\"},{\"internalType\":\"uint64\",\"name\":\"trustingPeriod\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"maxClockDrift\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"roleManager\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"AccessControlBadConfirmation\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"internalType\":\"bytes32\",\"name\":\"neededRole\",\"type\":\"bytes32\"}],\"name\":\"AccessControlUnauthorizedAccount\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"revisionHeight\",\"type\":\"uint64\"}],\"name\":\"ConflictingConsensusState\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"trustedTimestamp\",\"type\":\"uint64\"},{\"internalType\":\"uint256\",\"name\":\"currentTimestamp\",\"type\":\"uint256\"},{\"internalType\":\"uint64\",\"name\":\"trustingPeriod\",\"type\":\"uint64\"}],\"name\":\"ConsensusStateExpired\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"revisionHeight\",\"type\":\"uint64\"}],\"name\":\"ConsensusStateNotFound\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"signer\",\"type\":\"address\"}],\"name\":\"DuplicateCommitSealSigner\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"validator\",\"type\":\"address\"}],\"name\":\"DuplicateValidator\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"EmptyValidatorSet\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"currentTimestamp\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"headerTimestamp\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxClockDrift\",\"type\":\"uint256\"}],\"name\":\"HeaderFromFuture\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"actual\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"required\",\"type\":\"uint256\"}],\"name\":\"InsufficientTrustedValidatorOverlap\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"actual\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"required\",\"type\":\"uint256\"}],\"name\":\"InsufficientValidatorQuorum\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidCommitSeal\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"expectedValue\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"actualValue\",\"type\":\"bytes32\"}],\"name\":\"InvalidCommitmentValue\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"actualDifficulty\",\"type\":\"uint256\"}],\"name\":\"InvalidDifficulty\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"length\",\"type\":\"uint256\"}],\"name\":\"InvalidECDSASignatureLength\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"itemsLength\",\"type\":\"uint256\"}],\"name\":\"InvalidExtraDataFormat\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"itemsLength\",\"type\":\"uint256\"}],\"name\":\"InvalidHeaderFormat\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidHeaderHeight\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"actualMixHash\",\"type\":\"bytes32\"}],\"name\":\"InvalidMixHash\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"actualNonce\",\"type\":\"bytes\"}],\"name\":\"InvalidNonce\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"actualOmmersHash\",\"type\":\"bytes32\"}],\"name\":\"InvalidOmmersHash\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"expectedLength\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"actualLength\",\"type\":\"uint256\"}],\"name\":\"InvalidPathLength\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"providedRevisionNumber\",\"type\":\"uint64\"}],\"name\":\"InvalidRevisionNumber\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"validator\",\"type\":\"address\"}],\"name\":\"InvalidValidatorAddress\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"length\",\"type\":\"uint256\"}],\"name\":\"InvalidValidatorAddressLength\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"expectedLength\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"actualLength\",\"type\":\"uint256\"}],\"name\":\"InvalidValueLength\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"UnsupportedMisbehaviour\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"actualValue\",\"type\":\"bytes32\"}],\"name\":\"ValueExists\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"previousAdminRole\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"newAdminRole\",\"type\":\"bytes32\"}],\"name\":\"RoleAdminChanged\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"RoleGranted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"RoleRevoked\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"DEFAULT_ADMIN_ROLE\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"PROOF_SUBMITTER_ROLE\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getClientState\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"revisionHeight\",\"type\":\"uint64\"}],\"name\":\"getConsensusState\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"}],\"name\":\"getRoleAdmin\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"grantRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"hasRole\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"name\":\"misbehaviour\",\"outputs\":[],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"callerConfirmation\",\"type\":\"address\"}],\"name\":\"renounceRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"revokeRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes4\",\"name\":\"interfaceId\",\"type\":\"bytes4\"}],\"name\":\"supportsInterface\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"updateMsg\",\"type\":\"bytes\"}],\"name\":\"updateClient\",\"outputs\":[{\"internalType\":\"enum ILightClientMsgs.UpdateResult\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes\",\"name\":\"proof\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"uint64\",\"name\":\"revisionNumber\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"revisionHeight\",\"type\":\"uint64\"}],\"internalType\":\"struct IICS02ClientMsgs.Height\",\"name\":\"proofHeight\",\"type\":\"tuple\"},{\"internalType\":\"bytes[]\",\"name\":\"path\",\"type\":\"bytes[]\"},{\"internalType\":\"bytes\",\"name\":\"value\",\"type\":\"bytes\"}],\"internalType\":\"struct ILightClientMsgs.MsgVerifyMembership\",\"name\":\"msg_\",\"type\":\"tuple\"}],\"name\":\"verifyMembership\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes\",\"name\":\"proof\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"uint64\",\"name\":\"revisionNumber\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"revisionHeight\",\"type\":\"uint64\"}],\"internalType\":\"struct IICS02ClientMsgs.Height\",\"name\":\"proofHeight\",\"type\":\"tuple\"},{\"internalType\":\"bytes[]\",\"name\":\"path\",\"type\":\"bytes[]\"}],\"internalType\":\"struct ILightClientMsgs.MsgVerifyNonMembership\",\"name\":\"msg_\",\"type\":\"tuple\"}],\"name\":\"verifyNonMembership\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"errors\":{\"AccessControlBadConfirmation()\":[{\"details\":\"The caller of a function is not the expected one. NOTE: Don't confuse with {AccessControlUnauthorizedAccount}.\"}],\"AccessControlUnauthorizedAccount(address,bytes32)\":[{\"details\":\"The `account` is missing a role.\"}],\"ConflictingConsensusState(uint64)\":[{\"params\":{\"revisionHeight\":\"The conflicting revision height.\"}}],\"ConsensusStateExpired(uint64,uint256,uint64)\":[{\"params\":{\"currentTimestamp\":\"The current block timestamp.\",\"trustedTimestamp\":\"Timestamp of the trusted consensus state.\",\"trustingPeriod\":\"The configured trusting period.\"}}],\"ConsensusStateNotFound(uint64)\":[{\"params\":{\"revisionHeight\":\"The requested revision height.\"}}],\"DuplicateCommitSealSigner(address)\":[{\"params\":{\"signer\":\"The duplicate signer address.\"}}],\"DuplicateValidator(address)\":[{\"params\":{\"validator\":\"The duplicate validator address.\"}}],\"HeaderFromFuture(uint256,uint256,uint256)\":[{\"params\":{\"currentTimestamp\":\"The current block timestamp.\",\"headerTimestamp\":\"The submitted header timestamp.\",\"maxClockDrift\":\"The configured maximum clock drift.\"}}],\"InsufficientTrustedValidatorOverlap(uint256,uint256)\":[{\"params\":{\"actual\":\"The number of trusted validators that signed.\",\"required\":\"The minimum required trusted signer count.\"}}],\"InsufficientValidatorQuorum(uint256,uint256)\":[{\"params\":{\"actual\":\"The number of new validators that signed.\",\"required\":\"The minimum required signer count.\"}}],\"InvalidCommitmentValue(bytes32,bytes32)\":[{\"params\":{\"actualValue\":\"The proven commitment value.\",\"expectedValue\":\"The expected commitment value.\"}}],\"InvalidDifficulty(uint256)\":[{\"params\":{\"actualDifficulty\":\"The difficulty found in the header.\"}}],\"InvalidECDSASignatureLength(uint256)\":[{\"params\":{\"length\":\"The invalid signature length.\"}}],\"InvalidExtraDataFormat(uint256)\":[{\"params\":{\"itemsLength\":\"The decoded `extraData` item count.\"}}],\"InvalidHeaderFormat(uint256)\":[{\"params\":{\"itemsLength\":\"The decoded header item count.\"}}],\"InvalidMixHash(bytes32)\":[{\"params\":{\"actualMixHash\":\"The mix hash found in the header.\"}}],\"InvalidNonce(bytes)\":[{\"params\":{\"actualNonce\":\"The nonce found in the header.\"}}],\"InvalidOmmersHash(bytes32)\":[{\"params\":{\"actualOmmersHash\":\"The ommers hash found in the header.\"}}],\"InvalidPathLength(uint256,uint256)\":[{\"params\":{\"actualLength\":\"The actual path length.\",\"expectedLength\":\"The expected path length.\"}}],\"InvalidRevisionNumber(uint64)\":[{\"params\":{\"providedRevisionNumber\":\"The non-zero revision number.\"}}],\"InvalidValidatorAddress(address)\":[{\"params\":{\"validator\":\"The invalid validator address.\"}}],\"InvalidValidatorAddressLength(uint256)\":[{\"params\":{\"length\":\"The decoded validator address length.\"}}],\"InvalidValueLength(uint256,uint256)\":[{\"params\":{\"actualLength\":\"The actual value length.\",\"expectedLength\":\"The expected value length.\"}}],\"ValueExists(bytes32)\":[{\"params\":{\"actualValue\":\"The value found at the proven storage slot.\"}}]},\"events\":{\"RoleAdminChanged(bytes32,bytes32,bytes32)\":{\"details\":\"Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite {RoleAdminChanged} not being emitted to signal this.\"},\"RoleGranted(bytes32,address,address)\":{\"details\":\"Emitted when `account` is granted `role`. `sender` is the account that originated the contract call. This account bears the admin role (for the granted role). Expected in cases where the role was granted using the internal {AccessControl-_grantRole}.\"},\"RoleRevoked(bytes32,address,address)\":{\"details\":\"Emitted when `account` is revoked `role`. `sender` is the account that originated the contract call: - if using `revokeRole`, it is the admin role bearer - if using `renounceRole`, it is the role bearer (i.e. `account`)\"}},\"kind\":\"dev\",\"methods\":{\"constructor\":{\"params\":{\"ibcRouter\":\"Counterparty ICS26 router address whose storage is proven.\",\"initialTrustedHeight\":\"Initial trusted Besu height.\",\"initialTrustedStorageRoot\":\"Initial trusted storage root of `ibcRouter`.\",\"initialTrustedTimestamp\":\"Initial trusted header timestamp in seconds.\",\"initialTrustedValidators\":\"Initial trusted validator set.\",\"maxClockDrift\":\"Maximum allowed future drift in seconds for submitted headers.\",\"roleManager\":\"Address that administers proof submission; if zero, proof submission is open.\",\"trustingPeriod\":\"Maximum age in seconds for trusted consensus states.\"}},\"getClientState()\":{\"returns\":{\"_0\":\"The client state.\"}},\"getConsensusState(uint64)\":{\"params\":{\"revisionHeight\":\"The revision height to query.\"},\"returns\":{\"_0\":\"The ABI-encoded consensus state.\"}},\"getRoleAdmin(bytes32)\":{\"details\":\"Returns the admin role that controls `role`. See {grantRole} and {revokeRole}. To change a role's admin, use {_setRoleAdmin}.\"},\"grantRole(bytes32,address)\":{\"details\":\"Grants `role` to `account`. If `account` had not been already granted `role`, emits a {RoleGranted} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleGranted} event.\"},\"hasRole(bytes32,address)\":{\"details\":\"Returns `true` if `account` has been granted `role`.\"},\"misbehaviour(bytes)\":{\"params\":{\"misbehaviourMsg\":\"The misbehaviour message\"}},\"renounceRole(bytes32,address)\":{\"details\":\"Revokes `role` from the calling account. Roles are often managed via {grantRole} and {revokeRole}: this function's purpose is to provide a mechanism for accounts to lose their privileges if they are compromised (such as when a trusted device is misplaced). If the calling account had been revoked `role`, emits a {RoleRevoked} event. Requirements: - the caller must be `callerConfirmation`. May emit a {RoleRevoked} event.\"},\"revokeRole(bytes32,address)\":{\"details\":\"Revokes `role` from `account`. If `account` had been granted `role`, emits a {RoleRevoked} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleRevoked} event.\"},\"supportsInterface(bytes4)\":{\"details\":\"Returns true if this contract implements the interface defined by `interfaceId`. See the corresponding https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[ERC section] to learn more about how these ids are created. This function call must use less than 30 000 gas.\"},\"updateClient(bytes)\":{\"params\":{\"updateMsg\":\"The encoded update message e.g., an SP1 proof.\"},\"returns\":{\"_0\":\"The result of the update operation\"}},\"verifyMembership((bytes,(uint64,uint64),bytes[],bytes))\":{\"details\":\"Notice that this message is not view, as it may update the client state for caching purposes.\",\"params\":{\"msg_\":\"The membership message\"},\"returns\":{\"_0\":\"The unix timestamp of the verification height in the counterparty chain in seconds.\"}},\"verifyNonMembership((bytes,(uint64,uint64),bytes[]))\":{\"details\":\"Notice that this message is not view, as it may update the client state for caching purposes.\",\"params\":{\"msg_\":\"The membership message\"},\"returns\":{\"_0\":\"The unix timestamp of the verification height in the counterparty chain in seconds.\"}}},\"title\":\"Besu QBFT Light Client\",\"version\":1},\"userdoc\":{\"errors\":{\"ConflictingConsensusState(uint64)\":[{\"notice\":\"A different consensus state already exists at the submitted height.\"}],\"ConsensusStateExpired(uint64,uint256,uint64)\":[{\"notice\":\"The trusted consensus state is outside the trusting period.\"}],\"ConsensusStateNotFound(uint64)\":[{\"notice\":\"No consensus state exists for the requested height.\"}],\"DuplicateCommitSealSigner(address)\":[{\"notice\":\"A commit seal signer appears more than once.\"}],\"DuplicateValidator(address)\":[{\"notice\":\"A validator appears more than once.\"}],\"EmptyValidatorSet()\":[{\"notice\":\"The validator set is empty.\"}],\"HeaderFromFuture(uint256,uint256,uint256)\":[{\"notice\":\"The submitted header timestamp is too far in the future.\"}],\"InsufficientTrustedValidatorOverlap(uint256,uint256)\":[{\"notice\":\"The submitted signers do not overlap enough with the trusted validator set.\"}],\"InsufficientValidatorQuorum(uint256,uint256)\":[{\"notice\":\"The submitted signers do not meet quorum for the new validator set.\"}],\"InvalidCommitSeal()\":[{\"notice\":\"A commit seal did not recover a valid signer.\"}],\"InvalidCommitmentValue(bytes32,bytes32)\":[{\"notice\":\"A proven commitment value does not match the expected value.\"}],\"InvalidDifficulty(uint256)\":[{\"notice\":\"The Besu BFT difficulty is invalid.\"}],\"InvalidECDSASignatureLength(uint256)\":[{\"notice\":\"An ECDSA signature has an invalid length.\"}],\"InvalidExtraDataFormat(uint256)\":[{\"notice\":\"The submitted `extraData` field has an invalid RLP item count.\"}],\"InvalidHeaderFormat(uint256)\":[{\"notice\":\"The submitted header has an invalid RLP item count.\"}],\"InvalidHeaderHeight()\":[{\"notice\":\"The submitted header height is zero.\"}],\"InvalidMixHash(bytes32)\":[{\"notice\":\"The Besu BFT mix hash is invalid.\"}],\"InvalidNonce(bytes)\":[{\"notice\":\"The Besu BFT nonce is invalid.\"}],\"InvalidOmmersHash(bytes32)\":[{\"notice\":\"The ommers hash is invalid.\"}],\"InvalidPathLength(uint256,uint256)\":[{\"notice\":\"A proof path has an invalid length.\"}],\"InvalidRevisionNumber(uint64)\":[{\"notice\":\"The revision number must be zero for Besu light client heights.\"}],\"InvalidValidatorAddress(address)\":[{\"notice\":\"A validator address is invalid.\"}],\"InvalidValidatorAddressLength(uint256)\":[{\"notice\":\"A validator address has an invalid byte length.\"}],\"InvalidValueLength(uint256,uint256)\":[{\"notice\":\"A membership value has an invalid length.\"}],\"UnsupportedMisbehaviour()\":[{\"notice\":\"Misbehaviour handling is not supported by this client.\"}],\"ValueExists(bytes32)\":[{\"notice\":\"A non-membership proof found an existing value.\"}]},\"kind\":\"user\",\"methods\":{\"PROOF_SUBMITTER_ROLE()\":{\"notice\":\"Role allowed to submit client updates and proof verifications.\"},\"constructor\":{\"notice\":\"Creates a Besu QBFT light client from an initial trusted consensus state.\"},\"getClientState()\":{\"notice\":\"Returns the client state.\"},\"getConsensusState(uint64)\":{\"notice\":\"Returns the encoded consensus state for a revision height.\"},\"misbehaviour(bytes)\":{\"notice\":\"Misbehaviour handling, moves the light client to the frozen state if misbehaviour is detected\"},\"updateClient(bytes)\":{\"notice\":\"Updating the client and consensus state\"},\"verifyMembership((bytes,(uint64,uint64),bytes[],bytes))\":{\"notice\":\"Querying the membership of a key-value pair\"},\"verifyNonMembership((bytes,(uint64,uint64),bytes[]))\":{\"notice\":\"Querying the non-membership of a key\"}},\"notice\":\"Verifies Besu QBFT headers and ICS26 router storage proofs.\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/light-clients/besu/BesuQBFTLightClient.sol\":\"BesuQBFTLightClient\"},\"evmVersion\":\"cancun\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"none\"},\"optimizer\":{\"enabled\":true,\"runs\":10000},\"remappings\":[\":@openzeppelin-contracts/=node_modules/@openzeppelin/contracts/\",\":@openzeppelin-upgradeable/=node_modules/@openzeppelin/contracts-upgradeable/\",\":@openzeppelin/=node_modules/@openzeppelin/\",\":@sp1-contracts/=node_modules/sp1-contracts/contracts/src/\",\":@uniswap/permit2/=node_modules/@uniswap/permit2/\",\":forge-std/=node_modules/forge-std/src/\",\":sp1-contracts/=node_modules/sp1-contracts/\"],\"viaIR\":true},\"sources\":{\"contracts/interfaces/ILightClient.sol\":{\"keccak256\":\"0x3b2361546ee834a442d844c979fbad3458ee13146b093f585587a09e19a266af\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://5b5d53101bb598f14a79cb1092479736fa18e8f84945ea6ef80f4dac84466042\",\"dweb:/ipfs/QmaTCo6M3Z9aYCSX65AQtixo1sB4ymQUDAgTXSKHqJHGDh\"]},\"contracts/light-clients/besu/BesuLightClientBase.sol\":{\"keccak256\":\"0xc6e53bf0a6dc8d40d819e2f735bbae57c97454974d622901eb2361143b388529\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://c1c65ba0c1b91751f62c769a6d892371cc8af598116217643acab4a3ce470435\",\"dweb:/ipfs/Qmf1pqQC7iELqiKnSyjAPsTFYFsyWzxHez7FLjs8jax7Km\"]},\"contracts/light-clients/besu/BesuQBFTLightClient.sol\":{\"keccak256\":\"0xaeb51b2596e5959273edc43f9db73effe6c8f0f05bdedda140db66e2dfdd0fea\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://28beb01f795950c145576718eb64a4c65948c5c04db20d9b9105d416ada277b4\",\"dweb:/ipfs/Qmb2CjEjmrF8pFj4eo9mCfRA2VWCVQ5H1F81DA9sBtvaVA\"]},\"contracts/light-clients/besu/MPTProof.sol\":{\"keccak256\":\"0x9ab26e6445b20541e8725b190006444d3b16eb3e021174e280451f934d9535c6\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://b6f3fd58b06b942a454bb9b21e9be40a2dab8a09f78e75ff4357c8afbc7e2d5b\",\"dweb:/ipfs/QmPeUwNScDiU91Xx4UQduYjyCPALYLPq73ZUMEn8Nr1rTG\"]},\"contracts/light-clients/besu/RLPReader.sol\":{\"keccak256\":\"0xa64ad17e6da7fed2bd206df52189286694339a8061dc5d158e717eda982af1d9\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://7020db2fe854e90e1b791e0e587610fc26bed3073ba1811faa275a1d8bf3c2c7\",\"dweb:/ipfs/QmdXdKghNFZSX7N9qD6BsKuJQdrFoqatsVWvHRL7vJCmeP\"]},\"contracts/light-clients/besu/errors/IBesuLightClientErrors.sol\":{\"keccak256\":\"0xfb8d8e28c81a48e1165b9d9e69406208fbb0ced1b30d9ef3293112562ffbb448\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://0d3d314a005ada41d997a6e5b254ebd70066c3ccd2e6306249c258c4a13c3623\",\"dweb:/ipfs/QmbRH23Vh7Xp1eXQmfnafMyTebuihQTLfRYeq6BbGJfYnY\"]},\"contracts/light-clients/besu/msgs/IBesuLightClientMsgs.sol\":{\"keccak256\":\"0x3fc43a3daaae2f89dca4cadbc99ea71086282f987b47a95c13489ae3384532cf\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://36083aa6833eb30d26023f7dc0b2e22b7d0723d922fcd50cf86999edc9aeb474\",\"dweb:/ipfs/QmbPv9KJj5AuJkgppuyuoaTHtiw91Qkx1tdkf1R5D4wad2\"]},\"contracts/msgs/IICS02ClientMsgs.sol\":{\"keccak256\":\"0x03d1265eae327c3744d774bf22a30d845233d50664921c9aa57cef2d71fd89d2\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://89900781cc5c60540a237d92d42745ea6165765ee8fb4d50e8137a717195cc75\",\"dweb:/ipfs/Qmbx5p8gZ8sEMMeZytXsLee49JUayhAaoJ2yxX93WUrvQo\"]},\"contracts/msgs/ILightClientMsgs.sol\":{\"keccak256\":\"0x8d1e56ab166a7b4aa6999708e3214a4645ebbc3835c2b2a4c255c9923eebafde\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://8bd4200dc04d950c0f050623fa9a8accdbec877fd446c039d4dd6c678bdf1513\",\"dweb:/ipfs/QmZQTViaA7N6BVNDzJ1Z6w799PrPoE4ajPueZSPwX4sGZ9\"]},\"node_modules/@openzeppelin/contracts/access/AccessControl.sol\":{\"keccak256\":\"0x4686ec784d75f95beaf2bf5b5f26e5f946d4c864aaee9c3c62bdc18381f5e017\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://26710ca191913f3c9df542079c4a6dcff02968e92d4f7357daefef9fbe72a19c\",\"dweb:/ipfs/QmanHbeWuBbVEqXySHa1zhm2rExjYpChDBubBaJNTCa2JB\"]},\"node_modules/@openzeppelin/contracts/access/IAccessControl.sol\":{\"keccak256\":\"0xbff9f59c84e5337689161ce7641c0ef8e872d6a7536fbc1f5133f128887aba3c\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://b308f882e796f7b79c9502deacb0a62983035c6f6f4e962b319ba6a1f4a77d3d\",\"dweb:/ipfs/QmaWCW7ahEQqFjwhSUhV7Ae7WhfNvzSpE7DQ58hvEooqPL\"]},\"node_modules/@openzeppelin/contracts/utils/Context.sol\":{\"keccak256\":\"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://6a708e8a5bdb1011c2c381c9a5cfd8a9a956d7d0a9dc1bd8bcdaf52f76ef2f12\",\"dweb:/ipfs/Qmax9WHBnVsZP46ZxEMNRQpLQnrdE4dK8LehML1Py8FowF\"]},\"node_modules/@openzeppelin/contracts/utils/cryptography/ECDSA.sol\":{\"keccak256\":\"0xbeb5cad8aaabe0d35d2ec1a8414d91e81e5a8ca679add4cf57e2f33476861f40\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://ebb272a5ee2da4e8bd5551334e0ce8dce4e9c56a04570d6bf046d260fab3116a\",\"dweb:/ipfs/QmNw6RyM769qcqFocDq6HJMG2WiEnQbvizpRaUXsACHho2\"]},\"node_modules/@openzeppelin/contracts/utils/introspection/ERC165.sol\":{\"keccak256\":\"0x2d9dc2fe26180f74c11c13663647d38e259e45f95eb88f57b61d2160b0109d3e\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://81233d1f98060113d9922180bb0f14f8335856fe9f339134b09335e9f678c377\",\"dweb:/ipfs/QmWh6R35SarhAn4z2wH8SU456jJSYL2FgucfTFgbHJJN4E\"]},\"node_modules/@openzeppelin/contracts/utils/introspection/IERC165.sol\":{\"keccak256\":\"0x8891738ffe910f0cf2da09566928589bf5d63f4524dd734fd9cedbac3274dd5c\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://971f954442df5c2ef5b5ebf1eb245d7105d9fbacc7386ee5c796df1d45b21617\",\"dweb:/ipfs/QmadRjHbkicwqwwh61raUEapaVEtaLMcYbQZWs9gUkgj3u\"]}},\"version\":1}","metadata":{"compiler":{"version":"0.8.28+commit.7893614a"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"address","name":"ibcRouter","type":"address"},{"internalType":"uint64","name":"initialTrustedHeight","type":"uint64"},{"internalType":"uint64","name":"initialTrustedTimestamp","type":"uint64"},{"internalType":"bytes32","name":"initialTrustedStorageRoot","type":"bytes32"},{"internalType":"address[]","name":"initialTrustedValidators","type":"address[]"},{"internalType":"uint64","name":"trustingPeriod","type":"uint64"},{"internalType":"uint64","name":"maxClockDrift","type":"uint64"},{"internalType":"address","name":"roleManager","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"type":"error","name":"AccessControlBadConfirmation"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bytes32","name":"neededRole","type":"bytes32"}],"type":"error","name":"AccessControlUnauthorizedAccount"},{"inputs":[{"internalType":"uint64","name":"revisionHeight","type":"uint64"}],"type":"error","name":"ConflictingConsensusState"},{"inputs":[{"internalType":"uint64","name":"trustedTimestamp","type":"uint64"},{"internalType":"uint256","name":"currentTimestamp","type":"uint256"},{"internalType":"uint64","name":"trustingPeriod","type":"uint64"}],"type":"error","name":"ConsensusStateExpired"},{"inputs":[{"internalType":"uint64","name":"revisionHeight","type":"uint64"}],"type":"error","name":"ConsensusStateNotFound"},{"inputs":[{"internalType":"address","name":"signer","type":"address"}],"type":"error","name":"DuplicateCommitSealSigner"},{"inputs":[{"internalType":"address","name":"validator","type":"address"}],"type":"error","name":"DuplicateValidator"},{"inputs":[],"type":"error","name":"EmptyValidatorSet"},{"inputs":[{"internalType":"uint256","name":"currentTimestamp","type":"uint256"},{"internalType":"uint256","name":"headerTimestamp","type":"uint256"},{"internalType":"uint256","name":"maxClockDrift","type":"uint256"}],"type":"error","name":"HeaderFromFuture"},{"inputs":[{"internalType":"uint256","name":"actual","type":"uint256"},{"internalType":"uint256","name":"required","type":"uint256"}],"type":"error","name":"InsufficientTrustedValidatorOverlap"},{"inputs":[{"internalType":"uint256","name":"actual","type":"uint256"},{"internalType":"uint256","name":"required","type":"uint256"}],"type":"error","name":"InsufficientValidatorQuorum"},{"inputs":[],"type":"error","name":"InvalidCommitSeal"},{"inputs":[{"internalType":"bytes32","name":"expectedValue","type":"bytes32"},{"internalType":"bytes32","name":"actualValue","type":"bytes32"}],"type":"error","name":"InvalidCommitmentValue"},{"inputs":[{"internalType":"uint256","name":"actualDifficulty","type":"uint256"}],"type":"error","name":"InvalidDifficulty"},{"inputs":[{"internalType":"uint256","name":"length","type":"uint256"}],"type":"error","name":"InvalidECDSASignatureLength"},{"inputs":[{"internalType":"uint256","name":"itemsLength","type":"uint256"}],"type":"error","name":"InvalidExtraDataFormat"},{"inputs":[{"internalType":"uint256","name":"itemsLength","type":"uint256"}],"type":"error","name":"InvalidHeaderFormat"},{"inputs":[],"type":"error","name":"InvalidHeaderHeight"},{"inputs":[{"internalType":"bytes32","name":"actualMixHash","type":"bytes32"}],"type":"error","name":"InvalidMixHash"},{"inputs":[{"internalType":"bytes","name":"actualNonce","type":"bytes"}],"type":"error","name":"InvalidNonce"},{"inputs":[{"internalType":"bytes32","name":"actualOmmersHash","type":"bytes32"}],"type":"error","name":"InvalidOmmersHash"},{"inputs":[{"internalType":"uint256","name":"expectedLength","type":"uint256"},{"internalType":"uint256","name":"actualLength","type":"uint256"}],"type":"error","name":"InvalidPathLength"},{"inputs":[{"internalType":"uint64","name":"providedRevisionNumber","type":"uint64"}],"type":"error","name":"InvalidRevisionNumber"},{"inputs":[{"internalType":"address","name":"validator","type":"address"}],"type":"error","name":"InvalidValidatorAddress"},{"inputs":[{"internalType":"uint256","name":"length","type":"uint256"}],"type":"error","name":"InvalidValidatorAddressLength"},{"inputs":[{"internalType":"uint256","name":"expectedLength","type":"uint256"},{"internalType":"uint256","name":"actualLength","type":"uint256"}],"type":"error","name":"InvalidValueLength"},{"inputs":[],"type":"error","name":"UnsupportedMisbehaviour"},{"inputs":[{"internalType":"bytes32","name":"actualValue","type":"bytes32"}],"type":"error","name":"ValueExists"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32","indexed":true},{"internalType":"bytes32","name":"previousAdminRole","type":"bytes32","indexed":true},{"internalType":"bytes32","name":"newAdminRole","type":"bytes32","indexed":true}],"type":"event","name":"RoleAdminChanged","anonymous":false},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32","indexed":true},{"internalType":"address","name":"account","type":"address","indexed":true},{"internalType":"address","name":"sender","type":"address","indexed":true}],"type":"event","name":"RoleGranted","anonymous":false},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32","indexed":true},{"internalType":"address","name":"account","type":"address","indexed":true},{"internalType":"address","name":"sender","type":"address","indexed":true}],"type":"event","name":"RoleRevoked","anonymous":false},{"inputs":[],"stateMutability":"view","type":"function","name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"PROOF_SUBMITTER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"getClientState","outputs":[{"internalType":"bytes","name":"","type":"bytes"}]},{"inputs":[{"internalType":"uint64","name":"revisionHeight","type":"uint64"}],"stateMutability":"view","type":"function","name":"getConsensusState","outputs":[{"internalType":"bytes","name":"","type":"bytes"}]},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"stateMutability":"view","type":"function","name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}]},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"stateMutability":"nonpayable","type":"function","name":"grantRole"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"stateMutability":"view","type":"function","name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}]},{"inputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function","name":"misbehaviour"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"callerConfirmation","type":"address"}],"stateMutability":"nonpayable","type":"function","name":"renounceRole"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"stateMutability":"nonpayable","type":"function","name":"revokeRole"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"stateMutability":"view","type":"function","name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}]},{"inputs":[{"internalType":"bytes","name":"updateMsg","type":"bytes"}],"stateMutability":"nonpayable","type":"function","name":"updateClient","outputs":[{"internalType":"enum ILightClientMsgs.UpdateResult","name":"","type":"uint8"}]},{"inputs":[{"internalType":"struct ILightClientMsgs.MsgVerifyMembership","name":"msg_","type":"tuple","components":[{"internalType":"bytes","name":"proof","type":"bytes"},{"internalType":"struct IICS02ClientMsgs.Height","name":"proofHeight","type":"tuple","components":[{"internalType":"uint64","name":"revisionNumber","type":"uint64"},{"internalType":"uint64","name":"revisionHeight","type":"uint64"}]},{"internalType":"bytes[]","name":"path","type":"bytes[]"},{"internalType":"bytes","name":"value","type":"bytes"}]}],"stateMutability":"view","type":"function","name":"verifyMembership","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[{"internalType":"struct ILightClientMsgs.MsgVerifyNonMembership","name":"msg_","type":"tuple","components":[{"internalType":"bytes","name":"proof","type":"bytes"},{"internalType":"struct IICS02ClientMsgs.Height","name":"proofHeight","type":"tuple","components":[{"internalType":"uint64","name":"revisionNumber","type":"uint64"},{"internalType":"uint64","name":"revisionHeight","type":"uint64"}]},{"internalType":"bytes[]","name":"path","type":"bytes[]"}]}],"stateMutability":"view","type":"function","name":"verifyNonMembership","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]}],"devdoc":{"kind":"dev","methods":{"constructor":{"params":{"ibcRouter":"Counterparty ICS26 router address whose storage is proven.","initialTrustedHeight":"Initial trusted Besu height.","initialTrustedStorageRoot":"Initial trusted storage root of `ibcRouter`.","initialTrustedTimestamp":"Initial trusted header timestamp in seconds.","initialTrustedValidators":"Initial trusted validator set.","maxClockDrift":"Maximum allowed future drift in seconds for submitted headers.","roleManager":"Address that administers proof submission; if zero, proof submission is open.","trustingPeriod":"Maximum age in seconds for trusted consensus states."}},"getClientState()":{"returns":{"_0":"The client state."}},"getConsensusState(uint64)":{"params":{"revisionHeight":"The revision height to query."},"returns":{"_0":"The ABI-encoded consensus state."}},"getRoleAdmin(bytes32)":{"details":"Returns the admin role that controls `role`. See {grantRole} and {revokeRole}. To change a role's admin, use {_setRoleAdmin}."},"grantRole(bytes32,address)":{"details":"Grants `role` to `account`. If `account` had not been already granted `role`, emits a {RoleGranted} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleGranted} event."},"hasRole(bytes32,address)":{"details":"Returns `true` if `account` has been granted `role`."},"misbehaviour(bytes)":{"params":{"misbehaviourMsg":"The misbehaviour message"}},"renounceRole(bytes32,address)":{"details":"Revokes `role` from the calling account. Roles are often managed via {grantRole} and {revokeRole}: this function's purpose is to provide a mechanism for accounts to lose their privileges if they are compromised (such as when a trusted device is misplaced). If the calling account had been revoked `role`, emits a {RoleRevoked} event. Requirements: - the caller must be `callerConfirmation`. May emit a {RoleRevoked} event."},"revokeRole(bytes32,address)":{"details":"Revokes `role` from `account`. If `account` had been granted `role`, emits a {RoleRevoked} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleRevoked} event."},"supportsInterface(bytes4)":{"details":"Returns true if this contract implements the interface defined by `interfaceId`. See the corresponding https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[ERC section] to learn more about how these ids are created. This function call must use less than 30 000 gas."},"updateClient(bytes)":{"params":{"updateMsg":"The encoded update message e.g., an SP1 proof."},"returns":{"_0":"The result of the update operation"}},"verifyMembership((bytes,(uint64,uint64),bytes[],bytes))":{"details":"Notice that this message is not view, as it may update the client state for caching purposes.","params":{"msg_":"The membership message"},"returns":{"_0":"The unix timestamp of the verification height in the counterparty chain in seconds."}},"verifyNonMembership((bytes,(uint64,uint64),bytes[]))":{"details":"Notice that this message is not view, as it may update the client state for caching purposes.","params":{"msg_":"The membership message"},"returns":{"_0":"The unix timestamp of the verification height in the counterparty chain in seconds."}}},"version":1},"userdoc":{"kind":"user","methods":{"PROOF_SUBMITTER_ROLE()":{"notice":"Role allowed to submit client updates and proof verifications."},"constructor":{"notice":"Creates a Besu QBFT light client from an initial trusted consensus state."},"getClientState()":{"notice":"Returns the client state."},"getConsensusState(uint64)":{"notice":"Returns the encoded consensus state for a revision height."},"misbehaviour(bytes)":{"notice":"Misbehaviour handling, moves the light client to the frozen state if misbehaviour is detected"},"updateClient(bytes)":{"notice":"Updating the client and consensus state"},"verifyMembership((bytes,(uint64,uint64),bytes[],bytes))":{"notice":"Querying the membership of a key-value pair"},"verifyNonMembership((bytes,(uint64,uint64),bytes[]))":{"notice":"Querying the non-membership of a key"}},"version":1}},"settings":{"remappings":["@openzeppelin-contracts/=node_modules/@openzeppelin/contracts/","@openzeppelin-upgradeable/=node_modules/@openzeppelin/contracts-upgradeable/","@openzeppelin/=node_modules/@openzeppelin/","@sp1-contracts/=node_modules/sp1-contracts/contracts/src/","@uniswap/permit2/=node_modules/@uniswap/permit2/","forge-std/=node_modules/forge-std/src/","sp1-contracts/=node_modules/sp1-contracts/"],"optimizer":{"enabled":true,"runs":10000},"metadata":{"bytecodeHash":"none"},"compilationTarget":{"contracts/light-clients/besu/BesuQBFTLightClient.sol":"BesuQBFTLightClient"},"evmVersion":"cancun","libraries":{},"viaIR":true},"sources":{"contracts/interfaces/ILightClient.sol":{"keccak256":"0x3b2361546ee834a442d844c979fbad3458ee13146b093f585587a09e19a266af","urls":["bzz-raw://5b5d53101bb598f14a79cb1092479736fa18e8f84945ea6ef80f4dac84466042","dweb:/ipfs/QmaTCo6M3Z9aYCSX65AQtixo1sB4ymQUDAgTXSKHqJHGDh"],"license":"Apache-2.0"},"contracts/light-clients/besu/BesuLightClientBase.sol":{"keccak256":"0xc6e53bf0a6dc8d40d819e2f735bbae57c97454974d622901eb2361143b388529","urls":["bzz-raw://c1c65ba0c1b91751f62c769a6d892371cc8af598116217643acab4a3ce470435","dweb:/ipfs/Qmf1pqQC7iELqiKnSyjAPsTFYFsyWzxHez7FLjs8jax7Km"],"license":"Apache-2.0"},"contracts/light-clients/besu/BesuQBFTLightClient.sol":{"keccak256":"0xaeb51b2596e5959273edc43f9db73effe6c8f0f05bdedda140db66e2dfdd0fea","urls":["bzz-raw://28beb01f795950c145576718eb64a4c65948c5c04db20d9b9105d416ada277b4","dweb:/ipfs/Qmb2CjEjmrF8pFj4eo9mCfRA2VWCVQ5H1F81DA9sBtvaVA"],"license":"Apache-2.0"},"contracts/light-clients/besu/MPTProof.sol":{"keccak256":"0x9ab26e6445b20541e8725b190006444d3b16eb3e021174e280451f934d9535c6","urls":["bzz-raw://b6f3fd58b06b942a454bb9b21e9be40a2dab8a09f78e75ff4357c8afbc7e2d5b","dweb:/ipfs/QmPeUwNScDiU91Xx4UQduYjyCPALYLPq73ZUMEn8Nr1rTG"],"license":"Apache-2.0"},"contracts/light-clients/besu/RLPReader.sol":{"keccak256":"0xa64ad17e6da7fed2bd206df52189286694339a8061dc5d158e717eda982af1d9","urls":["bzz-raw://7020db2fe854e90e1b791e0e587610fc26bed3073ba1811faa275a1d8bf3c2c7","dweb:/ipfs/QmdXdKghNFZSX7N9qD6BsKuJQdrFoqatsVWvHRL7vJCmeP"],"license":"Apache-2.0"},"contracts/light-clients/besu/errors/IBesuLightClientErrors.sol":{"keccak256":"0xfb8d8e28c81a48e1165b9d9e69406208fbb0ced1b30d9ef3293112562ffbb448","urls":["bzz-raw://0d3d314a005ada41d997a6e5b254ebd70066c3ccd2e6306249c258c4a13c3623","dweb:/ipfs/QmbRH23Vh7Xp1eXQmfnafMyTebuihQTLfRYeq6BbGJfYnY"],"license":"Apache-2.0"},"contracts/light-clients/besu/msgs/IBesuLightClientMsgs.sol":{"keccak256":"0x3fc43a3daaae2f89dca4cadbc99ea71086282f987b47a95c13489ae3384532cf","urls":["bzz-raw://36083aa6833eb30d26023f7dc0b2e22b7d0723d922fcd50cf86999edc9aeb474","dweb:/ipfs/QmbPv9KJj5AuJkgppuyuoaTHtiw91Qkx1tdkf1R5D4wad2"],"license":"Apache-2.0"},"contracts/msgs/IICS02ClientMsgs.sol":{"keccak256":"0x03d1265eae327c3744d774bf22a30d845233d50664921c9aa57cef2d71fd89d2","urls":["bzz-raw://89900781cc5c60540a237d92d42745ea6165765ee8fb4d50e8137a717195cc75","dweb:/ipfs/Qmbx5p8gZ8sEMMeZytXsLee49JUayhAaoJ2yxX93WUrvQo"],"license":"Apache-2.0"},"contracts/msgs/ILightClientMsgs.sol":{"keccak256":"0x8d1e56ab166a7b4aa6999708e3214a4645ebbc3835c2b2a4c255c9923eebafde","urls":["bzz-raw://8bd4200dc04d950c0f050623fa9a8accdbec877fd446c039d4dd6c678bdf1513","dweb:/ipfs/QmZQTViaA7N6BVNDzJ1Z6w799PrPoE4ajPueZSPwX4sGZ9"],"license":"Apache-2.0"},"node_modules/@openzeppelin/contracts/access/AccessControl.sol":{"keccak256":"0x4686ec784d75f95beaf2bf5b5f26e5f946d4c864aaee9c3c62bdc18381f5e017","urls":["bzz-raw://26710ca191913f3c9df542079c4a6dcff02968e92d4f7357daefef9fbe72a19c","dweb:/ipfs/QmanHbeWuBbVEqXySHa1zhm2rExjYpChDBubBaJNTCa2JB"],"license":"MIT"},"node_modules/@openzeppelin/contracts/access/IAccessControl.sol":{"keccak256":"0xbff9f59c84e5337689161ce7641c0ef8e872d6a7536fbc1f5133f128887aba3c","urls":["bzz-raw://b308f882e796f7b79c9502deacb0a62983035c6f6f4e962b319ba6a1f4a77d3d","dweb:/ipfs/QmaWCW7ahEQqFjwhSUhV7Ae7WhfNvzSpE7DQ58hvEooqPL"],"license":"MIT"},"node_modules/@openzeppelin/contracts/utils/Context.sol":{"keccak256":"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2","urls":["bzz-raw://6a708e8a5bdb1011c2c381c9a5cfd8a9a956d7d0a9dc1bd8bcdaf52f76ef2f12","dweb:/ipfs/Qmax9WHBnVsZP46ZxEMNRQpLQnrdE4dK8LehML1Py8FowF"],"license":"MIT"},"node_modules/@openzeppelin/contracts/utils/cryptography/ECDSA.sol":{"keccak256":"0xbeb5cad8aaabe0d35d2ec1a8414d91e81e5a8ca679add4cf57e2f33476861f40","urls":["bzz-raw://ebb272a5ee2da4e8bd5551334e0ce8dce4e9c56a04570d6bf046d260fab3116a","dweb:/ipfs/QmNw6RyM769qcqFocDq6HJMG2WiEnQbvizpRaUXsACHho2"],"license":"MIT"},"node_modules/@openzeppelin/contracts/utils/introspection/ERC165.sol":{"keccak256":"0x2d9dc2fe26180f74c11c13663647d38e259e45f95eb88f57b61d2160b0109d3e","urls":["bzz-raw://81233d1f98060113d9922180bb0f14f8335856fe9f339134b09335e9f678c377","dweb:/ipfs/QmWh6R35SarhAn4z2wH8SU456jJSYL2FgucfTFgbHJJN4E"],"license":"MIT"},"node_modules/@openzeppelin/contracts/utils/introspection/IERC165.sol":{"keccak256":"0x8891738ffe910f0cf2da09566928589bf5d63f4524dd734fd9cedbac3274dd5c","urls":["bzz-raw://971f954442df5c2ef5b5ebf1eb245d7105d9fbacc7386ee5c796df1d45b21617","dweb:/ipfs/QmadRjHbkicwqwwh61raUEapaVEtaLMcYbQZWs9gUkgj3u"],"license":"MIT"}},"version":1},"id":36} \ No newline at end of file +{"abi":[{"type":"constructor","inputs":[{"name":"ibcRouter","type":"address","internalType":"address"},{"name":"initialTrustedHeight","type":"uint64","internalType":"uint64"},{"name":"initialTrustedTimestamp","type":"uint64","internalType":"uint64"},{"name":"initialTrustedStorageRoot","type":"bytes32","internalType":"bytes32"},{"name":"initialTrustedValidators","type":"address[]","internalType":"address[]"},{"name":"trustingPeriod","type":"uint64","internalType":"uint64"},{"name":"maxClockDrift","type":"uint64","internalType":"uint64"},{"name":"roleManager","type":"address","internalType":"address"}],"stateMutability":"nonpayable"},{"type":"function","name":"DEFAULT_ADMIN_ROLE","inputs":[],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"type":"function","name":"PROOF_SUBMITTER_ROLE","inputs":[],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"type":"function","name":"getClientState","inputs":[],"outputs":[{"name":"","type":"bytes","internalType":"bytes"}],"stateMutability":"view"},{"type":"function","name":"getConsensusState","inputs":[{"name":"revisionHeight","type":"uint64","internalType":"uint64"}],"outputs":[{"name":"","type":"bytes","internalType":"bytes"}],"stateMutability":"view"},{"type":"function","name":"getRoleAdmin","inputs":[{"name":"role","type":"bytes32","internalType":"bytes32"}],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"type":"function","name":"grantRole","inputs":[{"name":"role","type":"bytes32","internalType":"bytes32"},{"name":"account","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"hasRole","inputs":[{"name":"role","type":"bytes32","internalType":"bytes32"},{"name":"account","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"misbehaviour","inputs":[{"name":"","type":"bytes","internalType":"bytes"}],"outputs":[],"stateMutability":"view"},{"type":"function","name":"renounceRole","inputs":[{"name":"role","type":"bytes32","internalType":"bytes32"},{"name":"callerConfirmation","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"revokeRole","inputs":[{"name":"role","type":"bytes32","internalType":"bytes32"},{"name":"account","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"supportsInterface","inputs":[{"name":"interfaceId","type":"bytes4","internalType":"bytes4"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"updateClient","inputs":[{"name":"updateMsg","type":"bytes","internalType":"bytes"}],"outputs":[{"name":"","type":"uint8","internalType":"enum ILightClientMsgs.UpdateResult"}],"stateMutability":"nonpayable"},{"type":"function","name":"verifyMembership","inputs":[{"name":"msg_","type":"tuple","internalType":"struct ILightClientMsgs.MsgVerifyMembership","components":[{"name":"proof","type":"bytes","internalType":"bytes"},{"name":"proofHeight","type":"tuple","internalType":"struct IICS02ClientMsgs.Height","components":[{"name":"revisionNumber","type":"uint64","internalType":"uint64"},{"name":"revisionHeight","type":"uint64","internalType":"uint64"}]},{"name":"path","type":"bytes[]","internalType":"bytes[]"},{"name":"value","type":"bytes","internalType":"bytes"}]}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"verifyNonMembership","inputs":[{"name":"msg_","type":"tuple","internalType":"struct ILightClientMsgs.MsgVerifyNonMembership","components":[{"name":"proof","type":"bytes","internalType":"bytes"},{"name":"proofHeight","type":"tuple","internalType":"struct IICS02ClientMsgs.Height","components":[{"name":"revisionNumber","type":"uint64","internalType":"uint64"},{"name":"revisionHeight","type":"uint64","internalType":"uint64"}]},{"name":"path","type":"bytes[]","internalType":"bytes[]"}]}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"event","name":"RoleAdminChanged","inputs":[{"name":"role","type":"bytes32","indexed":true,"internalType":"bytes32"},{"name":"previousAdminRole","type":"bytes32","indexed":true,"internalType":"bytes32"},{"name":"newAdminRole","type":"bytes32","indexed":true,"internalType":"bytes32"}],"anonymous":false},{"type":"event","name":"RoleGranted","inputs":[{"name":"role","type":"bytes32","indexed":true,"internalType":"bytes32"},{"name":"account","type":"address","indexed":true,"internalType":"address"},{"name":"sender","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"type":"event","name":"RoleRevoked","inputs":[{"name":"role","type":"bytes32","indexed":true,"internalType":"bytes32"},{"name":"account","type":"address","indexed":true,"internalType":"address"},{"name":"sender","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"type":"error","name":"AccessControlBadConfirmation","inputs":[]},{"type":"error","name":"AccessControlUnauthorizedAccount","inputs":[{"name":"account","type":"address","internalType":"address"},{"name":"neededRole","type":"bytes32","internalType":"bytes32"}]},{"type":"error","name":"ConflictingConsensusState","inputs":[{"name":"revisionHeight","type":"uint64","internalType":"uint64"}]},{"type":"error","name":"ConsensusStateExpired","inputs":[{"name":"trustedTimestamp","type":"uint64","internalType":"uint64"},{"name":"currentTimestamp","type":"uint256","internalType":"uint256"},{"name":"trustingPeriod","type":"uint64","internalType":"uint64"}]},{"type":"error","name":"ConsensusStateNotFound","inputs":[{"name":"revisionHeight","type":"uint64","internalType":"uint64"}]},{"type":"error","name":"DuplicateCommitSealSigner","inputs":[{"name":"signer","type":"address","internalType":"address"}]},{"type":"error","name":"DuplicateValidator","inputs":[{"name":"validator","type":"address","internalType":"address"}]},{"type":"error","name":"EmptyValidatorSet","inputs":[]},{"type":"error","name":"HeaderFromFuture","inputs":[{"name":"currentTimestamp","type":"uint256","internalType":"uint256"},{"name":"headerTimestamp","type":"uint256","internalType":"uint256"},{"name":"maxClockDrift","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"InsufficientTrustedValidatorOverlap","inputs":[{"name":"actual","type":"uint256","internalType":"uint256"},{"name":"required","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"InsufficientValidatorQuorum","inputs":[{"name":"actual","type":"uint256","internalType":"uint256"},{"name":"required","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"InvalidCommitSeal","inputs":[]},{"type":"error","name":"InvalidCommitmentValue","inputs":[{"name":"expectedValue","type":"bytes32","internalType":"bytes32"},{"name":"actualValue","type":"bytes32","internalType":"bytes32"}]},{"type":"error","name":"InvalidDifficulty","inputs":[{"name":"actualDifficulty","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"InvalidECDSASignatureLength","inputs":[{"name":"length","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"InvalidExtraDataFormat","inputs":[{"name":"itemsLength","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"InvalidHeaderFormat","inputs":[{"name":"itemsLength","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"InvalidHeaderHeight","inputs":[]},{"type":"error","name":"InvalidHeaderTimestamp","inputs":[]},{"type":"error","name":"InvalidMixHash","inputs":[{"name":"actualMixHash","type":"bytes32","internalType":"bytes32"}]},{"type":"error","name":"InvalidNonce","inputs":[{"name":"actualNonce","type":"bytes","internalType":"bytes"}]},{"type":"error","name":"InvalidOmmersHash","inputs":[{"name":"actualOmmersHash","type":"bytes32","internalType":"bytes32"}]},{"type":"error","name":"InvalidPathLength","inputs":[{"name":"expectedLength","type":"uint256","internalType":"uint256"},{"name":"actualLength","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"InvalidRevisionNumber","inputs":[{"name":"providedRevisionNumber","type":"uint64","internalType":"uint64"}]},{"type":"error","name":"InvalidValidatorAddress","inputs":[{"name":"validator","type":"address","internalType":"address"}]},{"type":"error","name":"InvalidValidatorAddressLength","inputs":[{"name":"length","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"InvalidValueLength","inputs":[{"name":"expectedLength","type":"uint256","internalType":"uint256"},{"name":"actualLength","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"UnsupportedMisbehaviour","inputs":[]},{"type":"error","name":"ValueExists","inputs":[{"name":"actualValue","type":"bytes32","internalType":"bytes32"}]}],"bytecode":{"object":"0x6080604052346103d85761395e80380380610019816103dc565b928339810190610100818303126103d85761003381610401565b9061004060208201610415565b9061004d60408201610415565b92606082015191608081015160018060401b0381116103d85781019286601f850112156103d8578351966001600160401b03881161037f578760051b9460206100978188016103dc565b809a81520190602082978201019283116103d857602001905b8282106103c0575050506100c660a08301610415565b956100df60e06100d860c08601610415565b9401610401565b956001600160401b03169081156103b1576001600160401b03169283156103a257885115610393575f5b89518110156101bf576001600160a01b03610124828c610429565b511615610198575f5b81811061013d5750600101610109565b6001600160a01b0361014f828d610429565b51166001600160a01b03610163848e610429565b5116146101725760010161012d565b6001600160a01b03610184838d610429565b511663107f863360e21b5f5260045260245ffd5b6001600160a01b03906101ab908b610429565b51166359bff38760e01b5f5260045260245ffd5b5060408051979896978a979181016001600160401b0381118282101761037f576040525f81526020810190848252604051926080840198848a1060018060401b038b111761037f576040998a526001600160a01b031680855260208086018490526001600160401b03928316868c01819052878416606090970196909652600180546001600160a01b031916909217825592516002805495516fffffffffffffffff0000000000000000908d1b81169285166001600160801b03199788161792909217815560038054988d1b90921697909516909517959095179093555f948552600490529590922080546001600160401b031916949094178455830191909155925193910191831161037f5768010000000000000000831161037f578154838355808410610359575b50905f5260205f205f5b83811061033c57846001600160a01b0381166103235750610312610547565b505b6040516132f490816105ca8239f35b8061033061033692610451565b506104c7565b50610314565b82516001600160a01b0316818301556020909201916001016102f3565b825f528360205f2091820191015b81811061037457506102e9565b5f8155600101610367565b634e487b7160e01b5f52604160045260245ffd5b63339e1ffb60e01b5f5260045ffd5b63574f4e6160e01b5f5260045ffd5b6359d119e360e01b5f5260045ffd5b602080916103cd84610401565b8152019101906100b0565b5f80fd5b6040519190601f01601f191682016001600160401b0381118382101761037f57604052565b51906001600160a01b03821682036103d857565b51906001600160401b03821682036103d857565b805182101561043d5760209160051b010190565b634e487b7160e01b5f52603260045260245ffd5b6001600160a01b0381165f9081525f51602061393e5f395f51905f52602052604090205460ff166104c2576001600160a01b03165f8181525f51602061393e5f395f51905f5260205260408120805460ff191660011790553391905f5160206138be5f395f51905f528180a4600190565b505f90565b6001600160a01b0381165f9081525f5160206138de5f395f51905f52602052604090205460ff166104c2576001600160a01b03165f8181525f5160206138de5f395f51905f5260205260408120805460ff191660011790553391905f51602061391e5f395f51905f52905f5160206138be5f395f51905f529080a4600190565b5f80525f5160206138de5f395f51905f526020525f5160206138fe5f395f51905f525460ff166105c5575f8080525f5160206138de5f395f51905f526020525f5160206138fe5f395f51905f52805460ff1916600117905533905f51602061391e5f395f51905f525f5160206138be5f395f51905f528280a4600190565b5f9056fe60806040526004361015610011575f80fd5b5f3560e01c806301ffc9a7146100f45780630bece356146100ef578063248a9ca3146100ea5780632f2ff15d146100e557806336568abe146100e05780634d6d9ffb146100db5780635972185a146100d6578063682ed5f0146100d157806391d14854146100cc578063a217fddf146100c7578063d547741f146100c2578063ddba6537146100bd578063edce8bdc146100b85763ef913a4b146100b3575f80fd5b610a16565b61095e565b61088b565b61085c565b610842565b6107f4565b6105e6565b6105ac565b6103ac565b610350565b61031a565b6102b5565b610217565b34610195576020600319360112610195576004357fffffffff00000000000000000000000000000000000000000000000000000000811680910361019557807f7965db0b000000000000000000000000000000000000000000000000000000006020921490811561016b575b506040519015158152f35b7f01ffc9a7000000000000000000000000000000000000000000000000000000009150145f610160565b5f80fd5b9060206003198301126101955760043567ffffffffffffffff811161019557826023820112156101955780600401359267ffffffffffffffff84116101955760248483010111610195576024019190565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b346101955761028161022836610199565b5f80527f4c48d1d2b0f4f7485fc28e3db22341d96a20aa29e6efa8149da9751603abd4e06020527f6e0c24a6e293ff9b755263dbaa15ba3796b0b8d3fe17cfb4ddf8143b268eac475490919060ff161561029957610d9d565b6040516003821015610294576020918152f35b6101ea565b6102a1611287565b610d9d565b90816020910312610195573590565b346101955760206003193601126101955760206102df6004355f525f602052600160405f20015490565b604051908152f35b6003196040910112610195576004359060243573ffffffffffffffffffffffffffffffffffffffff811681036101955790565b346101955761034e61032b366102e7565b90610349610344825f525f602052600160405f20015490565b61130f565b61221d565b005b346101955761035e366102e7565b3373ffffffffffffffffffffffffffffffffffffffff8216036103845761034e916122f4565b7f6697b232000000000000000000000000000000000000000000000000000000005f5260045ffd5b346101955760206003193601126101955760043567ffffffffffffffff8111610195578060040160806003198336030112610195575f80527f4c48d1d2b0f4f7485fc28e3db22341d96a20aa29e6efa8149da9751603abd4e060205260ff7f6e0c24a6e293ff9b755263dbaa15ba3796b0b8d3fe17cfb4ddf8143b268eac4754161561059f575b61044761044260248401611192565b61137c565b60648201916001610458848461119c565b90500361056157906104a96104966104a261049d61049661049061048961048460446104e09a01611192565b611b30565b988761119c565b9061126e565b3691610b4d565b6123c9565b928061121d565b906001840154906040516104d7816104c960208201948560209181520190565b03601f198101835282610afd565b51902091612457565b805161051f5761051b61050b6104fe845467ffffffffffffffff1690565b67ffffffffffffffff1690565b6040519081529081906020820190565b0390f35b61053361052e61055e9261259c565b6125c9565b7fd039601e000000000000000000000000000000000000000000000000000000005f52600452602490565b5ffd5b61055e61056e848461119c565b7f88b3170e000000000000000000000000000000000000000000000000000000005f52600160045260245250604490565b6105a7611287565b610433565b34610195575f6003193601126101955760206040517fbd893629a699470e4ec82a5715bb4981fdaacc5d0a728bf5f55b801d8f4ef10b8152f35b346101955760206003193601126101955760043567ffffffffffffffff8111610195578060040160a06003198336030112610195575f80527f4c48d1d2b0f4f7485fc28e3db22341d96a20aa29e6efa8149da9751603abd4e060205260ff7f6e0c24a6e293ff9b755263dbaa15ba3796b0b8d3fe17cfb4ddf8143b268eac475416156107e7575b61067c61044260248401611192565b6064820191600161068d848461119c565b90500361056157608481019060206106a5838561121d565b9050036107a957906106f46104966106ed6106e56106de61049d6104966104906106d761048460446107149c01611192565b9b8b61119c565b948761121d565b8101906102a6565b948061121d565b906001850154906040516104d7816104c960208201948560209181520190565b8051156107755761052e6107279161259c565b908082036107475761051b61050b6104fe855467ffffffffffffffff1690565b7f56ed1b63000000000000000000000000000000000000000000000000000000005f5260045260245260445ffd5b61055e827f56ed1b63000000000000000000000000000000000000000000000000000000005f52906044916004525f602452565b61055e6107b6838561121d565b7f24fadac8000000000000000000000000000000000000000000000000000000005f52602060045260245250604490565b6107ef611287565b61066d565b3461019557602060ff610836610809366102e7565b905f525f845260405f209073ffffffffffffffffffffffffffffffffffffffff165f5260205260405f2090565b54166040519015158152f35b34610195575f6003193601126101955760206040515f8152f35b346101955761034e61086d366102e7565b90610886610344825f525f602052600160405f20015490565b6122f4565b346101955761089936610199565b50505f80527f4c48d1d2b0f4f7485fc28e3db22341d96a20aa29e6efa8149da9751603abd4e06020527f6e0c24a6e293ff9b755263dbaa15ba3796b0b8d3fe17cfb4ddf8143b268eac475460ff1615610915575b7f2c1ed462000000000000000000000000000000000000000000000000000000005f5260045ffd5b61091d611287565b6108ed565b67ffffffffffffffff81160361019557565b601f19601f602060409481855280519182918282880152018686015e5f8582860101520116010190565b346101955760206003193601126101955761097e60043561048481610922565b67ffffffffffffffff8154166002600183015492019060405192608084019160208501526040840152606080840152815480915260a08301915f5260205f20905f5b8181106109ea5761051b856109de818703601f198101835282610afd565b60405191829182610934565b825473ffffffffffffffffffffffffffffffffffffffff168452602090930192600192830192016109c0565b34610195575f6003193601126101955761051b60405173ffffffffffffffffffffffffffffffffffffffff60015416602082015267ffffffffffffffff600254818116604084015260401c16606082015267ffffffffffffffff600354818116608084015260401c1660a082015260a081526109de60c082610afd565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b6060810190811067ffffffffffffffff821117610adc57604052565b610a93565b6040810190811067ffffffffffffffff821117610adc57604052565b90601f601f19910116810190811067ffffffffffffffff821117610adc57604052565b60405190610b2f604083610afd565b565b67ffffffffffffffff8111610adc57601f01601f191660200190565b929192610b5982610b31565b91610b676040519384610afd565b829481845281830111610195578281602093845f960137010152565b9080601f8301121561019557816020610b9e93359101610b4d565b90565b6020818303126101955780359067ffffffffffffffff8211610195570180820391608083126101955760405192610bd784610ac0565b823567ffffffffffffffff811161019557604091610bfa84601f19938701610b83565b8652011261019557604051610c0e81610ae1565b6020830135610c1c81610922565b81526040830135610c2c81610922565b60208201526020840152606082013567ffffffffffffffff811161019557610c549201610b83565b604082015290565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b9060018201809211610c9757565b610c5c565b60c001908160c011610c9757565b60f701908160f711610c9757565b6080019081608011610c9757565b60b701908160b711610c9757565b91908201809211610c9757565b908160011b9180830460021490151715610c9757565b81519167ffffffffffffffff8311610adc57680100000000000000008311610adc578154838355808410610d77575b506020610d389101915f5260205f2090565b5f5b838110610d475750505050565b6001906020610d6a855173ffffffffffffffffffffffffffffffffffffffff1690565b9401938184015501610d3a565b825f528360205f2091820191015b818110610d925750610d26565b5f8155600101610d85565b610da991810190610ba1565b9060208201610dc461044282515167ffffffffffffffff1690565b610dce8351611614565b92606084019367ffffffffffffffff610def865167ffffffffffffffff1690565b161561116a5760035491604083901c67ffffffffffffffff1693610e1d67ffffffffffffffff861642610cd4565b9460a0840195610e35875167ffffffffffffffff1690565b9067ffffffffffffffff82161161112b5750505160200151610e7290610e649067ffffffffffffffff16611b30565b9367ffffffffffffffff1690565b67ffffffffffffffff81168015159081611102575b506110ad575090610ef591610eb66002610eae610ea385611bc2565b60e086015190611cf8565b950185611f11565b610ec660c0830194855190612036565b60406080610ee960015473ffffffffffffffffffffffffffffffffffffffff1690565b930151910151916120d9565b610f22610f0a865167ffffffffffffffff1690565b67ffffffffffffffff165f52600460205260405f2090565b610f376104fe825467ffffffffffffffff1690565b61103b5750916002610fb5928694610fa8610f73610f64610f0a610fc39a9b5167ffffffffffffffff1690565b955167ffffffffffffffff1690565b859067ffffffffffffffff167fffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000825416179055565b6001840155519101610cf7565b5167ffffffffffffffff1690565b600254610fdc9060401c67ffffffffffffffff166104fe565b67ffffffffffffffff821611610ff157505f90565b611037907fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff6fffffffffffffffff00000000000000006002549260401b16911617600255565b5f90565b91611051611059945167ffffffffffffffff1690565b90519261214f565b6110a75761055e611072835167ffffffffffffffff1690565b7fc1aea5f7000000000000000000000000000000000000000000000000000000005f5267ffffffffffffffff16600452602490565b60029150565b61055e906110c3855467ffffffffffffffff1690565b7feae35725000000000000000000000000000000000000000000000000000000005f5267ffffffffffffffff9081166004524260245216604452606490565b9050611123429161111e6104fe885467ffffffffffffffff1690565b610cd4565b11155f610e87565b7f9b772277000000000000000000000000000000000000000000000000000000005f524260045267ffffffffffffffff9081166024521660445260645ffd5b7f59d119e3000000000000000000000000000000000000000000000000000000005f5260045ffd5b35610b9e81610922565b9035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe181360301821215610195570180359067ffffffffffffffff821161019557602001918160051b3603831361019557565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b9035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe181360301821215610195570180359067ffffffffffffffff82116101955760200191813603831361019557565b9015611282578061127e9161121d565b9091565b6111f0565b335f9081527f4c48d1d2b0f4f7485fc28e3db22341d96a20aa29e6efa8149da9751603abd4e0602052604090205460ff16156112bf57565b7fe2517d3f000000000000000000000000000000000000000000000000000000005f52336004527fbd893629a699470e4ec82a5715bb4981fdaacc5d0a728bf5f55b801d8f4ef10b60245260445ffd5b805f525f60205260ff6113433360405f209073ffffffffffffffffffffffffffffffffffffffff165f5260205260405f2090565b54161561134d5750565b7fe2517d3f000000000000000000000000000000000000000000000000000000005f523360045260245260445ffd5b67ffffffffffffffff168061138e5750565b7f3ce598a9000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b60405190610100820182811067ffffffffffffffff821117610adc57604052606060e0838281528260208201528260408201525f838201525f60808201525f60a08201528260c08201520152565b8051600110156112825760400190565b805160071015611282576101000190565b8051600d1015611282576101c00190565b8051600e1015611282576101e00190565b805160081015611282576101200190565b8051600310156112825760800190565b8051600b1015611282576101800190565b8051600c1015611282576101a00190565b8051600410156112825760a00190565b8051156112825760200190565b8051600210156112825760600190565b805160101015611282576102200190565b80518210156112825760209160051b010190565b67ffffffffffffffff8111610adc5760051b60200190565b90611501826114df565b61150e6040519182610afd565b828152601f1961151e82946114df565b0190602036910137565b90602082519201517fffffffffffffffffffffffffffffffffffffffff00000000000000000000000081169260148110611560575050565b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000929350829060140360031b1b161690565b60405160c091906115a38382610afd565b6005815291601f1901825f5b8281106115bb57505050565b8060606020809385010152016115af565b906115d6826114df565b6115e36040519182610afd565b828152601f196115f382946114df565b01905f5b82811061160357505050565b8060606020809385010152016115f7565b61163061162b6116226113b9565b9280845261259c565b61260b565b602082019080825251600f8110611b0557507f1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d493476116766116708351611407565b516126d6565b03611aca57600161169061168a8351611417565b516125c9565b03611a8f577f63746963616c2062797a616e74696e65206661756c7420746f6c6572616e63656116c36116708351611428565b03611a54576116db6116d58251611439565b516126f2565b80516008811490811591611a24575b506119ea575061162b61175d6116d5836117216117106104fe61168a611762985161144a565b67ffffffffffffffff166060880152565b61172e611670825161145b565b60808701526117576117466104fe61168a845161146b565b67ffffffffffffffff1660a0880152565b5161147c565b61259c565b90604081019180835251600581036119bf57506117886117828351611407565b5161260b565b908151156119975761179a82516114f7565b9360c082019485525f5b8351811015611933576117ba6116d582866114cb565b80516014810361190857506117d16117d791611528565b60601c90565b73ffffffffffffffffffffffffffffffffffffffff811680156118c6575f5b8381106118325750509061182c600192611811838a516114cb565b9073ffffffffffffffffffffffffffffffffffffffff169052565b016117a4565b8161187761185e611844848d516114cb565b5173ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff1690565b14611884576001016117f6565b7f41fe18cc000000000000000000000000000000000000000000000000000000005f5273ffffffffffffffffffffffffffffffffffffffff831660045260245ffd5b7f59bff387000000000000000000000000000000000000000000000000000000005f5273ffffffffffffffffffffffffffffffffffffffff821660045260245ffd5b7f83e46ad2000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b509261178291945061194692505161148d565b61195081516115cc565b9260e081019384525f5b8251811015611991578061198a816119776116d5600195886114cb565b88519061198483836114cb565b526114cb565b500161195a565b50925050565b7f339e1ffb000000000000000000000000000000000000000000000000000000005f5260045ffd5b7f30c6792a000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b611a20906040519182917fd5edd2a500000000000000000000000000000000000000000000000000000000835260048301610934565b0390fd5b7f011b4d03dd8c01f1049143cf9c4c817e4b167f1d1b83e5c6f0f10d89ba1e7bce9150602083012014155f6116ea565b611a6461167061055e9251611428565b7fa19e609c000000000000000000000000000000000000000000000000000000005f52600452602490565b611a9f61168a61055e9251611417565b7ff71b722f000000000000000000000000000000000000000000000000000000005f52600452602490565b611ada61167061055e9251611407565b7fb8120dca000000000000000000000000000000000000000000000000000000005f52600452602490565b7fbc277732000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b67ffffffffffffffff1690815f52600460205260405f209167ffffffffffffffff83541615611b5c5750565b7ff761631b000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b60405190611b96604083610afd565b600182527fc0000000000000000000000000000000000000000000000000000000000000006020830152565b6020611c7d611bcf611592565b611c48611be660408601611bec611be6825161149d565b51612ff9565b611bf58561149d565b52611bff8461149d565b50611c0d611be68251611407565b611c1685611407565b52611c2084611407565b50611c2e611be682516114aa565b611c37856114aa565b52611c41846114aa565b505161145b565b611c518261145b565b52611c5b8161145b565b50611c64611b87565b611c6d8261148d565b52611c778161148d565b506127c8565b910190611c8b8251516115cc565b905f5b83518051821015611ce1579080600192600c82145f14611ccf575050611cb383612880565b611cbd82866114cb565b52611cc881856114cb565b5001611c8e565b611cdc91611be6916114cb565b611cb3565b505050611cee91506127c8565b6020815191012090565b919091611d0583516114f7565b925f5b8151811015611efe57611d1b81836114cb565b51805160418103611ed3575080601b60ff611d6a611d64611d3e611d779661285f565b517fff000000000000000000000000000000000000000000000000000000000000001690565b60f81c90565b1610611e80575b846130a7565b90611d81816128fa565b1590811591611e76575b508015611e58575b611e305773ffffffffffffffffffffffffffffffffffffffff81165f5b838110611dd057505090611dca60019261181183896114cb565b01611d08565b81611de161185e611844848c6114cb565b14611dee57600101611db0565b7f33af0d5f000000000000000000000000000000000000000000000000000000005f5273ffffffffffffffffffffffffffffffffffffffff831660045260245ffd5b7f09cb44e6000000000000000000000000000000000000000000000000000000005f5260045ffd5b5073ffffffffffffffffffffffffffffffffffffffff811615611d93565b905015155f611d8b565b611ec2611e9a611e95611d64611d3e8561285f565b6128e8565b60f81b7fff000000000000000000000000000000000000000000000000000000000000001690565b5f1a611ecd8261285f565b53611d71565b7ff2db9ce1000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b505050565b5f198114610c975760010190565b905f915f5b8151811015611f6a57611f4973ffffffffffffffffffffffffffffffffffffffff611f4183856114cb565b511684612904565b611f56575b600101611f16565b92611f62600191611f03565b939050611f4e565b50506003611f79915404610c89565b90818110611f85575050565b7fe2dcb1b9000000000000000000000000000000000000000000000000000000005f5260045260245260445ffd5b905f198201918211610c9757565b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff408201918211610c9757565b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff808201918211610c9757565b6020039060208211610c9757565b91908203918211610c9757565b905f915f5b815181101561208f5761206e73ffffffffffffffffffffffffffffffffffffffff61206683856114cb565b51168461295b565b61207b575b60010161203b565b92612087600191611f03565b939050612073565b50505190600382048203918211610c97578181106120ab575050565b7f7818f4e4000000000000000000000000000000000000000000000000000000005f5260045260245260445ffd5b6121239261162b9261175d926040517fffffffffffffffffffffffffffffffffffffffff000000000000000000000000602082019260601b168252601481526104d7603482610afd565b805160021015611282576060610b9e9101516126d6565b8054821015611282575f5260205f2001905f90565b919067ffffffffffffffff8061216d855467ffffffffffffffff1690565b92169116149081159161220e575b5061220857600201908154815103612208575f5b8151811015612200576121c56121a5828561213a565b905473ffffffffffffffffffffffffffffffffffffffff9160031b1c1690565b73ffffffffffffffffffffffffffffffffffffffff6121ea61185e61184485876114cb565b9116036121f95760010161218f565b5050505f90565b505050600190565b50505f90565b9050600182015414155f61217b565b805f525f60205260ff6122518360405f209073ffffffffffffffffffffffffffffffffffffffff165f5260205260405f2090565b541661220857805f525f6020526122898260405f209073ffffffffffffffffffffffffffffffffffffffff165f5260205260405f2090565b60017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0082541617905573ffffffffffffffffffffffffffffffffffffffff339216907f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d5f80a4600190565b805f525f60205260ff6123288360405f209073ffffffffffffffffffffffffffffffffffffffff165f5260205260405f2090565b54161561220857805f525f6020526123618260405f209073ffffffffffffffffffffffffffffffffffffffff165f5260205260405f2090565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00815416905573ffffffffffffffffffffffffffffffffffffffff339216907ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b5f80a4600190565b60208151910120604051602081019182527f1260944489272988d9df285149b5aa1b0f48f2136d6f416159f840a3e074760060408201526040815261240f606082610afd565b51902090565b60405190612424602083610afd565b5f808352366020840137565b9061243a82610b31565b6124476040519182610afd565b828152601f1961151e8294610b31565b61162b6124999194939461246b6020610b31565b956124796040519788610afd565b602087526124876020610b31565b601f196020890191013682375261259c565b906124a48451610ce1565b91845115158061257c575b6124b8906125c2565b6124ca6124c55f85612029565b612430565b925f19015f5b8181106124e4575050610b9e939450612acf565b80612566600f612529612560611d64611d3e8d61250360029960011c90565b908d61255a8a6125528a612529612520611d64611d3e8a8a61286f565b60041c600f1690565b1660f81b7fff000000000000000000000000000000000000000000000000000000000000001690565b5f1a9261286f565b5361286f565b60ff1690565b5f1a612575600183018861286f565b53016124d0565b5060016124af565b6040519061259182610ae1565b5f6020838281520152565b6125a4612584565b506020815191604051926125b784610ae1565b835201602082015290565b1561019557565b805180151590816125ff575b5015610195576125e490612da5565b905190602081106125f3575090565b6020036101000a900490565b6021915011155f6125d5565b61261481612dd1565b156101955761262281612df1565b61262b816114df565b916126396040519384610afd565b818352601f19612648836114df565b015f5b8181106126bf575050602061266b91015161266581612e52565b90610cd4565b5f905b82821061267b5750505090565b6126b78161268a600193612ebd565b90612693610b20565b8281528160208201526126a686896114cb565b526126b185886114cb565b50610cd4565b91019061266e565b6020906126ca612584565b8282880101520161264b565b6021815103610195576020015160018101809111610c97575190565b80511561019557612705610b9e91612da5565b61271181939293612430565b928360200190612f86565b805191908290602001825e015f815290565b610b2f9061275061274a9493604051958693602085019061271c565b9061271c565b03601f198101845283610afd565b6001907fff00000000000000000000000000000000000000000000000000000000000000610b9e9493168152019061271c565b916001610b9e94937fff0000000000000000000000000000000000000000000000000000000000000061274a94168152019061271c565b6127d0612415565b905f915b81518310156127fc576127f46001916127ed85856114cb565b519061272e565b9201916127d4565b91505080516038811061283b5750610b9e6128178251613025565b916104c961282b611e9a6125608651610caa565b9160405194859360208501612791565b61284d611e9a612560610b9e93610c9c565b6104c96040519384926020840161275e565b8051604010156112825760600190565b908151811015611282570160200190565b6001815114806128cd575b610b9e578051603881106128bb5750610b9e6128a78251613025565b916104c961282b611e9a6125608651610cc6565b61284d611e9a612560610b9e93610cb8565b50608060ff6128e1611d64611d3e8561149d565b161061288b565b60ff601b9116019060ff8211610c9757565b6004111561029457565b905f5b82548110156121f95773ffffffffffffffffffffffffffffffffffffffff61292f828561213a565b90549060031b1c1673ffffffffffffffffffffffffffffffffffffffff83161461220057600101612907565b905f5b82518110156121f95773ffffffffffffffffffffffffffffffffffffffff61298682856114cb565b511673ffffffffffffffffffffffffffffffffffffffff8316146122005760010161295e565b91906129b88351610ce1565b908351151580612ac5575b6129cc906125c2565b6129d96124c58284612029565b938192600180841614612a63575b5f19869101935b8481106129fc575050505050565b83612a5a6001612a50600f612529612560611d64611d3e8b60029b612a49612a3c886125298f611d64611d3e612a356125209360011c90565b809961286f565b9b8d03809c5f1a9261286f565b538c61286f565b5f1a92018961286f565b530185906129ee565b92507f0f00000000000000000000000000000000000000000000000000000000000000612aa2612560611d64611d3e612a9c8760011c90565b8661286f565b60f81b165f1a612ab18661149d565b535f19612abd83611f03565b9390506129e7565b50818111156129c3565b915f915f612adb612584565b50845115612d6c5790935f915b81518310156101955782158080612d56575b61019557159081612d39575b5061019557612b1861178283836114cb565b948551600281145f14612c155750612b3a612b356116d58861149d565b61313c565b95612b50612b498888846131a9565b8092610cd4565b965111612bf75715612b875750612b679051611fb3565b11610195575111612b7e576116d5610b9e91611407565b50610b9e612415565b919094612b948651611fb3565b82146101955780612bb6612bb2612bac600194611407565b51612dd1565b1590565b15612bd857612bc7612bcd91611407565b5161312e565b915b01919490612ae8565b612be4612bf191611407565b5160208101519051902090565b91612bcf565b505091509250612c08915051611fb3565b1161019557610b9e612415565b929491939192601103612cda5781518314612cbc57612c46612c40612560611d64611d3e878761286f565b93610c89565b92601081101561019557612c63612c5d82896114cb565b51613118565b15612c855750505050612c7891925051611fb3565b0361019557610b9e612415565b86612c9d612bb2612bac84600196989a97999b6114cb565b15612caf57612bf191612bc7916114cb565b612bf191612be4916114cb565b505050612cc99051611fb3565b03610195576116d5610b9e916114ba565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f696e76616c6964206e6f6465206c656e677468000000000000000000000000006044820152606490fd5b9050612d4e612d4884846114cb565b516130e1565b14155f612b06565b50612d64612be485856114cb565b871415612afa565b509050612d9d92507f56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b4219150146125c2565b610b9e612415565b906020820191612db58351612e52565b925190838201809211610c975751928303928311610c97579190565b805115612dec57602060c0910151515f1a1061103757600190565b505f90565b805115612dec575f9060208101908151612e0a81612e52565b8101809111610c9757915190518101809111610c975791905b828110612e305750905090565b612e3981612ebd565b8101809111610c9757612e4c9091611f03565b90612e23565b515f1a6080811015612e6357505f90565b60b881108015612ea7575b15612e795750600190565b60c0811015612e9857610b9e90612e939060b75b90612029565b610c89565b610b9e90612e939060f7612e8d565b5060c08110158015612e6e575060f88110612e6e565b80515f1a906080821015612ed2575050600190565b60b8821015612ee85750612e93610b9e91611fee565b60c0821015612f295760010151602082900360b7016101000a9004017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff4a0190565b60f8821015612f3f5750612e93610b9e91611fc1565b60010151602082900360f7016101000a9004017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0a0190565b601f8111610c97576101000a90565b90918015611efe575b6020811015612fc95780612fa257505050565b612fb6612fb1612fbb9261201b565b612f77565b611fb3565b905182518216911916179052565b91908051825260208101809111610c97579060208101809111610c975791601f19810190811115612f8f57610c5c565b6130038151612430565b9081511561302157806020610b9e9201519051908360200190612f86565b5090565b5f81805b613093575061303781612430565b91815b61304357505090565b61304c82611fb3565b61307e7fff000000000000000000000000000000000000000000000000000000000000008360f81b165f1a918561286f565b5360081c908015610c97575f1901908161303a565b9061309d90611f03565b9060081c80613029565b81519190604183036130d7576130d09250602082015190606060408401519301515f1a9061324d565b9192909190565b50505f9160029190565b805160208110156130f9575060208101519051902090565b906020015120604051602081019182526020815261240f604082610afd565b6001815103612dec5760200151515f1a60801490565b61313790612da5565b902090565b9081511561019557600f613158612520611d64611d3e8661149d565b168061316b5750610b9e60025f936129ac565b600181036131805750610b9e60015f936129ac565b600281036131965750610b9e60026001936129ac565b60030361019557610b9e600180936129ac565b91905f5b838101808211610c97578251811080613243575b1561323b576131f17fff00000000000000000000000000000000000000000000000000000000000000918461286f565b51167fff0000000000000000000000000000000000000000000000000000000000000061321e838661286f565b511690036132345761322f90611f03565b6131ad565b9250505090565b509250505090565b50835182106131c1565b91907f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a084116132dc579160209360809260ff5f9560405194855216868401526040830152606082015282805260015afa156132d1575f5173ffffffffffffffffffffffffffffffffffffffff8116156132c757905f905f90565b505f906001905f90565b6040513d5f823e3d90fd5b5050505f916003919056fea164736f6c634300081c000a2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d4c48d1d2b0f4f7485fc28e3db22341d96a20aa29e6efa8149da9751603abd4e06e0c24a6e293ff9b755263dbaa15ba3796b0b8d3fe17cfb4ddf8143b268eac47bd893629a699470e4ec82a5715bb4981fdaacc5d0a728bf5f55b801d8f4ef10bad3228b676f7d3cd4284a5443f17f1962b36e491b30a40b2405849e597ba5fb5","sourceMap":"237:2306:36:-:0;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;237:2306:36;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;:::i;:::-;;-1:-1:-1;;;;;237:2306:36;;3952:25:35;;3948:84;;-1:-1:-1;;;;;237:2306:36;;4045:28:35;;4041:90;;237:2306:36;;17766:22:35;17762:79;;-1:-1:-1;17893:3:35;237:2306:36;;17870:21:35;;;;;-1:-1:-1;;;;;17916:13:35;;;;:::i;:::-;237:2306:36;;17916:27:35;17912:111;;-1:-1:-1;18056:5:35;;;;;;17893:3;237:2306:36;;17855:13:35;;18063:3;-1:-1:-1;;;;;18090:13:35;;;;:::i;:::-;237:2306:36;;-1:-1:-1;;;;;18107:13:35;237:2306:36;;18107:13:35;:::i;:::-;237:2306:36;;18090:30:35;18086:117;;237:2306:36;;18041:13:35;;18086:117;-1:-1:-1;;;;;18170:13:35;237:2306:36;;18170:13:35;:::i;:::-;237:2306:36;;18151:33:35;;;-1:-1:-1;18151:33:35;;237:2306:36;;-1:-1:-1;18151:33:35;17912:111;-1:-1:-1;;;;;237:2306:36;17994:13:35;;237:2306:36;17994:13:35;:::i;:::-;237:2306:36;;17970:38:35;;;-1:-1:-1;17970:38:35;;237:2306:36;;-1:-1:-1;17970:38:35;17870:21;-1:-1:-1;237:2306:36;;;17870:21:35;;;;;;;237:2306:36;;-1:-1:-1;;;;;237:2306:36;;;;;;;;;;-1:-1:-1;237:2306:36;;;4285:84:35;;237:2306:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;237:2306:36;;;;;4211:255:35;;;237:2306:36;;;-1:-1:-1;;;;;237:2306:36;;;4211:255:35;;;237:2306:36;;;;;;;4211:255:35;;;237:2306:36;;;;;;;-1:-1:-1;;;;;;237:2306:36;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;237:2306:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;237:2306:36;;;4517:15:35;237:2306:36;;;;;;;;-1:-1:-1;;;;;;237:2306:36;;;;;;;4624:26:35;;237:2306:36;;;;;;;4688:25:35;;;237:2306:36;;;;;;;;;;;;;;;;;;;17850:377:35;237:2306:36;;-1:-1:-1;237:2306:36;;-1:-1:-1;237:2306:36;-1:-1:-1;237:2306:36;;;;;;;-1:-1:-1;;;;;237:2306:36;;;;4796:44:35;;;:::i;:::-;;4751:233;237:2306:36;;;;;;;;;4751:233:35;4871:43;;4928:45;4871:43;;:::i;:::-;;4928:45;:::i;:::-;;4751:233;;237:2306:36;;;-1:-1:-1;;;;;237:2306:36;;;;;;;;;;;;;;;;-1:-1:-1;237:2306:36;;;-1:-1:-1;237:2306:36;;;;;;;;;;;;;;;;-1:-1:-1;237:2306:36;;;;;;;;;;-1:-1:-1;237:2306:36;;4517:15:35;237:2306:36;;-1:-1:-1;237:2306:36;17762:79:35;17811:19;;;-1:-1:-1;17811:19:35;;-1:-1:-1;17811:19:35;4041:90;4096:24;;;-1:-1:-1;4096:24:35;;-1:-1:-1;4096:24:35;3948:84;4000:21;;;-1:-1:-1;4000:21:35;;-1:-1:-1;4000:21:35;237:2306:36;;;;;;;:::i;:::-;;;;;;;;;;-1:-1:-1;237:2306:36;;;;;;;;;-1:-1:-1;;237:2306:36;;;-1:-1:-1;;;;;237:2306:36;;;;;;;;;;:::o;:::-;;;-1:-1:-1;;;;;237:2306:36;;;;;;:::o;:::-;;;-1:-1:-1;;;;;237:2306:36;;;;;;:::o;:::-;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;6145:316:93;-1:-1:-1;;;;;237:2306:36;;3976:1:35;237:2306:36;;;-1:-1:-1;;;;;;;;;;;237:2306:36;;;;;;;;;;-1:-1:-1;;;;;237:2306:36;3976:1:35;237:2306:36;;;-1:-1:-1;;;;;;;;;;;237:2306:36;;;;;;;-1:-1:-1;;237:2306:36;;;;;735:10:121;;237:2306:36;-1:-1:-1;;;;;;;;;;;3976:1:35;;6336:40:93;6313:4;6390:11;:::o;6238:217::-;6432:12;3976:1:35;6432:12:93;:::o;6145:316::-;-1:-1:-1;;;;;237:2306:36;;;;;;-1:-1:-1;;;;;;;;;;;237:2306:36;;;;;;;;;;-1:-1:-1;;;;;237:2306:36;;;;;-1:-1:-1;;;;;;;;;;;237:2306:36;;;;;;;-1:-1:-1;;237:2306:36;;;;;735:10:121;;237:2306:36;-1:-1:-1;;;;;;;;;;;2089:33:35;-1:-1:-1;;;;;;;;;;;6336:40:93;237:2306:36;6336:40:93;6313:4;6390:11;:::o;6145:316::-;237:2306:36;;;-1:-1:-1;;;;;;;;;;;237:2306:36;;-1:-1:-1;;;;;;;;;;;237:2306:36;;;;;;;;;-1:-1:-1;;;;;;;;;;;237:2306:36;;-1:-1:-1;;;;;;;;;;;237:2306:36;;-1:-1:-1;;237:2306:36;6313:4:93;237:2306:36;;;735:10:121;;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;237:2306:36;;6336:40:93;6313:4;6390:11;:::o;6238:217::-;237:2306:36;6432:12:93;:::o","linkReferences":{}},"deployedBytecode":{"object":"0x60806040526004361015610011575f80fd5b5f3560e01c806301ffc9a7146100f45780630bece356146100ef578063248a9ca3146100ea5780632f2ff15d146100e557806336568abe146100e05780634d6d9ffb146100db5780635972185a146100d6578063682ed5f0146100d157806391d14854146100cc578063a217fddf146100c7578063d547741f146100c2578063ddba6537146100bd578063edce8bdc146100b85763ef913a4b146100b3575f80fd5b610a16565b61095e565b61088b565b61085c565b610842565b6107f4565b6105e6565b6105ac565b6103ac565b610350565b61031a565b6102b5565b610217565b34610195576020600319360112610195576004357fffffffff00000000000000000000000000000000000000000000000000000000811680910361019557807f7965db0b000000000000000000000000000000000000000000000000000000006020921490811561016b575b506040519015158152f35b7f01ffc9a7000000000000000000000000000000000000000000000000000000009150145f610160565b5f80fd5b9060206003198301126101955760043567ffffffffffffffff811161019557826023820112156101955780600401359267ffffffffffffffff84116101955760248483010111610195576024019190565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b346101955761028161022836610199565b5f80527f4c48d1d2b0f4f7485fc28e3db22341d96a20aa29e6efa8149da9751603abd4e06020527f6e0c24a6e293ff9b755263dbaa15ba3796b0b8d3fe17cfb4ddf8143b268eac475490919060ff161561029957610d9d565b6040516003821015610294576020918152f35b6101ea565b6102a1611287565b610d9d565b90816020910312610195573590565b346101955760206003193601126101955760206102df6004355f525f602052600160405f20015490565b604051908152f35b6003196040910112610195576004359060243573ffffffffffffffffffffffffffffffffffffffff811681036101955790565b346101955761034e61032b366102e7565b90610349610344825f525f602052600160405f20015490565b61130f565b61221d565b005b346101955761035e366102e7565b3373ffffffffffffffffffffffffffffffffffffffff8216036103845761034e916122f4565b7f6697b232000000000000000000000000000000000000000000000000000000005f5260045ffd5b346101955760206003193601126101955760043567ffffffffffffffff8111610195578060040160806003198336030112610195575f80527f4c48d1d2b0f4f7485fc28e3db22341d96a20aa29e6efa8149da9751603abd4e060205260ff7f6e0c24a6e293ff9b755263dbaa15ba3796b0b8d3fe17cfb4ddf8143b268eac4754161561059f575b61044761044260248401611192565b61137c565b60648201916001610458848461119c565b90500361056157906104a96104966104a261049d61049661049061048961048460446104e09a01611192565b611b30565b988761119c565b9061126e565b3691610b4d565b6123c9565b928061121d565b906001840154906040516104d7816104c960208201948560209181520190565b03601f198101835282610afd565b51902091612457565b805161051f5761051b61050b6104fe845467ffffffffffffffff1690565b67ffffffffffffffff1690565b6040519081529081906020820190565b0390f35b61053361052e61055e9261259c565b6125c9565b7fd039601e000000000000000000000000000000000000000000000000000000005f52600452602490565b5ffd5b61055e61056e848461119c565b7f88b3170e000000000000000000000000000000000000000000000000000000005f52600160045260245250604490565b6105a7611287565b610433565b34610195575f6003193601126101955760206040517fbd893629a699470e4ec82a5715bb4981fdaacc5d0a728bf5f55b801d8f4ef10b8152f35b346101955760206003193601126101955760043567ffffffffffffffff8111610195578060040160a06003198336030112610195575f80527f4c48d1d2b0f4f7485fc28e3db22341d96a20aa29e6efa8149da9751603abd4e060205260ff7f6e0c24a6e293ff9b755263dbaa15ba3796b0b8d3fe17cfb4ddf8143b268eac475416156107e7575b61067c61044260248401611192565b6064820191600161068d848461119c565b90500361056157608481019060206106a5838561121d565b9050036107a957906106f46104966106ed6106e56106de61049d6104966104906106d761048460446107149c01611192565b9b8b61119c565b948761121d565b8101906102a6565b948061121d565b906001850154906040516104d7816104c960208201948560209181520190565b8051156107755761052e6107279161259c565b908082036107475761051b61050b6104fe855467ffffffffffffffff1690565b7f56ed1b63000000000000000000000000000000000000000000000000000000005f5260045260245260445ffd5b61055e827f56ed1b63000000000000000000000000000000000000000000000000000000005f52906044916004525f602452565b61055e6107b6838561121d565b7f24fadac8000000000000000000000000000000000000000000000000000000005f52602060045260245250604490565b6107ef611287565b61066d565b3461019557602060ff610836610809366102e7565b905f525f845260405f209073ffffffffffffffffffffffffffffffffffffffff165f5260205260405f2090565b54166040519015158152f35b34610195575f6003193601126101955760206040515f8152f35b346101955761034e61086d366102e7565b90610886610344825f525f602052600160405f20015490565b6122f4565b346101955761089936610199565b50505f80527f4c48d1d2b0f4f7485fc28e3db22341d96a20aa29e6efa8149da9751603abd4e06020527f6e0c24a6e293ff9b755263dbaa15ba3796b0b8d3fe17cfb4ddf8143b268eac475460ff1615610915575b7f2c1ed462000000000000000000000000000000000000000000000000000000005f5260045ffd5b61091d611287565b6108ed565b67ffffffffffffffff81160361019557565b601f19601f602060409481855280519182918282880152018686015e5f8582860101520116010190565b346101955760206003193601126101955761097e60043561048481610922565b67ffffffffffffffff8154166002600183015492019060405192608084019160208501526040840152606080840152815480915260a08301915f5260205f20905f5b8181106109ea5761051b856109de818703601f198101835282610afd565b60405191829182610934565b825473ffffffffffffffffffffffffffffffffffffffff168452602090930192600192830192016109c0565b34610195575f6003193601126101955761051b60405173ffffffffffffffffffffffffffffffffffffffff60015416602082015267ffffffffffffffff600254818116604084015260401c16606082015267ffffffffffffffff600354818116608084015260401c1660a082015260a081526109de60c082610afd565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b6060810190811067ffffffffffffffff821117610adc57604052565b610a93565b6040810190811067ffffffffffffffff821117610adc57604052565b90601f601f19910116810190811067ffffffffffffffff821117610adc57604052565b60405190610b2f604083610afd565b565b67ffffffffffffffff8111610adc57601f01601f191660200190565b929192610b5982610b31565b91610b676040519384610afd565b829481845281830111610195578281602093845f960137010152565b9080601f8301121561019557816020610b9e93359101610b4d565b90565b6020818303126101955780359067ffffffffffffffff8211610195570180820391608083126101955760405192610bd784610ac0565b823567ffffffffffffffff811161019557604091610bfa84601f19938701610b83565b8652011261019557604051610c0e81610ae1565b6020830135610c1c81610922565b81526040830135610c2c81610922565b60208201526020840152606082013567ffffffffffffffff811161019557610c549201610b83565b604082015290565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b9060018201809211610c9757565b610c5c565b60c001908160c011610c9757565b60f701908160f711610c9757565b6080019081608011610c9757565b60b701908160b711610c9757565b91908201809211610c9757565b908160011b9180830460021490151715610c9757565b81519167ffffffffffffffff8311610adc57680100000000000000008311610adc578154838355808410610d77575b506020610d389101915f5260205f2090565b5f5b838110610d475750505050565b6001906020610d6a855173ffffffffffffffffffffffffffffffffffffffff1690565b9401938184015501610d3a565b825f528360205f2091820191015b818110610d925750610d26565b5f8155600101610d85565b610da991810190610ba1565b9060208201610dc461044282515167ffffffffffffffff1690565b610dce8351611614565b92606084019367ffffffffffffffff610def865167ffffffffffffffff1690565b161561116a5760035491604083901c67ffffffffffffffff1693610e1d67ffffffffffffffff861642610cd4565b9460a0840195610e35875167ffffffffffffffff1690565b9067ffffffffffffffff82161161112b5750505160200151610e7290610e649067ffffffffffffffff16611b30565b9367ffffffffffffffff1690565b67ffffffffffffffff81168015159081611102575b506110ad575090610ef591610eb66002610eae610ea385611bc2565b60e086015190611cf8565b950185611f11565b610ec660c0830194855190612036565b60406080610ee960015473ffffffffffffffffffffffffffffffffffffffff1690565b930151910151916120d9565b610f22610f0a865167ffffffffffffffff1690565b67ffffffffffffffff165f52600460205260405f2090565b610f376104fe825467ffffffffffffffff1690565b61103b5750916002610fb5928694610fa8610f73610f64610f0a610fc39a9b5167ffffffffffffffff1690565b955167ffffffffffffffff1690565b859067ffffffffffffffff167fffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000825416179055565b6001840155519101610cf7565b5167ffffffffffffffff1690565b600254610fdc9060401c67ffffffffffffffff166104fe565b67ffffffffffffffff821611610ff157505f90565b611037907fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff6fffffffffffffffff00000000000000006002549260401b16911617600255565b5f90565b91611051611059945167ffffffffffffffff1690565b90519261214f565b6110a75761055e611072835167ffffffffffffffff1690565b7fc1aea5f7000000000000000000000000000000000000000000000000000000005f5267ffffffffffffffff16600452602490565b60029150565b61055e906110c3855467ffffffffffffffff1690565b7feae35725000000000000000000000000000000000000000000000000000000005f5267ffffffffffffffff9081166004524260245216604452606490565b9050611123429161111e6104fe885467ffffffffffffffff1690565b610cd4565b11155f610e87565b7f9b772277000000000000000000000000000000000000000000000000000000005f524260045267ffffffffffffffff9081166024521660445260645ffd5b7f59d119e3000000000000000000000000000000000000000000000000000000005f5260045ffd5b35610b9e81610922565b9035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe181360301821215610195570180359067ffffffffffffffff821161019557602001918160051b3603831361019557565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b9035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe181360301821215610195570180359067ffffffffffffffff82116101955760200191813603831361019557565b9015611282578061127e9161121d565b9091565b6111f0565b335f9081527f4c48d1d2b0f4f7485fc28e3db22341d96a20aa29e6efa8149da9751603abd4e0602052604090205460ff16156112bf57565b7fe2517d3f000000000000000000000000000000000000000000000000000000005f52336004527fbd893629a699470e4ec82a5715bb4981fdaacc5d0a728bf5f55b801d8f4ef10b60245260445ffd5b805f525f60205260ff6113433360405f209073ffffffffffffffffffffffffffffffffffffffff165f5260205260405f2090565b54161561134d5750565b7fe2517d3f000000000000000000000000000000000000000000000000000000005f523360045260245260445ffd5b67ffffffffffffffff168061138e5750565b7f3ce598a9000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b60405190610100820182811067ffffffffffffffff821117610adc57604052606060e0838281528260208201528260408201525f838201525f60808201525f60a08201528260c08201520152565b8051600110156112825760400190565b805160071015611282576101000190565b8051600d1015611282576101c00190565b8051600e1015611282576101e00190565b805160081015611282576101200190565b8051600310156112825760800190565b8051600b1015611282576101800190565b8051600c1015611282576101a00190565b8051600410156112825760a00190565b8051156112825760200190565b8051600210156112825760600190565b805160101015611282576102200190565b80518210156112825760209160051b010190565b67ffffffffffffffff8111610adc5760051b60200190565b90611501826114df565b61150e6040519182610afd565b828152601f1961151e82946114df565b0190602036910137565b90602082519201517fffffffffffffffffffffffffffffffffffffffff00000000000000000000000081169260148110611560575050565b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000929350829060140360031b1b161690565b60405160c091906115a38382610afd565b6005815291601f1901825f5b8281106115bb57505050565b8060606020809385010152016115af565b906115d6826114df565b6115e36040519182610afd565b828152601f196115f382946114df565b01905f5b82811061160357505050565b8060606020809385010152016115f7565b61163061162b6116226113b9565b9280845261259c565b61260b565b602082019080825251600f8110611b0557507f1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d493476116766116708351611407565b516126d6565b03611aca57600161169061168a8351611417565b516125c9565b03611a8f577f63746963616c2062797a616e74696e65206661756c7420746f6c6572616e63656116c36116708351611428565b03611a54576116db6116d58251611439565b516126f2565b80516008811490811591611a24575b506119ea575061162b61175d6116d5836117216117106104fe61168a611762985161144a565b67ffffffffffffffff166060880152565b61172e611670825161145b565b60808701526117576117466104fe61168a845161146b565b67ffffffffffffffff1660a0880152565b5161147c565b61259c565b90604081019180835251600581036119bf57506117886117828351611407565b5161260b565b908151156119975761179a82516114f7565b9360c082019485525f5b8351811015611933576117ba6116d582866114cb565b80516014810361190857506117d16117d791611528565b60601c90565b73ffffffffffffffffffffffffffffffffffffffff811680156118c6575f5b8381106118325750509061182c600192611811838a516114cb565b9073ffffffffffffffffffffffffffffffffffffffff169052565b016117a4565b8161187761185e611844848d516114cb565b5173ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff1690565b14611884576001016117f6565b7f41fe18cc000000000000000000000000000000000000000000000000000000005f5273ffffffffffffffffffffffffffffffffffffffff831660045260245ffd5b7f59bff387000000000000000000000000000000000000000000000000000000005f5273ffffffffffffffffffffffffffffffffffffffff821660045260245ffd5b7f83e46ad2000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b509261178291945061194692505161148d565b61195081516115cc565b9260e081019384525f5b8251811015611991578061198a816119776116d5600195886114cb565b88519061198483836114cb565b526114cb565b500161195a565b50925050565b7f339e1ffb000000000000000000000000000000000000000000000000000000005f5260045ffd5b7f30c6792a000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b611a20906040519182917fd5edd2a500000000000000000000000000000000000000000000000000000000835260048301610934565b0390fd5b7f011b4d03dd8c01f1049143cf9c4c817e4b167f1d1b83e5c6f0f10d89ba1e7bce9150602083012014155f6116ea565b611a6461167061055e9251611428565b7fa19e609c000000000000000000000000000000000000000000000000000000005f52600452602490565b611a9f61168a61055e9251611417565b7ff71b722f000000000000000000000000000000000000000000000000000000005f52600452602490565b611ada61167061055e9251611407565b7fb8120dca000000000000000000000000000000000000000000000000000000005f52600452602490565b7fbc277732000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b67ffffffffffffffff1690815f52600460205260405f209167ffffffffffffffff83541615611b5c5750565b7ff761631b000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b60405190611b96604083610afd565b600182527fc0000000000000000000000000000000000000000000000000000000000000006020830152565b6020611c7d611bcf611592565b611c48611be660408601611bec611be6825161149d565b51612ff9565b611bf58561149d565b52611bff8461149d565b50611c0d611be68251611407565b611c1685611407565b52611c2084611407565b50611c2e611be682516114aa565b611c37856114aa565b52611c41846114aa565b505161145b565b611c518261145b565b52611c5b8161145b565b50611c64611b87565b611c6d8261148d565b52611c778161148d565b506127c8565b910190611c8b8251516115cc565b905f5b83518051821015611ce1579080600192600c82145f14611ccf575050611cb383612880565b611cbd82866114cb565b52611cc881856114cb565b5001611c8e565b611cdc91611be6916114cb565b611cb3565b505050611cee91506127c8565b6020815191012090565b919091611d0583516114f7565b925f5b8151811015611efe57611d1b81836114cb565b51805160418103611ed3575080601b60ff611d6a611d64611d3e611d779661285f565b517fff000000000000000000000000000000000000000000000000000000000000001690565b60f81c90565b1610611e80575b846130a7565b90611d81816128fa565b1590811591611e76575b508015611e58575b611e305773ffffffffffffffffffffffffffffffffffffffff81165f5b838110611dd057505090611dca60019261181183896114cb565b01611d08565b81611de161185e611844848c6114cb565b14611dee57600101611db0565b7f33af0d5f000000000000000000000000000000000000000000000000000000005f5273ffffffffffffffffffffffffffffffffffffffff831660045260245ffd5b7f09cb44e6000000000000000000000000000000000000000000000000000000005f5260045ffd5b5073ffffffffffffffffffffffffffffffffffffffff811615611d93565b905015155f611d8b565b611ec2611e9a611e95611d64611d3e8561285f565b6128e8565b60f81b7fff000000000000000000000000000000000000000000000000000000000000001690565b5f1a611ecd8261285f565b53611d71565b7ff2db9ce1000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b505050565b5f198114610c975760010190565b905f915f5b8151811015611f6a57611f4973ffffffffffffffffffffffffffffffffffffffff611f4183856114cb565b511684612904565b611f56575b600101611f16565b92611f62600191611f03565b939050611f4e565b50506003611f79915404610c89565b90818110611f85575050565b7fe2dcb1b9000000000000000000000000000000000000000000000000000000005f5260045260245260445ffd5b905f198201918211610c9757565b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff408201918211610c9757565b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff808201918211610c9757565b6020039060208211610c9757565b91908203918211610c9757565b905f915f5b815181101561208f5761206e73ffffffffffffffffffffffffffffffffffffffff61206683856114cb565b51168461295b565b61207b575b60010161203b565b92612087600191611f03565b939050612073565b50505190600382048203918211610c97578181106120ab575050565b7f7818f4e4000000000000000000000000000000000000000000000000000000005f5260045260245260445ffd5b6121239261162b9261175d926040517fffffffffffffffffffffffffffffffffffffffff000000000000000000000000602082019260601b168252601481526104d7603482610afd565b805160021015611282576060610b9e9101516126d6565b8054821015611282575f5260205f2001905f90565b919067ffffffffffffffff8061216d855467ffffffffffffffff1690565b92169116149081159161220e575b5061220857600201908154815103612208575f5b8151811015612200576121c56121a5828561213a565b905473ffffffffffffffffffffffffffffffffffffffff9160031b1c1690565b73ffffffffffffffffffffffffffffffffffffffff6121ea61185e61184485876114cb565b9116036121f95760010161218f565b5050505f90565b505050600190565b50505f90565b9050600182015414155f61217b565b805f525f60205260ff6122518360405f209073ffffffffffffffffffffffffffffffffffffffff165f5260205260405f2090565b541661220857805f525f6020526122898260405f209073ffffffffffffffffffffffffffffffffffffffff165f5260205260405f2090565b60017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0082541617905573ffffffffffffffffffffffffffffffffffffffff339216907f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d5f80a4600190565b805f525f60205260ff6123288360405f209073ffffffffffffffffffffffffffffffffffffffff165f5260205260405f2090565b54161561220857805f525f6020526123618260405f209073ffffffffffffffffffffffffffffffffffffffff165f5260205260405f2090565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00815416905573ffffffffffffffffffffffffffffffffffffffff339216907ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b5f80a4600190565b60208151910120604051602081019182527f1260944489272988d9df285149b5aa1b0f48f2136d6f416159f840a3e074760060408201526040815261240f606082610afd565b51902090565b60405190612424602083610afd565b5f808352366020840137565b9061243a82610b31565b6124476040519182610afd565b828152601f1961151e8294610b31565b61162b6124999194939461246b6020610b31565b956124796040519788610afd565b602087526124876020610b31565b601f196020890191013682375261259c565b906124a48451610ce1565b91845115158061257c575b6124b8906125c2565b6124ca6124c55f85612029565b612430565b925f19015f5b8181106124e4575050610b9e939450612acf565b80612566600f612529612560611d64611d3e8d61250360029960011c90565b908d61255a8a6125528a612529612520611d64611d3e8a8a61286f565b60041c600f1690565b1660f81b7fff000000000000000000000000000000000000000000000000000000000000001690565b5f1a9261286f565b5361286f565b60ff1690565b5f1a612575600183018861286f565b53016124d0565b5060016124af565b6040519061259182610ae1565b5f6020838281520152565b6125a4612584565b506020815191604051926125b784610ae1565b835201602082015290565b1561019557565b805180151590816125ff575b5015610195576125e490612da5565b905190602081106125f3575090565b6020036101000a900490565b6021915011155f6125d5565b61261481612dd1565b156101955761262281612df1565b61262b816114df565b916126396040519384610afd565b818352601f19612648836114df565b015f5b8181106126bf575050602061266b91015161266581612e52565b90610cd4565b5f905b82821061267b5750505090565b6126b78161268a600193612ebd565b90612693610b20565b8281528160208201526126a686896114cb565b526126b185886114cb565b50610cd4565b91019061266e565b6020906126ca612584565b8282880101520161264b565b6021815103610195576020015160018101809111610c97575190565b80511561019557612705610b9e91612da5565b61271181939293612430565b928360200190612f86565b805191908290602001825e015f815290565b610b2f9061275061274a9493604051958693602085019061271c565b9061271c565b03601f198101845283610afd565b6001907fff00000000000000000000000000000000000000000000000000000000000000610b9e9493168152019061271c565b916001610b9e94937fff0000000000000000000000000000000000000000000000000000000000000061274a94168152019061271c565b6127d0612415565b905f915b81518310156127fc576127f46001916127ed85856114cb565b519061272e565b9201916127d4565b91505080516038811061283b5750610b9e6128178251613025565b916104c961282b611e9a6125608651610caa565b9160405194859360208501612791565b61284d611e9a612560610b9e93610c9c565b6104c96040519384926020840161275e565b8051604010156112825760600190565b908151811015611282570160200190565b6001815114806128cd575b610b9e578051603881106128bb5750610b9e6128a78251613025565b916104c961282b611e9a6125608651610cc6565b61284d611e9a612560610b9e93610cb8565b50608060ff6128e1611d64611d3e8561149d565b161061288b565b60ff601b9116019060ff8211610c9757565b6004111561029457565b905f5b82548110156121f95773ffffffffffffffffffffffffffffffffffffffff61292f828561213a565b90549060031b1c1673ffffffffffffffffffffffffffffffffffffffff83161461220057600101612907565b905f5b82518110156121f95773ffffffffffffffffffffffffffffffffffffffff61298682856114cb565b511673ffffffffffffffffffffffffffffffffffffffff8316146122005760010161295e565b91906129b88351610ce1565b908351151580612ac5575b6129cc906125c2565b6129d96124c58284612029565b938192600180841614612a63575b5f19869101935b8481106129fc575050505050565b83612a5a6001612a50600f612529612560611d64611d3e8b60029b612a49612a3c886125298f611d64611d3e612a356125209360011c90565b809961286f565b9b8d03809c5f1a9261286f565b538c61286f565b5f1a92018961286f565b530185906129ee565b92507f0f00000000000000000000000000000000000000000000000000000000000000612aa2612560611d64611d3e612a9c8760011c90565b8661286f565b60f81b165f1a612ab18661149d565b535f19612abd83611f03565b9390506129e7565b50818111156129c3565b915f915f612adb612584565b50845115612d6c5790935f915b81518310156101955782158080612d56575b61019557159081612d39575b5061019557612b1861178283836114cb565b948551600281145f14612c155750612b3a612b356116d58861149d565b61313c565b95612b50612b498888846131a9565b8092610cd4565b965111612bf75715612b875750612b679051611fb3565b11610195575111612b7e576116d5610b9e91611407565b50610b9e612415565b919094612b948651611fb3565b82146101955780612bb6612bb2612bac600194611407565b51612dd1565b1590565b15612bd857612bc7612bcd91611407565b5161312e565b915b01919490612ae8565b612be4612bf191611407565b5160208101519051902090565b91612bcf565b505091509250612c08915051611fb3565b1161019557610b9e612415565b929491939192601103612cda5781518314612cbc57612c46612c40612560611d64611d3e878761286f565b93610c89565b92601081101561019557612c63612c5d82896114cb565b51613118565b15612c855750505050612c7891925051611fb3565b0361019557610b9e612415565b86612c9d612bb2612bac84600196989a97999b6114cb565b15612caf57612bf191612bc7916114cb565b612bf191612be4916114cb565b505050612cc99051611fb3565b03610195576116d5610b9e916114ba565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f696e76616c6964206e6f6465206c656e677468000000000000000000000000006044820152606490fd5b9050612d4e612d4884846114cb565b516130e1565b14155f612b06565b50612d64612be485856114cb565b871415612afa565b509050612d9d92507f56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b4219150146125c2565b610b9e612415565b906020820191612db58351612e52565b925190838201809211610c975751928303928311610c97579190565b805115612dec57602060c0910151515f1a1061103757600190565b505f90565b805115612dec575f9060208101908151612e0a81612e52565b8101809111610c9757915190518101809111610c975791905b828110612e305750905090565b612e3981612ebd565b8101809111610c9757612e4c9091611f03565b90612e23565b515f1a6080811015612e6357505f90565b60b881108015612ea7575b15612e795750600190565b60c0811015612e9857610b9e90612e939060b75b90612029565b610c89565b610b9e90612e939060f7612e8d565b5060c08110158015612e6e575060f88110612e6e565b80515f1a906080821015612ed2575050600190565b60b8821015612ee85750612e93610b9e91611fee565b60c0821015612f295760010151602082900360b7016101000a9004017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff4a0190565b60f8821015612f3f5750612e93610b9e91611fc1565b60010151602082900360f7016101000a9004017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0a0190565b601f8111610c97576101000a90565b90918015611efe575b6020811015612fc95780612fa257505050565b612fb6612fb1612fbb9261201b565b612f77565b611fb3565b905182518216911916179052565b91908051825260208101809111610c97579060208101809111610c975791601f19810190811115612f8f57610c5c565b6130038151612430565b9081511561302157806020610b9e9201519051908360200190612f86565b5090565b5f81805b613093575061303781612430565b91815b61304357505090565b61304c82611fb3565b61307e7fff000000000000000000000000000000000000000000000000000000000000008360f81b165f1a918561286f565b5360081c908015610c97575f1901908161303a565b9061309d90611f03565b9060081c80613029565b81519190604183036130d7576130d09250602082015190606060408401519301515f1a9061324d565b9192909190565b50505f9160029190565b805160208110156130f9575060208101519051902090565b906020015120604051602081019182526020815261240f604082610afd565b6001815103612dec5760200151515f1a60801490565b61313790612da5565b902090565b9081511561019557600f613158612520611d64611d3e8661149d565b168061316b5750610b9e60025f936129ac565b600181036131805750610b9e60015f936129ac565b600281036131965750610b9e60026001936129ac565b60030361019557610b9e600180936129ac565b91905f5b838101808211610c97578251811080613243575b1561323b576131f17fff00000000000000000000000000000000000000000000000000000000000000918461286f565b51167fff0000000000000000000000000000000000000000000000000000000000000061321e838661286f565b511690036132345761322f90611f03565b6131ad565b9250505090565b509250505090565b50835182106131c1565b91907f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a084116132dc579160209360809260ff5f9560405194855216868401526040830152606082015282805260015afa156132d1575f5173ffffffffffffffffffffffffffffffffffffffff8116156132c757905f905f90565b505f906001905f90565b6040513d5f823e3d90fd5b5050505f916003919056fea164736f6c634300081c000a","sourceMap":"237:2306:36:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;;;;-1:-1:-1;;237:2306:36;;;;;;;;;;;;;;;2639:47:93;2654:32;237:2306:36;2639:47:93;;:87;;;;;237:2306:36;;;;;;;;;;2639:87:93;844:25:133;829:40;;;2639:87:93;;;237:2306:36;-1:-1:-1;237:2306:36;;;;;-1:-1:-1;;237:2306:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;5705:2265:35;237:2306:36;;;:::i;:::-;-1:-1:-1;237:2306:36;;;;;;;;;;;;23324:42:35;23320:105;;5705:2265;:::i;:::-;237:2306:36;;;;;;;;;;;;;;;:::i;23320:105:35:-;23393:20;;:::i;:::-;5705:2265;:::i;237:2306:36:-;;;;;;;;;;;:::o;:::-;;;;;-1:-1:-1;;237:2306:36;;;;;;;;;3867:6:93;237:2306:36;3867:6:93;237:2306:36;;3867:22:93;237:2306:36;3867:6:93;237:2306:36;3867:22:93;237:2306:36;3776:120:93;;237:2306:36;;;;;;;;-1:-1:-1;;237:2306:36;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;4296:25:93;237:2306:36;;;:::i;:::-;4266:18:93;2475:4;4266:18;;3867:6;237:2306:36;3867:6:93;237:2306:36;;3867:22:93;237:2306:36;3867:6:93;237:2306:36;3867:22:93;237:2306:36;3776:120:93;;4266:18;2475:4;:::i;:::-;4296:25;:::i;:::-;237:2306:36;;;;;;;;:::i;:::-;735:10:121;237:2306:36;;;5387:34:93;5383:102;;5495:37;;;:::i;5383:102::-;5444:30;;;237:2306:36;5444:30:93;;237:2306:36;;;;;-1:-1:-1;;237:2306:36;;;;;;;;;;;;;;;;-1:-1:-1;;237:2306:36;;;;;;;-1:-1:-1;237:2306:36;;;;;;;;;23324:42:35;23320:105;;237:2306:36;9433:31:35;;:16;;;:31;:::i;:::-;;:::i;:::-;9479:9;;;;9499:1;9479:9;;;;:::i;:::-;:21;;;9475:97;;9641:31;237:2306:36;9787:10:35;9705:36;237:2306:36;9728:12:35;:9;9622:51;9641:31;;9787:95;9641:31;;;:::i;:::-;9622:51;:::i;:::-;9728:9;;;:::i;:::-;:12;;:::i;:::-;237:2306:36;;;:::i;:::-;9705:36:35;:::i;:::-;9787:10;;;:::i;237:2306:36:-;9813:26:35;9499:1;9813:26;;237:2306:36;;;;9851:29:35;;;237:2306:36;9851:29:35;;;;237:2306:36;;;;;;;9851:29:35;;-1:-1:-1;;9851:29:35;;;;;;:::i;:::-;237:2306:36;9841:40:35;;9787:95;;:::i;:::-;237:2306:36;;9892:109:35;;237:2306:36;10010:31:35;237:2306:36;;;;;;;;;;;;10010:31:35;237:2306:36;;;;;;;;;;;;;;;;;9892:109:35;9959:29;:20;9939:51;9959:20;;:::i;:::-;:29;:::i;:::-;9939:51;-1:-1:-1;9939:51:35;237:2306:36;;;;;9939:51:35;-1:-1:-1;9939:51:35;9475:97;9523:38;9544:9;;;;:::i;:::-;9523:38;-1:-1:-1;9523:38:35;9499:1;237:2306:36;;;;-1:-1:-1;237:2306:36;;;23320:105:35;23393:20;;:::i;:::-;23320:105;;237:2306:36;;;;;-1:-1:-1;;237:2306:36;;;;;;;;2089:33:35;237:2306:36;;;;;;;;-1:-1:-1;;237:2306:36;;;;;;;;;;;;;;;;-1:-1:-1;;237:2306:36;;;;;;;-1:-1:-1;237:2306:36;;;;;;;;;23324:42:35;23320:105;;237:2306:36;8205:31:35;;:16;;;:31;:::i;:::-;8251:9;;;;8271:1;8251:9;;;;:::i;:::-;:21;;;8247:97;;8357:10;;;;237:2306:36;8357:10:35;;;;:::i;:::-;:23;;;8353:102;;8524:31;237:2306:36;8737:10:35;8658:33;8669:10;8588:36;237:2306:36;8611:12:35;:9;8505:51;8524:31;;8737:95;8524:31;;;:::i;8505:51::-;8611:9;;;:::i;8588:36::-;8669:10;;;:::i;:::-;8658:33;;;;:::i;:::-;8737:10;;;:::i;237:2306:36:-;8763:26:35;8271:1;8763:26;;237:2306:36;;;;8801:29:35;;;237:2306:36;8801:29:35;;;;237:2306:36;;;;;;;8737:95:35;237:2306:36;;8846:20:35;8842:107;;8989:20;:29;:20;;:::i;:29::-;9033:28;;;;9029:116;;237:2306:36;9154:31:35;237:2306:36;;;;;;;9029:116:35;9084:50;-1:-1:-1;9084:50:35;237:2306:36;;;;;-1:-1:-1;9939:51:35;8842:107;8889:49;;;-1:-1:-1;8889:49:35;237:2306:36;;;;;-1:-1:-1;237:2306:36;;;8353:102:35;8403:41;8426:10;;;;:::i;:::-;8403:41;-1:-1:-1;8403:41:35;237:2306:36;;;;;-1:-1:-1;237:2306:36;;;23320:105:35;23393:20;;:::i;:::-;23320:105;;237:2306:36;;;;;;2920:29:93;237:2306:36;;;:::i;:::-;;2920:6:93;237:2306:36;2920:6:93;237:2306:36;;;2920:6:93;237:2306:36;;;;;;;;;;;;;2920:29:93;237:2306:36;;;;;;;;;;;;;;;-1:-1:-1;;237:2306:36;;;;;;;;;;;;;;;;4713:26:93;237:2306:36;;;:::i;:::-;4683:18:93;2475:4;4683:18;;3867:6;237:2306:36;3867:6:93;237:2306:36;;3867:22:93;237:2306:36;3867:6:93;237:2306:36;3867:22:93;237:2306:36;3776:120:93;;2475:4;4713:26;:::i;237:2306:36:-;;;;;;;:::i;:::-;-1:-1:-1;;23363:1:35;237:2306:36;;;;;;;;;23324:42:35;23320:105;;237:2306:36;10175:25:35;23363:1;10175:25;237:2306:36;23363:1:35;10175:25;23320:105;23393:20;;:::i;:::-;23320:105;;237:2306:36;;;;;;;:::o;:::-;-1:-1:-1;;237:2306:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;-1:-1:-1;;237:2306:36;;;;;5517:34:35;237:2306:36;;;;;:::i;5517:34:35:-;237:2306:36;;;;5633:25:35;5605:26;;;237:2306:36;5633:25:35;;237:2306:36;;;;;;;5568:91:35;237:2306:36;5568:91:35;;237:2306:36;;;;;;;;;;;;;;;;;;;-1:-1:-1;237:2306:36;;-1:-1:-1;237:2306:36;;-1:-1:-1;237:2306:36;;;;;;;5568:91:35;;;;;-1:-1:-1;;5568:91:35;;;;;;:::i;:::-;237:2306:36;;;;;;;:::i;:::-;;;;;;;;;;;;5605:26:35;237:2306:36;;;;;;;;;;;;-1:-1:-1;;237:2306:36;;;;;;;;;5120:11:35;237:2306:36;;5109:23:35;;;237:2306:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5109:23:35;;;;;;:::i;237:2306:36:-;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;:::i;:::-;;;;;;;;;;;;;;;:::o;:::-;;;-1:-1:-1;;237:2306:36;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;:::i;:::-;:::o;:::-;;;;;;;;-1:-1:-1;;237:2306:36;;;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;-1:-1:-1;237:2306:36;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;:::i;:::-;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;-1:-1:-1;;237:2306:36;;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;:::o;:::-;;;;;;;;;;;;2219:66:35;237:2306:36;;;;;;;:::o;:::-;;:::i;:::-;22386:4:35;237:2306:36;;;22386:4:35;237:2306:36;;;:::o;:::-;22540:4:35;237:2306:36;;;22540:4:35;237:2306:36;;;:::o;:::-;21713:4:35;237:2306:36;;;21713:4:35;237:2306:36;;;:::o;:::-;21855:4:35;237:2306:36;;;21855:4:35;237:2306:36;;;:::o;:::-;;;;;;;;;;:::o;:::-;;;;;;;;;8605:1:37;237:2306:36;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;237:2306:36;;;-1:-1:-1;237:2306:36;;;;;;;;;;;;;;;;-1:-1:-1;237:2306:36;;;;;;5705:2265:35;5889:40;5705:2265;5889:40;;;;:::i;:::-;5960:18;;;;:33;237:2306:36;5960:18:35;;237:2306:36;;;;;5960:33:35;6034:28;6047:14;;6034:28;:::i;:::-;6076:13;;;;237:2306:36;;;;;;;;;;;6076:18:35;6072:77;;6180:25;237:2306:36;;;;;;;;6162:43:35;;237:2306:36;;;6162:15:35;:43;:::i;:::-;6208:16;;;;237:2306:36;;;;;;;;;6162:62:35;237:2306:36;;;-1:-1:-1;6158:178:35;;-1:-1:-1;;6412:18:35;5960;6412:33;237:2306:36;;;6393:53:35;;237:2306:36;;9622:51:35;:::i;6393:53::-;237:2306:36;;;;;;;;;6473:31:35;;;:139;;;;5705:2265;6456:298;;;6807:25;;7027:79;6807:25;6863:72;6180:25;6791:62;6807:25;;;:::i;:::-;6834:18;;;;6791:62;;:::i;:::-;6902:32;;6863:72;;:::i;:::-;6976:17;;;;;;;;;:::i;:::-;7088;7070:16;237:2306:36;6180:11:35;237:2306:36;;;;;;7070:16:35;;237:2306:36;7088:17:35;;;7027:79;;:::i;:::-;7165:30;237:2306:36;;;;;;;;;;;;7165:15:35;237:2306:36;;;;;;;7165:30:35;7209:37;237:2306:36;;;;;;;7209:37:35;7205:303;;237:2306:36;;6180:25:35;237:2306:36;;;;7601:46:35;237:2306:36;7561:30:35;237:2306:36;;;;;;;;;7561:30:35;237:2306:36;;;;;;;7601:46:35;237:2306:36;;;;;;;;;;;7601:46:35;6180:11;7657:29;;237:2306:36;7741:17:35;7710:28;;237:2306:36;:::i;:::-;;;;;;;6180:25:35;237:2306:36;7773:55:35;;237:2306:36;;;;;;7773:55:35;237:2306:36;;;7773:55:35;7769:141;;7920:43;5960:33;5705:2265;:::o;7769:141::-;7844:55;;237:2306:36;;6180:25:35;237:2306:36;;;;;;;;6180:25:35;237:2306:36;;7844:55:35;5960:33;5705:2265;:::o;7205:303::-;237:2306:36;;7266:95:35;237:2306:36;;;;;;;7343:17:35;;7266:95;;:::i;:::-;7262:175;;7457:40;237:2306:36;;;;;;;;7457:40:35;5960:33;7457:40;237:2306:36;;7165:15:35;237:2306:36;;;;7262:175:35;6180:25;;-1:-1:-1;7381:41:35:o;6456:298::-;6644:99;237:2306:36;;;;;;;;;6644:99:35;5960:33;6644:99;237:2306:36;;;;6644:99:35;237:2306:36;6162:15:35;237:2306:36;;;;;;;;6473:139:35;6162:15;;6524:69;6162:15;237:2306:36;6524:40:35;237:2306:36;;;;;;;6524:40:35;:69;:::i;:::-;:88;;6473:139;;;6158:178;6247:78;5960:33;6247:78;6162:15;6247:78;237:2306:36;;;;;;;;;;;-1:-1:-1;9939:51:35;6072:77;6117:21;5960:33;6117:21;;5960:33;6117:21;237:2306:36;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;:::i;:::-;;;:::o;:::-;;:::i;3165:103:93:-;735:10:121;2920:6:93;237:2306:36;;;;;;;;;;;;3485:23:93;3481:108;;3165:103::o;3481:108::-;3531:47;2920:6;3531:47;735:10:121;3531:47:93;237:2306:36;2089:33:35;237:2306:36;;;2920:6:93;3531:47;3165:103;237:2306:36;2920:6:93;237:2306:36;2920:6:93;237:2306:36;;;2920:29:93;735:10:121;237:2306:36;2920:6:93;237:2306:36;;;;;;;;;;;;;2920:29:93;237:2306:36;;3485:23:93;3481:108;;3165:103;:::o;3481:108::-;3531:47;2920:6;3531:47;735:10:121;3531:47:93;237:2306:36;;;;2920:6:93;3531:47;19876:177:35;237:2306:36;;19957:19:35;19953:94;;19876:177;:::o;19953:94::-;19999:37;19975:1;19999:37;;237:2306:36;;19975:1:35;19999:37;237:2306:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;237:2306:36;;;;-1:-1:-1;237:2306:36;;;;-1:-1:-1;237:2306:36;;;;;;;;;;;:::o;:::-;;;11070:1:35;237:2306:36;;;;;;;:::o;:::-;;;11239:1:35;237:2306:36;;;;;;;:::o;:::-;;;11378:2:35;237:2306:36;;;;;;;:::o;:::-;;;11564:2:35;237:2306:36;;;;;;;:::o;:::-;;;11607:1:35;237:2306:36;;;;;;;:::o;:::-;;;11837:1:35;237:2306:36;;;;;;;:::o;:::-;;;11910:2:35;237:2306:36;;;;;;;:::o;:::-;;;11978:2:35;237:2306:36;;;;;;;:::o;:::-;;;13209:1:35;237:2306:36;;;;;;;:::o;:::-;;;;;;;;;:::o;:::-;;;2043:1;237:2306;;;;;;;:::o;:::-;;;7571:2:37;237:2306:36;;;;;;;:::o;:::-;;;;;;;;;;;;;;;:::o;2219:66:35:-;;;;;;;;;;;:::o;:::-;;;;;:::i;:::-;237:2306:36;;;;;;:::i;:::-;2219:66:35;;;-1:-1:-1;;2219:66:35;;;;:::i;:::-;;;;;;;;:::o;:::-;;237:2306:36;;;;;2219:66:35;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;237:2306:36;2219:66:35;;;:::o;:::-;237:2306:36;;2219:66:35;;237:2306:36;;2219:66:35;237:2306:36;;:::i;:::-;1849:1;2219:66:35;;;-1:-1:-1;;2219:66:35;;-1:-1:-1;2219:66:35;;;;;;;;;:::o;:::-;;237:2306:36;2219:66:35;;;;;;;;;;;;;;;:::i;:::-;237:2306:36;;;;;;:::i;:::-;2219:66:35;;;-1:-1:-1;;2219:66:35;;;;:::i;:::-;;;-1:-1:-1;2219:66:35;;;;;;;;;:::o;:::-;;237:2306:36;2219:66:35;;;;;;;;;;10709:2705;10875:30;:21;237:2306:36;;:::i;:::-;10816:28:35;;;;10875:21;:::i;:::-;:30;:::i;:::-;10854:18;;;:51;;;;237:2306:36;10947:2:35;10919:30;;10915:114;;11051:18;2401:66;11051:36;:21;:18;;:21;:::i;:::-;;:36;:::i;:::-;11043:66;11039:168;;11070:1;11220:30;:21;:18;;:21;:::i;:::-;;:30;:::i;:::-;:35;11216:122;;2219:66;11359:37;:22;:18;;:22;:::i;:37::-;11351:67;11347:167;;11545:32;:22;:18;;:22;:::i;:::-;;:32;:::i;:::-;237:2306:36;;11607:1:35;11591:17;;;;;:73;;;10709:2705;11587:130;;;11750:18;12025:21;11959:32;:22;11750:18;11727:54;11743:38;11750:30;:21;12025:30;11750:18;;:21;:::i;11743:38::-;237:2306:36;;11727:13:35;;;2219:66;;11727:54;11818:36;:21;:18;;:21;:::i;:36::-;11791:16;;;2219:66;11865:58;11884:39;11891:31;:22;:18;;:22;:::i;11884:39::-;237:2306:36;;11865:16:35;;;2219:66;;11865:58;11959:18;:22;:::i;:32::-;12025:21;:::i;:30::-;12001:21;;;;:54;;;;237:2306:36;12101:1:35;12069:33;;12065:123;;12242:21;:33;:24;:21;;:24;:::i;:::-;;:33;:::i;:::-;237:2306:36;;;12289:26:35;12285:83;;12398:36;237:2306:36;;12398:36:35;:::i;:::-;12378:17;;;;:56;;;-1:-1:-1;12491:3:35;237:2306:36;;12464:25:35;;;;;12540:27;:17;;;;:::i;:27::-;237:2306:36;;12610:2:35;12585:27;;12581:125;;12748:23;;12740:32;12748:23;;:::i;:::-;2219:66;;;;12740:32;237:2306:36;;;12790:23:35;;12786:103;;-1:-1:-1;12922:5:35;;;;;;13095:17;;;:32;11070:1;13095:17;:32;:17;;;:32;:::i;:::-;2219:66;237:2306:36;;2219:66:35;;;13095:32;2219:66;12449:13;;12929:3;12956:17;:33;:20;;:17;;;:20;:::i;:::-;237:2306:36;;;;;12956:20:35;237:2306:36;;;;12956:33:35;;12952:116;;11070:1;2219:66;12907:13;;12952:116;13020:29;-1:-1:-1;13020:29:35;237:2306:36;;;12840:34:35;237:2306:36;2219:66:35;-1:-1:-1;9939:51:35;12786:103;12840:34;-1:-1:-1;12840:34:35;237:2306:36;;;12840:34:35;237:2306:36;2219:66:35;-1:-1:-1;9939:51:35;12581:125;12639:52;-1:-1:-1;12639:52:35;237:2306:36;;;-1:-1:-1;9939:51:35;12464:25;;;13187:24;12464:25;;;13187:33;12464:25;;13187:21;:24;:::i;:33::-;13251:29;237:2306:36;;13251:29:35;:::i;:::-;13230:18;;;;:50;;;-1:-1:-1;13332:3:35;237:2306:36;;13310:20:35;;;;;13375:12;13351:46;13375:12;:22;:12;11070:1;13375:12;;;:::i;:22::-;13351:18;;:46;;;;;:::i;:::-;;;:::i;:::-;;2219:66;13295:13;;13310:20;;;;;10709:2705::o;12285:83::-;12338:19;-1:-1:-1;12338:19:35;;-1:-1:-1;12338:19:35;12065:123;12125:52;-1:-1:-1;12125:52:35;237:2306:36;;;-1:-1:-1;9939:51:35;11587:130;11687:19;237:2306:36;;;11687:19:35;;;;;;;;;;:::i;:::-;;;;11591:73;11632:32;237:2306:36;;10854:18:35;237:2306:36;;11612:16:35;:52;;11591:73;;;11347:167;11464:37;:22;11441:62;11464:18;;:22;:::i;:37::-;11441:62;-1:-1:-1;11441:62:35;237:2306:36;;;;;11216:122:35;11296:30;:21;11278:49;11296:18;;:21;:::i;:30::-;11278:49;-1:-1:-1;11278:49:35;237:2306:36;;;;;11039:168:35;11158:36;:21;11132:64;11158:18;;:21;:::i;:36::-;11132:64;-1:-1:-1;11132:64:35;237:2306:36;;;;;10915:114:35;10972:46;10816:16;10972:46;237:2306:36;;;-1:-1:-1;9939:51:35;19455:292;237:2306:36;;;;-1:-1:-1;237:2306:36;19595:15:35;237:2306:36;;;-1:-1:-1;237:2306:36;;;;;;19640:29:35;19636:105;;19455:292;:::o;19636:105::-;19692:38;-1:-1:-1;19692:38:35;19595:15;237:2306:36;;-1:-1:-1;19692:38:35;237:2306:36;;;;;;;;:::i;:::-;;;;;;;;;:::o;1703:838::-;2264:18;2187:26;1837:14;;:::i;:::-;21300:17:35;2086:24:36;1891:21;;;21300:17:35;1891:24:36;:21;;:24;:::i;:::-;;21300:17:35;:::i;:::-;1861:55:36;;;:::i;:::-;;;;;:::i;:::-;;21300:17:35;1956:24:36;:21;;:24;:::i;21300:17:35:-;1926:55:36;;;:::i;:::-;;;;;:::i;:::-;;21300:17:35;2021:24:36;:21;;:24;:::i;21300:17:35:-;1991:55:36;;;:::i;:::-;;;;;:::i;:::-;;2086:21;:24;:::i;21300:17:35:-;2056:55:36;;;:::i;:::-;;;;;:::i;:::-;;2121:23;;:::i;:::-;;;;:::i;:::-;2219:66:35;2121:23:36;;;:::i;:::-;;2187:26;:::i;:::-;2264:18;;;2252:38;2264:18;;237:2306;2252:38;:::i;:::-;2305:13;1913:1;2351:3;2324:18;;237:2306;;2320:29;;;;;2387:82;;1978:1;2387:82;2392:2;2387:7;;:82;2392:2;;;2397:33;;;;;:::i;:::-;2370:99;;;;:::i;:::-;;;;;;:::i;:::-;;2219:66:35;2305:13:36;;2387:82;21300:17:35;2447:21:36;;;;:::i;21300:17:35:-;2387:82:36;;2320:29;;;;2506:27;2320:29;;2506:27;:::i;:::-;2264:18;237:2306;;;;2496:38;1703:838;:::o;14731:509:35:-;;;;14863:27;237:2306:36;;14863:27:35;:::i;:::-;14905:13;14917:1;14938:3;237:2306:36;;14920:16:35;;;;;14997:8;;;;:::i;:::-;;237:2306:36;;15558:2:35;15543:17;;15539:95;;15653:8;;15665:2;237:2306:36;15647:15:35;15653:8;;15808:30;15653:8;;:::i;:::-;237:2306:36;;;;;15653:8:35;237:2306:36;;;;15647:15:35;237:2306:36;15647:20:35;15643:90;;14938:3;15808:30;;:::i;:::-;237:2306:36;;;;:::i;:::-;15852:33:35;;;;:64;;;14938:3;15852:88;;;;;14938:3;15848:145;;237:2306:36;;;14917:1:35;15040:5;;;;;;15204:19;;;;2219:66;15204:19;;;;;:::i;:::-;2219:66;14905:13;;15047:3;15074:10;:20;:10;;;;;:::i;:20::-;;15070:107;;2219:66;;15025:13;;15070:107;15125:33;14917:1;15125:33;237:2306:36;;;12840:34:35;237:2306:36;2219:66:35;-1:-1:-1;9939:51:35;15848:145;15963:19;14917:1;15963:19;;14917:1;15963:19;15852:88;237:2306:36;;;;15920:20:35;15852:88;;:64;15889:27;;;;15852:64;;;15643:90;15694:28;15701:20;:15;15707:8;;;;:::i;15701:15::-;:20;:::i;:::-;237:2306:36;;;;;;15694:28:35;14917:1;15683:39;;;;:::i;:::-;;15643:90;;15539:95;15583:40;14917:1;15583:40;237:2306:36;;;-1:-1:-1;9939:51:35;14920:16;;;;14731:509::o;237:2306:36:-;-1:-1:-1;;237:2306:36;;;;;;;:::o;16229:544:35:-;;16414:1;16430:13;16414:1;16465:3;237:2306:36;;16445:18:35;;;;;16488:47;237:2306:36;16524:10:35;;;;:::i;:::-;237:2306:36;;16488:47:35;;:::i;:::-;16484:94;;16465:3;2219:66;;16430:13;;16484:94;16555:8;;2219:66;16555:8;;:::i;:::-;16484:94;;;;;16445:18;;;16644:1;16617:32;16445:18;237:2306:36;;16617:32:35;:::i;:::-;16663:17;;;;16659:108;;16229:544;;:::o;16659:108::-;16703:53;16414:1;16703:53;237:2306:36;;;;;16414:1:35;16703:53;237:2306:36;;-1:-1:-1;;237:2306:36;;;;;;;:::o;:::-;;;;;;;;;;:::o;:::-;;;;;;;;;;:::o;:::-;;;;;;;;;:::o;:::-;;;;;;;;;;:::o;16996:549:35:-;;17123:1;17139:13;17123:1;17174:3;237:2306:36;;17154:18:35;;;;;17197:39;237:2306:36;17225:10:35;;;;:::i;:::-;237:2306:36;;17197:39:35;;:::i;:::-;17193:86;;17174:3;2219:66;;17139:13;;17193:86;17256:8;;2219:66;17256:8;;:::i;:::-;17193:86;;;;;17154:18;;;237:2306:36;;17428:1:35;237:2306:36;;;;;;;;;17443:17:35;;;17439:100;;16996:549;;:::o;17439:100::-;17483:45;17123:1;17483:45;237:2306:36;;;;;17123:1:35;17483:45;13709:440;14055:31;13709:440;14055:22;13709:440;13927:76;13709:440;237:2306:36;;;13976:25:35;;;237:2306:36;;;;;;13976:25:35;;;;;;;:::i;14055:31::-;237:2306:36;;14124:1:35;237:2306:36;;;;;14111:30:35;237:2306:36;;14111:15:35;:30;:::i;237:2306:36:-;;;;;;;;-1:-1:-1;237:2306:36;;-1:-1:-1;237:2306:36;;;-1:-1:-1;237:2306:36;:::o;18568:677:35:-;;;237:2306:36;;;;;;;;;;;;;;18815:37:35;;;;:82;;;18568:677;18811:125;;;18949:25;;237:2306:36;;;;;18949:53:35;18945:96;;237:2306:36;19093:3:35;237:2306:36;;19070:21:35;;;;;237:2306:36;19116:28:35;;;;:::i;:::-;237:2306:36;;;;;;;;;;;;19116:45:35;19148:13;;;;;:::i;19116:45::-;237:2306:36;;19116:45:35;19112:96;;2219:66;;19055:13;;19112:96;19181:12;;;237:2306:36;19181:12:35;:::o;19070:21::-;;;;2219:66;18568:677;:::o;18945:96::-;19018:12;;237:2306:36;19018:12:35;:::o;18815:82::-;18856:26;;;;;237:2306:36;18856:41:35;;18815:82;;;6145:316:93;237:2306:36;;;;;;;2920:29:93;237:2306:36;;;;;;;;;;;;;;;;2920:29:93;237:2306:36;;;;;;;;;;6281:29:93;237:2306:36;;;;;;;;;;;;;;;;6281:29:93;6313:4;237:2306:36;;;;;;;;735:10:121;237:2306:36;;6336:40:93;;237:2306:36;6336:40:93;;6313:4;6390:11;:::o;6698:317::-;237:2306:36;;;;;;;2920:29:93;237:2306:36;;;;;;;;;;;;;;;;2920:29:93;237:2306:36;;;;;;;;;;;6834:29:93;237:2306:36;;;;;;;;;;;;;;;;6834:29:93;237:2306:36;;;;;;;735:10:121;237:2306:36;;6890:40:93;;237:2306:36;6890:40:93;;237:2306:36;6944:11:93;:::o;14333:174:35:-;237:2306:36;;;;;14457:18:35;237:2306:36;;;14446:53:35;;237:2306:36;;;2612:66:35;237:2306:36;;;;;14446:53:35;;;;;;:::i;:::-;237:2306:36;14436:64:35;;14333:174;:::o;237:2306:36:-;;;;;;;;:::i;:::-;22179:1:35;237:2306:36;;;2219:66:35;237:2306:36;;;2219:66:35;237:2306:36:o;:::-;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;-1:-1:-1;;237:2306:36;;;;:::i;1287:390:37:-;1607:20;:29;1287:390;;;;237:2306:36;1508:2:37;237:2306:36;:::i;:::-;;;;;;;;:::i;:::-;1508:2:37;237:2306:36;;;1508:2:37;237:2306:36;:::i;:::-;-1:-1:-1;;1508:2:37;237:2306:36;;;;2219:66:35;;;1521:63:37;1607:20;:::i;:29::-;1648:21;8593:13;237:2306:36;;8593:13:37;:::i;:::-;237:2306:36;;;8624:13:37;;:33;;;1287:390;8616:42;;;:::i;:::-;8679:26;8689:15;-1:-1:-1;8689:15:37;;:::i;:::-;8679:26;:::i;:::-;8715:18;-1:-1:-1;;237:2306:36;1667:1:37;8901:14;;;;;;1600:70;;;;;;;:::i;8917:6::-;8982:5;9046:37;8998:3;9054:21;:16;9060:9;;8982:5;;8605:1;8982:5;237:2306:36;;;;8982:5:37;8979:9;;8943:59;8979:9;8965:37;8979:9;8973:21;:16;8979:9;;;;;:::i;8973:16::-;237:2306:36;;;;;;8973:21:37;8972:29;237:2306:36;;;;;;8965:37:37;1667:1;8943:59;;;:::i;:::-;;9060:9;:::i;9054:16::-;237:2306:36;;;;9046:37:37;1667:1;9020:63;;8756:1;237:2306:36;;9020:63:37;;:::i;:::-;;237:2306:36;8894:204:37;;8624:33;-1:-1:-1;8641:16:37;8624:33;;237:2306:36;;;;;;;:::i;:::-;-1:-1:-1;237:2306:36;;;;;;;:::o;2457:221:38:-;237:2306:36;;:::i;:::-;;2568:58:38;237:2306:36;;;;;;;;;:::i;:::-;2219:66:35;;2568:58:38;;2643:28;;2219:66:35;2457:221:38;:::o;237:2306:36:-;;;;:::o;7796:439:38:-;237:2306:36;;7883:12:38;;;:30;;;;7796:439;237:2306:36;;;;7957:21:38;;;:::i;:::-;7989:14;8013:192;;;;;;;8215:13;7796:439;:::o;8013:192::-;;;;;;;7796:439;:::o;7883:30::-;7911:2;7899:14;;;;7883:30;;;4170:519;4266:12;;;:::i;:::-;237:2306:36;;;4306:14:38;;;:::i;:::-;2219:66:35;;;:::i;:::-;237:2306:36;;;;;;;:::i;:::-;2219:66:35;;;-1:-1:-1;;237:2306:36;;;:::i;:::-;;-1:-1:-1;237:2306:36;;;;;;4404:11:38;;237:2306:36;4404:41:38;:11;;237:2306:36;4418:27:38;;;:::i;:::-;4404:41;;:::i;:::-;-1:-1:-1;4480:179:38;4500:9;;;;;;4669:13;;;4170:519;:::o;4511:3::-;4632:16;4540:19;;2219:66:35;4540:19:38;;:::i;:::-;237:2306:36;;;:::i;:::-;2219:66:35;;;4585:24:38;237:2306:36;4585:24:38;;2219:66:35;4573:36:38;;;;:::i;:::-;;;;;;:::i;:::-;;4632:16;:::i;:::-;4511:3;2219:66:35;4485:13:38;;;237:2306:36;;;;;:::i;:::-;;;;;;;;;;8413:298:38;8545:2;237:2306:36;;8533:14:38;237:2306:36;;8600:11:38;;237:2306:36;8614:1:38;237:2306:36;;;;;;;8625:56:38;8413:298;:::o;8857:379::-;237:2306:36;;8950:12:38;237:2306:36;;9006:21:38;9202:3;9006:21;;:::i;:::-;9059:14;;;;;;:::i;:::-;9109:61;;;;9202:3;;:::i;237:2306:36:-;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;:::i;:::-;;;:::i;:::-;;-1:-1:-1;;237:2306:36;;;;;;:::i;:::-;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;22053:538:35:-;22169:12;;:::i;:::-;22196:13;22179:1;22191:109;22229:3;237:2306:36;;22211:16:35;;;;;22258:31;2219:66;22280:8;;;;;:::i;:::-;;22258:31;;:::i;:::-;22229:3;2219:66;22196:13;;;22211:16;;;;237:2306:36;;22331:2:35;22314:19;;22310:120;;237:2306:36;22510:74:35;22464:29;237:2306:36;;22464:29:35;:::i;:::-;237:2306:36;22510:74:35;22527:37;22534:29;22540:22;237:2306:36;;22540:22:35;:::i;22527:37::-;237:2306:36;;;22510:74:35;;;;;;;:::i;22310:120::-;22373:36;22380:28;22386:21;22356:63;22386:21;;:::i;22373:36::-;22356:63;237:2306:36;;22356:63:35;;;;;;;:::i;237:2306:36:-;;;15658:2:35;237:2306:36;;;;;;;:::o;:::-;;;;;;;;;;;;;:::o;21462:440:35:-;21570:1;237:2306:36;;21556:15:35;:39;;;21462:440;21552:80;;237:2306:36;;21658:2:35;21645:15;;21641:108;;237:2306:36;21825:70:35;21783:25;237:2306:36;;21783:25:35;:::i;:::-;237:2306:36;21825:70:35;21842:37;21849:29;21855:22;237:2306:36;;21855:22:35;:::i;21641:108::-;21700:32;21707:24;21713:17;21683:55;21713:17;;:::i;21556:39::-;21581:6;21591:4;237:2306:36;21575:13:35;21581:6;;;;:::i;21575:13::-;237:2306:36;21575:20:35;21556:39;;237:2306:36;;;;;;;;;;;;:::o;:::-;;-1:-1:-1;237:2306:36;;;:::o;20273:284:35:-;;237:2306:36;20427:3:35;237:2306:36;;20404:21:35;;;;;237:2306:36;20450:13:35;;;;:::i;:::-;237:2306:36;;;;;;;;;;20450:23:35;20446:73;;2219:66;;20389:13;;20775:282;;237:2306:36;20927:3:35;237:2306:36;;20904:21:35;;;;;237:2306:36;20950:13:35;;;;:::i;:::-;237:2306:36;;;;;20950:23:35;20946:73;;2219:66;;20889:13;;8465:649:37;;;8593:13;237:2306:36;;8593:13:37;:::i;:::-;237:2306:36;;;8624:13:37;;:33;;;8465:649;8616:42;;;:::i;:::-;8679:26;8689:15;;;;:::i;8679:26::-;8715:18;;8747:10;8756:1;8747:10;;;:15;8743:118;;8465:649;-1:-1:-1;;237:2306:36;;;8894:204:37;8901:14;;;;;;8465:649;;;;;:::o;8917:6::-;8982:5;9020:63;8756:1;9046:37;8998:3;9054:21;:16;9060:9;;8982:5;8605:1;8982:5;8943:59;8965:37;8982:5;8973:21;8982:5;8979:9;;8982:5;8973:16;8982:5;237:2306:36;;;;8982:5:37;8979:9;;;:::i;8965:37::-;237:2306:36;;;8943:59:37;;8636:1;8943:59;;;:::i;:::-;;9060:9;;:::i;9046:37::-;8636:1;9020:63;237:2306:36;;9020:63:37;;:::i;:::-;;237:2306:36;8894:204:37;;;;8743:118;8808:10;;237:2306:36;8799:26:37;:21;8805:14;;8808:10;;237:2306:36;;;;8808:10:37;8805:14;;:::i;8799:26::-;237:2306:36;;;8636:1:37;8778:55;;;;:::i;:::-;;-1:-1:-1;;8847:3:37;;;:::i;:::-;8743:118;;;;;8624:33;-1:-1:-1;8641:16:37;;;;8624:33;;2316:5431;;2546:1;2557:33;2546:1;237:2306:36;;:::i;:::-;;;;2689:17:37;2685:223;;2976:13;;2546:1;2971:4724;3009:3;237:2306:36;;2991:16:37;;;;;3091:6;;;;:50;;3009:3;3087:97;;3298:6;:47;;;;3009:3;3294:94;;;3514:17;:8;;;;:::i;:17::-;237:2306:36;;;3565:1:37;3550:16;;3546:4139;3565:1;;;3744:7;3716:46;3744:17;:7;;;:::i;:17::-;3716:46;:::i;:::-;3804:56;3878:28;3804:56;;;;;:::i;:::-;3878:28;;;:::i;:::-;237:2306:36;;-1:-1:-1;3925:994:37;;4937:1185;;;237:2306:36;5015:16:37;237:2306:36;;5015:16:37;:::i;:::-;-1:-1:-1;5007:144:37;;237:2306:36;-1:-1:-1;5173:109:37;;5315:7;5351:18;5315:7;;:::i;5173:109::-;5247:12;;;:::i;4937:1185::-;237:2306:36;;;5494:16:37;237:2306:36;;5494:16:37;:::i;:::-;5489:21;;5485:138;;5650:7;5649:17;5650:16;:7;2219:66:35;5650:7:37;;:::i;:::-;;:16;:::i;:::-;5649:17;;237:2306:36;5649:17:37;5650:7;;;5837;:26;:7;;:::i;:::-;;:26;:::i;:::-;5645:459;;2219:66:35;2976:13:37;;;;;5645:459;6054:7;:27;:7;;:::i;:::-;;5445:11:38;;;237:2306:36;;;5522:62:38;;5341:272;;6054:27:37;5645:459;;;3925:994;237:2306:36;;;;;;4718:16:37;237:2306:36;;;4718:16:37;:::i;:::-;-1:-1:-1;4710:149:37;;4888:12;;:::i;3546:4139::-;6146:17;;;;;;6161:2;6146:17;6161:2;;237:2306:36;;6219:36:37;;6235:20;;6451:17;6386:43;6394:34;6400:27;;;;;:::i;6386:43::-;6451:17;;:::i;:::-;6494:12;6504:2;6494:12;;;6490:146;;6662:33;6682:12;;;;:::i;:::-;;6662:33;:::i;:::-;6682:12;;;237:2306:36;;;;6766:16:37;237:2306:36;;;;6766:16:37;:::i;:::-;6761:21;6757:157;;6947:12;;:::i;6658:555::-;6993:12;6992:22;6993:21;:12;;2219:66:35;6993:12:37;;;;;;;:::i;6992:22::-;6993:12;;;7057:31;:12;;;;:::i;6988:225::-;7158:32;:12;;;;:::i;6215:1388::-;237:2306:36;;;7411:16:37;237:2306:36;;7411:16:37;:::i;:::-;7406:21;7402:135;;7566:8;:18;:8;;:::i;6142:1543::-;237:2306:36;;7641:29:37;;;237:2306:36;7641:29:37;;;237:2306:36;;;;;;;;;;;;;11687:19:35;3298:47:37;3336:8;;3324:21;3336:8;;;;:::i;:::-;;3324:21;:::i;:::-;3308:37;;3298:47;;;3091:50;3113:8;:28;:8;;;;:::i;:28::-;3101:40;;;3091:50;;2685:223;2785:78;;;2777:87;2785:78;;2797:66;2785:78;;;2777:87;:::i;:::-;2885:12;;:::i;3469:281:38:-;;3598:11;;;237:2306:36;3583:27:38;237:2306:36;;3583:27:38;:::i;:::-;237:2306:36;;;;;;;;;;;;;;;;;;;;3723:20:38;3469:281;:::o;4838:321::-;237:2306:36;;4918:13:38;4914:31;;4994:11;868:4;4994:11;;237:2306:36;5015:64:38;237:2306:36;5015:64:38;5093:24;5089:42;;5148:4;4838:321;:::o;4914:31::-;4933:12;237:2306:36;4933:12:38;:::o;9434:424::-;237:2306:36;;9518:13:38;9514:27;;237:2306:36;9597:11:38;;;;237:2306:36;;;9611:27:38;;;:::i;:::-;237:2306:36;;;;;;;;;;;;;;;;;;9697:132:38;;9704:16;;;;;;9839:12;;;9434:424;:::o;9697:132::-;9756:20;;;:::i;:::-;237:2306:36;;;;;;;9811:7:38;9736:40;9811:7;;:::i;:::-;9697:132;;;11485:581;11589:64;237:2306:36;11589:64:38;682:4;11667:26;;682:4;;;11709:8;237:2306:36;11709:8:38;:::o;11663:397::-;776:4;11738:25;;:83;;;;11663:397;11734:326;;;11837:8;11844:1;11837:8;:::o;11734:326::-;868:4;11866:24;;868:4;;;11943:35;;:31;;958:4;11943:31;;;:::i;:::-;:35;:::i;11862:198::-;12016:33;;:29;;958:4;12016:29;237:2306:36;11738:83:38;11768:25;868:4;11768:25;;;:52;;11738:83;11768:52;11797:23;958:4;11797:23;;11738:83;;10045:1263;10171:64;;-1:-1:-1;10171:64:38;;682:4;10249:26;;682:4;;;10291:11;;10301:1;10045:1263;:::o;10245:1032::-;776:4;10323:25;;776:4;;;10374:26;;:30;:26;;:::i;10319:958::-;868:4;10425:24;;868:4;;;10465:385;;;;;;;;;;;;;;;;237:2306:36;:::o;10421:856:38:-;958:4;10870:23;;958:4;;;10919:24;;:28;:24;;:::i;10866:411::-;10978:289;;;;;;;;;;;;;;;;237:2306:36;:::o;1035:2:38:-;;;;;;;;;:::o;12279:770::-;;;12360:8;;12356:21;;12441:16;1035:2;12441:16;;;;;12642:7;12638:405;;12279:770;;;:::o;12638:405::-;12764:24;12772:15;12764:28;12772:15;;:::i;:::-;12764:24;:::i;:::-;:28;:::i;:::-;12806:227;;;;;;;;;;;;12279:770::o;12459:16::-;12491:65;;;;;;1035:2;237:2306:36;;;;;;;12600:17:38;1035:2;237:2306:36;;;;;;;12459:16:38;-1:-1:-1;;237:2306:36;;;;;;12434:194:38;237:2306:36;;:::i;6262:337:38:-;6372:19;237:2306:36;;6372:19:38;:::i;:::-;237:2306:36;;;6405:18:38;6401:37;;6542:11;6470:57;6560:8;6542:11;;237:2306:36;;;6470:57:38;;;;6560:8;;:::i;6401:37::-;6425:13;;:::o;22754:430:35:-;-1:-1:-1;22839:19:35;;22899:8;;;22994:17;;;;:::i;:::-;23021:11;23042:116;23067:5;;;23167:10;;22754:430;:::o;23074:3::-;23097:5;;;:::i;:::-;23093:31;237:2306:36;;;;;-1:-1:-1;23093:31:35;;;;:::i;:::-;;237:2306:36;;23074:3:35;237:2306:36;;;;-1:-1:-1;;237:2306:36;23047:18:35;;;;22892:73;22923:8;;;;:::i;:::-;237:2306:36;22953:1:35;237:2306:36;22892:73:35;;;2419:778:131;237:2306:36;;;2419:778:131;2609:2;2589:22;;2609:2;;3041:25;2825:196;;;;;;;;;;;;;;;-1:-1:-1;2825:196:131;3041:25;;:::i;:::-;3034:32;;;;;:::o;2585:606::-;3097:83;;3113:1;3097:83;3117:35;3097:83;;:::o;10983:270:37:-;237:2306:36;;11094:2:37;11082:14;;11094:2;;;5445:11:38;11094:2:37;5445:11:38;;237:2306:36;;;5522:62:38;;11112:32:37;:::o;11078:169::-;5445:11:38;11094:2:37;5445:11:38;237:2306:36;5522:62:38;237:2306:36;;11094:2:37;11192:43;;237:2306:36;;;11094:2:37;11192:43;;;237:2306:36;11192:43:37;;:::i;7932:335::-;8047:1;237:2306:36;;8035:13:37;8031:56;;8130:11;;237:2306:36;8151:60:37;237:2306:36;8151:60:37;8232:4;8227:9;;7932:335::o;5788:270:38:-;5909:21;5788:270;5909:21;:::i;:::-;5964:65;;5788:270;:::o;9355:729:37:-;;237:2306:36;;9485:13:37;237:2306:36;;9551:3:37;9531:17;:12;9537:5;;;;:::i;9531:17::-;:23;9596:16;;;9628:10;10051:25;9637:1;237:2306:36;9592:434:37;10051:25;:::i;9592:434::-;9702:1;9687:16;;9702:1;;9719:10;10051:25;9702:1;237:2306:36;9683:343:37;10051:25;:::i;9683:343::-;9793:1;9778:16;;9793:1;;9810:10;10051:25;9793:1;9702;9774:252;10051:25;:::i;9774:252::-;9883:1;9868:16;9883:1;;10051:25;9702:1;9924:13;9864:162;10051:25;:::i;10366:320::-;;;237:2306:36;10561:3:37;237:2306:36;;;;;;;;;;10518:24:37;;:41;;;10561:3;10518:41;;;10584:16;237:2306:36;;10584:16:37;;:::i;:::-;237:2306:36;;;10604:5:37;;;;:::i;:::-;237:2306:36;;10584:25:37;;10580:72;;10561:3;;;:::i;:::-;10511:151;;10580:72;10629:8;;;;;:::o;10518:41::-;;;;;;10366:320;:::o;10518:41::-;237:2306:36;;;10546:13:37;;10518:41;;7129:1551:131;;;8209:66;8196:79;;8192:164;;237:2306:36;;;;;;-1:-1:-1;237:2306:36;;;;;;;;;;;;;;;;;;;8467:24:131;;;;;;;;;-1:-1:-1;8467:24:131;237:2306:36;;;8505:20:131;8501:113;;8624:49;-1:-1:-1;8624:49:131;-1:-1:-1;7129:1551:131;:::o;8501:113::-;8541:62;-1:-1:-1;8541:62:131;8467:24;8541:62;-1:-1:-1;8541:62:131;:::o;8467:24::-;237:2306:36;;;;;;;;;8192:164:131;8291:54;;;8307:1;8291:54;8311:30;8291:54;;:::o","linkReferences":{}},"methodIdentifiers":{"DEFAULT_ADMIN_ROLE()":"a217fddf","PROOF_SUBMITTER_ROLE()":"5972185a","getClientState()":"ef913a4b","getConsensusState(uint64)":"edce8bdc","getRoleAdmin(bytes32)":"248a9ca3","grantRole(bytes32,address)":"2f2ff15d","hasRole(bytes32,address)":"91d14854","misbehaviour(bytes)":"ddba6537","renounceRole(bytes32,address)":"36568abe","revokeRole(bytes32,address)":"d547741f","supportsInterface(bytes4)":"01ffc9a7","updateClient(bytes)":"0bece356","verifyMembership((bytes,(uint64,uint64),bytes[],bytes))":"682ed5f0","verifyNonMembership((bytes,(uint64,uint64),bytes[]))":"4d6d9ffb"},"rawMetadata":"{\"compiler\":{\"version\":\"0.8.28+commit.7893614a\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"ibcRouter\",\"type\":\"address\"},{\"internalType\":\"uint64\",\"name\":\"initialTrustedHeight\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"initialTrustedTimestamp\",\"type\":\"uint64\"},{\"internalType\":\"bytes32\",\"name\":\"initialTrustedStorageRoot\",\"type\":\"bytes32\"},{\"internalType\":\"address[]\",\"name\":\"initialTrustedValidators\",\"type\":\"address[]\"},{\"internalType\":\"uint64\",\"name\":\"trustingPeriod\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"maxClockDrift\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"roleManager\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"AccessControlBadConfirmation\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"internalType\":\"bytes32\",\"name\":\"neededRole\",\"type\":\"bytes32\"}],\"name\":\"AccessControlUnauthorizedAccount\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"revisionHeight\",\"type\":\"uint64\"}],\"name\":\"ConflictingConsensusState\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"trustedTimestamp\",\"type\":\"uint64\"},{\"internalType\":\"uint256\",\"name\":\"currentTimestamp\",\"type\":\"uint256\"},{\"internalType\":\"uint64\",\"name\":\"trustingPeriod\",\"type\":\"uint64\"}],\"name\":\"ConsensusStateExpired\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"revisionHeight\",\"type\":\"uint64\"}],\"name\":\"ConsensusStateNotFound\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"signer\",\"type\":\"address\"}],\"name\":\"DuplicateCommitSealSigner\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"validator\",\"type\":\"address\"}],\"name\":\"DuplicateValidator\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"EmptyValidatorSet\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"currentTimestamp\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"headerTimestamp\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxClockDrift\",\"type\":\"uint256\"}],\"name\":\"HeaderFromFuture\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"actual\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"required\",\"type\":\"uint256\"}],\"name\":\"InsufficientTrustedValidatorOverlap\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"actual\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"required\",\"type\":\"uint256\"}],\"name\":\"InsufficientValidatorQuorum\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidCommitSeal\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"expectedValue\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"actualValue\",\"type\":\"bytes32\"}],\"name\":\"InvalidCommitmentValue\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"actualDifficulty\",\"type\":\"uint256\"}],\"name\":\"InvalidDifficulty\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"length\",\"type\":\"uint256\"}],\"name\":\"InvalidECDSASignatureLength\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"itemsLength\",\"type\":\"uint256\"}],\"name\":\"InvalidExtraDataFormat\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"itemsLength\",\"type\":\"uint256\"}],\"name\":\"InvalidHeaderFormat\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidHeaderHeight\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidHeaderTimestamp\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"actualMixHash\",\"type\":\"bytes32\"}],\"name\":\"InvalidMixHash\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"actualNonce\",\"type\":\"bytes\"}],\"name\":\"InvalidNonce\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"actualOmmersHash\",\"type\":\"bytes32\"}],\"name\":\"InvalidOmmersHash\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"expectedLength\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"actualLength\",\"type\":\"uint256\"}],\"name\":\"InvalidPathLength\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"providedRevisionNumber\",\"type\":\"uint64\"}],\"name\":\"InvalidRevisionNumber\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"validator\",\"type\":\"address\"}],\"name\":\"InvalidValidatorAddress\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"length\",\"type\":\"uint256\"}],\"name\":\"InvalidValidatorAddressLength\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"expectedLength\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"actualLength\",\"type\":\"uint256\"}],\"name\":\"InvalidValueLength\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"UnsupportedMisbehaviour\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"actualValue\",\"type\":\"bytes32\"}],\"name\":\"ValueExists\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"previousAdminRole\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"newAdminRole\",\"type\":\"bytes32\"}],\"name\":\"RoleAdminChanged\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"RoleGranted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"RoleRevoked\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"DEFAULT_ADMIN_ROLE\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"PROOF_SUBMITTER_ROLE\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getClientState\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"revisionHeight\",\"type\":\"uint64\"}],\"name\":\"getConsensusState\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"}],\"name\":\"getRoleAdmin\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"grantRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"hasRole\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"name\":\"misbehaviour\",\"outputs\":[],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"callerConfirmation\",\"type\":\"address\"}],\"name\":\"renounceRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"revokeRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes4\",\"name\":\"interfaceId\",\"type\":\"bytes4\"}],\"name\":\"supportsInterface\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"updateMsg\",\"type\":\"bytes\"}],\"name\":\"updateClient\",\"outputs\":[{\"internalType\":\"enum ILightClientMsgs.UpdateResult\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes\",\"name\":\"proof\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"uint64\",\"name\":\"revisionNumber\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"revisionHeight\",\"type\":\"uint64\"}],\"internalType\":\"struct IICS02ClientMsgs.Height\",\"name\":\"proofHeight\",\"type\":\"tuple\"},{\"internalType\":\"bytes[]\",\"name\":\"path\",\"type\":\"bytes[]\"},{\"internalType\":\"bytes\",\"name\":\"value\",\"type\":\"bytes\"}],\"internalType\":\"struct ILightClientMsgs.MsgVerifyMembership\",\"name\":\"msg_\",\"type\":\"tuple\"}],\"name\":\"verifyMembership\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes\",\"name\":\"proof\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"uint64\",\"name\":\"revisionNumber\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"revisionHeight\",\"type\":\"uint64\"}],\"internalType\":\"struct IICS02ClientMsgs.Height\",\"name\":\"proofHeight\",\"type\":\"tuple\"},{\"internalType\":\"bytes[]\",\"name\":\"path\",\"type\":\"bytes[]\"}],\"internalType\":\"struct ILightClientMsgs.MsgVerifyNonMembership\",\"name\":\"msg_\",\"type\":\"tuple\"}],\"name\":\"verifyNonMembership\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"errors\":{\"AccessControlBadConfirmation()\":[{\"details\":\"The caller of a function is not the expected one. NOTE: Don't confuse with {AccessControlUnauthorizedAccount}.\"}],\"AccessControlUnauthorizedAccount(address,bytes32)\":[{\"details\":\"The `account` is missing a role.\"}],\"ConflictingConsensusState(uint64)\":[{\"params\":{\"revisionHeight\":\"The conflicting revision height.\"}}],\"ConsensusStateExpired(uint64,uint256,uint64)\":[{\"params\":{\"currentTimestamp\":\"The current block timestamp.\",\"trustedTimestamp\":\"Timestamp of the trusted consensus state.\",\"trustingPeriod\":\"The configured trusting period.\"}}],\"ConsensusStateNotFound(uint64)\":[{\"params\":{\"revisionHeight\":\"The requested revision height.\"}}],\"DuplicateCommitSealSigner(address)\":[{\"params\":{\"signer\":\"The duplicate signer address.\"}}],\"DuplicateValidator(address)\":[{\"params\":{\"validator\":\"The duplicate validator address.\"}}],\"HeaderFromFuture(uint256,uint256,uint256)\":[{\"params\":{\"currentTimestamp\":\"The current block timestamp.\",\"headerTimestamp\":\"The submitted header timestamp.\",\"maxClockDrift\":\"The configured maximum clock drift.\"}}],\"InsufficientTrustedValidatorOverlap(uint256,uint256)\":[{\"params\":{\"actual\":\"The number of trusted validators that signed.\",\"required\":\"The minimum required trusted signer count.\"}}],\"InsufficientValidatorQuorum(uint256,uint256)\":[{\"params\":{\"actual\":\"The number of new validators that signed.\",\"required\":\"The minimum required signer count.\"}}],\"InvalidCommitmentValue(bytes32,bytes32)\":[{\"params\":{\"actualValue\":\"The proven commitment value.\",\"expectedValue\":\"The expected commitment value.\"}}],\"InvalidDifficulty(uint256)\":[{\"params\":{\"actualDifficulty\":\"The difficulty found in the header.\"}}],\"InvalidECDSASignatureLength(uint256)\":[{\"params\":{\"length\":\"The invalid signature length.\"}}],\"InvalidExtraDataFormat(uint256)\":[{\"params\":{\"itemsLength\":\"The decoded `extraData` item count.\"}}],\"InvalidHeaderFormat(uint256)\":[{\"params\":{\"itemsLength\":\"The decoded header item count.\"}}],\"InvalidMixHash(bytes32)\":[{\"params\":{\"actualMixHash\":\"The mix hash found in the header.\"}}],\"InvalidNonce(bytes)\":[{\"params\":{\"actualNonce\":\"The nonce found in the header.\"}}],\"InvalidOmmersHash(bytes32)\":[{\"params\":{\"actualOmmersHash\":\"The ommers hash found in the header.\"}}],\"InvalidPathLength(uint256,uint256)\":[{\"params\":{\"actualLength\":\"The actual path length.\",\"expectedLength\":\"The expected path length.\"}}],\"InvalidRevisionNumber(uint64)\":[{\"params\":{\"providedRevisionNumber\":\"The non-zero revision number.\"}}],\"InvalidValidatorAddress(address)\":[{\"params\":{\"validator\":\"The invalid validator address.\"}}],\"InvalidValidatorAddressLength(uint256)\":[{\"params\":{\"length\":\"The decoded validator address length.\"}}],\"InvalidValueLength(uint256,uint256)\":[{\"params\":{\"actualLength\":\"The actual value length.\",\"expectedLength\":\"The expected value length.\"}}],\"ValueExists(bytes32)\":[{\"params\":{\"actualValue\":\"The value found at the proven storage slot.\"}}]},\"events\":{\"RoleAdminChanged(bytes32,bytes32,bytes32)\":{\"details\":\"Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite {RoleAdminChanged} not being emitted to signal this.\"},\"RoleGranted(bytes32,address,address)\":{\"details\":\"Emitted when `account` is granted `role`. `sender` is the account that originated the contract call. This account bears the admin role (for the granted role). Expected in cases where the role was granted using the internal {AccessControl-_grantRole}.\"},\"RoleRevoked(bytes32,address,address)\":{\"details\":\"Emitted when `account` is revoked `role`. `sender` is the account that originated the contract call: - if using `revokeRole`, it is the admin role bearer - if using `renounceRole`, it is the role bearer (i.e. `account`)\"}},\"kind\":\"dev\",\"methods\":{\"constructor\":{\"params\":{\"ibcRouter\":\"Counterparty ICS26 router address whose storage is proven.\",\"initialTrustedHeight\":\"Initial trusted Besu height.\",\"initialTrustedStorageRoot\":\"Initial trusted storage root of `ibcRouter`.\",\"initialTrustedTimestamp\":\"Initial trusted header timestamp in seconds.\",\"initialTrustedValidators\":\"Initial trusted validator set.\",\"maxClockDrift\":\"Maximum allowed future drift in seconds for submitted headers.\",\"roleManager\":\"Address that administers proof submission; if zero, proof submission is open.\",\"trustingPeriod\":\"Maximum age in seconds for trusted consensus states.\"}},\"getClientState()\":{\"returns\":{\"_0\":\"The client state.\"}},\"getConsensusState(uint64)\":{\"params\":{\"revisionHeight\":\"The revision height to query.\"},\"returns\":{\"_0\":\"The ABI-encoded consensus state.\"}},\"getRoleAdmin(bytes32)\":{\"details\":\"Returns the admin role that controls `role`. See {grantRole} and {revokeRole}. To change a role's admin, use {_setRoleAdmin}.\"},\"grantRole(bytes32,address)\":{\"details\":\"Grants `role` to `account`. If `account` had not been already granted `role`, emits a {RoleGranted} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleGranted} event.\"},\"hasRole(bytes32,address)\":{\"details\":\"Returns `true` if `account` has been granted `role`.\"},\"misbehaviour(bytes)\":{\"params\":{\"misbehaviourMsg\":\"The misbehaviour message\"}},\"renounceRole(bytes32,address)\":{\"details\":\"Revokes `role` from the calling account. Roles are often managed via {grantRole} and {revokeRole}: this function's purpose is to provide a mechanism for accounts to lose their privileges if they are compromised (such as when a trusted device is misplaced). If the calling account had been revoked `role`, emits a {RoleRevoked} event. Requirements: - the caller must be `callerConfirmation`. May emit a {RoleRevoked} event.\"},\"revokeRole(bytes32,address)\":{\"details\":\"Revokes `role` from `account`. If `account` had been granted `role`, emits a {RoleRevoked} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleRevoked} event.\"},\"supportsInterface(bytes4)\":{\"details\":\"Returns true if this contract implements the interface defined by `interfaceId`. See the corresponding https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[ERC section] to learn more about how these ids are created. This function call must use less than 30 000 gas.\"},\"updateClient(bytes)\":{\"params\":{\"updateMsg\":\"The encoded update message e.g., an SP1 proof.\"},\"returns\":{\"_0\":\"The result of the update operation\"}},\"verifyMembership((bytes,(uint64,uint64),bytes[],bytes))\":{\"details\":\"Notice that this message is not view, as it may update the client state for caching purposes.\",\"params\":{\"msg_\":\"The membership message\"},\"returns\":{\"_0\":\"The unix timestamp of the verification height in the counterparty chain in seconds.\"}},\"verifyNonMembership((bytes,(uint64,uint64),bytes[]))\":{\"details\":\"Notice that this message is not view, as it may update the client state for caching purposes.\",\"params\":{\"msg_\":\"The membership message\"},\"returns\":{\"_0\":\"The unix timestamp of the verification height in the counterparty chain in seconds.\"}}},\"title\":\"Besu QBFT Light Client\",\"version\":1},\"userdoc\":{\"errors\":{\"ConflictingConsensusState(uint64)\":[{\"notice\":\"A different consensus state already exists at the submitted height.\"}],\"ConsensusStateExpired(uint64,uint256,uint64)\":[{\"notice\":\"The trusted consensus state is outside the trusting period.\"}],\"ConsensusStateNotFound(uint64)\":[{\"notice\":\"No consensus state exists for the requested height.\"}],\"DuplicateCommitSealSigner(address)\":[{\"notice\":\"A commit seal signer appears more than once.\"}],\"DuplicateValidator(address)\":[{\"notice\":\"A validator appears more than once.\"}],\"EmptyValidatorSet()\":[{\"notice\":\"The validator set is empty.\"}],\"HeaderFromFuture(uint256,uint256,uint256)\":[{\"notice\":\"The submitted header timestamp is too far in the future.\"}],\"InsufficientTrustedValidatorOverlap(uint256,uint256)\":[{\"notice\":\"The submitted signers do not overlap enough with the trusted validator set.\"}],\"InsufficientValidatorQuorum(uint256,uint256)\":[{\"notice\":\"The submitted signers do not meet quorum for the new validator set.\"}],\"InvalidCommitSeal()\":[{\"notice\":\"A commit seal did not recover a valid signer.\"}],\"InvalidCommitmentValue(bytes32,bytes32)\":[{\"notice\":\"A proven commitment value does not match the expected value.\"}],\"InvalidDifficulty(uint256)\":[{\"notice\":\"The Besu BFT difficulty is invalid.\"}],\"InvalidECDSASignatureLength(uint256)\":[{\"notice\":\"An ECDSA signature has an invalid length.\"}],\"InvalidExtraDataFormat(uint256)\":[{\"notice\":\"The submitted `extraData` field has an invalid RLP item count.\"}],\"InvalidHeaderFormat(uint256)\":[{\"notice\":\"The submitted header has an invalid RLP item count.\"}],\"InvalidHeaderHeight()\":[{\"notice\":\"The submitted header height is zero.\"}],\"InvalidHeaderTimestamp()\":[{\"notice\":\"The submitted header timestamp is zero.\"}],\"InvalidMixHash(bytes32)\":[{\"notice\":\"The Besu BFT mix hash is invalid.\"}],\"InvalidNonce(bytes)\":[{\"notice\":\"The Besu BFT nonce is invalid.\"}],\"InvalidOmmersHash(bytes32)\":[{\"notice\":\"The ommers hash is invalid.\"}],\"InvalidPathLength(uint256,uint256)\":[{\"notice\":\"A proof path has an invalid length.\"}],\"InvalidRevisionNumber(uint64)\":[{\"notice\":\"The revision number must be zero for Besu light client heights.\"}],\"InvalidValidatorAddress(address)\":[{\"notice\":\"A validator address is invalid.\"}],\"InvalidValidatorAddressLength(uint256)\":[{\"notice\":\"A validator address has an invalid byte length.\"}],\"InvalidValueLength(uint256,uint256)\":[{\"notice\":\"A membership value has an invalid length.\"}],\"UnsupportedMisbehaviour()\":[{\"notice\":\"Misbehaviour handling is not supported by this client.\"}],\"ValueExists(bytes32)\":[{\"notice\":\"A non-membership proof found an existing value.\"}]},\"kind\":\"user\",\"methods\":{\"PROOF_SUBMITTER_ROLE()\":{\"notice\":\"Role allowed to submit client updates and proof verifications.\"},\"constructor\":{\"notice\":\"Creates a Besu QBFT light client from an initial trusted consensus state.\"},\"getClientState()\":{\"notice\":\"Returns the client state.\"},\"getConsensusState(uint64)\":{\"notice\":\"Returns the encoded consensus state for a revision height.\"},\"misbehaviour(bytes)\":{\"notice\":\"Misbehaviour handling, moves the light client to the frozen state if misbehaviour is detected\"},\"updateClient(bytes)\":{\"notice\":\"Updating the client and consensus state\"},\"verifyMembership((bytes,(uint64,uint64),bytes[],bytes))\":{\"notice\":\"Querying the membership of a key-value pair\"},\"verifyNonMembership((bytes,(uint64,uint64),bytes[]))\":{\"notice\":\"Querying the non-membership of a key\"}},\"notice\":\"Verifies Besu QBFT headers and ICS26 router storage proofs.\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/light-clients/besu/BesuQBFTLightClient.sol\":\"BesuQBFTLightClient\"},\"evmVersion\":\"cancun\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"none\"},\"optimizer\":{\"enabled\":true,\"runs\":10000},\"remappings\":[\":@openzeppelin-contracts/=node_modules/@openzeppelin/contracts/\",\":@openzeppelin-upgradeable/=node_modules/@openzeppelin/contracts-upgradeable/\",\":@openzeppelin/=node_modules/@openzeppelin/\",\":@sp1-contracts/=node_modules/sp1-contracts/contracts/src/\",\":@uniswap/permit2/=node_modules/@uniswap/permit2/\",\":forge-std/=node_modules/forge-std/src/\",\":sp1-contracts/=node_modules/sp1-contracts/\"],\"viaIR\":true},\"sources\":{\"contracts/interfaces/ILightClient.sol\":{\"keccak256\":\"0x3b2361546ee834a442d844c979fbad3458ee13146b093f585587a09e19a266af\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://5b5d53101bb598f14a79cb1092479736fa18e8f84945ea6ef80f4dac84466042\",\"dweb:/ipfs/QmaTCo6M3Z9aYCSX65AQtixo1sB4ymQUDAgTXSKHqJHGDh\"]},\"contracts/light-clients/besu/BesuLightClientBase.sol\":{\"keccak256\":\"0x0e2957f1e184e52c1f007f7bbbe5279fe46aa54e02b7fea9ad96c06639fc704d\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://cfa0d54ac2be000860a378a9119f70d72615e7627c80862033684e2f90d32e15\",\"dweb:/ipfs/QmefzqCmWMghrgTQRoGkM7DSRZ3E8dUDFBCrHUhphPJCwB\"]},\"contracts/light-clients/besu/BesuQBFTLightClient.sol\":{\"keccak256\":\"0xaeb51b2596e5959273edc43f9db73effe6c8f0f05bdedda140db66e2dfdd0fea\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://28beb01f795950c145576718eb64a4c65948c5c04db20d9b9105d416ada277b4\",\"dweb:/ipfs/Qmb2CjEjmrF8pFj4eo9mCfRA2VWCVQ5H1F81DA9sBtvaVA\"]},\"contracts/light-clients/besu/MPTProof.sol\":{\"keccak256\":\"0x9ab26e6445b20541e8725b190006444d3b16eb3e021174e280451f934d9535c6\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://b6f3fd58b06b942a454bb9b21e9be40a2dab8a09f78e75ff4357c8afbc7e2d5b\",\"dweb:/ipfs/QmPeUwNScDiU91Xx4UQduYjyCPALYLPq73ZUMEn8Nr1rTG\"]},\"contracts/light-clients/besu/RLPReader.sol\":{\"keccak256\":\"0xa64ad17e6da7fed2bd206df52189286694339a8061dc5d158e717eda982af1d9\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://7020db2fe854e90e1b791e0e587610fc26bed3073ba1811faa275a1d8bf3c2c7\",\"dweb:/ipfs/QmdXdKghNFZSX7N9qD6BsKuJQdrFoqatsVWvHRL7vJCmeP\"]},\"contracts/light-clients/besu/errors/IBesuLightClientErrors.sol\":{\"keccak256\":\"0x66eff5c2f400de52896b24768de7a157eae68ca951aca2b0c271b8e03015986b\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://3a13f7651324fab436f31dcaa25cea7d4c0cd432ddecd6e17b6876b1c80c6408\",\"dweb:/ipfs/QmQHcMexxFzKcgfbE5rcFKq31PYBprppUEsy76dU8MRPvN\"]},\"contracts/light-clients/besu/msgs/IBesuLightClientMsgs.sol\":{\"keccak256\":\"0x3fc43a3daaae2f89dca4cadbc99ea71086282f987b47a95c13489ae3384532cf\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://36083aa6833eb30d26023f7dc0b2e22b7d0723d922fcd50cf86999edc9aeb474\",\"dweb:/ipfs/QmbPv9KJj5AuJkgppuyuoaTHtiw91Qkx1tdkf1R5D4wad2\"]},\"contracts/msgs/IICS02ClientMsgs.sol\":{\"keccak256\":\"0x03d1265eae327c3744d774bf22a30d845233d50664921c9aa57cef2d71fd89d2\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://89900781cc5c60540a237d92d42745ea6165765ee8fb4d50e8137a717195cc75\",\"dweb:/ipfs/Qmbx5p8gZ8sEMMeZytXsLee49JUayhAaoJ2yxX93WUrvQo\"]},\"contracts/msgs/ILightClientMsgs.sol\":{\"keccak256\":\"0x8d1e56ab166a7b4aa6999708e3214a4645ebbc3835c2b2a4c255c9923eebafde\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://8bd4200dc04d950c0f050623fa9a8accdbec877fd446c039d4dd6c678bdf1513\",\"dweb:/ipfs/QmZQTViaA7N6BVNDzJ1Z6w799PrPoE4ajPueZSPwX4sGZ9\"]},\"node_modules/@openzeppelin/contracts/access/AccessControl.sol\":{\"keccak256\":\"0x4686ec784d75f95beaf2bf5b5f26e5f946d4c864aaee9c3c62bdc18381f5e017\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://26710ca191913f3c9df542079c4a6dcff02968e92d4f7357daefef9fbe72a19c\",\"dweb:/ipfs/QmanHbeWuBbVEqXySHa1zhm2rExjYpChDBubBaJNTCa2JB\"]},\"node_modules/@openzeppelin/contracts/access/IAccessControl.sol\":{\"keccak256\":\"0xbff9f59c84e5337689161ce7641c0ef8e872d6a7536fbc1f5133f128887aba3c\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://b308f882e796f7b79c9502deacb0a62983035c6f6f4e962b319ba6a1f4a77d3d\",\"dweb:/ipfs/QmaWCW7ahEQqFjwhSUhV7Ae7WhfNvzSpE7DQ58hvEooqPL\"]},\"node_modules/@openzeppelin/contracts/utils/Context.sol\":{\"keccak256\":\"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://6a708e8a5bdb1011c2c381c9a5cfd8a9a956d7d0a9dc1bd8bcdaf52f76ef2f12\",\"dweb:/ipfs/Qmax9WHBnVsZP46ZxEMNRQpLQnrdE4dK8LehML1Py8FowF\"]},\"node_modules/@openzeppelin/contracts/utils/cryptography/ECDSA.sol\":{\"keccak256\":\"0xbeb5cad8aaabe0d35d2ec1a8414d91e81e5a8ca679add4cf57e2f33476861f40\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://ebb272a5ee2da4e8bd5551334e0ce8dce4e9c56a04570d6bf046d260fab3116a\",\"dweb:/ipfs/QmNw6RyM769qcqFocDq6HJMG2WiEnQbvizpRaUXsACHho2\"]},\"node_modules/@openzeppelin/contracts/utils/introspection/ERC165.sol\":{\"keccak256\":\"0x2d9dc2fe26180f74c11c13663647d38e259e45f95eb88f57b61d2160b0109d3e\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://81233d1f98060113d9922180bb0f14f8335856fe9f339134b09335e9f678c377\",\"dweb:/ipfs/QmWh6R35SarhAn4z2wH8SU456jJSYL2FgucfTFgbHJJN4E\"]},\"node_modules/@openzeppelin/contracts/utils/introspection/IERC165.sol\":{\"keccak256\":\"0x8891738ffe910f0cf2da09566928589bf5d63f4524dd734fd9cedbac3274dd5c\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://971f954442df5c2ef5b5ebf1eb245d7105d9fbacc7386ee5c796df1d45b21617\",\"dweb:/ipfs/QmadRjHbkicwqwwh61raUEapaVEtaLMcYbQZWs9gUkgj3u\"]}},\"version\":1}","metadata":{"compiler":{"version":"0.8.28+commit.7893614a"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"address","name":"ibcRouter","type":"address"},{"internalType":"uint64","name":"initialTrustedHeight","type":"uint64"},{"internalType":"uint64","name":"initialTrustedTimestamp","type":"uint64"},{"internalType":"bytes32","name":"initialTrustedStorageRoot","type":"bytes32"},{"internalType":"address[]","name":"initialTrustedValidators","type":"address[]"},{"internalType":"uint64","name":"trustingPeriod","type":"uint64"},{"internalType":"uint64","name":"maxClockDrift","type":"uint64"},{"internalType":"address","name":"roleManager","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"type":"error","name":"AccessControlBadConfirmation"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bytes32","name":"neededRole","type":"bytes32"}],"type":"error","name":"AccessControlUnauthorizedAccount"},{"inputs":[{"internalType":"uint64","name":"revisionHeight","type":"uint64"}],"type":"error","name":"ConflictingConsensusState"},{"inputs":[{"internalType":"uint64","name":"trustedTimestamp","type":"uint64"},{"internalType":"uint256","name":"currentTimestamp","type":"uint256"},{"internalType":"uint64","name":"trustingPeriod","type":"uint64"}],"type":"error","name":"ConsensusStateExpired"},{"inputs":[{"internalType":"uint64","name":"revisionHeight","type":"uint64"}],"type":"error","name":"ConsensusStateNotFound"},{"inputs":[{"internalType":"address","name":"signer","type":"address"}],"type":"error","name":"DuplicateCommitSealSigner"},{"inputs":[{"internalType":"address","name":"validator","type":"address"}],"type":"error","name":"DuplicateValidator"},{"inputs":[],"type":"error","name":"EmptyValidatorSet"},{"inputs":[{"internalType":"uint256","name":"currentTimestamp","type":"uint256"},{"internalType":"uint256","name":"headerTimestamp","type":"uint256"},{"internalType":"uint256","name":"maxClockDrift","type":"uint256"}],"type":"error","name":"HeaderFromFuture"},{"inputs":[{"internalType":"uint256","name":"actual","type":"uint256"},{"internalType":"uint256","name":"required","type":"uint256"}],"type":"error","name":"InsufficientTrustedValidatorOverlap"},{"inputs":[{"internalType":"uint256","name":"actual","type":"uint256"},{"internalType":"uint256","name":"required","type":"uint256"}],"type":"error","name":"InsufficientValidatorQuorum"},{"inputs":[],"type":"error","name":"InvalidCommitSeal"},{"inputs":[{"internalType":"bytes32","name":"expectedValue","type":"bytes32"},{"internalType":"bytes32","name":"actualValue","type":"bytes32"}],"type":"error","name":"InvalidCommitmentValue"},{"inputs":[{"internalType":"uint256","name":"actualDifficulty","type":"uint256"}],"type":"error","name":"InvalidDifficulty"},{"inputs":[{"internalType":"uint256","name":"length","type":"uint256"}],"type":"error","name":"InvalidECDSASignatureLength"},{"inputs":[{"internalType":"uint256","name":"itemsLength","type":"uint256"}],"type":"error","name":"InvalidExtraDataFormat"},{"inputs":[{"internalType":"uint256","name":"itemsLength","type":"uint256"}],"type":"error","name":"InvalidHeaderFormat"},{"inputs":[],"type":"error","name":"InvalidHeaderHeight"},{"inputs":[],"type":"error","name":"InvalidHeaderTimestamp"},{"inputs":[{"internalType":"bytes32","name":"actualMixHash","type":"bytes32"}],"type":"error","name":"InvalidMixHash"},{"inputs":[{"internalType":"bytes","name":"actualNonce","type":"bytes"}],"type":"error","name":"InvalidNonce"},{"inputs":[{"internalType":"bytes32","name":"actualOmmersHash","type":"bytes32"}],"type":"error","name":"InvalidOmmersHash"},{"inputs":[{"internalType":"uint256","name":"expectedLength","type":"uint256"},{"internalType":"uint256","name":"actualLength","type":"uint256"}],"type":"error","name":"InvalidPathLength"},{"inputs":[{"internalType":"uint64","name":"providedRevisionNumber","type":"uint64"}],"type":"error","name":"InvalidRevisionNumber"},{"inputs":[{"internalType":"address","name":"validator","type":"address"}],"type":"error","name":"InvalidValidatorAddress"},{"inputs":[{"internalType":"uint256","name":"length","type":"uint256"}],"type":"error","name":"InvalidValidatorAddressLength"},{"inputs":[{"internalType":"uint256","name":"expectedLength","type":"uint256"},{"internalType":"uint256","name":"actualLength","type":"uint256"}],"type":"error","name":"InvalidValueLength"},{"inputs":[],"type":"error","name":"UnsupportedMisbehaviour"},{"inputs":[{"internalType":"bytes32","name":"actualValue","type":"bytes32"}],"type":"error","name":"ValueExists"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32","indexed":true},{"internalType":"bytes32","name":"previousAdminRole","type":"bytes32","indexed":true},{"internalType":"bytes32","name":"newAdminRole","type":"bytes32","indexed":true}],"type":"event","name":"RoleAdminChanged","anonymous":false},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32","indexed":true},{"internalType":"address","name":"account","type":"address","indexed":true},{"internalType":"address","name":"sender","type":"address","indexed":true}],"type":"event","name":"RoleGranted","anonymous":false},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32","indexed":true},{"internalType":"address","name":"account","type":"address","indexed":true},{"internalType":"address","name":"sender","type":"address","indexed":true}],"type":"event","name":"RoleRevoked","anonymous":false},{"inputs":[],"stateMutability":"view","type":"function","name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"PROOF_SUBMITTER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"getClientState","outputs":[{"internalType":"bytes","name":"","type":"bytes"}]},{"inputs":[{"internalType":"uint64","name":"revisionHeight","type":"uint64"}],"stateMutability":"view","type":"function","name":"getConsensusState","outputs":[{"internalType":"bytes","name":"","type":"bytes"}]},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"stateMutability":"view","type":"function","name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}]},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"stateMutability":"nonpayable","type":"function","name":"grantRole"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"stateMutability":"view","type":"function","name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}]},{"inputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function","name":"misbehaviour"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"callerConfirmation","type":"address"}],"stateMutability":"nonpayable","type":"function","name":"renounceRole"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"stateMutability":"nonpayable","type":"function","name":"revokeRole"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"stateMutability":"view","type":"function","name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}]},{"inputs":[{"internalType":"bytes","name":"updateMsg","type":"bytes"}],"stateMutability":"nonpayable","type":"function","name":"updateClient","outputs":[{"internalType":"enum ILightClientMsgs.UpdateResult","name":"","type":"uint8"}]},{"inputs":[{"internalType":"struct ILightClientMsgs.MsgVerifyMembership","name":"msg_","type":"tuple","components":[{"internalType":"bytes","name":"proof","type":"bytes"},{"internalType":"struct IICS02ClientMsgs.Height","name":"proofHeight","type":"tuple","components":[{"internalType":"uint64","name":"revisionNumber","type":"uint64"},{"internalType":"uint64","name":"revisionHeight","type":"uint64"}]},{"internalType":"bytes[]","name":"path","type":"bytes[]"},{"internalType":"bytes","name":"value","type":"bytes"}]}],"stateMutability":"view","type":"function","name":"verifyMembership","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[{"internalType":"struct ILightClientMsgs.MsgVerifyNonMembership","name":"msg_","type":"tuple","components":[{"internalType":"bytes","name":"proof","type":"bytes"},{"internalType":"struct IICS02ClientMsgs.Height","name":"proofHeight","type":"tuple","components":[{"internalType":"uint64","name":"revisionNumber","type":"uint64"},{"internalType":"uint64","name":"revisionHeight","type":"uint64"}]},{"internalType":"bytes[]","name":"path","type":"bytes[]"}]}],"stateMutability":"view","type":"function","name":"verifyNonMembership","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]}],"devdoc":{"kind":"dev","methods":{"constructor":{"params":{"ibcRouter":"Counterparty ICS26 router address whose storage is proven.","initialTrustedHeight":"Initial trusted Besu height.","initialTrustedStorageRoot":"Initial trusted storage root of `ibcRouter`.","initialTrustedTimestamp":"Initial trusted header timestamp in seconds.","initialTrustedValidators":"Initial trusted validator set.","maxClockDrift":"Maximum allowed future drift in seconds for submitted headers.","roleManager":"Address that administers proof submission; if zero, proof submission is open.","trustingPeriod":"Maximum age in seconds for trusted consensus states."}},"getClientState()":{"returns":{"_0":"The client state."}},"getConsensusState(uint64)":{"params":{"revisionHeight":"The revision height to query."},"returns":{"_0":"The ABI-encoded consensus state."}},"getRoleAdmin(bytes32)":{"details":"Returns the admin role that controls `role`. See {grantRole} and {revokeRole}. To change a role's admin, use {_setRoleAdmin}."},"grantRole(bytes32,address)":{"details":"Grants `role` to `account`. If `account` had not been already granted `role`, emits a {RoleGranted} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleGranted} event."},"hasRole(bytes32,address)":{"details":"Returns `true` if `account` has been granted `role`."},"misbehaviour(bytes)":{"params":{"misbehaviourMsg":"The misbehaviour message"}},"renounceRole(bytes32,address)":{"details":"Revokes `role` from the calling account. Roles are often managed via {grantRole} and {revokeRole}: this function's purpose is to provide a mechanism for accounts to lose their privileges if they are compromised (such as when a trusted device is misplaced). If the calling account had been revoked `role`, emits a {RoleRevoked} event. Requirements: - the caller must be `callerConfirmation`. May emit a {RoleRevoked} event."},"revokeRole(bytes32,address)":{"details":"Revokes `role` from `account`. If `account` had been granted `role`, emits a {RoleRevoked} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleRevoked} event."},"supportsInterface(bytes4)":{"details":"Returns true if this contract implements the interface defined by `interfaceId`. See the corresponding https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[ERC section] to learn more about how these ids are created. This function call must use less than 30 000 gas."},"updateClient(bytes)":{"params":{"updateMsg":"The encoded update message e.g., an SP1 proof."},"returns":{"_0":"The result of the update operation"}},"verifyMembership((bytes,(uint64,uint64),bytes[],bytes))":{"details":"Notice that this message is not view, as it may update the client state for caching purposes.","params":{"msg_":"The membership message"},"returns":{"_0":"The unix timestamp of the verification height in the counterparty chain in seconds."}},"verifyNonMembership((bytes,(uint64,uint64),bytes[]))":{"details":"Notice that this message is not view, as it may update the client state for caching purposes.","params":{"msg_":"The membership message"},"returns":{"_0":"The unix timestamp of the verification height in the counterparty chain in seconds."}}},"version":1},"userdoc":{"kind":"user","methods":{"PROOF_SUBMITTER_ROLE()":{"notice":"Role allowed to submit client updates and proof verifications."},"constructor":{"notice":"Creates a Besu QBFT light client from an initial trusted consensus state."},"getClientState()":{"notice":"Returns the client state."},"getConsensusState(uint64)":{"notice":"Returns the encoded consensus state for a revision height."},"misbehaviour(bytes)":{"notice":"Misbehaviour handling, moves the light client to the frozen state if misbehaviour is detected"},"updateClient(bytes)":{"notice":"Updating the client and consensus state"},"verifyMembership((bytes,(uint64,uint64),bytes[],bytes))":{"notice":"Querying the membership of a key-value pair"},"verifyNonMembership((bytes,(uint64,uint64),bytes[]))":{"notice":"Querying the non-membership of a key"}},"version":1}},"settings":{"remappings":["@openzeppelin-contracts/=node_modules/@openzeppelin/contracts/","@openzeppelin-upgradeable/=node_modules/@openzeppelin/contracts-upgradeable/","@openzeppelin/=node_modules/@openzeppelin/","@sp1-contracts/=node_modules/sp1-contracts/contracts/src/","@uniswap/permit2/=node_modules/@uniswap/permit2/","forge-std/=node_modules/forge-std/src/","sp1-contracts/=node_modules/sp1-contracts/"],"optimizer":{"enabled":true,"runs":10000},"metadata":{"bytecodeHash":"none"},"compilationTarget":{"contracts/light-clients/besu/BesuQBFTLightClient.sol":"BesuQBFTLightClient"},"evmVersion":"cancun","libraries":{},"viaIR":true},"sources":{"contracts/interfaces/ILightClient.sol":{"keccak256":"0x3b2361546ee834a442d844c979fbad3458ee13146b093f585587a09e19a266af","urls":["bzz-raw://5b5d53101bb598f14a79cb1092479736fa18e8f84945ea6ef80f4dac84466042","dweb:/ipfs/QmaTCo6M3Z9aYCSX65AQtixo1sB4ymQUDAgTXSKHqJHGDh"],"license":"Apache-2.0"},"contracts/light-clients/besu/BesuLightClientBase.sol":{"keccak256":"0x0e2957f1e184e52c1f007f7bbbe5279fe46aa54e02b7fea9ad96c06639fc704d","urls":["bzz-raw://cfa0d54ac2be000860a378a9119f70d72615e7627c80862033684e2f90d32e15","dweb:/ipfs/QmefzqCmWMghrgTQRoGkM7DSRZ3E8dUDFBCrHUhphPJCwB"],"license":"Apache-2.0"},"contracts/light-clients/besu/BesuQBFTLightClient.sol":{"keccak256":"0xaeb51b2596e5959273edc43f9db73effe6c8f0f05bdedda140db66e2dfdd0fea","urls":["bzz-raw://28beb01f795950c145576718eb64a4c65948c5c04db20d9b9105d416ada277b4","dweb:/ipfs/Qmb2CjEjmrF8pFj4eo9mCfRA2VWCVQ5H1F81DA9sBtvaVA"],"license":"Apache-2.0"},"contracts/light-clients/besu/MPTProof.sol":{"keccak256":"0x9ab26e6445b20541e8725b190006444d3b16eb3e021174e280451f934d9535c6","urls":["bzz-raw://b6f3fd58b06b942a454bb9b21e9be40a2dab8a09f78e75ff4357c8afbc7e2d5b","dweb:/ipfs/QmPeUwNScDiU91Xx4UQduYjyCPALYLPq73ZUMEn8Nr1rTG"],"license":"Apache-2.0"},"contracts/light-clients/besu/RLPReader.sol":{"keccak256":"0xa64ad17e6da7fed2bd206df52189286694339a8061dc5d158e717eda982af1d9","urls":["bzz-raw://7020db2fe854e90e1b791e0e587610fc26bed3073ba1811faa275a1d8bf3c2c7","dweb:/ipfs/QmdXdKghNFZSX7N9qD6BsKuJQdrFoqatsVWvHRL7vJCmeP"],"license":"Apache-2.0"},"contracts/light-clients/besu/errors/IBesuLightClientErrors.sol":{"keccak256":"0x66eff5c2f400de52896b24768de7a157eae68ca951aca2b0c271b8e03015986b","urls":["bzz-raw://3a13f7651324fab436f31dcaa25cea7d4c0cd432ddecd6e17b6876b1c80c6408","dweb:/ipfs/QmQHcMexxFzKcgfbE5rcFKq31PYBprppUEsy76dU8MRPvN"],"license":"Apache-2.0"},"contracts/light-clients/besu/msgs/IBesuLightClientMsgs.sol":{"keccak256":"0x3fc43a3daaae2f89dca4cadbc99ea71086282f987b47a95c13489ae3384532cf","urls":["bzz-raw://36083aa6833eb30d26023f7dc0b2e22b7d0723d922fcd50cf86999edc9aeb474","dweb:/ipfs/QmbPv9KJj5AuJkgppuyuoaTHtiw91Qkx1tdkf1R5D4wad2"],"license":"Apache-2.0"},"contracts/msgs/IICS02ClientMsgs.sol":{"keccak256":"0x03d1265eae327c3744d774bf22a30d845233d50664921c9aa57cef2d71fd89d2","urls":["bzz-raw://89900781cc5c60540a237d92d42745ea6165765ee8fb4d50e8137a717195cc75","dweb:/ipfs/Qmbx5p8gZ8sEMMeZytXsLee49JUayhAaoJ2yxX93WUrvQo"],"license":"Apache-2.0"},"contracts/msgs/ILightClientMsgs.sol":{"keccak256":"0x8d1e56ab166a7b4aa6999708e3214a4645ebbc3835c2b2a4c255c9923eebafde","urls":["bzz-raw://8bd4200dc04d950c0f050623fa9a8accdbec877fd446c039d4dd6c678bdf1513","dweb:/ipfs/QmZQTViaA7N6BVNDzJ1Z6w799PrPoE4ajPueZSPwX4sGZ9"],"license":"Apache-2.0"},"node_modules/@openzeppelin/contracts/access/AccessControl.sol":{"keccak256":"0x4686ec784d75f95beaf2bf5b5f26e5f946d4c864aaee9c3c62bdc18381f5e017","urls":["bzz-raw://26710ca191913f3c9df542079c4a6dcff02968e92d4f7357daefef9fbe72a19c","dweb:/ipfs/QmanHbeWuBbVEqXySHa1zhm2rExjYpChDBubBaJNTCa2JB"],"license":"MIT"},"node_modules/@openzeppelin/contracts/access/IAccessControl.sol":{"keccak256":"0xbff9f59c84e5337689161ce7641c0ef8e872d6a7536fbc1f5133f128887aba3c","urls":["bzz-raw://b308f882e796f7b79c9502deacb0a62983035c6f6f4e962b319ba6a1f4a77d3d","dweb:/ipfs/QmaWCW7ahEQqFjwhSUhV7Ae7WhfNvzSpE7DQ58hvEooqPL"],"license":"MIT"},"node_modules/@openzeppelin/contracts/utils/Context.sol":{"keccak256":"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2","urls":["bzz-raw://6a708e8a5bdb1011c2c381c9a5cfd8a9a956d7d0a9dc1bd8bcdaf52f76ef2f12","dweb:/ipfs/Qmax9WHBnVsZP46ZxEMNRQpLQnrdE4dK8LehML1Py8FowF"],"license":"MIT"},"node_modules/@openzeppelin/contracts/utils/cryptography/ECDSA.sol":{"keccak256":"0xbeb5cad8aaabe0d35d2ec1a8414d91e81e5a8ca679add4cf57e2f33476861f40","urls":["bzz-raw://ebb272a5ee2da4e8bd5551334e0ce8dce4e9c56a04570d6bf046d260fab3116a","dweb:/ipfs/QmNw6RyM769qcqFocDq6HJMG2WiEnQbvizpRaUXsACHho2"],"license":"MIT"},"node_modules/@openzeppelin/contracts/utils/introspection/ERC165.sol":{"keccak256":"0x2d9dc2fe26180f74c11c13663647d38e259e45f95eb88f57b61d2160b0109d3e","urls":["bzz-raw://81233d1f98060113d9922180bb0f14f8335856fe9f339134b09335e9f678c377","dweb:/ipfs/QmWh6R35SarhAn4z2wH8SU456jJSYL2FgucfTFgbHJJN4E"],"license":"MIT"},"node_modules/@openzeppelin/contracts/utils/introspection/IERC165.sol":{"keccak256":"0x8891738ffe910f0cf2da09566928589bf5d63f4524dd734fd9cedbac3274dd5c","urls":["bzz-raw://971f954442df5c2ef5b5ebf1eb245d7105d9fbacc7386ee5c796df1d45b21617","dweb:/ipfs/QmadRjHbkicwqwwh61raUEapaVEtaLMcYbQZWs9gUkgj3u"],"license":"MIT"}},"version":1},"id":36} \ No newline at end of file diff --git a/ibc-solidity/contracts/light-clients/besu/BesuLightClientBase.sol b/ibc-solidity/contracts/light-clients/besu/BesuLightClientBase.sol index 0aadd31e8..a88789b9b 100644 --- a/ibc-solidity/contracts/light-clients/besu/BesuLightClientBase.sol +++ b/ibc-solidity/contracts/light-clients/besu/BesuLightClientBase.sol @@ -80,6 +80,9 @@ abstract contract BesuLightClientBase is ILightClient, IBesuLightClientErrors, I if (initialTrustedHeight == 0) { revert InvalidHeaderHeight(); } + if (initialTrustedTimestamp == 0) { + revert InvalidHeaderTimestamp(); + } _validateValidators(initialTrustedValidators); diff --git a/ibc-solidity/contracts/light-clients/besu/errors/IBesuLightClientErrors.sol b/ibc-solidity/contracts/light-clients/besu/errors/IBesuLightClientErrors.sol index 80e26ff9e..ff87b4b26 100644 --- a/ibc-solidity/contracts/light-clients/besu/errors/IBesuLightClientErrors.sol +++ b/ibc-solidity/contracts/light-clients/besu/errors/IBesuLightClientErrors.sol @@ -15,6 +15,8 @@ interface IBesuLightClientErrors { error InvalidExtraDataFormat(uint256 itemsLength); /// @notice The submitted header height is zero. error InvalidHeaderHeight(); + /// @notice The submitted header timestamp is zero. + error InvalidHeaderTimestamp(); /// @notice The submitted header timestamp is too far in the future. /// @param currentTimestamp The current block timestamp. /// @param headerTimestamp The submitted header timestamp. diff --git a/ibc-solidity/test/besu-bft/BesuLightClientQuorum.t.sol b/ibc-solidity/test/besu-bft/BesuLightClientQuorum.t.sol index a240df0ba..9a949da2b 100644 --- a/ibc-solidity/test/besu-bft/BesuLightClientQuorum.t.sol +++ b/ibc-solidity/test/besu-bft/BesuLightClientQuorum.t.sol @@ -7,8 +7,11 @@ import { BesuLightClientBase } from "../../contracts/light-clients/besu/BesuLigh import { IBesuLightClientErrors } from "../../contracts/light-clients/besu/errors/IBesuLightClientErrors.sol"; contract BesuLightClientQuorumHarness is BesuLightClientBase { - constructor(address[] memory initialValidators) - BesuLightClientBase(address(1), 1, 1, bytes32(0), initialValidators, 0, 0, address(0)) + constructor( + uint64 initialTrustedTimestamp, + address[] memory initialValidators + ) + BesuLightClientBase(address(1), 1, initialTrustedTimestamp, bytes32(0), initialValidators, 0, 0, address(0)) { } function checkValidatorQuorum(address[] calldata signers, address[] calldata validators) external pure { @@ -24,7 +27,12 @@ contract BesuLightClientQuorumTest is Test { BesuLightClientQuorumHarness private harness; function setUp() public { - harness = new BesuLightClientQuorumHarness(_addresses(1)); + harness = new BesuLightClientQuorumHarness(1, _addresses(1)); + } + + function test_constructor_rejectsZeroTrustedTimestamp() public { + vm.expectRevert(IBesuLightClientErrors.InvalidHeaderTimestamp.selector); + new BesuLightClientQuorumHarness(0, _addresses(1)); } function test_checkValidatorQuorum_acceptsBesuFourOfSixQuorum() public view { diff --git a/packages/proof-api/modules/besu-to-besu/src/tx_builder.rs b/packages/proof-api/modules/besu-to-besu/src/tx_builder.rs index 3137b8133..c26ed9393 100644 --- a/packages/proof-api/modules/besu-to-besu/src/tx_builder.rs +++ b/packages/proof-api/modules/besu-to-besu/src/tx_builder.rs @@ -155,6 +155,12 @@ impl TxBuilder { pub async fn relay_events(&self, params: RelayEventsParams) -> Result> { let proof_height = select_proof_height(¶ms.src_events, params.timeout_relay_height)?; + let proof_timestamp = EthApiClient::new(self.src_provider.clone()) + .get_block(proof_height) + .await + .with_context(|| format!("failed to fetch source block at height {proof_height}"))? + .header + .timestamp; let now = std::time::SystemTime::now() .duration_since(UNIX_EPOCH) .context("failed to read system time")? @@ -179,7 +185,7 @@ impl TxBuilder { ¶ms.dst_client_id, ¶ms.dst_packet_seqs, &proof_height_msg, - now, + proof_timestamp, ); let mut packet_calls: Vec<_> = recv_and_ack_msgs.into_iter().chain(timeout_msgs).collect(); From b3952ba123dd05c9c07610ca5e6ecb62af0e92cd Mon Sep 17 00:00:00 2001 From: Gjermund Garaba Date: Fri, 21 Aug 2026 15:53:31 +0200 Subject: [PATCH 06/22] refactor(besu): simplify branch changes Signed-off-by: Gjermund Garaba --- e2e/interchaintestv8/besu_to_besu_test.go | 18 ---- e2e/interchaintestv8/chainconfig/besu_qbft.go | 20 +---- e2e/interchaintestv8/proofapi/config.go | 90 ++----------------- e2e/interchaintestv8/types/besu_fixtures.go | 4 +- .../besu/BesuLightClientBase.sol | 3 - .../utils/SolanaIFTSendCallConstructor.sol | 12 +-- .../proof-api/modules/besu-to-besu/Cargo.toml | 2 +- .../modules/evmdummy-to-evmdummy/Cargo.toml | 2 +- .../modules/evmdummy-to-evmdummy/src/lib.rs | 25 ++---- 9 files changed, 20 insertions(+), 156 deletions(-) diff --git a/e2e/interchaintestv8/besu_to_besu_test.go b/e2e/interchaintestv8/besu_to_besu_test.go index c5edb1b77..150dc6e99 100644 --- a/e2e/interchaintestv8/besu_to_besu_test.go +++ b/e2e/interchaintestv8/besu_to_besu_test.go @@ -159,22 +159,6 @@ func (s *BesuToBesuTestSuite) TearDownSuite() { } func (s *BesuToBesuTestSuite) Test_Deploy() { - infoAB, err := s.relayerClient.Info(context.Background(), &proofapitypes.InfoRequest{ - SrcChain: s.chainA.eth.ChainID.String(), - DstChain: s.chainB.eth.ChainID.String(), - }) - s.Require().NoError(err) - s.Require().Equal(s.chainA.eth.ChainID.String(), infoAB.SourceChain.ChainId) - s.Require().Equal(s.chainB.eth.ChainID.String(), infoAB.TargetChain.ChainId) - - infoBA, err := s.relayerClient.Info(context.Background(), &proofapitypes.InfoRequest{ - SrcChain: s.chainB.eth.ChainID.String(), - DstChain: s.chainA.eth.ChainID.String(), - }) - s.Require().NoError(err) - s.Require().Equal(s.chainB.eth.ChainID.String(), infoBA.SourceChain.ChainId) - s.Require().Equal(s.chainA.eth.ChainID.String(), infoBA.TargetChain.ChainId) - transferOnA, err := s.chainA.ics26.GetIBCApp(nil, "transfer") s.Require().NoError(err) s.Require().Equal(strings.ToLower(s.chainA.contractAddresses.Ics20Transfer), strings.ToLower(transferOnA.Hex())) @@ -189,8 +173,6 @@ func (s *BesuToBesuTestSuite) Test_Deploy() { clientOnB, err := s.chainB.ics26.GetClient(nil, besuToBesuClientOnB) s.Require().NoError(err) s.Require().Equal(s.chainB.clientAddress, clientOnB) - s.Require().NotEqual(ethcommon.Address{}, clientOnA) - s.Require().NotEqual(ethcommon.Address{}, clientOnB) } func (s *BesuToBesuTestSuite) Test_ICS20TransferERC20FromChainAToChainB() { diff --git a/e2e/interchaintestv8/chainconfig/besu_qbft.go b/e2e/interchaintestv8/chainconfig/besu_qbft.go index 21c476a12..ad99d64e0 100644 --- a/e2e/interchaintestv8/chainconfig/besu_qbft.go +++ b/e2e/interchaintestv8/chainconfig/besu_qbft.go @@ -201,25 +201,7 @@ func materializeBesuQBFTAssets(dst string) error { return err } - return fs.WalkDir(sub, ".", func(path string, d fs.DirEntry, walkErr error) error { - if walkErr != nil { - return walkErr - } - - target := filepath.Join(dst, path) - if d.IsDir() { - return os.MkdirAll(target, 0o755) - } - - contents, err := fs.ReadFile(sub, path) - if err != nil { - return err - } - - // The test keys are mounted read-only and must remain readable by the - // unprivileged Besu user inside the container. - return os.WriteFile(target, contents, 0o644) //nolint:gosec - }) + return os.CopyFS(dst, sub) } func patchBesuQBFTGenesis(path string, chainID uint64) error { diff --git a/e2e/interchaintestv8/proofapi/config.go b/e2e/interchaintestv8/proofapi/config.go index 5590016d7..1162f4ba3 100644 --- a/e2e/interchaintestv8/proofapi/config.go +++ b/e2e/interchaintestv8/proofapi/config.go @@ -9,9 +9,6 @@ import ( "math/rand" "net" "os" - "path/filepath" - "runtime" - "sort" "text/template" "time" @@ -302,93 +299,16 @@ func DefaultAggregatorConfig() AggregatorConfig { } } -// DefaultSP1ProgramPaths returns the default paths for SP1 program ELF files. -// -// The e2e tests may run from a subdirectory, and newer SP1 toolchains can emit -// ELFs into either riscv32* or riscv64* target directories. Resolve the program -// paths against the repo root and prefer an existing artifact when available. +// DefaultSP1ProgramPaths returns the default paths for SP1 program ELF files func DefaultSP1ProgramPaths() SP1ProgramPaths { return SP1ProgramPaths{ - UpdateClient: resolveSP1ProgramPath("sp1-ics07-tendermint-update-client"), - Membership: resolveSP1ProgramPath("sp1-ics07-tendermint-membership"), - UpdateClientAndMembership: resolveSP1ProgramPath("sp1-ics07-tendermint-uc-and-membership"), - Misbehaviour: resolveSP1ProgramPath("sp1-ics07-tendermint-misbehaviour"), + UpdateClient: "./ibc-solidity/programs/sp1-programs/target/elf-compilation/riscv64im-succinct-zkvm-elf/release/sp1-ics07-tendermint-update-client", + Membership: "./ibc-solidity/programs/sp1-programs/target/elf-compilation/riscv64im-succinct-zkvm-elf/release/sp1-ics07-tendermint-membership", + UpdateClientAndMembership: "./ibc-solidity/programs/sp1-programs/target/elf-compilation/riscv64im-succinct-zkvm-elf/release/sp1-ics07-tendermint-uc-and-membership", + Misbehaviour: "./ibc-solidity/programs/sp1-programs/target/elf-compilation/riscv64im-succinct-zkvm-elf/release/sp1-ics07-tendermint-misbehaviour", } } -func resolveSP1ProgramPath(programName string) string { - for _, candidate := range sp1ProgramPathCandidates(programName) { - if info, err := os.Stat(candidate); err == nil && !info.IsDir() && isELF(candidate) { - return candidate - } - } - - // Preserve the historical default as a final fallback so callers still get a - // predictable path in error messages when the programs have not been built. - return filepath.Join( - ".", - "ibc-solidity", - "programs", - "sp1-programs", - "target", - "elf-compilation", - "riscv64im-succinct-zkvm-elf", - "release", - programName, - ) -} - -func isELF(path string) bool { - f, err := os.Open(path) - if err != nil { - return false - } - defer f.Close() - - header := make([]byte, 5) - if _, err := f.Read(header); err != nil { - return false - } - - return header[0] == 0x7f && header[1] == 'E' && header[2] == 'L' && header[3] == 'F' -} - -func sp1ProgramPathCandidates(programName string) []string { - seen := make(map[string]struct{}) - candidates := make([]string, 0, 8) - add := func(path string) { - cleaned := filepath.Clean(path) - if _, ok := seen[cleaned]; ok { - return - } - seen[cleaned] = struct{}{} - candidates = append(candidates, cleaned) - } - - repoRoot := "." - if _, thisFile, _, ok := runtime.Caller(0); ok { - repoRoot = filepath.Clean(filepath.Join(filepath.Dir(thisFile), "..", "..", "..")) - } - - preferredTargets := []string{ - "riscv64im-succinct-zkvm-elf", - "riscv32im-succinct-zkvm-elf", - } - for _, target := range preferredTargets { - add(filepath.Join(repoRoot, "ibc-solidity", "programs", "sp1-programs", "target", "elf-compilation", target, "release", programName)) - } - - globPattern := filepath.Join(repoRoot, "ibc-solidity", "programs", "sp1-programs", "target", "elf-compilation", "*", "release", programName) - if matches, err := filepath.Glob(globPattern); err == nil { - sort.Strings(matches) - for _, match := range matches { - add(match) - } - } - - return candidates -} - // SolanaToCosmosModuleConfig represents the configuration for solana_to_cosmos module type SolanaToCosmosModuleConfig struct { SolanaChainId string `json:"solana_chain_id"` diff --git a/e2e/interchaintestv8/types/besu_fixtures.go b/e2e/interchaintestv8/types/besu_fixtures.go index 37de22383..60f99caf0 100644 --- a/e2e/interchaintestv8/types/besu_fixtures.go +++ b/e2e/interchaintestv8/types/besu_fixtures.go @@ -155,12 +155,10 @@ func generateQBFTFixture(ctx context.Context, params GenerateQBFTFixtureParams) return besuFixture{}, err } - trustedProof, trustedProofRLP, err := fetchAccountProof(ctx, params.SourceChain, params.RouterAddress, params.InitialTrustedHeight) + trustedProof, _, err := fetchAccountProof(ctx, params.SourceChain, params.RouterAddress, params.InitialTrustedHeight) if err != nil { return besuFixture{}, err } - _ = trustedProofRLP - update11, err := buildLiveUpdateFixture(ctx, params.SourceChain, params.RouterAddress, params.InitialTrustedHeight, params.UpdateHeight11) if err != nil { return besuFixture{}, err diff --git a/ibc-solidity/contracts/light-clients/besu/BesuLightClientBase.sol b/ibc-solidity/contracts/light-clients/besu/BesuLightClientBase.sol index a88789b9b..2d2a164eb 100644 --- a/ibc-solidity/contracts/light-clients/besu/BesuLightClientBase.sol +++ b/ibc-solidity/contracts/light-clients/besu/BesuLightClientBase.sol @@ -22,7 +22,6 @@ abstract contract BesuLightClientBase is ILightClient, IBesuLightClientErrors, I using RLPReader for bytes; /// @notice Decoded fields from a submitted Besu header. - /// @param headerRlp Original RLP-encoded header. /// @param headerItems Top-level RLP header fields. /// @param extraDataItems Decoded Besu BFT `extraData` fields. /// @param height Header block number. @@ -31,7 +30,6 @@ abstract contract BesuLightClientBase is ILightClient, IBesuLightClientErrors, I /// @param validators Validator set from `extraData`. /// @param commitSeals Commit seals from `extraData`. struct ParsedHeader { - bytes headerRlp; RLPReader.RLPItem[] headerItems; RLPReader.RLPItem[] extraDataItems; uint64 height; @@ -238,7 +236,6 @@ abstract contract BesuLightClientBase is ILightClient, IBesuLightClientErrors, I /// @param headerRlp RLP-encoded Besu block header. /// @return header The parsed header fields used by update and proof verification. function _parseHeader(bytes memory headerRlp) internal pure returns (ParsedHeader memory header) { - header.headerRlp = headerRlp; header.headerItems = headerRlp.toRlpItem().toList(); if (header.headerItems.length < 15) { revert InvalidHeaderFormat(header.headerItems.length); diff --git a/ibc-solidity/contracts/utils/SolanaIFTSendCallConstructor.sol b/ibc-solidity/contracts/utils/SolanaIFTSendCallConstructor.sol index 5cca672a0..d1c452e22 100644 --- a/ibc-solidity/contracts/utils/SolanaIFTSendCallConstructor.sol +++ b/ibc-solidity/contracts/utils/SolanaIFTSendCallConstructor.sol @@ -4,6 +4,7 @@ pragma solidity ^0.8.28; import { IIFTSendCallConstructor } from "../interfaces/IIFTSendCallConstructor.sol"; import { ISolanaGMPMsgs } from "../msgs/ISolanaGMPMsgs.sol"; +import { Bytes } from "@openzeppelin-contracts/utils/Bytes.sol"; import { SafeCast } from "@openzeppelin-contracts/utils/math/SafeCast.sol"; import { Strings } from "@openzeppelin-contracts/utils/Strings.sol"; import { ERC165 } from "@openzeppelin-contracts/utils/introspection/ERC165.sol"; @@ -163,15 +164,6 @@ contract SolanaIFTSendCallConstructor is IIFTSendCallConstructor, ERC165 { function _buildInstructionData(bytes32 wallet, uint256 amount) private pure returns (bytes memory) { uint64 amountU64 = SafeCast.toUint64(amount); // Convert to little-endian for Borsh encoding expected by Solana - return abi.encodePacked(IFT_MINT_DISCRIMINATOR, wallet, _reverseBytes8(bytes8(amountU64))); - } - - /// @notice Reverse an 8-byte word. - /// @param input The big-endian bytes. - /// @return output The little-endian bytes. - function _reverseBytes8(bytes8 input) private pure returns (bytes8 output) { - for (uint256 i = 0; i < 8; ++i) { - output |= (input >> (i * 8) & bytes8(uint64(0xff))) << ((7 - i) * 8); - } + return abi.encodePacked(IFT_MINT_DISCRIMINATOR, wallet, Bytes.reverseBytes8(bytes8(amountU64))); } } diff --git a/packages/proof-api/modules/besu-to-besu/Cargo.toml b/packages/proof-api/modules/besu-to-besu/Cargo.toml index 4bc1b0bfd..e609f4583 100644 --- a/packages/proof-api/modules/besu-to-besu/Cargo.toml +++ b/packages/proof-api/modules/besu-to-besu/Cargo.toml @@ -6,7 +6,7 @@ repository.workspace = true license.workspace = true [dependencies] -alloy = { workspace = true, features = ["full", "node-bindings"] } +alloy = { workspace = true, features = ["full"] } alloy-rlp = { workspace = true } anyhow = { workspace = true, features = ["std"] } ethereum-apis = { workspace = true } diff --git a/packages/proof-api/modules/evmdummy-to-evmdummy/Cargo.toml b/packages/proof-api/modules/evmdummy-to-evmdummy/Cargo.toml index d6dd7c750..2605fd682 100644 --- a/packages/proof-api/modules/evmdummy-to-evmdummy/Cargo.toml +++ b/packages/proof-api/modules/evmdummy-to-evmdummy/Cargo.toml @@ -6,7 +6,7 @@ repository.workspace = true license.workspace = true [dependencies] -alloy = { workspace = true, features = ["full", "node-bindings"] } +alloy = { workspace = true, features = ["full"] } anyhow = { workspace = true, features = ["std"] } proof-api-core = { workspace = true, default-features = false } proof-api-lib = { workspace = true, default-features = false } diff --git a/packages/proof-api/modules/evmdummy-to-evmdummy/src/lib.rs b/packages/proof-api/modules/evmdummy-to-evmdummy/src/lib.rs index eec0a00b4..7878b2b8c 100644 --- a/packages/proof-api/modules/evmdummy-to-evmdummy/src/lib.rs +++ b/packages/proof-api/modules/evmdummy-to-evmdummy/src/lib.rs @@ -19,6 +19,7 @@ use proof_api_core::{ }; use proof_api_lib::{ listener::{eth_eureka, ChainListenerService}, + service_utils::{parse_eth_tx_hashes, to_tonic_status}, utils::RelayEventsParams, }; use tonic::{Request, Response}; @@ -71,20 +72,6 @@ impl EvmDummyToEvmDummyProofApiModuleService { } } -fn to_tonic_status(e: anyhow::Error) -> tonic::Status { - tonic::Status::from_error(e.into()) -} - -#[allow(clippy::result_large_err)] -fn parse_eth_tx_hashes(tx_ids: Vec>) -> Result, tonic::Status> { - tx_ids - .into_iter() - .map(TryInto::<[u8; 32]>::try_into) - .map(|tx_hash| tx_hash.map(TxHash::from)) - .collect::, _>>() - .map_err(|tx| tonic::Status::from_error(format!("invalid tx hash: {tx:?}").into())) -} - #[tonic::async_trait] impl ProofApiService for EvmDummyToEvmDummyProofApiModuleService { async fn info( @@ -141,8 +128,14 @@ impl ProofApiService for EvmDummyToEvmDummyProofApiModuleService { request: Request, ) -> Result, tonic::Status> { let inner = request.into_inner(); - let src_txs = parse_eth_tx_hashes(inner.source_tx_ids)?; - let timeout_txs = parse_eth_tx_hashes(inner.timeout_tx_ids)?; + let src_txs = parse_eth_tx_hashes(inner.source_tx_ids)? + .into_iter() + .map(TxHash::from) + .collect(); + let timeout_txs = parse_eth_tx_hashes(inner.timeout_tx_ids)? + .into_iter() + .map(TxHash::from) + .collect(); let src_events = self .src_listener .fetch_tx_events(src_txs) From 1eb1e7d8e625228bf14f8dece115a72e7b242903 Mon Sep 17 00:00:00 2001 From: Gjermund Garaba Date: Fri, 21 Aug 2026 17:31:42 +0200 Subject: [PATCH 07/22] Simplify Besu e2e infrastructure Signed-off-by: Gjermund Garaba --- e2e/interchaintestv8/README.md | 2 + e2e/interchaintestv8/besu_to_besu_test.go | 105 +----- e2e/interchaintestv8/chainconfig/besu_qbft.go | 128 ++++---- e2e/interchaintestv8/e2esuite/config.go | 2 +- e2e/interchaintestv8/e2esuite/config_test.go | 10 + e2e/interchaintestv8/go.mod | 96 +----- e2e/interchaintestv8/go.sum | 298 ------------------ e2e/interchaintestv8/types/besu_fixtures.go | 44 +-- .../types/besu_fixtures_test.go | 40 +++ 9 files changed, 123 insertions(+), 602 deletions(-) create mode 100644 e2e/interchaintestv8/types/besu_fixtures_test.go diff --git a/e2e/interchaintestv8/README.md b/e2e/interchaintestv8/README.md index 0d229b70a..bc188ee49 100644 --- a/e2e/interchaintestv8/README.md +++ b/e2e/interchaintestv8/README.md @@ -8,6 +8,8 @@ These end to end tests are designed to run in the CI, but you can also run them ### Prerequisites +Besu tests additionally require Docker Compose v2 (`docker compose`). + In the repo root: ``` diff --git a/e2e/interchaintestv8/besu_to_besu_test.go b/e2e/interchaintestv8/besu_to_besu_test.go index 150dc6e99..ed34ff939 100644 --- a/e2e/interchaintestv8/besu_to_besu_test.go +++ b/e2e/interchaintestv8/besu_to_besu_test.go @@ -21,10 +21,6 @@ import ( ethtypes "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/crypto" - sdkmath "cosmossdk.io/math" - - "github.com/cosmos/interchaintest/v11/testutil" - "github.com/cosmos/solidity-ibc-eureka/packages/go-abigen/ibcerc20" "github.com/cosmos/solidity-ibc-eureka/packages/go-abigen/ics20transfer" "github.com/cosmos/solidity-ibc-eureka/packages/go-abigen/ics26router" @@ -47,9 +43,6 @@ const ( besuToBesuClientOnB = "besu-chain-a" besuToBesuConsensusTypeQBFT = "qbft" - - besuToBesuForgeDeployAttempts = 3 - besuToBesuDeployStableBlocks = 3 ) var ( @@ -321,7 +314,7 @@ func (s *BesuToBesuTestSuite) createUsers(chain *besuToBesuChainState) { func (s *BesuToBesuTestSuite) deployContracts(chain *besuToBesuChainState) { os.Setenv(testvalues.EnvKeyEthRPC, chain.eth.RPC) - stdout, err := s.runBesuForgeDeploy(chain) + stdout, err := chain.eth.ForgeScript(chain.deployer, testvalues.E2EDeployScriptPath) s.Require().NoError(err) chain.contractAddresses, err = ethereum.GetEthContractsFromDeployOutput(string(stdout)) @@ -335,102 +328,6 @@ func (s *BesuToBesuTestSuite) deployContracts(chain *besuToBesuChainState) { s.Require().NoError(err) } -func (s *BesuToBesuTestSuite) runBesuForgeDeploy(chain *besuToBesuChainState) ([]byte, error) { - var ( - stdout []byte - err error - ) - - for attempt := 1; attempt <= besuToBesuForgeDeployAttempts; attempt++ { - if err := waitForBesuDeployReady(context.Background(), &chain.eth); err != nil { - return stdout, err - } - - stdout, err = chain.eth.ForgeScript(chain.deployer, testvalues.E2EDeployScriptPath) - if err == nil { - return stdout, nil - } - - if attempt == besuToBesuForgeDeployAttempts || !isRetriableBesuForgeDeployError(stdout, err) { - return stdout, err - } - - fmt.Printf("Besu forge deploy attempt %d/%d hit a transient RPC/txpool error; retrying after chain stability check: %v\n", attempt, besuToBesuForgeDeployAttempts, err) - time.Sleep(10 * time.Second) - } - - return stdout, err -} - -func waitForBesuDeployReady(ctx context.Context, ethChain *ethereum.Ethereum) error { - faucetAddress := crypto.PubkeyToAddress(ethChain.Faucet.PublicKey) - var ( - stableStartBlock uint64 - lastErr error - ) - - err := testutil.WaitForCondition(2*time.Minute, 2*time.Second, func() (bool, error) { - syncProgress, err := ethChain.RPCClient.SyncProgress(ctx) - if err != nil { - lastErr = err - stableStartBlock = 0 - return false, nil - } - if syncProgress != nil { - stableStartBlock = 0 - return false, nil - } - - blockNumber, err := ethChain.RPCClient.BlockNumber(ctx) - if err != nil || blockNumber == 0 { - lastErr = err - stableStartBlock = 0 - return false, nil - } - - if stableStartBlock == 0 { - stableStartBlock = blockNumber - return false, nil - } - if blockNumber < stableStartBlock+besuToBesuDeployStableBlocks { - return false, nil - } - - if err := ethChain.SendEth(ethChain.Faucet, faucetAddress, sdkmath.ZeroInt()); err != nil { - lastErr = err - stableStartBlock = 0 - return false, nil - } - - return true, nil - }) - if err != nil && lastErr != nil { - return fmt.Errorf("%w (last deploy readiness probe error: %v)", err, lastErr) - } - return err -} - -func isRetriableBesuForgeDeployError(stdout []byte, err error) bool { - if err == nil { - return false - } - - output := string(stdout) + "\n" + err.Error() - retriableMessages := []string{ - "Some transactions were discarded by the RPC node", - "tx is still known to the node", - "attempt to divide by zero", - "forge script timed out", - } - for _, message := range retriableMessages { - if strings.Contains(output, message) { - return true - } - } - - return false -} - func (s *BesuToBesuTestSuite) startRelayer() { config := proofapi.NewConfigBuilder(). BesuToBesu(proofapi.BesuToBesuParams{ diff --git a/e2e/interchaintestv8/chainconfig/besu_qbft.go b/e2e/interchaintestv8/chainconfig/besu_qbft.go index ad99d64e0..bb8938474 100644 --- a/e2e/interchaintestv8/chainconfig/besu_qbft.go +++ b/e2e/interchaintestv8/chainconfig/besu_qbft.go @@ -8,18 +8,16 @@ import ( "embed" "encoding/json" "fmt" - "io" "io/fs" "math/big" "os" + "os/exec" "path/filepath" "strings" "time" dockernetwork "github.com/docker/docker/api/types/network" dockerclient "github.com/moby/moby/client" - "github.com/testcontainers/testcontainers-go/modules/compose" - "github.com/testcontainers/testcontainers-go/wait" "github.com/ethereum/go-ethereum/common" ethtypes "github.com/ethereum/go-ethereum/core/types" @@ -63,8 +61,8 @@ type BesuQBFTChain struct { DockerRPC string Faucet *ecdsa.PrivateKey - stack *compose.DockerCompose - projectDir string + projectName string + projectDir string } func SpinUpBesuQBFT(ctx context.Context, params BesuQBFTParams) (chain BesuQBFTChain, err error) { @@ -73,7 +71,7 @@ func SpinUpBesuQBFT(ctx context.Context, params BesuQBFTParams) (chain BesuQBFTC return BesuQBFTChain{}, fmt.Errorf("parse besu qbft faucet key: %w", err) } - projectDir, err := os.MkdirTemp("", "besu-qbft-*") + projectDir, err := os.MkdirTemp("", besuQBFTProjectName+"-*") if err != nil { return BesuQBFTChain{}, fmt.Errorf("create besu qbft temp dir: %w", err) } @@ -82,10 +80,16 @@ func SpinUpBesuQBFT(ctx context.Context, params BesuQBFTParams) (chain BesuQBFTC Faucet: faucet, projectDir: projectDir, } - var stack *compose.DockerCompose + cleanupChain := BesuQBFTChain{projectDir: projectDir} defer func() { if err != nil { - BesuQBFTChain{stack: stack, projectDir: projectDir}.Destroy(context.Background()) + cleanupCtx := context.Background() + if cleanupChain.projectName != "" { + if logErr := cleanupChain.DumpLogs(cleanupCtx); logErr != nil { + fmt.Printf("failed to dump besu qbft logs after startup error: %v\n", logErr) + } + } + cleanupChain.Destroy(cleanupCtx) } }() @@ -101,41 +105,50 @@ func SpinUpBesuQBFT(ctx context.Context, params BesuQBFTParams) (chain BesuQBFTC return BesuQBFTChain{}, fmt.Errorf("patch besu qbft compose file: %w", err) } - stack, err = compose.NewDockerComposeWith( - compose.StackIdentifier(fmt.Sprintf("%s-%d", besuQBFTProjectName, time.Now().UnixNano())), - compose.WithStackFiles(filepath.Join(projectDir, besuQBFTComposeFile)), - ) - if err != nil { - return BesuQBFTChain{}, fmt.Errorf("create besu qbft compose stack: %w", err) - } - chain.stack = stack - - if err := stack. - WaitForService("validator1", wait.ForListeningPort("8545/tcp")). - Up(ctx, compose.Wait(true)); err != nil { - if logErr := chain.DumpLogs(context.Background()); logErr != nil { - fmt.Printf("failed to dump besu qbft logs after startup error: %v\n", logErr) - } + chain.projectName = filepath.Base(projectDir) + cleanupChain.projectName = chain.projectName + if _, err := chain.runCompose(ctx, "up", "--detach"); err != nil { return BesuQBFTChain{}, fmt.Errorf("start besu qbft compose stack: %w", err) } - validator1, err := stack.ServiceContainer(ctx, "validator1") + validator1Output, err := chain.runCompose(ctx, "ps", "-q", "validator1") if err != nil { return BesuQBFTChain{}, fmt.Errorf("get validator1 container: %w", err) } + validator1ID := strings.TrimSpace(string(validator1Output)) + if validator1ID == "" { + return BesuQBFTChain{}, fmt.Errorf("get validator1 container: docker compose returned no container ID") + } + + dockerClient, err := dockerclient.NewClientWithOpts(dockerclient.FromEnv, dockerclient.WithAPIVersionNegotiation()) + if err != nil { + return BesuQBFTChain{}, fmt.Errorf("create docker client: %w", err) + } + defer dockerClient.Close() - mappedPort, err := validator1.MappedPort(ctx, "8545/tcp") + validator1, err := dockerClient.ContainerInspect(ctx, validator1ID) if err != nil { - return BesuQBFTChain{}, fmt.Errorf("resolve validator1 rpc port: %w", err) + return BesuQBFTChain{}, fmt.Errorf("inspect validator1 container: %w", err) + } + if validator1.NetworkSettings == nil { + return BesuQBFTChain{}, fmt.Errorf("resolve validator1 rpc port: container has no network settings") + } + bindings := validator1.NetworkSettings.Ports["8545/tcp"] + if len(bindings) == 0 || bindings[0].HostPort == "" { + return BesuQBFTChain{}, fmt.Errorf("resolve validator1 rpc port: no 8545/tcp binding") } - chain.RPC = fmt.Sprintf("http://127.0.0.1:%s", mappedPort.Port()) + chain.RPC = fmt.Sprintf("http://127.0.0.1:%s", bindings[0].HostPort) if params.DockerRPCAlias != "" { chain.DockerRPC = fmt.Sprintf("http://%s:8545", params.DockerRPCAlias) } if params.InterchainNetworkID != "" { - if err := connectBesuQBFTToInterchainNetwork(ctx, params.InterchainNetworkID, validator1.GetContainerID(), params.DockerRPCAlias); err != nil { + settings := &dockernetwork.EndpointSettings{} + if params.DockerRPCAlias != "" { + settings.Aliases = []string{params.DockerRPCAlias} + } + if err := dockerClient.NetworkConnect(ctx, params.InterchainNetworkID, validator1ID, settings); err != nil { return BesuQBFTChain{}, fmt.Errorf("connect besu qbft rpc container to interchain network: %w", err) } } @@ -152,8 +165,8 @@ func SpinUpBesuQBFT(ctx context.Context, params BesuQBFTParams) (chain BesuQBFTC } func (c BesuQBFTChain) Destroy(ctx context.Context) { - if c.stack != nil { - if err := c.stack.Down(ctx, compose.RemoveOrphans(true), compose.RemoveVolumes(true)); err != nil { + if c.projectName != "" && c.projectDir != "" { + if _, err := c.runCompose(ctx, "down", "--volumes", "--remove-orphans"); err != nil { fmt.Printf("failed to tear down besu qbft stack: %v\n", err) } } @@ -166,33 +179,31 @@ func (c BesuQBFTChain) Destroy(ctx context.Context) { } func (c BesuQBFTChain) DumpLogs(ctx context.Context) error { - if c.stack == nil { + if c.projectName == "" || c.projectDir == "" { return nil } - for _, service := range besuQBFTServices { - container, err := c.stack.ServiceContainer(ctx, service) - if err != nil { - return fmt.Errorf("get %s container: %w", service, err) - } - - logs, err := container.Logs(ctx) - if err != nil { - return fmt.Errorf("get %s logs: %w", service, err) - } + args := append([]string{"logs", "--no-color"}, besuQBFTServices...) + logs, err := c.runCompose(ctx, args...) + if len(logs) > 0 { + fmt.Print(string(logs)) + } + return err +} - fmt.Printf("===== %s logs =====\n", service) - if _, err := io.Copy(os.Stdout, logs); err != nil { - _ = logs.Close() - return fmt.Errorf("copy %s logs: %w", service, err) - } - fmt.Println() - if err := logs.Close(); err != nil { - return fmt.Errorf("close %s logs: %w", service, err) - } +func (c BesuQBFTChain) runCompose(ctx context.Context, args ...string) ([]byte, error) { + composeArgs := []string{ + "compose", + "--project-name", c.projectName, + "--file", filepath.Join(c.projectDir, besuQBFTComposeFile), } + composeArgs = append(composeArgs, args...) - return nil + output, err := exec.CommandContext(ctx, "docker", composeArgs...).CombinedOutput() + if err != nil { + return output, fmt.Errorf("docker compose %s: %w: %s", strings.Join(args, " "), err, strings.TrimSpace(string(output))) + } + return output, nil } func materializeBesuQBFTAssets(dst string) error { @@ -250,21 +261,6 @@ func patchBesuQBFTCompose(path string, params BesuQBFTParams) error { return os.WriteFile(path, []byte(replacer.Replace(string(contents))), 0o644) //nolint:gosec } -func connectBesuQBFTToInterchainNetwork(ctx context.Context, interchainNetworkID, containerID, alias string) error { - dockerClient, err := dockerclient.NewClientWithOpts(dockerclient.FromEnv, dockerclient.WithAPIVersionNegotiation()) - if err != nil { - return fmt.Errorf("create docker client: %w", err) - } - defer dockerClient.Close() - - settings := &dockernetwork.EndpointSettings{} - if alias != "" { - settings.Aliases = []string{alias} - } - - return dockerClient.NetworkConnect(ctx, interchainNetworkID, containerID, settings) -} - func waitForBesuQBFTReady(ctx context.Context, rpcURL string) error { var ( stableStartBlock uint64 diff --git a/e2e/interchaintestv8/e2esuite/config.go b/e2e/interchaintestv8/e2esuite/config.go index a646e1a05..acadc0cc5 100644 --- a/e2e/interchaintestv8/e2esuite/config.go +++ b/e2e/interchaintestv8/e2esuite/config.go @@ -80,7 +80,7 @@ func (c *setupConfig) validate() error { return nil case testvalues.EthTestnetTypeBesuQBFT: switch ethLcOnCosmos { - case "", testvalues.EthLCOnCosmosTypeAttestorNative: + case testvalues.EthLCOnCosmosTypeAttestorNative: return nil case testvalues.EthLCOnCosmosTypeFullWasm: return fmt.Errorf("invalid config: ETH_TESTNET_TYPE=%s cannot use ETH_LC_ON_COSMOS=%s (Besu QBFT doesn't have beacon chain)", ethTestnetType, ethLcOnCosmos) diff --git a/e2e/interchaintestv8/e2esuite/config_test.go b/e2e/interchaintestv8/e2esuite/config_test.go index ea3482c30..cb91f1ecb 100644 --- a/e2e/interchaintestv8/e2esuite/config_test.go +++ b/e2e/interchaintestv8/e2esuite/config_test.go @@ -18,3 +18,13 @@ func TestSetupConfigRejectsBesuQBFTWithDummyLightClient(t *testing.T) { t.Fatal("expected Besu QBFT with a dummy light client to be rejected") } } + +func TestSetupConfigRejectsBesuQBFTWithoutLightClient(t *testing.T) { + cfg := setupConfig{ + ethereum: ethereumConfig{testnetType: testvalues.EthTestnetTypeBesuQBFT}, + } + + if err := cfg.validate(); err == nil { + t.Fatal("expected Besu QBFT without a light client to be rejected") + } +} diff --git a/e2e/interchaintestv8/go.mod b/e2e/interchaintestv8/go.mod index 594f966ec..0d30cf0ea 100644 --- a/e2e/interchaintestv8/go.mod +++ b/e2e/interchaintestv8/go.mod @@ -32,7 +32,6 @@ require ( github.com/moby/moby v28.5.2+incompatible github.com/rs/zerolog v1.35.1 github.com/stretchr/testify v1.12.1 - github.com/testcontainers/testcontainers-go v0.40.0 go.uber.org/zap v1.28.0 golang.org/x/sync v0.22.0 google.golang.org/genproto/googleapis/api v0.0.0-20260526163538-3dc84a4a5aaa @@ -41,98 +40,8 @@ require ( ) require ( - dario.cat/mergo v1.0.2 // indirect - github.com/Azure/go-ansiterm v0.0.0-20250102033503-faa5f7b0171c // indirect - github.com/DefangLabs/secret-detector v0.0.0-20250403165618-22662109213e // indirect - github.com/acarl005/stripansi v0.0.0-20180116102854-5a71ef0e047d // indirect - github.com/apparentlymart/go-textseg/v15 v15.0.0 // indirect - github.com/buger/goterm v1.0.4 // indirect - github.com/compose-spec/compose-go/v2 v2.9.0 // indirect - github.com/containerd/console v1.0.5 // indirect - github.com/containerd/containerd/api v1.9.0 // indirect - github.com/containerd/containerd/v2 v2.1.4 // indirect - github.com/containerd/continuity v0.4.5 // indirect - github.com/containerd/log v0.1.0 // indirect - github.com/containerd/platforms v1.0.0-rc.1 // indirect - github.com/containerd/ttrpc v1.2.7 // indirect - github.com/containerd/typeurl/v2 v2.2.3 // indirect - github.com/cpuguy83/dockercfg v0.3.2 // indirect - github.com/docker/buildx v0.29.1 // indirect - github.com/docker/cli v28.5.1+incompatible // indirect - github.com/docker/cli-docs-tool v0.10.0 // indirect - github.com/docker/compose/v2 v2.40.2 // indirect - github.com/docker/distribution v2.8.3+incompatible // indirect - github.com/docker/docker-credential-helpers v0.9.3 // indirect - github.com/docker/go v1.5.1-1.0.20160303222718-d30aec9fd63c // indirect - github.com/docker/go-metrics v0.0.1 // indirect - github.com/eiannone/keyboard v0.0.0-20220611211555-0d226195f203 // indirect - github.com/emicklei/go-restful/v3 v3.11.0 // indirect - github.com/fsnotify/fsevents v0.2.0 // indirect - github.com/fvbommel/sortorder v1.1.0 // indirect - github.com/fxamacker/cbor/v2 v2.7.0 // indirect - github.com/go-openapi/jsonpointer v0.22.5 // indirect - github.com/go-openapi/jsonreference v0.20.2 // indirect - github.com/go-openapi/swag v0.23.0 // indirect - github.com/go-openapi/swag/jsonname v0.25.5 // indirect - github.com/golang-jwt/jwt/v5 v5.3.1 // indirect - github.com/google/gnostic-models v0.6.8 // indirect - github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 // indirect - github.com/hashicorp/errwrap v1.1.0 // indirect - github.com/hashicorp/go-multierror v1.1.1 // indirect - github.com/in-toto/in-toto-golang v0.9.0 // indirect - github.com/inhies/go-bytesize v0.0.0-20220417184213-4913239db9cf // indirect - github.com/jonboulle/clockwork v0.5.0 // indirect - github.com/josharian/intern v1.0.0 // indirect - github.com/magiconair/properties v1.8.10 // indirect - github.com/mailru/easyjson v0.7.7 // indirect - github.com/mattn/go-shellwords v1.0.12 // indirect - github.com/miekg/pkcs11 v1.1.1 // indirect - github.com/mitchellh/hashstructure/v2 v2.0.2 // indirect - github.com/moby/buildkit v0.25.1 // indirect - github.com/moby/go-archive v0.1.0 // indirect - github.com/moby/locker v1.0.1 // indirect - github.com/moby/patternmatcher v0.6.0 // indirect - github.com/moby/spdystream v0.5.0 // indirect - github.com/moby/sys/atomicwriter v0.1.0 // indirect - github.com/moby/sys/capability v0.4.0 // indirect - github.com/moby/sys/mountinfo v0.7.2 // indirect - github.com/moby/sys/signal v0.7.1 // indirect - github.com/moby/sys/symlink v0.3.0 // indirect - github.com/moby/sys/user v0.4.0 // indirect - github.com/moby/sys/userns v0.1.0 // indirect - github.com/moby/term v0.5.2 // indirect - github.com/morikuni/aec v1.0.0 // indirect - github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f // indirect - github.com/pelletier/go-toml v1.9.5 // indirect - github.com/rivo/uniseg v0.4.7 // indirect - github.com/santhosh-tekuri/jsonschema/v6 v6.0.2 // indirect - github.com/secure-systems-lab/go-securesystemslib v0.6.0 // indirect - github.com/serialx/hashring v0.0.0-20200727003509-22c0c7ab6b1b // indirect - github.com/shibumi/go-pathspec v1.3.0 // indirect - github.com/skratchdot/open-golang v0.0.0-20200116055534-eef842397966 // indirect - github.com/theupdateframework/notary v0.7.0 // indirect - github.com/tilt-dev/fsnotify v1.4.8-0.20220602155310-fff9c274a375 // indirect - github.com/tonistiigi/dchapes-mode v0.0.0-20250318174251-73d941a28323 // indirect - github.com/tonistiigi/fsutil v0.0.0-20250605211040-586307ad452f // indirect - github.com/tonistiigi/go-csvvalue v0.0.0-20240814133006-030d3b2625d0 // indirect - github.com/tonistiigi/units v0.0.0-20180711220420-6950e57a87ea // indirect - github.com/tonistiigi/vt100 v0.0.0-20240514184818-90bafcd6abab // indirect - github.com/x448/float16 v0.8.4 // indirect - github.com/xhit/go-str2duration/v2 v2.1.0 // indirect - github.com/zclconf/go-cty v1.17.0 // indirect - go.opentelemetry.io/contrib/instrumentation/net/http/httptrace/otelhttptrace v0.60.0 // indirect - gopkg.in/evanphx/json-patch.v4 v4.12.0 // indirect - gopkg.in/inf.v0 v0.9.1 // indirect - gopkg.in/ini.v1 v1.67.0 // indirect - k8s.io/api v0.32.3 // indirect - k8s.io/apimachinery v0.32.3 // indirect - k8s.io/client-go v0.32.3 // indirect - k8s.io/klog/v2 v2.130.1 // indirect - k8s.io/kube-openapi v0.0.0-20241105132330-32ad38e42d3f // indirect - k8s.io/utils v0.0.0-20241104100929-3ea5e8cea738 // indirect - sigs.k8s.io/json v0.0.0-20241010143419-9aa6b5e7a4b3 // indirect - sigs.k8s.io/structured-merge-diff/v4 v4.4.2 // indirect - tags.cncf.io/container-device-interface v1.0.1 // indirect + github.com/cpuguy83/go-md2man/v2 v2.0.7 // indirect + github.com/urfave/cli/v2 v2.27.6 // indirect ) require ( @@ -437,7 +346,6 @@ require ( github.com/supranational/blst v0.3.16 // indirect github.com/syndtr/goleveldb v1.0.1-0.20220721030215-126854af5e6d // indirect github.com/tendermint/go-amino v0.16.0 // indirect - github.com/testcontainers/testcontainers-go/modules/compose v0.40.0 github.com/tidwall/btree v1.8.1 // indirect github.com/tidwall/gjson v1.18.0 // indirect github.com/tidwall/match v1.2.0 // indirect diff --git a/e2e/interchaintestv8/go.sum b/e2e/interchaintestv8/go.sum index 45b972cf2..3978b29dc 100644 --- a/e2e/interchaintestv8/go.sum +++ b/e2e/interchaintestv8/go.sum @@ -64,8 +64,6 @@ cosmossdk.io/math v1.5.3 h1:WH6tu6Z3AUCeHbeOSHg2mt9rnoiUWVWaQ2t6Gkll96U= cosmossdk.io/math v1.5.3/go.mod h1:uqcZv7vexnhMFJF+6zh9EWdm/+Ylyln34IvPnBauPCQ= cosmossdk.io/schema v1.1.0 h1:mmpuz3dzouCoyjjcMcA/xHBEmMChN+EHh8EHxHRHhzE= cosmossdk.io/schema v1.1.0/go.mod h1:Gb7pqO+tpR+jLW5qDcNOSv0KtppYs7881kfzakguhhI= -dario.cat/mergo v1.0.2 h1:85+piFYR1tMbRrLcDwR18y4UKJ3aH1Tbzi24VRW1TK8= -dario.cat/mergo v1.0.2/go.mod h1:E/hbnu0NxMFBjpMIE34DRGLWqDy0g5FuKDhCb31ngxA= dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= filippo.io/bigmod v0.1.1-0.20260103110540-f8a47775ebe5 h1:JA0fFr+kxpqTdxR9LOBiTWpGNchqmkcsgmdeJZRclZ0= filippo.io/bigmod v0.1.1-0.20260103110540-f8a47775ebe5/go.mod h1:OjOXDNlClLblvXdwgFFOQFJEocLhhtai8vGLy0JCZlI= @@ -78,8 +76,6 @@ github.com/99designs/go-keychain v0.0.0-20191008050251-8e49817e8af4 h1:/vQbFIOMb github.com/99designs/go-keychain v0.0.0-20191008050251-8e49817e8af4/go.mod h1:hN7oaIRCjzsZ2dE+yG5k+rsdt3qcwykqK6HVGcKwsw4= github.com/99designs/keyring v1.2.2 h1:pZd3neh/EmUzWONb35LxQfvuY7kiSXAq3HQd97+XBn0= github.com/99designs/keyring v1.2.2/go.mod h1:wes/FrByc8j7lFOAGLGSNEg8f/PaI3cgTBqhFkHUrPk= -github.com/AdaLogics/go-fuzz-headers v0.0.0-20240806141605-e8a1dd7889d6 h1:He8afgbRMd7mFxO99hRNu+6tazq8nFF9lIwo9JFroBk= -github.com/AdaLogics/go-fuzz-headers v0.0.0-20240806141605-e8a1dd7889d6/go.mod h1:8o94RPi1/7XTJvwPpRSzSUedZrtlirdB3r9Z20bi2f8= github.com/AlekSi/pointer v1.1.0 h1:SSDMPcXD9jSl8FPy9cRzoRaMJtm9g9ggGTxecRUbQoI= github.com/AlekSi/pointer v1.1.0/go.mod h1:y7BvfRI3wXPWKXEBhU71nbnIEEZX0QTSB2Bj48UJIZE= github.com/Azure/go-ansiterm v0.0.0-20250102033503-faa5f7b0171c h1:udKWzYgxTojEKWjV8V+WSxDXJ4NFATAsZjh8iIbsQIg= @@ -94,8 +90,6 @@ github.com/DataDog/datadog-go v4.8.3+incompatible h1:fNGaYSuObuQb5nzeTQqowRAd9bp github.com/DataDog/datadog-go v4.8.3+incompatible/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ= github.com/DataDog/zstd v1.5.7 h1:ybO8RBeh29qrxIhCA9E8gKY6xfONU9T6G6aP9DTKfLE= github.com/DataDog/zstd v1.5.7/go.mod h1:g4AWEaM3yOg3HYfnJ3YIawPnVdXJh9QME85blwSAmyw= -github.com/DefangLabs/secret-detector v0.0.0-20250403165618-22662109213e h1:rd4bOvKmDIx0WeTv9Qz+hghsgyjikFiPrseXHlKepO0= -github.com/DefangLabs/secret-detector v0.0.0-20250403165618-22662109213e/go.mod h1:blbwPQh4DTlCZEfk1BLU4oMIhLda2U+A840Uag9DsZw= github.com/GeertJohan/go.incremental v1.0.0/go.mod h1:6fAjUhbVuX1KcMD3c8TEgVUqmo4seqhv0i0kdATSkM0= github.com/GeertJohan/go.rice v1.0.0/go.mod h1:eH6gbSOAUv07dQuZVnBmoDP8mgsM1rtixis4Tib9if0= github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.33.0 h1:l7+6kwRMJNwdCvYdDl7Eax+wzEYHSnNY7zrrfbhDdTA= @@ -111,8 +105,6 @@ github.com/Masterminds/semver/v3 v3.5.0 h1:kQceYJfbupGfZOKZQg0kou0DgAKhzDg2NZPAw github.com/Masterminds/semver/v3 v3.5.0/go.mod h1:4V+yj/TJE1HU9XfppCwVMZq3I84lprf4nC11bSS5beM= github.com/Microsoft/go-winio v0.6.2 h1:F2VQgta7ecxGYO8k3ZZz3RS8fVIXVxONVUPlNERoyfY= github.com/Microsoft/go-winio v0.6.2/go.mod h1:yd8OoFMLzJbo9gZq8j5qaps8bJ9aShtEA8Ipt1oGCvU= -github.com/Microsoft/hcsshim v0.13.0 h1:/BcXOiS6Qi7N9XqUcv27vkIuVOkBEcWstd2pMlWSeaA= -github.com/Microsoft/hcsshim v0.13.0/go.mod h1:9KWJ/8DgU+QzYGupX4tzMhRQE8h6w90lH6HAaclpEok= github.com/Nvveen/Gotty v0.0.0-20120604004816-cd527374f1e5 h1:TngWCqHvy9oXAN6lEVMRuU21PR1EtLVZJmdB18Gu3Rw= github.com/Nvveen/Gotty v0.0.0-20120604004816-cd527374f1e5/go.mod h1:lmUJ/7eu/Q8D7ML55dXQrVaamCz2vxCfdQBasLZfHKk= github.com/OffchainLabs/prysm/v6 v6.1.4 h1:gwLBbGaYsEh9zpZL337uVjXPX3F86UNJ7KIiFiPsY7c= @@ -122,16 +114,12 @@ github.com/RoaringBitmap/roaring/v2 v2.24.0 h1:zQkkBZtG3WRP4j+P3A5DO221SvL1Br88T github.com/RoaringBitmap/roaring/v2 v2.24.0/go.mod h1:SfT3of9nYh3vis1dIbCj4Yw6KQGujTN+f345nrN/0JA= github.com/STARRY-S/zip v0.2.3 h1:luE4dMvRPDOWQdeDdUxUoZkzUIpTccdKdhHHsQJ1fm4= github.com/STARRY-S/zip v0.2.3/go.mod h1:lqJ9JdeRipyOQJrYSOtpNAiaesFO6zVDsE8GIGFaoSk= -github.com/Shopify/logrus-bugsnag v0.0.0-20170309145241-6dbc35f2c30d h1:hi6J4K6DKrR4/ljxn6SF6nURyu785wKMuQcjt7H3VCQ= -github.com/Shopify/logrus-bugsnag v0.0.0-20170309145241-6dbc35f2c30d/go.mod h1:HI8ITrYtUY+O+ZhtlqUnD8+KwNPOyugEhfP9fdUIaEQ= github.com/Shopify/sarama v1.19.0/go.mod h1:FVkBWblsNy7DGZRfXLU0O9RCGt5g3g3yEuWXgklEdEo= github.com/Shopify/toxiproxy v2.1.4+incompatible/go.mod h1:OXgGpZ6Cli1/URJOF1DMxUHB2q5Ap20/P/eIdh4G0pI= github.com/VictoriaMetrics/fastcache v1.12.2 h1:N0y9ASrJ0F6h0QaC3o6uJb3NIZ9VKLjCM7NQbSmF7WI= github.com/VictoriaMetrics/fastcache v1.12.2/go.mod h1:AmC+Nzz1+3G2eCPapF6UcsnkThDcMsQicp4xDukwJYI= github.com/VividCortex/gohistogram v1.0.0 h1:6+hBz+qvs0JOrrNhhmR7lFxo5sINxBCGXrdtl/UvroE= github.com/VividCortex/gohistogram v1.0.0/go.mod h1:Pf5mBqqDxYaXu3hDrrU+w6nw50o/4+TcAqDqk/vUH7g= -github.com/acarl005/stripansi v0.0.0-20180116102854-5a71ef0e047d h1:licZJFw2RwpHMqeKTCYkitsPqHNxTmd4SNR5r94FGM8= -github.com/acarl005/stripansi v0.0.0-20180116102854-5a71ef0e047d/go.mod h1:asat636LX7Bqt5lYEZ27JNDcqxfjdBQuJ/MM4CN/Lzo= github.com/adlio/schema v1.4.0 h1:dekxG6P0my/bPvlyWzMULelR2Xej8RGErlnJcoY5ddw= github.com/adlio/schema v1.4.0/go.mod h1:3/ojUldWBCWp4e+6VN9ets6unG5WdqbjF7vyzM0zTVQ= github.com/adrg/xdg v0.5.3 h1:xRnxJXne7+oWDatRhR1JLnvuccuIeCoBu2rtuLqQB78= @@ -143,8 +131,6 @@ github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuy github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho= -github.com/anchore/go-struct-converter v0.0.0-20221118182256-c68fdcfa2092 h1:aM1rlcoLz8y5B2r4tTLMiVTrMtpfY0O8EScKJxaSaEc= -github.com/anchore/go-struct-converter v0.0.0-20221118182256-c68fdcfa2092/go.mod h1:rYqSE9HbjzpHTI74vwPvae4ZVYZd1lue2ta6xHPdblA= github.com/andres-erbsen/clock v0.0.0-20160526145045-9e14626cd129 h1:MzBOUgng9orim59UnfUTLRjMpd09C5uEVQ6RPGeCaVI= github.com/andres-erbsen/clock v0.0.0-20160526145045-9e14626cd129/go.mod h1:rFgpPQZYZ8vdbc+48xibu8ALc3yeyd64IhHS+PU6Yyg= github.com/andybalholm/brotli v1.2.0 h1:ukwgCxwYrmACq68yiUqwIWnGY0cTPox/M94sVwToPjQ= @@ -152,13 +138,9 @@ github.com/andybalholm/brotli v1.2.0/go.mod h1:rzTDkvFWvIrjDXZHkuS16NPggd91W3kUS github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= github.com/apache/thrift v0.12.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ= github.com/apache/thrift v0.13.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ= -github.com/apparentlymart/go-textseg/v15 v15.0.0 h1:uYvfpb3DyLSCGWnctWKGj857c6ew1u1fNQOlOtuGxQY= -github.com/apparentlymart/go-textseg/v15 v15.0.0/go.mod h1:K8XmNZdhEBkdlyDdvbmmsvpAG721bKi0joRfFdHIWJ4= github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o= github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY= github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= -github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5 h1:0CwZNZbxp69SHPdPJAN/hZIm0C4OItdklCFmMRWYpio= -github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5/go.mod h1:wHh0iHkYZB8zMSxRWpUBQtwG5a7fFgvEO+odwuTv2gs= github.com/aryann/difflib v0.0.0-20170710044230-e206f873d14a/go.mod h1:DAHtR1m6lCRdSC2Tm3DSWRPvIPr6xNKyeHdqDQSQT+A= github.com/attestantio/go-eth2-client v0.27.1 h1:g7bm+gG/p+gfzYdEuxuAepVWYb8EO+2KojV5/Lo2BxM= github.com/attestantio/go-eth2-client v0.27.1/go.mod h1:fvULSL9WtNskkOB4i+Yyr6BKpNHXvmpGZj9969fCrfY= @@ -209,7 +191,6 @@ github.com/aybabtme/rgbterm v0.0.0-20170906152045-cc83f3b3ce59/go.mod h1:q/89r3U github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= github.com/benbjohnson/clock v1.3.5 h1:VvXlSJBzZpA/zum6Sj74hxwYI2DIxRWuNIoXAzHZz5o= github.com/benbjohnson/clock v1.3.5/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= -github.com/beorn7/perks v0.0.0-20150223135152-b965b613227f/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= @@ -219,14 +200,11 @@ github.com/bgentry/go-netrc v0.0.0-20140422174119-9fd32a8b3d3d/go.mod h1:6QX/PXZ github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= github.com/bgentry/speakeasy v0.2.0 h1:tgObeVOf8WAvtuAX6DhJ4xks4CFNwPDZiqzGqIHE51E= github.com/bgentry/speakeasy v0.2.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= -github.com/bitly/go-hostpool v0.1.0/go.mod h1:4gOCgp6+NZnVqlKyZ/iBZFTAJKembaVENUpMkpg42fw= -github.com/bitly/go-simplejson v0.5.0/go.mod h1:cXHtHw4XUPsvGaxgjIAn8PhEWG9NfngEKAMDJEczWVA= github.com/bits-and-blooms/bitset v1.24.5 h1:654xBVHc23gJMAgOTkPNoCVfiRxuIOAUnAZFtopqJ4w= github.com/bits-and-blooms/bitset v1.24.5/go.mod h1:7hO7Gc7Pp1vODcmWvKMRA9BNmbv6a/7QIWpPxHddWR8= github.com/bketelsen/crypt v0.0.3-0.20200106085610-5cbc8cc4026c/go.mod h1:MKsuJmJgSg28kpZDP6UIiPt0e0Oz0kqKNGyRaWEPv84= github.com/blendle/zapdriver v1.3.1 h1:C3dydBOWYRiOk+B8X9IVZ5IOe+7cl+tGOexN4QqHfpE= github.com/blendle/zapdriver v1.3.1/go.mod h1:mdXfREi6u5MArG4j9fewC+FGnXaBR+T4Ox4J2u4eHCc= -github.com/bmizerany/assert v0.0.0-20160611221934-b7ed37b82869/go.mod h1:Ekp36dRnpXw/yCqJaO+ZrUyxD+3VXMFFr56k5XYrpB4= github.com/bodgit/plumbing v1.3.0 h1:pf9Itz1JOQgn7vEOE7v7nlEfBykYqvUYioC61TwWCFU= github.com/bodgit/plumbing v1.3.0/go.mod h1:JOTb4XiRu5xfnmdnDJo6GmSbSbtSyufrsyZFByMtKEs= github.com/bodgit/sevenzip v1.6.1 h1:kikg2pUMYC9ljU7W9SaqHXhym5HyKm8/M/jd31fYan4= @@ -238,17 +216,9 @@ github.com/btcsuite/btcd/btcec/v2 v2.3.6/go.mod h1:m22FrOAiuxl/tht9wIqAoGHcbnCCa github.com/btcsuite/btcd/btcutil v1.2.0 h1:p3+S2g3Q+7G5NOh4Ji+2UrBOrg5Z0Q4ykzShWG1Dhgs= github.com/btcsuite/btcd/btcutil v1.2.0/go.mod h1:/Taflm113pYjUpbWKKQEfa6XOtI/+WS8awxeMZpY75k= github.com/buger/goterm v0.0.0-20200322175922-2f3e71b85129/go.mod h1:u9UyCz2eTrSGy6fbupqJ54eY5c4IC8gREQ1053dK12U= -github.com/buger/goterm v1.0.4 h1:Z9YvGmOih81P0FbVtEYTFF6YsSgxSUKEhf/f9bTMXbY= -github.com/buger/goterm v1.0.4/go.mod h1:HiFWV3xnkolgrBV3mY8m0X0Pumt4zg4QhbdOzQtB8tE= github.com/buger/jsonparser v1.1.1/go.mod h1:6RYKKt7H4d4+iWqouImQ9R2FZql3VbhNgx27UK13J/0= github.com/buger/jsonparser v1.1.2 h1:frqHqw7otoVbk5M8LlE/L7HTnIq2v9RX6EJ48i9AxJk= github.com/buger/jsonparser v1.1.2/go.mod h1:6RYKKt7H4d4+iWqouImQ9R2FZql3VbhNgx27UK13J/0= -github.com/bugsnag/bugsnag-go v1.0.5-0.20150529004307-13fd6b8acda0 h1:s7+5BfS4WFJoVF9pnB8kBk03S7pZXRdKamnV0FOl5Sc= -github.com/bugsnag/bugsnag-go v1.0.5-0.20150529004307-13fd6b8acda0/go.mod h1:2oa8nejYd4cQ/b0hMIopN0lCRxU0bueqREvZLWFrtK8= -github.com/bugsnag/osext v0.0.0-20130617224835-0dd3f918b21b h1:otBG+dV+YK+Soembjv71DPz3uX/V/6MMlSyD9JBQ6kQ= -github.com/bugsnag/osext v0.0.0-20130617224835-0dd3f918b21b/go.mod h1:obH5gd0BsqsP2LwDJ9aOkm/6J86V6lyAXCoQWGw3K50= -github.com/bugsnag/panicwrap v0.0.0-20151223152923-e2c28503fcd0 h1:nvj0OLI3YqYXer/kZD8Ri1aaunCxIEsOst1BVJswV0o= -github.com/bugsnag/panicwrap v0.0.0-20151223152923-e2c28503fcd0/go.mod h1:D/8v3kj0zr8ZAKg1AQ6crr+5VwKN5eIywRkfhyM/+dE= github.com/bytedance/gopkg v0.1.4 h1:oZnQwnX82KAIWb7033bEwtxvTqXcYMxDBaQxo5JJHWM= github.com/bytedance/gopkg v0.1.4/go.mod h1:v1zWfPm21Fb+OsyXN2VAHdL6TBb2L88anLQgdyje6R4= github.com/bytedance/sonic v1.15.1 h1:nJD5PmM0vY7J8CT6MxoqbVAAMhkSmV2HgRAUrrpLoOw= @@ -283,8 +253,6 @@ github.com/chzyer/test v1.0.0 h1:p3BQDXSxOhOG0P9z6/hGnII4LGiEPOYBhs8asl/fC04= github.com/chzyer/test v1.0.0/go.mod h1:2JlltgoNkt4TW/z9V/IzDdFaMTM2JPIi26O1pF38GC8= github.com/clbanning/x2j v0.0.0-20191024224557-825249438eec/go.mod h1:jMjuTZXRI4dUb/I5gc9Hdhagfvm9+RyrPryS/auMzxE= github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= -github.com/cloudflare/cfssl v0.0.0-20180223231731-4e2dcbde5004 h1:lkAMpLVBDaj17e85keuznYcH5rqI438v41pKcBl4ZxQ= -github.com/cloudflare/cfssl v0.0.0-20180223231731-4e2dcbde5004/go.mod h1:yMWuSON2oQp+43nFtAV/uvKQIFpSPerB57DCt9t8sSA= github.com/cloudflare/circl v1.6.3 h1:9GPOhQGF9MCYUeXyMYlqTR6a5gTrgR/fBLXvUgtVcg8= github.com/cloudflare/circl v1.6.3/go.mod h1:2eXP6Qfat4O/Yhh8BznvKnJ+uzEoTQ6jVKJRn81BiS4= github.com/cloudwego/base64x v0.1.7 h1:NppS+Fgzg5ovhn4NkUXaDT3x9jldgH5ToMCqzBSi2zI= @@ -314,47 +282,20 @@ github.com/cockroachdb/redact v1.1.8/go.mod h1:GceHHpJ0rMDpYARL5In88Alq/xMBUtVlz github.com/cockroachdb/tokenbucket v0.0.0-20250429170803-42689b6311bb h1:3bCgBvB8PbJVMX1ouCcSIxvsqKPYM7gs72o0zC76n9g= github.com/cockroachdb/tokenbucket v0.0.0-20250429170803-42689b6311bb/go.mod h1:7nc4anLGjupUW/PeY5qiNYsdNXj7zopG+eqsS7To5IQ= github.com/codahale/hdrhistogram v0.0.0-20161010025455-3a0bb77429bd/go.mod h1:sE/e/2PUdi/liOCUjSTXgM1o87ZssimdTWN964YiIeI= -github.com/codahale/rfc6979 v0.0.0-20141003034818-6a90f24967eb h1:EDmT6Q9Zs+SbUoc7Ik9EfrFqcylYqgPZ9ANSbTAntnE= -github.com/codahale/rfc6979 v0.0.0-20141003034818-6a90f24967eb/go.mod h1:ZjrT6AXHbDs86ZSdt/osfBi5qfexBrKUdONk989Wnk4= github.com/cometbft/cometbft v0.40.0 h1:0+zc7FlcnonFfMwzhyDCd5vK/fHZqz0RfRyTCxZsFPU= github.com/cometbft/cometbft v0.40.0/go.mod h1:3z+Aq3BSkwNKw+Z40yPUTxtSRIpQa0w2PyCwyaxxHeU= github.com/cometbft/cometbft-db v1.0.4 h1:cezb8yx/ZWcF124wqUtAFjAuDksS1y1yXedvtprUFxs= github.com/cometbft/cometbft-db v1.0.4/go.mod h1:M+BtHAGU2XLrpUxo3Nn1nOCcnVCiLM9yx5OuT0u5SCA= -github.com/compose-spec/compose-go/v2 v2.9.0 h1:UHSv/QHlo6QJtrT4igF1rdORgIUhDo1gWuyJUoiNNIM= -github.com/compose-spec/compose-go/v2 v2.9.0/go.mod h1:Oky9AZGTRB4E+0VbTPZTUu4Kp+oEMMuwZXZtPPVT1iE= github.com/consensys/gnark-crypto v0.19.2 h1:qrEAIXq3T4egxqiliFFoNrepkIWVEeIYwt3UL0fvS80= github.com/consensys/gnark-crypto v0.19.2/go.mod h1:rT23F0XSZqE0mUA0+pRtnL56IbPxs6gp4CeRsBk4XS0= -github.com/containerd/cgroups/v3 v3.0.5 h1:44na7Ud+VwyE7LIoJ8JTNQOa549a8543BmzaJHo6Bzo= -github.com/containerd/cgroups/v3 v3.0.5/go.mod h1:SA5DLYnXO8pTGYiAHXz94qvLQTKfVM5GEVisn4jpins= -github.com/containerd/console v1.0.5 h1:R0ymNeydRqH2DmakFNdmjR2k0t7UPuiOV/N/27/qqsc= -github.com/containerd/console v1.0.5/go.mod h1:YynlIjWYF8myEu6sdkwKIvGQq+cOckRm6So2avqoYAk= -github.com/containerd/containerd/api v1.9.0 h1:HZ/licowTRazus+wt9fM6r/9BQO7S0vD5lMcWspGIg0= -github.com/containerd/containerd/api v1.9.0/go.mod h1:GhghKFmTR3hNtyznBoQ0EMWr9ju5AqHjcZPsSpTKutI= -github.com/containerd/containerd/v2 v2.1.4 h1:/hXWjiSFd6ftrBOBGfAZ6T30LJcx1dBjdKEeI8xucKQ= -github.com/containerd/containerd/v2 v2.1.4/go.mod h1:8C5QV9djwsYDNhxfTCFjWtTBZrqjditQ4/ghHSYjnHM= github.com/containerd/continuity v0.4.5 h1:ZRoN1sXq9u7V6QoHMcVWGhOwDFqZ4B9i5H6un1Wh0x4= github.com/containerd/continuity v0.4.5/go.mod h1:/lNJvtJKUQStBzpVQ1+rasXO1LAWtUQssk28EZvJ3nE= github.com/containerd/errdefs v1.0.0 h1:tg5yIfIlQIrxYtu9ajqY42W3lpS19XqdxRQeEwYG8PI= github.com/containerd/errdefs v1.0.0/go.mod h1:+YBYIdtsnF4Iw6nWZhJcqGSg/dwvV7tyJ/kCkyJ2k+M= github.com/containerd/errdefs/pkg v0.3.0 h1:9IKJ06FvyNlexW690DXuQNx2KA2cUJXx151Xdx3ZPPE= github.com/containerd/errdefs/pkg v0.3.0/go.mod h1:NJw6s9HwNuRhnjJhM7pylWwMyAkmCQvQ4GpJHEqRLVk= -github.com/containerd/fifo v1.1.0 h1:4I2mbh5stb1u6ycIABlBw9zgtlK8viPI9QkQNRQEEmY= -github.com/containerd/fifo v1.1.0/go.mod h1:bmC4NWMbXlt2EZ0Hc7Fx7QzTFxgPID13eH0Qu+MAb2o= github.com/containerd/log v0.1.0 h1:TCJt7ioM2cr/tfR8GPbGf9/VRAX8D2B4PjzCpfX540I= github.com/containerd/log v0.1.0/go.mod h1:VRRf09a7mHDIRezVKTRCrOq78v577GXq3bSa3EhrzVo= -github.com/containerd/nydus-snapshotter v0.15.2 h1:qsHI4M+Wwrf6Jr4eBqhNx8qh+YU0dSiJ+WPmcLFWNcg= -github.com/containerd/nydus-snapshotter v0.15.2/go.mod h1:FfwH2KBkNYoisK/e+KsmNr7xTU53DmnavQHMFOcXwfM= -github.com/containerd/platforms v1.0.0-rc.1 h1:83KIq4yy1erSRgOVHNk1HYdPvzdJ5CnsWaRoJX4C41E= -github.com/containerd/platforms v1.0.0-rc.1/go.mod h1:J71L7B+aiM5SdIEqmd9wp6THLVRzJGXfNuWCZCllLA4= -github.com/containerd/plugin v1.0.0 h1:c8Kf1TNl6+e2TtMHZt+39yAPDbouRH9WAToRjex483Y= -github.com/containerd/plugin v1.0.0/go.mod h1:hQfJe5nmWfImiqT1q8Si3jLv3ynMUIBB47bQ+KexvO8= -github.com/containerd/stargz-snapshotter v0.16.3 h1:zbQMm8dRuPHEOD4OqAYGajJJUwCeUzt4j7w9Iaw58u4= -github.com/containerd/stargz-snapshotter/estargz v0.16.3 h1:7evrXtoh1mSbGj/pfRccTampEyKpjpOnS3CyiV1Ebr8= -github.com/containerd/stargz-snapshotter/estargz v0.16.3/go.mod h1:uyr4BfYfOj3G9WBVE8cOlQmXAbPN9VEQpBBeJIuOipU= -github.com/containerd/ttrpc v1.2.7 h1:qIrroQvuOL9HQ1X6KHe2ohc7p+HP/0VE6XPU7elJRqQ= -github.com/containerd/ttrpc v1.2.7/go.mod h1:YCXHsb32f+Sq5/72xHubdiJRQY9inL4a4ZQrAbN1q9o= -github.com/containerd/typeurl/v2 v2.2.3 h1:yNA/94zxWdvYACdYO8zofhrTVuQY73fFU1y++dYSw40= -github.com/containerd/typeurl/v2 v2.2.3/go.mod h1:95ljDnPfD3bAbDJRugOiShd/DlAAsxGtUBhJxIn7SCk= github.com/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk= github.com/coreos/etcd v3.3.13+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= @@ -394,8 +335,6 @@ github.com/cosmos/interchaintest/v11 v11.0.0-20260805134452-6ecd341bf76a h1:q5N5 github.com/cosmos/interchaintest/v11 v11.0.0-20260805134452-6ecd341bf76a/go.mod h1:uup1v8NWddL2cvDzdxNK4egYU0uPVmAoG93+x36/UjA= github.com/cosmos/ledger-cosmos-go v1.0.0 h1:jNKW89nPf0vR0EkjHG8Zz16h6p3zqwYEOxlHArwgYtw= github.com/cosmos/ledger-cosmos-go v1.0.0/go.mod h1:mGaw2wDOf+Z6SfRJsMGxU9DIrBa4du0MAiPlpPhLAOE= -github.com/cpuguy83/dockercfg v0.3.2 h1:DlJTyZGBDlXqUZ2Dk2Q3xHs/FtnooJJVaad2S9GKorA= -github.com/cpuguy83/dockercfg v0.3.2/go.mod h1:sugsbF4//dDlL/i+S+rtpIWp+5h0BHJHfjj5/jFyUJc= github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= github.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= github.com/cpuguy83/go-md2man/v2 v2.0.6/go.mod h1:oOW0eioCTA6cOiMLiUPZOpcVxMig6NIQQ7OS05n1F4g= @@ -409,8 +348,6 @@ github.com/crate-crypto/go-kzg-4844 v1.1.0 h1:EN/u9k2TF6OWSHrCCDBBU6GLNMq88OspHH github.com/crate-crypto/go-kzg-4844 v1.1.0/go.mod h1:JolLjpSff1tCCJKaJx4psrlEdlXuJEC996PL3tTAFks= github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7DoTY= github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= -github.com/creack/pty v1.1.24 h1:bJrF4RRfyJnbTJqzRLHzcGaZK1NeM5kTC9jGgovnR1s= -github.com/creack/pty v1.1.24/go.mod h1:08sCNb52WyoAwi2QDyzUCTgcvVFhUzewun7wtTfvcwE= github.com/cyberdelia/templates v0.0.0-20141128023046-ca7fffd4298c/go.mod h1:GyV+0YP4qX0UQ7r2MoYZ+AvYDp12OF5yg4q8rGnyNh4= github.com/daaku/go.zipexe v1.0.0/go.mod h1:z8IiR6TsVLEYKwXAoE/I+8ys/sDkgTzSL0CLnGVd57E= github.com/danieljoos/wincred v1.2.3 h1:v7dZC2x32Ut3nEfRH+vhoZGvN72+dQ/snVXo/vMFLdQ= @@ -430,7 +367,6 @@ github.com/decred/dcrd/dcrec/secp256k1/v4 v4.4.1 h1:5RVFMOWjMyRy8cARdy79nAmgYw3h github.com/decred/dcrd/dcrec/secp256k1/v4 v4.4.1/go.mod h1:ZXNYxsqcloTdSy/rNShjYzMhyjf0LaoftYK0p+A3h40= github.com/deepmap/oapi-codegen v1.8.2 h1:SegyeYGcdi0jLLrpbCMoJxnUUn8GBXHsvr4rbzjuhfU= github.com/deepmap/oapi-codegen v1.8.2/go.mod h1:YLgSKSDv/bZQB7N4ws6luhozi3cEdRktEqrX88CvjIw= -github.com/denisenkom/go-mssqldb v0.0.0-20191128021309-1d7a30a10f73/go.mod h1:xbL0rPBG9cCiLr28tMa8zpbdarY27NDyej4t/EjAShU= github.com/desertbit/timer v0.0.0-20180107155436-c41aec40b27f/go.mod h1:xH/i4TFMt8koVQZ6WFms69WAsDWr2XsYL3Hkl7jkoLE= github.com/desertbit/timer v1.0.1 h1:yRpYNn5Vaaj6QXecdLMPMJsW81JLiI1eokUft5nBmeo= github.com/desertbit/timer v1.0.1/go.mod h1:htRrYeY5V/t4iu1xCJ5XsQvp4xve8QulXXctAzxqcwE= @@ -446,35 +382,12 @@ github.com/dgryski/go-farm v0.0.0-20240924180020-3414d57e47da/go.mod h1:SqUrOPUn github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no= github.com/distribution/reference v0.6.0 h1:0IXCQ5g4/QMHHkarYzh5l+u8T3t73zM5QvfrDyIgxBk= github.com/distribution/reference v0.6.0/go.mod h1:BbU0aIcezP1/5jX/8MP0YiH4SdvB5Y4f/wlDRiLyi3E= -github.com/dlclark/regexp2 v1.11.0 h1:G/nrcoOa7ZXlpoa/91N3X7mM3r8eIlMBBJZvsz/mxKI= -github.com/dlclark/regexp2 v1.11.0/go.mod h1:DHkYz0B9wPfa6wondMfaivmHpzrQ3v9q8cnmRbL6yW8= -github.com/docker/buildx v0.29.1 h1:58hxM5Z4mnNje3G5NKfULT9xCr8ooM8XFtlfUK9bKaA= -github.com/docker/buildx v0.29.1/go.mod h1:J4EFv6oxlPiV1MjO0VyJx2u5tLM7ImDEl9zyB8d4wPI= -github.com/docker/cli v28.5.1+incompatible h1:ESutzBALAD6qyCLqbQSEf1a/U8Ybms5agw59yGVc+yY= -github.com/docker/cli v28.5.1+incompatible/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHvMKP+vjCwu2uszcLI8= -github.com/docker/cli-docs-tool v0.10.0 h1:bOD6mKynPQgojQi3s2jgcUWGp/Ebqy1SeCr9VfKQLLU= -github.com/docker/cli-docs-tool v0.10.0/go.mod h1:5EM5zPnT2E7yCLERZmrDA234Vwn09fzRHP4aX1qwp1U= -github.com/docker/compose/v2 v2.40.2 h1:h2bDBJkOuqmj93XvT2oI0ArPQonE0lGtWiILXdiXvbA= -github.com/docker/compose/v2 v2.40.2/go.mod h1:CbSJpKGw20LInVsPjglZ8z7Squ3OBQOD7Ux5nkjGfIU= -github.com/docker/distribution v2.7.1+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= -github.com/docker/distribution v2.8.3+incompatible h1:AtKxIZ36LoNK51+Z6RpzLpddBirtxJnzDrHLEKxTAYk= -github.com/docker/distribution v2.8.3+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= github.com/docker/docker v28.5.2+incompatible h1:DBX0Y0zAjZbSrm1uzOkdr1onVghKaftjlSWt4AFexzM= github.com/docker/docker v28.5.2+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= -github.com/docker/docker-credential-helpers v0.9.3 h1:gAm/VtF9wgqJMoxzT3Gj5p4AqIjCBS4wrsOh9yRqcz8= -github.com/docker/docker-credential-helpers v0.9.3/go.mod h1:x+4Gbw9aGmChi3qTLZj8Dfn0TD20M/fuWy0E5+WDeCo= -github.com/docker/go v1.5.1-1.0.20160303222718-d30aec9fd63c h1:lzqkGL9b3znc+ZUgi7FlLnqjQhcXxkNM/quxIjBVMD0= -github.com/docker/go v1.5.1-1.0.20160303222718-d30aec9fd63c/go.mod h1:CADgU4DSXK5QUlFslkQu2yW2TKzFZcXq/leZfM0UH5Q= -github.com/docker/go-connections v0.4.0/go.mod h1:Gbd7IOopHjR8Iph03tsViu4nIes5XhDvyHbTtUxmeec= github.com/docker/go-connections v0.8.1 h1:JibmG5hULs5qXSr/cp/w3Pw5fZuStt4MOHMUExb29/M= github.com/docker/go-connections v0.8.1/go.mod h1:no1qkHdjq7kLMGUXYAduOhYPSJxxvgWBh7ogVvptn3Q= -github.com/docker/go-metrics v0.0.0-20180209012529-399ea8c73916/go.mod h1:/u0gXw0Gay3ceNrsHubL3BtdOL2fHf93USgMTe0W5dI= -github.com/docker/go-metrics v0.0.1 h1:AgB/0SvBxihN0X8OR4SjsblXkbMvalQ8cjmtKQ2rQV8= -github.com/docker/go-metrics v0.0.1/go.mod h1:cG1hvH2utMXtqgqqYE9plW6lDxS3/5ayHzueweSI3Vw= github.com/docker/go-units v0.5.0 h1:69rxXcBk27SvSaaxTtLh/8llcHD8vYHT7WSdRZ/jvr4= github.com/docker/go-units v0.5.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= -github.com/docker/libtrust v0.0.0-20160708172513-aabc10ec26b7 h1:UhxFibDNY/bfvqU5CAUmr9zpesgbU6SWc8/B4mflAE4= -github.com/docker/libtrust v0.0.0-20160708172513-aabc10ec26b7/go.mod h1:cyGadeNEkKy96OOhEzfZl+yxihPEzKnqJwvfuSUqbZE= github.com/dsnet/compress v0.0.2-0.20230904184137-39efe44ab707 h1:2tV76y6Q9BB+NEBasnqvs7e49aEBFI8ejC89PSnWH+4= github.com/dsnet/compress v0.0.2-0.20230904184137-39efe44ab707/go.mod h1:qssHWj60/X5sZFNxpG4HBPDHVqxNm4DfnCKgrbZOT+s= github.com/dsnet/golib v0.0.0-20171103203638-1ea166775780/go.mod h1:Lj+Z9rebOhdfkVLjJ8T6VcRQv3SXugXy999NBtR9aFY= @@ -483,7 +396,6 @@ github.com/dunglas/httpsfv v1.1.0/go.mod h1:zID2mqw9mFsnt7YC3vYQ9/cjq30q41W+1AnD github.com/dustin/go-humanize v0.0.0-20171111073723-bb3d318650d4/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY= github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto= -github.com/dvsekhvalnov/jose2go v0.0.0-20170216131308-f21a8cedbbae/go.mod h1:7BvyPhdbLxMXIYTFPLsyJRFMsKmOZnQmzh6Gb+uquuM= github.com/dvsekhvalnov/jose2go v1.8.0 h1:LqkkVKAlHFfH9LOEl5fe4p/zL02OhWE7pCufMBG2jLA= github.com/dvsekhvalnov/jose2go v1.8.0/go.mod h1:QsHjhyTlD/lAVqn/NSbVZmSCGeDehTB/mPZadG+mhXU= github.com/eapache/go-resiliency v1.1.0/go.mod h1:kFI+JgMyC7bLPUVY133qvEBtVayf5mFgVsvEsIPBvNs= @@ -492,12 +404,8 @@ github.com/eapache/queue v1.1.0/go.mod h1:6eCeP0CKFpHLu8blIFXhExK/dRa7WDZfr6jVFP github.com/ebitengine/purego v0.10.1 h1:dewVBCBT2GaMu1SrNTYxQhgQBethzfhiwvZiLGP/qyY= github.com/ebitengine/purego v0.10.1/go.mod h1:iIjxzd6CiRiOG0UyXP+V1+jWqUXVjPKLAI0mRfJZTmQ= github.com/edsrzf/mmap-go v1.0.0/go.mod h1:YO35OhQPt3KJa3ryjFM5Bs14WD66h8eGKpfaBNrHW5M= -github.com/eiannone/keyboard v0.0.0-20220611211555-0d226195f203 h1:XBBHcIb256gUJtLmY22n99HaZTz+r2Z51xUPi01m3wg= -github.com/eiannone/keyboard v0.0.0-20220611211555-0d226195f203/go.mod h1:E1jcSv8FaEny+OP/5k9UxZVw9YFWGj7eI4KR/iOBqCg= github.com/emicklei/dot v1.11.0 h1:zsrhCuFHAJge/aZIC4N4LdHy5tqYu4tWEaUzIwdYj4Y= github.com/emicklei/dot v1.11.0/go.mod h1:DeV7GvQtIw4h2u73RKBkkFdvVAz0D9fzeJrgPW6gy/s= -github.com/emicklei/go-restful/v3 v3.11.0 h1:rAQeMHw1c7zTmncogyy8VvRZwtkmkZ4FxERmMY4rD+g= -github.com/emicklei/go-restful/v3 v3.11.0/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc= github.com/envoyproxy/go-control-plane v0.6.9/go.mod h1:SBwIajubJHhxtWwsL9s8ss4safvEdbitLhGGK48rN6g= github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= @@ -514,7 +422,6 @@ github.com/envoyproxy/go-control-plane/ratelimit v0.1.0/go.mod h1:Wk+tMFAFbCXaJP github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= github.com/envoyproxy/protoc-gen-validate v1.3.3 h1:MVQghNeW+LZcmXe7SY1V36Z+WFMDjpqGAGacLe2T0ds= github.com/envoyproxy/protoc-gen-validate v1.3.3/go.mod h1:TsndJ/ngyIdQRhMcVVGDDHINPLWB7C82oDArY51KfB0= -github.com/erikstmartin/go-testdb v0.0.0-20160219214506-8d10e4a1bae5/go.mod h1:a2zkGnVExMxdzMo3M0Hi/3sEU+cWnZpSni0O6/Yb/P0= github.com/ethereum-optimism/op-geth v1.101511.0 h1:9t+f65gmxSlKF2nUthaPRbJKcHm6zWJc5bfxj7taJyY= github.com/ethereum-optimism/op-geth v1.101511.0/go.mod h1:SkytozVEPtnUeBlquwl0Qv5JKvrN/Y5aqh+VkQo/EOI= github.com/ethereum/c-kzg-4844/v2 v2.1.6 h1:xQymkKCT5E2Jiaoqf3v4wsNgjZLY0lRSkZn27fRjSls= @@ -539,16 +446,10 @@ github.com/franela/goblin v0.0.0-20200105215937-c9ffbefa60db/go.mod h1:7dvUGVsVB github.com/franela/goreq v0.0.0-20171204163338-bcd34c9993f8/go.mod h1:ZhphrRTfi2rbfLwlschooIH4+wKKDR4Pdxhh+TRoA20= github.com/frankban/quicktest v1.14.6 h1:7Xjx+VpznH+oBnejlPUj8oUpdxnVs4f8XU8WnHkI4W8= github.com/frankban/quicktest v1.14.6/go.mod h1:4ptaffx2x8+WTWXmUCuVU6aPUX1/Mz7zb5vbUoiM6w0= -github.com/fsnotify/fsevents v0.2.0 h1:BRlvlqjvNTfogHfeBOFvSC9N0Ddy+wzQCQukyoD7o/c= -github.com/fsnotify/fsevents v0.2.0/go.mod h1:B3eEk39i4hz8y1zaWS/wPrAP4O6wkIl7HQwKBr1qH/w= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= github.com/fsnotify/fsnotify v1.9.0 h1:2Ml+OJNzbYCTzsxtv8vKSFD9PbJjmhYF14k/jKC7S9k= github.com/fsnotify/fsnotify v1.9.0/go.mod h1:8jBTzvmWwFyi3Pb8djgCCO5IBqzKJ/Jwo8TRcHyHii0= -github.com/fvbommel/sortorder v1.1.0 h1:fUmoe+HLsBTctBDoaBwpQo5N+nrCp8g/BjKb/6ZQmYw= -github.com/fvbommel/sortorder v1.1.0/go.mod h1:uk88iVf1ovNn1iLfgUVU2F9o5eO30ui720w+kxuqRs0= -github.com/fxamacker/cbor/v2 v2.7.0 h1:iM5WgngdRBanHcxugY4JySA0nk1wZorNOpTgCMedv5E= -github.com/fxamacker/cbor/v2 v2.7.0/go.mod h1:pxXPTn3joSm21Gbwsv0w9OSA2y1HFR9qXEeXQVeNoDQ= github.com/gagliardetto/anchor-go v0.3.2 h1:/nlAp3B6s4DBlNABWrQ5bA2zpsUGVDqBfwmbUUg4ChQ= github.com/gagliardetto/anchor-go v0.3.2/go.mod h1:Jf9/DBNo6GsG6RguE4ZuJz+PZtypKg3iUpB++Oc6ynQ= github.com/gagliardetto/binary v0.6.1/go.mod h1:aOfYkc20U0deHaHn/LVZXiqlkDbFAX0FpTlDhsXa0S0= @@ -603,19 +504,7 @@ github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiU github.com/go-ole/go-ole v1.3.0 h1:Dt6ye7+vXGIKZ7Xtk4s6/xVdGDQynvom7xCFEdWr6uE= github.com/go-ole/go-ole v1.3.0/go.mod h1:5LS6F96DhAwUc7C+1HLexzMXY1xGRSryjyPPKW6zv78= github.com/go-openapi/jsonpointer v0.19.5/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= -github.com/go-openapi/jsonpointer v0.19.6/go.mod h1:osyAmYz/mB/C3I+WsTTSgw1ONzaLJoLCyoi6/zppojs= -github.com/go-openapi/jsonpointer v0.22.5 h1:8on/0Yp4uTb9f4XvTrM2+1CPrV05QPZXu+rvu2o9jcA= -github.com/go-openapi/jsonpointer v0.22.5/go.mod h1:gyUR3sCvGSWchA2sUBJGluYMbe1zazrYWIkWPjjMUY0= -github.com/go-openapi/jsonreference v0.20.2 h1:3sVjiK66+uXK/6oQ8xgcRKcFgQ5KXa2KvnJRumpMGbE= -github.com/go-openapi/jsonreference v0.20.2/go.mod h1:Bl1zwGIM8/wsvqjsOQLJ/SH+En5Ap4rVB5KVcIDZG2k= github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= -github.com/go-openapi/swag v0.22.3/go.mod h1:UzaqsxGiab7freDnrUUra0MwWfN/q7tE4j+VcZ0yl14= -github.com/go-openapi/swag v0.23.0 h1:vsEVJDUo2hPJ2tu0/Xc+4noaxyEffXNIs3cOULZ+GrE= -github.com/go-openapi/swag v0.23.0/go.mod h1:esZ8ITTYEsH1V2trKHjAN8Ai7xHb8RV+YSZ577vPjgQ= -github.com/go-openapi/swag/jsonname v0.25.5 h1:8p150i44rv/Drip4vWI3kGi9+4W9TdI3US3uUYSFhSo= -github.com/go-openapi/swag/jsonname v0.25.5/go.mod h1:jNqqikyiAK56uS7n8sLkdaNY/uq6+D2m2LANat09pKU= -github.com/go-openapi/testify/v2 v2.4.0 h1:8nsPrHVCWkQ4p8h1EsRVymA2XABB4OT40gcvAu+voFM= -github.com/go-openapi/testify/v2 v2.4.0/go.mod h1:HCPmvFFnheKK2BuwSA0TbbdxJ3I16pjwMkYkP4Ywn54= github.com/go-playground/assert/v2 v2.0.1/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4= github.com/go-playground/locales v0.13.0 h1:HyWk6mgj5qFqCT5fjGBuRArbVDfE4hi8+e8ceBS/t7Q= github.com/go-playground/locales v0.13.0/go.mod h1:taPMhCMXrRLJO55olJkUXHZBHCxTMfnGwq/HNwmWNS8= @@ -624,12 +513,8 @@ github.com/go-playground/universal-translator v0.17.0/go.mod h1:UkSxE5sNxxRwHyU+ github.com/go-playground/validator/v10 v10.2.0/go.mod h1:uOYAAleCW8F/7oMFd6aG0GOhaH6EGOAJShg8Id5JGkI= github.com/go-playground/validator/v10 v10.4.1 h1:pH2c5ADXtd66mxoE0Zm9SUhxE20r7aM3F26W0hOn+GE= github.com/go-playground/validator/v10 v10.4.1/go.mod h1:nlOn6nFhuKACm19sB/8EGNn9GlaMV7XkbRSipzJ0Ii4= -github.com/go-sql-driver/mysql v1.3.0/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w= -github.com/go-sql-driver/mysql v1.4.0 h1:7LxgVwFb2hIQtMm87NdgAVfXjnt4OePseqT1tKx+opk= github.com/go-sql-driver/mysql v1.4.0/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w= github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= -github.com/go-task/slim-sprig/v3 v3.0.0 h1:sUs3vkvUymDpBKi3qH1YSqBQk9+9D/8M2mN1vB6EwHI= -github.com/go-task/slim-sprig/v3 v3.0.0/go.mod h1:W848ghGpv3Qj3dhTPRyJypKRiqCdHZiAzKg9hl15HA8= github.com/go-viper/mapstructure/v2 v2.5.0 h1:vM5IJoUAy3d7zRSVtIwQgBj7BiWtMPfmPEgAXnvj1Ro= github.com/go-viper/mapstructure/v2 v2.5.0/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= github.com/go-yaml/yaml v2.1.0+incompatible h1:RYi2hDdss1u4YE7GwixGzWwVo47T8UQwnTLB6vQiq+o= @@ -649,17 +534,12 @@ github.com/gogo/googleapis v1.4.1 h1:1Yx4Myt7BxzvUr5ldGSbwYiZG6t9wGBZ+8/fX3Wvtq0 github.com/gogo/googleapis v1.4.1/go.mod h1:2lpHqI5OcWCtVElxXnPt+s8oJvMpySlOyM6xDCrzib4= github.com/golang-jwt/jwt/v4 v4.5.1 h1:JdqV9zKUdtaa9gdPlywC3aeoEsR681PlKC+4F5gQgeo= github.com/golang-jwt/jwt/v4 v4.5.1/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0= -github.com/golang-jwt/jwt/v5 v5.3.1 h1:kYf81DTWFe7t+1VvL7eS+jKFVWaUnK9cB1qbwn63YCY= -github.com/golang-jwt/jwt/v5 v5.3.1/go.mod h1:fxCRLWMO43lRc8nhHWY6LGqRcf+1gQWArsqaEUEa5bE= -github.com/golang-sql/civil v0.0.0-20190719163853-cb61b32ac6fe/go.mod h1:8vg3r2VgvsThLBIFL93Qb5yWzgyZWhEmBwUJWevAkK0= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= github.com/golang/groupcache v0.0.0-20160516000752-02826c3e7903/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20241129210726-2c02b8208cf8 h1:f+oWsMOmNPc8JmEHVZIycC7hBoQxHH9pNKQORJNozsQ= -github.com/golang/groupcache v0.0.0-20241129210726-2c02b8208cf8/go.mod h1:wcDNUvekVysuuOpQKo3191zZyTpiI6se1N1ULghS0sw= github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y= @@ -672,7 +552,6 @@ github.com/golang/protobuf v1.3.0/go.mod h1:Qd/q+1AKNOZr9uGQzbzCmRO6sUih6GTPZv6a github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= -github.com/golang/protobuf v1.3.4/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= github.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgjlRvqsdk= github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= @@ -695,12 +574,8 @@ github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Z github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/btree v1.1.3 h1:CVpQJjYgC4VbzxeGVHfvZrv1ctoYCAI8vbl07Fcxlyg= github.com/google/btree v1.1.3/go.mod h1:qOPhT0dTNdNzV6Z/lhRX0YXUafgPLFUh+gZMl761Gm4= -github.com/google/certificate-transparency-go v1.0.10-0.20180222191210-5ab67e519c93 h1:jc2UWq7CbdszqeH6qu1ougXMIUBfSy8Pbh/anURYbGI= -github.com/google/certificate-transparency-go v1.0.10-0.20180222191210-5ab67e519c93/go.mod h1:QeJfpSbVSfYc7RgB3gJFj9cbuQMMchQxrWXz8Ruopmg= github.com/google/flatbuffers v25.2.10+incompatible h1:F3vclr7C3HpB1k9mxCGRMXq6FdUalZ6H/pNX4FP1v0Q= github.com/google/flatbuffers v25.2.10+incompatible/go.mod h1:1AeVuKshWv4vARoZatz6mlQ0JxURH0Kv5+zNeJKJCa8= -github.com/google/gnostic-models v0.6.8 h1:yo/ABAfM5IMRsS1VnXjTBvUb61tFIHozhlYvRgGre9I= -github.com/google/gnostic-models v0.6.8/go.mod h1:5n7qKqH0f5wFt+aWF8CW6pZLLNOfYuF5OpfBSENuI8U= github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= @@ -709,7 +584,6 @@ github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/ github.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8= github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU= github.com/google/gofuzz v0.0.0-20170612174753-24818f796faf/go.mod h1:HP5RmnzzSNb993RKQDq4+1A4ia9nllfqcQFTQJedwGI= @@ -732,8 +606,6 @@ github.com/google/pprof v0.0.0-20250403155104-27863c87afa6/go.mod h1:boTsfXsheKC github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= github.com/google/s2a-go v0.1.9 h1:LGD7gtMgezd8a/Xak7mEWL0PjoTQFvpRudN895yqKW0= github.com/google/s2a-go v0.1.9/go.mod h1:YA0Ei2ZQL3acow2O62kdp9UlnvMmU7kA6Eutn0dXayM= -github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 h1:El6M4kTTCOh6aBiKaUGG7oYTSPP8MxqL4YI3kZKwcP4= -github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510/go.mod h1:pupxD2MaaD3pAXIBCelhxNneeOaAeabZDe5s4K6zSpQ= github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= @@ -749,7 +621,6 @@ github.com/gorilla/context v1.1.1/go.mod h1:kBGZzfjB9CEq2AlWe17Uuf7NDRt0dE0s8S51 github.com/gorilla/handlers v1.5.2 h1:cLTUSsNkgcwhgRqvCNmdbRWG0A3N4F+M2nWKdScwyEE= github.com/gorilla/handlers v1.5.2/go.mod h1:dX+xVpaxdSw+q0Qek8SSsl3dfMk3jNddUkMzo0GtH0w= github.com/gorilla/mux v1.6.2/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= -github.com/gorilla/mux v1.7.0/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= github.com/gorilla/mux v1.7.3/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= github.com/gorilla/mux v1.8.0/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So= github.com/gorilla/mux v1.8.1 h1:TuBL49tXwgrFYWhqrNgrUNEY92u81SPhu7sTdzQEiWY= @@ -777,8 +648,6 @@ github.com/grpc-ecosystem/grpc-gateway/v2 v2.29.0 h1:5VipnvEpbqr2gA2VbM+nYVbkIF2 github.com/grpc-ecosystem/grpc-gateway/v2 v2.29.0/go.mod h1:Hyl3n6Twe1hvtd9XUXDec4pTvgMSEixRuQKPTMH2bNs= github.com/gsterjov/go-libsecret v0.0.0-20161001094733-a6f4afe4910c h1:6rhixN/i8ZofjG1Y75iExal34USq5p+wiN1tpie8IrU= github.com/gsterjov/go-libsecret v0.0.0-20161001094733-a6f4afe4910c/go.mod h1:NMPJylDgVpX0MLRlPy15sqSwOFv/U1GZ2m21JhFfek0= -github.com/hailocab/go-hostpool v0.0.0-20160125115350-e80d13ce29ed h1:5upAirOpQc1Q53c0bnx2ufif5kANL7bfZWcc6VJWJd8= -github.com/hailocab/go-hostpool v0.0.0-20160125115350-e80d13ce29ed/go.mod h1:tMWxXQ9wFIaZeTI9F+hmhFiGpFmhOHzyShyFUhRm0H4= github.com/hako/durafmt v0.0.0-20200710122514-c0fb7b4da026/go.mod h1:5Scbynm8dF1XAPwIwkGPqzkM/shndPm79Jd1003hTjE= github.com/hashicorp/aws-sdk-go-base/v2 v2.0.0-beta.72 h1:vTCWu1wbdYo7PEZFem/rlr01+Un+wwVmI7wiegFdRLk= github.com/hashicorp/aws-sdk-go-base/v2 v2.0.0-beta.72/go.mod h1:Vn+BBgKQHVQYdVQ4NZDICE1Brb+JfaONyDHr3q07oQc= @@ -787,8 +656,6 @@ github.com/hashicorp/consul/api v1.3.0/go.mod h1:MmDNSzIMUjNpY/mQ398R4bk2FnqQLoP github.com/hashicorp/consul/sdk v0.1.1/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8= github.com/hashicorp/consul/sdk v0.3.0/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8= github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= -github.com/hashicorp/errwrap v1.1.0 h1:OxrOeh75EUXMY8TBjag2fzXGZ40LB6IKw45YeGUDY2I= -github.com/hashicorp/errwrap v1.1.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= github.com/hashicorp/go-bexpr v0.1.10 h1:9kuI5PFotCboP3dkDYFr/wi0gg0QVbSNz5oFRpxn4uE= github.com/hashicorp/go-bexpr v0.1.10/go.mod h1:oxlubA2vC/gFVfX1A6JGp7ls7uCDlfJn732ehYYg+g0= github.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= @@ -805,8 +672,6 @@ github.com/hashicorp/go-metrics v0.6.0 h1:+kjWqHRH2HxAocneVfB/BI6EeWUUHyPhyQZozM github.com/hashicorp/go-metrics v0.6.0/go.mod h1:0B52B5pZ7+qm5Zhzs8Fygr87isvmUgr0Zv9rmJ9qsnQ= github.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM= github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk= -github.com/hashicorp/go-multierror v1.1.1 h1:H5DkEtf6CXdFp0N0Em5UCwQpXMWke8IA0+lD48awMYo= -github.com/hashicorp/go-multierror v1.1.1/go.mod h1:iw975J/qwKPdAO1clOe2L8331t/9/fmwbPZ6JB6eMoM= github.com/hashicorp/go-plugin v1.7.0 h1:YghfQH/0QmPNc/AZMTFE3ac8fipZyZECHdDPshfk+mA= github.com/hashicorp/go-plugin v1.7.0/go.mod h1:BExt6KEaIYx804z8k4gRzRLEvxKVb+kn0NMcihqOqb8= github.com/hashicorp/go-rootcerts v1.0.0/go.mod h1:K6zTfqpRlCUIjkwsN4Z+hiSfzSTQa6eBIzfwKfwNnHU= @@ -864,8 +729,6 @@ github.com/icza/dyno v0.0.0-20220812133438-f0b6f8a18845 h1:H+uM0Bv88eur3ZSsd2NGK github.com/icza/dyno v0.0.0-20220812133438-f0b6f8a18845/go.mod h1:c1tRKs5Tx7E2+uHGSyyncziFjvGpgv4H2HrqXeUQ/Uk= github.com/improbable-eng/grpc-web v0.15.0 h1:BN+7z6uNXZ1tQGcNAuaU1YjsLTApzkjt2tzCixLaUPQ= github.com/improbable-eng/grpc-web v0.15.0/go.mod h1:1sy9HKV4Jt9aEs9JSnkWlRJPuPtwNr0l57L4f878wP8= -github.com/in-toto/in-toto-golang v0.9.0 h1:tHny7ac4KgtsfrG6ybU8gVOZux2H8jN05AXJ9EBM1XU= -github.com/in-toto/in-toto-golang v0.9.0/go.mod h1:xsBVrVsHNsB61++S6Dy2vWosKhuA3lUTQd+eF9HdeMo= github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8= github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= @@ -876,8 +739,6 @@ github.com/influxdata/influxdb1-client v0.0.0-20220302092344-a9ab5670611c h1:qSH github.com/influxdata/influxdb1-client v0.0.0-20220302092344-a9ab5670611c/go.mod h1:qj24IKcXYK6Iy9ceXlo3Tc+vtHo9lIhSX5JddghvEPo= github.com/influxdata/line-protocol v0.0.0-20210311194329-9aa0e372d097 h1:vilfsDSy7TDxedi9gyBkMvAirat/oRcL0lFdJBf6tdM= github.com/influxdata/line-protocol v0.0.0-20210311194329-9aa0e372d097/go.mod h1:xaLFMmpvUxqXtVkUJfg9QmT88cDaCJ3ZKgdZ78oO8Qo= -github.com/inhies/go-bytesize v0.0.0-20220417184213-4913239db9cf h1:FtEj8sfIcaaBfAKrE1Cwb61YDtYq9JxChK1c7AKce7s= -github.com/inhies/go-bytesize v0.0.0-20220417184213-4913239db9cf/go.mod h1:yrqSXGoD/4EKfF26AOGzscPOgTTJcyAwM2rpixWT+t4= github.com/ipfs/go-cid v0.5.0 h1:goEKKhaGm0ul11IHA7I6p1GmKz8kEYniqFopaB5Otwg= github.com/ipfs/go-cid v0.5.0/go.mod h1:0L7vmeNXpQpUS9vt+yEARkJ8rOg43DF3iPgn4GIN0mk= github.com/jackpal/go-nat-pmp v1.0.2 h1:KzKSgb7qkJvOUTqYl9/Hg/me3pWgBmERKrTGD7BdWus= @@ -889,20 +750,10 @@ github.com/jhump/protoreflect v1.18.0 h1:TOz0MSR/0JOZ5kECB/0ufGnC2jdsgZ123Rd/k4Z github.com/jhump/protoreflect v1.18.0/go.mod h1:ezWcltJIVF4zYdIFM+D/sHV4Oh5LNU08ORzCGfwvTz8= github.com/jhump/protoreflect/v2 v2.0.0-beta.2 h1:qZU+rEZUOYTz1Bnhi3xbwn+VxdXkLVeEpAeZzVXLY88= github.com/jhump/protoreflect/v2 v2.0.0-beta.2/go.mod h1:4tnOYkB/mq7QTyS3YKtVtNrJv4Psqout8HA1U+hZtgM= -github.com/jinzhu/gorm v0.0.0-20170222002820-5409931a1bb8 h1:CZkYfurY6KGhVtlalI4QwQ6T0Cu6iuY3e0x5RLu96WE= -github.com/jinzhu/gorm v0.0.0-20170222002820-5409931a1bb8/go.mod h1:Vla75njaFJ8clLU1W44h34PjIkijhjHIYnZxMqCdxqo= -github.com/jinzhu/inflection v0.0.0-20170102125226-1c35d901db3d/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkryuEj+Srlc= -github.com/jinzhu/inflection v1.0.0 h1:K317FqzuhWc8YvSVlFMCCUb36O/S9MCKRDI7QkRKD/E= -github.com/jinzhu/inflection v1.0.0/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkryuEj+Srlc= -github.com/jinzhu/now v1.1.1/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8= github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= github.com/jmhodges/levigo v1.0.0 h1:q5EC36kV79HWeTBWsod3mG11EgStG3qArTKcvlksN1U= github.com/jmhodges/levigo v1.0.0/go.mod h1:Q6Qx+uH3RAqyK4rFQroq9RL7mdkABMcfhEI+nNuzMJQ= github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= -github.com/jonboulle/clockwork v0.5.0 h1:Hyh9A8u51kptdkR+cqRpT1EebBwTn1oK9YfGYbdFz6I= -github.com/jonboulle/clockwork v0.5.0/go.mod h1:3mZlmanh0g2NDKO5TWZVJAfofYk64M7XN3SzBPjZF60= -github.com/josharian/intern v1.0.0 h1:vlS4z54oSdjm0bgjRigI+G1HpF+tI+9rE5LLzOg8HmY= -github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y= github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4= github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= github.com/json-iterator/go v1.1.7/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= @@ -914,7 +765,6 @@ github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHm github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= -github.com/juju/loggo v0.0.0-20190526231331-6e530bcce5d8/go.mod h1:vgyd7OREkbtVEN/8IXZe5Ooef3LQePvuBm9UWj6ZL8U= github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM= github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= @@ -932,7 +782,6 @@ github.com/klauspost/cpuid/v2 v2.3.0/go.mod h1:hqwkgyIinND0mEev00jJYCxPNVRVXFQeu github.com/klauspost/pgzip v1.2.6 h1:8RXeL5crjEUFnR2/Sn6GJNWtSQ3Dk8pq4CL3jvdDyjU= github.com/klauspost/pgzip v1.2.6/go.mod h1:Ch1tH69qFZu15pkjo5kYi6mth2Zzwzt50oCQKQE9RUs= github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= -github.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/koron/go-ssdp v0.0.6 h1:Jb0h04599eq/CY7rB5YEqPS83HmRfHP2azkxMN2rFtU= github.com/koron/go-ssdp v0.0.6/go.mod h1:0R9LfRJGek1zWTjN3JUNlm5INCDYGpRDfAptnct63fI= @@ -965,7 +814,6 @@ github.com/leanovate/gopter v0.2.11 h1:vRjThO1EKPb/1NsDXuDrzldR28RLkBflWYcU9CvzW github.com/leanovate/gopter v0.2.11/go.mod h1:aK3tzZP/C+p1m3SPRE4SYZFGP7jjkuSI4f7Xvpt0S9c= github.com/leodido/go-urn v1.2.0 h1:hpXL4XnriNwQ/ABnpepYM/1vCLWNDfUNts8dX3xTG6Y= github.com/leodido/go-urn v1.2.0/go.mod h1:+8+nEpDfqqsY+g338gtMEUOtuK+4dEMhiQEgxpxOKII= -github.com/lib/pq v0.0.0-20150723085316-0dad96c0b94f/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= github.com/lib/pq v1.12.3 h1:tTWxr2YLKwIvK90ZXEw8GP7UFHtcbTtty8zsI+YjrfQ= github.com/lib/pq v1.12.3/go.mod h1:/p+8NSbOcwzAEI7wiMXFlgydTwcgTr3OSKMsD2BitpA= github.com/libp2p/go-buffer-pool v0.1.0 h1:oK4mSFcQz7cTQIfqbe4MIj9gLW+mnanjyFtc6cdF0Y8= @@ -995,14 +843,11 @@ github.com/logrusorgru/aurora v2.0.3+incompatible/go.mod h1:7rIyQOR62GCctdiQpZ/z github.com/lufia/plan9stats v0.0.0-20260330125221-c963978e514e h1:Q6MvJtQK/iRcRtzAscm/zF23XxJlbECiGPyRicsX+Ak= github.com/lufia/plan9stats v0.0.0-20260330125221-c963978e514e/go.mod h1:autxFIvghDt3jPTLoqZ9OZ7s9qTGNAWmYCjVFWPX/zg= github.com/lyft/protoc-gen-validate v0.0.13/go.mod h1:XbGvPuh87YZc5TdIa2/I4pLk0QoUACkjt2znoq26NVQ= -github.com/magiconair/properties v1.5.3/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= github.com/magiconair/properties v1.8.1/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= github.com/magiconair/properties v1.8.10 h1:s31yESBquKXCV9a/ScB3ESkOjUYYv+X0rg8SYxI99mE= github.com/magiconair/properties v1.8.10/go.mod h1:Dhd985XPs7jluiymwWYZ0G4Z61jb3vdS329zhj2hYo0= github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= -github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0= -github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= github.com/manifoldco/promptui v0.9.0 h1:3V4HzJk1TtXW1MTZMP7mdlwbBpIinw3HztaIlYthEiA= github.com/manifoldco/promptui v0.9.0/go.mod h1:ka04sppxSGFAtxX0qhlYQjISsg9mR4GWtQEhdbn6Pgg= github.com/marcopolo/simnet v0.0.7 h1:DpH8BMGsF9+1w13L8rvCaAhb6nYJdY+dIXncDrssvUs= @@ -1031,9 +876,6 @@ github.com/mattn/go-isatty v0.0.24/go.mod h1:nMCL3Zebbrt45jsMDgnfIwz6ydEQApk5oEI github.com/mattn/go-runewidth v0.0.2/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= github.com/mattn/go-runewidth v0.0.16 h1:E5ScNMtiwvlvB5paMFdw9p4kSQzbXFikJ5SQO6TULQc= github.com/mattn/go-runewidth v0.0.16/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= -github.com/mattn/go-shellwords v1.0.12 h1:M2zGm7EW6UQJvDeQxo4T51eKPurbeFbe8WtebGE2xrk= -github.com/mattn/go-shellwords v1.0.12/go.mod h1:EZzvwXDESEeg03EKmM+RmDnNOPKG4lLtQsUlTZDWQ8Y= -github.com/mattn/go-sqlite3 v1.6.0/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc= github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= github.com/mholt/archives v0.1.5 h1:Fh2hl1j7VEhc6DZs2DLMgiBNChUux154a1G+2esNvzQ= github.com/mholt/archives v0.1.5/go.mod h1:3TPMmBLPsgszL+1As5zECTuKwKvIfj6YcwWPpeTAXF4= @@ -1041,9 +883,6 @@ github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3N github.com/miekg/dns v1.1.35/go.mod h1:KNUDUusw/aVsxyTYZM1oqvCicbwhgbNgztCETuNZ7xM= github.com/miekg/dns v1.1.72 h1:vhmr+TF2A3tuoGNkLDFK9zi36F2LS+hKTRW0Uf8kbzI= github.com/miekg/dns v1.1.72/go.mod h1:+EuEPhdHOsfk6Wk5TT2CzssZdqkmFhf8r+aVyDEToIs= -github.com/miekg/pkcs11 v1.0.2/go.mod h1:XsNlhZGX73bx86s2hdc/FuaLm2CPZJemRLMA+WTFxgs= -github.com/miekg/pkcs11 v1.1.1 h1:Ugu9pdy6vAYku5DEpVWVFPYnzV+bxB+iRdbuFSu7TvU= -github.com/miekg/pkcs11 v1.1.1/go.mod h1:XsNlhZGX73bx86s2hdc/FuaLm2CPZJemRLMA+WTFxgs= github.com/mikelolasagasti/xz v1.0.1 h1:Q2F2jX0RYJUG3+WsM+FJknv+6eVjsjXNDV0KJXZzkD0= github.com/mikelolasagasti/xz v1.0.1/go.mod h1:muAirjiOUxPRXwm9HdDtB3uoRPrGnL85XHtokL9Hcgc= github.com/mikioh/tcp v0.0.0-20190314235350-803a9b46060c h1:bzE/A84HN25pxAuk9Eej1Kz9OUelF97nAc82bDquQI8= @@ -1068,46 +907,23 @@ github.com/mitchellh/go-testing-interface v1.0.0/go.mod h1:kRemZodwjscx+RGhAo8eI github.com/mitchellh/go-testing-interface v1.14.1 h1:jrgshOhYAUVNMAJiKbEu7EqAwgJJ2JqpQmpLJOu07cU= github.com/mitchellh/go-testing-interface v1.14.1/go.mod h1:gfgS7OtZj6MA4U1UrDRp04twqAjfvlZyCfX3sDjEym8= github.com/mitchellh/gox v0.4.0/go.mod h1:Sd9lOJ0+aimLBi73mGofS1ycjY8lL3uZM3JPS42BGNg= -github.com/mitchellh/hashstructure/v2 v2.0.2 h1:vGKWl0YJqUNxE8d+h8f6NJLcCJrgbhC4NcD46KavDd4= -github.com/mitchellh/hashstructure/v2 v2.0.2/go.mod h1:MG3aRVU/N29oo/V/IhBX8GR/zz4kQkprJgF2EVszyDE= github.com/mitchellh/iochan v1.0.0/go.mod h1:JwYml1nuB7xOzsp52dPpHFffvOCDupsG0QubkSMEySY= -github.com/mitchellh/mapstructure v0.0.0-20150613213606-2caf8efc9366/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY= github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= github.com/mitchellh/pointerstructure v1.2.0 h1:O+i9nHnXS3l/9Wu7r4NrEdwA2VFTicjUEN1uBnDo34A= github.com/mitchellh/pointerstructure v1.2.0/go.mod h1:BRAsLI5zgXmw97Lf6s25bs8ohIXc3tViBH44KcwB2g4= -github.com/moby/buildkit v0.25.1 h1:j7IlVkeNbEo+ZLoxdudYCHpmTsbwKvhgc/6UJ/mY/o8= -github.com/moby/buildkit v0.25.1/go.mod h1:phM8sdqnvgK2y1dPDnbwI6veUCXHOZ6KFSl6E164tkc= github.com/moby/docker-image-spec v1.3.1 h1:jMKff3w6PgbfSa69GfNg+zN/XLhfXJGnEx3Nl2EsFP0= github.com/moby/docker-image-spec v1.3.1/go.mod h1:eKmb5VW8vQEh/BAr2yvVNvuiJuY6UIocYsFu/DxxRpo= -github.com/moby/go-archive v0.1.0 h1:Kk/5rdW/g+H8NHdJW2gsXyZ7UnzvJNOy6VKJqueWdcQ= -github.com/moby/go-archive v0.1.0/go.mod h1:G9B+YoujNohJmrIYFBpSd54GTUB4lt9S+xVQvsJyFuo= -github.com/moby/locker v1.0.1 h1:fOXqR41zeveg4fFODix+1Ch4mj/gT0NE1XJbp/epuBg= -github.com/moby/locker v1.0.1/go.mod h1:S7SDdo5zpBK84bzzVlKr2V0hz+7x9hWbYC/kq7oQppc= github.com/moby/moby v28.5.2+incompatible h1:hIn6qcenb3JY1E3STwqEbBvJ8bha+u1LpqjX4CBvNCk= github.com/moby/moby v28.5.2+incompatible/go.mod h1:fDXVQ6+S340veQPv35CzDahGBmHsiclFwfEygB/TWMc= -github.com/moby/patternmatcher v0.6.0 h1:GmP9lR19aU5GqSSFko+5pRqHi+Ohk1O69aFiKkVGiPk= -github.com/moby/patternmatcher v0.6.0/go.mod h1:hDPoyOpDY7OrrMDLaYoY3hf52gNCR/YOUYxkhApJIxc= -github.com/moby/spdystream v0.5.0 h1:7r0J1Si3QO/kjRitvSLVVFUjxMEb/YLj6S9FF62JBCU= -github.com/moby/spdystream v0.5.0/go.mod h1:xBAYlnt/ay+11ShkdFKNAG7LsyK/tmNBVvVOwrfMgdI= github.com/moby/sys/atomicwriter v0.1.0 h1:kw5D/EqkBwsBFi0ss9v1VG3wIkVhzGvLklJ+w3A14Sw= github.com/moby/sys/atomicwriter v0.1.0/go.mod h1:Ul8oqv2ZMNHOceF643P6FKPXeCmYtlQMvpizfsSoaWs= -github.com/moby/sys/capability v0.4.0 h1:4D4mI6KlNtWMCM1Z/K0i7RV1FkX+DBDHKVJpCndZoHk= -github.com/moby/sys/capability v0.4.0/go.mod h1:4g9IK291rVkms3LKCDOoYlnV8xKwoDTpIrNEE35Wq0I= -github.com/moby/sys/mountinfo v0.7.2 h1:1shs6aH5s4o5H2zQLn796ADW1wMrIwHsyJ2v9KouLrg= -github.com/moby/sys/mountinfo v0.7.2/go.mod h1:1YOa8w8Ih7uW0wALDUgT1dTTSBrZ+HiBLGws92L2RU4= github.com/moby/sys/sequential v0.6.0 h1:qrx7XFUd/5DxtqcoH1h438hF5TmOvzC/lspjy7zgvCU= github.com/moby/sys/sequential v0.6.0/go.mod h1:uyv8EUTrca5PnDsdMGXhZe6CCe8U/UiTWd+lL+7b/Ko= -github.com/moby/sys/signal v0.7.1 h1:PrQxdvxcGijdo6UXXo/lU/TvHUWyPhj7UOpSo8tuvk0= -github.com/moby/sys/signal v0.7.1/go.mod h1:Se1VGehYokAkrSQwL4tDzHvETwUZlnY7S5XtQ50mQp8= -github.com/moby/sys/symlink v0.3.0 h1:GZX89mEZ9u53f97npBy4Rc3vJKj7JBDj/PN2I22GrNU= -github.com/moby/sys/symlink v0.3.0/go.mod h1:3eNdhduHmYPcgsJtZXW1W4XUJdZGBIkttZ8xKqPUJq0= github.com/moby/sys/user v0.4.0 h1:jhcMKit7SA80hivmFJcbB1vqmw//wU61Zdui2eQXuMs= github.com/moby/sys/user v0.4.0/go.mod h1:bG+tYYYJgaMtRKgEmuueC0hJEAZWwtIbZTB+85uoHjs= -github.com/moby/sys/userns v0.1.0 h1:tVLXkFOxVu9A64/yh59slHVv9ahO9UIev4JZusOLG/g= -github.com/moby/sys/userns v0.1.0/go.mod h1:IHUYgu/kao6N8YZlp9Cf444ySSvCmDlmzUcYfDHOl28= github.com/moby/term v0.5.2 h1:6qk3FJAFDs6i/q3W/pQ97SX192qKfZgGjCQqfCJkgzQ= github.com/moby/term v0.5.2/go.mod h1:d3djjFCrjnB+fl8NJux+EJzu0msscUP+f8it8hPkFLc= github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= @@ -1159,8 +975,6 @@ github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRW github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f h1:KUppIJq7/+SVif2QVs3tOP0zanoHgBEVAwHxUSIzRqU= github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= github.com/mwitkow/grpc-proxy v0.0.0-20181017164139-0f1106ef9c76/go.mod h1:x5OoJHDHqxHS801UIuhqGl6QdSAEJvtausosHSdazIo= -github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f h1:y5//uYreIhSUg3J1GEMiLbxo1LJaP8RfCpH6pymGZus= -github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f/go.mod h1:ZdcZmHo+o7JKHSa8/e818NopupXU1YMK5fe1lsApnBw= github.com/naoina/go-stringutil v0.1.0 h1:rCUeRUHjBjGTSHl0VC00jUPLz8/F9dDzYI70Hzifhks= github.com/naoina/go-stringutil v0.1.0/go.mod h1:XJ2SJL9jCtBh+P9q5btrd/Ylo8XwT/h1USek5+NqSA0= github.com/naoina/toml v0.1.2-0.20170918210437-9fafd6967416 h1:shk/vn9oCoOTmwcouEdwIeOtOGA/ELRUw/GwvxwfT+0= @@ -1193,32 +1007,22 @@ github.com/olekukonko/tablewriter v0.0.5 h1:P2Ga83D34wi1o9J6Wh1mRuqd4mF/x/lgBS7N github.com/olekukonko/tablewriter v0.0.5/go.mod h1:hPp6KlRPjbx+hW8ykQs1w3UBbZlj6HuIJcUGPhkA7kY= github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.7.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.12.0/go.mod h1:oUhWkIvk5aDxtKvDDuw8gItl8pKl42LzjC9KZE0HfGg= github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk= github.com/onsi/ginkgo v1.14.0/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9klQyY= github.com/onsi/ginkgo v1.16.5 h1:8xi0RTUf59SOSfEtZMvwTvXYMzG4gV23XVHOZiXNtnE= github.com/onsi/ginkgo v1.16.5/go.mod h1:+E8gABHa3K6zRBolWtd+ROzc/U5bkGt0FwiG042wbpU= -github.com/onsi/ginkgo/v2 v2.21.0 h1:7rg/4f3rB88pb5obDgNZrNHrQ4e6WpjonchcpuBRnZM= -github.com/onsi/ginkgo/v2 v2.21.0/go.mod h1:7Du3c42kxCUegi0IImZ1wUQzMBVecgIHjR1C+NkhLQo= github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= -github.com/onsi/gomega v1.9.0/go.mod h1:Ho0h+IUsWyvy1OpqCwxlQ/21gkhVunqlU8fDGcoTdcA= github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= github.com/onsi/gomega v1.38.0 h1:c/WX+w8SLAinvuKKQFh77WEucCnPk4j2OTUr7lt7BeY= github.com/onsi/gomega v1.38.0/go.mod h1:OcXcwId0b9QsE7Y49u+BTrL4IdKOBOKnD6VQNTJEB6o= github.com/op/go-logging v0.0.0-20160315200505-970db520ece7/go.mod h1:HzydrMdWErDVzsI23lYNej1Htcns9BCg93Dk0bBINWk= -github.com/opencontainers/go-digest v0.0.0-20170106003457-a6d0ee40d420/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s= github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8Oi/yOhh5U= github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM= -github.com/opencontainers/image-spec v1.0.1/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0= github.com/opencontainers/image-spec v1.1.1 h1:y0fUlFfIZhPF1W537XOLg0/fcx6zcHCJwooC2xJA040= github.com/opencontainers/image-spec v1.1.1/go.mod h1:qpqAh3Dmcf36wStyyWU+kCeDgrGnAve2nCC8+7h8Q0M= github.com/opencontainers/runc v1.3.6 h1:SLGIymCtsk80iNPWgbc8dtjI30r+5mTVV+4dN8/17Sk= github.com/opencontainers/runc v1.3.6/go.mod h1:o1wyv76EDlTkcf0KTFgN8bMWLPvgF/HfX709lDv+rr4= -github.com/opencontainers/runtime-spec v1.2.1 h1:S4k4ryNgEpxW1dzyqffOmhI1BHYcjzU8lpJfSlR0xww= -github.com/opencontainers/runtime-spec v1.2.1/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= -github.com/opencontainers/selinux v1.12.0 h1:6n5JV4Cf+4y0KNXW48TLj5DwfXpvWlxXplUkdTrmPb8= -github.com/opencontainers/selinux v1.12.0/go.mod h1:BTPX+bjVbWGXw7ZZWUbdENt8w0htPSrlgOOysQaU62U= github.com/opentracing-contrib/go-observer v0.0.0-20170622124052-a52f23424492/go.mod h1:Ngi6UdF0k5OKD5t5wlmGhe/EDKPoUM3BXZSSfIuJbis= github.com/opentracing/basictracer-go v1.0.0/go.mod h1:QfBfYuafItcjQuMwinw9GhYKwFXS9KnPs5lxoYwgW74= github.com/opentracing/opentracing-go v1.0.2/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= @@ -1237,8 +1041,6 @@ github.com/pbnjay/memory v0.0.0-20210728143218-7b4eea64cf58 h1:onHthvaw9LFnH4t2D github.com/pbnjay/memory v0.0.0-20210728143218-7b4eea64cf58/go.mod h1:DXv8WO4yhMYhSNPKjeNKa5WY9YCIEBRbNzFFPJbWO6Y= github.com/pborman/uuid v1.2.0/go.mod h1:X/NO0urCmaxf9VXbdlT7C2Yzkj2IKimNn4k+gtPdI/k= github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= -github.com/pelletier/go-toml v1.9.5 h1:4yBQzkHv+7BHq2PQUZF3Mx0IYxG7LsP222s7Agd3ve8= -github.com/pelletier/go-toml v1.9.5/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c= github.com/pelletier/go-toml/v2 v2.2.4 h1:mye9XuhQ6gvn5h28+VilKrrPoQVanw5PMw/TB0t5Ec4= github.com/pelletier/go-toml/v2 v2.2.4/go.mod h1:2gIqNv+qfxSVS7cM2xJQKtLSTLUE9V8t9Stt+h56mCY= github.com/performancecopilot/speed v3.0.0+incompatible/go.mod h1:/CLtqpZ5gBg1M9iaPbIdPPGyKcA8hKdoy6hAWba7Yac= @@ -1310,17 +1112,14 @@ github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI= github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55 h1:o4JXh1EVt9k/+g42oCprj/FisM4qX9L3sZB3upGN2ZU= github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55/go.mod h1:OmDBASR4679mdNQnz2pUhc2G8CO2JrUAVFDRBDP/hJE= -github.com/prometheus/client_golang v0.9.0-pre1.0.20180209125602-c332b6f63c06/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= github.com/prometheus/client_golang v0.9.3-0.20190127221311-3c4408c8b829/go.mod h1:p2iRAGwDERtqlqzRXnrOVns+ignqQo//hLXqYxZYVNs= github.com/prometheus/client_golang v0.9.3/go.mod h1:/TN21ttK/J9q6uSwhBd54HahCDft0ttaMvbicHlPoso= github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= -github.com/prometheus/client_golang v1.1.0/go.mod h1:I1FGZT9+L76gKKOs5djB6ezCbFQP1xR9D75/vuwEF3g= github.com/prometheus/client_golang v1.3.0/go.mod h1:hJaj2vgQTGQmVCsAACORcieXFeDPbaTKGT+JTgUa3og= github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M= github.com/prometheus/client_golang v1.24.1 h1:JnJkREXzWxUdCuPFpIWZiPispT9xVV59uiuyR2bPlnU= github.com/prometheus/client_golang v1.24.1/go.mod h1:F+oSRECHg4sse5ucfYpYDeIv/hu68Zo0uoHKetWnzcE= -github.com/prometheus/client_model v0.0.0-20171117100541-99fa1f4be8e5/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= github.com/prometheus/client_model v0.0.0-20190115171406-56726106282f/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= @@ -1329,23 +1128,19 @@ github.com/prometheus/client_model v0.1.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6T github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/client_model v0.6.2 h1:oBsgwpGs7iVziMvrGhE53c/GrLUsZdHnqNwqPLxwZyk= github.com/prometheus/client_model v0.6.2/go.mod h1:y3m2F6Gdpfy6Ut/GBsUqTWZqCUvMVzSfMLjcu6wAwpE= -github.com/prometheus/common v0.0.0-20180110214958-89604d197083/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= github.com/prometheus/common v0.0.0-20181113130724-41aa239b4cce/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= github.com/prometheus/common v0.2.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= github.com/prometheus/common v0.4.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= -github.com/prometheus/common v0.6.0/go.mod h1:eBmuwkDJBwy6iBfxCBob6t6dR6ENT/y+J+Zk0j9GMYc= github.com/prometheus/common v0.7.0/go.mod h1:DjGbpBbp5NYNiECxcL/VnbXCCaQpKd3tt26CguLLsqA= github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo= github.com/prometheus/common v0.15.0/go.mod h1:U+gB1OBLb1lF3O42bTCL+FK18tX9Oar16Clt/msog/s= github.com/prometheus/common v0.70.1 h1:1HvjP4D5oL3t8RsPlwxA9onvvStjtIHYE5XuuwOi/PY= github.com/prometheus/common v0.70.1/go.mod h1:VdFUQDMZK3VLkurFUVhia6uys/0suUp86TJz5qbJRhc= -github.com/prometheus/procfs v0.0.0-20180125133057-cb4147076ac7/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= github.com/prometheus/procfs v0.0.0-20190117184657-bf6a532e95b1/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= github.com/prometheus/procfs v0.0.0-20190507164030-5867b95ac084/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= -github.com/prometheus/procfs v0.0.3/go.mod h1:4A/X28fw3Fc593LaREMrKMqOKvUAntwMDaekg4FpcdQ= github.com/prometheus/procfs v0.0.8/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+GxbHq6oeK9A= github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= github.com/prometheus/procfs v0.3.0/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= @@ -1399,19 +1194,11 @@ github.com/ryanuber/go-glob v1.0.0/go.mod h1:807d1WSdnB0XRJzKNil9Om6lcp/3a0v4qIH github.com/sagikazarmark/locafero v0.12.0 h1:/NQhBAkUb4+fH1jivKHWusDYFjMOOKU88eegjfxfHb4= github.com/sagikazarmark/locafero v0.12.0/go.mod h1:sZh36u/YSZ918v0Io+U9ogLYQJ9tLLBmM4eneO6WwsI= github.com/samuel/go-zookeeper v0.0.0-20190923202752-2cc03de413da/go.mod h1:gi+0XIa01GRL2eRQVjQkKGqKF3SF9vZR/HnPullcV2E= -github.com/santhosh-tekuri/jsonschema/v6 v6.0.2 h1:KRzFb2m7YtdldCEkzs6KqmJw4nqEVZGK7IN2kJkjTuQ= -github.com/santhosh-tekuri/jsonschema/v6 v6.0.2/go.mod h1:JXeL+ps8p7/KNMjDQk3TCwPpBy0wYklyWTfbkIzdIFU= github.com/sasha-s/go-deadlock v0.3.9 h1:fiaT9rB7g5sr5ddNZvlwheclN9IP86eFW9WgqlEQV+w= github.com/sasha-s/go-deadlock v0.3.9/go.mod h1:KuZj51ZFmx42q/mPaYbRk0P1xcwe697zsJKE03vD4/Y= github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= -github.com/secure-systems-lab/go-securesystemslib v0.6.0 h1:T65atpAVCJQK14UA57LMdZGpHi4QYSH/9FZyNGqMYIA= -github.com/secure-systems-lab/go-securesystemslib v0.6.0/go.mod h1:8Mtpo9JKks/qhPG4HGZ2LGMvrPbzuxwfz/f/zLfEWkk= -github.com/serialx/hashring v0.0.0-20200727003509-22c0c7ab6b1b h1:h+3JX2VoWTFuyQEo87pStk/a99dzIO1mM9KxIyLPGTU= -github.com/serialx/hashring v0.0.0-20200727003509-22c0c7ab6b1b/go.mod h1:/yeG0My1xr/u+HZrFQ1tOQQQQrOawfyMUH13ai5brBc= github.com/shamaton/msgpack/v2 v2.4.1 h1:JtJ141QoQ3NqgPDsjq2v9VXlaON8SiQOwEaoNLEK/MQ= github.com/shamaton/msgpack/v2 v2.4.1/go.mod h1:6khjYnkx73f7VQU7wjcFS9DFjs+59naVWJv1TB7qdOI= -github.com/shibumi/go-pathspec v1.3.0 h1:QUyMZhFo0Md5B8zV8x2tesohbb5kfbpTi9rBnKh5dkI= -github.com/shibumi/go-pathspec v1.3.0/go.mod h1:Xutfslp817l2I1cZvgcfeMQJG5QnU2lh5tVaaMCl3jE= github.com/shirou/gopsutil v3.21.11+incompatible h1:+1+c1VGhc88SSonWP6foOcLhvnKlUeu/erjjvaPEYiI= github.com/shirou/gopsutil v3.21.11+incompatible/go.mod h1:5b4v6he4MtMOwMlS0TUMTu2PcXUg8+E1lC7eC3UO/RA= github.com/shirou/gopsutil/v4 v4.26.6 h1:Mzr/npDtQC/xpeEuQKHZt8Zo9CmPvhTj8nkR8w5TLDs= @@ -1420,16 +1207,12 @@ github.com/shopspring/decimal v1.3.1/go.mod h1:DKyhrW/HYNuLGql+MJL6WCR6knT2jwCFR github.com/shopspring/decimal v1.4.0 h1:bxl37RwXBklmTi0C79JfXCEBD1cqqHt0bbgBAGFp81k= github.com/shopspring/decimal v1.4.0/go.mod h1:gawqmDU56v4yIKSwfBSFip1HdCCXN8/+DMd9qYNcwME= github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= -github.com/sirupsen/logrus v1.0.6/go.mod h1:pMByvHTf9Beacp5x1UXfOR9xyW/9antXMhjMPG0dEzc= github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= -github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMBDgk/93Q= github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88= github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= github.com/sirupsen/logrus v1.9.4 h1:TsZE7l11zFCLZnZ+teH4Umoq5BhEIfIzfRDZ1Uzql2w= github.com/sirupsen/logrus v1.9.4/go.mod h1:ftWc9WdOfJ0a92nsE2jF5u5ZwH8Bv2zdeOC42RjbV2g= -github.com/skratchdot/open-golang v0.0.0-20200116055534-eef842397966 h1:JIAuq3EEf9cgbU6AtGPK4CTG3Zf6CKMNqf0MHTggAUA= -github.com/skratchdot/open-golang v0.0.0-20200116055534-eef842397966/go.mod h1:sUM3LWHvSMaG192sy56D9F7CNvL7jUJVXoqM1QKLnog= github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM= @@ -1439,30 +1222,23 @@ github.com/sorairolake/lzip-go v0.3.8/go.mod h1:JcBqGMV0frlxwrsE9sMWXDjqn3EeVf0/ github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= github.com/spaolacci/murmur3 v1.1.0 h1:7c1g84S4BPRrfL5Xrdp6fOJ206sU9y293DDHaoy0bLI= github.com/spaolacci/murmur3 v1.1.0/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= -github.com/spdx/tools-golang v0.5.5 h1:61c0KLfAcNqAjlg6UNMdkwpMernhw3zVRwDZ2x9XOmk= -github.com/spdx/tools-golang v0.5.5/go.mod h1:MVIsXx8ZZzaRWNQpUDhC4Dud34edUYJYecciXgrw5vE= github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= github.com/spf13/afero v1.15.0 h1:b/YBCLWAJdFWJTN9cLhiXXcD7mzKn9Dm86dNnfyQw1I= github.com/spf13/afero v1.15.0/go.mod h1:NC2ByUVxtQs4b3sIUphxK0NioZnmxgyCrfzeuq8lxMg= -github.com/spf13/cast v0.0.0-20150508191742-4d07383ffe94/go.mod h1:r2rcYCSwa1IExKTDiTfzaxqT2FNHs8hODu4LnUfgKEg= github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= github.com/spf13/cast v1.10.0 h1:h2x0u2shc1QuLHfxi+cTJvs30+ZAHOGRic8uyGTDWxY= github.com/spf13/cast v1.10.0/go.mod h1:jNfB8QC9IA6ZuY2ZjDp0KtFO2LZZlg4S/7bzP6qqeHo= -github.com/spf13/cobra v0.0.1/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= github.com/spf13/cobra v0.0.3/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= github.com/spf13/cobra v1.1.1/go.mod h1:WnodtKOvamDL/PwE2M4iKs8aMDBZ5Q5klgD3qfVJQMI= github.com/spf13/cobra v1.10.2 h1:DMTTonx5m65Ic0GOoRY2c16WCbHxOOw6xxezuLaBpcU= github.com/spf13/cobra v1.10.2/go.mod h1:7C1pvHqHw5A4vrJfjNwvOdzYu0Gml16OCs2GRiTUUS4= -github.com/spf13/jwalterweatherman v0.0.0-20141219030609-3d60171a6431/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= -github.com/spf13/pflag v1.0.0/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= github.com/spf13/pflag v1.0.1/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= github.com/spf13/pflag v1.0.9/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= github.com/spf13/pflag v1.0.10 h1:4EBh2KAYBwaONj6b2Ye1GiHfwjqyROoF4RwYO+vPwFk= github.com/spf13/pflag v1.0.10/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= -github.com/spf13/viper v0.0.0-20150530192845-be5ff3e4840c/go.mod h1:A8kyI5cUJhb8N+3pkfONlcEcZbueH6nhAm0Fq7SrnBM= github.com/spf13/viper v1.7.0/go.mod h1:8WkrPz2fc9jxqZNCJI/76HCieCp4Q8HaLFoCha5qpdg= github.com/spf13/viper v1.7.1/go.mod h1:8WkrPz2fc9jxqZNCJI/76HCieCp4Q8HaLFoCha5qpdg= github.com/spf13/viper v1.21.0 h1:x5S+0EU27Lbphp4UKm1C+1oQO+rKx36vfCoaVebLFSU= @@ -1477,7 +1253,6 @@ github.com/streamingfast/logging v0.0.0-20230608130331-f22c91403091 h1:RN5mrigyi github.com/streamingfast/logging v0.0.0-20230608130331-f22c91403091/go.mod h1:VlduQ80JcGJSargkRU4Sg9Xo63wZD/l8A5NC/Uo1/uU= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE= github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA= @@ -1510,12 +1285,6 @@ github.com/teris-io/shortid v0.0.0-20171029131806-771a37caa5cf/go.mod h1:M8agBzg github.com/teris-io/shortid v0.0.0-20201117134242-e59966efd125/go.mod h1:M8agBzgqHIhgj7wEn9/0hJUZcrvt9VY+Ln+S1I5Mha0= github.com/test-go/testify v1.1.4 h1:Tf9lntrKUMHiXQ07qBScBTSA0dhYQlu83hswqelv1iE= github.com/test-go/testify v1.1.4/go.mod h1:rH7cfJo/47vWGdi4GPj16x3/t1xGOj2YxzmNQzk2ghU= -github.com/testcontainers/testcontainers-go v0.40.0 h1:pSdJYLOVgLE8YdUY2FHQ1Fxu+aMnb6JfVz1mxk7OeMU= -github.com/testcontainers/testcontainers-go v0.40.0/go.mod h1:FSXV5KQtX2HAMlm7U3APNyLkkap35zNLxukw9oBi/MY= -github.com/testcontainers/testcontainers-go/modules/compose v0.40.0 h1:Bj8W7GieY56sRbVJx1yLh0JVEtOQ8SQMhX+jRtzenLA= -github.com/testcontainers/testcontainers-go/modules/compose v0.40.0/go.mod h1:fEEGqtsoH1KS+sUi1WG4+vH3fqdCyip1U9Hd8P3SRMA= -github.com/theupdateframework/notary v0.7.0 h1:QyagRZ7wlSpjT5N2qQAh/pN+DVqgekv4DzbAiAiEL3c= -github.com/theupdateframework/notary v0.7.0/go.mod h1:c9DRxcmhHmVLDay4/2fUYdISnHqbFDGRSlXPO0AhYWw= github.com/thomaso-mirodin/intmath v0.0.0-20160323211736-5dc6d854e46e h1:cR8/SYRgyQCt5cNCMniB/ZScMkhI9nk8U5C7SbISXjo= github.com/thomaso-mirodin/intmath v0.0.0-20160323211736-5dc6d854e46e/go.mod h1:Tu4lItkATkonrYuvtVjG0/rhy15qrNGNTjPdaphtZ/8= github.com/tidwall/btree v1.8.1 h1:27ehoXvm5AG/g+1VxLS1SD3vRhp/H7LuEfwNvddEdmA= @@ -1529,24 +1298,12 @@ github.com/tidwall/match v1.2.0/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JT github.com/tidwall/pretty v1.2.0/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU= github.com/tidwall/pretty v1.2.1 h1:qjsOFOWWQl+N3RsoF5/ssm1pHmJJwhjlSbZ51I6wMl4= github.com/tidwall/pretty v1.2.1/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU= -github.com/tilt-dev/fsnotify v1.4.8-0.20220602155310-fff9c274a375 h1:QB54BJwA6x8QU9nHY3xJSZR2kX9bgpZekRKGkLTmEXA= -github.com/tilt-dev/fsnotify v1.4.8-0.20220602155310-fff9c274a375/go.mod h1:xRroudyp5iVtxKqZCrA6n2TLFRBf8bmnjr1UD4x+z7g= github.com/tklauser/go-sysconf v0.4.0 h1:7H0uAN+7RkwWRaxhYXDLqa5V3LPrJeV8wmD9dRUgPQU= github.com/tklauser/go-sysconf v0.4.0/go.mod h1:8mTNWyog7H+MpKijp4VmKJAd2bbYQ2zuUwkYRbUArPI= github.com/tklauser/numcpus v0.12.0 h1:NR85qdvHA9pFse3x3weVZ0r0ST8R6l5RHbZrlRaqob4= github.com/tklauser/numcpus v0.12.0/go.mod h1:ABHeXzJnr/qqwguhClkZKT1/8VABcYrsyUiUGobwWJg= github.com/tmc/grpc-websocket-proxy v0.0.0-20170815181823-89b8d40f7ca8/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= -github.com/tonistiigi/dchapes-mode v0.0.0-20250318174251-73d941a28323 h1:r0p7fK56l8WPequOaR3i9LBqfPtEdXIQbUTzT55iqT4= -github.com/tonistiigi/dchapes-mode v0.0.0-20250318174251-73d941a28323/go.mod h1:3Iuxbr0P7D3zUzBMAZB+ois3h/et0shEz0qApgHYGpY= -github.com/tonistiigi/fsutil v0.0.0-20250605211040-586307ad452f h1:MoxeMfHAe5Qj/ySSBfL8A7l1V+hxuluj8owsIEEZipI= -github.com/tonistiigi/fsutil v0.0.0-20250605211040-586307ad452f/go.mod h1:BKdcez7BiVtBvIcef90ZPc6ebqIWr4JWD7+EvLm6J98= -github.com/tonistiigi/go-csvvalue v0.0.0-20240814133006-030d3b2625d0 h1:2f304B10LaZdB8kkVEaoXvAMVan2tl9AiK4G0odjQtE= -github.com/tonistiigi/go-csvvalue v0.0.0-20240814133006-030d3b2625d0/go.mod h1:278M4p8WsNh3n4a1eqiFcV2FGk7wE5fwUpUom9mK9lE= -github.com/tonistiigi/units v0.0.0-20180711220420-6950e57a87ea h1:SXhTLE6pb6eld/v/cCndK0AMpt1wiVFb/YYmqB3/QG0= -github.com/tonistiigi/units v0.0.0-20180711220420-6950e57a87ea/go.mod h1:WPnis/6cRcDZSUvVmezrxJPkiO87ThFYsoUiMwWNDJk= -github.com/tonistiigi/vt100 v0.0.0-20240514184818-90bafcd6abab h1:H6aJ0yKQ0gF49Qb2z5hI1UHxSQt4JMyxebFR15KnApw= -github.com/tonistiigi/vt100 v0.0.0-20240514184818-90bafcd6abab/go.mod h1:ulncasL3N9uLrVann0m+CDlJKWsIAP34MPcOJF6VRvc= github.com/twitchyliquid64/golang-asm v0.15.1 h1:SU5vSMR7hnwNxj24w34ZyCi/FmDZTkS4MhqMhdFk5YI= github.com/twitchyliquid64/golang-asm v0.15.1/go.mod h1:a1lVb/DtPvCB8fslRZhAngC2+aY1QWCk3Cedj/Gdt08= github.com/ugorji/go v1.1.7/go.mod h1:kZn38zHttfInRq0xu/PH0az30d+z6vm202qpg1oXVMw= @@ -1556,20 +1313,13 @@ github.com/ulikunitz/xz v0.5.15 h1:9DNdB5s+SgV3bQ2ApL10xRc35ck0DuIX/isZvIk+ubY= github.com/ulikunitz/xz v0.5.15/go.mod h1:nbz6k7qbPmH4IRqmfOplQw/tblSgqTqBwxkY0oWt/14= github.com/urfave/cli v1.20.0/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA= github.com/urfave/cli v1.22.1/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= -github.com/urfave/cli v1.22.17 h1:SYzXoiPfQjHBbkYxbew5prZHS1TOLT3ierW8SYLqtVQ= github.com/urfave/cli/v2 v2.27.6 h1:VdRdS98FNhKZ8/Az8B7MTyGQmpIr36O1EHybx/LaZ4g= github.com/urfave/cli/v2 v2.27.6/go.mod h1:3Sevf16NykTbInEnD0yKkjDAeZDS0A6bzhBH5hrMvTQ= github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= github.com/valyala/fasttemplate v1.0.1/go.mod h1:UQGH1tvbgY+Nz5t2n7tXsz52dQxojPUpymEIMZ47gx8= github.com/valyala/fasttemplate v1.2.1/go.mod h1:KHLXt3tVN2HBp8eijSv/kGJopbvo7S+qRAEEKiv+SiQ= -github.com/vbatts/tar-split v0.12.1 h1:CqKoORW7BUWBe7UL/iqTVvkTBOF8UvOMKOIZykxnnbo= -github.com/vbatts/tar-split v0.12.1/go.mod h1:eF6B6i6ftWQcDqEn3/iGFRFRo8cBIMSJVOpnNdfTMFA= github.com/wlynxg/anet v0.0.5 h1:J3VJGi1gvo0JwZ/P1/Yc/8p63SoW98B5dHkYDmpgvvU= github.com/wlynxg/anet v0.0.5/go.mod h1:eay5PRQr7fIVAMbTbchTnO9gG65Hg/uYGdc7mguHxoA= -github.com/x448/float16 v0.8.4 h1:qLwI1I70+NjRFUR3zs1JPUCgaCXSh3SW62uAKT1mSBM= -github.com/x448/float16 v0.8.4/go.mod h1:14CWIYCyZA/cWjXOioeEpHeN/83MdbZDRQHoFcYsOfg= -github.com/xhit/go-str2duration/v2 v2.1.0 h1:lxklc02Drh6ynqX+DdPyp5pCKLUQpRT8bp8Ydu2Bstc= -github.com/xhit/go-str2duration/v2 v2.1.0/go.mod h1:ohY8p+0f07DiV6Em5LKB0s2YpLtXVyJfNt1+BlmyAsU= github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= github.com/xrash/smetrics v0.0.0-20240521201337-686a1a2994c1 h1:gEOO8jv9F4OT7lGCjxCBTO/36wtF6j2nSip77qHd4x4= github.com/xrash/smetrics v0.0.0-20240521201337-686a1a2994c1/go.mod h1:Ohn+xnUBiLI6FVj/9LpzZWtj1/D6lUovWYBkxHVV3aM= @@ -1582,8 +1332,6 @@ github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1 github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= github.com/yusufpapurcu/wmi v1.2.4 h1:zFUKzehAFReQwLys1b/iSMl+JQGSCSjtVqQn9bBrPo0= github.com/yusufpapurcu/wmi v1.2.4/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0= -github.com/zclconf/go-cty v1.17.0 h1:seZvECve6XX4tmnvRzWtJNHdscMtYEx5R7bnnVyd/d0= -github.com/zclconf/go-cty v1.17.0/go.mod h1:wqFzcImaLTI6A5HfsRwB0nj5n0MRZFwmey8YoFPPs3U= github.com/zondax/golem v0.27.0 h1:IbBjGIXF3SoGOZHsILJvIM/F/ylwJzMcHAcggiqniPw= github.com/zondax/golem v0.27.0/go.mod h1:AmorCgJPt00L8xN1VrMBe13PSifoZksnQ1Ge906bu4A= github.com/zondax/hid v0.9.2 h1:WCJFnEDMiqGF64nlZz28E9qLVZ0KSJ7xpc5DLEyma2U= @@ -1606,8 +1354,6 @@ go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk= -go.opencensus.io v0.24.0 h1:y73uSU6J157QMP2kn2r30vwW1A2W2WFwSCGnAVxeaD0= -go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo= go.opentelemetry.io/auto/sdk v1.2.1 h1:jXsnJ4Lmnqd11kwkBV2LgLoFMZKizbCi5fNZ/ipaZ64= go.opentelemetry.io/auto/sdk v1.2.1/go.mod h1:KRTj+aOaElaLi+wW1kO/DZRXwkF4C5xPbEe3ZiIhN7Y= go.opentelemetry.io/contrib/bridges/otelslog v0.19.0 h1:5RgvxieNq9tS3ewrV1vnODvbHPfKUIJcYtF9Cvz+6aQ= @@ -1618,8 +1364,6 @@ go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.6 go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.69.0/go.mod h1:D7J12YRapIekYyPWgGPlA/23pRmpSEZC5xJC/TTLI9U= go.opentelemetry.io/contrib/instrumentation/host v0.69.0 h1:N/wKAdIOKd9U4bwiwY3j95e2ZR48onTMR/NI/SZQ/a4= go.opentelemetry.io/contrib/instrumentation/host v0.69.0/go.mod h1:rE1Bxmu3mwcmyTJV4EQdJ/C6zCUnuT9jCiinhRXLAXc= -go.opentelemetry.io/contrib/instrumentation/net/http/httptrace/otelhttptrace v0.60.0 h1:0tY123n7CdWMem7MOVdKOt0YfshufLCwfE5Bob+hQuM= -go.opentelemetry.io/contrib/instrumentation/net/http/httptrace/otelhttptrace v0.60.0/go.mod h1:CosX/aS4eHnG9D7nESYpV753l4j9q5j3SL/PUYd2lR8= go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.68.0 h1:CqXxU8VOmDefoh0+ztfGaymYbhdB/tT3zs79QaZTNGY= go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.68.0/go.mod h1:BuhAPThV8PBHBvg8ZzZ/Ok3idOdhWIodywz2xEcRbJo= go.opentelemetry.io/contrib/instrumentation/runtime v0.69.0 h1:MtkMsuRo3zEXTTMALfyrszwCDZTkB6wolyPjbwFAdq0= @@ -1723,18 +1467,15 @@ golang.org/x/arch v0.26.0/go.mod h1:0X+GdSIP+kL5wPmpK7sdkEVTt2XoYP0cSjQSbZBwOi8= golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= -golang.org/x/crypto v0.0.0-20190325154230-a5d413f7728c/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190611184440-5c40567a22f8/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20200302210943-78000ba7a073/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200602180216-279210d13fed/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200728195943-123391ffb6de/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200820211705-5c72a883971a/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20201117144127-c1f2f97bffc9/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= golang.org/x/crypto v0.0.0-20201221181555-eec23a3978ad/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= @@ -1859,7 +1600,6 @@ golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190801041406-cbf593c0f2f3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190804053845-51ab0e2deafa/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190813064441-fde4db37ae7a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190826190057-c7b8b68b1456/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -1895,11 +1635,9 @@ golang.org/x/sys v0.0.0-20201204225414-ed752295db88/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210331175145-43e1dd70ce54/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210616094352-59db8d763f22/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210809222454-d867a43fc93e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= @@ -1907,7 +1645,6 @@ golang.org/x/sys v0.0.0-20211025201205-69cdffdb9359/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220310020820-b874c991c1a5/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220315194320-039c03cc5b86/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220503163025-988cb79eb6c6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= @@ -2019,8 +1756,6 @@ google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7 google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= google.golang.org/appengine v1.6.2/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= -google.golang.org/appengine v1.6.8 h1:IhEN5q69dyKagZPYMSdIjS2HqprW324FRQZJcGqPAsM= -google.golang.org/appengine v1.6.8/go.mod h1:1jJ3jBArFh5pcgW8gCtRJnepW8FzD1V44FJffLiz/Ds= google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= google.golang.org/genproto v0.0.0-20180831171423-11092d34479b/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= @@ -2054,7 +1789,6 @@ google.golang.org/genproto/googleapis/api v0.0.0-20260526163538-3dc84a4a5aaa h1: google.golang.org/genproto/googleapis/api v0.0.0-20260526163538-3dc84a4a5aaa/go.mod h1:q4lMZS6kskjT5HvCPrnnypcDPVJqT/f4nfxmkE7gryY= google.golang.org/genproto/googleapis/rpc v0.0.0-20260526163538-3dc84a4a5aaa h1:mZHHdPZl0dbGHCflZgAq/Q468DWVFcU2whhB2KAo8fk= google.golang.org/genproto/googleapis/rpc v0.0.0-20260526163538-3dc84a4a5aaa/go.mod h1:4Hqkh8ycfw05ld/3BWL7rJOSfebL2Q+DVDeRgYgxUU8= -google.golang.org/grpc v1.0.5/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw= google.golang.org/grpc v1.17.0/go.mod h1:6QZJwpn2B+Zp71q/5VxRsJ6NXXVCE5NRUHRo+f3cWCs= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= google.golang.org/grpc v1.20.0/go.mod h1:chYK+tFQF0nDUGJgXMSgLCQk3phJEuONr2DCgLDdAQM= @@ -2095,36 +1829,23 @@ google.golang.org/protobuf v1.36.12 h1:pJOKDDOyeXErUroCihFAd5LQuwXBSpVnKGrj5o/fw google.golang.org/protobuf v1.36.12/go.mod h1:HTf+CrKn2C3g5S8VImy6tdcUvCska2kB7j23XfzDpco= gopkg.in/Knetic/govaluate.v3 v3.0.0 h1:18mUyIt4ZlRlFZAAfVetz4/rzlJs9yhN+U02F4u1AOc= gopkg.in/Knetic/govaluate.v3 v3.0.0/go.mod h1:csKLBORsPbafmSCGTEh3U7Ozmsuq8ZSIlKk1bcqph0E= -gopkg.in/airbrake/gobrake.v2 v2.0.9/go.mod h1:/h5ZAUhDkGaJfjzjKLSjv6zCL6O0LLBxU4K+aSYdM/U= gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= gopkg.in/cenkalti/backoff.v1 v1.1.0 h1:Arh75ttbsvlpVA7WtVpH4u9h6Zl46xuptxqLxPiSo4Y= gopkg.in/cenkalti/backoff.v1 v1.1.0/go.mod h1:J6Vskwqd+OMVJl8C33mmtxTBs2gyzfv7UDAkHu8BrjI= -gopkg.in/cenkalti/backoff.v2 v2.2.1 h1:eJ9UAg01/HIHG987TwxvnzK2MgxXq97YY6rYDpY9aII= -gopkg.in/cenkalti/backoff.v2 v2.2.1/go.mod h1:S0QdOvT2AlerfSBkp0O+dk+bbIMaNbEmVk876gPCthU= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20200902074654-038fdea0a05b/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= gopkg.in/cheggaaa/pb.v1 v1.0.25/go.mod h1:V/YB90LKu/1FcN3WVnfiiE5oMCibMjukxqG/qStrOgw= gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= -gopkg.in/evanphx/json-patch.v4 v4.12.0 h1:n6jtcsulIzXPJaxegRbvFNNrZDjbij7ny3gmSPG+6V4= -gopkg.in/evanphx/json-patch.v4 v4.12.0/go.mod h1:p8EYWUEYMpynmqDbY58zCKCFZw8pRWMG4EsWvDvM72M= gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= gopkg.in/gcfg.v1 v1.2.3/go.mod h1:yesOnuUOFQAhST5vPY4nbZsb/huCgGGXlipJsBn0b3o= -gopkg.in/gemnasium/logrus-airbrake-hook.v2 v2.1.2/go.mod h1:Xk6kEKp8OKb+X14hQBKWaSkCsqBpgog8nAV2xsGOxlo= -gopkg.in/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc= -gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= gopkg.in/ini.v1 v1.51.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= -gopkg.in/ini.v1 v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA= -gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= gopkg.in/natefinch/lumberjack.v2 v2.2.1 h1:bBRl1b0OH9s/DuPhuXpNl+VtCaJXFZ5/uEFST95x9zc= gopkg.in/natefinch/lumberjack.v2 v2.2.1/go.mod h1:YD8tP3GAjkrDg1eZH7EGmyESg/lsYskCTPBJVb9jqSc= gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo= -gopkg.in/rethinkdb/rethinkdb-go.v6 v6.2.1 h1:d4KQkxAaAiRY2h5Zqis161Pv91A37uZyJOx73duwUwM= -gopkg.in/rethinkdb/rethinkdb-go.v6 v6.2.1/go.mod h1:WbjuEoo1oadwzQ4apSDU+JTvmllEHtsNHS6y7vFc7iw= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= gopkg.in/warnings.v0 v0.1.2/go.mod h1:jksf8JmL6Qr/oQM2OXTHunEvvTAsrWBLb6OOjuVWRNI= @@ -2151,18 +1872,6 @@ honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWh honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= -k8s.io/api v0.32.3 h1:Hw7KqxRusq+6QSplE3NYG4MBxZw1BZnq4aP4cJVINls= -k8s.io/api v0.32.3/go.mod h1:2wEDTXADtm/HA7CCMD8D8bK4yuBUptzaRhYcYEEYA3k= -k8s.io/apimachinery v0.32.3 h1:JmDuDarhDmA/Li7j3aPrwhpNBA94Nvk5zLeOge9HH1U= -k8s.io/apimachinery v0.32.3/go.mod h1:GpHVgxoKlTxClKcteaeuF1Ul/lDVb74KpZcxcmLDElE= -k8s.io/client-go v0.32.3 h1:RKPVltzopkSgHS7aS98QdscAgtgah/+zmpAogooIqVU= -k8s.io/client-go v0.32.3/go.mod h1:3v0+3k4IcT9bXTc4V2rt+d2ZPPG700Xy6Oi0Gdl2PaY= -k8s.io/klog/v2 v2.130.1 h1:n9Xl7H1Xvksem4KFG4PYbdQCQxqc/tTUyrgXaOhHSzk= -k8s.io/klog/v2 v2.130.1/go.mod h1:3Jpz1GvMt720eyJH1ckRHK1EDfpxISzJ7I9OYgaDtPE= -k8s.io/kube-openapi v0.0.0-20241105132330-32ad38e42d3f h1:GA7//TjRY9yWGy1poLzYYJJ4JRdzg3+O6e8I+e+8T5Y= -k8s.io/kube-openapi v0.0.0-20241105132330-32ad38e42d3f/go.mod h1:R/HEjbvWI0qdfb8viZUeVZm0X6IZnxAydC7YU42CMw4= -k8s.io/utils v0.0.0-20241104100929-3ea5e8cea738 h1:M3sRQVHv7vB20Xc2ybTt7ODCeFj6JSWYFzOFnYeS6Ro= -k8s.io/utils v0.0.0-20241104100929-3ea5e8cea738/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0= lukechampine.com/blake3 v1.4.1 h1:I3Smz7gso8w4/TunLKec6K2fn+kyKtDxr/xcQEN84Wg= lukechampine.com/blake3 v1.4.1/go.mod h1:QFosUxmjB8mnrWFSNwKmvxHpfY72bmD2tQ0kBMM3kwo= modernc.org/cc/v4 v4.27.1 h1:9W30zRlYrefrDV2JE2O8VDtJ1yPGownxciz5rrbQZis= @@ -2201,14 +1910,7 @@ pgregory.net/rapid v1.3.0/go.mod h1:dPlE4OBBxgXPqkP79flB6sJL1dx5azpI7HQ9MY9Z7uk= rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= -sigs.k8s.io/json v0.0.0-20241010143419-9aa6b5e7a4b3 h1:/Rv+M11QRah1itp8VhT6HoVx1Ray9eB4DBr+K+/sCJ8= -sigs.k8s.io/json v0.0.0-20241010143419-9aa6b5e7a4b3/go.mod h1:18nIHnGi6636UCz6m8i4DhaJ65T6EruyzmoQqI2BVDo= -sigs.k8s.io/structured-merge-diff/v4 v4.4.2 h1:MdmvkGuXi/8io6ixD5wud3vOLwc1rj0aNqRlpuvjmwA= -sigs.k8s.io/structured-merge-diff/v4 v4.4.2/go.mod h1:N8f93tFZh9U6vpxwRArLiikrE5/2tiu1w1AGfACIGE4= sigs.k8s.io/yaml v1.1.0/go.mod h1:UJmg0vDUVViEyp3mgSv9WPwZCDxu4rQW1olrI1uml+o= -sigs.k8s.io/yaml v1.4.0/go.mod h1:Ejl7/uTz7PSA4eKMyQCUTnhZYNmLIl+5c2lQPGR2BPY= sigs.k8s.io/yaml v1.6.0 h1:G8fkbMSAFqgEFgh4b1wmtzDnioxFCUgTZhlbj5P9QYs= sigs.k8s.io/yaml v1.6.0/go.mod h1:796bPqUfzR/0jLAl6XjHl3Ck7MiyVv8dbTdyT3/pMf4= sourcegraph.com/sourcegraph/appdash v0.0.0-20190731080439-ebfcffb1b5c0/go.mod h1:hI742Nqp5OhwiqlzhgfbWU4mW4yO10fP+LoT9WOswdU= -tags.cncf.io/container-device-interface v1.0.1 h1:KqQDr4vIlxwfYh0Ed/uJGVgX+CHAkahrgabg6Q8GYxc= -tags.cncf.io/container-device-interface v1.0.1/go.mod h1:JojJIOeW3hNbcnOH2q0NrWNha/JuHoDZcmYxAZwb2i0= diff --git a/e2e/interchaintestv8/types/besu_fixtures.go b/e2e/interchaintestv8/types/besu_fixtures.go index 60f99caf0..d2b6cf0d0 100644 --- a/e2e/interchaintestv8/types/besu_fixtures.go +++ b/e2e/interchaintestv8/types/besu_fixtures.go @@ -20,6 +20,8 @@ import ( "github.com/ethereum/go-ethereum/crypto" "github.com/ethereum/go-ethereum/rlp" + ibchostv2 "github.com/cosmos/ibc-go/v11/modules/core/24-host/v2" + "github.com/cosmos/solidity-ibc-eureka/packages/go-abigen/ics26router" "github.com/srdtrk/solidity-ibc-eureka/e2e/v8/ethereum" @@ -384,7 +386,7 @@ func buildMembershipFixture( proofHeight uint64, expectedTimestamp uint64, ) (besuProofFixture, error) { - path := packetCommitmentPath(packet) + path := ibchostv2.PacketCommitmentKey(packet.SourceClient, packet.Sequence) proofRLP, err := fetchStorageProof(ctx, chain, routerAddress, path, proofHeight) if err != nil { return besuProofFixture{}, err @@ -407,7 +409,7 @@ func buildNonMembershipFixture( proofHeight uint64, expectedTimestamp uint64, ) (besuProofFixture, error) { - path := packetReceiptCommitmentPath(packet) + path := ibchostv2.PacketReceiptKey(packet.DestClient, packet.Sequence) proofRLP, err := fetchStorageProof(ctx, chain, routerAddress, path, proofHeight) if err != nil { return besuProofFixture{}, err @@ -470,10 +472,7 @@ func fetchStorageProof( path []byte, height uint64, ) ([]byte, error) { - storageKey, err := evmICS26CommitmentStorageKey(path) - if err != nil { - return nil, err - } + storageKey := ethereum.GetCommitmentsStorageKey(path) proof, err := chain.GetProof(ctx, routerAddress, []string{storageKey.Hex()}, fmt.Sprintf("0x%x", height)) if err != nil { return nil, fmt.Errorf("fetch storage proof at height %d: %w", height, err) @@ -496,33 +495,6 @@ func encodeProofNodes(nodes []string) ([]byte, error) { return rlp.EncodeToBytes(rawNodes) } -func evmICS26CommitmentStorageKey(path []byte) (ethcommon.Hash, error) { - slotHex := strings.TrimPrefix(testvalues.IbcCommitmentSlotHex, "0x") - slot, err := hex.DecodeString(slotHex) - if err != nil { - return ethcommon.Hash{}, fmt.Errorf("decode IBC commitment slot: %w", err) - } - if len(slot) != 32 { - return ethcommon.Hash{}, fmt.Errorf("invalid IBC commitment slot length: %d", len(slot)) - } - pathHash := crypto.Keccak256(path) - return crypto.Keccak256Hash(pathHash, slot), nil -} - -func packetCommitmentPath(packet ics26router.IICS26RouterMsgsPacket) []byte { - path := make([]byte, 0, len(packet.SourceClient)+1+8) - path = append(path, []byte(packet.SourceClient)...) - path = append(path, 1) - return appendUint64(path, packet.Sequence) -} - -func packetReceiptCommitmentPath(packet ics26router.IICS26RouterMsgsPacket) []byte { - path := make([]byte, 0, len(packet.DestClient)+1+8) - path = append(path, []byte(packet.DestClient)...) - path = append(path, 2) - return appendUint64(path, packet.Sequence) -} - func packetCommitment(packet ics26router.IICS26RouterMsgsPacket) []byte { destHash := sha256.Sum256([]byte(packet.DestClient)) timeoutBytes := make([]byte, 8) @@ -566,12 +538,6 @@ func sha256Bytes(input []byte) []byte { return sum[:] } -func appendUint64(dst []byte, value uint64) []byte { - var buf [8]byte - binary.BigEndian.PutUint64(buf[:], value) - return append(dst, buf[:]...) -} - func decodeMutableQBFTHeader(headerRLP []byte) (*mutableQBFTHeader, error) { var items []rlp.RawValue if err := rlp.DecodeBytes(headerRLP, &items); err != nil { diff --git a/e2e/interchaintestv8/types/besu_fixtures_test.go b/e2e/interchaintestv8/types/besu_fixtures_test.go new file mode 100644 index 000000000..4a5c470ba --- /dev/null +++ b/e2e/interchaintestv8/types/besu_fixtures_test.go @@ -0,0 +1,40 @@ +// SPDX-License-Identifier: Apache-2.0 + +package types + +import ( + "encoding/hex" + "testing" + + transfertypes "github.com/cosmos/ibc-go/v11/modules/apps/transfer/types" + + "github.com/cosmos/solidity-ibc-eureka/packages/go-abigen/ics26router" +) + +func TestPacketCommitment(t *testing.T) { + packetData := transfertypes.NewFungibleTokenPacketData("uatom", "1000000", "sender", "receiver", "memo") + value, err := transfertypes.EncodeABIFungibleTokenPacketData(&packetData) + if err != nil { + t.Fatal(err) + } + + packet := ics26router.IICS26RouterMsgsPacket{ + Sequence: 1, + SourceClient: "channel-0", + DestClient: "channel-1", + TimeoutTimestamp: 100, + Payloads: []ics26router.IICS26RouterMsgsPayload{{ + SourcePort: transfertypes.PortID, + DestPort: transfertypes.PortID, + Version: transfertypes.V1, + Encoding: transfertypes.EncodingABI, + Value: value, + }}, + } + + // Golden vector shared with ibc-solidity/test/solidity-ibc/ICS24HostTest.t.sol. + const expected = "b691a1950f6fb0bbbcf4bdb16fe2c4d0aa7ef783eb7803073f475cb8164d9b7a" + if actual := hex.EncodeToString(packetCommitment(packet)); actual != expected { + t.Fatalf("packet commitment: got %s, want %s", actual, expected) + } +} From 4bea83a307263c7bbed0ff80e2c420730316b39e Mon Sep 17 00:00:00 2001 From: Gjermund Garaba Date: Fri, 21 Aug 2026 19:12:30 +0200 Subject: [PATCH 08/22] refactor(besu): reuse dependency helpers Use op-geth for EIP-1186 proofs and receipt polling, and OpenZeppelin for RLP encoding. Signed-off-by: Gjermund Garaba --- e2e/interchaintestv8/besu_qbft_test.go | 3 +- e2e/interchaintestv8/chainconfig/besu_qbft.go | 26 ++-------- e2e/interchaintestv8/ethereum/proof.go | 36 ------------- e2e/interchaintestv8/go.mod | 3 ++ e2e/interchaintestv8/go.sum | 30 ++++++++++- e2e/interchaintestv8/types/besu_fixtures.go | 11 ++-- .../besu/BesuIBFT2LightClient.sol | 8 +-- .../besu/BesuLightClientBase.sol | 52 ------------------- .../besu/BesuQBFTLightClient.sol | 8 +-- 9 files changed, 54 insertions(+), 123 deletions(-) delete mode 100644 e2e/interchaintestv8/ethereum/proof.go diff --git a/e2e/interchaintestv8/besu_qbft_test.go b/e2e/interchaintestv8/besu_qbft_test.go index daa132e7e..95612db3f 100644 --- a/e2e/interchaintestv8/besu_qbft_test.go +++ b/e2e/interchaintestv8/besu_qbft_test.go @@ -10,6 +10,7 @@ import ( "github.com/stretchr/testify/require" ethcommon "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/ethclient/gethclient" interchaintest "github.com/cosmos/interchaintest/v11" @@ -70,7 +71,7 @@ func TestBesuQBFTChainBringUpAndDeploy(t *testing.T) { require.NotEmpty(t, contracts.Ics20Transfer) require.NotEmpty(t, contracts.Erc20) - proof, err := eth.GetProof(ctx, ethcommon.HexToAddress(contracts.Ics26Router), nil, "latest") + proof, err := gethclient.New(eth.RPCClient.Client()).GetProof(ctx, ethcommon.HexToAddress(contracts.Ics26Router), nil, nil) require.NoError(t, err) require.NotEmpty(t, proof.AccountProof) } diff --git a/e2e/interchaintestv8/chainconfig/besu_qbft.go b/e2e/interchaintestv8/chainconfig/besu_qbft.go index bb8938474..051263a62 100644 --- a/e2e/interchaintestv8/chainconfig/besu_qbft.go +++ b/e2e/interchaintestv8/chainconfig/besu_qbft.go @@ -19,6 +19,7 @@ import ( dockernetwork "github.com/docker/docker/api/types/network" dockerclient "github.com/moby/moby/client" + "github.com/ethereum/go-ethereum/accounts/abi/bind" "github.com/ethereum/go-ethereum/common" ethtypes "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/crypto" @@ -346,7 +347,9 @@ func waitForBesuQBFTTransactionHandling(ctx context.Context, rpcURL string, key return false, nil } - receipt, err := waitForBesuQBFTProbeReceipt(ctx, client, txHash) + receiptCtx, cancel := context.WithTimeout(ctx, besuQBFTTxProbeReceiptTimeout) + receipt, err := bind.WaitMinedHash(receiptCtx, client, txHash) + cancel() if err != nil { lastErr = err return false, nil @@ -396,24 +399,3 @@ func sendBesuQBFTProbeTx(ctx context.Context, client *ethclient.Client, key *ecd return signedTx.Hash(), nil } - -func waitForBesuQBFTProbeReceipt(ctx context.Context, client *ethclient.Client, txHash common.Hash) (*ethtypes.Receipt, error) { - receiptCtx, cancel := context.WithTimeout(ctx, besuQBFTTxProbeReceiptTimeout) - defer cancel() - - ticker := time.NewTicker(time.Second) - defer ticker.Stop() - - for { - receipt, err := client.TransactionReceipt(receiptCtx, txHash) - if err == nil && receipt != nil { - return receipt, nil - } - - select { - case <-receiptCtx.Done(): - return nil, receiptCtx.Err() - case <-ticker.C: - } - } -} diff --git a/e2e/interchaintestv8/ethereum/proof.go b/e2e/interchaintestv8/ethereum/proof.go deleted file mode 100644 index daad149e4..000000000 --- a/e2e/interchaintestv8/ethereum/proof.go +++ /dev/null @@ -1,36 +0,0 @@ -// SPDX-License-Identifier: Apache-2.0 - -package ethereum - -import ( - "context" - - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/common/hexutil" -) - -type StorageProof struct { - Key string `json:"key"` - Value *hexutil.Big `json:"value"` - Proof []string `json:"proof"` -} - -type AccountProof struct { - Address common.Address `json:"address"` - AccountProof []string `json:"accountProof"` - Balance *hexutil.Big `json:"balance"` - CodeHash common.Hash `json:"codeHash"` - Nonce hexutil.Uint64 `json:"nonce"` - StorageHash common.Hash `json:"storageHash"` - StorageProof []StorageProof `json:"storageProof"` -} - -func (e *Ethereum) GetProof(ctx context.Context, address common.Address, storageKeys []string, block string) (AccountProof, error) { - if storageKeys == nil { - storageKeys = []string{} - } - - var proof AccountProof - err := e.RPCClient.Client().CallContext(ctx, &proof, "eth_getProof", address, storageKeys, block) - return proof, err -} diff --git a/e2e/interchaintestv8/go.mod b/e2e/interchaintestv8/go.mod index 0d30cf0ea..d5a7d2de9 100644 --- a/e2e/interchaintestv8/go.mod +++ b/e2e/interchaintestv8/go.mod @@ -293,6 +293,7 @@ require ( github.com/petermattis/goid v0.0.0-20260330135022-df67b199bc81 // indirect github.com/pierrec/lz4/v4 v4.1.22 // indirect github.com/pion/datachannel v1.5.10 // indirect + github.com/pion/dtls/v2 v2.2.12 // indirect github.com/pion/dtls/v3 v3.1.2 // indirect github.com/pion/ice/v4 v4.0.10 // indirect github.com/pion/interceptor v0.1.40 // indirect @@ -304,7 +305,9 @@ require ( github.com/pion/sctp v1.8.39 // indirect github.com/pion/sdp/v3 v3.0.18 // indirect github.com/pion/srtp/v3 v3.0.6 // indirect + github.com/pion/stun/v2 v2.0.0 // indirect github.com/pion/stun/v3 v3.1.2 // indirect + github.com/pion/transport/v2 v2.2.10 // indirect github.com/pion/transport/v3 v3.0.7 // indirect github.com/pion/transport/v4 v4.0.1 // indirect github.com/pion/turn/v4 v4.0.2 // indirect diff --git a/e2e/interchaintestv8/go.sum b/e2e/interchaintestv8/go.sum index 3978b29dc..d58569efa 100644 --- a/e2e/interchaintestv8/go.sum +++ b/e2e/interchaintestv8/go.sum @@ -1057,6 +1057,7 @@ github.com/pingcap/errors v0.11.4 h1:lFuQV/oaUMGcD2tqt+01ROSmJs75VG1ToEOkZIZ4nE4 github.com/pingcap/errors v0.11.4/go.mod h1:Oi8TUi2kEtXXLMJk9l1cGmz20kV3TaQ0usTwv5KuLY8= github.com/pion/datachannel v1.5.10 h1:ly0Q26K1i6ZkGf42W7D4hQYR90pZwzFOjTq5AuCKk4o= github.com/pion/datachannel v1.5.10/go.mod h1:p/jJfC9arb29W7WrxyKbepTU20CFgyx5oLo8Rs4Py/M= +github.com/pion/dtls/v2 v2.2.7/go.mod h1:8WiMkebSHFD0T+dIU+UeBaoV7kDhOW5oDCzZ7WZ/F9s= github.com/pion/dtls/v2 v2.2.12 h1:KP7H5/c1EiVAAKUmXyCzPiQe5+bCJrpOeKg/L05dunk= github.com/pion/dtls/v2 v2.2.12/go.mod h1:d9SYc9fch0CqK90mRk1dC7AkzzpwJj6u2GU3u+9pqFE= github.com/pion/dtls/v3 v3.1.2 h1:gqEdOUXLtCGW+afsBLO0LtDD8GnuBBjEy6HRtyofZTc= @@ -1065,6 +1066,7 @@ github.com/pion/ice/v4 v4.0.10 h1:P59w1iauC/wPk9PdY8Vjl4fOFL5B+USq1+xbDcN6gT4= github.com/pion/ice/v4 v4.0.10/go.mod h1:y3M18aPhIxLlcO/4dn9X8LzLLSma84cx6emMSu14FGw= github.com/pion/interceptor v0.1.40 h1:e0BjnPcGpr2CFQgKhrQisBU7V3GXK6wrfYrGYaU6Jq4= github.com/pion/interceptor v0.1.40/go.mod h1:Z6kqH7M/FYirg3frjGJ21VLSRJGBXB/KqaTIrdqnOic= +github.com/pion/logging v0.2.2/go.mod h1:k0/tDVsRCX2Mb2ZEmTqNa7CWsQPc+YYCB7Q+5pahoms= github.com/pion/logging v0.2.4 h1:tTew+7cmQ+Mc1pTBLKH2puKsOvhm32dROumOZ655zB8= github.com/pion/logging v0.2.4/go.mod h1:DffhXTKYdNZU+KtJ5pyQDjvOAh/GsNSyv1lbkFbe3so= github.com/pion/mdns/v2 v2.0.7 h1:c9kM8ewCgjslaAmicYMFQIde2H9/lrZpjBkN8VwoVtM= @@ -1081,13 +1083,15 @@ github.com/pion/sdp/v3 v3.0.18 h1:l0bAXazKHpepazVdp+tPYnrsy9dfh7ZbT8DxesH5ZnI= github.com/pion/sdp/v3 v3.0.18/go.mod h1:ZREGo6A9ZygQ9XkqAj5xYCQtQpif0i6Pa81HOiAdqQ8= github.com/pion/srtp/v3 v3.0.6 h1:E2gyj1f5X10sB/qILUGIkL4C2CqK269Xq167PbGCc/4= github.com/pion/srtp/v3 v3.0.6/go.mod h1:BxvziG3v/armJHAaJ87euvkhHqWe9I7iiOy50K2QkhY= -github.com/pion/stun v0.6.1 h1:8lp6YejULeHBF8NmV8e2787BogQhduZugh5PdhDyyN4= github.com/pion/stun/v2 v2.0.0 h1:A5+wXKLAypxQri59+tmQKVs7+l6mMM+3d+eER9ifRU0= github.com/pion/stun/v2 v2.0.0/go.mod h1:22qRSh08fSEttYUmJZGlriq9+03jtVmXNODgLccj8GQ= github.com/pion/stun/v3 v3.1.2 h1:86IhD8wFn6IDW4b1/0QzoQS+f5PeA8OHHRn8UZW5ErY= github.com/pion/stun/v3 v3.1.2/go.mod h1:H7gDic7nNwlUL05pbs6T1dtaBehh/KjupxfWw3ZI7cA= +github.com/pion/transport/v2 v2.2.1/go.mod h1:cXXWavvCnFF6McHTft3DWS9iic2Mftcz1Aq29pGcU5g= +github.com/pion/transport/v2 v2.2.4/go.mod h1:q2U/tf9FEfnSBGSW6w5Qp5PFWRLRj3NjLhCCgpRK4p0= github.com/pion/transport/v2 v2.2.10 h1:ucLBLE8nuxiHfvkFKnkDQRYWYfp8ejf4YBOPfaQpw6Q= github.com/pion/transport/v2 v2.2.10/go.mod h1:sq1kSLWs+cHW9E+2fJP95QudkzbK7wscs8yYgQToO5E= +github.com/pion/transport/v3 v3.0.1/go.mod h1:UY7kiITrlMv7/IKgd5eTUcaahZx5oUN3l9SzK5f5xE0= github.com/pion/transport/v3 v3.0.7 h1:iRbMH05BzSNwhILHoBoAPxoB9xQgOaJk+591KC9P1o0= github.com/pion/transport/v3 v3.0.7/go.mod h1:YleKiTZ4vqNxVwh77Z0zytYi7rXHl7j6uPLGhhz9rwo= github.com/pion/transport/v4 v4.0.1 h1:sdROELU6BZ63Ab7FrOLn13M6YdJLY20wldXW2Cu2k8o= @@ -1268,6 +1272,7 @@ github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/ github.com/stretchr/testify v1.7.2/go.mod h1:R6va5+xMeoiuVRoj+gSkQ7d3FALtqAAGI1FQKckRals= github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= +github.com/stretchr/testify v1.8.3/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= github.com/stretchr/testify v1.12.1 h1:EuwCh5fleGS7H32xRwO3wRGT7DxrDhLAT6FF8MpWDWE= @@ -1318,6 +1323,7 @@ github.com/urfave/cli/v2 v2.27.6/go.mod h1:3Sevf16NykTbInEnD0yKkjDAeZDS0A6bzhBH5 github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= github.com/valyala/fasttemplate v1.0.1/go.mod h1:UQGH1tvbgY+Nz5t2n7tXsz52dQxojPUpymEIMZ47gx8= github.com/valyala/fasttemplate v1.2.1/go.mod h1:KHLXt3tVN2HBp8eijSv/kGJopbvo7S+qRAEEKiv+SiQ= +github.com/wlynxg/anet v0.0.3/go.mod h1:eay5PRQr7fIVAMbTbchTnO9gG65Hg/uYGdc7mguHxoA= github.com/wlynxg/anet v0.0.5 h1:J3VJGi1gvo0JwZ/P1/Yc/8p63SoW98B5dHkYDmpgvvU= github.com/wlynxg/anet v0.0.5/go.mod h1:eay5PRQr7fIVAMbTbchTnO9gG65Hg/uYGdc7mguHxoA= github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= @@ -1480,6 +1486,9 @@ golang.org/x/crypto v0.0.0-20201221181555-eec23a3978ad/go.mod h1:jdWPYTVW3xRLrWP golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20220214200702-86341886e292/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= +golang.org/x/crypto v0.8.0/go.mod h1:mRqEX+O9/h5TFCrQhkgjo2yKi0yYA+9ecGkdQoHrywE= +golang.org/x/crypto v0.12.0/go.mod h1:NF0Gs7EO5K4qLn+Ylc+fih8BSTeIjAP05siRnAh98yw= +golang.org/x/crypto v0.18.0/go.mod h1:R0j02AL6hcrfOiy9T4ZYp/rcWeMxM3L6QYxlOuEG1mg= golang.org/x/crypto v0.54.0 h1:YLIA59K4fiNzHzjnZt2tUJQjQtUWfWbeHBqKtk3eScw= golang.org/x/crypto v0.54.0/go.mod h1:KWL8ny2AZdGR2cWmzeHrp2azQPGogOv+HeQaVEXC2dk= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= @@ -1517,6 +1526,7 @@ golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= +golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/mod v0.37.0 h1:vF1DjpVEshcIqoEaauuHebaLk1O1forxjxBaVn884JQ= golang.org/x/mod v0.37.0/go.mod h1:m8S8VeM9r4dzDwjrKO0a1sZP3YjeMamRRlD+fmR2Q/0= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -1559,7 +1569,12 @@ golang.org/x/net v0.0.0-20210805182204-aaa1db679c0d/go.mod h1:9nx3DQGgdP8bBQD5qx golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= +golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= golang.org/x/net v0.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= +golang.org/x/net v0.9.0/go.mod h1:d48xBJpPfHeWQsugry2m+kC02ZBRGRgulfHnEXEuWns= +golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= +golang.org/x/net v0.14.0/go.mod h1:PpSgVXXLK0OxS0F31C1/tv6XNguvCrnXIDrFMspZIUI= +golang.org/x/net v0.20.0/go.mod h1:z8BVo6PvndSri0LbOE3hAn0apkU+1YvI6E70E9jsnvY= golang.org/x/net v0.57.0 h1:K5+3DljvIuDG9/Jv9rvyMywYNFCQ9RSUY6OOTTkT+tE= golang.org/x/net v0.57.0/go.mod h1:KpXc8iv+r3XplLAG/f7Jsf9RPszJzdR0f58q9vGOuEU= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= @@ -1580,6 +1595,7 @@ golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.22.0 h1:SZjpbeLmrCk4xhRSZFNZW5gFUeCeFgjekvI/+gfScek= golang.org/x/sync v0.22.0/go.mod h1:9xrNwdLfx4jkKbNva9FpL6vEN7evnE43NNNJQ2LF3+0= golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -1650,6 +1666,10 @@ golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.7.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.16.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/sys v0.21.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/sys v0.47.0 h1:o7XGOvZQCADBQQ4Y7VNq2dRWQR7JmOUW8Kxx4ZsNgWs= golang.org/x/sys v0.47.0/go.mod h1:4GL1E5IUh+htKOUEOaiffhrAeqysfVGipDYzABqnCmw= @@ -1660,6 +1680,10 @@ golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9sn golang.org/x/term v0.0.0-20201210144234-2321bbc49cbf/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= +golang.org/x/term v0.7.0/go.mod h1:P32HKFT3hSsZrRxla30E9HqToFYAQPCMs/zFMBUFqPY= +golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo= +golang.org/x/term v0.11.0/go.mod h1:zC9APTIj3jG3FdV/Ons+XE1riIZXG4aZ4GTHiPZJPIU= +golang.org/x/term v0.16.0/go.mod h1:yn7UURbUtPyrVJPGPq404EukNFxcm/foM+bV/bfcDsY= golang.org/x/term v0.45.0 h1:NwWyBmoJCbfTHpxrWoZ9C6/VxOf7ic219I8xZZFdrf0= golang.org/x/term v0.45.0/go.mod h1:9aqxs0blBcrm/n0L9QW0aRVD+ktan8ssZromtqJC43w= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -1671,6 +1695,9 @@ golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= +golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= +golang.org/x/text v0.12.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= +golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= golang.org/x/text v0.40.0 h1:Ub2Z6/xjgF1WrYQz2nuITOEegKFtiIy+rieRJ5lHZKs= golang.org/x/text v0.40.0/go.mod h1:hpnzDAfGV753zIKo+wk3u1bVKCGPbrnF7+7LBF/UHVY= golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= @@ -1724,6 +1751,7 @@ golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roY golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= +golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= golang.org/x/tools v0.47.0 h1:7Kn5x/d1svx/PzryTsqeoZN4TZwqeH5pGWjefhLi/1Q= golang.org/x/tools v0.47.0/go.mod h1:dFHnyTvFWY212G+h7ZY4Vsp/K3U4/7W9TyVaAul8uCA= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= diff --git a/e2e/interchaintestv8/types/besu_fixtures.go b/e2e/interchaintestv8/types/besu_fixtures.go index d2b6cf0d0..e1aa9f138 100644 --- a/e2e/interchaintestv8/types/besu_fixtures.go +++ b/e2e/interchaintestv8/types/besu_fixtures.go @@ -18,6 +18,7 @@ import ( ethcommon "github.com/ethereum/go-ethereum/common" gethtypes "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/crypto" + "github.com/ethereum/go-ethereum/ethclient/gethclient" "github.com/ethereum/go-ethereum/rlp" ibchostv2 "github.com/cosmos/ibc-go/v11/modules/core/24-host/v2" @@ -453,14 +454,14 @@ func fetchAccountProof( chain *ethereum.Ethereum, routerAddress ethcommon.Address, height uint64, -) (ethereum.AccountProof, []byte, error) { - proof, err := chain.GetProof(ctx, routerAddress, nil, fmt.Sprintf("0x%x", height)) +) (*gethclient.AccountResult, []byte, error) { + proof, err := gethclient.New(chain.RPCClient.Client()).GetProof(ctx, routerAddress, nil, newUint64(height)) if err != nil { - return ethereum.AccountProof{}, nil, fmt.Errorf("fetch account proof at height %d: %w", height, err) + return nil, nil, fmt.Errorf("fetch account proof at height %d: %w", height, err) } proofRLP, err := encodeProofNodes(proof.AccountProof) if err != nil { - return ethereum.AccountProof{}, nil, fmt.Errorf("encode account proof at height %d: %w", height, err) + return nil, nil, fmt.Errorf("encode account proof at height %d: %w", height, err) } return proof, proofRLP, nil } @@ -473,7 +474,7 @@ func fetchStorageProof( height uint64, ) ([]byte, error) { storageKey := ethereum.GetCommitmentsStorageKey(path) - proof, err := chain.GetProof(ctx, routerAddress, []string{storageKey.Hex()}, fmt.Sprintf("0x%x", height)) + proof, err := gethclient.New(chain.RPCClient.Client()).GetProof(ctx, routerAddress, []string{storageKey.Hex()}, newUint64(height)) if err != nil { return nil, fmt.Errorf("fetch storage proof at height %d: %w", height, err) } diff --git a/ibc-solidity/contracts/light-clients/besu/BesuIBFT2LightClient.sol b/ibc-solidity/contracts/light-clients/besu/BesuIBFT2LightClient.sol index 16a0307eb..f0af3c454 100644 --- a/ibc-solidity/contracts/light-clients/besu/BesuIBFT2LightClient.sol +++ b/ibc-solidity/contracts/light-clients/besu/BesuIBFT2LightClient.sol @@ -1,6 +1,8 @@ // SPDX-License-Identifier: Apache-2.0 pragma solidity ^0.8.28; +import { RLP } from "@openzeppelin-contracts/utils/RLP.sol"; + import { BesuLightClientBase } from "./BesuLightClientBase.sol"; /// @title Besu IBFT2 Light Client @@ -45,11 +47,11 @@ contract BesuIBFT2LightClient is BesuLightClientBase { extraItems[2] = _rlpItemBytes(header.extraDataItems[2]); extraItems[3] = _rlpItemBytes(header.extraDataItems[3]); - bytes memory signingExtraData = _encodeRlpList(extraItems); + bytes memory signingExtraData = RLP.encode(extraItems); bytes[] memory headerItems = new bytes[](header.headerItems.length); for (uint256 i = 0; i < header.headerItems.length; ++i) { - headerItems[i] = i == 12 ? _encodeRlpBytes(signingExtraData) : _rlpItemBytes(header.headerItems[i]); + headerItems[i] = i == 12 ? RLP.encode(signingExtraData) : _rlpItemBytes(header.headerItems[i]); } - return keccak256(_encodeRlpList(headerItems)); + return keccak256(RLP.encode(headerItems)); } } diff --git a/ibc-solidity/contracts/light-clients/besu/BesuLightClientBase.sol b/ibc-solidity/contracts/light-clients/besu/BesuLightClientBase.sol index 2d2a164eb..ba20ce588 100644 --- a/ibc-solidity/contracts/light-clients/besu/BesuLightClientBase.sol +++ b/ibc-solidity/contracts/light-clients/besu/BesuLightClientBase.sol @@ -498,58 +498,6 @@ abstract contract BesuLightClientBase is ILightClient, IBesuLightClientErrors, I return item.toRlpBytes(); } - /// @notice Encodes raw bytes as an RLP string. - /// @param raw Raw bytes to encode. - /// @return The RLP-encoded string. - function _encodeRlpBytes(bytes memory raw) internal pure returns (bytes memory) { - if (raw.length == 1 && uint8(raw[0]) < 0x80) { - return raw; - } - if (raw.length < 56) { - return abi.encodePacked(bytes1(uint8(0x80 + raw.length)), raw); - } - - bytes memory lenBytes = _encodeLength(raw.length); - return abi.encodePacked(bytes1(uint8(0xb7 + lenBytes.length)), lenBytes, raw); - } - - /// @notice Encodes pre-encoded RLP items as an RLP list. - /// @param items RLP-encoded list items. - /// @return The RLP-encoded list. - function _encodeRlpList(bytes[] memory items) internal pure returns (bytes memory) { - bytes memory payload = new bytes(0); - for (uint256 i = 0; i < items.length; ++i) { - payload = bytes.concat(payload, items[i]); - } - - if (payload.length < 56) { - return abi.encodePacked(bytes1(uint8(0xc0 + payload.length)), payload); - } - - bytes memory lenBytes = _encodeLength(payload.length); - return abi.encodePacked(bytes1(uint8(0xf7 + lenBytes.length)), lenBytes, payload); - } - - /// @notice Encodes an integer length as big-endian bytes. - /// @param value The length value. - /// @return The minimal big-endian representation. - function _encodeLength(uint256 value) internal pure returns (bytes memory) { - uint256 tmp = value; - uint256 length; - while (tmp != 0) { - ++length; - tmp >>= 8; - } - - bytes memory out = new bytes(length); - tmp = value; - for (uint256 i = length; i > 0; --i) { - out[i - 1] = bytes1(uint8(tmp)); - tmp >>= 8; - } - return out; - } - /// @notice Restricts access to proof submitters unless submission is open to anyone. modifier onlyProofSubmitter() { if (!hasRole(PROOF_SUBMITTER_ROLE, address(0))) { diff --git a/ibc-solidity/contracts/light-clients/besu/BesuQBFTLightClient.sol b/ibc-solidity/contracts/light-clients/besu/BesuQBFTLightClient.sol index bf6955694..5cef961a6 100644 --- a/ibc-solidity/contracts/light-clients/besu/BesuQBFTLightClient.sol +++ b/ibc-solidity/contracts/light-clients/besu/BesuQBFTLightClient.sol @@ -1,6 +1,8 @@ // SPDX-License-Identifier: Apache-2.0 pragma solidity ^0.8.28; +import { RLP } from "@openzeppelin-contracts/utils/RLP.sol"; + import { BesuLightClientBase } from "./BesuLightClientBase.sol"; /// @title Besu QBFT Light Client @@ -46,11 +48,11 @@ contract BesuQBFTLightClient is BesuLightClientBase { extraItems[3] = _rlpItemBytes(header.extraDataItems[3]); extraItems[4] = hex"c0"; - bytes memory signingExtraData = _encodeRlpList(extraItems); + bytes memory signingExtraData = RLP.encode(extraItems); bytes[] memory headerItems = new bytes[](header.headerItems.length); for (uint256 i = 0; i < header.headerItems.length; ++i) { - headerItems[i] = i == 12 ? _encodeRlpBytes(signingExtraData) : _rlpItemBytes(header.headerItems[i]); + headerItems[i] = i == 12 ? RLP.encode(signingExtraData) : _rlpItemBytes(header.headerItems[i]); } - return keccak256(_encodeRlpList(headerItems)); + return keccak256(RLP.encode(headerItems)); } } From 011043622ca84e0dfabcf9919dd80dd41650d0c4 Mon Sep 17 00:00:00 2001 From: Gjermund Garaba Date: Sat, 22 Aug 2026 19:03:11 +0200 Subject: [PATCH 09/22] refactor: extract dummy client msgs and simplify proof-api config Signed-off-by: Gjermund Garaba --- .github/workflows/abigen.yaml | 18 +- AGENTS.md | 14 +- e2e/interchaintestv8/besu_to_besu_test.go | 48 ++- e2e/interchaintestv8/chainconfig/besu_qbft.go | 67 ++-- e2e/interchaintestv8/e2esuite/config.go | 24 +- e2e/interchaintestv8/e2esuite/config_test.go | 47 ++- .../e2esuite/setup_ethereum.go | 10 +- e2e/interchaintestv8/e2esuite/suite.go | 13 +- e2e/interchaintestv8/ethereum/ethereum.go | 24 +- .../ethereum/ethereum_test.go | 66 ++++ e2e/interchaintestv8/ethereum/utils_test.go | 126 +------- e2e/interchaintestv8/proofapi/builder.go | 1 - e2e/interchaintestv8/proofapi/builder_test.go | 39 +-- e2e/interchaintestv8/proofapi/config.go | 38 +-- e2e/interchaintestv8/proofapi/config.tmpl | 18 -- e2e/interchaintestv8/proofapi/config_test.go | 29 ++ e2e/interchaintestv8/types/besu_fixtures.go | 118 ++++--- .../types/besu_fixtures_test.go | 93 ++++++ ibc-solana/AGENTS.md | 20 +- .../abi/bytecode/AttestationLightClient.json | 2 +- .../abi/bytecode/BesuIBFT2LightClient.json | 2 +- .../abi/bytecode/BesuQBFTLightClient.json | 2 +- .../CosmosIFTSendCallConstructor.json | 1 - .../abi/bytecode/DummyLightClient.json | 2 +- .../abi/bytecode/SP1ICS07Tendermint.json | 2 +- .../besu/BesuLightClientBase.sol | 3 + .../light-clients/besu/RLPReader.sol | 88 +----- .../light-clients/dummy/DummyLightClient.sol | 29 +- .../contracts/light-clients/dummy/README.md | 2 +- .../dummy/msgs/IDummyLightClientMsgs.sol | 34 ++ ibc-solidity/solidity.just | 18 +- .../test/besu-bft/BesuLightClientTestBase.sol | 67 +++- ibc-solidity/test/besu-bft/fixtures/qbft.json | 94 +++--- .../test/dummy-lc/DummyLightClientTest.t.sol | 11 +- .../proof-api/modules/besu-to-besu/src/lib.rs | 31 +- .../modules/besu-to-besu/src/tx_builder.rs | 292 +++++++++++------- .../modules/evmdummy-to-evmdummy/src/lib.rs | 30 +- .../evmdummy-to-evmdummy/src/tx_builder.rs | 50 +-- packages/solidity/src/dummy.rs | 29 +- packages/solidity/src/ics26.rs | 40 ++- programs/proof-api/README.md | 4 +- programs/proof-api/config.example.json | 3 +- 42 files changed, 864 insertions(+), 785 deletions(-) create mode 100644 e2e/interchaintestv8/ethereum/ethereum_test.go delete mode 100644 e2e/interchaintestv8/proofapi/config.tmpl create mode 100644 e2e/interchaintestv8/proofapi/config_test.go delete mode 100644 ibc-solidity/abi/bytecode/CosmosIFTSendCallConstructor.json create mode 100644 ibc-solidity/contracts/light-clients/dummy/msgs/IDummyLightClientMsgs.sol diff --git a/.github/workflows/abigen.yaml b/.github/workflows/abigen.yaml index b9a942eeb..1d3f1b4f2 100644 --- a/.github/workflows/abigen.yaml +++ b/.github/workflows/abigen.yaml @@ -9,7 +9,9 @@ on: pull_request: paths: - 'ibc-solidity/abi/**' + - 'ibc-solidity/solidity.just' - 'packages/go-abigen/**' + - 'e2e/interchaintestv8/types/erc20/**' - '**.sol' - 'ibc-solidity/bun.lock' push: @@ -17,7 +19,11 @@ on: - main paths: - 'ibc-solidity/abi/**' + - 'ibc-solidity/solidity.just' - 'packages/go-abigen/**' + - 'e2e/interchaintestv8/types/erc20/**' + - '**.sol' + - 'ibc-solidity/bun.lock' jobs: check: @@ -38,16 +44,18 @@ jobs: - name: Install abigen run: go install github.com/ethereum/go-ethereum/cmd/abigen@be4dc0c4be2fe316dbdd0a73e48421f64978232f # v1.17.2 - - name: Run abigen + - name: Generate contract artifacts run: just solidity::generate-abi - - name: Check for diffs in go-abigen + - name: Check generated contract artifacts run: | - if ! git diff --quiet HEAD -- packages/go-abigen; then - echo "Git diff found in the selected directory. Failing the job." + if [ -n "$(git status --short --untracked-files=all -- ibc-solidity/abi packages/go-abigen e2e/interchaintestv8/types/erc20)" ]; then + echo "Generated contract artifacts are stale." + git status --short --untracked-files=all -- ibc-solidity/abi packages/go-abigen e2e/interchaintestv8/types/erc20 + git diff --stat -- ibc-solidity/abi packages/go-abigen e2e/interchaintestv8/types/erc20 exit 1 else - echo "No changes detected in the selected directory." + echo "Generated contract artifacts are current." fi golangci: diff --git a/AGENTS.md b/AGENTS.md index f948fab8d..d49ff44e6 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -5,19 +5,19 @@ This repo combines Solidity/Foundry contracts, a Rust workspace, Solana Anchor p Look here first: - `README.md` - `justfile` -- `foundry.toml` +- `ibc-solidity/foundry.toml` - `Cargo.toml` -- `contracts/README.md` +- `ibc-solidity/contracts/README.md` Use the smallest relevant validation from the repo root: -- Solidity: `just lint-solidity` and `just test-foundry` +- Solidity: `just solidity::lint-solidity` and `just solidity::test-foundry` - Rust workspace, relayer, operator, and shared packages: `just lint-rust` and `just test-cargo` - Broad cross-stack changes: `just lint` -- Solana or e2e changes: use the subtree-specific commands in `programs/solana/AGENTS.md` or `e2e/interchaintestv8/AGENTS.md` +- Solana or e2e changes: use the subtree-specific commands in `ibc-solana/AGENTS.md` or `e2e/interchaintestv8/AGENTS.md` Hard constraints: -- Do not hand-edit generated outputs in `packages/go-abigen/`, most of `packages/go-anchor/`, `e2e/interchaintestv8/solana/go-anchor/`, or protobuf outputs under `e2e/interchaintestv8/types/`; regenerate with `just generate-abi`, `just generate-solana-types`, or `just generate-buf`. +- Do not hand-edit generated outputs in `packages/go-abigen/`, most of `packages/go-anchor/`, `e2e/interchaintestv8/solana/go-anchor/`, or protobuf outputs under `e2e/interchaintestv8/types/`; regenerate with `just solidity::generate-abi`, `just solana::generate-solana-types`, or `just generate-buf`. - `packages/go-anchor/ics07_tendermint_patches/` is the hand-maintained exception inside `packages/go-anchor/`; preserve it across regeneration. -- If Solidity interfaces, ABI-exposed structs, or contract types change, run `just generate-abi` before validating Go or e2e code. -- If Solana program interfaces or IDLs change, run `just generate-solana-types`. +- If Solidity interfaces, ABI-exposed structs, or contract types change, run `just solidity::generate-abi` before validating Go or e2e code. +- If Solana program interfaces or IDLs change, run `just solana::generate-solana-types`. - If `.proto` files change, run `just generate-buf`. diff --git a/e2e/interchaintestv8/besu_to_besu_test.go b/e2e/interchaintestv8/besu_to_besu_test.go index ed34ff939..bd540f42c 100644 --- a/e2e/interchaintestv8/besu_to_besu_test.go +++ b/e2e/interchaintestv8/besu_to_besu_test.go @@ -81,13 +81,29 @@ func TestWithBesuToBesuTestSuite(t *testing.T) { } func (s *BesuToBesuTestSuite) SetupSuite() { - ctx := context.Background() - setupComplete := false s.T().Cleanup(func() { - if !setupComplete { - s.TearDownSuite() + ctx := context.Background() + + if s.T() != nil && s.T().Failed() { + _ = s.chainA.network.DumpLogs(ctx) + _ = s.chainB.network.DumpLogs(ctx) + } + + if s.relayerProcess != nil { + _ = s.relayerProcess.Kill() + } + if s.relayerConfigPath != "" { + _ = os.Remove(s.relayerConfigPath) + } + + s.chainB.network.Destroy(ctx) + s.chainA.network.Destroy(ctx) + + if s.cwd != "" { + _ = os.Chdir(s.cwd) } }) + ctx := context.Background() if os.Getenv(testvalues.EnvKeyRustLog) == "" { os.Setenv(testvalues.EnvKeyRustLog, testvalues.EnvValueRustLog_Info) @@ -125,30 +141,6 @@ func (s *BesuToBesuTestSuite) SetupSuite() { s.createAndRegisterBesuClient(&s.chainB, &s.chainA, besuToBesuClientOnA, besuToBesuClientOnB) s.createAndRegisterBesuClient(&s.chainA, &s.chainB, besuToBesuClientOnB, besuToBesuClientOnA) - setupComplete = true -} - -func (s *BesuToBesuTestSuite) TearDownSuite() { - ctx := context.Background() - - if s.T() != nil && s.T().Failed() { - _ = s.chainA.network.DumpLogs(ctx) - _ = s.chainB.network.DumpLogs(ctx) - } - - if s.relayerProcess != nil { - _ = s.relayerProcess.Kill() - } - if s.relayerConfigPath != "" { - _ = os.Remove(s.relayerConfigPath) - } - - s.chainB.network.Destroy(ctx) - s.chainA.network.Destroy(ctx) - - if s.cwd != "" { - _ = os.Chdir(s.cwd) - } } func (s *BesuToBesuTestSuite) Test_Deploy() { diff --git a/e2e/interchaintestv8/chainconfig/besu_qbft.go b/e2e/interchaintestv8/chainconfig/besu_qbft.go index 051263a62..833d90a26 100644 --- a/e2e/interchaintestv8/chainconfig/besu_qbft.go +++ b/e2e/interchaintestv8/chainconfig/besu_qbft.go @@ -37,7 +37,6 @@ const ( defaultBesuQBFTSubnet = "10.42.0.0/16" defaultBesuQBFTGateway = "10.42.0.1" - besuQBFTReadyStableBlocks = 6 besuQBFTTxProbeReceiptTimeout = 30 * time.Second ) @@ -263,66 +262,46 @@ func patchBesuQBFTCompose(path string, params BesuQBFTParams) error { } func waitForBesuQBFTReady(ctx context.Context, rpcURL string) error { - var ( - stableStartBlock uint64 - lastErr error - ) - - err := testutil.WaitForCondition(3*time.Minute, 2*time.Second, func() (bool, error) { - client, err := ethclient.DialContext(ctx, rpcURL) - if err != nil { - lastErr = err - return false, nil - } - defer client.Close() - - syncProgress, err := client.SyncProgress(ctx) - if err != nil { - lastErr = err - stableStartBlock = 0 - return false, nil - } - if syncProgress != nil { - stableStartBlock = 0 - return false, nil - } + client, err := ethclient.DialContext(ctx, rpcURL) + if err != nil { + return fmt.Errorf("dial readiness rpc: %w", err) + } + defer client.Close() + var lastErr error + err = testutil.WaitForCondition(3*time.Minute, 2*time.Second, func() (bool, error) { peerCount, err := client.PeerCount(ctx) if err != nil { lastErr = err - stableStartBlock = 0 return false, nil } if peerCount < uint64(len(besuQBFTServices)-1) { - stableStartBlock = 0 + lastErr = fmt.Errorf("peer count %d, want at least %d", peerCount, len(besuQBFTServices)-1) return false, nil } blockNumber, err := client.BlockNumber(ctx) - if err != nil || blockNumber == 0 { + if err != nil { lastErr = err - stableStartBlock = 0 + return false, nil + } + if blockNumber == 0 { + lastErr = fmt.Errorf("block number is still zero") return false, nil } var validators []common.Address if err := client.Client().CallContext(ctx, &validators, "qbft_getValidatorsByBlockNumber", "latest"); err != nil { lastErr = err - stableStartBlock = 0 return false, nil } if len(validators) != len(besuQBFTServices) { - stableStartBlock = 0 - return false, nil - } - - if stableStartBlock == 0 { - stableStartBlock = blockNumber + lastErr = fmt.Errorf("validator count %d, want exactly %d", len(validators), len(besuQBFTServices)) return false, nil } - return blockNumber >= stableStartBlock+besuQBFTReadyStableBlocks, nil + return true, nil }) if err != nil && lastErr != nil { return fmt.Errorf("%w (last readiness observation: %v)", err, lastErr) @@ -331,16 +310,14 @@ func waitForBesuQBFTReady(ctx context.Context, rpcURL string) error { } func waitForBesuQBFTTransactionHandling(ctx context.Context, rpcURL string, key *ecdsa.PrivateKey) error { - var lastErr error - - err := testutil.WaitForCondition(2*time.Minute, 2*time.Second, func() (bool, error) { - client, err := ethclient.DialContext(ctx, rpcURL) - if err != nil { - lastErr = err - return false, nil - } - defer client.Close() + client, err := ethclient.DialContext(ctx, rpcURL) + if err != nil { + return fmt.Errorf("dial transaction probe rpc: %w", err) + } + defer client.Close() + var lastErr error + err = testutil.WaitForCondition(2*time.Minute, 2*time.Second, func() (bool, error) { txHash, err := sendBesuQBFTProbeTx(ctx, client, key) if err != nil { lastErr = err diff --git a/e2e/interchaintestv8/e2esuite/config.go b/e2e/interchaintestv8/e2esuite/config.go index acadc0cc5..026f44fe6 100644 --- a/e2e/interchaintestv8/e2esuite/config.go +++ b/e2e/interchaintestv8/e2esuite/config.go @@ -69,27 +69,22 @@ func (c *setupConfig) validate() error { case "", testvalues.EthTestnetType_None: return nil case testvalues.EthTestnetTypeAnvil: - if ethLcOnCosmos == testvalues.EthLCOnCosmosTypeFullWasm { - return fmt.Errorf("invalid config: ETH_TESTNET_TYPE=%s cannot use ETH_LC_ON_COSMOS=%s (Anvil doesn't have beacon chain)", ethTestnetType, ethLcOnCosmos) + if ethLcOnCosmos == testvalues.EthLCOnCosmosTypeDummyWasm || ethLcOnCosmos == testvalues.EthLCOnCosmosTypeAttestorNative { + return nil } - return nil case testvalues.EthTestnetTypePoS: - if ethLcOnCosmos == testvalues.EthLCOnCosmosTypeDummyWasm { - return fmt.Errorf("invalid config: ETH_TESTNET_TYPE=%s cannot use ETH_LC_ON_COSMOS=%s (PoS requires actual verification)", ethTestnetType, ethLcOnCosmos) + if ethLcOnCosmos == testvalues.EthLCOnCosmosTypeFullWasm || ethLcOnCosmos == testvalues.EthLCOnCosmosTypeAttestorNative { + return nil } - return nil case testvalues.EthTestnetTypeBesuQBFT: - switch ethLcOnCosmos { - case testvalues.EthLCOnCosmosTypeAttestorNative: + if ethLcOnCosmos == testvalues.EthLCOnCosmosTypeAttestorNative { return nil - case testvalues.EthLCOnCosmosTypeFullWasm: - return fmt.Errorf("invalid config: ETH_TESTNET_TYPE=%s cannot use ETH_LC_ON_COSMOS=%s (Besu QBFT doesn't have beacon chain)", ethTestnetType, ethLcOnCosmos) - default: - return fmt.Errorf("invalid config: ETH_TESTNET_TYPE=%s does not support ETH_LC_ON_COSMOS=%s", ethTestnetType, ethLcOnCosmos) } default: return fmt.Errorf("invalid config: unsupported ETH_TESTNET_TYPE=%s", ethTestnetType) } + + return fmt.Errorf("invalid config: ETH_TESTNET_TYPE=%s does not support ETH_LC_ON_COSMOS=%s", ethTestnetType, ethLcOnCosmos) } // Result types for parallel chain setup @@ -111,8 +106,3 @@ type ethPosSetupResult struct { chain *chainconfig.EthKurtosisChain err error } - -type ethBesuQBFTSetupResult struct { - chain *chainconfig.BesuQBFTChain - err error -} diff --git a/e2e/interchaintestv8/e2esuite/config_test.go b/e2e/interchaintestv8/e2esuite/config_test.go index cb91f1ecb..f0998ab79 100644 --- a/e2e/interchaintestv8/e2esuite/config_test.go +++ b/e2e/interchaintestv8/e2esuite/config_test.go @@ -8,23 +8,40 @@ import ( "github.com/srdtrk/solidity-ibc-eureka/e2e/v8/testvalues" ) -func TestSetupConfigRejectsBesuQBFTWithDummyLightClient(t *testing.T) { - cfg := setupConfig{ - ethereum: ethereumConfig{testnetType: testvalues.EthTestnetTypeBesuQBFT}, - cosmos: cosmosConfig{lightClientType: testvalues.EthLCOnCosmosTypeDummyWasm}, - } - - if err := cfg.validate(); err == nil { - t.Fatal("expected Besu QBFT with a dummy light client to be rejected") - } -} +func TestSetupConfigValidateEthereumCompatibility(t *testing.T) { + const unknown = "unknown" -func TestSetupConfigRejectsBesuQBFTWithoutLightClient(t *testing.T) { - cfg := setupConfig{ - ethereum: ethereumConfig{testnetType: testvalues.EthTestnetTypeBesuQBFT}, + tests := []struct { + name string + testnetType string + clientType string + wantErr bool + }{ + {"anvil dummy", testvalues.EthTestnetTypeAnvil, testvalues.EthLCOnCosmosTypeDummyWasm, false}, + {"anvil attestor", testvalues.EthTestnetTypeAnvil, testvalues.EthLCOnCosmosTypeAttestorNative, false}, + {"pos full", testvalues.EthTestnetTypePoS, testvalues.EthLCOnCosmosTypeFullWasm, false}, + {"pos attestor", testvalues.EthTestnetTypePoS, testvalues.EthLCOnCosmosTypeAttestorNative, false}, + {"besu attestor", testvalues.EthTestnetTypeBesuQBFT, testvalues.EthLCOnCosmosTypeAttestorNative, false}, + {"anvil full", testvalues.EthTestnetTypeAnvil, testvalues.EthLCOnCosmosTypeFullWasm, true}, + {"pos dummy", testvalues.EthTestnetTypePoS, testvalues.EthLCOnCosmosTypeDummyWasm, true}, + {"besu dummy", testvalues.EthTestnetTypeBesuQBFT, testvalues.EthLCOnCosmosTypeDummyWasm, true}, + {"besu full", testvalues.EthTestnetTypeBesuQBFT, testvalues.EthLCOnCosmosTypeFullWasm, true}, + {"active empty client", testvalues.EthTestnetTypeAnvil, "", true}, + {"active unknown client", testvalues.EthTestnetTypePoS, unknown, true}, + {"unknown testnet", unknown, testvalues.EthLCOnCosmosTypeAttestorNative, true}, + {"disabled empty", "", unknown, false}, + {"disabled none", testvalues.EthTestnetType_None, unknown, false}, } - if err := cfg.validate(); err == nil { - t.Fatal("expected Besu QBFT without a light client to be rejected") + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + cfg := setupConfig{ + ethereum: ethereumConfig{testnetType: tt.testnetType}, + cosmos: cosmosConfig{lightClientType: tt.clientType}, + } + if err := cfg.validate(); (err != nil) != tt.wantErr { + t.Fatalf("validate() error = %v, wantErr %v", err, tt.wantErr) + } + }) } } diff --git a/e2e/interchaintestv8/e2esuite/setup_ethereum.go b/e2e/interchaintestv8/e2esuite/setup_ethereum.go index 493a7a6a1..db2587a48 100644 --- a/e2e/interchaintestv8/e2esuite/setup_ethereum.go +++ b/e2e/interchaintestv8/e2esuite/setup_ethereum.go @@ -85,10 +85,7 @@ func (s *TestSuite) processEthereumPoSResult(ctx context.Context, chain *chainco s.Eth.Chains = append(s.Eth.Chains, ðChain) } -func (s *TestSuite) setupEthereumBesuQBFTAsync(ctx context.Context, networkID string, resultCh chan<- ethBesuQBFTSetupResult) { - var result ethBesuQBFTSetupResult - defer func() { resultCh <- result }() - +func (s *TestSuite) setupEthereumBesuQBFT(ctx context.Context, networkID string) (*chainconfig.BesuQBFTChain, error) { chain, err := chainconfig.SpinUpBesuQBFT(ctx, chainconfig.BesuQBFTParams{ ChainID: 1337, Subnet: "10.42.0.0/16", @@ -98,10 +95,9 @@ func (s *TestSuite) setupEthereumBesuQBFTAsync(ctx context.Context, networkID st InterchainNetworkID: networkID, }) if err != nil { - result.err = err - return + return nil, err } - result.chain = &chain + return &chain, nil } func (s *TestSuite) processEthereumBesuQBFTResult(ctx context.Context, chain *chainconfig.BesuQBFTChain) { diff --git a/e2e/interchaintestv8/e2esuite/suite.go b/e2e/interchaintestv8/e2esuite/suite.go index 7d534bc57..d70bfaf97 100644 --- a/e2e/interchaintestv8/e2esuite/suite.go +++ b/e2e/interchaintestv8/e2esuite/suite.go @@ -16,6 +16,7 @@ import ( "github.com/cosmos/interchaintest/v11/ibc" "github.com/cosmos/interchaintest/v11/testreporter" + "github.com/srdtrk/solidity-ibc-eureka/e2e/v8/chainconfig" "github.com/srdtrk/solidity-ibc-eureka/e2e/v8/ethereum" "github.com/srdtrk/solidity-ibc-eureka/e2e/v8/solana" "github.com/srdtrk/solidity-ibc-eureka/e2e/v8/testvalues" @@ -118,7 +119,6 @@ func (s *TestSuite) setupChainsInParallel( solanaCh := make(chan solanaSetupResult, 1) interchainCh := make(chan interchainSetupResult, 1) ethPosCh := make(chan ethPosSetupResult, 1) - ethBesuQBFTCh := make(chan ethBesuQBFTSetupResult, 1) go s.setupSolanaAsync(ctx, cfg, solanaCh) go s.setupInterchainAsync(ctx, chainSpecs, interchainCh) @@ -132,10 +132,10 @@ func (s *TestSuite) setupChainsInParallel( interchainRes := <-interchainCh s.Require().NoError(interchainRes.err, "Interchain setup failed") + var ethBesuQBFTChain *chainconfig.BesuQBFTChain + var ethBesuQBFTErr error if cfg.ethereum.isBesuQBFT() { - go s.setupEthereumBesuQBFTAsync(ctx, interchainRes.network, ethBesuQBFTCh) - } else { - ethBesuQBFTCh <- ethBesuQBFTSetupResult{} + ethBesuQBFTChain, ethBesuQBFTErr = s.setupEthereumBesuQBFT(ctx, interchainRes.network) } solanaRes := <-solanaCh @@ -146,9 +146,8 @@ func (s *TestSuite) setupChainsInParallel( s.Require().NoError(ethPosRes.err, "Ethereum PoS chain setup failed") s.processEthereumPoSResult(ctx, ethPosRes.chain) - ethBesuQBFTRes := <-ethBesuQBFTCh - s.Require().NoError(ethBesuQBFTRes.err, "Ethereum Besu QBFT chain setup failed") - s.processEthereumBesuQBFTResult(ctx, ethBesuQBFTRes.chain) + s.Require().NoError(ethBesuQBFTErr, "Ethereum Besu QBFT chain setup failed") + s.processEthereumBesuQBFTResult(ctx, ethBesuQBFTChain) return interchainRes.chains, interchainRes.dockerClient, interchainRes.network, interchainRes.logger } diff --git a/e2e/interchaintestv8/ethereum/ethereum.go b/e2e/interchaintestv8/ethereum/ethereum.go index b6ac3ba26..76e203fde 100644 --- a/e2e/interchaintestv8/ethereum/ethereum.go +++ b/e2e/interchaintestv8/ethereum/ethereum.go @@ -105,13 +105,17 @@ func (e *Ethereum) BroadcastTx(ctx context.Context, userKey *ecdsa.PrivateKey, g } func (e Ethereum) ForgeScript(deployer *ecdsa.PrivateKey, solidityContract string, args ...string) ([]byte, error) { + return e.forgeScript(forgeScriptTimeout, deployer, solidityContract, args...) +} + +func (e Ethereum) forgeScript(timeout time.Duration, deployer *ecdsa.PrivateKey, solidityContract string, args ...string) ([]byte, error) { cmdArgs := []string{ "script", "--rpc-url", e.RPC, "--private-key", hex.EncodeToString(crypto.FromECDSA(deployer)), "--broadcast", "--non-interactive", "-vvvv", solidityContract, } cmdArgs = append(cmdArgs, args...) - ctx, cancel := context.WithTimeout(context.Background(), forgeScriptTimeout) + ctx, cancel := context.WithTimeout(context.Background(), timeout) defer cancel() cmd := exec.CommandContext(ctx, "forge", cmdArgs...) @@ -128,29 +132,21 @@ func (e Ethereum) ForgeScript(deployer *ecdsa.PrivateKey, solidityContract strin cmd.Env = append(cmd.Env, extraEnv...) var stdoutBuf bytes.Buffer - var stderrBuf bytes.Buffer - // Create a MultiWriter to write to both os.Stdout and the buffer + // Preserve live output while retaining stdout for deploy-result parsing. stdoutWriter := io.MultiWriter(os.Stdout, &stdoutBuf) - stderrWriter := io.MultiWriter(os.Stderr, &stderrBuf) - // Set the command's stdout to the MultiWriter cmd.Stdout = stdoutWriter - cmd.Stderr = stderrWriter + cmd.Stderr = os.Stderr - // Run the command if err := cmd.Run(); err != nil { if ctx.Err() == context.DeadlineExceeded { - err = fmt.Errorf("forge script timed out after %s: %w", forgeScriptTimeout, err) + return nil, fmt.Errorf("forge script %q timed out after %s: %w", solidityContract, timeout, ctx.Err()) } - fmt.Println("Error start command", cmd.Args, err) - return stdoutBuf.Bytes(), fmt.Errorf("%w\n%s", err, stderrBuf.String()) + return nil, fmt.Errorf("forge script %q failed: %w", solidityContract, err) } - // Get the output as byte slices - stdoutBytes := stdoutBuf.Bytes() - - return stdoutBytes, nil + return stdoutBuf.Bytes(), nil } func (e Ethereum) CreateUser() (*ecdsa.PrivateKey, error) { diff --git a/e2e/interchaintestv8/ethereum/ethereum_test.go b/e2e/interchaintestv8/ethereum/ethereum_test.go new file mode 100644 index 000000000..cff010431 --- /dev/null +++ b/e2e/interchaintestv8/ethereum/ethereum_test.go @@ -0,0 +1,66 @@ +// SPDX-License-Identifier: Apache-2.0 + +package ethereum + +import ( + "encoding/hex" + "io" + "os" + "path/filepath" + "testing" + "time" + + "github.com/stretchr/testify/require" + + "github.com/ethereum/go-ethereum/crypto" +) + +func TestForgeScriptFailureDoesNotExposePrivateKey(t *testing.T) { + workingDir, err := os.Getwd() + require.NoError(t, err) + require.NoError(t, os.Chdir(filepath.Join(workingDir, "../../.."))) + t.Cleanup(func() { require.NoError(t, os.Chdir(workingDir)) }) + + deployer, err := crypto.GenerateKey() + require.NoError(t, err) + secret := hex.EncodeToString(crypto.FromECDSA(deployer)) + forgePath := filepath.Join(t.TempDir(), "forge") + t.Setenv("PATH", filepath.Dir(forgePath)+string(os.PathListSeparator)+os.Getenv("PATH")) + chain := Ethereum{RPC: "http://localhost:8545", Faucet: deployer} + + tests := []struct { + name string + script string + timeout time.Duration + wantErr string + }{ + {name: "failure", script: "#!/bin/sh\nexit 17\n", timeout: 10 * time.Second, wantErr: "exit status 17"}, + {name: "timeout", script: "#!/bin/sh\nexec /bin/sleep 10\n", timeout: 10 * time.Millisecond, wantErr: "timed out after 10ms"}, + } + + for _, test := range tests { + t.Run(test.name, func(t *testing.T) { + require.NoError(t, os.WriteFile(forgePath, []byte(test.script), 0o600)) + require.NoError(t, os.Chmod(forgePath, 0o700)) + + readOutput, writeOutput, err := os.Pipe() + require.NoError(t, err) + originalStdout := os.Stdout + os.Stdout = writeOutput + + stdout, runErr := chain.forgeScript(test.timeout, deployer, "script/Test.s.sol") + + os.Stdout = originalStdout + require.NoError(t, writeOutput.Close()) + consoleOutput, err := io.ReadAll(readOutput) + require.NoError(t, err) + require.NoError(t, readOutput.Close()) + + require.Nil(t, stdout) + require.ErrorContains(t, runErr, "script/Test.s.sol") + require.ErrorContains(t, runErr, test.wantErr) + require.NotContains(t, runErr.Error(), secret) + require.NotContains(t, string(consoleOutput), secret) + }) + } +} diff --git a/e2e/interchaintestv8/ethereum/utils_test.go b/e2e/interchaintestv8/ethereum/utils_test.go index 7e8e1b046..a09d37bb8 100644 --- a/e2e/interchaintestv8/ethereum/utils_test.go +++ b/e2e/interchaintestv8/ethereum/utils_test.go @@ -11,126 +11,12 @@ import ( ) func TestGetEthAddressFromStdout(t *testing.T) { - exampleOutput := `Compiling 72 files with Solc 0.8.25 -Solc 0.8.25 finished in 2.43s -Compiler run successful! -Traces: - [13132696] E2ETestDeploy::run() - ├─ [0] VM::projectRoot() [staticcall] - │ └─ ← [Return] "/Users/gg/Code/solidity-ibc-eureka" - ├─ [0] VM::readFile("/Users/gg/Code/solidity-ibc-eureka/e2e/genesis.json") [staticcall] - │ └─ ← [Return] - ├─ [0] VM::parseJsonBytes("", ".trustedClientState") [staticcall] - │ └─ ← [Return] 0x000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000013000000000000000000000000000000000000000000000000000000000012754500000000000000000000000000000000000000000000000000000000001baf800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000673696d642d310000000000000000000000000000000000000000000000000000 - ├─ [0] VM::parseJsonBytes("", ".trustedConsensusState") [staticcall] - │ └─ ← [Return] 0x000000000000000000000000000000000000000000000000000000006708142974c0681a0dbf3e340cedb56abacacec3f01106cd13d1d240e6eb7fc60a34c31250d828ba2c80c290ee3edb5d12ec232dee758f20214af6fbd73a1f636f79d4d7 - ├─ [0] VM::parseJsonBytes32("", ".updateClientVkey") [staticcall] - │ └─ ← [Return] 0x00787fed71dce3ac5685c23cb727f0bbe41c9c40977506f33530f52eabab6c86 - ├─ [0] VM::parseJsonBytes32("", ".membershipVkey") [staticcall] - │ └─ ← [Return] 0x00a8f49c50bcef3ffaef3e8018be59281904d5951d6e20e0a824b9504da18c7f - ├─ [0] VM::parseJsonBytes32("", ".ucAndMembershipVkey") [staticcall] - │ └─ ← [Return] 0x0037bf750186b666717a245012144eb63d1c8675134c9a9c81133535c4f76656 - ├─ [0] VM::envUint("PRIVATE_KEY") [staticcall] - │ └─ ← [Return] - ├─ [0] VM::startBroadcast() - │ └─ ← [Return] - ├─ [2404781] → new SP1Verifier@0x867EBEE8fB04ef90a4161fe21b89420B0aeEF8f2 - │ └─ ← [Return] 12011 bytes of code - ├─ [2442427] → new SP1ICS07Tendermint@0x65cE09e5864dD1f45F4ae50396A307291AaD6631 - │ └─ ← [Return] 11624 bytes of code - ├─ [1171142] → new ICS02Client@0xEBC7C68E032d765e392CFf5B2a11E76C2C43BbbF - │ ├─ emit OwnershipTransferred(previousOwner: 0x0000000000000000000000000000000000000000, newOwner: 0x51A4283eBaeC10B9B764AE8B021BcAA30C0631Ff) - │ └─ ← [Return] 5730 bytes of code - ├─ [2953720] → new ICS26Router@0xfcf4c2FAc206cFABE9C2B68AefE5D0a9fA038501 - │ ├─ emit OwnershipTransferred(previousOwner: 0x0000000000000000000000000000000000000000, newOwner: 0x51A4283eBaeC10B9B764AE8B021BcAA30C0631Ff) - │ └─ ← [Return] 14411 bytes of code - ├─ [3299657] → new ICS20Transfer@0xD6D4C57D09bA13C9535Ee2d6BdB100231d793a22 - │ ├─ emit OwnershipTransferred(previousOwner: 0x0000000000000000000000000000000000000000, newOwner: ICS26Router: [0xfcf4c2FAc206cFABE9C2B68AefE5D0a9fA038501]) - │ └─ ← [Return] 16250 bytes of code - ├─ [531853] → new TestERC20@0x022b667cC0D57836CCb12669ce93Ae1e15d4f8BC - │ └─ ← [Return] 2431 bytes of code - ├─ [28083] ICS26Router::addIBCApp("transfer", ICS20Transfer: [0xD6D4C57D09bA13C9535Ee2d6BdB100231d793a22]) - │ ├─ emit IBCAppAdded(portId: "transfer", app: ICS20Transfer: [0xD6D4C57D09bA13C9535Ee2d6BdB100231d793a22]) - │ └─ ← [Stop] - ├─ [0] VM::stopBroadcast() - │ └─ ← [Return] - ├─ [0] VM::serializeString("", "ics07Tendermint", "0x65ce09e5864dd1f45f4ae50396a307291aad6631") - │ └─ ← [Return] "{\"ics07Tendermint\":\"0x65ce09e5864dd1f45f4ae50396a307291aad6631\"}" - ├─ [0] VM::serializeString("", "ics02Client", "0xebc7c68e032d765e392cff5b2a11e76c2c43bbbf") - │ └─ ← [Return] "{\"ics02Client\":\"0xebc7c68e032d765e392cff5b2a11e76c2c43bbbf\",\"ics07Tendermint\":\"0x65ce09e5864dd1f45f4ae50396a307291aad6631\"}" - ├─ [0] VM::serializeString("", "ics26Router", "0xfcf4c2fac206cfabe9c2b68aefe5d0a9fa038501") - │ └─ ← [Return] "{\"ics02Client\":\"0xebc7c68e032d765e392cff5b2a11e76c2c43bbbf\",\"ics07Tendermint\":\"0x65ce09e5864dd1f45f4ae50396a307291aad6631\",\"ics26Router\":\"0xfcf4c2fac206cfabe9c2b68aefe5d0a9fa038501\"}" - ├─ [0] VM::serializeString("", "ics20Transfer", "0xd6d4c57d09ba13c9535ee2d6bdb100231d793a22") - │ └─ ← [Return] "{\"ics02Client\":\"0xebc7c68e032d765e392cff5b2a11e76c2c43bbbf\",\"ics07Tendermint\":\"0x65ce09e5864dd1f45f4ae50396a307291aad6631\",\"ics20Transfer\":\"0xd6d4c57d09ba13c9535ee2d6bdb100231d793a22\",\"ics26Router\":\"0xfcf4c2fac206cfabe9c2b68aefe5d0a9fa038501\"}" - ├─ [0] VM::serializeString("", "erc20", "0x022b667cc0d57836ccb12669ce93ae1e15d4f8bc") - │ └─ ← [Return] "{\"erc20\":\"0x022b667cc0d57836ccb12669ce93ae1e15d4f8bc\",\"ics02Client\":\"0xebc7c68e032d765e392cff5b2a11e76c2c43bbbf\",\"ics07Tendermint\":\"0x65ce09e5864dd1f45f4ae50396a307291aad6631\",\"ics20Transfer\":\"0xd6d4c57d09ba13c9535ee2d6bdb100231d793a22\",\"ics26Router\":\"0xfcf4c2fac206cfabe9c2b68aefe5d0a9fa038501\"}" - └─ ← [Return] "{\"erc20\":\"0x022b667cc0d57836ccb12669ce93ae1e15d4f8bc\",\"ics02Client\":\"0xebc7c68e032d765e392cff5b2a11e76c2c43bbbf\",\"ics07Tendermint\":\"0x65ce09e5864dd1f45f4ae50396a307291aad6631\",\"ics20Transfer\":\"0xd6d4c57d09ba13c9535ee2d6bdb100231d793a22\",\"ics26Router\":\"0xfcf4c2fac206cfabe9c2b68aefe5d0a9fa038501\"}" + const output = `== Return == +0: string "{\"cosmosIftConstructor\":\"0x0000000000000000000000000000000000000000\",\"erc20\":\"0x851356ae760d987e095750cceb3bc6014560891c\",\"ics20Transfer\":\"0xb7f8bc63bbcad18155201308c8f3540b07f84f5e\",\"ics26Router\":\"0x2279b7a0a67db372996a5fab50d91eaa73d2ebe6\",\"ics27Gmp\":\"0x0dcd1bf9a1b36ce34237eeafef220932846bcd82\",\"ift\":\"0x0b306bf915c4d645ff596e518faf3f9669b97016\",\"solanaIftConstructor\":\"0x0000000000000000000000000000000000000000\",\"verifierGroth16\":\"0x9fe46736679d2d9a65f0992f2272de9f3c7fa6e0\",\"verifierMock\":\"0xcf7ed3acca5a467e9e704c703e8d87f634fb0fc9\",\"verifierPlonk\":\"0xe7f1725e7734ce288f8367e1bb143e90bb3f0512\"}"` - -Script ran successfully. - -== Return == -0: string "{\"erc20\":\"0x022b667cc0d57836ccb12669ce93ae1e15d4f8bc\",\"ics02Client\":\"0xebc7c68e032d765e392cff5b2a11e76c2c43bbbf\",\"ics07Tendermint\":\"0x65ce09e5864dd1f45f4ae50396a307291aad6631\",\"ics20Transfer\":\"0xd6d4c57d09ba13c9535ee2d6bdb100231d793a22\",\"ics26Router\":\"0xfcf4c2fac206cfabe9c2b68aefe5d0a9fa038501\"}" - -## Setting up 1 EVM. -========================== -Simulated On-chain Traces: - - [521379] → new ICS20Lib@0xDcC1FffeC88e1Fa830604047fad1Aa8D957A7DC7 - └─ ← [Return] 2604 bytes of code - - [2404781] → new SP1Verifier@0x867EBEE8fB04ef90a4161fe21b89420B0aeEF8f2 - └─ ← [Return] 12011 bytes of code - - [2442427] → new SP1ICS07Tendermint@0x65cE09e5864dD1f45F4ae50396A307291AaD6631 - └─ ← [Return] 11624 bytes of code - - [1171142] → new ICS02Client@0xEBC7C68E032d765e392CFf5B2a11E76C2C43BbbF - ├─ emit OwnershipTransferred(previousOwner: 0x0000000000000000000000000000000000000000, newOwner: 0x51A4283eBaeC10B9B764AE8B021BcAA30C0631Ff) - └─ ← [Return] 5730 bytes of code - - [2953720] → new ICS26Router@0xfcf4c2FAc206cFABE9C2B68AefE5D0a9fA038501 - ├─ emit OwnershipTransferred(previousOwner: 0x0000000000000000000000000000000000000000, newOwner: 0x51A4283eBaeC10B9B764AE8B021BcAA30C0631Ff) - └─ ← [Return] 14411 bytes of code - - [3299657] → new ICS20Transfer@0xD6D4C57D09bA13C9535Ee2d6BdB100231d793a22 - ├─ emit OwnershipTransferred(previousOwner: 0x0000000000000000000000000000000000000000, newOwner: ICS26Router: [0xfcf4c2FAc206cFABE9C2B68AefE5D0a9fA038501]) - └─ ← [Return] 16250 bytes of code - - [531853] → new TestERC20@0x022b667cC0D57836CCb12669ce93Ae1e15d4f8BC - └─ ← [Return] 2431 bytes of code - - [30083] ICS26Router::addIBCApp("transfer", ICS20Transfer: [0xD6D4C57D09bA13C9535Ee2d6BdB100231d793a22]) - ├─ emit IBCAppAdded(portId: "transfer", app: ICS20Transfer: [0xD6D4C57D09bA13C9535Ee2d6BdB100231d793a22]) - └─ ← [Stop] - - -========================== - -Chain 3151908 - -Estimated gas price: 0.460566435 gwei - -Estimated total gas used for script: 19196301 - -Estimated amount required: 0.008841171916756935 ETH - -========================== - - -========================== - -ONCHAIN EXECUTION COMPLETE & SUCCESSFUL. - -Transactions saved to: /Users/gg/Code/solidity-ibc-eureka/broadcast/E2ETestDeploy.s.sol/3151908/run-latest.json - -Sensitive values saved to: /Users/gg/Code/solidity-ibc-eureka/cache/E2ETestDeploy.s.sol/3151908/run-latest.json -` - - deployedContracts, err := ethereum.GetEthContractsFromDeployOutput(exampleOutput) + deployedContracts, err := ethereum.GetEthContractsFromDeployOutput(output) require.NoError(t, err) - - require.Equal(t, "0xfcf4c2fac206cfabe9c2b68aefe5d0a9fa038501", deployedContracts.Ics26Router) - require.Equal(t, "0xd6d4c57d09ba13c9535ee2d6bdb100231d793a22", deployedContracts.Ics20Transfer) - require.Equal(t, "0x022b667cc0d57836ccb12669ce93ae1e15d4f8bc", deployedContracts.Erc20) + require.Equal(t, "0x2279b7a0a67db372996a5fab50d91eaa73d2ebe6", deployedContracts.Ics26Router) + require.Equal(t, "0xb7f8bc63bbcad18155201308c8f3540b07f84f5e", deployedContracts.Ics20Transfer) + require.Equal(t, "0x851356ae760d987e095750cceb3bc6014560891c", deployedContracts.Erc20) } diff --git a/e2e/interchaintestv8/proofapi/builder.go b/e2e/interchaintestv8/proofapi/builder.go index 85aa72083..59850e958 100644 --- a/e2e/interchaintestv8/proofapi/builder.go +++ b/e2e/interchaintestv8/proofapi/builder.go @@ -260,7 +260,6 @@ func (b *ConfigBuilder) BesuToBesu(p BesuToBesuParams) *ConfigBuilder { SrcChain: p.SrcChainID, DstChain: p.DstChainID, Config: BesuToBesuModuleConfig{ - SrcChainID: p.SrcChainID, SrcRPCURL: p.SrcRPC, SrcICS26Address: p.SrcICS26, DstRPCURL: p.DstRPC, diff --git a/e2e/interchaintestv8/proofapi/builder_test.go b/e2e/interchaintestv8/proofapi/builder_test.go index bcc1dcfbe..c849072e6 100644 --- a/e2e/interchaintestv8/proofapi/builder_test.go +++ b/e2e/interchaintestv8/proofapi/builder_test.go @@ -7,25 +7,26 @@ import ( "testing" ) -func TestEthToEthBuilderUsesRoutedSourceChain(t *testing.T) { - b := NewConfigBuilder().EthToEthAttested(EthToEthAttestedParams{ - SrcChainID: "eth-a", - DstChainID: "eth-b", - }) - module := b.modules[0] +func TestEVMToEVMBuildersEmitSourceChainOnlyAtRoutingLevel(t *testing.T) { + b := NewConfigBuilder(). + EthToEthAttested(EthToEthAttestedParams{SrcChainID: "eth-a", DstChainID: "eth-b"}). + BesuToBesu(BesuToBesuParams{SrcChainID: "besu-a", DstChainID: "besu-b"}) + wantSource := map[string]string{ModuleEthToEth: "eth-a", ModuleBesuToBesu: "besu-a"} - config, err := json.Marshal(module.Config) - if err != nil { - t.Fatal(err) - } - var fields map[string]any - if err := json.Unmarshal(config, &fields); err != nil { - t.Fatal(err) - } - if _, ok := fields["src_chain_id"]; ok { - t.Error("module config contains obsolete src_chain_id") - } - if module.SrcChain != "eth-a" { - t.Errorf("routing src_chain = %q, want eth-a", module.SrcChain) + for _, module := range b.modules { + config, err := json.Marshal(module.Config) + if err != nil { + t.Fatal(err) + } + var fields map[string]any + if err := json.Unmarshal(config, &fields); err != nil { + t.Fatal(err) + } + if _, ok := fields["src_chain_id"]; ok { + t.Errorf("%s config contains obsolete src_chain_id", module.Name) + } + if module.SrcChain != wantSource[module.Name] { + t.Errorf("%s routing src_chain = %q, want %q", module.Name, module.SrcChain, wantSource[module.Name]) + } } } diff --git a/e2e/interchaintestv8/proofapi/config.go b/e2e/interchaintestv8/proofapi/config.go index 1162f4ba3..5098a313b 100644 --- a/e2e/interchaintestv8/proofapi/config.go +++ b/e2e/interchaintestv8/proofapi/config.go @@ -9,7 +9,6 @@ import ( "math/rand" "net" "os" - "text/template" "time" "github.com/srdtrk/solidity-ibc-eureka/e2e/v8/testvalues" @@ -149,43 +148,19 @@ func NewConfig(modules []ModuleConfig) Config { } } -// GenerateConfig creates a config from the template +// GenerateConfigFile writes the config as JSON. func (c *Config) GenerateConfigFile(filePath string) error { - tmpl, err := template.ParseFiles("e2e/interchaintestv8/proofapi/config.tmpl") - if err != nil { - return err + config := *c + if config.Modules == nil { + config.Modules = []ModuleConfig{} } - f, err := os.Create(filePath) + contents, err := json.MarshalIndent(config, "", " ") if err != nil { return err } - defer f.Close() - - return tmpl.Execute(f, c) -} - -// ToJSON converts a ModuleConfig to JSON string - designed for use in templates -func (mc ModuleConfig) ToJSON() string { - jsonBytes, err := json.MarshalIndent(mc, "", " ") - if err != nil { - return fmt.Sprintf("\"Error generating JSON: %s\"", err) - } - return string(jsonBytes) -} - -// ModulesToJSON converts a slice of ModuleConfig to a JSON string -func ModulesToJSON(modules []ModuleConfig) (string, error) { - if len(modules) == 0 { - return "[]", nil - } - - jsonBytes, err := json.MarshalIndent(modules, "", " ") - if err != nil { - return "", fmt.Errorf("failed to marshal modules to JSON: %w", err) - } - return string(jsonBytes), nil + return os.WriteFile(filePath, append(contents, '\n'), 0o600) } // EthToCosmosModuleConfig represents the configuration for eth_to_cosmos module @@ -257,7 +232,6 @@ type EthToEthModuleConfig struct { // BesuToBesuModuleConfig represents the configuration for besu_to_besu module. type BesuToBesuModuleConfig struct { - SrcChainID string `json:"src_chain_id"` SrcRPCURL string `json:"src_rpc_url"` SrcICS26Address string `json:"src_ics26_address"` DstRPCURL string `json:"dst_rpc_url"` diff --git a/e2e/interchaintestv8/proofapi/config.tmpl b/e2e/interchaintestv8/proofapi/config.tmpl deleted file mode 100644 index bf040c03b..000000000 --- a/e2e/interchaintestv8/proofapi/config.tmpl +++ /dev/null @@ -1,18 +0,0 @@ -{ - "modules": [ - {{- range $index, $module := .Modules }} - {{- if $index }},{{ end }} - {{ $module.ToJSON }} - {{- end }} - ], - "server": { - "address": "{{ .Server.Address }}", - "port": {{ .Server.Port }} - }, - "observability": { - "level": "{{ .Observability.Level }}", - "use_otel": {{ .Observability.UseOtel }}, - "service_name": "{{ .Observability.ServiceName }}"{{ if .Observability.OTelEndpoint }}, - "otel_endpoint": "{{ .Observability.OTelEndpoint }}"{{ end }} - } -} diff --git a/e2e/interchaintestv8/proofapi/config_test.go b/e2e/interchaintestv8/proofapi/config_test.go new file mode 100644 index 000000000..7c511a431 --- /dev/null +++ b/e2e/interchaintestv8/proofapi/config_test.go @@ -0,0 +1,29 @@ +// SPDX-License-Identifier: Apache-2.0 + +package proofapi + +import ( + "bytes" + "os" + "path/filepath" + "testing" +) + +func TestGenerateConfigFileEscapesStringsAndWritesEmptyModules(t *testing.T) { + path := filepath.Join(t.TempDir(), "config.json") + config := Config{Server: ServerConfig{Address: "quoted \"address\""}} + + if err := config.GenerateConfigFile(path); err != nil { + t.Fatal(err) + } + contents, err := os.ReadFile(path) + if err != nil { + t.Fatal(err) + } + if !bytes.Contains(contents, []byte(`"modules": []`)) { + t.Errorf("config contains non-empty or null modules: %s", contents) + } + if !bytes.Contains(contents, []byte(`"address": "quoted \"address\""`)) { + t.Errorf("config does not escape address: %s", contents) + } +} diff --git a/e2e/interchaintestv8/types/besu_fixtures.go b/e2e/interchaintestv8/types/besu_fixtures.go index e1aa9f138..93e6acfca 100644 --- a/e2e/interchaintestv8/types/besu_fixtures.go +++ b/e2e/interchaintestv8/types/besu_fixtures.go @@ -46,20 +46,20 @@ type GenerateQBFTFixtureParams struct { } type besuFixture struct { - RouterAddress string `json:"routerAddress"` - InitialTrustedHeight uint64 `json:"initialTrustedHeight"` - InitialTrustedTimestamp uint64 `json:"initialTrustedTimestamp"` - InitialTrustedStorageRoot string `json:"initialTrustedStorageRoot"` - InitialTrustedValidators []string `json:"initialTrustedValidators"` - TrustingPeriod uint64 `json:"trustingPeriod"` - MaxClockDrift uint64 `json:"maxClockDrift"` - UpdateHeight11 besuUpdateFixture `json:"updateHeight11"` - UpdateHeight12 besuUpdateFixture `json:"updateHeight12"` - LowQuorumHeight12 besuUpdateFixture `json:"lowQuorumHeight12"` - ConflictingHeight12 besuUpdateFixture `json:"conflictingHeight12"` - LowOverlapHeight13 besuUpdateFixture `json:"lowOverlapHeight13"` - Membership besuProofFixture `json:"membership"` - NonMembership besuProofFixture `json:"nonMembership"` + RouterAddress string `json:"routerAddress"` + InitialTrustedHeight uint64 `json:"initialTrustedHeight"` + InitialTrustedTimestamp uint64 `json:"initialTrustedTimestamp"` + InitialTrustedStorageRoot string `json:"initialTrustedStorageRoot"` + InitialTrustedValidators []string `json:"initialTrustedValidators"` + TrustingPeriod uint64 `json:"trustingPeriod"` + MaxClockDrift uint64 `json:"maxClockDrift"` + UpdateHeight11 besuUpdateFixture `json:"updateHeight11"` + UpdateHeight12 besuUpdateFixture `json:"updateHeight12"` + LowQuorumHeight12 besuRejectionUpdateFixture `json:"lowQuorumHeight12"` + ConflictingHeight12 besuRejectionUpdateFixture `json:"conflictingHeight12"` + LowOverlapHeight13 besuRejectionUpdateFixture `json:"lowOverlapHeight13"` + Membership besuProofFixture `json:"membership"` + NonMembership besuProofFixture `json:"nonMembership"` } type besuUpdateFixture struct { @@ -72,6 +72,13 @@ type besuUpdateFixture struct { ExpectedValidators []string `json:"expectedValidators"` } +type besuRejectionUpdateFixture struct { + Height uint64 `json:"height"` + HeaderRlp string `json:"headerRlp"` + TrustedHeight uint64 `json:"trustedHeight"` + AccountProof string `json:"accountProof"` +} + type besuProofFixture struct { Proof string `json:"proof"` ProofHeight uint64 `json:"proofHeight"` @@ -175,6 +182,7 @@ func generateQBFTFixture(ctx context.Context, params GenerateQBFTFixtureParams) return besuFixture{}, err } conflictingHeight12, err := buildConflictingFixture( + ctx, params.InitialTrustedHeight, update12.Height, syntheticSourceHeader, @@ -190,8 +198,6 @@ func generateQBFTFixture(ctx context.Context, params GenerateQBFTFixtureParams) update12.Height+1, syntheticSourceHeader, validatorKeys, - params.SourceChain, - params.RouterAddress, ) if err != nil { return besuFixture{}, err @@ -250,68 +256,70 @@ func buildLiveUpdateFixture( }, nil } -func buildLowQuorumFixture(update besuUpdateFixture, header liveHeader) (besuUpdateFixture, error) { +func buildLowQuorumFixture(update besuUpdateFixture, header liveHeader) (besuRejectionUpdateFixture, error) { mutable, err := decodeMutableQBFTHeader(header.HeaderRLP) if err != nil { - return besuUpdateFixture{}, err + return besuRejectionUpdateFixture{}, err } commitSeals, err := mutable.commitSeals() if err != nil { - return besuUpdateFixture{}, err + return besuRejectionUpdateFixture{}, err } if len(commitSeals) < 2 { - return besuUpdateFixture{}, fmt.Errorf("expected at least two commit seals, got %d", len(commitSeals)) + return besuRejectionUpdateFixture{}, fmt.Errorf("expected at least two commit seals, got %d", len(commitSeals)) } mutable.setCommitSeals(commitSeals[:2]) mutatedHeader, err := mutable.encode() if err != nil { - return besuUpdateFixture{}, err + return besuRejectionUpdateFixture{}, err } - update.HeaderRlp = encodeHex(mutatedHeader) - return update, nil + return besuRejectionUpdateFixture{ + Height: update.Height, + HeaderRlp: encodeHex(mutatedHeader), + TrustedHeight: update.TrustedHeight, + AccountProof: "0x", + }, nil } func buildConflictingFixture( + ctx context.Context, trustedHeight uint64, targetHeight uint64, baseHeader liveHeader, validatorKeys map[ethcommon.Address]*ecdsa.PrivateKey, chain *ethereum.Ethereum, routerAddress ethcommon.Address, -) (besuUpdateFixture, error) { +) (besuRejectionUpdateFixture, error) { mutable, err := decodeMutableQBFTHeader(baseHeader.HeaderRLP) if err != nil { - return besuUpdateFixture{}, err + return besuRejectionUpdateFixture{}, err } mutable.setHeight(targetHeight) validators, err := mutable.validators() if err != nil { - return besuUpdateFixture{}, err + return besuRejectionUpdateFixture{}, err } signerKeys, err := signerKeysFor(validators[:3], validatorKeys) if err != nil { - return besuUpdateFixture{}, err + return besuRejectionUpdateFixture{}, err } mutable.setCommitSeals(signQBFTCommitSeals(mutable, signerKeys)) mutatedHeader, err := mutable.encode() if err != nil { - return besuUpdateFixture{}, err + return besuRejectionUpdateFixture{}, err } - proof, accountProofRLP, err := fetchAccountProof(context.Background(), chain, routerAddress, baseHeader.Header.Number.Uint64()) + _, accountProofRLP, err := fetchAccountProof(ctx, chain, routerAddress, baseHeader.Header.Number.Uint64()) if err != nil { - return besuUpdateFixture{}, err + return besuRejectionUpdateFixture{}, err } - return besuUpdateFixture{ - Height: targetHeight, - HeaderRlp: encodeHex(mutatedHeader), - TrustedHeight: trustedHeight, - AccountProof: encodeHex(accountProofRLP), - ExpectedTimestamp: baseHeader.Header.Time, - ExpectedStorageRoot: proof.StorageHash.Hex(), - ExpectedValidators: addressesToHex(validators), + return besuRejectionUpdateFixture{ + Height: targetHeight, + HeaderRlp: encodeHex(mutatedHeader), + TrustedHeight: trustedHeight, + AccountProof: encodeHex(accountProofRLP), }, nil } @@ -320,26 +328,24 @@ func buildLowOverlapFixture( targetHeight uint64, baseHeader liveHeader, validatorKeys map[ethcommon.Address]*ecdsa.PrivateKey, - chain *ethereum.Ethereum, - routerAddress ethcommon.Address, -) (besuUpdateFixture, error) { +) (besuRejectionUpdateFixture, error) { mutable, err := decodeMutableQBFTHeader(baseHeader.HeaderRLP) if err != nil { - return besuUpdateFixture{}, err + return besuRejectionUpdateFixture{}, err } mutable.setHeight(targetHeight) baseValidators, err := mutable.validators() if err != nil { - return besuUpdateFixture{}, err + return besuRejectionUpdateFixture{}, err } if len(baseValidators) == 0 { - return besuUpdateFixture{}, fmt.Errorf("missing base validators") + return besuRejectionUpdateFixture{}, fmt.Errorf("missing base validators") } syntheticKeys, err := loadSyntheticLowOverlapValidatorKeys() if err != nil { - return besuUpdateFixture{}, err + return besuRejectionUpdateFixture{}, err } lowOverlapValidators := []ethcommon.Address{ baseValidators[0], @@ -355,27 +361,19 @@ func buildLowOverlapFixture( lowOverlapValidators[2], }, mergeValidatorKeyMaps(validatorKeys, toKeyMap(syntheticKeys))) if err != nil { - return besuUpdateFixture{}, err + return besuRejectionUpdateFixture{}, err } mutable.setCommitSeals(signQBFTCommitSeals(mutable, signerKeys)) mutatedHeader, err := mutable.encode() if err != nil { - return besuUpdateFixture{}, err - } - - proof, accountProofRLP, err := fetchAccountProof(context.Background(), chain, routerAddress, baseHeader.Header.Number.Uint64()) - if err != nil { - return besuUpdateFixture{}, err + return besuRejectionUpdateFixture{}, err } - return besuUpdateFixture{ - Height: targetHeight, - HeaderRlp: encodeHex(mutatedHeader), - TrustedHeight: trustedHeight, - AccountProof: encodeHex(accountProofRLP), - ExpectedTimestamp: baseHeader.Header.Time, - ExpectedStorageRoot: proof.StorageHash.Hex(), - ExpectedValidators: addressesToHex(lowOverlapValidators), + return besuRejectionUpdateFixture{ + Height: targetHeight, + HeaderRlp: encodeHex(mutatedHeader), + TrustedHeight: trustedHeight, + AccountProof: "0x", }, nil } diff --git a/e2e/interchaintestv8/types/besu_fixtures_test.go b/e2e/interchaintestv8/types/besu_fixtures_test.go index 4a5c470ba..beb825631 100644 --- a/e2e/interchaintestv8/types/besu_fixtures_test.go +++ b/e2e/interchaintestv8/types/besu_fixtures_test.go @@ -4,13 +4,106 @@ package types import ( "encoding/hex" + "encoding/json" + "os" "testing" transfertypes "github.com/cosmos/ibc-go/v11/modules/apps/transfer/types" + ethcommon "github.com/ethereum/go-ethereum/common" "github.com/cosmos/solidity-ibc-eureka/packages/go-abigen/ics26router" ) +func TestBuildLowOverlapFixtureNeedsNoAccountProof(t *testing.T) { + t.Chdir("../../..") + + fixtureJSON, err := os.ReadFile("ibc-solidity/test/besu-bft/fixtures/qbft.json") + if err != nil { + t.Fatal(err) + } + var fixture besuFixture + if err := json.Unmarshal(fixtureJSON, &fixture); err != nil { + t.Fatal(err) + } + validatorKeys, err := loadQBFTValidatorKeys() + if err != nil { + t.Fatal(err) + } + + update, err := buildLowOverlapFixture( + fixture.InitialTrustedHeight, + fixture.UpdateHeight12.Height+1, + liveHeader{HeaderRLP: ethcommon.FromHex(fixture.UpdateHeight12.HeaderRlp)}, + validatorKeys, + ) + if err != nil { + t.Fatal(err) + } + if update.AccountProof != "0x" { + t.Fatalf("account proof: got %q, want empty hex bytes", update.AccountProof) + } + + encoded, err := json.Marshal(update) + if err != nil { + t.Fatal(err) + } + var fields map[string]json.RawMessage + if err := json.Unmarshal(encoded, &fields); err != nil { + t.Fatal(err) + } + for _, field := range []string{"expectedTimestamp", "expectedStorageRoot", "expectedValidators"} { + if _, ok := fields[field]; ok { + t.Fatalf("unexpected success field %q", field) + } + } +} + +func TestRejectionFixturesOnlyContainUpdateInputs(t *testing.T) { + t.Chdir("../../..") + + fixtureJSON, err := os.ReadFile("ibc-solidity/test/besu-bft/fixtures/qbft.json") + if err != nil { + t.Fatal(err) + } + var fixture besuFixture + if err := json.Unmarshal(fixtureJSON, &fixture); err != nil { + t.Fatal(err) + } + + lowQuorum, err := buildLowQuorumFixture( + fixture.UpdateHeight12, + liveHeader{HeaderRLP: ethcommon.FromHex(fixture.UpdateHeight12.HeaderRlp)}, + ) + if err != nil { + t.Fatal(err) + } + if lowQuorum.AccountProof != "0x" { + t.Fatalf("low quorum account proof: got %q, want empty hex bytes", lowQuorum.AccountProof) + } + if fixture.ConflictingHeight12.AccountProof == "" || fixture.ConflictingHeight12.AccountProof == "0x" { + t.Fatal("conflicting update must retain its account proof") + } + + for name, update := range map[string]besuRejectionUpdateFixture{ + "low quorum": lowQuorum, + "conflicting": fixture.ConflictingHeight12, + } { + encoded, err := json.Marshal(update) + if err != nil { + t.Fatal(err) + } + var fields map[string]json.RawMessage + if err := json.Unmarshal(encoded, &fields); err != nil { + t.Fatal(err) + } + for _, field := range []string{"expectedTimestamp", "expectedStorageRoot", "expectedValidators"} { + if _, ok := fields[field]; ok { + t.Errorf("%s: unexpected success field %q", name, field) + } + } + } +} + func TestPacketCommitment(t *testing.T) { packetData := transfertypes.NewFungibleTokenPacketData("uatom", "1000000", "sender", "receiver", "memo") value, err := transfertypes.EncodeABIFungibleTokenPacketData(&packetData) diff --git a/ibc-solana/AGENTS.md b/ibc-solana/AGENTS.md index fd2e35b35..e9e809f7e 100644 --- a/ibc-solana/AGENTS.md +++ b/ibc-solana/AGENTS.md @@ -3,18 +3,18 @@ This subtree contains the Anchor-based Solana IBC programs and their ProgramTest integration harness. Look here first: -- `programs/solana/README.md` -- `programs/solana/Anchor.toml` -- `programs/solana/Cargo.toml` -- `programs/solana/integration-tests/README.md` +- `ibc-solana/README.md` +- `ibc-solana/Anchor.toml` +- `ibc-solana/Cargo.toml` +- `ibc-solana/integration-tests/README.md` Use the smallest relevant validation from the repo root: -- Build and refresh IDLs: `just build-solana` -- Solana unit tests: `just test-solana` -- Anchor tests: `just test-anchor-solana` -- Lint: `just lint-solana` +- Build and refresh IDLs: `just solana::build-solana-programs` +- Solana unit tests: `just solana::test-solana` +- Anchor tests: `just solana::test-anchor-solana` +- Lint: `just solana::lint-solana` Local constraints: - Prefer the repo `just` recipes over raw `anchor` commands; they auto-detect `anchor-nix` when available. -- If program interfaces or IDLs change, run `just generate-solana-types`; do not hand-edit `packages/go-anchor/` except `packages/go-anchor/ics07_tendermint_patches/`, and do not hand-edit `e2e/interchaintestv8/solana/go-anchor/`. -- Cluster-specific program IDs live in `programs/solana/Anchor.toml`, and keypairs live under `solana-keypairs//`; keep non-`localnet` keypairs out of git. +- If program interfaces or IDLs change, run `just solana::generate-solana-types`; do not hand-edit `packages/go-anchor/` except `packages/go-anchor/ics07_tendermint_patches/`, and do not hand-edit `e2e/interchaintestv8/solana/go-anchor/`. +- Cluster-specific program IDs live in `ibc-solana/Anchor.toml`, and keypairs live under `solana-keypairs//`; keep non-`localnet` keypairs out of git. diff --git a/ibc-solidity/abi/bytecode/AttestationLightClient.json b/ibc-solidity/abi/bytecode/AttestationLightClient.json index 0931c919a..25ced5389 100644 --- a/ibc-solidity/abi/bytecode/AttestationLightClient.json +++ b/ibc-solidity/abi/bytecode/AttestationLightClient.json @@ -1 +1 @@ -{"abi":[{"type":"constructor","inputs":[{"name":"attestorAddresses","type":"address[]","internalType":"address[]"},{"name":"minRequiredSigs","type":"uint8","internalType":"uint8"},{"name":"initialHeight","type":"uint64","internalType":"uint64"},{"name":"initialTimestampSeconds","type":"uint64","internalType":"uint64"},{"name":"roleManager","type":"address","internalType":"address"}],"stateMutability":"nonpayable"},{"type":"function","name":"DEFAULT_ADMIN_ROLE","inputs":[],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"type":"function","name":"PROOF_SUBMITTER_ROLE","inputs":[],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"type":"function","name":"getAttestationSet","inputs":[],"outputs":[{"name":"attestorAddresses","type":"address[]","internalType":"address[]"},{"name":"minRequiredSigs","type":"uint8","internalType":"uint8"}],"stateMutability":"view"},{"type":"function","name":"getClientState","inputs":[],"outputs":[{"name":"","type":"bytes","internalType":"bytes"}],"stateMutability":"view"},{"type":"function","name":"getConsensusTimestamp","inputs":[{"name":"revisionHeight","type":"uint64","internalType":"uint64"}],"outputs":[{"name":"","type":"uint64","internalType":"uint64"}],"stateMutability":"view"},{"type":"function","name":"getRoleAdmin","inputs":[{"name":"role","type":"bytes32","internalType":"bytes32"}],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"type":"function","name":"grantRole","inputs":[{"name":"role","type":"bytes32","internalType":"bytes32"},{"name":"account","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"hasRole","inputs":[{"name":"role","type":"bytes32","internalType":"bytes32"},{"name":"account","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"misbehaviour","inputs":[{"name":"","type":"bytes","internalType":"bytes"}],"outputs":[],"stateMutability":"view"},{"type":"function","name":"renounceRole","inputs":[{"name":"role","type":"bytes32","internalType":"bytes32"},{"name":"callerConfirmation","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"revokeRole","inputs":[{"name":"role","type":"bytes32","internalType":"bytes32"},{"name":"account","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"supportsInterface","inputs":[{"name":"interfaceId","type":"bytes4","internalType":"bytes4"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"updateClient","inputs":[{"name":"updateMsg","type":"bytes","internalType":"bytes"}],"outputs":[{"name":"","type":"uint8","internalType":"enum ILightClientMsgs.UpdateResult"}],"stateMutability":"nonpayable"},{"type":"function","name":"verifyMembership","inputs":[{"name":"msg_","type":"tuple","internalType":"struct ILightClientMsgs.MsgVerifyMembership","components":[{"name":"proof","type":"bytes","internalType":"bytes"},{"name":"proofHeight","type":"tuple","internalType":"struct IICS02ClientMsgs.Height","components":[{"name":"revisionNumber","type":"uint64","internalType":"uint64"},{"name":"revisionHeight","type":"uint64","internalType":"uint64"}]},{"name":"path","type":"bytes[]","internalType":"bytes[]"},{"name":"value","type":"bytes","internalType":"bytes"}]}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"verifyNonMembership","inputs":[{"name":"msg_","type":"tuple","internalType":"struct ILightClientMsgs.MsgVerifyNonMembership","components":[{"name":"proof","type":"bytes","internalType":"bytes"},{"name":"proofHeight","type":"tuple","internalType":"struct IICS02ClientMsgs.Height","components":[{"name":"revisionNumber","type":"uint64","internalType":"uint64"},{"name":"revisionHeight","type":"uint64","internalType":"uint64"}]},{"name":"path","type":"bytes[]","internalType":"bytes[]"}]}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"event","name":"RoleAdminChanged","inputs":[{"name":"role","type":"bytes32","indexed":true,"internalType":"bytes32"},{"name":"previousAdminRole","type":"bytes32","indexed":true,"internalType":"bytes32"},{"name":"newAdminRole","type":"bytes32","indexed":true,"internalType":"bytes32"}],"anonymous":false},{"type":"event","name":"RoleGranted","inputs":[{"name":"role","type":"bytes32","indexed":true,"internalType":"bytes32"},{"name":"account","type":"address","indexed":true,"internalType":"address"},{"name":"sender","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"type":"event","name":"RoleRevoked","inputs":[{"name":"role","type":"bytes32","indexed":true,"internalType":"bytes32"},{"name":"account","type":"address","indexed":true,"internalType":"address"},{"name":"sender","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"type":"error","name":"AccessControlBadConfirmation","inputs":[]},{"type":"error","name":"AccessControlUnauthorizedAccount","inputs":[{"name":"account","type":"address","internalType":"address"},{"name":"neededRole","type":"bytes32","internalType":"bytes32"}]},{"type":"error","name":"BadQuorum","inputs":[{"name":"minRequired","type":"uint8","internalType":"uint8"},{"name":"attestationCount","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"ConsensusTimestampNotFound","inputs":[{"name":"height","type":"uint64","internalType":"uint64"}]},{"type":"error","name":"DuplicateSigner","inputs":[{"name":"signer","type":"address","internalType":"address"}]},{"type":"error","name":"ECDSAInvalidSignature","inputs":[]},{"type":"error","name":"ECDSAInvalidSignatureLength","inputs":[{"name":"length","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"ECDSAInvalidSignatureS","inputs":[{"name":"s","type":"bytes32","internalType":"bytes32"}]},{"type":"error","name":"EmptyPackets","inputs":[]},{"type":"error","name":"EmptySignatures","inputs":[]},{"type":"error","name":"EmptyValue","inputs":[]},{"type":"error","name":"FeatureNotSupported","inputs":[]},{"type":"error","name":"FrozenClientState","inputs":[]},{"type":"error","name":"HeightMismatch","inputs":[{"name":"expected","type":"uint64","internalType":"uint64"},{"name":"provided","type":"uint64","internalType":"uint64"}]},{"type":"error","name":"InvalidPathLength","inputs":[{"name":"expectedLength","type":"uint256","internalType":"uint256"},{"name":"providedLength","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"InvalidSignatureLength","inputs":[{"name":"signature","type":"bytes","internalType":"bytes"}]},{"type":"error","name":"InvalidState","inputs":[{"name":"height","type":"uint64","internalType":"uint64"},{"name":"timestamp","type":"uint64","internalType":"uint64"}]},{"type":"error","name":"NoAttestors","inputs":[]},{"type":"error","name":"NotMember","inputs":[]},{"type":"error","name":"NotNonMember","inputs":[]},{"type":"error","name":"SignatureInvalid","inputs":[{"name":"signature","type":"bytes","internalType":"bytes"}]},{"type":"error","name":"ThresholdNotMet","inputs":[{"name":"validSigners","type":"uint256","internalType":"uint256"},{"name":"minRequired","type":"uint8","internalType":"uint8"}]},{"type":"error","name":"UnknownSigner","inputs":[{"name":"signer","type":"address","internalType":"address"}]}],"bytecode":{"object":"0x60806040523461032d57611f568038038061001981610349565b928339810160a08282031261032d5781516001600160401b03811161032d57820181601f8201121561032d578051916001600160401b0383116102c8578260051b916020610068818501610349565b8095815201906020829482010192831161032d57602001905b8282106103315750505060208301519260ff841680940361032d576100a860408201610382565b6100c060806100b960608501610382565b930161036e565b9284511561031e57851515806102f2575b855190156102dc575060405195608087016001600160401b038111888210176102c857604052858752602087019081526060604088019360018060401b03169788855201915f835286519060018060401b0382116102c8576801000000000000000082116102c85760015482600155808310610284575b5060015f5260205f205f5b838110610267575050505060ff90511669ff00000000000000000060025493610100600160481b03905160081b169251151560481b169260018060501b0319161717176002555f5b83518110156101fb5760018060a01b0360208260051b8601015116805f52600360205260ff60405f2054166101e957906001915f52600360205260405f208260ff198254161790550161019b565b637010e27960e11b5f5260045260245ffd5b505f84815260046020526040902080546001600160401b0319166001600160401b039092169190911790556001600160a01b03811661024e575061023d61048c565b505b6040516119a7908161050f8239f35b8061025b61026192610396565b5061040c565b5061023f565b82516001600160a01b031681830155602090920191600101610153565b60015f527fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf69081019083015b8181106102bd5750610148565b5f81556001016102b0565b634e487b7160e01b5f52604160045260245ffd5b866365846b7f60e01b5f5260045260245260445ffd5b5084515f19870160ff811161030a5760ff16106100d1565b634e487b7160e01b5f52601160045260245ffd5b6343d0a89360e11b5f5260045ffd5b5f80fd5b6020809161033e8461036e565b815201910190610081565b6040519190601f01601f191682016001600160401b038111838210176102c857604052565b51906001600160a01b038216820361032d57565b51906001600160401b038216820361032d57565b6001600160a01b0381165f9081525f516020611f365f395f51905f52602052604090205460ff16610407576001600160a01b03165f8181525f516020611f365f395f51905f5260205260408120805460ff191660011790553391905f516020611eb65f395f51905f528180a4600190565b505f90565b6001600160a01b0381165f9081525f516020611ed65f395f51905f52602052604090205460ff16610407576001600160a01b03165f8181525f516020611ed65f395f51905f5260205260408120805460ff191660011790553391905f516020611f165f395f51905f52905f516020611eb65f395f51905f529080a4600190565b5f80525f516020611ed65f395f51905f526020525f516020611ef65f395f51905f525460ff1661050a575f8080525f516020611ed65f395f51905f526020525f516020611ef65f395f51905f52805460ff1916600117905533905f516020611f165f395f51905f525f516020611eb65f395f51905f528280a4600190565b5f9056fe6080806040526004361015610012575f80fd5b5f3560e01c90816301ffc9a7146106ab575080630bece356146105e8578063248a9ca3146105be5780632f2ff15d1461058f57806336568abe146105335780634d6d9ffb146104865780635832611b146104405780635972185a14610406578063682ed5f01461035157806391d1485414610308578063a217fddf146102ee578063a845a7f314610261578063d547741f1461022b578063ddba65371461015f5763ef913a4b146100c1575f80fd5b3461015b575f60031936011261015b576101576040516020808201526080604082015261014b816100f460c08201611228565b60ff600254818116606085015267ffffffffffffffff8160081c16608085015260481c16151560a0830152037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0810183528261085e565b604051918291826107cd565b0390f35b5f80fd5b3461015b5761016d36610749565b505060ff60025460481c16610203575f80527f4c48d1d2b0f4f7485fc28e3db22341d96a20aa29e6efa8149da9751603abd4e06020527f6e0c24a6e293ff9b755263dbaa15ba3796b0b8d3fe17cfb4ddf8143b268eac475460ff16156101f6575b7fda81d7c2000000000000000000000000000000000000000000000000000000005f5260045ffd5b6101fe611277565b6101ce565b7f928b1233000000000000000000000000000000000000000000000000000000005f5260045ffd5b3461015b5761025f61023c3661079a565b9061025a610255825f525f602052600160405f20015490565b6112ff565b61175e565b005b3461015b575f60031936011261015b5760ff6002541660405161028e8161028781611228565b038261085e565b60405190604082019260408352815180945260206060840192015f945b8086106102c057505082935060208301520390f35b909260208060019273ffffffffffffffffffffffffffffffffffffffff8751168152019401950194906102ab565b3461015b575f60031936011261015b5760206040515f8152f35b3461015b576103163661079a565b905f525f60205273ffffffffffffffffffffffffffffffffffffffff60405f2091165f52602052602060ff60405f2054166040519015158152f35b3461015b57602060031936011261015b5760043567ffffffffffffffff811161015b5760a0600319823603011261015b5760ff60025460481c16610203575f80527f4c48d1d2b0f4f7485fc28e3db22341d96a20aa29e6efa8149da9751603abd4e060209081527f6e0c24a6e293ff9b755263dbaa15ba3796b0b8d3fe17cfb4ddf8143b268eac475490916103f19160ff16156103f9575b6004016110cb565b604051908152f35b610401611277565b6103e9565b3461015b575f60031936011261015b5760206040517fbd893629a699470e4ec82a5715bb4981fdaacc5d0a728bf5f55b801d8f4ef10b8152f35b3461015b57602060031936011261015b5760043567ffffffffffffffff811680910361015b575f526004602052602067ffffffffffffffff60405f205416604051908152f35b3461015b57602060031936011261015b5760043567ffffffffffffffff811161015b576080600319823603011261015b5760ff60025460481c16610203575f80527f4c48d1d2b0f4f7485fc28e3db22341d96a20aa29e6efa8149da9751603abd4e060209081527f6e0c24a6e293ff9b755263dbaa15ba3796b0b8d3fe17cfb4ddf8143b268eac475490916103f19160ff1615610526575b600401610ef5565b61052e611277565b61051e565b3461015b576105413661079a565b3373ffffffffffffffffffffffffffffffffffffffff8216036105675761025f9161175e565b7f6697b232000000000000000000000000000000000000000000000000000000005f5260045ffd5b3461015b5761025f6105a03661079a565b906105b9610255825f525f602052600160405f20015490565b61168c565b3461015b57602060031936011261015b5760206103f16004355f525f602052600160405f20015490565b3461015b576105f636610749565b60ff60025460481c16610203575f80527f4c48d1d2b0f4f7485fc28e3db22341d96a20aa29e6efa8149da9751603abd4e06020527f6e0c24a6e293ff9b755263dbaa15ba3796b0b8d3fe17cfb4ddf8143b268eac475461065e929060ff161561069e57610a3c565b6040516003821015610671576020918152f35b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b6106a6611277565b610a3c565b3461015b57602060031936011261015b57600435907fffffffff00000000000000000000000000000000000000000000000000000000821680920361015b57817f7965db0b000000000000000000000000000000000000000000000000000000006020931490811561071f575b5015158152f35b7f01ffc9a70000000000000000000000000000000000000000000000000000000091501483610718565b90602060031983011261015b5760043567ffffffffffffffff811161015b578260238201121561015b5780600401359267ffffffffffffffff841161015b576024848301011161015b576024019190565b600319604091011261015b576004359060243573ffffffffffffffffffffffffffffffffffffffff8116810361015b5790565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f602060409481855280519182918282880152018686015e5f8582860101520116010190565b6040810190811067ffffffffffffffff82111761083157604052565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff82111761083157604052565b92919267ffffffffffffffff821161083157604051916108e760207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116018461085e565b82948184528183011161015b578281602093845f960137010152565b9080601f8301121561015b5781602061091e9335910161089f565b90565b67ffffffffffffffff81116108315760051b60200190565b60208183031261015b5780359067ffffffffffffffff821161015b57019060408282031261015b576040519161096e83610815565b803567ffffffffffffffff811161015b578261098b918301610903565b835260208101359067ffffffffffffffff821161015b57019080601f8301121561015b5781356109ba81610921565b926109c8604051948561085e565b81845260208085019260051b8201019183831161015b5760208201905b8382106109f9575050505050602082015290565b813567ffffffffffffffff811161015b57602091610a1c87848094880101610903565b8152019101906109e5565b519067ffffffffffffffff8216820361015b57565b610a4891810190610939565b60205f818351604051918183925191829101835e8101838152039060025afa15610c915760205f8051604051838101917f01000000000000000000000000000000000000000000000000000000000000008352602182015260218152610aaf60418261085e565b604051918291518091835e8101838152039060025afa15610c9157610ada5f516020830151906113eb565b5160408180518101031261015b57604051610af481610815565b610b0f6040610b0560208501610a27565b9384845201610a27565b67ffffffffffffffff60208301938285521680151580610c7e575b15610c4457505067ffffffffffffffff8151165f52600460205267ffffffffffffffff60405f20541680610bf3575067ffffffffffffffff9051918183169260025490838260081c168511610bb6575b50505116905f52600460205260405f20907fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000008254161790555f90565b68ffffffffffffffff007fffffffffffffffffffffffffffffffffffffffffffffff0000000000000000ff9160081b169116176002555f80610b7a565b9167ffffffffffffffff9150511603610c0b57600290565b69010000000000000000007fffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffff6002541617600255600190565b67ffffffffffffffff92507fdcbc5460000000000000000000000000000000000000000000000000000000005f526004521660245260445ffd5b5067ffffffffffffffff82161515610b2a565b6040513d5f823e3d90fd5b9035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18136030182121561015b570180359067ffffffffffffffff821161015b57602001918160051b3603831361015b57565b3567ffffffffffffffff8116810361015b5790565b15610d0d5750565b67ffffffffffffffff907ff7caaa5c000000000000000000000000000000000000000000000000000000005f521660045260245ffd5b9035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18136030182121561015b570180359067ffffffffffffffff821161015b5760200191813603831361015b57565b60208183031261015b5780519067ffffffffffffffff821161015b57019060408282031261015b5760405191610dc983610815565b610dd281610a27565b835260208101519067ffffffffffffffff821161015b570181601f8201121561015b57805190610e0182610921565b92610e0f604051948561085e565b82845260208085019360061b8301019181831161015b57602001925b828410610e3e5750505050602082015290565b60408483031261015b5760206040918251610e5881610815565b865181528287015183820152815201930192610e2b565b15610e78575050565b9067ffffffffffffffff80927fc7441689000000000000000000000000000000000000000000000000000000005f52166004521660245260445ffd5b8051821015610ec85760209160051b010190565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b6060810190610f048282610c9c565b90506001610f128484610c9c565b9290500361109b5750610fb8610f2a60408301610cf0565b9267ffffffffffffffff841692835f526004602052610fb367ffffffffffffffff60405f20541694610f5e87871515610d05565b610f9e610f76610f6e8580610d43565b810190610939565b610f8e610f838251611365565b6020830151906113eb565b5160208082518301019101610d94565b9667ffffffffffffffff885116918214610e6f565b610c9c565b15610ec857610fd3610fcc82602093610d43565b369161089f565b818151910120920180515115611073575f5b8151805182101561104b57610ffb828692610eb4565b51511461100a57600101610fe5565b60209293506110199151610eb4565b5101516110235790565b7f9a960b4f000000000000000000000000000000000000000000000000000000005f5260045ffd5b7f291fc442000000000000000000000000000000000000000000000000000000005f5260045ffd5b7f1e6c84da000000000000000000000000000000000000000000000000000000005f5260045ffd5b7f88b3170e000000000000000000000000000000000000000000000000000000005f52600160045260245260445ffd5b608081016110d98183610d43565b9050156112005760608201906110ef8284610c9c565b905060016110fd8486610c9c565b9290500361109b575061111260408401610cf0565b9061117467ffffffffffffffff831693845f52600460205261116e67ffffffffffffffff60405f2054169561114986881515610d05565b611159610f76610f6e8a80610d43565b9567ffffffffffffffff875116918214610e6f565b85610c9c565b15610ec85760209161118c610fcc8361119894610d43565b83815191012095610d43565b908092918101031261015b576020903591019081515115611073575f5b8251805182101561104b576111cb828792610eb4565b515114806111e8575b6111e0576001016111b5565b505050905090565b508160206111f7838651610eb4565b510151146111d4565b7f1208b21b000000000000000000000000000000000000000000000000000000005f5260045ffd5b602060015491828152019060015f5260205f20905f5b81811061124b5750505090565b825473ffffffffffffffffffffffffffffffffffffffff1684526020909301926001928301920161123e565b335f9081527f4c48d1d2b0f4f7485fc28e3db22341d96a20aa29e6efa8149da9751603abd4e0602052604090205460ff16156112af57565b7fe2517d3f000000000000000000000000000000000000000000000000000000005f52336004527fbd893629a699470e4ec82a5715bb4981fdaacc5d0a728bf5f55b801d8f4ef10b60245260445ffd5b805f525f60205260405f2073ffffffffffffffffffffffffffffffffffffffff33165f5260205260ff60405f205416156113365750565b7fe2517d3f000000000000000000000000000000000000000000000000000000005f523360045260245260445ffd5b5f60208092604051918183925191829101835e8101838152039060025afa15610c915760205f8051604051838101917f020000000000000000000000000000000000000000000000000000000000000083526021820152602181526113cb60418261085e565b604051918291518091835e8101838152039060025afa15610c91575f5190565b91909182511561166457825160ff60025416907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82019060ff82116116375760ff8651921610156116095750508251927fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe061147e61146886610921565b95611476604051978861085e565b808752610921565b013660208601375f5b81518110156116025761149a8183610eb4565b5160418151036115cc5773ffffffffffffffffffffffffffffffffffffffff6114cf6114c68387611826565b90929192611860565b169081156115925750805f52600360205260ff60405f20541615611567575f5b82811061150c5750906001916115058288610eb4565b5201611487565b8173ffffffffffffffffffffffffffffffffffffffff61152c838a610eb4565b51161461153b576001016114ef565b507fe021c4f2000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b7fd7e8a2c2000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b6115c8906040519182917f9e3c1b3d000000000000000000000000000000000000000000000000000000008352600483016107cd565b0390fd5b6115c8906040519182917f2ee17a3d000000000000000000000000000000000000000000000000000000008352600483016107cd565b5050509050565b7f378b0805000000000000000000000000000000000000000000000000000000005f5260045260245260445ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b7f301b38b6000000000000000000000000000000000000000000000000000000005f5260045ffd5b805f525f60205260405f2073ffffffffffffffffffffffffffffffffffffffff83165f5260205260ff60405f205416155f1461175857805f525f60205260405f2073ffffffffffffffffffffffffffffffffffffffff83165f5260205260405f2060017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0082541617905573ffffffffffffffffffffffffffffffffffffffff339216907f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d5f80a4600190565b50505f90565b805f525f60205260405f2073ffffffffffffffffffffffffffffffffffffffff83165f5260205260ff60405f2054165f1461175857805f525f60205260405f2073ffffffffffffffffffffffffffffffffffffffff83165f5260205260405f207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00815416905573ffffffffffffffffffffffffffffffffffffffff339216907ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b5f80a4600190565b81519190604183036118565761184f9250602082015190606060408401519301515f1a9061190b565b9192909190565b50505f9160029190565b60048110156106715780611872575050565b600181036118a2577ff645eedf000000000000000000000000000000000000000000000000000000005f5260045ffd5b600281036118d657507ffce698f7000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b6003146118e05750565b7fd78bce0c000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b91907f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0841161198f579160209360809260ff5f9560405194855216868401526040830152606082015282805260015afa15610c91575f5173ffffffffffffffffffffffffffffffffffffffff81161561198557905f905f90565b505f906001905f90565b5050505f916003919056fea164736f6c634300081c000a2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d4c48d1d2b0f4f7485fc28e3db22341d96a20aa29e6efa8149da9751603abd4e06e0c24a6e293ff9b755263dbaa15ba3796b0b8d3fe17cfb4ddf8143b268eac47bd893629a699470e4ec82a5715bb4981fdaacc5d0a728bf5f55b801d8f4ef10bad3228b676f7d3cd4284a5443f17f1962b36e491b30a40b2405849e597ba5fb5","sourceMap":"822:11749:29:-:0;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;-1:-1:-1;;;;;822:11749:29;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;822:11749:29;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;:::i;:::-;;;;2655:28;822:11749;;2730:19;;;:69;;;822:11749;;;;;;;-1:-1:-1;822:11749:29;;;;;;-1:-1:-1;;;;;822:11749:29;;;;;;;;;;;;;;2900:217;;822:11749;;;;;2900:217;;822:11749;;;;;;;;;;;2900:217;822:11749;-1:-1:-1;822:11749:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;822:11749:29;;-1:-1:-1;822:11749:29;-1:-1:-1;822:11749:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;3178:3:29;822:11749;;3148:28;;;;;822:11749;;;;;;;;;;;;;;;-1:-1:-1;822:11749:29;3258:11;822:11749;;;;-1:-1:-1;822:11749:29;;;;;;;;-1:-1:-1;822:11749:29;3258:11;822:11749;;;-1:-1:-1;822:11749:29;;;;;;;;;;;3133:13;;822:11749;;;;-1:-1:-1;822:11749:29;;;;-1:-1:-1;822:11749:29;3148:28;-1:-1:-1;;822:11749:29;;;3379:27;822:11749;;;;;;;-1:-1:-1;;;;;;822:11749:29;-1:-1:-1;;;;;822:11749:29;;;;;;;;;-1:-1:-1;;;;;822:11749:29;;;;3503:44;;;:::i;:::-;;3458:249;822:11749;;;;;;;;;3458:249;3594:43;;3651:45;3594:43;;:::i;:::-;;3651:45;:::i;:::-;;3458:249;;822:11749;;;-1:-1:-1;;;;;822:11749:29;;;;;;;;;;;;;;;;-1:-1:-1;822:11749:29;;;;;;;;;;;;;;;;;;-1:-1:-1;822:11749:29;;;;;;;;;;-1:-1:-1;822:11749:29;;;;;-1:-1:-1;822:11749:29;;;;;;-1:-1:-1;822:11749:29;;;;;;-1:-1:-1;822:11749:29;2730:69;-1:-1:-1;822:11749:29;;-1:-1:-1;;822:11749:29;;;;;;;;;-1:-1:-1;2730:69:29;;822:11749;;;;-1:-1:-1;822:11749:29;;;;;-1:-1:-1;822:11749:29;;;;;-1:-1:-1;822:11749:29;;-1:-1:-1;822:11749:29;;-1:-1:-1;822:11749:29;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;-1:-1:-1;;822:11749:29;;;-1:-1:-1;;;;;822:11749:29;;;;;;;;;;:::o;:::-;;;-1:-1:-1;;;;;822:11749:29;;;;;;:::o;:::-;;;-1:-1:-1;;;;;822:11749:29;;;;;;:::o;6145:316:93:-;-1:-1:-1;;;;;822:11749:29;;2682:1;822:11749;;;-1:-1:-1;;;;;;;;;;;822:11749:29;;;;;;;;;;-1:-1:-1;;;;;822:11749:29;2682:1;822:11749;;;-1:-1:-1;;;;;;;;;;;822:11749:29;;;;;;;-1:-1:-1;;822:11749:29;;;;;735:10:121;;822:11749:29;-1:-1:-1;;;;;;;;;;;2682:1:29;;6336:40:93;6313:4;6390:11;:::o;6238:217::-;6432:12;2682:1:29;6432:12:93;:::o;6145:316::-;-1:-1:-1;;;;;822:11749:29;;;;;;-1:-1:-1;;;;;;;;;;;822:11749:29;;;;;;;;;;-1:-1:-1;;;;;822:11749:29;;;;;-1:-1:-1;;;;;;;;;;;822:11749:29;;;;;;;-1:-1:-1;;822:11749:29;;;;;735:10:121;;822:11749:29;-1:-1:-1;;;;;;;;;;;1514:33:29;-1:-1:-1;;;;;;;;;;;6336:40:93;822:11749:29;6336:40:93;6313:4;6390:11;:::o;6145:316::-;822:11749:29;;;-1:-1:-1;;;;;;;;;;;822:11749:29;;-1:-1:-1;;;;;;;;;;;822:11749:29;;;;;;;;;-1:-1:-1;;;;;;;;;;;822:11749:29;;-1:-1:-1;;;;;;;;;;;822:11749:29;;-1:-1:-1;;822:11749:29;6313:4:93;822:11749:29;;;735:10:121;;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;822:11749:29;;6336:40:93;6313:4;6390:11;:::o;6238:217::-;822:11749:29;6432:12:93;:::o","linkReferences":{}},"deployedBytecode":{"object":"0x6080806040526004361015610012575f80fd5b5f3560e01c90816301ffc9a7146106ab575080630bece356146105e8578063248a9ca3146105be5780632f2ff15d1461058f57806336568abe146105335780634d6d9ffb146104865780635832611b146104405780635972185a14610406578063682ed5f01461035157806391d1485414610308578063a217fddf146102ee578063a845a7f314610261578063d547741f1461022b578063ddba65371461015f5763ef913a4b146100c1575f80fd5b3461015b575f60031936011261015b576101576040516020808201526080604082015261014b816100f460c08201611228565b60ff600254818116606085015267ffffffffffffffff8160081c16608085015260481c16151560a0830152037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0810183528261085e565b604051918291826107cd565b0390f35b5f80fd5b3461015b5761016d36610749565b505060ff60025460481c16610203575f80527f4c48d1d2b0f4f7485fc28e3db22341d96a20aa29e6efa8149da9751603abd4e06020527f6e0c24a6e293ff9b755263dbaa15ba3796b0b8d3fe17cfb4ddf8143b268eac475460ff16156101f6575b7fda81d7c2000000000000000000000000000000000000000000000000000000005f5260045ffd5b6101fe611277565b6101ce565b7f928b1233000000000000000000000000000000000000000000000000000000005f5260045ffd5b3461015b5761025f61023c3661079a565b9061025a610255825f525f602052600160405f20015490565b6112ff565b61175e565b005b3461015b575f60031936011261015b5760ff6002541660405161028e8161028781611228565b038261085e565b60405190604082019260408352815180945260206060840192015f945b8086106102c057505082935060208301520390f35b909260208060019273ffffffffffffffffffffffffffffffffffffffff8751168152019401950194906102ab565b3461015b575f60031936011261015b5760206040515f8152f35b3461015b576103163661079a565b905f525f60205273ffffffffffffffffffffffffffffffffffffffff60405f2091165f52602052602060ff60405f2054166040519015158152f35b3461015b57602060031936011261015b5760043567ffffffffffffffff811161015b5760a0600319823603011261015b5760ff60025460481c16610203575f80527f4c48d1d2b0f4f7485fc28e3db22341d96a20aa29e6efa8149da9751603abd4e060209081527f6e0c24a6e293ff9b755263dbaa15ba3796b0b8d3fe17cfb4ddf8143b268eac475490916103f19160ff16156103f9575b6004016110cb565b604051908152f35b610401611277565b6103e9565b3461015b575f60031936011261015b5760206040517fbd893629a699470e4ec82a5715bb4981fdaacc5d0a728bf5f55b801d8f4ef10b8152f35b3461015b57602060031936011261015b5760043567ffffffffffffffff811680910361015b575f526004602052602067ffffffffffffffff60405f205416604051908152f35b3461015b57602060031936011261015b5760043567ffffffffffffffff811161015b576080600319823603011261015b5760ff60025460481c16610203575f80527f4c48d1d2b0f4f7485fc28e3db22341d96a20aa29e6efa8149da9751603abd4e060209081527f6e0c24a6e293ff9b755263dbaa15ba3796b0b8d3fe17cfb4ddf8143b268eac475490916103f19160ff1615610526575b600401610ef5565b61052e611277565b61051e565b3461015b576105413661079a565b3373ffffffffffffffffffffffffffffffffffffffff8216036105675761025f9161175e565b7f6697b232000000000000000000000000000000000000000000000000000000005f5260045ffd5b3461015b5761025f6105a03661079a565b906105b9610255825f525f602052600160405f20015490565b61168c565b3461015b57602060031936011261015b5760206103f16004355f525f602052600160405f20015490565b3461015b576105f636610749565b60ff60025460481c16610203575f80527f4c48d1d2b0f4f7485fc28e3db22341d96a20aa29e6efa8149da9751603abd4e06020527f6e0c24a6e293ff9b755263dbaa15ba3796b0b8d3fe17cfb4ddf8143b268eac475461065e929060ff161561069e57610a3c565b6040516003821015610671576020918152f35b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b6106a6611277565b610a3c565b3461015b57602060031936011261015b57600435907fffffffff00000000000000000000000000000000000000000000000000000000821680920361015b57817f7965db0b000000000000000000000000000000000000000000000000000000006020931490811561071f575b5015158152f35b7f01ffc9a70000000000000000000000000000000000000000000000000000000091501483610718565b90602060031983011261015b5760043567ffffffffffffffff811161015b578260238201121561015b5780600401359267ffffffffffffffff841161015b576024848301011161015b576024019190565b600319604091011261015b576004359060243573ffffffffffffffffffffffffffffffffffffffff8116810361015b5790565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f602060409481855280519182918282880152018686015e5f8582860101520116010190565b6040810190811067ffffffffffffffff82111761083157604052565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff82111761083157604052565b92919267ffffffffffffffff821161083157604051916108e760207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116018461085e565b82948184528183011161015b578281602093845f960137010152565b9080601f8301121561015b5781602061091e9335910161089f565b90565b67ffffffffffffffff81116108315760051b60200190565b60208183031261015b5780359067ffffffffffffffff821161015b57019060408282031261015b576040519161096e83610815565b803567ffffffffffffffff811161015b578261098b918301610903565b835260208101359067ffffffffffffffff821161015b57019080601f8301121561015b5781356109ba81610921565b926109c8604051948561085e565b81845260208085019260051b8201019183831161015b5760208201905b8382106109f9575050505050602082015290565b813567ffffffffffffffff811161015b57602091610a1c87848094880101610903565b8152019101906109e5565b519067ffffffffffffffff8216820361015b57565b610a4891810190610939565b60205f818351604051918183925191829101835e8101838152039060025afa15610c915760205f8051604051838101917f01000000000000000000000000000000000000000000000000000000000000008352602182015260218152610aaf60418261085e565b604051918291518091835e8101838152039060025afa15610c9157610ada5f516020830151906113eb565b5160408180518101031261015b57604051610af481610815565b610b0f6040610b0560208501610a27565b9384845201610a27565b67ffffffffffffffff60208301938285521680151580610c7e575b15610c4457505067ffffffffffffffff8151165f52600460205267ffffffffffffffff60405f20541680610bf3575067ffffffffffffffff9051918183169260025490838260081c168511610bb6575b50505116905f52600460205260405f20907fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000008254161790555f90565b68ffffffffffffffff007fffffffffffffffffffffffffffffffffffffffffffffff0000000000000000ff9160081b169116176002555f80610b7a565b9167ffffffffffffffff9150511603610c0b57600290565b69010000000000000000007fffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffff6002541617600255600190565b67ffffffffffffffff92507fdcbc5460000000000000000000000000000000000000000000000000000000005f526004521660245260445ffd5b5067ffffffffffffffff82161515610b2a565b6040513d5f823e3d90fd5b9035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18136030182121561015b570180359067ffffffffffffffff821161015b57602001918160051b3603831361015b57565b3567ffffffffffffffff8116810361015b5790565b15610d0d5750565b67ffffffffffffffff907ff7caaa5c000000000000000000000000000000000000000000000000000000005f521660045260245ffd5b9035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18136030182121561015b570180359067ffffffffffffffff821161015b5760200191813603831361015b57565b60208183031261015b5780519067ffffffffffffffff821161015b57019060408282031261015b5760405191610dc983610815565b610dd281610a27565b835260208101519067ffffffffffffffff821161015b570181601f8201121561015b57805190610e0182610921565b92610e0f604051948561085e565b82845260208085019360061b8301019181831161015b57602001925b828410610e3e5750505050602082015290565b60408483031261015b5760206040918251610e5881610815565b865181528287015183820152815201930192610e2b565b15610e78575050565b9067ffffffffffffffff80927fc7441689000000000000000000000000000000000000000000000000000000005f52166004521660245260445ffd5b8051821015610ec85760209160051b010190565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b6060810190610f048282610c9c565b90506001610f128484610c9c565b9290500361109b5750610fb8610f2a60408301610cf0565b9267ffffffffffffffff841692835f526004602052610fb367ffffffffffffffff60405f20541694610f5e87871515610d05565b610f9e610f76610f6e8580610d43565b810190610939565b610f8e610f838251611365565b6020830151906113eb565b5160208082518301019101610d94565b9667ffffffffffffffff885116918214610e6f565b610c9c565b15610ec857610fd3610fcc82602093610d43565b369161089f565b818151910120920180515115611073575f5b8151805182101561104b57610ffb828692610eb4565b51511461100a57600101610fe5565b60209293506110199151610eb4565b5101516110235790565b7f9a960b4f000000000000000000000000000000000000000000000000000000005f5260045ffd5b7f291fc442000000000000000000000000000000000000000000000000000000005f5260045ffd5b7f1e6c84da000000000000000000000000000000000000000000000000000000005f5260045ffd5b7f88b3170e000000000000000000000000000000000000000000000000000000005f52600160045260245260445ffd5b608081016110d98183610d43565b9050156112005760608201906110ef8284610c9c565b905060016110fd8486610c9c565b9290500361109b575061111260408401610cf0565b9061117467ffffffffffffffff831693845f52600460205261116e67ffffffffffffffff60405f2054169561114986881515610d05565b611159610f76610f6e8a80610d43565b9567ffffffffffffffff875116918214610e6f565b85610c9c565b15610ec85760209161118c610fcc8361119894610d43565b83815191012095610d43565b908092918101031261015b576020903591019081515115611073575f5b8251805182101561104b576111cb828792610eb4565b515114806111e8575b6111e0576001016111b5565b505050905090565b508160206111f7838651610eb4565b510151146111d4565b7f1208b21b000000000000000000000000000000000000000000000000000000005f5260045ffd5b602060015491828152019060015f5260205f20905f5b81811061124b5750505090565b825473ffffffffffffffffffffffffffffffffffffffff1684526020909301926001928301920161123e565b335f9081527f4c48d1d2b0f4f7485fc28e3db22341d96a20aa29e6efa8149da9751603abd4e0602052604090205460ff16156112af57565b7fe2517d3f000000000000000000000000000000000000000000000000000000005f52336004527fbd893629a699470e4ec82a5715bb4981fdaacc5d0a728bf5f55b801d8f4ef10b60245260445ffd5b805f525f60205260405f2073ffffffffffffffffffffffffffffffffffffffff33165f5260205260ff60405f205416156113365750565b7fe2517d3f000000000000000000000000000000000000000000000000000000005f523360045260245260445ffd5b5f60208092604051918183925191829101835e8101838152039060025afa15610c915760205f8051604051838101917f020000000000000000000000000000000000000000000000000000000000000083526021820152602181526113cb60418261085e565b604051918291518091835e8101838152039060025afa15610c91575f5190565b91909182511561166457825160ff60025416907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82019060ff82116116375760ff8651921610156116095750508251927fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe061147e61146886610921565b95611476604051978861085e565b808752610921565b013660208601375f5b81518110156116025761149a8183610eb4565b5160418151036115cc5773ffffffffffffffffffffffffffffffffffffffff6114cf6114c68387611826565b90929192611860565b169081156115925750805f52600360205260ff60405f20541615611567575f5b82811061150c5750906001916115058288610eb4565b5201611487565b8173ffffffffffffffffffffffffffffffffffffffff61152c838a610eb4565b51161461153b576001016114ef565b507fe021c4f2000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b7fd7e8a2c2000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b6115c8906040519182917f9e3c1b3d000000000000000000000000000000000000000000000000000000008352600483016107cd565b0390fd5b6115c8906040519182917f2ee17a3d000000000000000000000000000000000000000000000000000000008352600483016107cd565b5050509050565b7f378b0805000000000000000000000000000000000000000000000000000000005f5260045260245260445ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b7f301b38b6000000000000000000000000000000000000000000000000000000005f5260045ffd5b805f525f60205260405f2073ffffffffffffffffffffffffffffffffffffffff83165f5260205260ff60405f205416155f1461175857805f525f60205260405f2073ffffffffffffffffffffffffffffffffffffffff83165f5260205260405f2060017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0082541617905573ffffffffffffffffffffffffffffffffffffffff339216907f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d5f80a4600190565b50505f90565b805f525f60205260405f2073ffffffffffffffffffffffffffffffffffffffff83165f5260205260ff60405f2054165f1461175857805f525f60205260405f2073ffffffffffffffffffffffffffffffffffffffff83165f5260205260405f207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00815416905573ffffffffffffffffffffffffffffffffffffffff339216907ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b5f80a4600190565b81519190604183036118565761184f9250602082015190606060408401519301515f1a9061190b565b9192909190565b50505f9160029190565b60048110156106715780611872575050565b600181036118a2577ff645eedf000000000000000000000000000000000000000000000000000000005f5260045ffd5b600281036118d657507ffce698f7000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b6003146118e05750565b7fd78bce0c000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b91907f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0841161198f579160209360809260ff5f9560405194855216868401526040830152606082015282805260015afa15610c91575f5173ffffffffffffffffffffffffffffffffffffffff81161561198557905f905f90565b505f906001905f90565b5050505f916003919056fea164736f6c634300081c000a","sourceMap":"822:11749:29:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;822:11749:29;;;;;;;;3832:23;;;;822:11749;;;;;;3832:23;822:11749;;;;;;:::i;:::-;;;;;;;;;;;;1794:4;;;822:11749;;;;;;;;;;;;;;3832:23;;;;;;;;:::i;:::-;822:11749;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;;;;12232:20;822:11749;;;;;;;;;;;;;;;;12451:42;12447:105;;822:11749;9717:21;822:11749;9717:21;822:11749;;9717:21;12447:105;12520:20;;:::i;:::-;12447:105;;822:11749;;;;;;;;;;;4713:26:93;822:11749:29;;;:::i;:::-;4683:18:93;2475:4;4683:18;;3867:6;822:11749:29;3867:6:93;822:11749:29;;3867:22:93;822:11749:29;3867:6:93;822:11749:29;3867:22:93;822:11749:29;3776:120:93;;4683:18;2475:4;:::i;:::-;4713:26;:::i;:::-;822:11749:29;;;;;;-1:-1:-1;;822:11749:29;;;;;;4072:27;822:11749;;;;;;;;;:::i;:::-;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4041:11;822:11749;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;822:11749:29;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;2920:29:93;822:11749:29;-1:-1:-1;822:11749:29;;;;;;-1:-1:-1;822:11749:29;;;;;;;;;;;;;;;;-1:-1:-1;;822:11749:29;;;;;;;;;;;;;-1:-1:-1;;822:11749:29;;;;;;;;12232:20;822:11749;;;;;;;;;;;;;;;;;;5848:1853;;822:11749;;12451:42;12447:105;;822:11749;;;5848:1853;:::i;:::-;822:11749;;;;;;12447:105;12520:20;;:::i;:::-;12447:105;;822:11749;;;;;-1:-1:-1;;822:11749:29;;;;;;;;1514:33;822:11749;;;;;;;;-1:-1:-1;;822:11749:29;;;;;;;;;;;;;;;;1794:4;822:11749;;1794:4;822:11749;;;;1794:4;;822:11749;;;;;;;;;;;;-1:-1:-1;;822:11749:29;;;;;;;;;;;;;-1:-1:-1;;822:11749:29;;;;;;;;12232:20;822:11749;;;;;;;;;;;;;;;;;;7740:1799;;822:11749;;12451:42;12447:105;;822:11749;;;7740:1799;:::i;12447:105::-;12520:20;;:::i;:::-;12447:105;;822:11749;;;;;;;:::i;:::-;735:10:121;822:11749:29;;;5387:34:93;5383:102;;5495:37;;;:::i;5383:102::-;5444:30;822:11749:29;5444:30:93;822:11749:29;;5444:30:93;822:11749:29;;;;4296:25:93;822:11749:29;;;:::i;:::-;4266:18:93;2475:4;4266:18;;3867:6;822:11749:29;3867:6:93;822:11749:29;;3867:22:93;822:11749:29;3867:6:93;822:11749:29;3867:22:93;822:11749:29;3776:120:93;;2475:4;4296:25;:::i;822:11749:29:-;;;;;-1:-1:-1;;822:11749:29;;;;;;;;;3867:6:93;822:11749:29;3867:6:93;822:11749:29;;3867:22:93;822:11749:29;3867:6:93;822:11749:29;3867:22:93;822:11749:29;3776:120:93;;822:11749:29;;;;;;;:::i;:::-;;12232:20;822:11749;;;;;;;;;;;;;;4348:1461;;822:11749;;;12451:42;12447:105;;4348:1461;:::i;:::-;822:11749;;;;;;;;;;;;;;;;;;;;;;;12447:105;12520:20;;:::i;:::-;4348:1461;:::i;822:11749::-;;;;;-1:-1:-1;;822:11749:29;;;;;;;;;;;;;;;;2639:47:93;2654:32;822:11749:29;2639:47:93;;:87;;;;;822:11749:29;;;;;;;2639:87:93;844:25:133;829:40;;;2639:87:93;;;822:11749:29;;;-1:-1:-1;;822:11749:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;-1:-1:-1;;822:11749:29;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;:::o;:::-;;-1:-1:-1;822:11749:29;;;;;-1:-1:-1;822:11749:29;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;-1:-1:-1;822:11749:29;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;:::i;:::-;;:::o;:::-;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;1794:4;;822:11749;;;;;;;;1794:4::o;4348:1461::-;4569:58;4348:1461;4569:58;;;;:::i;:::-;822:11749;-1:-1:-1;4675:21:29;;;822:11749;;;;;;;;;;;;;;;;;;10132:12;;;;;;;;822:11749;-1:-1:-1;10132:12:29;;822:11749;;10106:39;;;822:11749;;;;;;;;;10106:39;;;;;;:::i;:::-;822:11749;;;;;;;;;;;;;;;10099:47;;10132:12;10099:47;;;;;4766:16;-1:-1:-1;10099:47:29;822:11749;4766:16;;;;;:::i;:::-;4866:21;822:11749;;;;4855:70;;1794:4;;;;822:11749;;;;;:::i;:::-;1794:4;822:11749;1794:4;822:11749;4855:70;;1794:4;:::i;:::-;;;;;;;:::i;:::-;822:11749;;1794:4;;;;;;822:11749;4944:16;;;:39;;;4348:1461;1794:4;;;;;822:11749;1794:4;;822:11749;-1:-1:-1;1794:4:29;5234:27;822:11749;1794:4;822:11749;;-1:-1:-1;1794:4:29;;822:11749;5289:22;5285:276;;1794:4;822:11749;1794:4;;822:11749;;;;1794:4;10132:12;1794:4;;;;;;822:11749;5575:39;;5571:109;;4348:1461;1794:4;;;822:11749;1794:4;-1:-1:-1;1794:4:29;5234:27;822:11749;1794:4;822:11749;-1:-1:-1;1794:4:29;;;;;;;;;-1:-1:-1;4348:1461:29;:::o;5571:109::-;1794:4;;;;;;;;;10132:12;1794:4;5571:109;;;;5285:276;1794:4;822:11749;1794:4;;;822:11749;5331:36;5327:169;;10132:12;5509:41;:::o;5327:169::-;1794:4;;10132:12;1794:4;;;10132:12;1794:4;;5432:49;:::o;1794:4::-;822:11749;1794:4;;;-1:-1:-1;1794:4:29;;822:11749;;1794:4;822:11749;1794:4;-1:-1:-1;1794:4:29;4944:39;822:11749;;;;4964:19;;4944:39;;10099:47;822:11749;;;-1:-1:-1;822:11749:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;:::o;:::-;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;1917:4::-;;;;;;;;;;;;;;;;;;;;;;;;;;822:11749;;;;;:::i;:::-;1794:4;;;:::i;:::-;1917;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;822:11749;;1917:4;822:11749;;;;:::i;:::-;1917:4;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;822:11749;;;;;;:::i;:::-;1917:4;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;822:11749;1917:4;;;;;822:11749;1917:4;822:11749;;1794:4;822:11749;1794:4;1917;;;822:11749;;1917:4;;;;;;;;;;;;:::o;:::-;;;;;;;;;;7740:1799;7947:9;;;;;;;;:::i;:::-;7991;;7967:1;7991:9;;;;:::i;:::-;7947:21;;;;822:11749;;8111:31;9125:9;8111:31;;;;;:::i;:::-;822:11749;;;;1794:4;;-1:-1:-1;1794:4:29;8164:27;8111:16;1794:4;8900:103;822:11749;8111:31;-1:-1:-1;1794:4:29;;822:11749;8222:7;8214:57;8222:7;;;;8214:57;:::i;:::-;8746:71;8331:59;8342:10;;;;:::i;:::-;8331:59;;;;:::i;:::-;8529:16;8417:67;8437:21;;8417:67;:::i;:::-;8111:16;8529;;;;;:::i;:::-;8757:21;8111:16;822:11749;;;8746:71;;;;;;:::i;:::-;1794:4;822:11749;1794:4;;822:11749;8908:39;;;8900:103;:::i;:::-;9125:9;:::i;:::-;1917:4;;;;;;8111:16;1917:4;;:::i;:::-;;;;:::i;:::-;822:11749;;;;;9115:23;9156:25;;;;822:11749;9156:36;1917:4;;-1:-1:-1;9277:3:29;9243:25;;822:11749;;9239:36;;;;;9300:28;;;;;:::i;:::-;;1917:4;9300:45;9296:198;;7967:1;1917:4;9224:13;;9296:198;8111:16;9373:25;;;:28;:25;;:28;:::i;:::-;;:39;1917:4;;;9461:18;:::o;1917:4::-;;-1:-1:-1;1917:4:29;8164:27;-1:-1:-1;1917:4:29;9239:36;9521:11;-1:-1:-1;9521:11:29;8164:27;-1:-1:-1;9521:11:29;1917:4;;-1:-1:-1;1917:4:29;8164:27;-1:-1:-1;1917:4:29;822:11749;;;;7967:1;822:11749;;;;;;;5848:1853;6049:10;;;;;;;:::i;:::-;:22;;;822:11749;;6104:9;;;;;;;;:::i;:::-;6148;;6124:1;6148:9;;;;:::i;:::-;6104:21;;;;822:11749;;6268:31;;;;;;:::i;:::-;822:11749;7272:9;822:11749;;;1794:4;;6070:1;1794:4;6321:27;6268:16;1794:4;7057:103;822:11749;6268:31;6070:1;1794:4;;822:11749;6379:7;6371:57;6379:7;;;;6371:57;:::i;:::-;6903:71;6488:59;6499:10;;;;:::i;6903:71::-;1794:4;822:11749;1794:4;;822:11749;7065:39;;;7057:103;:::i;:::-;7272:9;;:::i;:::-;1917:4;;;6268:16;1917:4;;;;7322:10;1917:4;;:::i;:::-;822:11749;;;;;7262:23;7322:10;;:::i;:::-;7311:33;;;;;;822:11749;;;;6268:16;822:11749;;7362:25;;;;;822:11749;7362:36;1917:4;;6070:1;7483:3;7449:25;;822:11749;;7445:36;;;;;7506:28;;;;;:::i;:::-;;1917:4;7506:45;:97;;;7483:3;7502:154;;6124:1;1917:4;7430:13;;7502:154;7623:18;;;;;;:::o;7506:97::-;7555:25;;6268:16;7555:28;:25;;;:28;:::i;:::-;;:39;1917:4;7555:48;7506:97;;822:11749;;6070:1;822:11749;;6070:1;822:11749;;;4041:11;822:11749;;;;;;;4041:11;-1:-1:-1;822:11749:29;;-1:-1:-1;822:11749:29;;-1:-1:-1;822:11749:29;;;;;;;;;;:::o;:::-;;;;;;;;;;;;4041:11;822:11749;;;;;;;3165:103:93;735:10:121;2920:6:93;822:11749:29;;;;;;;;;;;;3485:23:93;3481:108;;3165:103::o;3481:108::-;3531:47;2920:6;3531:47;735:10:121;3531:47:93;822:11749:29;1514:33;822:11749;;;2920:6:93;3531:47;3165:103;822:11749:29;2920:6:93;822:11749:29;2920:6:93;822:11749:29;;;2920:6:93;822:11749:29;;735:10:121;822:11749:29;-1:-1:-1;822:11749:29;;;;;-1:-1:-1;822:11749:29;;;3485:23:93;3481:108;;3165:103;:::o;3481:108::-;3531:47;2920:6;3531:47;735:10:121;3531:47:93;822:11749:29;;;;2920:6:93;3531:47;9987:166:29;-1:-1:-1;822:11749:29;9987:166;;822:11749;;;;;;;;;;;;;;;;;;10132:12;;;;;;;;822:11749;-1:-1:-1;10132:12:29;;822:11749;;10106:39;;;822:11749;;;;;;;;;10106:39;;;;;;:::i;:::-;822:11749;;;;;;;;;;;;;;;10099:47;;10132:12;10099:47;;;;;-1:-1:-1;10099:47:29;9987:166;:::o;10569:773::-;;;;822:11749;;10679:21;822:11749;;;;;10772:27;822:11749;;;;;;;;;;;;;;;;;-1:-1:-1;822:11749:29;;;;;;;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;:::i;:::-;;;;;;;10699:1;11010:3;822:11749;;10987:21;;;;;11048:13;;;;:::i;:::-;;1667:2;822:11749;;11818:42;1667:2;;822:11749;5489:8:131;5433:27;;;;:::i;:::-;5489:8;;;;;:::i;:::-;822:11749:29;11977:23;;;1667:2;;822:11749;;10699:1;822:11749;12048:11;822:11749;;;;10699:1;822:11749;;;1667:2;;;10699:1;11191:5;;;;;;11306:19;;10772:11;11306:19;;;;;:::i;:::-;822:11749;1917:4;10972:13;;11198:3;11229:7;822:11749;11229:7;;;;:::i;:::-;822:11749;;11229:20;822:11749;;10772:11;1917:4;11176:13;;822:11749;;;10699:1;822:11749;;;;10699:1;822:11749;1667:2;;10699:1;1667:2;;822:11749;;10699:1;1667:2;;;822:11749;;;1667:2;;;;;;;;;;:::i;:::-;;;;;;822:11749;;;1667:2;;;;;;;;;;:::i;10987:21::-;;;;;;10569:773::o;822:11749::-;;10699:1;822:11749;;;;;;10699:1;822:11749;;;10699:1;822:11749;;;;;10699:1;822:11749;;;10699:1;822:11749;;10699:1;822:11749;6145:316:93;822:11749:29;;;;;;;;;;;;-1:-1:-1;822:11749:29;;;;;-1:-1:-1;822:11749:29;;;6242:23:93;6238:217;822:11749:29;;;;;;;;;;;;;;;-1:-1:-1;822:11749:29;;;;-1:-1:-1;822:11749:29;6313:4:93;822:11749:29;;;;;;;;735:10:121;822:11749:29;;6336:40:93;;822:11749:29;6336:40:93;;6313:4;6390:11;:::o;6238:217::-;6432:12;;822:11749:29;6432:12:93;:::o;6698:317::-;822:11749:29;;;;;;;;;;;;-1:-1:-1;822:11749:29;;;;;-1:-1:-1;822:11749:29;;;6792:217:93;822:11749:29;;;;;;;;;;;;;;;-1:-1:-1;822:11749:29;;;;-1:-1:-1;822:11749:29;;;;;;;;735:10:121;822:11749:29;;6890:40:93;;822:11749:29;6890:40:93;;822:11749:29;6944:11:93;:::o;2419:778:131:-;822:11749:29;;;2419:778:131;2609:2;2589:22;;2609:2;;3041:25;2825:196;;;;;;;;;;;;;;;-1:-1:-1;2825:196:131;3041:25;;:::i;:::-;3034:32;;;;;:::o;2585:606::-;3097:83;;3113:1;3097:83;3117:35;3097:83;;:::o;11617:532::-;822:11749:29;;;;;;11703:29:131;;;11748:7;;:::o;11699:444::-;822:11749:29;11799:38:131;;822:11749:29;;11860:23:131;11712:20;11860:23;822:11749:29;11712:20:131;11860:23;11795:348;11913:35;11904:44;;11913:35;;11971:46;;11712:20;11971:46;822:11749:29;;;11712:20:131;11971:46;11900:243;12047:30;12038:39;12034:109;;11900:243;11617:532::o;12034:109::-;12100:32;11712:20;12100:32;822:11749:29;;;11712:20:131;12100:32;7129:1551;;;8209:66;8196:79;;8192:164;;822:11749:29;;;;;;-1:-1:-1;822:11749:29;;;;;;;;;;;;;;;;;;;8467:24:131;;;;;;;;;-1:-1:-1;8467:24:131;822:11749:29;;;8505:20:131;8501:113;;8624:49;-1:-1:-1;8624:49:131;-1:-1:-1;7129:1551:131;:::o;8501:113::-;8541:62;-1:-1:-1;8541:62:131;8467:24;8541:62;-1:-1:-1;8541:62:131;:::o;8192:164::-;8291:54;;;8307:1;8291:54;8311:30;8291:54;;:::o","linkReferences":{}},"methodIdentifiers":{"DEFAULT_ADMIN_ROLE()":"a217fddf","PROOF_SUBMITTER_ROLE()":"5972185a","getAttestationSet()":"a845a7f3","getClientState()":"ef913a4b","getConsensusTimestamp(uint64)":"5832611b","getRoleAdmin(bytes32)":"248a9ca3","grantRole(bytes32,address)":"2f2ff15d","hasRole(bytes32,address)":"91d14854","misbehaviour(bytes)":"ddba6537","renounceRole(bytes32,address)":"36568abe","revokeRole(bytes32,address)":"d547741f","supportsInterface(bytes4)":"01ffc9a7","updateClient(bytes)":"0bece356","verifyMembership((bytes,(uint64,uint64),bytes[],bytes))":"682ed5f0","verifyNonMembership((bytes,(uint64,uint64),bytes[]))":"4d6d9ffb"},"rawMetadata":"{\"compiler\":{\"version\":\"0.8.28+commit.7893614a\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"attestorAddresses\",\"type\":\"address[]\"},{\"internalType\":\"uint8\",\"name\":\"minRequiredSigs\",\"type\":\"uint8\"},{\"internalType\":\"uint64\",\"name\":\"initialHeight\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"initialTimestampSeconds\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"roleManager\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"AccessControlBadConfirmation\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"internalType\":\"bytes32\",\"name\":\"neededRole\",\"type\":\"bytes32\"}],\"name\":\"AccessControlUnauthorizedAccount\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint8\",\"name\":\"minRequired\",\"type\":\"uint8\"},{\"internalType\":\"uint256\",\"name\":\"attestationCount\",\"type\":\"uint256\"}],\"name\":\"BadQuorum\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"height\",\"type\":\"uint64\"}],\"name\":\"ConsensusTimestampNotFound\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"signer\",\"type\":\"address\"}],\"name\":\"DuplicateSigner\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ECDSAInvalidSignature\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"length\",\"type\":\"uint256\"}],\"name\":\"ECDSAInvalidSignatureLength\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"s\",\"type\":\"bytes32\"}],\"name\":\"ECDSAInvalidSignatureS\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"EmptyPackets\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"EmptySignatures\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"EmptyValue\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"FeatureNotSupported\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"FrozenClientState\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"expected\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"provided\",\"type\":\"uint64\"}],\"name\":\"HeightMismatch\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"expectedLength\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"providedLength\",\"type\":\"uint256\"}],\"name\":\"InvalidPathLength\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"signature\",\"type\":\"bytes\"}],\"name\":\"InvalidSignatureLength\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"height\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"timestamp\",\"type\":\"uint64\"}],\"name\":\"InvalidState\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"NoAttestors\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"NotMember\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"NotNonMember\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"signature\",\"type\":\"bytes\"}],\"name\":\"SignatureInvalid\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"validSigners\",\"type\":\"uint256\"},{\"internalType\":\"uint8\",\"name\":\"minRequired\",\"type\":\"uint8\"}],\"name\":\"ThresholdNotMet\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"signer\",\"type\":\"address\"}],\"name\":\"UnknownSigner\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"previousAdminRole\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"newAdminRole\",\"type\":\"bytes32\"}],\"name\":\"RoleAdminChanged\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"RoleGranted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"RoleRevoked\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"DEFAULT_ADMIN_ROLE\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"PROOF_SUBMITTER_ROLE\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getAttestationSet\",\"outputs\":[{\"internalType\":\"address[]\",\"name\":\"attestorAddresses\",\"type\":\"address[]\"},{\"internalType\":\"uint8\",\"name\":\"minRequiredSigs\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getClientState\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"revisionHeight\",\"type\":\"uint64\"}],\"name\":\"getConsensusTimestamp\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"}],\"name\":\"getRoleAdmin\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"grantRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"hasRole\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"name\":\"misbehaviour\",\"outputs\":[],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"callerConfirmation\",\"type\":\"address\"}],\"name\":\"renounceRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"revokeRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes4\",\"name\":\"interfaceId\",\"type\":\"bytes4\"}],\"name\":\"supportsInterface\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"updateMsg\",\"type\":\"bytes\"}],\"name\":\"updateClient\",\"outputs\":[{\"internalType\":\"enum ILightClientMsgs.UpdateResult\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes\",\"name\":\"proof\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"uint64\",\"name\":\"revisionNumber\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"revisionHeight\",\"type\":\"uint64\"}],\"internalType\":\"struct IICS02ClientMsgs.Height\",\"name\":\"proofHeight\",\"type\":\"tuple\"},{\"internalType\":\"bytes[]\",\"name\":\"path\",\"type\":\"bytes[]\"},{\"internalType\":\"bytes\",\"name\":\"value\",\"type\":\"bytes\"}],\"internalType\":\"struct ILightClientMsgs.MsgVerifyMembership\",\"name\":\"msg_\",\"type\":\"tuple\"}],\"name\":\"verifyMembership\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes\",\"name\":\"proof\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"uint64\",\"name\":\"revisionNumber\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"revisionHeight\",\"type\":\"uint64\"}],\"internalType\":\"struct IICS02ClientMsgs.Height\",\"name\":\"proofHeight\",\"type\":\"tuple\"},{\"internalType\":\"bytes[]\",\"name\":\"path\",\"type\":\"bytes[]\"}],\"internalType\":\"struct ILightClientMsgs.MsgVerifyNonMembership\",\"name\":\"msg_\",\"type\":\"tuple\"}],\"name\":\"verifyNonMembership\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"errors\":{\"AccessControlBadConfirmation()\":[{\"details\":\"The caller of a function is not the expected one. NOTE: Don't confuse with {AccessControlUnauthorizedAccount}.\"}],\"AccessControlUnauthorizedAccount(address,bytes32)\":[{\"details\":\"The `account` is missing a role.\"}],\"BadQuorum(uint8,uint256)\":[{\"params\":{\"attestationCount\":\"The size of the configured attestation set.\",\"minRequired\":\"The provided minimum required signatures.\"}}],\"ConsensusTimestampNotFound(uint64)\":[{\"params\":{\"height\":\"The height that has no associated timestamp.\"}}],\"DuplicateSigner(address)\":[{\"params\":{\"signer\":\"Address of the duplicate signer.\"}}],\"ECDSAInvalidSignature()\":[{\"details\":\"The signature is invalid.\"}],\"ECDSAInvalidSignatureLength(uint256)\":[{\"details\":\"The signature has an invalid length.\"}],\"ECDSAInvalidSignatureS(bytes32)\":[{\"details\":\"The signature has an S value that is in the upper half order.\"}],\"HeightMismatch(uint64,uint64)\":[{\"params\":{\"expected\":\"The expected height from the proofHeight field.\",\"provided\":\"The height that was present in the attested payload.\"}}],\"InvalidPathLength(uint256,uint256)\":[{\"params\":{\"expectedLength\":\"The expected length of the path.\",\"providedLength\":\"The length of the provided path.\"}}],\"InvalidSignatureLength(bytes)\":[{\"params\":{\"signature\":\"The invalid signature.\"}}],\"InvalidState(uint64,uint64)\":[{\"params\":{\"height\":\"The height of the attested state.\",\"timestamp\":\"The timestamp of the attested state.\"}}],\"SignatureInvalid(bytes)\":[{\"params\":{\"signature\":\"The invalid signature.\"}}],\"ThresholdNotMet(uint256,uint8)\":[{\"params\":{\"minRequired\":\"The minimum required signatures.\",\"validSigners\":\"Number of valid, unique attestation signatures.\"}}],\"UnknownSigner(address)\":[{\"params\":{\"signer\":\"Address of the unknown signer.\"}}]},\"events\":{\"RoleAdminChanged(bytes32,bytes32,bytes32)\":{\"details\":\"Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite {RoleAdminChanged} not being emitted to signal this.\"},\"RoleGranted(bytes32,address,address)\":{\"details\":\"Emitted when `account` is granted `role`. `sender` is the account that originated the contract call. This account bears the admin role (for the granted role). Expected in cases where the role was granted using the internal {AccessControl-_grantRole}.\"},\"RoleRevoked(bytes32,address,address)\":{\"details\":\"Emitted when `account` is revoked `role`. `sender` is the account that originated the contract call: - if using `revokeRole`, it is the admin role bearer - if using `renounceRole`, it is the role bearer (i.e. `account`)\"}},\"kind\":\"dev\",\"methods\":{\"constructor\":{\"params\":{\"attestorAddresses\":\"The configured attestor addresses (EOAs)\",\"initialHeight\":\"The initial known height\",\"initialTimestampSeconds\":\"The initial timestamp in seconds for the initial height\",\"minRequiredSigs\":\"The quorum threshold\",\"roleManager\":\"Address that will administer roles and be allowed to submit proofs; if zero, anyone can submit\"}},\"getAttestationSet()\":{\"details\":\"The attestation set is fixed for the initial scope; rotation is out of scope.\",\"returns\":{\"attestorAddresses\":\"The configured attestor EOA addresses\",\"minRequiredSigs\":\"The minimum number of unique valid signatures required\"}},\"getClientState()\":{\"returns\":{\"_0\":\"The client state.\"}},\"getConsensusTimestamp(uint64)\":{\"params\":{\"revisionHeight\":\"The height for which to query the timestamp\"},\"returns\":{\"_0\":\"The trusted timestamp in unix seconds\"}},\"getRoleAdmin(bytes32)\":{\"details\":\"Returns the admin role that controls `role`. See {grantRole} and {revokeRole}. To change a role's admin, use {_setRoleAdmin}.\"},\"grantRole(bytes32,address)\":{\"details\":\"Grants `role` to `account`. If `account` had not been already granted `role`, emits a {RoleGranted} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleGranted} event.\"},\"hasRole(bytes32,address)\":{\"details\":\"Returns `true` if `account` has been granted `role`.\"},\"misbehaviour(bytes)\":{\"params\":{\"misbehaviourMsg\":\"The misbehaviour message\"}},\"renounceRole(bytes32,address)\":{\"details\":\"Revokes `role` from the calling account. Roles are often managed via {grantRole} and {revokeRole}: this function's purpose is to provide a mechanism for accounts to lose their privileges if they are compromised (such as when a trusted device is misplaced). If the calling account had been revoked `role`, emits a {RoleRevoked} event. Requirements: - the caller must be `callerConfirmation`. May emit a {RoleRevoked} event.\"},\"revokeRole(bytes32,address)\":{\"details\":\"Revokes `role` from `account`. If `account` had been granted `role`, emits a {RoleRevoked} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleRevoked} event.\"},\"supportsInterface(bytes4)\":{\"details\":\"Returns true if this contract implements the interface defined by `interfaceId`. See the corresponding https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[ERC section] to learn more about how these ids are created. This function call must use less than 30 000 gas.\"},\"updateClient(bytes)\":{\"params\":{\"updateMsg\":\"The encoded update message e.g., an SP1 proof.\"},\"returns\":{\"_0\":\"The result of the update operation\"}},\"verifyMembership((bytes,(uint64,uint64),bytes[],bytes))\":{\"details\":\"Notice that this message is not view, as it may update the client state for caching purposes.\",\"params\":{\"msg_\":\"The membership message\"},\"returns\":{\"_0\":\"The unix timestamp of the verification height in the counterparty chain in seconds.\"}},\"verifyNonMembership((bytes,(uint64,uint64),bytes[]))\":{\"details\":\"Notice that this message is not view, as it may update the client state for caching purposes.\",\"params\":{\"msg_\":\"The membership message\"},\"returns\":{\"_0\":\"The unix timestamp of the verification height in the counterparty chain in seconds.\"}}},\"stateVariables\":{\"PROOF_SUBMITTER_ROLE\":{\"details\":\"If `address(0)` has this role, then anyone can submit proofs. If this client is used with `ICS26Router`, the router must be granted this role.\",\"return\":\"The role identifier\",\"returns\":{\"_0\":\"The role identifier\"}}},\"title\":\"Attestation-based IBC Light Client\",\"version\":1},\"userdoc\":{\"errors\":{\"BadQuorum(uint8,uint256)\":[{\"notice\":\"Reverts when the quorum threshold is zero or exceeds the attestation count.\"}],\"ConsensusTimestampNotFound(uint64)\":[{\"notice\":\"Missing trusted timestamp for the given height.\"}],\"DuplicateSigner(address)\":[{\"notice\":\"The recovered signer appears more than once among the signatures.\"}],\"EmptyPackets()\":[{\"notice\":\"The provided packet attestations were empty.\"}],\"EmptySignatures()\":[{\"notice\":\"The provided signatures were empty.\"}],\"EmptyValue()\":[{\"notice\":\"The provided membership value was empty.\"}],\"FeatureNotSupported()\":[{\"notice\":\"Reverts for functions that are out of scope for this implementation.\"}],\"FrozenClientState()\":[{\"notice\":\"Reverts when an action is attempted on a frozen client state.\"}],\"HeightMismatch(uint64,uint64)\":[{\"notice\":\"The attested height did not match the provided proof height.\"}],\"InvalidPathLength(uint256,uint256)\":[{\"notice\":\"The provided proof path length is invalid.\"}],\"InvalidSignatureLength(bytes)\":[{\"notice\":\"ECDSA signature has an invalid length.\"}],\"InvalidState(uint64,uint64)\":[{\"notice\":\"The attested state is invalid.\"}],\"NoAttestors()\":[{\"notice\":\"Reverts when the attestation set is empty during initialization.\"}],\"NotMember()\":[{\"notice\":\"The provided value is not a member of the attested set.\"}],\"NotNonMember()\":[{\"notice\":\"The attested commitment is not zero (receipt exists, so packet was received).\"}],\"SignatureInvalid(bytes)\":[{\"notice\":\"ECDSA signature failed to recover a valid signer.\"}],\"ThresholdNotMet(uint256,uint8)\":[{\"notice\":\"The number of valid unique signatures is below the required threshold.\"}],\"UnknownSigner(address)\":[{\"notice\":\"The recovered signer is not part of the attestation set.\"}]},\"kind\":\"user\",\"methods\":{\"PROOF_SUBMITTER_ROLE()\":{\"notice\":\"The role identifier for the proof submitter role\"},\"constructor\":{\"notice\":\"Initializes the attestor light client with its fixed attestor set and initial height/timestamp.\"},\"getAttestationSet()\":{\"notice\":\"Returns the attestation set configuration.\"},\"getClientState()\":{\"notice\":\"Returns the client state.\"},\"getConsensusTimestamp(uint64)\":{\"notice\":\"Returns the trusted consensus timestamp (in seconds) at the given revision height.\"},\"misbehaviour(bytes)\":{\"notice\":\"Misbehaviour handling, moves the light client to the frozen state if misbehaviour is detected\"},\"updateClient(bytes)\":{\"notice\":\"Updating the client and consensus state\"},\"verifyMembership((bytes,(uint64,uint64),bytes[],bytes))\":{\"notice\":\"Querying the membership of a key-value pair\"},\"verifyNonMembership((bytes,(uint64,uint64),bytes[]))\":{\"notice\":\"Querying the non-membership of a key\"}},\"notice\":\"Implements an IBC light client that trusts an off-chain m-of-n attestor set.\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/light-clients/attestation/AttestationLightClient.sol\":\"AttestationLightClient\"},\"evmVersion\":\"cancun\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"none\"},\"optimizer\":{\"enabled\":true,\"runs\":10000},\"remappings\":[\":@openzeppelin-contracts/=node_modules/@openzeppelin/contracts/\",\":@openzeppelin-upgradeable/=node_modules/@openzeppelin/contracts-upgradeable/\",\":@openzeppelin/=node_modules/@openzeppelin/\",\":@sp1-contracts/=node_modules/sp1-contracts/contracts/src/\",\":@uniswap/permit2/=node_modules/@uniswap/permit2/\",\":forge-std/=node_modules/forge-std/src/\",\":sp1-contracts/=node_modules/sp1-contracts/\"],\"viaIR\":true},\"sources\":{\"contracts/interfaces/ILightClient.sol\":{\"keccak256\":\"0x3b2361546ee834a442d844c979fbad3458ee13146b093f585587a09e19a266af\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://5b5d53101bb598f14a79cb1092479736fa18e8f84945ea6ef80f4dac84466042\",\"dweb:/ipfs/QmaTCo6M3Z9aYCSX65AQtixo1sB4ymQUDAgTXSKHqJHGDh\"]},\"contracts/light-clients/attestation/AttestationLightClient.sol\":{\"keccak256\":\"0xa22d7b4b7ac4eb79940df94116687c892e0ab61eb0ea27d16f189bd94211fa61\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://94eda9d8c9c9e4dfc518b8689fbc2ab2971ef46e1841627145c3f17bce24b785\",\"dweb:/ipfs/QmXc3e5Y1WyX4ChR6vovbRV4wqSqA99UcyPmaeUxQLSSkb\"]},\"contracts/light-clients/attestation/errors/IAttestationLightClientErrors.sol\":{\"keccak256\":\"0x8361e86d47983c1d1c5302b2fa5fedd001ecd8bc923c8c6de75cc6bb45387caf\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://45d910313903ba11922d9f392e99658e84114a4390c7809504df1ada403181e5\",\"dweb:/ipfs/QmUvi8etmBDUp2sqqnH8i6VJd32BwJq8RvDXfHpR1YxL4V\"]},\"contracts/light-clients/attestation/interfaces/IAttestationLightClient.sol\":{\"keccak256\":\"0x3d8f62e4fcf89f702ae6f5365c6a99f51f838876475a46e3158a54b7a9213123\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://2fab619c37a201ae02ff1b8b16790498f6fab829670420fa88c111ad48dc8db5\",\"dweb:/ipfs/QmSGJdyQoERfSDiy7tkXnwhqLCZkEgXBB66Gukr8dWQibb\"]},\"contracts/light-clients/attestation/msgs/IAttestationLightClientMsgs.sol\":{\"keccak256\":\"0x91093113f364093b8920c98608cf79190bbd4fa25058e9dddceee7d9c9f56d58\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://8e44c63a4309991be1934af1cf2c1838efafc0873dfe59e67996307f3a54dbd3\",\"dweb:/ipfs/QmcgARCrEAgDwnAcKB2XqnZx5TxRqXmEAJn5xyv5ovBVpp\"]},\"contracts/light-clients/attestation/msgs/IAttestationMsgs.sol\":{\"keccak256\":\"0xe67373f5a46069507784bcdc89a81f131e0571812f6c1e679caec1519e973d88\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://8f87e0de527a3c3c08bc2eae5b0ce08fdb91026f3e5e3c722861d3889314aed4\",\"dweb:/ipfs/QmZtMJn6Z6NxUQCzQnX9FUjyQpV7z1vH9mDra87wNYEjjA\"]},\"contracts/msgs/IICS02ClientMsgs.sol\":{\"keccak256\":\"0x03d1265eae327c3744d774bf22a30d845233d50664921c9aa57cef2d71fd89d2\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://89900781cc5c60540a237d92d42745ea6165765ee8fb4d50e8137a717195cc75\",\"dweb:/ipfs/Qmbx5p8gZ8sEMMeZytXsLee49JUayhAaoJ2yxX93WUrvQo\"]},\"contracts/msgs/ILightClientMsgs.sol\":{\"keccak256\":\"0x8d1e56ab166a7b4aa6999708e3214a4645ebbc3835c2b2a4c255c9923eebafde\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://8bd4200dc04d950c0f050623fa9a8accdbec877fd446c039d4dd6c678bdf1513\",\"dweb:/ipfs/QmZQTViaA7N6BVNDzJ1Z6w799PrPoE4ajPueZSPwX4sGZ9\"]},\"node_modules/@openzeppelin/contracts/access/AccessControl.sol\":{\"keccak256\":\"0x4686ec784d75f95beaf2bf5b5f26e5f946d4c864aaee9c3c62bdc18381f5e017\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://26710ca191913f3c9df542079c4a6dcff02968e92d4f7357daefef9fbe72a19c\",\"dweb:/ipfs/QmanHbeWuBbVEqXySHa1zhm2rExjYpChDBubBaJNTCa2JB\"]},\"node_modules/@openzeppelin/contracts/access/IAccessControl.sol\":{\"keccak256\":\"0xbff9f59c84e5337689161ce7641c0ef8e872d6a7536fbc1f5133f128887aba3c\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://b308f882e796f7b79c9502deacb0a62983035c6f6f4e962b319ba6a1f4a77d3d\",\"dweb:/ipfs/QmaWCW7ahEQqFjwhSUhV7Ae7WhfNvzSpE7DQ58hvEooqPL\"]},\"node_modules/@openzeppelin/contracts/utils/Context.sol\":{\"keccak256\":\"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://6a708e8a5bdb1011c2c381c9a5cfd8a9a956d7d0a9dc1bd8bcdaf52f76ef2f12\",\"dweb:/ipfs/Qmax9WHBnVsZP46ZxEMNRQpLQnrdE4dK8LehML1Py8FowF\"]},\"node_modules/@openzeppelin/contracts/utils/cryptography/ECDSA.sol\":{\"keccak256\":\"0xbeb5cad8aaabe0d35d2ec1a8414d91e81e5a8ca679add4cf57e2f33476861f40\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://ebb272a5ee2da4e8bd5551334e0ce8dce4e9c56a04570d6bf046d260fab3116a\",\"dweb:/ipfs/QmNw6RyM769qcqFocDq6HJMG2WiEnQbvizpRaUXsACHho2\"]},\"node_modules/@openzeppelin/contracts/utils/introspection/ERC165.sol\":{\"keccak256\":\"0x2d9dc2fe26180f74c11c13663647d38e259e45f95eb88f57b61d2160b0109d3e\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://81233d1f98060113d9922180bb0f14f8335856fe9f339134b09335e9f678c377\",\"dweb:/ipfs/QmWh6R35SarhAn4z2wH8SU456jJSYL2FgucfTFgbHJJN4E\"]},\"node_modules/@openzeppelin/contracts/utils/introspection/IERC165.sol\":{\"keccak256\":\"0x8891738ffe910f0cf2da09566928589bf5d63f4524dd734fd9cedbac3274dd5c\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://971f954442df5c2ef5b5ebf1eb245d7105d9fbacc7386ee5c796df1d45b21617\",\"dweb:/ipfs/QmadRjHbkicwqwwh61raUEapaVEtaLMcYbQZWs9gUkgj3u\"]}},\"version\":1}","metadata":{"compiler":{"version":"0.8.28+commit.7893614a"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"address[]","name":"attestorAddresses","type":"address[]"},{"internalType":"uint8","name":"minRequiredSigs","type":"uint8"},{"internalType":"uint64","name":"initialHeight","type":"uint64"},{"internalType":"uint64","name":"initialTimestampSeconds","type":"uint64"},{"internalType":"address","name":"roleManager","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"type":"error","name":"AccessControlBadConfirmation"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bytes32","name":"neededRole","type":"bytes32"}],"type":"error","name":"AccessControlUnauthorizedAccount"},{"inputs":[{"internalType":"uint8","name":"minRequired","type":"uint8"},{"internalType":"uint256","name":"attestationCount","type":"uint256"}],"type":"error","name":"BadQuorum"},{"inputs":[{"internalType":"uint64","name":"height","type":"uint64"}],"type":"error","name":"ConsensusTimestampNotFound"},{"inputs":[{"internalType":"address","name":"signer","type":"address"}],"type":"error","name":"DuplicateSigner"},{"inputs":[],"type":"error","name":"ECDSAInvalidSignature"},{"inputs":[{"internalType":"uint256","name":"length","type":"uint256"}],"type":"error","name":"ECDSAInvalidSignatureLength"},{"inputs":[{"internalType":"bytes32","name":"s","type":"bytes32"}],"type":"error","name":"ECDSAInvalidSignatureS"},{"inputs":[],"type":"error","name":"EmptyPackets"},{"inputs":[],"type":"error","name":"EmptySignatures"},{"inputs":[],"type":"error","name":"EmptyValue"},{"inputs":[],"type":"error","name":"FeatureNotSupported"},{"inputs":[],"type":"error","name":"FrozenClientState"},{"inputs":[{"internalType":"uint64","name":"expected","type":"uint64"},{"internalType":"uint64","name":"provided","type":"uint64"}],"type":"error","name":"HeightMismatch"},{"inputs":[{"internalType":"uint256","name":"expectedLength","type":"uint256"},{"internalType":"uint256","name":"providedLength","type":"uint256"}],"type":"error","name":"InvalidPathLength"},{"inputs":[{"internalType":"bytes","name":"signature","type":"bytes"}],"type":"error","name":"InvalidSignatureLength"},{"inputs":[{"internalType":"uint64","name":"height","type":"uint64"},{"internalType":"uint64","name":"timestamp","type":"uint64"}],"type":"error","name":"InvalidState"},{"inputs":[],"type":"error","name":"NoAttestors"},{"inputs":[],"type":"error","name":"NotMember"},{"inputs":[],"type":"error","name":"NotNonMember"},{"inputs":[{"internalType":"bytes","name":"signature","type":"bytes"}],"type":"error","name":"SignatureInvalid"},{"inputs":[{"internalType":"uint256","name":"validSigners","type":"uint256"},{"internalType":"uint8","name":"minRequired","type":"uint8"}],"type":"error","name":"ThresholdNotMet"},{"inputs":[{"internalType":"address","name":"signer","type":"address"}],"type":"error","name":"UnknownSigner"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32","indexed":true},{"internalType":"bytes32","name":"previousAdminRole","type":"bytes32","indexed":true},{"internalType":"bytes32","name":"newAdminRole","type":"bytes32","indexed":true}],"type":"event","name":"RoleAdminChanged","anonymous":false},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32","indexed":true},{"internalType":"address","name":"account","type":"address","indexed":true},{"internalType":"address","name":"sender","type":"address","indexed":true}],"type":"event","name":"RoleGranted","anonymous":false},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32","indexed":true},{"internalType":"address","name":"account","type":"address","indexed":true},{"internalType":"address","name":"sender","type":"address","indexed":true}],"type":"event","name":"RoleRevoked","anonymous":false},{"inputs":[],"stateMutability":"view","type":"function","name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"PROOF_SUBMITTER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"getAttestationSet","outputs":[{"internalType":"address[]","name":"attestorAddresses","type":"address[]"},{"internalType":"uint8","name":"minRequiredSigs","type":"uint8"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"getClientState","outputs":[{"internalType":"bytes","name":"","type":"bytes"}]},{"inputs":[{"internalType":"uint64","name":"revisionHeight","type":"uint64"}],"stateMutability":"view","type":"function","name":"getConsensusTimestamp","outputs":[{"internalType":"uint64","name":"","type":"uint64"}]},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"stateMutability":"view","type":"function","name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}]},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"stateMutability":"nonpayable","type":"function","name":"grantRole"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"stateMutability":"view","type":"function","name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}]},{"inputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function","name":"misbehaviour"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"callerConfirmation","type":"address"}],"stateMutability":"nonpayable","type":"function","name":"renounceRole"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"stateMutability":"nonpayable","type":"function","name":"revokeRole"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"stateMutability":"view","type":"function","name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}]},{"inputs":[{"internalType":"bytes","name":"updateMsg","type":"bytes"}],"stateMutability":"nonpayable","type":"function","name":"updateClient","outputs":[{"internalType":"enum ILightClientMsgs.UpdateResult","name":"","type":"uint8"}]},{"inputs":[{"internalType":"struct ILightClientMsgs.MsgVerifyMembership","name":"msg_","type":"tuple","components":[{"internalType":"bytes","name":"proof","type":"bytes"},{"internalType":"struct IICS02ClientMsgs.Height","name":"proofHeight","type":"tuple","components":[{"internalType":"uint64","name":"revisionNumber","type":"uint64"},{"internalType":"uint64","name":"revisionHeight","type":"uint64"}]},{"internalType":"bytes[]","name":"path","type":"bytes[]"},{"internalType":"bytes","name":"value","type":"bytes"}]}],"stateMutability":"view","type":"function","name":"verifyMembership","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[{"internalType":"struct ILightClientMsgs.MsgVerifyNonMembership","name":"msg_","type":"tuple","components":[{"internalType":"bytes","name":"proof","type":"bytes"},{"internalType":"struct IICS02ClientMsgs.Height","name":"proofHeight","type":"tuple","components":[{"internalType":"uint64","name":"revisionNumber","type":"uint64"},{"internalType":"uint64","name":"revisionHeight","type":"uint64"}]},{"internalType":"bytes[]","name":"path","type":"bytes[]"}]}],"stateMutability":"view","type":"function","name":"verifyNonMembership","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]}],"devdoc":{"kind":"dev","methods":{"constructor":{"params":{"attestorAddresses":"The configured attestor addresses (EOAs)","initialHeight":"The initial known height","initialTimestampSeconds":"The initial timestamp in seconds for the initial height","minRequiredSigs":"The quorum threshold","roleManager":"Address that will administer roles and be allowed to submit proofs; if zero, anyone can submit"}},"getAttestationSet()":{"details":"The attestation set is fixed for the initial scope; rotation is out of scope.","returns":{"attestorAddresses":"The configured attestor EOA addresses","minRequiredSigs":"The minimum number of unique valid signatures required"}},"getClientState()":{"returns":{"_0":"The client state."}},"getConsensusTimestamp(uint64)":{"params":{"revisionHeight":"The height for which to query the timestamp"},"returns":{"_0":"The trusted timestamp in unix seconds"}},"getRoleAdmin(bytes32)":{"details":"Returns the admin role that controls `role`. See {grantRole} and {revokeRole}. To change a role's admin, use {_setRoleAdmin}."},"grantRole(bytes32,address)":{"details":"Grants `role` to `account`. If `account` had not been already granted `role`, emits a {RoleGranted} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleGranted} event."},"hasRole(bytes32,address)":{"details":"Returns `true` if `account` has been granted `role`."},"misbehaviour(bytes)":{"params":{"misbehaviourMsg":"The misbehaviour message"}},"renounceRole(bytes32,address)":{"details":"Revokes `role` from the calling account. Roles are often managed via {grantRole} and {revokeRole}: this function's purpose is to provide a mechanism for accounts to lose their privileges if they are compromised (such as when a trusted device is misplaced). If the calling account had been revoked `role`, emits a {RoleRevoked} event. Requirements: - the caller must be `callerConfirmation`. May emit a {RoleRevoked} event."},"revokeRole(bytes32,address)":{"details":"Revokes `role` from `account`. If `account` had been granted `role`, emits a {RoleRevoked} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleRevoked} event."},"supportsInterface(bytes4)":{"details":"Returns true if this contract implements the interface defined by `interfaceId`. See the corresponding https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[ERC section] to learn more about how these ids are created. This function call must use less than 30 000 gas."},"updateClient(bytes)":{"params":{"updateMsg":"The encoded update message e.g., an SP1 proof."},"returns":{"_0":"The result of the update operation"}},"verifyMembership((bytes,(uint64,uint64),bytes[],bytes))":{"details":"Notice that this message is not view, as it may update the client state for caching purposes.","params":{"msg_":"The membership message"},"returns":{"_0":"The unix timestamp of the verification height in the counterparty chain in seconds."}},"verifyNonMembership((bytes,(uint64,uint64),bytes[]))":{"details":"Notice that this message is not view, as it may update the client state for caching purposes.","params":{"msg_":"The membership message"},"returns":{"_0":"The unix timestamp of the verification height in the counterparty chain in seconds."}}},"version":1},"userdoc":{"kind":"user","methods":{"PROOF_SUBMITTER_ROLE()":{"notice":"The role identifier for the proof submitter role"},"constructor":{"notice":"Initializes the attestor light client with its fixed attestor set and initial height/timestamp."},"getAttestationSet()":{"notice":"Returns the attestation set configuration."},"getClientState()":{"notice":"Returns the client state."},"getConsensusTimestamp(uint64)":{"notice":"Returns the trusted consensus timestamp (in seconds) at the given revision height."},"misbehaviour(bytes)":{"notice":"Misbehaviour handling, moves the light client to the frozen state if misbehaviour is detected"},"updateClient(bytes)":{"notice":"Updating the client and consensus state"},"verifyMembership((bytes,(uint64,uint64),bytes[],bytes))":{"notice":"Querying the membership of a key-value pair"},"verifyNonMembership((bytes,(uint64,uint64),bytes[]))":{"notice":"Querying the non-membership of a key"}},"version":1}},"settings":{"remappings":["@openzeppelin-contracts/=node_modules/@openzeppelin/contracts/","@openzeppelin-upgradeable/=node_modules/@openzeppelin/contracts-upgradeable/","@openzeppelin/=node_modules/@openzeppelin/","@sp1-contracts/=node_modules/sp1-contracts/contracts/src/","@uniswap/permit2/=node_modules/@uniswap/permit2/","forge-std/=node_modules/forge-std/src/","sp1-contracts/=node_modules/sp1-contracts/"],"optimizer":{"enabled":true,"runs":10000},"metadata":{"bytecodeHash":"none"},"compilationTarget":{"contracts/light-clients/attestation/AttestationLightClient.sol":"AttestationLightClient"},"evmVersion":"cancun","libraries":{},"viaIR":true},"sources":{"contracts/interfaces/ILightClient.sol":{"keccak256":"0x3b2361546ee834a442d844c979fbad3458ee13146b093f585587a09e19a266af","urls":["bzz-raw://5b5d53101bb598f14a79cb1092479736fa18e8f84945ea6ef80f4dac84466042","dweb:/ipfs/QmaTCo6M3Z9aYCSX65AQtixo1sB4ymQUDAgTXSKHqJHGDh"],"license":"Apache-2.0"},"contracts/light-clients/attestation/AttestationLightClient.sol":{"keccak256":"0xa22d7b4b7ac4eb79940df94116687c892e0ab61eb0ea27d16f189bd94211fa61","urls":["bzz-raw://94eda9d8c9c9e4dfc518b8689fbc2ab2971ef46e1841627145c3f17bce24b785","dweb:/ipfs/QmXc3e5Y1WyX4ChR6vovbRV4wqSqA99UcyPmaeUxQLSSkb"],"license":"Apache-2.0"},"contracts/light-clients/attestation/errors/IAttestationLightClientErrors.sol":{"keccak256":"0x8361e86d47983c1d1c5302b2fa5fedd001ecd8bc923c8c6de75cc6bb45387caf","urls":["bzz-raw://45d910313903ba11922d9f392e99658e84114a4390c7809504df1ada403181e5","dweb:/ipfs/QmUvi8etmBDUp2sqqnH8i6VJd32BwJq8RvDXfHpR1YxL4V"],"license":"Apache-2.0"},"contracts/light-clients/attestation/interfaces/IAttestationLightClient.sol":{"keccak256":"0x3d8f62e4fcf89f702ae6f5365c6a99f51f838876475a46e3158a54b7a9213123","urls":["bzz-raw://2fab619c37a201ae02ff1b8b16790498f6fab829670420fa88c111ad48dc8db5","dweb:/ipfs/QmSGJdyQoERfSDiy7tkXnwhqLCZkEgXBB66Gukr8dWQibb"],"license":"Apache-2.0"},"contracts/light-clients/attestation/msgs/IAttestationLightClientMsgs.sol":{"keccak256":"0x91093113f364093b8920c98608cf79190bbd4fa25058e9dddceee7d9c9f56d58","urls":["bzz-raw://8e44c63a4309991be1934af1cf2c1838efafc0873dfe59e67996307f3a54dbd3","dweb:/ipfs/QmcgARCrEAgDwnAcKB2XqnZx5TxRqXmEAJn5xyv5ovBVpp"],"license":"Apache-2.0"},"contracts/light-clients/attestation/msgs/IAttestationMsgs.sol":{"keccak256":"0xe67373f5a46069507784bcdc89a81f131e0571812f6c1e679caec1519e973d88","urls":["bzz-raw://8f87e0de527a3c3c08bc2eae5b0ce08fdb91026f3e5e3c722861d3889314aed4","dweb:/ipfs/QmZtMJn6Z6NxUQCzQnX9FUjyQpV7z1vH9mDra87wNYEjjA"],"license":"Apache-2.0"},"contracts/msgs/IICS02ClientMsgs.sol":{"keccak256":"0x03d1265eae327c3744d774bf22a30d845233d50664921c9aa57cef2d71fd89d2","urls":["bzz-raw://89900781cc5c60540a237d92d42745ea6165765ee8fb4d50e8137a717195cc75","dweb:/ipfs/Qmbx5p8gZ8sEMMeZytXsLee49JUayhAaoJ2yxX93WUrvQo"],"license":"Apache-2.0"},"contracts/msgs/ILightClientMsgs.sol":{"keccak256":"0x8d1e56ab166a7b4aa6999708e3214a4645ebbc3835c2b2a4c255c9923eebafde","urls":["bzz-raw://8bd4200dc04d950c0f050623fa9a8accdbec877fd446c039d4dd6c678bdf1513","dweb:/ipfs/QmZQTViaA7N6BVNDzJ1Z6w799PrPoE4ajPueZSPwX4sGZ9"],"license":"Apache-2.0"},"node_modules/@openzeppelin/contracts/access/AccessControl.sol":{"keccak256":"0x4686ec784d75f95beaf2bf5b5f26e5f946d4c864aaee9c3c62bdc18381f5e017","urls":["bzz-raw://26710ca191913f3c9df542079c4a6dcff02968e92d4f7357daefef9fbe72a19c","dweb:/ipfs/QmanHbeWuBbVEqXySHa1zhm2rExjYpChDBubBaJNTCa2JB"],"license":"MIT"},"node_modules/@openzeppelin/contracts/access/IAccessControl.sol":{"keccak256":"0xbff9f59c84e5337689161ce7641c0ef8e872d6a7536fbc1f5133f128887aba3c","urls":["bzz-raw://b308f882e796f7b79c9502deacb0a62983035c6f6f4e962b319ba6a1f4a77d3d","dweb:/ipfs/QmaWCW7ahEQqFjwhSUhV7Ae7WhfNvzSpE7DQ58hvEooqPL"],"license":"MIT"},"node_modules/@openzeppelin/contracts/utils/Context.sol":{"keccak256":"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2","urls":["bzz-raw://6a708e8a5bdb1011c2c381c9a5cfd8a9a956d7d0a9dc1bd8bcdaf52f76ef2f12","dweb:/ipfs/Qmax9WHBnVsZP46ZxEMNRQpLQnrdE4dK8LehML1Py8FowF"],"license":"MIT"},"node_modules/@openzeppelin/contracts/utils/cryptography/ECDSA.sol":{"keccak256":"0xbeb5cad8aaabe0d35d2ec1a8414d91e81e5a8ca679add4cf57e2f33476861f40","urls":["bzz-raw://ebb272a5ee2da4e8bd5551334e0ce8dce4e9c56a04570d6bf046d260fab3116a","dweb:/ipfs/QmNw6RyM769qcqFocDq6HJMG2WiEnQbvizpRaUXsACHho2"],"license":"MIT"},"node_modules/@openzeppelin/contracts/utils/introspection/ERC165.sol":{"keccak256":"0x2d9dc2fe26180f74c11c13663647d38e259e45f95eb88f57b61d2160b0109d3e","urls":["bzz-raw://81233d1f98060113d9922180bb0f14f8335856fe9f339134b09335e9f678c377","dweb:/ipfs/QmWh6R35SarhAn4z2wH8SU456jJSYL2FgucfTFgbHJJN4E"],"license":"MIT"},"node_modules/@openzeppelin/contracts/utils/introspection/IERC165.sol":{"keccak256":"0x8891738ffe910f0cf2da09566928589bf5d63f4524dd734fd9cedbac3274dd5c","urls":["bzz-raw://971f954442df5c2ef5b5ebf1eb245d7105d9fbacc7386ee5c796df1d45b21617","dweb:/ipfs/QmadRjHbkicwqwwh61raUEapaVEtaLMcYbQZWs9gUkgj3u"],"license":"MIT"}},"version":1},"id":29} \ No newline at end of file +{"abi":[{"type":"constructor","inputs":[{"name":"attestorAddresses","type":"address[]","internalType":"address[]"},{"name":"minRequiredSigs","type":"uint8","internalType":"uint8"},{"name":"initialHeight","type":"uint64","internalType":"uint64"},{"name":"initialTimestampSeconds","type":"uint64","internalType":"uint64"},{"name":"roleManager","type":"address","internalType":"address"}],"stateMutability":"nonpayable"},{"type":"function","name":"DEFAULT_ADMIN_ROLE","inputs":[],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"type":"function","name":"PROOF_SUBMITTER_ROLE","inputs":[],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"type":"function","name":"getAttestationSet","inputs":[],"outputs":[{"name":"attestorAddresses","type":"address[]","internalType":"address[]"},{"name":"minRequiredSigs","type":"uint8","internalType":"uint8"}],"stateMutability":"view"},{"type":"function","name":"getClientState","inputs":[],"outputs":[{"name":"","type":"bytes","internalType":"bytes"}],"stateMutability":"view"},{"type":"function","name":"getConsensusTimestamp","inputs":[{"name":"revisionHeight","type":"uint64","internalType":"uint64"}],"outputs":[{"name":"","type":"uint64","internalType":"uint64"}],"stateMutability":"view"},{"type":"function","name":"getRoleAdmin","inputs":[{"name":"role","type":"bytes32","internalType":"bytes32"}],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"type":"function","name":"grantRole","inputs":[{"name":"role","type":"bytes32","internalType":"bytes32"},{"name":"account","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"hasRole","inputs":[{"name":"role","type":"bytes32","internalType":"bytes32"},{"name":"account","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"misbehaviour","inputs":[{"name":"","type":"bytes","internalType":"bytes"}],"outputs":[],"stateMutability":"view"},{"type":"function","name":"renounceRole","inputs":[{"name":"role","type":"bytes32","internalType":"bytes32"},{"name":"callerConfirmation","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"revokeRole","inputs":[{"name":"role","type":"bytes32","internalType":"bytes32"},{"name":"account","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"supportsInterface","inputs":[{"name":"interfaceId","type":"bytes4","internalType":"bytes4"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"updateClient","inputs":[{"name":"updateMsg","type":"bytes","internalType":"bytes"}],"outputs":[{"name":"","type":"uint8","internalType":"enum ILightClientMsgs.UpdateResult"}],"stateMutability":"nonpayable"},{"type":"function","name":"verifyMembership","inputs":[{"name":"msg_","type":"tuple","internalType":"struct ILightClientMsgs.MsgVerifyMembership","components":[{"name":"proof","type":"bytes","internalType":"bytes"},{"name":"proofHeight","type":"tuple","internalType":"struct IICS02ClientMsgs.Height","components":[{"name":"revisionNumber","type":"uint64","internalType":"uint64"},{"name":"revisionHeight","type":"uint64","internalType":"uint64"}]},{"name":"path","type":"bytes[]","internalType":"bytes[]"},{"name":"value","type":"bytes","internalType":"bytes"}]}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"verifyNonMembership","inputs":[{"name":"msg_","type":"tuple","internalType":"struct ILightClientMsgs.MsgVerifyNonMembership","components":[{"name":"proof","type":"bytes","internalType":"bytes"},{"name":"proofHeight","type":"tuple","internalType":"struct IICS02ClientMsgs.Height","components":[{"name":"revisionNumber","type":"uint64","internalType":"uint64"},{"name":"revisionHeight","type":"uint64","internalType":"uint64"}]},{"name":"path","type":"bytes[]","internalType":"bytes[]"}]}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"event","name":"RoleAdminChanged","inputs":[{"name":"role","type":"bytes32","indexed":true,"internalType":"bytes32"},{"name":"previousAdminRole","type":"bytes32","indexed":true,"internalType":"bytes32"},{"name":"newAdminRole","type":"bytes32","indexed":true,"internalType":"bytes32"}],"anonymous":false},{"type":"event","name":"RoleGranted","inputs":[{"name":"role","type":"bytes32","indexed":true,"internalType":"bytes32"},{"name":"account","type":"address","indexed":true,"internalType":"address"},{"name":"sender","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"type":"event","name":"RoleRevoked","inputs":[{"name":"role","type":"bytes32","indexed":true,"internalType":"bytes32"},{"name":"account","type":"address","indexed":true,"internalType":"address"},{"name":"sender","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"type":"error","name":"AccessControlBadConfirmation","inputs":[]},{"type":"error","name":"AccessControlUnauthorizedAccount","inputs":[{"name":"account","type":"address","internalType":"address"},{"name":"neededRole","type":"bytes32","internalType":"bytes32"}]},{"type":"error","name":"BadQuorum","inputs":[{"name":"minRequired","type":"uint8","internalType":"uint8"},{"name":"attestationCount","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"ConsensusTimestampNotFound","inputs":[{"name":"height","type":"uint64","internalType":"uint64"}]},{"type":"error","name":"DuplicateSigner","inputs":[{"name":"signer","type":"address","internalType":"address"}]},{"type":"error","name":"ECDSAInvalidSignature","inputs":[]},{"type":"error","name":"ECDSAInvalidSignatureLength","inputs":[{"name":"length","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"ECDSAInvalidSignatureS","inputs":[{"name":"s","type":"bytes32","internalType":"bytes32"}]},{"type":"error","name":"EmptyPackets","inputs":[]},{"type":"error","name":"EmptySignatures","inputs":[]},{"type":"error","name":"EmptyValue","inputs":[]},{"type":"error","name":"FeatureNotSupported","inputs":[]},{"type":"error","name":"FrozenClientState","inputs":[]},{"type":"error","name":"HeightMismatch","inputs":[{"name":"expected","type":"uint64","internalType":"uint64"},{"name":"provided","type":"uint64","internalType":"uint64"}]},{"type":"error","name":"InvalidPathLength","inputs":[{"name":"expectedLength","type":"uint256","internalType":"uint256"},{"name":"providedLength","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"InvalidSignatureLength","inputs":[{"name":"signature","type":"bytes","internalType":"bytes"}]},{"type":"error","name":"InvalidState","inputs":[{"name":"height","type":"uint64","internalType":"uint64"},{"name":"timestamp","type":"uint64","internalType":"uint64"}]},{"type":"error","name":"NoAttestors","inputs":[]},{"type":"error","name":"NotMember","inputs":[]},{"type":"error","name":"NotNonMember","inputs":[]},{"type":"error","name":"SignatureInvalid","inputs":[{"name":"signature","type":"bytes","internalType":"bytes"}]},{"type":"error","name":"ThresholdNotMet","inputs":[{"name":"validSigners","type":"uint256","internalType":"uint256"},{"name":"minRequired","type":"uint8","internalType":"uint8"}]},{"type":"error","name":"UnknownSigner","inputs":[{"name":"signer","type":"address","internalType":"address"}]}],"bytecode":{"object":"0x60806040523461032d57611f568038038061001981610349565b928339810160a08282031261032d5781516001600160401b03811161032d57820181601f8201121561032d578051916001600160401b0383116102c8578260051b916020610068818501610349565b8095815201906020829482010192831161032d57602001905b8282106103315750505060208301519260ff841680940361032d576100a860408201610382565b6100c060806100b960608501610382565b930161036e565b9284511561031e57851515806102f2575b855190156102dc575060405195608087016001600160401b038111888210176102c857604052858752602087019081526060604088019360018060401b03169788855201915f835286519060018060401b0382116102c8576801000000000000000082116102c85760015482600155808310610284575b5060015f5260205f205f5b838110610267575050505060ff90511669ff00000000000000000060025493610100600160481b03905160081b169251151560481b169260018060501b0319161717176002555f5b83518110156101fb5760018060a01b0360208260051b8601015116805f52600360205260ff60405f2054166101e957906001915f52600360205260405f208260ff198254161790550161019b565b637010e27960e11b5f5260045260245ffd5b505f84815260046020526040902080546001600160401b0319166001600160401b039092169190911790556001600160a01b03811661024e575061023d61048c565b505b6040516119a7908161050f8239f35b8061025b61026192610396565b5061040c565b5061023f565b82516001600160a01b031681830155602090920191600101610153565b60015f527fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf69081019083015b8181106102bd5750610148565b5f81556001016102b0565b634e487b7160e01b5f52604160045260245ffd5b866365846b7f60e01b5f5260045260245260445ffd5b5084515f19870160ff811161030a5760ff16106100d1565b634e487b7160e01b5f52601160045260245ffd5b6343d0a89360e11b5f5260045ffd5b5f80fd5b6020809161033e8461036e565b815201910190610081565b6040519190601f01601f191682016001600160401b038111838210176102c857604052565b51906001600160a01b038216820361032d57565b51906001600160401b038216820361032d57565b6001600160a01b0381165f9081525f516020611f365f395f51905f52602052604090205460ff16610407576001600160a01b03165f8181525f516020611f365f395f51905f5260205260408120805460ff191660011790553391905f516020611eb65f395f51905f528180a4600190565b505f90565b6001600160a01b0381165f9081525f516020611ed65f395f51905f52602052604090205460ff16610407576001600160a01b03165f8181525f516020611ed65f395f51905f5260205260408120805460ff191660011790553391905f516020611f165f395f51905f52905f516020611eb65f395f51905f529080a4600190565b5f80525f516020611ed65f395f51905f526020525f516020611ef65f395f51905f525460ff1661050a575f8080525f516020611ed65f395f51905f526020525f516020611ef65f395f51905f52805460ff1916600117905533905f516020611f165f395f51905f525f516020611eb65f395f51905f528280a4600190565b5f9056fe6080806040526004361015610012575f80fd5b5f3560e01c90816301ffc9a7146106ab575080630bece356146105e8578063248a9ca3146105be5780632f2ff15d1461058f57806336568abe146105335780634d6d9ffb146104865780635832611b146104405780635972185a14610406578063682ed5f01461035157806391d1485414610308578063a217fddf146102ee578063a845a7f314610261578063d547741f1461022b578063ddba65371461015f5763ef913a4b146100c1575f80fd5b3461015b575f60031936011261015b576101576040516020808201526080604082015261014b816100f460c08201611228565b60ff600254818116606085015267ffffffffffffffff8160081c16608085015260481c16151560a0830152037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0810183528261085e565b604051918291826107cd565b0390f35b5f80fd5b3461015b5761016d36610749565b505060ff60025460481c16610203575f80527f4c48d1d2b0f4f7485fc28e3db22341d96a20aa29e6efa8149da9751603abd4e06020527f6e0c24a6e293ff9b755263dbaa15ba3796b0b8d3fe17cfb4ddf8143b268eac475460ff16156101f6575b7fda81d7c2000000000000000000000000000000000000000000000000000000005f5260045ffd5b6101fe611277565b6101ce565b7f928b1233000000000000000000000000000000000000000000000000000000005f5260045ffd5b3461015b5761025f61023c3661079a565b9061025a610255825f525f602052600160405f20015490565b6112ff565b61175e565b005b3461015b575f60031936011261015b5760ff6002541660405161028e8161028781611228565b038261085e565b60405190604082019260408352815180945260206060840192015f945b8086106102c057505082935060208301520390f35b909260208060019273ffffffffffffffffffffffffffffffffffffffff8751168152019401950194906102ab565b3461015b575f60031936011261015b5760206040515f8152f35b3461015b576103163661079a565b905f525f60205273ffffffffffffffffffffffffffffffffffffffff60405f2091165f52602052602060ff60405f2054166040519015158152f35b3461015b57602060031936011261015b5760043567ffffffffffffffff811161015b5760a0600319823603011261015b5760ff60025460481c16610203575f80527f4c48d1d2b0f4f7485fc28e3db22341d96a20aa29e6efa8149da9751603abd4e060209081527f6e0c24a6e293ff9b755263dbaa15ba3796b0b8d3fe17cfb4ddf8143b268eac475490916103f19160ff16156103f9575b6004016110cb565b604051908152f35b610401611277565b6103e9565b3461015b575f60031936011261015b5760206040517fbd893629a699470e4ec82a5715bb4981fdaacc5d0a728bf5f55b801d8f4ef10b8152f35b3461015b57602060031936011261015b5760043567ffffffffffffffff811680910361015b575f526004602052602067ffffffffffffffff60405f205416604051908152f35b3461015b57602060031936011261015b5760043567ffffffffffffffff811161015b576080600319823603011261015b5760ff60025460481c16610203575f80527f4c48d1d2b0f4f7485fc28e3db22341d96a20aa29e6efa8149da9751603abd4e060209081527f6e0c24a6e293ff9b755263dbaa15ba3796b0b8d3fe17cfb4ddf8143b268eac475490916103f19160ff1615610526575b600401610ef5565b61052e611277565b61051e565b3461015b576105413661079a565b3373ffffffffffffffffffffffffffffffffffffffff8216036105675761025f9161175e565b7f6697b232000000000000000000000000000000000000000000000000000000005f5260045ffd5b3461015b5761025f6105a03661079a565b906105b9610255825f525f602052600160405f20015490565b61168c565b3461015b57602060031936011261015b5760206103f16004355f525f602052600160405f20015490565b3461015b576105f636610749565b60ff60025460481c16610203575f80527f4c48d1d2b0f4f7485fc28e3db22341d96a20aa29e6efa8149da9751603abd4e06020527f6e0c24a6e293ff9b755263dbaa15ba3796b0b8d3fe17cfb4ddf8143b268eac475461065e929060ff161561069e57610a3c565b6040516003821015610671576020918152f35b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b6106a6611277565b610a3c565b3461015b57602060031936011261015b57600435907fffffffff00000000000000000000000000000000000000000000000000000000821680920361015b57817f7965db0b000000000000000000000000000000000000000000000000000000006020931490811561071f575b5015158152f35b7f01ffc9a70000000000000000000000000000000000000000000000000000000091501483610718565b90602060031983011261015b5760043567ffffffffffffffff811161015b578260238201121561015b5780600401359267ffffffffffffffff841161015b576024848301011161015b576024019190565b600319604091011261015b576004359060243573ffffffffffffffffffffffffffffffffffffffff8116810361015b5790565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f602060409481855280519182918282880152018686015e5f8582860101520116010190565b6040810190811067ffffffffffffffff82111761083157604052565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff82111761083157604052565b92919267ffffffffffffffff821161083157604051916108e760207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116018461085e565b82948184528183011161015b578281602093845f960137010152565b9080601f8301121561015b5781602061091e9335910161089f565b90565b67ffffffffffffffff81116108315760051b60200190565b60208183031261015b5780359067ffffffffffffffff821161015b57019060408282031261015b576040519161096e83610815565b803567ffffffffffffffff811161015b578261098b918301610903565b835260208101359067ffffffffffffffff821161015b57019080601f8301121561015b5781356109ba81610921565b926109c8604051948561085e565b81845260208085019260051b8201019183831161015b5760208201905b8382106109f9575050505050602082015290565b813567ffffffffffffffff811161015b57602091610a1c87848094880101610903565b8152019101906109e5565b519067ffffffffffffffff8216820361015b57565b610a4891810190610939565b60205f818351604051918183925191829101835e8101838152039060025afa15610c915760205f8051604051838101917f01000000000000000000000000000000000000000000000000000000000000008352602182015260218152610aaf60418261085e565b604051918291518091835e8101838152039060025afa15610c9157610ada5f516020830151906113eb565b5160408180518101031261015b57604051610af481610815565b610b0f6040610b0560208501610a27565b9384845201610a27565b67ffffffffffffffff60208301938285521680151580610c7e575b15610c4457505067ffffffffffffffff8151165f52600460205267ffffffffffffffff60405f20541680610bf3575067ffffffffffffffff9051918183169260025490838260081c168511610bb6575b50505116905f52600460205260405f20907fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000008254161790555f90565b68ffffffffffffffff007fffffffffffffffffffffffffffffffffffffffffffffff0000000000000000ff9160081b169116176002555f80610b7a565b9167ffffffffffffffff9150511603610c0b57600290565b69010000000000000000007fffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffff6002541617600255600190565b67ffffffffffffffff92507fdcbc5460000000000000000000000000000000000000000000000000000000005f526004521660245260445ffd5b5067ffffffffffffffff82161515610b2a565b6040513d5f823e3d90fd5b9035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18136030182121561015b570180359067ffffffffffffffff821161015b57602001918160051b3603831361015b57565b3567ffffffffffffffff8116810361015b5790565b15610d0d5750565b67ffffffffffffffff907ff7caaa5c000000000000000000000000000000000000000000000000000000005f521660045260245ffd5b9035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18136030182121561015b570180359067ffffffffffffffff821161015b5760200191813603831361015b57565b60208183031261015b5780519067ffffffffffffffff821161015b57019060408282031261015b5760405191610dc983610815565b610dd281610a27565b835260208101519067ffffffffffffffff821161015b570181601f8201121561015b57805190610e0182610921565b92610e0f604051948561085e565b82845260208085019360061b8301019181831161015b57602001925b828410610e3e5750505050602082015290565b60408483031261015b5760206040918251610e5881610815565b865181528287015183820152815201930192610e2b565b15610e78575050565b9067ffffffffffffffff80927fc7441689000000000000000000000000000000000000000000000000000000005f52166004521660245260445ffd5b8051821015610ec85760209160051b010190565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b6060810190610f048282610c9c565b90506001610f128484610c9c565b9290500361109b5750610fb8610f2a60408301610cf0565b9267ffffffffffffffff841692835f526004602052610fb367ffffffffffffffff60405f20541694610f5e87871515610d05565b610f9e610f76610f6e8580610d43565b810190610939565b610f8e610f838251611365565b6020830151906113eb565b5160208082518301019101610d94565b9667ffffffffffffffff885116918214610e6f565b610c9c565b15610ec857610fd3610fcc82602093610d43565b369161089f565b818151910120920180515115611073575f5b8151805182101561104b57610ffb828692610eb4565b51511461100a57600101610fe5565b60209293506110199151610eb4565b5101516110235790565b7f9a960b4f000000000000000000000000000000000000000000000000000000005f5260045ffd5b7f291fc442000000000000000000000000000000000000000000000000000000005f5260045ffd5b7f1e6c84da000000000000000000000000000000000000000000000000000000005f5260045ffd5b7f88b3170e000000000000000000000000000000000000000000000000000000005f52600160045260245260445ffd5b608081016110d98183610d43565b9050156112005760608201906110ef8284610c9c565b905060016110fd8486610c9c565b9290500361109b575061111260408401610cf0565b9061117467ffffffffffffffff831693845f52600460205261116e67ffffffffffffffff60405f2054169561114986881515610d05565b611159610f76610f6e8a80610d43565b9567ffffffffffffffff875116918214610e6f565b85610c9c565b15610ec85760209161118c610fcc8361119894610d43565b83815191012095610d43565b908092918101031261015b576020903591019081515115611073575f5b8251805182101561104b576111cb828792610eb4565b515114806111e8575b6111e0576001016111b5565b505050905090565b508160206111f7838651610eb4565b510151146111d4565b7f1208b21b000000000000000000000000000000000000000000000000000000005f5260045ffd5b602060015491828152019060015f5260205f20905f5b81811061124b5750505090565b825473ffffffffffffffffffffffffffffffffffffffff1684526020909301926001928301920161123e565b335f9081527f4c48d1d2b0f4f7485fc28e3db22341d96a20aa29e6efa8149da9751603abd4e0602052604090205460ff16156112af57565b7fe2517d3f000000000000000000000000000000000000000000000000000000005f52336004527fbd893629a699470e4ec82a5715bb4981fdaacc5d0a728bf5f55b801d8f4ef10b60245260445ffd5b805f525f60205260405f2073ffffffffffffffffffffffffffffffffffffffff33165f5260205260ff60405f205416156113365750565b7fe2517d3f000000000000000000000000000000000000000000000000000000005f523360045260245260445ffd5b5f60208092604051918183925191829101835e8101838152039060025afa15610c915760205f8051604051838101917f020000000000000000000000000000000000000000000000000000000000000083526021820152602181526113cb60418261085e565b604051918291518091835e8101838152039060025afa15610c91575f5190565b91909182511561166457825160ff60025416907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82019060ff82116116375760ff8651921610156116095750508251927fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe061147e61146886610921565b95611476604051978861085e565b808752610921565b013660208601375f5b81518110156116025761149a8183610eb4565b5160418151036115cc5773ffffffffffffffffffffffffffffffffffffffff6114cf6114c68387611826565b90929192611860565b169081156115925750805f52600360205260ff60405f20541615611567575f5b82811061150c5750906001916115058288610eb4565b5201611487565b8173ffffffffffffffffffffffffffffffffffffffff61152c838a610eb4565b51161461153b576001016114ef565b507fe021c4f2000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b7fd7e8a2c2000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b6115c8906040519182917f9e3c1b3d000000000000000000000000000000000000000000000000000000008352600483016107cd565b0390fd5b6115c8906040519182917f2ee17a3d000000000000000000000000000000000000000000000000000000008352600483016107cd565b5050509050565b7f378b0805000000000000000000000000000000000000000000000000000000005f5260045260245260445ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b7f301b38b6000000000000000000000000000000000000000000000000000000005f5260045ffd5b805f525f60205260405f2073ffffffffffffffffffffffffffffffffffffffff83165f5260205260ff60405f205416155f1461175857805f525f60205260405f2073ffffffffffffffffffffffffffffffffffffffff83165f5260205260405f2060017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0082541617905573ffffffffffffffffffffffffffffffffffffffff339216907f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d5f80a4600190565b50505f90565b805f525f60205260405f2073ffffffffffffffffffffffffffffffffffffffff83165f5260205260ff60405f2054165f1461175857805f525f60205260405f2073ffffffffffffffffffffffffffffffffffffffff83165f5260205260405f207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00815416905573ffffffffffffffffffffffffffffffffffffffff339216907ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b5f80a4600190565b81519190604183036118565761184f9250602082015190606060408401519301515f1a9061190b565b9192909190565b50505f9160029190565b60048110156106715780611872575050565b600181036118a2577ff645eedf000000000000000000000000000000000000000000000000000000005f5260045ffd5b600281036118d657507ffce698f7000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b6003146118e05750565b7fd78bce0c000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b91907f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0841161198f579160209360809260ff5f9560405194855216868401526040830152606082015282805260015afa15610c91575f5173ffffffffffffffffffffffffffffffffffffffff81161561198557905f905f90565b505f906001905f90565b5050505f916003919056fea164736f6c634300081c000a2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d4c48d1d2b0f4f7485fc28e3db22341d96a20aa29e6efa8149da9751603abd4e06e0c24a6e293ff9b755263dbaa15ba3796b0b8d3fe17cfb4ddf8143b268eac47bd893629a699470e4ec82a5715bb4981fdaacc5d0a728bf5f55b801d8f4ef10bad3228b676f7d3cd4284a5443f17f1962b36e491b30a40b2405849e597ba5fb5"}} diff --git a/ibc-solidity/abi/bytecode/BesuIBFT2LightClient.json b/ibc-solidity/abi/bytecode/BesuIBFT2LightClient.json index caa3a619a..ff0dd0f69 100644 --- a/ibc-solidity/abi/bytecode/BesuIBFT2LightClient.json +++ b/ibc-solidity/abi/bytecode/BesuIBFT2LightClient.json @@ -1 +1 @@ -{"abi":[{"type":"constructor","inputs":[{"name":"ibcRouter","type":"address","internalType":"address"},{"name":"initialTrustedHeight","type":"uint64","internalType":"uint64"},{"name":"initialTrustedTimestamp","type":"uint64","internalType":"uint64"},{"name":"initialTrustedStorageRoot","type":"bytes32","internalType":"bytes32"},{"name":"initialTrustedValidators","type":"address[]","internalType":"address[]"},{"name":"trustingPeriod","type":"uint64","internalType":"uint64"},{"name":"maxClockDrift","type":"uint64","internalType":"uint64"},{"name":"roleManager","type":"address","internalType":"address"}],"stateMutability":"nonpayable"},{"type":"function","name":"DEFAULT_ADMIN_ROLE","inputs":[],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"type":"function","name":"PROOF_SUBMITTER_ROLE","inputs":[],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"type":"function","name":"getClientState","inputs":[],"outputs":[{"name":"","type":"bytes","internalType":"bytes"}],"stateMutability":"view"},{"type":"function","name":"getConsensusState","inputs":[{"name":"revisionHeight","type":"uint64","internalType":"uint64"}],"outputs":[{"name":"","type":"bytes","internalType":"bytes"}],"stateMutability":"view"},{"type":"function","name":"getRoleAdmin","inputs":[{"name":"role","type":"bytes32","internalType":"bytes32"}],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"type":"function","name":"grantRole","inputs":[{"name":"role","type":"bytes32","internalType":"bytes32"},{"name":"account","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"hasRole","inputs":[{"name":"role","type":"bytes32","internalType":"bytes32"},{"name":"account","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"misbehaviour","inputs":[{"name":"","type":"bytes","internalType":"bytes"}],"outputs":[],"stateMutability":"view"},{"type":"function","name":"renounceRole","inputs":[{"name":"role","type":"bytes32","internalType":"bytes32"},{"name":"callerConfirmation","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"revokeRole","inputs":[{"name":"role","type":"bytes32","internalType":"bytes32"},{"name":"account","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"supportsInterface","inputs":[{"name":"interfaceId","type":"bytes4","internalType":"bytes4"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"updateClient","inputs":[{"name":"updateMsg","type":"bytes","internalType":"bytes"}],"outputs":[{"name":"","type":"uint8","internalType":"enum ILightClientMsgs.UpdateResult"}],"stateMutability":"nonpayable"},{"type":"function","name":"verifyMembership","inputs":[{"name":"msg_","type":"tuple","internalType":"struct ILightClientMsgs.MsgVerifyMembership","components":[{"name":"proof","type":"bytes","internalType":"bytes"},{"name":"proofHeight","type":"tuple","internalType":"struct IICS02ClientMsgs.Height","components":[{"name":"revisionNumber","type":"uint64","internalType":"uint64"},{"name":"revisionHeight","type":"uint64","internalType":"uint64"}]},{"name":"path","type":"bytes[]","internalType":"bytes[]"},{"name":"value","type":"bytes","internalType":"bytes"}]}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"verifyNonMembership","inputs":[{"name":"msg_","type":"tuple","internalType":"struct ILightClientMsgs.MsgVerifyNonMembership","components":[{"name":"proof","type":"bytes","internalType":"bytes"},{"name":"proofHeight","type":"tuple","internalType":"struct IICS02ClientMsgs.Height","components":[{"name":"revisionNumber","type":"uint64","internalType":"uint64"},{"name":"revisionHeight","type":"uint64","internalType":"uint64"}]},{"name":"path","type":"bytes[]","internalType":"bytes[]"}]}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"event","name":"RoleAdminChanged","inputs":[{"name":"role","type":"bytes32","indexed":true,"internalType":"bytes32"},{"name":"previousAdminRole","type":"bytes32","indexed":true,"internalType":"bytes32"},{"name":"newAdminRole","type":"bytes32","indexed":true,"internalType":"bytes32"}],"anonymous":false},{"type":"event","name":"RoleGranted","inputs":[{"name":"role","type":"bytes32","indexed":true,"internalType":"bytes32"},{"name":"account","type":"address","indexed":true,"internalType":"address"},{"name":"sender","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"type":"event","name":"RoleRevoked","inputs":[{"name":"role","type":"bytes32","indexed":true,"internalType":"bytes32"},{"name":"account","type":"address","indexed":true,"internalType":"address"},{"name":"sender","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"type":"error","name":"AccessControlBadConfirmation","inputs":[]},{"type":"error","name":"AccessControlUnauthorizedAccount","inputs":[{"name":"account","type":"address","internalType":"address"},{"name":"neededRole","type":"bytes32","internalType":"bytes32"}]},{"type":"error","name":"ConflictingConsensusState","inputs":[{"name":"revisionHeight","type":"uint64","internalType":"uint64"}]},{"type":"error","name":"ConsensusStateExpired","inputs":[{"name":"trustedTimestamp","type":"uint64","internalType":"uint64"},{"name":"currentTimestamp","type":"uint256","internalType":"uint256"},{"name":"trustingPeriod","type":"uint64","internalType":"uint64"}]},{"type":"error","name":"ConsensusStateNotFound","inputs":[{"name":"revisionHeight","type":"uint64","internalType":"uint64"}]},{"type":"error","name":"DuplicateCommitSealSigner","inputs":[{"name":"signer","type":"address","internalType":"address"}]},{"type":"error","name":"DuplicateValidator","inputs":[{"name":"validator","type":"address","internalType":"address"}]},{"type":"error","name":"EmptyValidatorSet","inputs":[]},{"type":"error","name":"HeaderFromFuture","inputs":[{"name":"currentTimestamp","type":"uint256","internalType":"uint256"},{"name":"headerTimestamp","type":"uint256","internalType":"uint256"},{"name":"maxClockDrift","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"InsufficientTrustedValidatorOverlap","inputs":[{"name":"actual","type":"uint256","internalType":"uint256"},{"name":"required","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"InsufficientValidatorQuorum","inputs":[{"name":"actual","type":"uint256","internalType":"uint256"},{"name":"required","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"InvalidCommitSeal","inputs":[]},{"type":"error","name":"InvalidCommitmentValue","inputs":[{"name":"expectedValue","type":"bytes32","internalType":"bytes32"},{"name":"actualValue","type":"bytes32","internalType":"bytes32"}]},{"type":"error","name":"InvalidDifficulty","inputs":[{"name":"actualDifficulty","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"InvalidECDSASignatureLength","inputs":[{"name":"length","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"InvalidExtraDataFormat","inputs":[{"name":"itemsLength","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"InvalidHeaderFormat","inputs":[{"name":"itemsLength","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"InvalidHeaderHeight","inputs":[]},{"type":"error","name":"InvalidHeaderTimestamp","inputs":[]},{"type":"error","name":"InvalidMixHash","inputs":[{"name":"actualMixHash","type":"bytes32","internalType":"bytes32"}]},{"type":"error","name":"InvalidNonce","inputs":[{"name":"actualNonce","type":"bytes","internalType":"bytes"}]},{"type":"error","name":"InvalidOmmersHash","inputs":[{"name":"actualOmmersHash","type":"bytes32","internalType":"bytes32"}]},{"type":"error","name":"InvalidPathLength","inputs":[{"name":"expectedLength","type":"uint256","internalType":"uint256"},{"name":"actualLength","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"InvalidRevisionNumber","inputs":[{"name":"providedRevisionNumber","type":"uint64","internalType":"uint64"}]},{"type":"error","name":"InvalidValidatorAddress","inputs":[{"name":"validator","type":"address","internalType":"address"}]},{"type":"error","name":"InvalidValidatorAddressLength","inputs":[{"name":"length","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"InvalidValueLength","inputs":[{"name":"expectedLength","type":"uint256","internalType":"uint256"},{"name":"actualLength","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"UnsupportedMisbehaviour","inputs":[]},{"type":"error","name":"ValueExists","inputs":[{"name":"actualValue","type":"bytes32","internalType":"bytes32"}]}],"bytecode":{"object":"0x6080604052346103d85761390780380380610019816103dc565b928339810190610100818303126103d85761003381610401565b9061004060208201610415565b9061004d60408201610415565b92606082015191608081015160018060401b0381116103d85781019286601f850112156103d8578351966001600160401b03881161037f578760051b9460206100978188016103dc565b809a81520190602082978201019283116103d857602001905b8282106103c0575050506100c660a08301610415565b956100df60e06100d860c08601610415565b9401610401565b956001600160401b03169081156103b1576001600160401b03169283156103a257885115610393575f5b89518110156101bf576001600160a01b03610124828c610429565b511615610198575f5b81811061013d5750600101610109565b6001600160a01b0361014f828d610429565b51166001600160a01b03610163848e610429565b5116146101725760010161012d565b6001600160a01b03610184838d610429565b511663107f863360e21b5f5260045260245ffd5b6001600160a01b03906101ab908b610429565b51166359bff38760e01b5f5260045260245ffd5b5060408051979896978a979181016001600160401b0381118282101761037f576040525f81526020810190848252604051926080840198848a1060018060401b038b111761037f576040998a526001600160a01b031680855260208086018490526001600160401b03928316868c01819052878416606090970196909652600180546001600160a01b031916909217825592516002805495516fffffffffffffffff0000000000000000908d1b81169285166001600160801b03199788161792909217815560038054988d1b90921697909516909517959095179093555f948552600490529590922080546001600160401b031916949094178455830191909155925193910191831161037f5768010000000000000000831161037f578154838355808410610359575b50905f5260205f205f5b83811061033c57846001600160a01b0381166103235750610312610547565b505b60405161329d90816105ca8239f35b8061033061033692610451565b506104c7565b50610314565b82516001600160a01b0316818301556020909201916001016102f3565b825f528360205f2091820191015b81811061037457506102e9565b5f8155600101610367565b634e487b7160e01b5f52604160045260245ffd5b63339e1ffb60e01b5f5260045ffd5b63574f4e6160e01b5f5260045ffd5b6359d119e360e01b5f5260045ffd5b602080916103cd84610401565b8152019101906100b0565b5f80fd5b6040519190601f01601f191682016001600160401b0381118382101761037f57604052565b51906001600160a01b03821682036103d857565b51906001600160401b03821682036103d857565b805182101561043d5760209160051b010190565b634e487b7160e01b5f52603260045260245ffd5b6001600160a01b0381165f9081525f5160206138e75f395f51905f52602052604090205460ff166104c2576001600160a01b03165f8181525f5160206138e75f395f51905f5260205260408120805460ff191660011790553391905f5160206138675f395f51905f528180a4600190565b505f90565b6001600160a01b0381165f9081525f5160206138875f395f51905f52602052604090205460ff166104c2576001600160a01b03165f8181525f5160206138875f395f51905f5260205260408120805460ff191660011790553391905f5160206138c75f395f51905f52905f5160206138675f395f51905f529080a4600190565b5f80525f5160206138875f395f51905f526020525f5160206138a75f395f51905f525460ff166105c5575f8080525f5160206138875f395f51905f526020525f5160206138a75f395f51905f52805460ff1916600117905533905f5160206138c75f395f51905f525f5160206138675f395f51905f528280a4600190565b5f9056fe60806040526004361015610011575f80fd5b5f3560e01c806301ffc9a7146100f45780630bece356146100ef578063248a9ca3146100ea5780632f2ff15d146100e557806336568abe146100e05780634d6d9ffb146100db5780635972185a146100d6578063682ed5f0146100d157806391d14854146100cc578063a217fddf146100c7578063d547741f146100c2578063ddba6537146100bd578063edce8bdc146100b85763ef913a4b146100b3575f80fd5b610a16565b61095e565b61088b565b61085c565b610842565b6107f4565b6105e6565b6105ac565b6103ac565b610350565b61031a565b6102b5565b610217565b34610195576020600319360112610195576004357fffffffff00000000000000000000000000000000000000000000000000000000811680910361019557807f7965db0b000000000000000000000000000000000000000000000000000000006020921490811561016b575b506040519015158152f35b7f01ffc9a7000000000000000000000000000000000000000000000000000000009150145f610160565b5f80fd5b9060206003198301126101955760043567ffffffffffffffff811161019557826023820112156101955780600401359267ffffffffffffffff84116101955760248483010111610195576024019190565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b346101955761028161022836610199565b5f80527f4c48d1d2b0f4f7485fc28e3db22341d96a20aa29e6efa8149da9751603abd4e06020527f6e0c24a6e293ff9b755263dbaa15ba3796b0b8d3fe17cfb4ddf8143b268eac475490919060ff161561029957610d9d565b6040516003821015610294576020918152f35b6101ea565b6102a1611287565b610d9d565b90816020910312610195573590565b346101955760206003193601126101955760206102df6004355f525f602052600160405f20015490565b604051908152f35b6003196040910112610195576004359060243573ffffffffffffffffffffffffffffffffffffffff811681036101955790565b346101955761034e61032b366102e7565b90610349610344825f525f602052600160405f20015490565b61130f565b6121c6565b005b346101955761035e366102e7565b3373ffffffffffffffffffffffffffffffffffffffff8216036103845761034e9161229d565b7f6697b232000000000000000000000000000000000000000000000000000000005f5260045ffd5b346101955760206003193601126101955760043567ffffffffffffffff8111610195578060040160806003198336030112610195575f80527f4c48d1d2b0f4f7485fc28e3db22341d96a20aa29e6efa8149da9751603abd4e060205260ff7f6e0c24a6e293ff9b755263dbaa15ba3796b0b8d3fe17cfb4ddf8143b268eac4754161561059f575b61044761044260248401611192565b61137c565b60648201916001610458848461119c565b90500361056157906104a96104966104a261049d61049661049061048961048460446104e09a01611192565b611b30565b988761119c565b9061126e565b3691610b4d565b612372565b928061121d565b906001840154906040516104d7816104c960208201948560209181520190565b03601f198101835282610afd565b51902091612400565b805161051f5761051b61050b6104fe845467ffffffffffffffff1690565b67ffffffffffffffff1690565b6040519081529081906020820190565b0390f35b61053361052e61055e92612545565b612572565b7fd039601e000000000000000000000000000000000000000000000000000000005f52600452602490565b5ffd5b61055e61056e848461119c565b7f88b3170e000000000000000000000000000000000000000000000000000000005f52600160045260245250604490565b6105a7611287565b610433565b34610195575f6003193601126101955760206040517fbd893629a699470e4ec82a5715bb4981fdaacc5d0a728bf5f55b801d8f4ef10b8152f35b346101955760206003193601126101955760043567ffffffffffffffff8111610195578060040160a06003198336030112610195575f80527f4c48d1d2b0f4f7485fc28e3db22341d96a20aa29e6efa8149da9751603abd4e060205260ff7f6e0c24a6e293ff9b755263dbaa15ba3796b0b8d3fe17cfb4ddf8143b268eac475416156107e7575b61067c61044260248401611192565b6064820191600161068d848461119c565b90500361056157608481019060206106a5838561121d565b9050036107a957906106f46104966106ed6106e56106de61049d6104966104906106d761048460446107149c01611192565b9b8b61119c565b948761121d565b8101906102a6565b948061121d565b906001850154906040516104d7816104c960208201948560209181520190565b8051156107755761052e61072791612545565b908082036107475761051b61050b6104fe855467ffffffffffffffff1690565b7f56ed1b63000000000000000000000000000000000000000000000000000000005f5260045260245260445ffd5b61055e827f56ed1b63000000000000000000000000000000000000000000000000000000005f52906044916004525f602452565b61055e6107b6838561121d565b7f24fadac8000000000000000000000000000000000000000000000000000000005f52602060045260245250604490565b6107ef611287565b61066d565b3461019557602060ff610836610809366102e7565b905f525f845260405f209073ffffffffffffffffffffffffffffffffffffffff165f5260205260405f2090565b54166040519015158152f35b34610195575f6003193601126101955760206040515f8152f35b346101955761034e61086d366102e7565b90610886610344825f525f602052600160405f20015490565b61229d565b346101955761089936610199565b50505f80527f4c48d1d2b0f4f7485fc28e3db22341d96a20aa29e6efa8149da9751603abd4e06020527f6e0c24a6e293ff9b755263dbaa15ba3796b0b8d3fe17cfb4ddf8143b268eac475460ff1615610915575b7f2c1ed462000000000000000000000000000000000000000000000000000000005f5260045ffd5b61091d611287565b6108ed565b67ffffffffffffffff81160361019557565b601f19601f602060409481855280519182918282880152018686015e5f8582860101520116010190565b346101955760206003193601126101955761097e60043561048481610922565b67ffffffffffffffff8154166002600183015492019060405192608084019160208501526040840152606080840152815480915260a08301915f5260205f20905f5b8181106109ea5761051b856109de818703601f198101835282610afd565b60405191829182610934565b825473ffffffffffffffffffffffffffffffffffffffff168452602090930192600192830192016109c0565b34610195575f6003193601126101955761051b60405173ffffffffffffffffffffffffffffffffffffffff60015416602082015267ffffffffffffffff600254818116604084015260401c16606082015267ffffffffffffffff600354818116608084015260401c1660a082015260a081526109de60c082610afd565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b6060810190811067ffffffffffffffff821117610adc57604052565b610a93565b6040810190811067ffffffffffffffff821117610adc57604052565b90601f601f19910116810190811067ffffffffffffffff821117610adc57604052565b60405190610b2f604083610afd565b565b67ffffffffffffffff8111610adc57601f01601f191660200190565b929192610b5982610b31565b91610b676040519384610afd565b829481845281830111610195578281602093845f960137010152565b9080601f8301121561019557816020610b9e93359101610b4d565b90565b6020818303126101955780359067ffffffffffffffff8211610195570180820391608083126101955760405192610bd784610ac0565b823567ffffffffffffffff811161019557604091610bfa84601f19938701610b83565b8652011261019557604051610c0e81610ae1565b6020830135610c1c81610922565b81526040830135610c2c81610922565b60208201526020840152606082013567ffffffffffffffff811161019557610c549201610b83565b604082015290565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b9060018201809211610c9757565b610c5c565b60c001908160c011610c9757565b60f701908160f711610c9757565b6080019081608011610c9757565b60b701908160b711610c9757565b91908201809211610c9757565b908160011b9180830460021490151715610c9757565b81519167ffffffffffffffff8311610adc57680100000000000000008311610adc578154838355808410610d77575b506020610d389101915f5260205f2090565b5f5b838110610d475750505050565b6001906020610d6a855173ffffffffffffffffffffffffffffffffffffffff1690565b9401938184015501610d3a565b825f528360205f2091820191015b818110610d925750610d26565b5f8155600101610d85565b610da991810190610ba1565b9060208201610dc461044282515167ffffffffffffffff1690565b610dce8351611614565b92606084019367ffffffffffffffff610def865167ffffffffffffffff1690565b161561116a5760035491604083901c67ffffffffffffffff1693610e1d67ffffffffffffffff861642610cd4565b9460a0840195610e35875167ffffffffffffffff1690565b9067ffffffffffffffff82161161112b5750505160200151610e7290610e649067ffffffffffffffff16611b30565b9367ffffffffffffffff1690565b67ffffffffffffffff81168015159081611102575b506110ad575090610ef591610eb66002610eae610ea385611b87565b60e086015190611ca1565b950185611eba565b610ec660c0830194855190611fdf565b60406080610ee960015473ffffffffffffffffffffffffffffffffffffffff1690565b93015191015191612082565b610f22610f0a865167ffffffffffffffff1690565b67ffffffffffffffff165f52600460205260405f2090565b610f376104fe825467ffffffffffffffff1690565b61103b5750916002610fb5928694610fa8610f73610f64610f0a610fc39a9b5167ffffffffffffffff1690565b955167ffffffffffffffff1690565b859067ffffffffffffffff167fffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000825416179055565b6001840155519101610cf7565b5167ffffffffffffffff1690565b600254610fdc9060401c67ffffffffffffffff166104fe565b67ffffffffffffffff821611610ff157505f90565b611037907fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff6fffffffffffffffff00000000000000006002549260401b16911617600255565b5f90565b91611051611059945167ffffffffffffffff1690565b9051926120f8565b6110a75761055e611072835167ffffffffffffffff1690565b7fc1aea5f7000000000000000000000000000000000000000000000000000000005f5267ffffffffffffffff16600452602490565b60029150565b61055e906110c3855467ffffffffffffffff1690565b7feae35725000000000000000000000000000000000000000000000000000000005f5267ffffffffffffffff9081166004524260245216604452606490565b9050611123429161111e6104fe885467ffffffffffffffff1690565b610cd4565b11155f610e87565b7f9b772277000000000000000000000000000000000000000000000000000000005f524260045267ffffffffffffffff9081166024521660445260645ffd5b7f59d119e3000000000000000000000000000000000000000000000000000000005f5260045ffd5b35610b9e81610922565b9035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe181360301821215610195570180359067ffffffffffffffff821161019557602001918160051b3603831361019557565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b9035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe181360301821215610195570180359067ffffffffffffffff82116101955760200191813603831361019557565b9015611282578061127e9161121d565b9091565b6111f0565b335f9081527f4c48d1d2b0f4f7485fc28e3db22341d96a20aa29e6efa8149da9751603abd4e0602052604090205460ff16156112bf57565b7fe2517d3f000000000000000000000000000000000000000000000000000000005f52336004527fbd893629a699470e4ec82a5715bb4981fdaacc5d0a728bf5f55b801d8f4ef10b60245260445ffd5b805f525f60205260ff6113433360405f209073ffffffffffffffffffffffffffffffffffffffff165f5260205260405f2090565b54161561134d5750565b7fe2517d3f000000000000000000000000000000000000000000000000000000005f523360045260245260445ffd5b67ffffffffffffffff168061138e5750565b7f3ce598a9000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b60405190610100820182811067ffffffffffffffff821117610adc57604052606060e0838281528260208201528260408201525f838201525f60808201525f60a08201528260c08201520152565b8051600110156112825760400190565b805160071015611282576101000190565b8051600d1015611282576101c00190565b8051600e1015611282576101e00190565b805160081015611282576101200190565b8051600310156112825760800190565b8051600b1015611282576101800190565b8051600c1015611282576101a00190565b8051600410156112825760a00190565b8051156112825760200190565b8051600210156112825760600190565b805160101015611282576102200190565b80518210156112825760209160051b010190565b67ffffffffffffffff8111610adc5760051b60200190565b90611501826114df565b61150e6040519182610afd565b828152601f1961151e82946114df565b0190602036910137565b90602082519201517fffffffffffffffffffffffffffffffffffffffff00000000000000000000000081169260148110611560575050565b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000929350829060140360031b1b161690565b60405160a091906115a38382610afd565b6004815291601f1901825f5b8281106115bb57505050565b8060606020809385010152016115af565b906115d6826114df565b6115e36040519182610afd565b828152601f196115f382946114df565b01905f5b82811061160357505050565b8060606020809385010152016115f7565b61163061162b6116226113b9565b92808452612545565b6125b4565b602082019080825251600f8110611b0557507f1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d493476116766116708351611407565b5161267f565b03611aca57600161169061168a8351611417565b51612572565b03611a8f577f63746963616c2062797a616e74696e65206661756c7420746f6c6572616e63656116c36116708351611428565b03611a54576116db6116d58251611439565b5161269b565b80516008811490811591611a24575b506119ea575061162b61175d6116d5836117216117106104fe61168a611762985161144a565b67ffffffffffffffff166060880152565b61172e611670825161145b565b60808701526117576117466104fe61168a845161146b565b67ffffffffffffffff1660a0880152565b5161147c565b612545565b90604081019180835251600581036119bf57506117886117828351611407565b516125b4565b908151156119975761179a82516114f7565b9360c082019485525f5b8351811015611933576117ba6116d582866114cb565b80516014810361190857506117d16117d791611528565b60601c90565b73ffffffffffffffffffffffffffffffffffffffff811680156118c6575f5b8381106118325750509061182c600192611811838a516114cb565b9073ffffffffffffffffffffffffffffffffffffffff169052565b016117a4565b8161187761185e611844848d516114cb565b5173ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff1690565b14611884576001016117f6565b7f41fe18cc000000000000000000000000000000000000000000000000000000005f5273ffffffffffffffffffffffffffffffffffffffff831660045260245ffd5b7f59bff387000000000000000000000000000000000000000000000000000000005f5273ffffffffffffffffffffffffffffffffffffffff821660045260245ffd5b7f83e46ad2000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b509261178291945061194692505161148d565b61195081516115cc565b9260e081019384525f5b8251811015611991578061198a816119776116d5600195886114cb565b88519061198483836114cb565b526114cb565b500161195a565b50925050565b7f339e1ffb000000000000000000000000000000000000000000000000000000005f5260045ffd5b7f30c6792a000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b611a20906040519182917fd5edd2a500000000000000000000000000000000000000000000000000000000835260048301610934565b0390fd5b7f011b4d03dd8c01f1049143cf9c4c817e4b167f1d1b83e5c6f0f10d89ba1e7bce9150602083012014155f6116ea565b611a6461167061055e9251611428565b7fa19e609c000000000000000000000000000000000000000000000000000000005f52600452602490565b611a9f61168a61055e9251611417565b7ff71b722f000000000000000000000000000000000000000000000000000000005f52600452602490565b611ada61167061055e9251611407565b7fb8120dca000000000000000000000000000000000000000000000000000000005f52600452602490565b7fbc277732000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b67ffffffffffffffff1690815f52600460205260405f209167ffffffffffffffff83541615611b5c5750565b7ff761631b000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b6020611c26611b94611592565b611c0d611bab60408601611bb1611bab825161149d565b51612fa2565b611bba8561149d565b52611bc48461149d565b50611bd2611bab8251611407565b611bdb85611407565b52611be584611407565b50611bf3611bab82516114aa565b611bfc856114aa565b52611c06846114aa565b505161145b565b611c168261145b565b52611c208161145b565b50612771565b910190611c348251516115cc565b905f5b83518051821015611c8a579080600192600c82145f14611c78575050611c5c83612829565b611c6682866114cb565b52611c7181856114cb565b5001611c37565b611c8591611bab916114cb565b611c5c565b505050611c979150612771565b6020815191012090565b919091611cae83516114f7565b925f5b8151811015611ea757611cc481836114cb565b51805160418103611e7c575080601b60ff611d13611d0d611ce7611d2096612808565b517fff000000000000000000000000000000000000000000000000000000000000001690565b60f81c90565b1610611e29575b84613050565b90611d2a816128a3565b1590811591611e1f575b508015611e01575b611dd95773ffffffffffffffffffffffffffffffffffffffff81165f5b838110611d7957505090611d7360019261181183896114cb565b01611cb1565b81611d8a61185e611844848c6114cb565b14611d9757600101611d59565b7f33af0d5f000000000000000000000000000000000000000000000000000000005f5273ffffffffffffffffffffffffffffffffffffffff831660045260245ffd5b7f09cb44e6000000000000000000000000000000000000000000000000000000005f5260045ffd5b5073ffffffffffffffffffffffffffffffffffffffff811615611d3c565b905015155f611d34565b611e6b611e43611e3e611d0d611ce785612808565b612891565b60f81b7fff000000000000000000000000000000000000000000000000000000000000001690565b5f1a611e7682612808565b53611d1a565b7ff2db9ce1000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b505050565b5f198114610c975760010190565b905f915f5b8151811015611f1357611ef273ffffffffffffffffffffffffffffffffffffffff611eea83856114cb565b5116846128ad565b611eff575b600101611ebf565b92611f0b600191611eac565b939050611ef7565b50506003611f22915404610c89565b90818110611f2e575050565b7fe2dcb1b9000000000000000000000000000000000000000000000000000000005f5260045260245260445ffd5b905f198201918211610c9757565b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff408201918211610c9757565b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff808201918211610c9757565b6020039060208211610c9757565b91908203918211610c9757565b905f915f5b81518110156120385761201773ffffffffffffffffffffffffffffffffffffffff61200f83856114cb565b511684612904565b612024575b600101611fe4565b92612030600191611eac565b93905061201c565b50505190600382048203918211610c9757818110612054575050565b7f7818f4e4000000000000000000000000000000000000000000000000000000005f5260045260245260445ffd5b6120cc9261162b9261175d926040517fffffffffffffffffffffffffffffffffffffffff000000000000000000000000602082019260601b168252601481526104d7603482610afd565b805160021015611282576060610b9e91015161267f565b8054821015611282575f5260205f2001905f90565b919067ffffffffffffffff80612116855467ffffffffffffffff1690565b9216911614908115916121b7575b506121b1576002019081548151036121b1575f5b81518110156121a95761216e61214e82856120e3565b905473ffffffffffffffffffffffffffffffffffffffff9160031b1c1690565b73ffffffffffffffffffffffffffffffffffffffff61219361185e61184485876114cb565b9116036121a257600101612138565b5050505f90565b505050600190565b50505f90565b9050600182015414155f612124565b805f525f60205260ff6121fa8360405f209073ffffffffffffffffffffffffffffffffffffffff165f5260205260405f2090565b54166121b157805f525f6020526122328260405f209073ffffffffffffffffffffffffffffffffffffffff165f5260205260405f2090565b60017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0082541617905573ffffffffffffffffffffffffffffffffffffffff339216907f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d5f80a4600190565b805f525f60205260ff6122d18360405f209073ffffffffffffffffffffffffffffffffffffffff165f5260205260405f2090565b5416156121b157805f525f60205261230a8260405f209073ffffffffffffffffffffffffffffffffffffffff165f5260205260405f2090565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00815416905573ffffffffffffffffffffffffffffffffffffffff339216907ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b5f80a4600190565b60208151910120604051602081019182527f1260944489272988d9df285149b5aa1b0f48f2136d6f416159f840a3e07476006040820152604081526123b8606082610afd565b51902090565b604051906123cd602083610afd565b5f808352366020840137565b906123e382610b31565b6123f06040519182610afd565b828152601f1961151e8294610b31565b61162b612442919493946124146020610b31565b956124226040519788610afd565b602087526124306020610b31565b601f1960208901910136823752612545565b9061244d8451610ce1565b918451151580612525575b6124619061256b565b61247361246e5f85611fd2565b6123d9565b925f19015f5b81811061248d575050610b9e939450612a78565b8061250f600f6124d2612509611d0d611ce78d6124ac60029960011c90565b908d6125038a6124fb8a6124d26124c9611d0d611ce78a8a612818565b60041c600f1690565b1660f81b7fff000000000000000000000000000000000000000000000000000000000000001690565b5f1a92612818565b53612818565b60ff1690565b5f1a61251e6001830188612818565b5301612479565b506001612458565b6040519061253a82610ae1565b5f6020838281520152565b61254d61252d565b5060208151916040519261256084610ae1565b835201602082015290565b1561019557565b805180151590816125a8575b50156101955761258d90612d4e565b9051906020811061259c575090565b6020036101000a900490565b6021915011155f61257e565b6125bd81612d7a565b15610195576125cb81612d9a565b6125d4816114df565b916125e26040519384610afd565b818352601f196125f1836114df565b015f5b818110612668575050602061261491015161260e81612dfb565b90610cd4565b5f905b8282106126245750505090565b61266081612633600193612e66565b9061263c610b20565b82815281602082015261264f86896114cb565b5261265a85886114cb565b50610cd4565b910190612617565b60209061267361252d565b828288010152016125f4565b6021815103610195576020015160018101809111610c97575190565b805115610195576126ae610b9e91612d4e565b6126ba819392936123d9565b928360200190612f2f565b805191908290602001825e015f815290565b610b2f906126f96126f3949360405195869360208501906126c5565b906126c5565b03601f198101845283610afd565b6001907fff00000000000000000000000000000000000000000000000000000000000000610b9e949316815201906126c5565b916001610b9e94937fff000000000000000000000000000000000000000000000000000000000000006126f39416815201906126c5565b6127796123be565b905f915b81518310156127a55761279d60019161279685856114cb565b51906126d7565b92019161277d565b9150508051603881106127e45750610b9e6127c08251612fce565b916104c96127d4611e436125098651610caa565b916040519485936020850161273a565b6127f6611e43612509610b9e93610c9c565b6104c960405193849260208401612707565b8051604010156112825760600190565b908151811015611282570160200190565b600181511480612876575b610b9e578051603881106128645750610b9e6128508251612fce565b916104c96127d4611e436125098651610cc6565b6127f6611e43612509610b9e93610cb8565b50608060ff61288a611d0d611ce78561149d565b1610612834565b60ff601b9116019060ff8211610c9757565b6004111561029457565b905f5b82548110156121a25773ffffffffffffffffffffffffffffffffffffffff6128d882856120e3565b90549060031b1c1673ffffffffffffffffffffffffffffffffffffffff8316146121a9576001016128b0565b905f5b82518110156121a25773ffffffffffffffffffffffffffffffffffffffff61292f82856114cb565b511673ffffffffffffffffffffffffffffffffffffffff8316146121a957600101612907565b91906129618351610ce1565b908351151580612a6e575b6129759061256b565b61298261246e8284611fd2565b938192600180841614612a0c575b5f19869101935b8481106129a5575050505050565b83612a0360016129f9600f6124d2612509611d0d611ce78b60029b6129f26129e5886124d28f611d0d611ce76129de6124c99360011c90565b8099612818565b9b8d03809c5f1a92612818565b538c612818565b5f1a920189612818565b53018590612997565b92507f0f00000000000000000000000000000000000000000000000000000000000000612a4b612509611d0d611ce7612a458760011c90565b86612818565b60f81b165f1a612a5a8661149d565b535f19612a6683611eac565b939050612990565b508181111561296c565b915f915f612a8461252d565b50845115612d155790935f915b81518310156101955782158080612cff575b61019557159081612ce2575b5061019557612ac161178283836114cb565b948551600281145f14612bbe5750612ae3612ade6116d58861149d565b6130e5565b95612af9612af2888884613152565b8092610cd4565b965111612ba05715612b305750612b109051611f5c565b11610195575111612b27576116d5610b9e91611407565b50610b9e6123be565b919094612b3d8651611f5c565b82146101955780612b5f612b5b612b55600194611407565b51612d7a565b1590565b15612b8157612b70612b7691611407565b516130d7565b915b01919490612a91565b612b8d612b9a91611407565b5160208101519051902090565b91612b78565b505091509250612bb1915051611f5c565b1161019557610b9e6123be565b929491939192601103612c835781518314612c6557612bef612be9612509611d0d611ce78787612818565b93610c89565b92601081101561019557612c0c612c0682896114cb565b516130c1565b15612c2e5750505050612c2191925051611f5c565b0361019557610b9e6123be565b86612c46612b5b612b5584600196989a97999b6114cb565b15612c5857612b9a91612b70916114cb565b612b9a91612b8d916114cb565b505050612c729051611f5c565b03610195576116d5610b9e916114ba565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f696e76616c6964206e6f6465206c656e677468000000000000000000000000006044820152606490fd5b9050612cf7612cf184846114cb565b5161308a565b14155f612aaf565b50612d0d612b8d85856114cb565b871415612aa3565b509050612d4692507f56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b42191501461256b565b610b9e6123be565b906020820191612d5e8351612dfb565b925190838201809211610c975751928303928311610c97579190565b805115612d9557602060c0910151515f1a1061103757600190565b505f90565b805115612d95575f9060208101908151612db381612dfb565b8101809111610c9757915190518101809111610c975791905b828110612dd95750905090565b612de281612e66565b8101809111610c9757612df59091611eac565b90612dcc565b515f1a6080811015612e0c57505f90565b60b881108015612e50575b15612e225750600190565b60c0811015612e4157610b9e90612e3c9060b75b90611fd2565b610c89565b610b9e90612e3c9060f7612e36565b5060c08110158015612e17575060f88110612e17565b80515f1a906080821015612e7b575050600190565b60b8821015612e915750612e3c610b9e91611f97565b60c0821015612ed25760010151602082900360b7016101000a9004017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff4a0190565b60f8821015612ee85750612e3c610b9e91611f6a565b60010151602082900360f7016101000a9004017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0a0190565b601f8111610c97576101000a90565b90918015611ea7575b6020811015612f725780612f4b57505050565b612f5f612f5a612f6492611fc4565b612f20565b611f5c565b905182518216911916179052565b91908051825260208101809111610c97579060208101809111610c975791601f19810190811115612f3857610c5c565b612fac81516123d9565b90815115612fca57806020610b9e9201519051908360200190612f2f565b5090565b5f81805b61303c5750612fe0816123d9565b91815b612fec57505090565b612ff582611f5c565b6130277fff000000000000000000000000000000000000000000000000000000000000008360f81b165f1a9185612818565b5360081c908015610c97575f19019081612fe3565b9061304690611eac565b9060081c80612fd2565b8151919060418303613080576130799250602082015190606060408401519301515f1a906131f6565b9192909190565b50505f9160029190565b805160208110156130a2575060208101519051902090565b90602001512060405160208101918252602081526123b8604082610afd565b6001815103612d955760200151515f1a60801490565b6130e090612d4e565b902090565b9081511561019557600f6131016124c9611d0d611ce78661149d565b16806131145750610b9e60025f93612955565b600181036131295750610b9e60015f93612955565b6002810361313f5750610b9e6002600193612955565b60030361019557610b9e60018093612955565b91905f5b838101808211610c975782518110806131ec575b156131e45761319a7fff000000000000000000000000000000000000000000000000000000000000009184612818565b51167fff000000000000000000000000000000000000000000000000000000000000006131c78386612818565b511690036131dd576131d890611eac565b613156565b9250505090565b509250505090565b508351821061316a565b91907f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08411613285579160209360809260ff5f9560405194855216868401526040830152606082015282805260015afa1561327a575f5173ffffffffffffffffffffffffffffffffffffffff81161561327057905f905f90565b505f906001905f90565b6040513d5f823e3d90fd5b5050505f916003919056fea164736f6c634300081c000a2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d4c48d1d2b0f4f7485fc28e3db22341d96a20aa29e6efa8149da9751603abd4e06e0c24a6e293ff9b755263dbaa15ba3796b0b8d3fe17cfb4ddf8143b268eac47bd893629a699470e4ec82a5715bb4981fdaacc5d0a728bf5f55b801d8f4ef10bad3228b676f7d3cd4284a5443f17f1962b36e491b30a40b2405849e597ba5fb5","sourceMap":"242:2275:34:-:0;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;242:2275:34;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;:::i;:::-;;-1:-1:-1;;;;;242:2275:34;;3952:25:35;;3948:84;;-1:-1:-1;;;;;242:2275:34;;4045:28:35;;4041:90;;242:2275:34;;17766:22:35;17762:79;;-1:-1:-1;17893:3:35;242:2275:34;;17870:21:35;;;;;-1:-1:-1;;;;;17916:13:35;;;;:::i;:::-;242:2275:34;;17916:27:35;17912:111;;-1:-1:-1;18056:5:35;;;;;;17893:3;242:2275:34;;17855:13:35;;18063:3;-1:-1:-1;;;;;18090:13:35;;;;:::i;:::-;242:2275:34;;-1:-1:-1;;;;;18107:13:35;242:2275:34;;18107:13:35;:::i;:::-;242:2275:34;;18090:30:35;18086:117;;242:2275:34;;18041:13:35;;18086:117;-1:-1:-1;;;;;18170:13:35;242:2275:34;;18170:13:35;:::i;:::-;242:2275:34;;18151:33:35;;;-1:-1:-1;18151:33:35;;242:2275:34;;-1:-1:-1;18151:33:35;17912:111;-1:-1:-1;;;;;242:2275:34;17994:13:35;;242:2275:34;17994:13:35;:::i;:::-;242:2275:34;;17970:38:35;;;-1:-1:-1;17970:38:35;;242:2275:34;;-1:-1:-1;17970:38:35;17870:21;-1:-1:-1;242:2275:34;;;17870:21:35;;;;;;;242:2275:34;;-1:-1:-1;;;;;242:2275:34;;;;;;;;;;-1:-1:-1;242:2275:34;;;4285:84:35;;242:2275:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;242:2275:34;;;;;4211:255:35;;;242:2275:34;;;-1:-1:-1;;;;;242:2275:34;;;4211:255:35;;;242:2275:34;;;;;;;4211:255:35;;;242:2275:34;;;;;;;-1:-1:-1;;;;;;242:2275:34;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;242:2275:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;242:2275:34;;;4517:15:35;242:2275:34;;;;;;;;-1:-1:-1;;;;;;242:2275:34;;;;;;;4624:26:35;;242:2275:34;;;;;;;4688:25:35;;;242:2275:34;;;;;;;;;;;;;;;;;;;17850:377:35;242:2275:34;;-1:-1:-1;242:2275:34;;-1:-1:-1;242:2275:34;-1:-1:-1;242:2275:34;;;;;;;-1:-1:-1;;;;;242:2275:34;;;;4796:44:35;;;:::i;:::-;;4751:233;242:2275:34;;;;;;;;;4751:233:35;4871:43;;4928:45;4871:43;;:::i;:::-;;4928:45;:::i;:::-;;4751:233;;242:2275:34;;;-1:-1:-1;;;;;242:2275:34;;;;;;;;;;;;;;;;-1:-1:-1;242:2275:34;;;-1:-1:-1;242:2275:34;;;;;;;;;;;;;;;;-1:-1:-1;242:2275:34;;;;;;;;;;-1:-1:-1;242:2275:34;;4517:15:35;242:2275:34;;-1:-1:-1;242:2275:34;17762:79:35;17811:19;;;-1:-1:-1;17811:19:35;;-1:-1:-1;17811:19:35;4041:90;4096:24;;;-1:-1:-1;4096:24:35;;-1:-1:-1;4096:24:35;3948:84;4000:21;;;-1:-1:-1;4000:21:35;;-1:-1:-1;4000:21:35;242:2275:34;;;;;;;:::i;:::-;;;;;;;;;;-1:-1:-1;242:2275:34;;;;;;;;;-1:-1:-1;;242:2275:34;;;-1:-1:-1;;;;;242:2275:34;;;;;;;;;;:::o;:::-;;;-1:-1:-1;;;;;242:2275:34;;;;;;:::o;:::-;;;-1:-1:-1;;;;;242:2275:34;;;;;;:::o;:::-;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;6145:316:93;-1:-1:-1;;;;;242:2275:34;;3976:1:35;242:2275:34;;;-1:-1:-1;;;;;;;;;;;242:2275:34;;;;;;;;;;-1:-1:-1;;;;;242:2275:34;3976:1:35;242:2275:34;;;-1:-1:-1;;;;;;;;;;;242:2275:34;;;;;;;-1:-1:-1;;242:2275:34;;;;;735:10:121;;242:2275:34;-1:-1:-1;;;;;;;;;;;3976:1:35;;6336:40:93;6313:4;6390:11;:::o;6238:217::-;6432:12;3976:1:35;6432:12:93;:::o;6145:316::-;-1:-1:-1;;;;;242:2275:34;;;;;;-1:-1:-1;;;;;;;;;;;242:2275:34;;;;;;;;;;-1:-1:-1;;;;;242:2275:34;;;;;-1:-1:-1;;;;;;;;;;;242:2275:34;;;;;;;-1:-1:-1;;242:2275:34;;;;;735:10:121;;242:2275:34;-1:-1:-1;;;;;;;;;;;2089:33:35;-1:-1:-1;;;;;;;;;;;6336:40:93;242:2275:34;6336:40:93;6313:4;6390:11;:::o;6145:316::-;242:2275:34;;;-1:-1:-1;;;;;;;;;;;242:2275:34;;-1:-1:-1;;;;;;;;;;;242:2275:34;;;;;;;;;-1:-1:-1;;;;;;;;;;;242:2275:34;;-1:-1:-1;;;;;;;;;;;242:2275:34;;-1:-1:-1;;242:2275:34;6313:4:93;242:2275:34;;;735:10:121;;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;242:2275:34;;6336:40:93;6313:4;6390:11;:::o;6238:217::-;242:2275:34;6432:12:93;:::o","linkReferences":{}},"deployedBytecode":{"object":"0x60806040526004361015610011575f80fd5b5f3560e01c806301ffc9a7146100f45780630bece356146100ef578063248a9ca3146100ea5780632f2ff15d146100e557806336568abe146100e05780634d6d9ffb146100db5780635972185a146100d6578063682ed5f0146100d157806391d14854146100cc578063a217fddf146100c7578063d547741f146100c2578063ddba6537146100bd578063edce8bdc146100b85763ef913a4b146100b3575f80fd5b610a16565b61095e565b61088b565b61085c565b610842565b6107f4565b6105e6565b6105ac565b6103ac565b610350565b61031a565b6102b5565b610217565b34610195576020600319360112610195576004357fffffffff00000000000000000000000000000000000000000000000000000000811680910361019557807f7965db0b000000000000000000000000000000000000000000000000000000006020921490811561016b575b506040519015158152f35b7f01ffc9a7000000000000000000000000000000000000000000000000000000009150145f610160565b5f80fd5b9060206003198301126101955760043567ffffffffffffffff811161019557826023820112156101955780600401359267ffffffffffffffff84116101955760248483010111610195576024019190565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b346101955761028161022836610199565b5f80527f4c48d1d2b0f4f7485fc28e3db22341d96a20aa29e6efa8149da9751603abd4e06020527f6e0c24a6e293ff9b755263dbaa15ba3796b0b8d3fe17cfb4ddf8143b268eac475490919060ff161561029957610d9d565b6040516003821015610294576020918152f35b6101ea565b6102a1611287565b610d9d565b90816020910312610195573590565b346101955760206003193601126101955760206102df6004355f525f602052600160405f20015490565b604051908152f35b6003196040910112610195576004359060243573ffffffffffffffffffffffffffffffffffffffff811681036101955790565b346101955761034e61032b366102e7565b90610349610344825f525f602052600160405f20015490565b61130f565b6121c6565b005b346101955761035e366102e7565b3373ffffffffffffffffffffffffffffffffffffffff8216036103845761034e9161229d565b7f6697b232000000000000000000000000000000000000000000000000000000005f5260045ffd5b346101955760206003193601126101955760043567ffffffffffffffff8111610195578060040160806003198336030112610195575f80527f4c48d1d2b0f4f7485fc28e3db22341d96a20aa29e6efa8149da9751603abd4e060205260ff7f6e0c24a6e293ff9b755263dbaa15ba3796b0b8d3fe17cfb4ddf8143b268eac4754161561059f575b61044761044260248401611192565b61137c565b60648201916001610458848461119c565b90500361056157906104a96104966104a261049d61049661049061048961048460446104e09a01611192565b611b30565b988761119c565b9061126e565b3691610b4d565b612372565b928061121d565b906001840154906040516104d7816104c960208201948560209181520190565b03601f198101835282610afd565b51902091612400565b805161051f5761051b61050b6104fe845467ffffffffffffffff1690565b67ffffffffffffffff1690565b6040519081529081906020820190565b0390f35b61053361052e61055e92612545565b612572565b7fd039601e000000000000000000000000000000000000000000000000000000005f52600452602490565b5ffd5b61055e61056e848461119c565b7f88b3170e000000000000000000000000000000000000000000000000000000005f52600160045260245250604490565b6105a7611287565b610433565b34610195575f6003193601126101955760206040517fbd893629a699470e4ec82a5715bb4981fdaacc5d0a728bf5f55b801d8f4ef10b8152f35b346101955760206003193601126101955760043567ffffffffffffffff8111610195578060040160a06003198336030112610195575f80527f4c48d1d2b0f4f7485fc28e3db22341d96a20aa29e6efa8149da9751603abd4e060205260ff7f6e0c24a6e293ff9b755263dbaa15ba3796b0b8d3fe17cfb4ddf8143b268eac475416156107e7575b61067c61044260248401611192565b6064820191600161068d848461119c565b90500361056157608481019060206106a5838561121d565b9050036107a957906106f46104966106ed6106e56106de61049d6104966104906106d761048460446107149c01611192565b9b8b61119c565b948761121d565b8101906102a6565b948061121d565b906001850154906040516104d7816104c960208201948560209181520190565b8051156107755761052e61072791612545565b908082036107475761051b61050b6104fe855467ffffffffffffffff1690565b7f56ed1b63000000000000000000000000000000000000000000000000000000005f5260045260245260445ffd5b61055e827f56ed1b63000000000000000000000000000000000000000000000000000000005f52906044916004525f602452565b61055e6107b6838561121d565b7f24fadac8000000000000000000000000000000000000000000000000000000005f52602060045260245250604490565b6107ef611287565b61066d565b3461019557602060ff610836610809366102e7565b905f525f845260405f209073ffffffffffffffffffffffffffffffffffffffff165f5260205260405f2090565b54166040519015158152f35b34610195575f6003193601126101955760206040515f8152f35b346101955761034e61086d366102e7565b90610886610344825f525f602052600160405f20015490565b61229d565b346101955761089936610199565b50505f80527f4c48d1d2b0f4f7485fc28e3db22341d96a20aa29e6efa8149da9751603abd4e06020527f6e0c24a6e293ff9b755263dbaa15ba3796b0b8d3fe17cfb4ddf8143b268eac475460ff1615610915575b7f2c1ed462000000000000000000000000000000000000000000000000000000005f5260045ffd5b61091d611287565b6108ed565b67ffffffffffffffff81160361019557565b601f19601f602060409481855280519182918282880152018686015e5f8582860101520116010190565b346101955760206003193601126101955761097e60043561048481610922565b67ffffffffffffffff8154166002600183015492019060405192608084019160208501526040840152606080840152815480915260a08301915f5260205f20905f5b8181106109ea5761051b856109de818703601f198101835282610afd565b60405191829182610934565b825473ffffffffffffffffffffffffffffffffffffffff168452602090930192600192830192016109c0565b34610195575f6003193601126101955761051b60405173ffffffffffffffffffffffffffffffffffffffff60015416602082015267ffffffffffffffff600254818116604084015260401c16606082015267ffffffffffffffff600354818116608084015260401c1660a082015260a081526109de60c082610afd565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b6060810190811067ffffffffffffffff821117610adc57604052565b610a93565b6040810190811067ffffffffffffffff821117610adc57604052565b90601f601f19910116810190811067ffffffffffffffff821117610adc57604052565b60405190610b2f604083610afd565b565b67ffffffffffffffff8111610adc57601f01601f191660200190565b929192610b5982610b31565b91610b676040519384610afd565b829481845281830111610195578281602093845f960137010152565b9080601f8301121561019557816020610b9e93359101610b4d565b90565b6020818303126101955780359067ffffffffffffffff8211610195570180820391608083126101955760405192610bd784610ac0565b823567ffffffffffffffff811161019557604091610bfa84601f19938701610b83565b8652011261019557604051610c0e81610ae1565b6020830135610c1c81610922565b81526040830135610c2c81610922565b60208201526020840152606082013567ffffffffffffffff811161019557610c549201610b83565b604082015290565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b9060018201809211610c9757565b610c5c565b60c001908160c011610c9757565b60f701908160f711610c9757565b6080019081608011610c9757565b60b701908160b711610c9757565b91908201809211610c9757565b908160011b9180830460021490151715610c9757565b81519167ffffffffffffffff8311610adc57680100000000000000008311610adc578154838355808410610d77575b506020610d389101915f5260205f2090565b5f5b838110610d475750505050565b6001906020610d6a855173ffffffffffffffffffffffffffffffffffffffff1690565b9401938184015501610d3a565b825f528360205f2091820191015b818110610d925750610d26565b5f8155600101610d85565b610da991810190610ba1565b9060208201610dc461044282515167ffffffffffffffff1690565b610dce8351611614565b92606084019367ffffffffffffffff610def865167ffffffffffffffff1690565b161561116a5760035491604083901c67ffffffffffffffff1693610e1d67ffffffffffffffff861642610cd4565b9460a0840195610e35875167ffffffffffffffff1690565b9067ffffffffffffffff82161161112b5750505160200151610e7290610e649067ffffffffffffffff16611b30565b9367ffffffffffffffff1690565b67ffffffffffffffff81168015159081611102575b506110ad575090610ef591610eb66002610eae610ea385611b87565b60e086015190611ca1565b950185611eba565b610ec660c0830194855190611fdf565b60406080610ee960015473ffffffffffffffffffffffffffffffffffffffff1690565b93015191015191612082565b610f22610f0a865167ffffffffffffffff1690565b67ffffffffffffffff165f52600460205260405f2090565b610f376104fe825467ffffffffffffffff1690565b61103b5750916002610fb5928694610fa8610f73610f64610f0a610fc39a9b5167ffffffffffffffff1690565b955167ffffffffffffffff1690565b859067ffffffffffffffff167fffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000825416179055565b6001840155519101610cf7565b5167ffffffffffffffff1690565b600254610fdc9060401c67ffffffffffffffff166104fe565b67ffffffffffffffff821611610ff157505f90565b611037907fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff6fffffffffffffffff00000000000000006002549260401b16911617600255565b5f90565b91611051611059945167ffffffffffffffff1690565b9051926120f8565b6110a75761055e611072835167ffffffffffffffff1690565b7fc1aea5f7000000000000000000000000000000000000000000000000000000005f5267ffffffffffffffff16600452602490565b60029150565b61055e906110c3855467ffffffffffffffff1690565b7feae35725000000000000000000000000000000000000000000000000000000005f5267ffffffffffffffff9081166004524260245216604452606490565b9050611123429161111e6104fe885467ffffffffffffffff1690565b610cd4565b11155f610e87565b7f9b772277000000000000000000000000000000000000000000000000000000005f524260045267ffffffffffffffff9081166024521660445260645ffd5b7f59d119e3000000000000000000000000000000000000000000000000000000005f5260045ffd5b35610b9e81610922565b9035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe181360301821215610195570180359067ffffffffffffffff821161019557602001918160051b3603831361019557565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b9035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe181360301821215610195570180359067ffffffffffffffff82116101955760200191813603831361019557565b9015611282578061127e9161121d565b9091565b6111f0565b335f9081527f4c48d1d2b0f4f7485fc28e3db22341d96a20aa29e6efa8149da9751603abd4e0602052604090205460ff16156112bf57565b7fe2517d3f000000000000000000000000000000000000000000000000000000005f52336004527fbd893629a699470e4ec82a5715bb4981fdaacc5d0a728bf5f55b801d8f4ef10b60245260445ffd5b805f525f60205260ff6113433360405f209073ffffffffffffffffffffffffffffffffffffffff165f5260205260405f2090565b54161561134d5750565b7fe2517d3f000000000000000000000000000000000000000000000000000000005f523360045260245260445ffd5b67ffffffffffffffff168061138e5750565b7f3ce598a9000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b60405190610100820182811067ffffffffffffffff821117610adc57604052606060e0838281528260208201528260408201525f838201525f60808201525f60a08201528260c08201520152565b8051600110156112825760400190565b805160071015611282576101000190565b8051600d1015611282576101c00190565b8051600e1015611282576101e00190565b805160081015611282576101200190565b8051600310156112825760800190565b8051600b1015611282576101800190565b8051600c1015611282576101a00190565b8051600410156112825760a00190565b8051156112825760200190565b8051600210156112825760600190565b805160101015611282576102200190565b80518210156112825760209160051b010190565b67ffffffffffffffff8111610adc5760051b60200190565b90611501826114df565b61150e6040519182610afd565b828152601f1961151e82946114df565b0190602036910137565b90602082519201517fffffffffffffffffffffffffffffffffffffffff00000000000000000000000081169260148110611560575050565b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000929350829060140360031b1b161690565b60405160a091906115a38382610afd565b6004815291601f1901825f5b8281106115bb57505050565b8060606020809385010152016115af565b906115d6826114df565b6115e36040519182610afd565b828152601f196115f382946114df565b01905f5b82811061160357505050565b8060606020809385010152016115f7565b61163061162b6116226113b9565b92808452612545565b6125b4565b602082019080825251600f8110611b0557507f1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d493476116766116708351611407565b5161267f565b03611aca57600161169061168a8351611417565b51612572565b03611a8f577f63746963616c2062797a616e74696e65206661756c7420746f6c6572616e63656116c36116708351611428565b03611a54576116db6116d58251611439565b5161269b565b80516008811490811591611a24575b506119ea575061162b61175d6116d5836117216117106104fe61168a611762985161144a565b67ffffffffffffffff166060880152565b61172e611670825161145b565b60808701526117576117466104fe61168a845161146b565b67ffffffffffffffff1660a0880152565b5161147c565b612545565b90604081019180835251600581036119bf57506117886117828351611407565b516125b4565b908151156119975761179a82516114f7565b9360c082019485525f5b8351811015611933576117ba6116d582866114cb565b80516014810361190857506117d16117d791611528565b60601c90565b73ffffffffffffffffffffffffffffffffffffffff811680156118c6575f5b8381106118325750509061182c600192611811838a516114cb565b9073ffffffffffffffffffffffffffffffffffffffff169052565b016117a4565b8161187761185e611844848d516114cb565b5173ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff1690565b14611884576001016117f6565b7f41fe18cc000000000000000000000000000000000000000000000000000000005f5273ffffffffffffffffffffffffffffffffffffffff831660045260245ffd5b7f59bff387000000000000000000000000000000000000000000000000000000005f5273ffffffffffffffffffffffffffffffffffffffff821660045260245ffd5b7f83e46ad2000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b509261178291945061194692505161148d565b61195081516115cc565b9260e081019384525f5b8251811015611991578061198a816119776116d5600195886114cb565b88519061198483836114cb565b526114cb565b500161195a565b50925050565b7f339e1ffb000000000000000000000000000000000000000000000000000000005f5260045ffd5b7f30c6792a000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b611a20906040519182917fd5edd2a500000000000000000000000000000000000000000000000000000000835260048301610934565b0390fd5b7f011b4d03dd8c01f1049143cf9c4c817e4b167f1d1b83e5c6f0f10d89ba1e7bce9150602083012014155f6116ea565b611a6461167061055e9251611428565b7fa19e609c000000000000000000000000000000000000000000000000000000005f52600452602490565b611a9f61168a61055e9251611417565b7ff71b722f000000000000000000000000000000000000000000000000000000005f52600452602490565b611ada61167061055e9251611407565b7fb8120dca000000000000000000000000000000000000000000000000000000005f52600452602490565b7fbc277732000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b67ffffffffffffffff1690815f52600460205260405f209167ffffffffffffffff83541615611b5c5750565b7ff761631b000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b6020611c26611b94611592565b611c0d611bab60408601611bb1611bab825161149d565b51612fa2565b611bba8561149d565b52611bc48461149d565b50611bd2611bab8251611407565b611bdb85611407565b52611be584611407565b50611bf3611bab82516114aa565b611bfc856114aa565b52611c06846114aa565b505161145b565b611c168261145b565b52611c208161145b565b50612771565b910190611c348251516115cc565b905f5b83518051821015611c8a579080600192600c82145f14611c78575050611c5c83612829565b611c6682866114cb565b52611c7181856114cb565b5001611c37565b611c8591611bab916114cb565b611c5c565b505050611c979150612771565b6020815191012090565b919091611cae83516114f7565b925f5b8151811015611ea757611cc481836114cb565b51805160418103611e7c575080601b60ff611d13611d0d611ce7611d2096612808565b517fff000000000000000000000000000000000000000000000000000000000000001690565b60f81c90565b1610611e29575b84613050565b90611d2a816128a3565b1590811591611e1f575b508015611e01575b611dd95773ffffffffffffffffffffffffffffffffffffffff81165f5b838110611d7957505090611d7360019261181183896114cb565b01611cb1565b81611d8a61185e611844848c6114cb565b14611d9757600101611d59565b7f33af0d5f000000000000000000000000000000000000000000000000000000005f5273ffffffffffffffffffffffffffffffffffffffff831660045260245ffd5b7f09cb44e6000000000000000000000000000000000000000000000000000000005f5260045ffd5b5073ffffffffffffffffffffffffffffffffffffffff811615611d3c565b905015155f611d34565b611e6b611e43611e3e611d0d611ce785612808565b612891565b60f81b7fff000000000000000000000000000000000000000000000000000000000000001690565b5f1a611e7682612808565b53611d1a565b7ff2db9ce1000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b505050565b5f198114610c975760010190565b905f915f5b8151811015611f1357611ef273ffffffffffffffffffffffffffffffffffffffff611eea83856114cb565b5116846128ad565b611eff575b600101611ebf565b92611f0b600191611eac565b939050611ef7565b50506003611f22915404610c89565b90818110611f2e575050565b7fe2dcb1b9000000000000000000000000000000000000000000000000000000005f5260045260245260445ffd5b905f198201918211610c9757565b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff408201918211610c9757565b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff808201918211610c9757565b6020039060208211610c9757565b91908203918211610c9757565b905f915f5b81518110156120385761201773ffffffffffffffffffffffffffffffffffffffff61200f83856114cb565b511684612904565b612024575b600101611fe4565b92612030600191611eac565b93905061201c565b50505190600382048203918211610c9757818110612054575050565b7f7818f4e4000000000000000000000000000000000000000000000000000000005f5260045260245260445ffd5b6120cc9261162b9261175d926040517fffffffffffffffffffffffffffffffffffffffff000000000000000000000000602082019260601b168252601481526104d7603482610afd565b805160021015611282576060610b9e91015161267f565b8054821015611282575f5260205f2001905f90565b919067ffffffffffffffff80612116855467ffffffffffffffff1690565b9216911614908115916121b7575b506121b1576002019081548151036121b1575f5b81518110156121a95761216e61214e82856120e3565b905473ffffffffffffffffffffffffffffffffffffffff9160031b1c1690565b73ffffffffffffffffffffffffffffffffffffffff61219361185e61184485876114cb565b9116036121a257600101612138565b5050505f90565b505050600190565b50505f90565b9050600182015414155f612124565b805f525f60205260ff6121fa8360405f209073ffffffffffffffffffffffffffffffffffffffff165f5260205260405f2090565b54166121b157805f525f6020526122328260405f209073ffffffffffffffffffffffffffffffffffffffff165f5260205260405f2090565b60017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0082541617905573ffffffffffffffffffffffffffffffffffffffff339216907f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d5f80a4600190565b805f525f60205260ff6122d18360405f209073ffffffffffffffffffffffffffffffffffffffff165f5260205260405f2090565b5416156121b157805f525f60205261230a8260405f209073ffffffffffffffffffffffffffffffffffffffff165f5260205260405f2090565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00815416905573ffffffffffffffffffffffffffffffffffffffff339216907ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b5f80a4600190565b60208151910120604051602081019182527f1260944489272988d9df285149b5aa1b0f48f2136d6f416159f840a3e07476006040820152604081526123b8606082610afd565b51902090565b604051906123cd602083610afd565b5f808352366020840137565b906123e382610b31565b6123f06040519182610afd565b828152601f1961151e8294610b31565b61162b612442919493946124146020610b31565b956124226040519788610afd565b602087526124306020610b31565b601f1960208901910136823752612545565b9061244d8451610ce1565b918451151580612525575b6124619061256b565b61247361246e5f85611fd2565b6123d9565b925f19015f5b81811061248d575050610b9e939450612a78565b8061250f600f6124d2612509611d0d611ce78d6124ac60029960011c90565b908d6125038a6124fb8a6124d26124c9611d0d611ce78a8a612818565b60041c600f1690565b1660f81b7fff000000000000000000000000000000000000000000000000000000000000001690565b5f1a92612818565b53612818565b60ff1690565b5f1a61251e6001830188612818565b5301612479565b506001612458565b6040519061253a82610ae1565b5f6020838281520152565b61254d61252d565b5060208151916040519261256084610ae1565b835201602082015290565b1561019557565b805180151590816125a8575b50156101955761258d90612d4e565b9051906020811061259c575090565b6020036101000a900490565b6021915011155f61257e565b6125bd81612d7a565b15610195576125cb81612d9a565b6125d4816114df565b916125e26040519384610afd565b818352601f196125f1836114df565b015f5b818110612668575050602061261491015161260e81612dfb565b90610cd4565b5f905b8282106126245750505090565b61266081612633600193612e66565b9061263c610b20565b82815281602082015261264f86896114cb565b5261265a85886114cb565b50610cd4565b910190612617565b60209061267361252d565b828288010152016125f4565b6021815103610195576020015160018101809111610c97575190565b805115610195576126ae610b9e91612d4e565b6126ba819392936123d9565b928360200190612f2f565b805191908290602001825e015f815290565b610b2f906126f96126f3949360405195869360208501906126c5565b906126c5565b03601f198101845283610afd565b6001907fff00000000000000000000000000000000000000000000000000000000000000610b9e949316815201906126c5565b916001610b9e94937fff000000000000000000000000000000000000000000000000000000000000006126f39416815201906126c5565b6127796123be565b905f915b81518310156127a55761279d60019161279685856114cb565b51906126d7565b92019161277d565b9150508051603881106127e45750610b9e6127c08251612fce565b916104c96127d4611e436125098651610caa565b916040519485936020850161273a565b6127f6611e43612509610b9e93610c9c565b6104c960405193849260208401612707565b8051604010156112825760600190565b908151811015611282570160200190565b600181511480612876575b610b9e578051603881106128645750610b9e6128508251612fce565b916104c96127d4611e436125098651610cc6565b6127f6611e43612509610b9e93610cb8565b50608060ff61288a611d0d611ce78561149d565b1610612834565b60ff601b9116019060ff8211610c9757565b6004111561029457565b905f5b82548110156121a25773ffffffffffffffffffffffffffffffffffffffff6128d882856120e3565b90549060031b1c1673ffffffffffffffffffffffffffffffffffffffff8316146121a9576001016128b0565b905f5b82518110156121a25773ffffffffffffffffffffffffffffffffffffffff61292f82856114cb565b511673ffffffffffffffffffffffffffffffffffffffff8316146121a957600101612907565b91906129618351610ce1565b908351151580612a6e575b6129759061256b565b61298261246e8284611fd2565b938192600180841614612a0c575b5f19869101935b8481106129a5575050505050565b83612a0360016129f9600f6124d2612509611d0d611ce78b60029b6129f26129e5886124d28f611d0d611ce76129de6124c99360011c90565b8099612818565b9b8d03809c5f1a92612818565b538c612818565b5f1a920189612818565b53018590612997565b92507f0f00000000000000000000000000000000000000000000000000000000000000612a4b612509611d0d611ce7612a458760011c90565b86612818565b60f81b165f1a612a5a8661149d565b535f19612a6683611eac565b939050612990565b508181111561296c565b915f915f612a8461252d565b50845115612d155790935f915b81518310156101955782158080612cff575b61019557159081612ce2575b5061019557612ac161178283836114cb565b948551600281145f14612bbe5750612ae3612ade6116d58861149d565b6130e5565b95612af9612af2888884613152565b8092610cd4565b965111612ba05715612b305750612b109051611f5c565b11610195575111612b27576116d5610b9e91611407565b50610b9e6123be565b919094612b3d8651611f5c565b82146101955780612b5f612b5b612b55600194611407565b51612d7a565b1590565b15612b8157612b70612b7691611407565b516130d7565b915b01919490612a91565b612b8d612b9a91611407565b5160208101519051902090565b91612b78565b505091509250612bb1915051611f5c565b1161019557610b9e6123be565b929491939192601103612c835781518314612c6557612bef612be9612509611d0d611ce78787612818565b93610c89565b92601081101561019557612c0c612c0682896114cb565b516130c1565b15612c2e5750505050612c2191925051611f5c565b0361019557610b9e6123be565b86612c46612b5b612b5584600196989a97999b6114cb565b15612c5857612b9a91612b70916114cb565b612b9a91612b8d916114cb565b505050612c729051611f5c565b03610195576116d5610b9e916114ba565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f696e76616c6964206e6f6465206c656e677468000000000000000000000000006044820152606490fd5b9050612cf7612cf184846114cb565b5161308a565b14155f612aaf565b50612d0d612b8d85856114cb565b871415612aa3565b509050612d4692507f56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b42191501461256b565b610b9e6123be565b906020820191612d5e8351612dfb565b925190838201809211610c975751928303928311610c97579190565b805115612d9557602060c0910151515f1a1061103757600190565b505f90565b805115612d95575f9060208101908151612db381612dfb565b8101809111610c9757915190518101809111610c975791905b828110612dd95750905090565b612de281612e66565b8101809111610c9757612df59091611eac565b90612dcc565b515f1a6080811015612e0c57505f90565b60b881108015612e50575b15612e225750600190565b60c0811015612e4157610b9e90612e3c9060b75b90611fd2565b610c89565b610b9e90612e3c9060f7612e36565b5060c08110158015612e17575060f88110612e17565b80515f1a906080821015612e7b575050600190565b60b8821015612e915750612e3c610b9e91611f97565b60c0821015612ed25760010151602082900360b7016101000a9004017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff4a0190565b60f8821015612ee85750612e3c610b9e91611f6a565b60010151602082900360f7016101000a9004017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0a0190565b601f8111610c97576101000a90565b90918015611ea7575b6020811015612f725780612f4b57505050565b612f5f612f5a612f6492611fc4565b612f20565b611f5c565b905182518216911916179052565b91908051825260208101809111610c97579060208101809111610c975791601f19810190811115612f3857610c5c565b612fac81516123d9565b90815115612fca57806020610b9e9201519051908360200190612f2f565b5090565b5f81805b61303c5750612fe0816123d9565b91815b612fec57505090565b612ff582611f5c565b6130277fff000000000000000000000000000000000000000000000000000000000000008360f81b165f1a9185612818565b5360081c908015610c97575f19019081612fe3565b9061304690611eac565b9060081c80612fd2565b8151919060418303613080576130799250602082015190606060408401519301515f1a906131f6565b9192909190565b50505f9160029190565b805160208110156130a2575060208101519051902090565b90602001512060405160208101918252602081526123b8604082610afd565b6001815103612d955760200151515f1a60801490565b6130e090612d4e565b902090565b9081511561019557600f6131016124c9611d0d611ce78661149d565b16806131145750610b9e60025f93612955565b600181036131295750610b9e60015f93612955565b6002810361313f5750610b9e6002600193612955565b60030361019557610b9e60018093612955565b91905f5b838101808211610c975782518110806131ec575b156131e45761319a7fff000000000000000000000000000000000000000000000000000000000000009184612818565b51167fff000000000000000000000000000000000000000000000000000000000000006131c78386612818565b511690036131dd576131d890611eac565b613156565b9250505090565b509250505090565b508351821061316a565b91907f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08411613285579160209360809260ff5f9560405194855216868401526040830152606082015282805260015afa1561327a575f5173ffffffffffffffffffffffffffffffffffffffff81161561327057905f905f90565b505f906001905f90565b6040513d5f823e3d90fd5b5050505f916003919056fea164736f6c634300081c000a","sourceMap":"242:2275:34:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;;;;-1:-1:-1;;242:2275:34;;;;;;;;;;;;;;;2639:47:93;2654:32;242:2275:34;2639:47:93;;:87;;;;;242:2275:34;;;;;;;;;;2639:87:93;844:25:133;829:40;;;2639:87:93;;;242:2275:34;-1:-1:-1;242:2275:34;;;;;-1:-1:-1;;242:2275:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;5705:2265:35;242:2275:34;;;:::i;:::-;-1:-1:-1;242:2275:34;;;;;;;;;;;;23324:42:35;23320:105;;5705:2265;:::i;:::-;242:2275:34;;;;;;;;;;;;;;;:::i;23320:105:35:-;23393:20;;:::i;:::-;5705:2265;:::i;242:2275:34:-;;;;;;;;;;;:::o;:::-;;;;;-1:-1:-1;;242:2275:34;;;;;;;;;3867:6:93;242:2275:34;3867:6:93;242:2275:34;;3867:22:93;242:2275:34;3867:6:93;242:2275:34;3867:22:93;242:2275:34;3776:120:93;;242:2275:34;;;;;;;;-1:-1:-1;;242:2275:34;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;4296:25:93;242:2275:34;;;:::i;:::-;4266:18:93;2475:4;4266:18;;3867:6;242:2275:34;3867:6:93;242:2275:34;;3867:22:93;242:2275:34;3867:6:93;242:2275:34;3867:22:93;242:2275:34;3776:120:93;;4266:18;2475:4;:::i;:::-;4296:25;:::i;:::-;242:2275:34;;;;;;;;:::i;:::-;735:10:121;242:2275:34;;;5387:34:93;5383:102;;5495:37;;;:::i;5383:102::-;5444:30;;;242:2275:34;5444:30:93;;242:2275:34;;;;;-1:-1:-1;;242:2275:34;;;;;;;;;;;;;;;;-1:-1:-1;;242:2275:34;;;;;;;-1:-1:-1;242:2275:34;;;;;;;;;23324:42:35;23320:105;;242:2275:34;9433:31:35;;:16;;;:31;:::i;:::-;;:::i;:::-;9479:9;;;;9499:1;9479:9;;;;:::i;:::-;:21;;;9475:97;;9641:31;242:2275:34;9787:10:35;9705:36;242:2275:34;9728:12:35;:9;9622:51;9641:31;;9787:95;9641:31;;;:::i;:::-;9622:51;:::i;:::-;9728:9;;;:::i;:::-;:12;;:::i;:::-;242:2275:34;;;:::i;:::-;9705:36:35;:::i;:::-;9787:10;;;:::i;242:2275:34:-;9813:26:35;9499:1;9813:26;;242:2275:34;;;;9851:29:35;;;242:2275:34;9851:29:35;;;;242:2275:34;;;;;;;9851:29:35;;-1:-1:-1;;9851:29:35;;;;;;:::i;:::-;242:2275:34;9841:40:35;;9787:95;;:::i;:::-;242:2275:34;;9892:109:35;;242:2275:34;10010:31:35;242:2275:34;;;;;;;;;;;;10010:31:35;242:2275:34;;;;;;;;;;;;;;;;;9892:109:35;9959:29;:20;9939:51;9959:20;;:::i;:::-;:29;:::i;:::-;9939:51;-1:-1:-1;9939:51:35;242:2275:34;;;;;9939:51:35;-1:-1:-1;9939:51:35;9475:97;9523:38;9544:9;;;;:::i;:::-;9523:38;-1:-1:-1;9523:38:35;9499:1;242:2275:34;;;;-1:-1:-1;242:2275:34;;;23320:105:35;23393:20;;:::i;:::-;23320:105;;242:2275:34;;;;;-1:-1:-1;;242:2275:34;;;;;;;;2089:33:35;242:2275:34;;;;;;;;-1:-1:-1;;242:2275:34;;;;;;;;;;;;;;;;-1:-1:-1;;242:2275:34;;;;;;;-1:-1:-1;242:2275:34;;;;;;;;;23324:42:35;23320:105;;242:2275:34;8205:31:35;;:16;;;:31;:::i;:::-;8251:9;;;;8271:1;8251:9;;;;:::i;:::-;:21;;;8247:97;;8357:10;;;;242:2275:34;8357:10:35;;;;:::i;:::-;:23;;;8353:102;;8524:31;242:2275:34;8737:10:35;8658:33;8669:10;8588:36;242:2275:34;8611:12:35;:9;8505:51;8524:31;;8737:95;8524:31;;;:::i;8505:51::-;8611:9;;;:::i;8588:36::-;8669:10;;;:::i;:::-;8658:33;;;;:::i;:::-;8737:10;;;:::i;242:2275:34:-;8763:26:35;8271:1;8763:26;;242:2275:34;;;;8801:29:35;;;242:2275:34;8801:29:35;;;;242:2275:34;;;;;;;8737:95:35;242:2275:34;;8846:20:35;8842:107;;8989:20;:29;:20;;:::i;:29::-;9033:28;;;;9029:116;;242:2275:34;9154:31:35;242:2275:34;;;;;;;9029:116:35;9084:50;-1:-1:-1;9084:50:35;242:2275:34;;;;;-1:-1:-1;9939:51:35;8842:107;8889:49;;;-1:-1:-1;8889:49:35;242:2275:34;;;;;-1:-1:-1;242:2275:34;;;8353:102:35;8403:41;8426:10;;;;:::i;:::-;8403:41;-1:-1:-1;8403:41:35;242:2275:34;;;;;-1:-1:-1;242:2275:34;;;23320:105:35;23393:20;;:::i;:::-;23320:105;;242:2275:34;;;;;;2920:29:93;242:2275:34;;;:::i;:::-;;2920:6:93;242:2275:34;2920:6:93;242:2275:34;;;2920:6:93;242:2275:34;;;;;;;;;;;;;2920:29:93;242:2275:34;;;;;;;;;;;;;;;-1:-1:-1;;242:2275:34;;;;;;;;;;;;;;;;4713:26:93;242:2275:34;;;:::i;:::-;4683:18:93;2475:4;4683:18;;3867:6;242:2275:34;3867:6:93;242:2275:34;;3867:22:93;242:2275:34;3867:6:93;242:2275:34;3867:22:93;242:2275:34;3776:120:93;;2475:4;4713:26;:::i;242:2275:34:-;;;;;;;:::i;:::-;-1:-1:-1;;23363:1:35;242:2275:34;;;;;;;;;23324:42:35;23320:105;;242:2275:34;10175:25:35;23363:1;10175:25;242:2275:34;23363:1:35;10175:25;23320:105;23393:20;;:::i;:::-;23320:105;;242:2275:34;;;;;;;:::o;:::-;-1:-1:-1;;242:2275:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;-1:-1:-1;;242:2275:34;;;;;5517:34:35;242:2275:34;;;;;:::i;5517:34:35:-;242:2275:34;;;;5633:25:35;5605:26;;;242:2275:34;5633:25:35;;242:2275:34;;;;;;;5568:91:35;242:2275:34;5568:91:35;;242:2275:34;;;;;;;;;;;;;;;;;;;-1:-1:-1;242:2275:34;;-1:-1:-1;242:2275:34;;-1:-1:-1;242:2275:34;;;;;;;5568:91:35;;;;;-1:-1:-1;;5568:91:35;;;;;;:::i;:::-;242:2275:34;;;;;;;:::i;:::-;;;;;;;;;;;;5605:26:35;242:2275:34;;;;;;;;;;;;-1:-1:-1;;242:2275:34;;;;;;;;;5120:11:35;242:2275:34;;5109:23:35;;;242:2275:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5109:23:35;;;;;;:::i;242:2275:34:-;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;:::i;:::-;;;;;;;;;;;;;;;:::o;:::-;;;-1:-1:-1;;242:2275:34;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;:::i;:::-;:::o;:::-;;;;;;;;-1:-1:-1;;242:2275:34;;;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;-1:-1:-1;242:2275:34;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;:::i;:::-;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;-1:-1:-1;;242:2275:34;;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;:::o;:::-;;;;;;;;;;;;2219:66:35;242:2275:34;;;;;;;:::o;:::-;;:::i;:::-;22386:4:35;242:2275:34;;;22386:4:35;242:2275:34;;;:::o;:::-;22540:4:35;242:2275:34;;;22540:4:35;242:2275:34;;;:::o;:::-;21713:4:35;242:2275:34;;;21713:4:35;242:2275:34;;;:::o;:::-;21855:4:35;242:2275:34;;;21855:4:35;242:2275:34;;;:::o;:::-;;;;;;;;;;:::o;:::-;;;;;;;;;8605:1:37;242:2275:34;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;242:2275:34;;;-1:-1:-1;242:2275:34;;;;;;;;;;;;;;;;-1:-1:-1;242:2275:34;;;;;;5705:2265:35;5889:40;5705:2265;5889:40;;;;:::i;:::-;5960:18;;;;:33;242:2275:34;5960:18:35;;242:2275:34;;;;;5960:33:35;6034:28;6047:14;;6034:28;:::i;:::-;6076:13;;;;242:2275:34;;;;;;;;;;;6076:18:35;6072:77;;6180:25;242:2275:34;;;;;;;;6162:43:35;;242:2275:34;;;6162:15:35;:43;:::i;:::-;6208:16;;;;242:2275:34;;;;;;;;;6162:62:35;242:2275:34;;;-1:-1:-1;6158:178:35;;-1:-1:-1;;6412:18:35;5960;6412:33;242:2275:34;;;6393:53:35;;242:2275:34;;9622:51:35;:::i;6393:53::-;242:2275:34;;;;;;;;;6473:31:35;;;:139;;;;5705:2265;6456:298;;;6807:25;;7027:79;6807:25;6863:72;6180:25;6791:62;6807:25;;;:::i;:::-;6834:18;;;;6791:62;;:::i;:::-;6902:32;;6863:72;;:::i;:::-;6976:17;;;;;;;;;:::i;:::-;7088;7070:16;242:2275:34;6180:11:35;242:2275:34;;;;;;7070:16:35;;242:2275:34;7088:17:35;;;7027:79;;:::i;:::-;7165:30;242:2275:34;;;;;;;;;;;;7165:15:35;242:2275:34;;;;;;;7165:30:35;7209:37;242:2275:34;;;;;;;7209:37:35;7205:303;;242:2275:34;;6180:25:35;242:2275:34;;;;7601:46:35;242:2275:34;7561:30:35;242:2275:34;;;;;;;;;7561:30:35;242:2275:34;;;;;;;7601:46:35;242:2275:34;;;;;;;;;;;7601:46:35;6180:11;7657:29;;242:2275:34;7741:17:35;7710:28;;242:2275:34;:::i;:::-;;;;;;;6180:25:35;242:2275:34;7773:55:35;;242:2275:34;;;;;;7773:55:35;242:2275:34;;;7773:55:35;7769:141;;7920:43;5960:33;5705:2265;:::o;7769:141::-;7844:55;;242:2275:34;;6180:25:35;242:2275:34;;;;;;;;6180:25:35;242:2275:34;;7844:55:35;5960:33;5705:2265;:::o;7205:303::-;242:2275:34;;7266:95:35;242:2275:34;;;;;;;7343:17:35;;7266:95;;:::i;:::-;7262:175;;7457:40;242:2275:34;;;;;;;;7457:40:35;5960:33;7457:40;242:2275:34;;7165:15:35;242:2275:34;;;;7262:175:35;6180:25;;-1:-1:-1;7381:41:35:o;6456:298::-;6644:99;242:2275:34;;;;;;;;;6644:99:35;5960:33;6644:99;242:2275:34;;;;6644:99:35;242:2275:34;6162:15:35;242:2275:34;;;;;;;;6473:139:35;6162:15;;6524:69;6162:15;242:2275:34;6524:40:35;242:2275:34;;;;;;;6524:40:35;:69;:::i;:::-;:88;;6473:139;;;6158:178;6247:78;5960:33;6247:78;6162:15;6247:78;242:2275:34;;;;;;;;;;;-1:-1:-1;9939:51:35;6072:77;6117:21;5960:33;6117:21;;5960:33;6117:21;242:2275:34;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;:::i;:::-;;;:::o;:::-;;:::i;3165:103:93:-;735:10:121;2920:6:93;242:2275:34;;;;;;;;;;;;3485:23:93;3481:108;;3165:103::o;3481:108::-;3531:47;2920:6;3531:47;735:10:121;3531:47:93;242:2275:34;2089:33:35;242:2275:34;;;2920:6:93;3531:47;3165:103;242:2275:34;2920:6:93;242:2275:34;2920:6:93;242:2275:34;;;2920:29:93;735:10:121;242:2275:34;2920:6:93;242:2275:34;;;;;;;;;;;;;2920:29:93;242:2275:34;;3485:23:93;3481:108;;3165:103;:::o;3481:108::-;3531:47;2920:6;3531:47;735:10:121;3531:47:93;242:2275:34;;;;2920:6:93;3531:47;19876:177:35;242:2275:34;;19957:19:35;19953:94;;19876:177;:::o;19953:94::-;19999:37;19975:1;19999:37;;242:2275:34;;19975:1:35;19999:37;242:2275:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;242:2275:34;;;;-1:-1:-1;242:2275:34;;;;-1:-1:-1;242:2275:34;;;;;;;;;;;:::o;:::-;;;11070:1:35;242:2275:34;;;;;;;:::o;:::-;;;11239:1:35;242:2275:34;;;;;;;:::o;:::-;;;11378:2:35;242:2275:34;;;;;;;:::o;:::-;;;11564:2:35;242:2275:34;;;;;;;:::o;:::-;;;11607:1:35;242:2275:34;;;;;;;:::o;:::-;;;11837:1:35;242:2275:34;;;;;;;:::o;:::-;;;11910:2:35;242:2275:34;;;;;;;:::o;:::-;;;11978:2:35;242:2275:34;;;;;;;:::o;:::-;;;13209:1:35;242:2275:34;;;;;;;:::o;:::-;;;;;;;;;:::o;:::-;;;2050:1;242:2275;;;;;;;:::o;:::-;;;7571:2:37;242:2275:34;;;;;;;:::o;:::-;;;;;;;;;;;;;;;:::o;2219:66:35:-;;;;;;;;;;;:::o;:::-;;;;;:::i;:::-;242:2275:34;;;;;;:::i;:::-;2219:66:35;;;-1:-1:-1;;2219:66:35;;;;:::i;:::-;;;;;;;;:::o;:::-;;242:2275:34;;;;;2219:66:35;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;242:2275:34;2219:66:35;;;:::o;:::-;242:2275:34;;2219:66:35;;242:2275:34;;2219:66:35;242:2275:34;;:::i;:::-;1856:1;2219:66:35;;;-1:-1:-1;;2219:66:35;;-1:-1:-1;2219:66:35;;;;;;;;;:::o;:::-;;242:2275:34;2219:66:35;;;;;;;;;;;;;;;:::i;:::-;242:2275:34;;;;;;:::i;:::-;2219:66:35;;;-1:-1:-1;;2219:66:35;;;;:::i;:::-;;;-1:-1:-1;2219:66:35;;;;;;;;;:::o;:::-;;242:2275:34;2219:66:35;;;;;;;;;;10709:2705;10875:30;:21;242:2275:34;;:::i;:::-;10816:28:35;;;;10875:21;:::i;:::-;:30;:::i;:::-;10854:18;;;:51;;;;242:2275:34;10947:2:35;10919:30;;10915:114;;11051:18;2401:66;11051:36;:21;:18;;:21;:::i;:::-;;:36;:::i;:::-;11043:66;11039:168;;11070:1;11220:30;:21;:18;;:21;:::i;:::-;;:30;:::i;:::-;:35;11216:122;;2219:66;11359:37;:22;:18;;:22;:::i;:37::-;11351:67;11347:167;;11545:32;:22;:18;;:22;:::i;:::-;;:32;:::i;:::-;242:2275:34;;11607:1:35;11591:17;;;;;:73;;;10709:2705;11587:130;;;11750:18;12025:21;11959:32;:22;11750:18;11727:54;11743:38;11750:30;:21;12025:30;11750:18;;:21;:::i;11743:38::-;242:2275:34;;11727:13:35;;;2219:66;;11727:54;11818:36;:21;:18;;:21;:::i;:36::-;11791:16;;;2219:66;11865:58;11884:39;11891:31;:22;:18;;:22;:::i;11884:39::-;242:2275:34;;11865:16:35;;;2219:66;;11865:58;11959:18;:22;:::i;:32::-;12025:21;:::i;:30::-;12001:21;;;;:54;;;;242:2275:34;12101:1:35;12069:33;;12065:123;;12242:21;:33;:24;:21;;:24;:::i;:::-;;:33;:::i;:::-;242:2275:34;;;12289:26:35;12285:83;;12398:36;242:2275:34;;12398:36:35;:::i;:::-;12378:17;;;;:56;;;-1:-1:-1;12491:3:35;242:2275:34;;12464:25:35;;;;;12540:27;:17;;;;:::i;:27::-;242:2275:34;;12610:2:35;12585:27;;12581:125;;12748:23;;12740:32;12748:23;;:::i;:::-;2219:66;;;;12740:32;242:2275:34;;;12790:23:35;;12786:103;;-1:-1:-1;12922:5:35;;;;;;13095:17;;;:32;11070:1;13095:17;:32;:17;;;:32;:::i;:::-;2219:66;242:2275:34;;2219:66:35;;;13095:32;2219:66;12449:13;;12929:3;12956:17;:33;:20;;:17;;;:20;:::i;:::-;242:2275:34;;;;;12956:20:35;242:2275:34;;;;12956:33:35;;12952:116;;11070:1;2219:66;12907:13;;12952:116;13020:29;-1:-1:-1;13020:29:35;242:2275:34;;;12840:34:35;242:2275:34;2219:66:35;-1:-1:-1;9939:51:35;12786:103;12840:34;-1:-1:-1;12840:34:35;242:2275:34;;;12840:34:35;242:2275:34;2219:66:35;-1:-1:-1;9939:51:35;12581:125;12639:52;-1:-1:-1;12639:52:35;242:2275:34;;;-1:-1:-1;9939:51:35;12464:25;;;13187:24;12464:25;;;13187:33;12464:25;;13187:21;:24;:::i;:33::-;13251:29;242:2275:34;;13251:29:35;:::i;:::-;13230:18;;;;:50;;;-1:-1:-1;13332:3:35;242:2275:34;;13310:20:35;;;;;13375:12;13351:46;13375:12;:22;:12;11070:1;13375:12;;;:::i;:22::-;13351:18;;:46;;;;;:::i;:::-;;;:::i;:::-;;2219:66;13295:13;;13310:20;;;;;10709:2705::o;12285:83::-;12338:19;-1:-1:-1;12338:19:35;;-1:-1:-1;12338:19:35;12065:123;12125:52;-1:-1:-1;12125:52:35;242:2275:34;;;-1:-1:-1;9939:51:35;11587:130;11687:19;242:2275:34;;;11687:19:35;;;;;;;;;;:::i;:::-;;;;11591:73;11632:32;242:2275:34;;10854:18:35;242:2275:34;;11612:16:35;:52;;11591:73;;;11347:167;11464:37;:22;11441:62;11464:18;;:22;:::i;:37::-;11441:62;-1:-1:-1;11441:62:35;242:2275:34;;;;;11216:122:35;11296:30;:21;11278:49;11296:18;;:21;:::i;:30::-;11278:49;-1:-1:-1;11278:49:35;242:2275:34;;;;;11039:168:35;11158:36;:21;11132:64;11158:18;;:21;:::i;:36::-;11132:64;-1:-1:-1;11132:64:35;242:2275:34;;;;;10915:114:35;10972:46;10816:16;10972:46;242:2275:34;;;-1:-1:-1;9939:51:35;19455:292;242:2275:34;;;;-1:-1:-1;242:2275:34;19595:15:35;242:2275:34;;;-1:-1:-1;242:2275:34;;;;;;19640:29:35;19636:105;;19455:292;:::o;19636:105::-;19692:38;-1:-1:-1;19692:38:35;19595:15;242:2275:34;;-1:-1:-1;19692:38:35;1710:805:34;2238:18;2161:26;1844:14;;:::i;:::-;21300:17:35;2093:24:34;1898:21;;;21300:17:35;1898:24:34;:21;;:24;:::i;:::-;;21300:17:35;:::i;:::-;1868:55:34;;;:::i;:::-;;;;;:::i;:::-;;21300:17:35;1963:24:34;:21;;:24;:::i;21300:17:35:-;1933:55:34;;;:::i;:::-;;;;;:::i;:::-;;21300:17:35;2028:24:34;:21;;:24;:::i;21300:17:35:-;1998:55:34;;;:::i;:::-;;;;;:::i;:::-;;2093:21;:24;:::i;21300:17:35:-;2063:55:34;;;:::i;:::-;;;;;:::i;:::-;;2161:26;:::i;:::-;2238:18;;;2226:38;2238:18;;242:2275;2226:38;:::i;:::-;2279:13;1920:1;2325:3;2298:18;;242:2275;;2294:29;;;;;2361:82;;1985:1;2361:82;2366:2;2361:7;;:82;2366:2;;;2371:33;;;;;:::i;:::-;2344:99;;;;:::i;:::-;;;;;;:::i;:::-;;2219:66:35;2279:13:34;;2361:82;21300:17:35;2421:21:34;;;;:::i;21300:17:35:-;2361:82:34;;2294:29;;;;2480:27;2294:29;;2480:27;:::i;:::-;2238:18;242:2275;;;;2470:38;1710:805;:::o;14731:509:35:-;;;;14863:27;242:2275:34;;14863:27:35;:::i;:::-;14905:13;14917:1;14938:3;242:2275:34;;14920:16:35;;;;;14997:8;;;;:::i;:::-;;242:2275:34;;15558:2:35;15543:17;;15539:95;;15653:8;;15665:2;242:2275:34;15647:15:35;15653:8;;15808:30;15653:8;;:::i;:::-;242:2275:34;;;;;15653:8:35;242:2275:34;;;;15647:15:35;242:2275:34;15647:20:35;15643:90;;14938:3;15808:30;;:::i;:::-;242:2275:34;;;;:::i;:::-;15852:33:35;;;;:64;;;14938:3;15852:88;;;;;14938:3;15848:145;;242:2275:34;;;14917:1:35;15040:5;;;;;;15204:19;;;;2219:66;15204:19;;;;;:::i;:::-;2219:66;14905:13;;15047:3;15074:10;:20;:10;;;;;:::i;:20::-;;15070:107;;2219:66;;15025:13;;15070:107;15125:33;14917:1;15125:33;242:2275:34;;;12840:34:35;242:2275:34;2219:66:35;-1:-1:-1;9939:51:35;15848:145;15963:19;14917:1;15963:19;;14917:1;15963:19;15852:88;242:2275:34;;;;15920:20:35;15852:88;;:64;15889:27;;;;15852:64;;;15643:90;15694:28;15701:20;:15;15707:8;;;;:::i;15701:15::-;:20;:::i;:::-;242:2275:34;;;;;;15694:28:35;14917:1;15683:39;;;;:::i;:::-;;15643:90;;15539:95;15583:40;14917:1;15583:40;242:2275:34;;;-1:-1:-1;9939:51:35;14920:16;;;;14731:509::o;242:2275:34:-;-1:-1:-1;;242:2275:34;;;;;;;:::o;16229:544:35:-;;16414:1;16430:13;16414:1;16465:3;242:2275:34;;16445:18:35;;;;;16488:47;242:2275:34;16524:10:35;;;;:::i;:::-;242:2275:34;;16488:47:35;;:::i;:::-;16484:94;;16465:3;2219:66;;16430:13;;16484:94;16555:8;;2219:66;16555:8;;:::i;:::-;16484:94;;;;;16445:18;;;16644:1;16617:32;16445:18;242:2275:34;;16617:32:35;:::i;:::-;16663:17;;;;16659:108;;16229:544;;:::o;16659:108::-;16703:53;16414:1;16703:53;242:2275:34;;;;;16414:1:35;16703:53;242:2275:34;;-1:-1:-1;;242:2275:34;;;;;;;:::o;:::-;;;;;;;;;;:::o;:::-;;;;;;;;;;:::o;:::-;;;;;;;;;:::o;:::-;;;;;;;;;;:::o;16996:549:35:-;;17123:1;17139:13;17123:1;17174:3;242:2275:34;;17154:18:35;;;;;17197:39;242:2275:34;17225:10:35;;;;:::i;:::-;242:2275:34;;17197:39:35;;:::i;:::-;17193:86;;17174:3;2219:66;;17139:13;;17193:86;17256:8;;2219:66;17256:8;;:::i;:::-;17193:86;;;;;17154:18;;;242:2275:34;;17428:1:35;242:2275:34;;;;;;;;;17443:17:35;;;17439:100;;16996:549;;:::o;17439:100::-;17483:45;17123:1;17483:45;242:2275:34;;;;;17123:1:35;17483:45;13709:440;14055:31;13709:440;14055:22;13709:440;13927:76;13709:440;242:2275:34;;;13976:25:35;;;242:2275:34;;;;;;13976:25:35;;;;;;;:::i;14055:31::-;242:2275:34;;14124:1:35;242:2275:34;;;;;14111:30:35;242:2275:34;;14111:15:35;:30;:::i;242:2275:34:-;;;;;;;;-1:-1:-1;242:2275:34;;-1:-1:-1;242:2275:34;;;-1:-1:-1;242:2275:34;:::o;18568:677:35:-;;;242:2275:34;;;;;;;;;;;;;;18815:37:35;;;;:82;;;18568:677;18811:125;;;18949:25;;242:2275:34;;;;;18949:53:35;18945:96;;242:2275:34;19093:3:35;242:2275:34;;19070:21:35;;;;;242:2275:34;19116:28:35;;;;:::i;:::-;242:2275:34;;;;;;;;;;;;19116:45:35;19148:13;;;;;:::i;19116:45::-;242:2275:34;;19116:45:35;19112:96;;2219:66;;19055:13;;19112:96;19181:12;;;242:2275:34;19181:12:35;:::o;19070:21::-;;;;2219:66;18568:677;:::o;18945:96::-;19018:12;;242:2275:34;19018:12:35;:::o;18815:82::-;18856:26;;;;;242:2275:34;18856:41:35;;18815:82;;;6145:316:93;242:2275:34;;;;;;;2920:29:93;242:2275:34;;;;;;;;;;;;;;;;2920:29:93;242:2275:34;;;;;;;;;;6281:29:93;242:2275:34;;;;;;;;;;;;;;;;6281:29:93;6313:4;242:2275:34;;;;;;;;735:10:121;242:2275:34;;6336:40:93;;242:2275:34;6336:40:93;;6313:4;6390:11;:::o;6698:317::-;242:2275:34;;;;;;;2920:29:93;242:2275:34;;;;;;;;;;;;;;;;2920:29:93;242:2275:34;;;;;;;;;;;6834:29:93;242:2275:34;;;;;;;;;;;;;;;;6834:29:93;242:2275:34;;;;;;;735:10:121;242:2275:34;;6890:40:93;;242:2275:34;6890:40:93;;242:2275:34;6944:11:93;:::o;14333:174:35:-;242:2275:34;;;;;14457:18:35;242:2275:34;;;14446:53:35;;242:2275:34;;;2612:66:35;242:2275:34;;;;;14446:53:35;;;;;;:::i;:::-;242:2275:34;14436:64:35;;14333:174;:::o;242:2275:34:-;;;;;;;;:::i;:::-;22179:1:35;242:2275:34;;;2219:66:35;242:2275:34;;;2219:66:35;242:2275:34:o;:::-;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;-1:-1:-1;;242:2275:34;;;;:::i;1287:390:37:-;1607:20;:29;1287:390;;;;242:2275:34;1508:2:37;242:2275:34;:::i;:::-;;;;;;;;:::i;:::-;1508:2:37;242:2275:34;;;1508:2:37;242:2275:34;:::i;:::-;-1:-1:-1;;1508:2:37;242:2275:34;;;;2219:66:35;;;1521:63:37;1607:20;:::i;:29::-;1648:21;8593:13;242:2275:34;;8593:13:37;:::i;:::-;242:2275:34;;;8624:13:37;;:33;;;1287:390;8616:42;;;:::i;:::-;8679:26;8689:15;-1:-1:-1;8689:15:37;;:::i;:::-;8679:26;:::i;:::-;8715:18;-1:-1:-1;;242:2275:34;1667:1:37;8901:14;;;;;;1600:70;;;;;;;:::i;8917:6::-;8982:5;9046:37;8998:3;9054:21;:16;9060:9;;8982:5;;8605:1;8982:5;242:2275:34;;;;8982:5:37;8979:9;;8943:59;8979:9;8965:37;8979:9;8973:21;:16;8979:9;;;;;:::i;8973:16::-;242:2275:34;;;;;;8973:21:37;8972:29;242:2275:34;;;;;;8965:37:37;1667:1;8943:59;;;:::i;:::-;;9060:9;:::i;9054:16::-;242:2275:34;;;;9046:37:37;1667:1;9020:63;;8756:1;242:2275:34;;9020:63:37;;:::i;:::-;;242:2275:34;8894:204:37;;8624:33;-1:-1:-1;8641:16:37;8624:33;;242:2275:34;;;;;;;:::i;:::-;-1:-1:-1;242:2275:34;;;;;;;:::o;2457:221:38:-;242:2275:34;;:::i;:::-;;2568:58:38;242:2275:34;;;;;;;;;:::i;:::-;2219:66:35;;2568:58:38;;2643:28;;2219:66:35;2457:221:38;:::o;242:2275:34:-;;;;:::o;7796:439:38:-;242:2275:34;;7883:12:38;;;:30;;;;7796:439;242:2275:34;;;;7957:21:38;;;:::i;:::-;7989:14;8013:192;;;;;;;8215:13;7796:439;:::o;8013:192::-;;;;;;;7796:439;:::o;7883:30::-;7911:2;7899:14;;;;7883:30;;;4170:519;4266:12;;;:::i;:::-;242:2275:34;;;4306:14:38;;;:::i;:::-;2219:66:35;;;:::i;:::-;242:2275:34;;;;;;;:::i;:::-;2219:66:35;;;-1:-1:-1;;242:2275:34;;;:::i;:::-;;-1:-1:-1;242:2275:34;;;;;;4404:11:38;;242:2275:34;4404:41:38;:11;;242:2275:34;4418:27:38;;;:::i;:::-;4404:41;;:::i;:::-;-1:-1:-1;4480:179:38;4500:9;;;;;;4669:13;;;4170:519;:::o;4511:3::-;4632:16;4540:19;;2219:66:35;4540:19:38;;:::i;:::-;242:2275:34;;;:::i;:::-;2219:66:35;;;4585:24:38;242:2275:34;4585:24:38;;2219:66:35;4573:36:38;;;;:::i;:::-;;;;;;:::i;:::-;;4632:16;:::i;:::-;4511:3;2219:66:35;4485:13:38;;;242:2275:34;;;;;:::i;:::-;;;;;;;;;;8413:298:38;8545:2;242:2275:34;;8533:14:38;242:2275:34;;8600:11:38;;242:2275:34;8614:1:38;242:2275:34;;;;;;;8625:56:38;8413:298;:::o;8857:379::-;242:2275:34;;8950:12:38;242:2275:34;;9006:21:38;9202:3;9006:21;;:::i;:::-;9059:14;;;;;;:::i;:::-;9109:61;;;;9202:3;;:::i;242:2275:34:-;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;:::i;:::-;;;:::i;:::-;;-1:-1:-1;;242:2275:34;;;;;;:::i;:::-;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;22053:538:35:-;22169:12;;:::i;:::-;22196:13;22179:1;22191:109;22229:3;242:2275:34;;22211:16:35;;;;;22258:31;2219:66;22280:8;;;;;:::i;:::-;;22258:31;;:::i;:::-;22229:3;2219:66;22196:13;;;22211:16;;;;242:2275:34;;22331:2:35;22314:19;;22310:120;;242:2275:34;22510:74:35;22464:29;242:2275:34;;22464:29:35;:::i;:::-;242:2275:34;22510:74:35;22527:37;22534:29;22540:22;242:2275:34;;22540:22:35;:::i;22527:37::-;242:2275:34;;;22510:74:35;;;;;;;:::i;22310:120::-;22373:36;22380:28;22386:21;22356:63;22386:21;;:::i;22373:36::-;22356:63;242:2275:34;;22356:63:35;;;;;;;:::i;242:2275:34:-;;;15658:2:35;242:2275:34;;;;;;;:::o;:::-;;;;;;;;;;;;;:::o;21462:440:35:-;21570:1;242:2275:34;;21556:15:35;:39;;;21462:440;21552:80;;242:2275:34;;21658:2:35;21645:15;;21641:108;;242:2275:34;21825:70:35;21783:25;242:2275:34;;21783:25:35;:::i;:::-;242:2275:34;21825:70:35;21842:37;21849:29;21855:22;242:2275:34;;21855:22:35;:::i;21641:108::-;21700:32;21707:24;21713:17;21683:55;21713:17;;:::i;21556:39::-;21581:6;21591:4;242:2275:34;21575:13:35;21581:6;;;;:::i;21575:13::-;242:2275:34;21575:20:35;21556:39;;242:2275:34;;;;;;;;;;;;:::o;:::-;;-1:-1:-1;242:2275:34;;;:::o;20273:284:35:-;;242:2275:34;20427:3:35;242:2275:34;;20404:21:35;;;;;242:2275:34;20450:13:35;;;;:::i;:::-;242:2275:34;;;;;;;;;;20450:23:35;20446:73;;2219:66;;20389:13;;20775:282;;242:2275:34;20927:3:35;242:2275:34;;20904:21:35;;;;;242:2275:34;20950:13:35;;;;:::i;:::-;242:2275:34;;;;;20950:23:35;20946:73;;2219:66;;20889:13;;8465:649:37;;;8593:13;242:2275:34;;8593:13:37;:::i;:::-;242:2275:34;;;8624:13:37;;:33;;;8465:649;8616:42;;;:::i;:::-;8679:26;8689:15;;;;:::i;8679:26::-;8715:18;;8747:10;8756:1;8747:10;;;:15;8743:118;;8465:649;-1:-1:-1;;242:2275:34;;;8894:204:37;8901:14;;;;;;8465:649;;;;;:::o;8917:6::-;8982:5;9020:63;8756:1;9046:37;8998:3;9054:21;:16;9060:9;;8982:5;8605:1;8982:5;8943:59;8965:37;8982:5;8973:21;8982:5;8979:9;;8982:5;8973:16;8982:5;242:2275:34;;;;8982:5:37;8979:9;;;:::i;8965:37::-;242:2275:34;;;8943:59:37;;8636:1;8943:59;;;:::i;:::-;;9060:9;;:::i;9046:37::-;8636:1;9020:63;242:2275:34;;9020:63:37;;:::i;:::-;;242:2275:34;8894:204:37;;;;8743:118;8808:10;;242:2275:34;8799:26:37;:21;8805:14;;8808:10;;242:2275:34;;;;8808:10:37;8805:14;;:::i;8799:26::-;242:2275:34;;;8636:1:37;8778:55;;;;:::i;:::-;;-1:-1:-1;;8847:3:37;;;:::i;:::-;8743:118;;;;;8624:33;-1:-1:-1;8641:16:37;;;;8624:33;;2316:5431;;2546:1;2557:33;2546:1;242:2275:34;;:::i;:::-;;;;2689:17:37;2685:223;;2976:13;;2546:1;2971:4724;3009:3;242:2275:34;;2991:16:37;;;;;3091:6;;;;:50;;3009:3;3087:97;;3298:6;:47;;;;3009:3;3294:94;;;3514:17;:8;;;;:::i;:17::-;242:2275:34;;;3565:1:37;3550:16;;3546:4139;3565:1;;;3744:7;3716:46;3744:17;:7;;;:::i;:17::-;3716:46;:::i;:::-;3804:56;3878:28;3804:56;;;;;:::i;:::-;3878:28;;;:::i;:::-;242:2275:34;;-1:-1:-1;3925:994:37;;4937:1185;;;242:2275:34;5015:16:37;242:2275:34;;5015:16:37;:::i;:::-;-1:-1:-1;5007:144:37;;242:2275:34;-1:-1:-1;5173:109:37;;5315:7;5351:18;5315:7;;:::i;5173:109::-;5247:12;;;:::i;4937:1185::-;242:2275:34;;;5494:16:37;242:2275:34;;5494:16:37;:::i;:::-;5489:21;;5485:138;;5650:7;5649:17;5650:16;:7;2219:66:35;5650:7:37;;:::i;:::-;;:16;:::i;:::-;5649:17;;242:2275:34;5649:17:37;5650:7;;;5837;:26;:7;;:::i;:::-;;:26;:::i;:::-;5645:459;;2219:66:35;2976:13:37;;;;;5645:459;6054:7;:27;:7;;:::i;:::-;;5445:11:38;;;242:2275:34;;;5522:62:38;;5341:272;;6054:27:37;5645:459;;;3925:994;242:2275:34;;;;;;4718:16:37;242:2275:34;;;4718:16:37;:::i;:::-;-1:-1:-1;4710:149:37;;4888:12;;:::i;3546:4139::-;6146:17;;;;;;6161:2;6146:17;6161:2;;242:2275:34;;6219:36:37;;6235:20;;6451:17;6386:43;6394:34;6400:27;;;;;:::i;6386:43::-;6451:17;;:::i;:::-;6494:12;6504:2;6494:12;;;6490:146;;6662:33;6682:12;;;;:::i;:::-;;6662:33;:::i;:::-;6682:12;;;242:2275:34;;;;6766:16:37;242:2275:34;;;;6766:16:37;:::i;:::-;6761:21;6757:157;;6947:12;;:::i;6658:555::-;6993:12;6992:22;6993:21;:12;;2219:66:35;6993:12:37;;;;;;;:::i;6992:22::-;6993:12;;;7057:31;:12;;;;:::i;6988:225::-;7158:32;:12;;;;:::i;6215:1388::-;242:2275:34;;;7411:16:37;242:2275:34;;7411:16:37;:::i;:::-;7406:21;7402:135;;7566:8;:18;:8;;:::i;6142:1543::-;242:2275:34;;7641:29:37;;;242:2275:34;7641:29:37;;;242:2275:34;;;;;;;;;;;;;11687:19:35;3298:47:37;3336:8;;3324:21;3336:8;;;;:::i;:::-;;3324:21;:::i;:::-;3308:37;;3298:47;;;3091:50;3113:8;:28;:8;;;;:::i;:28::-;3101:40;;;3091:50;;2685:223;2785:78;;;2777:87;2785:78;;2797:66;2785:78;;;2777:87;:::i;:::-;2885:12;;:::i;3469:281:38:-;;3598:11;;;242:2275:34;3583:27:38;242:2275:34;;3583:27:38;:::i;:::-;242:2275:34;;;;;;;;;;;;;;;;;;;;3723:20:38;3469:281;:::o;4838:321::-;242:2275:34;;4918:13:38;4914:31;;4994:11;868:4;4994:11;;242:2275:34;5015:64:38;242:2275:34;5015:64:38;5093:24;5089:42;;5148:4;4838:321;:::o;4914:31::-;4933:12;242:2275:34;4933:12:38;:::o;9434:424::-;242:2275:34;;9518:13:38;9514:27;;242:2275:34;9597:11:38;;;;242:2275:34;;;9611:27:38;;;:::i;:::-;242:2275:34;;;;;;;;;;;;;;;;;;9697:132:38;;9704:16;;;;;;9839:12;;;9434:424;:::o;9697:132::-;9756:20;;;:::i;:::-;242:2275:34;;;;;;;9811:7:38;9736:40;9811:7;;:::i;:::-;9697:132;;;11485:581;11589:64;242:2275:34;11589:64:38;682:4;11667:26;;682:4;;;11709:8;242:2275:34;11709:8:38;:::o;11663:397::-;776:4;11738:25;;:83;;;;11663:397;11734:326;;;11837:8;11844:1;11837:8;:::o;11734:326::-;868:4;11866:24;;868:4;;;11943:35;;:31;;958:4;11943:31;;;:::i;:::-;:35;:::i;11862:198::-;12016:33;;:29;;958:4;12016:29;242:2275:34;11738:83:38;11768:25;868:4;11768:25;;;:52;;11738:83;11768:52;11797:23;958:4;11797:23;;11738:83;;10045:1263;10171:64;;-1:-1:-1;10171:64:38;;682:4;10249:26;;682:4;;;10291:11;;10301:1;10045:1263;:::o;10245:1032::-;776:4;10323:25;;776:4;;;10374:26;;:30;:26;;:::i;10319:958::-;868:4;10425:24;;868:4;;;10465:385;;;;;;;;;;;;;;;;242:2275:34;:::o;10421:856:38:-;958:4;10870:23;;958:4;;;10919:24;;:28;:24;;:::i;10866:411::-;10978:289;;;;;;;;;;;;;;;;242:2275:34;:::o;1035:2:38:-;;;;;;;;;:::o;12279:770::-;;;12360:8;;12356:21;;12441:16;1035:2;12441:16;;;;;12642:7;12638:405;;12279:770;;;:::o;12638:405::-;12764:24;12772:15;12764:28;12772:15;;:::i;:::-;12764:24;:::i;:::-;:28;:::i;:::-;12806:227;;;;;;;;;;;;12279:770::o;12459:16::-;12491:65;;;;;;1035:2;242:2275:34;;;;;;;12600:17:38;1035:2;242:2275:34;;;;;;;12459:16:38;-1:-1:-1;;242:2275:34;;;;;;12434:194:38;242:2275:34;;:::i;6262:337:38:-;6372:19;242:2275:34;;6372:19:38;:::i;:::-;242:2275:34;;;6405:18:38;6401:37;;6542:11;6470:57;6560:8;6542:11;;242:2275:34;;;6470:57:38;;;;6560:8;;:::i;6401:37::-;6425:13;;:::o;22754:430:35:-;-1:-1:-1;22839:19:35;;22899:8;;;22994:17;;;;:::i;:::-;23021:11;23042:116;23067:5;;;23167:10;;22754:430;:::o;23074:3::-;23097:5;;;:::i;:::-;23093:31;242:2275:34;;;;;-1:-1:-1;23093:31:35;;;;:::i;:::-;;242:2275:34;;23074:3:35;242:2275:34;;;;-1:-1:-1;;242:2275:34;23047:18:35;;;;22892:73;22923:8;;;;:::i;:::-;242:2275:34;22953:1:35;242:2275:34;22892:73:35;;;2419:778:131;242:2275:34;;;2419:778:131;2609:2;2589:22;;2609:2;;3041:25;2825:196;;;;;;;;;;;;;;;-1:-1:-1;2825:196:131;3041:25;;:::i;:::-;3034:32;;;;;:::o;2585:606::-;3097:83;;3113:1;3097:83;3117:35;3097:83;;:::o;10983:270:37:-;242:2275:34;;11094:2:37;11082:14;;11094:2;;;5445:11:38;11094:2:37;5445:11:38;;242:2275:34;;;5522:62:38;;11112:32:37;:::o;11078:169::-;5445:11:38;11094:2:37;5445:11:38;242:2275:34;5522:62:38;242:2275:34;;11094:2:37;11192:43;;242:2275:34;;;11094:2:37;11192:43;;;242:2275:34;11192:43:37;;:::i;7932:335::-;8047:1;242:2275:34;;8035:13:37;8031:56;;8130:11;;242:2275:34;8151:60:37;242:2275:34;8151:60:37;8232:4;8227:9;;7932:335::o;5788:270:38:-;5909:21;5788:270;5909:21;:::i;:::-;5964:65;;5788:270;:::o;9355:729:37:-;;242:2275:34;;9485:13:37;242:2275:34;;9551:3:37;9531:17;:12;9537:5;;;;:::i;9531:17::-;:23;9596:16;;;9628:10;10051:25;9637:1;242:2275:34;9592:434:37;10051:25;:::i;9592:434::-;9702:1;9687:16;;9702:1;;9719:10;10051:25;9702:1;242:2275:34;9683:343:37;10051:25;:::i;9683:343::-;9793:1;9778:16;;9793:1;;9810:10;10051:25;9793:1;9702;9774:252;10051:25;:::i;9774:252::-;9883:1;9868:16;9883:1;;10051:25;9702:1;9924:13;9864:162;10051:25;:::i;10366:320::-;;;242:2275:34;10561:3:37;242:2275:34;;;;;;;;;;10518:24:37;;:41;;;10561:3;10518:41;;;10584:16;242:2275:34;;10584:16:37;;:::i;:::-;242:2275:34;;;10604:5:37;;;;:::i;:::-;242:2275:34;;10584:25:37;;10580:72;;10561:3;;;:::i;:::-;10511:151;;10580:72;10629:8;;;;;:::o;10518:41::-;;;;;;10366:320;:::o;10518:41::-;242:2275:34;;;10546:13:37;;10518:41;;7129:1551:131;;;8209:66;8196:79;;8192:164;;242:2275:34;;;;;;-1:-1:-1;242:2275:34;;;;;;;;;;;;;;;;;;;8467:24:131;;;;;;;;;-1:-1:-1;8467:24:131;242:2275:34;;;8505:20:131;8501:113;;8624:49;-1:-1:-1;8624:49:131;-1:-1:-1;7129:1551:131;:::o;8501:113::-;8541:62;-1:-1:-1;8541:62:131;8467:24;8541:62;-1:-1:-1;8541:62:131;:::o;8467:24::-;242:2275:34;;;;;;;;;8192:164:131;8291:54;;;8307:1;8291:54;8311:30;8291:54;;:::o","linkReferences":{}},"methodIdentifiers":{"DEFAULT_ADMIN_ROLE()":"a217fddf","PROOF_SUBMITTER_ROLE()":"5972185a","getClientState()":"ef913a4b","getConsensusState(uint64)":"edce8bdc","getRoleAdmin(bytes32)":"248a9ca3","grantRole(bytes32,address)":"2f2ff15d","hasRole(bytes32,address)":"91d14854","misbehaviour(bytes)":"ddba6537","renounceRole(bytes32,address)":"36568abe","revokeRole(bytes32,address)":"d547741f","supportsInterface(bytes4)":"01ffc9a7","updateClient(bytes)":"0bece356","verifyMembership((bytes,(uint64,uint64),bytes[],bytes))":"682ed5f0","verifyNonMembership((bytes,(uint64,uint64),bytes[]))":"4d6d9ffb"},"rawMetadata":"{\"compiler\":{\"version\":\"0.8.28+commit.7893614a\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"ibcRouter\",\"type\":\"address\"},{\"internalType\":\"uint64\",\"name\":\"initialTrustedHeight\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"initialTrustedTimestamp\",\"type\":\"uint64\"},{\"internalType\":\"bytes32\",\"name\":\"initialTrustedStorageRoot\",\"type\":\"bytes32\"},{\"internalType\":\"address[]\",\"name\":\"initialTrustedValidators\",\"type\":\"address[]\"},{\"internalType\":\"uint64\",\"name\":\"trustingPeriod\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"maxClockDrift\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"roleManager\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"AccessControlBadConfirmation\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"internalType\":\"bytes32\",\"name\":\"neededRole\",\"type\":\"bytes32\"}],\"name\":\"AccessControlUnauthorizedAccount\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"revisionHeight\",\"type\":\"uint64\"}],\"name\":\"ConflictingConsensusState\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"trustedTimestamp\",\"type\":\"uint64\"},{\"internalType\":\"uint256\",\"name\":\"currentTimestamp\",\"type\":\"uint256\"},{\"internalType\":\"uint64\",\"name\":\"trustingPeriod\",\"type\":\"uint64\"}],\"name\":\"ConsensusStateExpired\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"revisionHeight\",\"type\":\"uint64\"}],\"name\":\"ConsensusStateNotFound\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"signer\",\"type\":\"address\"}],\"name\":\"DuplicateCommitSealSigner\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"validator\",\"type\":\"address\"}],\"name\":\"DuplicateValidator\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"EmptyValidatorSet\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"currentTimestamp\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"headerTimestamp\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxClockDrift\",\"type\":\"uint256\"}],\"name\":\"HeaderFromFuture\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"actual\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"required\",\"type\":\"uint256\"}],\"name\":\"InsufficientTrustedValidatorOverlap\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"actual\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"required\",\"type\":\"uint256\"}],\"name\":\"InsufficientValidatorQuorum\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidCommitSeal\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"expectedValue\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"actualValue\",\"type\":\"bytes32\"}],\"name\":\"InvalidCommitmentValue\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"actualDifficulty\",\"type\":\"uint256\"}],\"name\":\"InvalidDifficulty\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"length\",\"type\":\"uint256\"}],\"name\":\"InvalidECDSASignatureLength\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"itemsLength\",\"type\":\"uint256\"}],\"name\":\"InvalidExtraDataFormat\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"itemsLength\",\"type\":\"uint256\"}],\"name\":\"InvalidHeaderFormat\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidHeaderHeight\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidHeaderTimestamp\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"actualMixHash\",\"type\":\"bytes32\"}],\"name\":\"InvalidMixHash\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"actualNonce\",\"type\":\"bytes\"}],\"name\":\"InvalidNonce\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"actualOmmersHash\",\"type\":\"bytes32\"}],\"name\":\"InvalidOmmersHash\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"expectedLength\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"actualLength\",\"type\":\"uint256\"}],\"name\":\"InvalidPathLength\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"providedRevisionNumber\",\"type\":\"uint64\"}],\"name\":\"InvalidRevisionNumber\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"validator\",\"type\":\"address\"}],\"name\":\"InvalidValidatorAddress\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"length\",\"type\":\"uint256\"}],\"name\":\"InvalidValidatorAddressLength\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"expectedLength\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"actualLength\",\"type\":\"uint256\"}],\"name\":\"InvalidValueLength\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"UnsupportedMisbehaviour\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"actualValue\",\"type\":\"bytes32\"}],\"name\":\"ValueExists\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"previousAdminRole\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"newAdminRole\",\"type\":\"bytes32\"}],\"name\":\"RoleAdminChanged\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"RoleGranted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"RoleRevoked\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"DEFAULT_ADMIN_ROLE\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"PROOF_SUBMITTER_ROLE\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getClientState\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"revisionHeight\",\"type\":\"uint64\"}],\"name\":\"getConsensusState\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"}],\"name\":\"getRoleAdmin\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"grantRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"hasRole\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"name\":\"misbehaviour\",\"outputs\":[],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"callerConfirmation\",\"type\":\"address\"}],\"name\":\"renounceRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"revokeRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes4\",\"name\":\"interfaceId\",\"type\":\"bytes4\"}],\"name\":\"supportsInterface\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"updateMsg\",\"type\":\"bytes\"}],\"name\":\"updateClient\",\"outputs\":[{\"internalType\":\"enum ILightClientMsgs.UpdateResult\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes\",\"name\":\"proof\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"uint64\",\"name\":\"revisionNumber\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"revisionHeight\",\"type\":\"uint64\"}],\"internalType\":\"struct IICS02ClientMsgs.Height\",\"name\":\"proofHeight\",\"type\":\"tuple\"},{\"internalType\":\"bytes[]\",\"name\":\"path\",\"type\":\"bytes[]\"},{\"internalType\":\"bytes\",\"name\":\"value\",\"type\":\"bytes\"}],\"internalType\":\"struct ILightClientMsgs.MsgVerifyMembership\",\"name\":\"msg_\",\"type\":\"tuple\"}],\"name\":\"verifyMembership\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes\",\"name\":\"proof\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"uint64\",\"name\":\"revisionNumber\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"revisionHeight\",\"type\":\"uint64\"}],\"internalType\":\"struct IICS02ClientMsgs.Height\",\"name\":\"proofHeight\",\"type\":\"tuple\"},{\"internalType\":\"bytes[]\",\"name\":\"path\",\"type\":\"bytes[]\"}],\"internalType\":\"struct ILightClientMsgs.MsgVerifyNonMembership\",\"name\":\"msg_\",\"type\":\"tuple\"}],\"name\":\"verifyNonMembership\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"errors\":{\"AccessControlBadConfirmation()\":[{\"details\":\"The caller of a function is not the expected one. NOTE: Don't confuse with {AccessControlUnauthorizedAccount}.\"}],\"AccessControlUnauthorizedAccount(address,bytes32)\":[{\"details\":\"The `account` is missing a role.\"}],\"ConflictingConsensusState(uint64)\":[{\"params\":{\"revisionHeight\":\"The conflicting revision height.\"}}],\"ConsensusStateExpired(uint64,uint256,uint64)\":[{\"params\":{\"currentTimestamp\":\"The current block timestamp.\",\"trustedTimestamp\":\"Timestamp of the trusted consensus state.\",\"trustingPeriod\":\"The configured trusting period.\"}}],\"ConsensusStateNotFound(uint64)\":[{\"params\":{\"revisionHeight\":\"The requested revision height.\"}}],\"DuplicateCommitSealSigner(address)\":[{\"params\":{\"signer\":\"The duplicate signer address.\"}}],\"DuplicateValidator(address)\":[{\"params\":{\"validator\":\"The duplicate validator address.\"}}],\"HeaderFromFuture(uint256,uint256,uint256)\":[{\"params\":{\"currentTimestamp\":\"The current block timestamp.\",\"headerTimestamp\":\"The submitted header timestamp.\",\"maxClockDrift\":\"The configured maximum clock drift.\"}}],\"InsufficientTrustedValidatorOverlap(uint256,uint256)\":[{\"params\":{\"actual\":\"The number of trusted validators that signed.\",\"required\":\"The minimum required trusted signer count.\"}}],\"InsufficientValidatorQuorum(uint256,uint256)\":[{\"params\":{\"actual\":\"The number of new validators that signed.\",\"required\":\"The minimum required signer count.\"}}],\"InvalidCommitmentValue(bytes32,bytes32)\":[{\"params\":{\"actualValue\":\"The proven commitment value.\",\"expectedValue\":\"The expected commitment value.\"}}],\"InvalidDifficulty(uint256)\":[{\"params\":{\"actualDifficulty\":\"The difficulty found in the header.\"}}],\"InvalidECDSASignatureLength(uint256)\":[{\"params\":{\"length\":\"The invalid signature length.\"}}],\"InvalidExtraDataFormat(uint256)\":[{\"params\":{\"itemsLength\":\"The decoded `extraData` item count.\"}}],\"InvalidHeaderFormat(uint256)\":[{\"params\":{\"itemsLength\":\"The decoded header item count.\"}}],\"InvalidMixHash(bytes32)\":[{\"params\":{\"actualMixHash\":\"The mix hash found in the header.\"}}],\"InvalidNonce(bytes)\":[{\"params\":{\"actualNonce\":\"The nonce found in the header.\"}}],\"InvalidOmmersHash(bytes32)\":[{\"params\":{\"actualOmmersHash\":\"The ommers hash found in the header.\"}}],\"InvalidPathLength(uint256,uint256)\":[{\"params\":{\"actualLength\":\"The actual path length.\",\"expectedLength\":\"The expected path length.\"}}],\"InvalidRevisionNumber(uint64)\":[{\"params\":{\"providedRevisionNumber\":\"The non-zero revision number.\"}}],\"InvalidValidatorAddress(address)\":[{\"params\":{\"validator\":\"The invalid validator address.\"}}],\"InvalidValidatorAddressLength(uint256)\":[{\"params\":{\"length\":\"The decoded validator address length.\"}}],\"InvalidValueLength(uint256,uint256)\":[{\"params\":{\"actualLength\":\"The actual value length.\",\"expectedLength\":\"The expected value length.\"}}],\"ValueExists(bytes32)\":[{\"params\":{\"actualValue\":\"The value found at the proven storage slot.\"}}]},\"events\":{\"RoleAdminChanged(bytes32,bytes32,bytes32)\":{\"details\":\"Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite {RoleAdminChanged} not being emitted to signal this.\"},\"RoleGranted(bytes32,address,address)\":{\"details\":\"Emitted when `account` is granted `role`. `sender` is the account that originated the contract call. This account bears the admin role (for the granted role). Expected in cases where the role was granted using the internal {AccessControl-_grantRole}.\"},\"RoleRevoked(bytes32,address,address)\":{\"details\":\"Emitted when `account` is revoked `role`. `sender` is the account that originated the contract call: - if using `revokeRole`, it is the admin role bearer - if using `renounceRole`, it is the role bearer (i.e. `account`)\"}},\"kind\":\"dev\",\"methods\":{\"constructor\":{\"params\":{\"ibcRouter\":\"Counterparty ICS26 router address whose storage is proven.\",\"initialTrustedHeight\":\"Initial trusted Besu height.\",\"initialTrustedStorageRoot\":\"Initial trusted storage root of `ibcRouter`.\",\"initialTrustedTimestamp\":\"Initial trusted header timestamp in seconds.\",\"initialTrustedValidators\":\"Initial trusted validator set.\",\"maxClockDrift\":\"Maximum allowed future drift in seconds for submitted headers.\",\"roleManager\":\"Address that administers proof submission; if zero, proof submission is open.\",\"trustingPeriod\":\"Maximum age in seconds for trusted consensus states.\"}},\"getClientState()\":{\"returns\":{\"_0\":\"The client state.\"}},\"getConsensusState(uint64)\":{\"params\":{\"revisionHeight\":\"The revision height to query.\"},\"returns\":{\"_0\":\"The ABI-encoded consensus state.\"}},\"getRoleAdmin(bytes32)\":{\"details\":\"Returns the admin role that controls `role`. See {grantRole} and {revokeRole}. To change a role's admin, use {_setRoleAdmin}.\"},\"grantRole(bytes32,address)\":{\"details\":\"Grants `role` to `account`. If `account` had not been already granted `role`, emits a {RoleGranted} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleGranted} event.\"},\"hasRole(bytes32,address)\":{\"details\":\"Returns `true` if `account` has been granted `role`.\"},\"misbehaviour(bytes)\":{\"params\":{\"misbehaviourMsg\":\"The misbehaviour message\"}},\"renounceRole(bytes32,address)\":{\"details\":\"Revokes `role` from the calling account. Roles are often managed via {grantRole} and {revokeRole}: this function's purpose is to provide a mechanism for accounts to lose their privileges if they are compromised (such as when a trusted device is misplaced). If the calling account had been revoked `role`, emits a {RoleRevoked} event. Requirements: - the caller must be `callerConfirmation`. May emit a {RoleRevoked} event.\"},\"revokeRole(bytes32,address)\":{\"details\":\"Revokes `role` from `account`. If `account` had been granted `role`, emits a {RoleRevoked} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleRevoked} event.\"},\"supportsInterface(bytes4)\":{\"details\":\"Returns true if this contract implements the interface defined by `interfaceId`. See the corresponding https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[ERC section] to learn more about how these ids are created. This function call must use less than 30 000 gas.\"},\"updateClient(bytes)\":{\"params\":{\"updateMsg\":\"The encoded update message e.g., an SP1 proof.\"},\"returns\":{\"_0\":\"The result of the update operation\"}},\"verifyMembership((bytes,(uint64,uint64),bytes[],bytes))\":{\"details\":\"Notice that this message is not view, as it may update the client state for caching purposes.\",\"params\":{\"msg_\":\"The membership message\"},\"returns\":{\"_0\":\"The unix timestamp of the verification height in the counterparty chain in seconds.\"}},\"verifyNonMembership((bytes,(uint64,uint64),bytes[]))\":{\"details\":\"Notice that this message is not view, as it may update the client state for caching purposes.\",\"params\":{\"msg_\":\"The membership message\"},\"returns\":{\"_0\":\"The unix timestamp of the verification height in the counterparty chain in seconds.\"}}},\"title\":\"Besu IBFT2 Light Client\",\"version\":1},\"userdoc\":{\"errors\":{\"ConflictingConsensusState(uint64)\":[{\"notice\":\"A different consensus state already exists at the submitted height.\"}],\"ConsensusStateExpired(uint64,uint256,uint64)\":[{\"notice\":\"The trusted consensus state is outside the trusting period.\"}],\"ConsensusStateNotFound(uint64)\":[{\"notice\":\"No consensus state exists for the requested height.\"}],\"DuplicateCommitSealSigner(address)\":[{\"notice\":\"A commit seal signer appears more than once.\"}],\"DuplicateValidator(address)\":[{\"notice\":\"A validator appears more than once.\"}],\"EmptyValidatorSet()\":[{\"notice\":\"The validator set is empty.\"}],\"HeaderFromFuture(uint256,uint256,uint256)\":[{\"notice\":\"The submitted header timestamp is too far in the future.\"}],\"InsufficientTrustedValidatorOverlap(uint256,uint256)\":[{\"notice\":\"The submitted signers do not overlap enough with the trusted validator set.\"}],\"InsufficientValidatorQuorum(uint256,uint256)\":[{\"notice\":\"The submitted signers do not meet quorum for the new validator set.\"}],\"InvalidCommitSeal()\":[{\"notice\":\"A commit seal did not recover a valid signer.\"}],\"InvalidCommitmentValue(bytes32,bytes32)\":[{\"notice\":\"A proven commitment value does not match the expected value.\"}],\"InvalidDifficulty(uint256)\":[{\"notice\":\"The Besu BFT difficulty is invalid.\"}],\"InvalidECDSASignatureLength(uint256)\":[{\"notice\":\"An ECDSA signature has an invalid length.\"}],\"InvalidExtraDataFormat(uint256)\":[{\"notice\":\"The submitted `extraData` field has an invalid RLP item count.\"}],\"InvalidHeaderFormat(uint256)\":[{\"notice\":\"The submitted header has an invalid RLP item count.\"}],\"InvalidHeaderHeight()\":[{\"notice\":\"The submitted header height is zero.\"}],\"InvalidHeaderTimestamp()\":[{\"notice\":\"The submitted header timestamp is zero.\"}],\"InvalidMixHash(bytes32)\":[{\"notice\":\"The Besu BFT mix hash is invalid.\"}],\"InvalidNonce(bytes)\":[{\"notice\":\"The Besu BFT nonce is invalid.\"}],\"InvalidOmmersHash(bytes32)\":[{\"notice\":\"The ommers hash is invalid.\"}],\"InvalidPathLength(uint256,uint256)\":[{\"notice\":\"A proof path has an invalid length.\"}],\"InvalidRevisionNumber(uint64)\":[{\"notice\":\"The revision number must be zero for Besu light client heights.\"}],\"InvalidValidatorAddress(address)\":[{\"notice\":\"A validator address is invalid.\"}],\"InvalidValidatorAddressLength(uint256)\":[{\"notice\":\"A validator address has an invalid byte length.\"}],\"InvalidValueLength(uint256,uint256)\":[{\"notice\":\"A membership value has an invalid length.\"}],\"UnsupportedMisbehaviour()\":[{\"notice\":\"Misbehaviour handling is not supported by this client.\"}],\"ValueExists(bytes32)\":[{\"notice\":\"A non-membership proof found an existing value.\"}]},\"kind\":\"user\",\"methods\":{\"PROOF_SUBMITTER_ROLE()\":{\"notice\":\"Role allowed to submit client updates and proof verifications.\"},\"constructor\":{\"notice\":\"Creates a Besu IBFT2 light client from an initial trusted consensus state.\"},\"getClientState()\":{\"notice\":\"Returns the client state.\"},\"getConsensusState(uint64)\":{\"notice\":\"Returns the encoded consensus state for a revision height.\"},\"misbehaviour(bytes)\":{\"notice\":\"Misbehaviour handling, moves the light client to the frozen state if misbehaviour is detected\"},\"updateClient(bytes)\":{\"notice\":\"Updating the client and consensus state\"},\"verifyMembership((bytes,(uint64,uint64),bytes[],bytes))\":{\"notice\":\"Querying the membership of a key-value pair\"},\"verifyNonMembership((bytes,(uint64,uint64),bytes[]))\":{\"notice\":\"Querying the non-membership of a key\"}},\"notice\":\"Verifies Besu IBFT 2.0 headers and ICS26 router storage proofs.\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/light-clients/besu/BesuIBFT2LightClient.sol\":\"BesuIBFT2LightClient\"},\"evmVersion\":\"cancun\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"none\"},\"optimizer\":{\"enabled\":true,\"runs\":10000},\"remappings\":[\":@openzeppelin-contracts/=node_modules/@openzeppelin/contracts/\",\":@openzeppelin-upgradeable/=node_modules/@openzeppelin/contracts-upgradeable/\",\":@openzeppelin/=node_modules/@openzeppelin/\",\":@sp1-contracts/=node_modules/sp1-contracts/contracts/src/\",\":@uniswap/permit2/=node_modules/@uniswap/permit2/\",\":forge-std/=node_modules/forge-std/src/\",\":sp1-contracts/=node_modules/sp1-contracts/\"],\"viaIR\":true},\"sources\":{\"contracts/interfaces/ILightClient.sol\":{\"keccak256\":\"0x3b2361546ee834a442d844c979fbad3458ee13146b093f585587a09e19a266af\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://5b5d53101bb598f14a79cb1092479736fa18e8f84945ea6ef80f4dac84466042\",\"dweb:/ipfs/QmaTCo6M3Z9aYCSX65AQtixo1sB4ymQUDAgTXSKHqJHGDh\"]},\"contracts/light-clients/besu/BesuIBFT2LightClient.sol\":{\"keccak256\":\"0xc8536dfc90aa5a55d128e40d6d9715a9fbd55cef5353001da2e773cc9810160e\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://8790efb3e5909701669411298cdc72cc4e8ccdb8fcb6797e1d50e218e76a625d\",\"dweb:/ipfs/QmNiFBhRfaHHG3Tj3R8Y1nvojGs3sVCdL5ANBSgKfVj9Fz\"]},\"contracts/light-clients/besu/BesuLightClientBase.sol\":{\"keccak256\":\"0x0e2957f1e184e52c1f007f7bbbe5279fe46aa54e02b7fea9ad96c06639fc704d\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://cfa0d54ac2be000860a378a9119f70d72615e7627c80862033684e2f90d32e15\",\"dweb:/ipfs/QmefzqCmWMghrgTQRoGkM7DSRZ3E8dUDFBCrHUhphPJCwB\"]},\"contracts/light-clients/besu/MPTProof.sol\":{\"keccak256\":\"0x9ab26e6445b20541e8725b190006444d3b16eb3e021174e280451f934d9535c6\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://b6f3fd58b06b942a454bb9b21e9be40a2dab8a09f78e75ff4357c8afbc7e2d5b\",\"dweb:/ipfs/QmPeUwNScDiU91Xx4UQduYjyCPALYLPq73ZUMEn8Nr1rTG\"]},\"contracts/light-clients/besu/RLPReader.sol\":{\"keccak256\":\"0xa64ad17e6da7fed2bd206df52189286694339a8061dc5d158e717eda982af1d9\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://7020db2fe854e90e1b791e0e587610fc26bed3073ba1811faa275a1d8bf3c2c7\",\"dweb:/ipfs/QmdXdKghNFZSX7N9qD6BsKuJQdrFoqatsVWvHRL7vJCmeP\"]},\"contracts/light-clients/besu/errors/IBesuLightClientErrors.sol\":{\"keccak256\":\"0x66eff5c2f400de52896b24768de7a157eae68ca951aca2b0c271b8e03015986b\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://3a13f7651324fab436f31dcaa25cea7d4c0cd432ddecd6e17b6876b1c80c6408\",\"dweb:/ipfs/QmQHcMexxFzKcgfbE5rcFKq31PYBprppUEsy76dU8MRPvN\"]},\"contracts/light-clients/besu/msgs/IBesuLightClientMsgs.sol\":{\"keccak256\":\"0x3fc43a3daaae2f89dca4cadbc99ea71086282f987b47a95c13489ae3384532cf\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://36083aa6833eb30d26023f7dc0b2e22b7d0723d922fcd50cf86999edc9aeb474\",\"dweb:/ipfs/QmbPv9KJj5AuJkgppuyuoaTHtiw91Qkx1tdkf1R5D4wad2\"]},\"contracts/msgs/IICS02ClientMsgs.sol\":{\"keccak256\":\"0x03d1265eae327c3744d774bf22a30d845233d50664921c9aa57cef2d71fd89d2\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://89900781cc5c60540a237d92d42745ea6165765ee8fb4d50e8137a717195cc75\",\"dweb:/ipfs/Qmbx5p8gZ8sEMMeZytXsLee49JUayhAaoJ2yxX93WUrvQo\"]},\"contracts/msgs/ILightClientMsgs.sol\":{\"keccak256\":\"0x8d1e56ab166a7b4aa6999708e3214a4645ebbc3835c2b2a4c255c9923eebafde\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://8bd4200dc04d950c0f050623fa9a8accdbec877fd446c039d4dd6c678bdf1513\",\"dweb:/ipfs/QmZQTViaA7N6BVNDzJ1Z6w799PrPoE4ajPueZSPwX4sGZ9\"]},\"node_modules/@openzeppelin/contracts/access/AccessControl.sol\":{\"keccak256\":\"0x4686ec784d75f95beaf2bf5b5f26e5f946d4c864aaee9c3c62bdc18381f5e017\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://26710ca191913f3c9df542079c4a6dcff02968e92d4f7357daefef9fbe72a19c\",\"dweb:/ipfs/QmanHbeWuBbVEqXySHa1zhm2rExjYpChDBubBaJNTCa2JB\"]},\"node_modules/@openzeppelin/contracts/access/IAccessControl.sol\":{\"keccak256\":\"0xbff9f59c84e5337689161ce7641c0ef8e872d6a7536fbc1f5133f128887aba3c\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://b308f882e796f7b79c9502deacb0a62983035c6f6f4e962b319ba6a1f4a77d3d\",\"dweb:/ipfs/QmaWCW7ahEQqFjwhSUhV7Ae7WhfNvzSpE7DQ58hvEooqPL\"]},\"node_modules/@openzeppelin/contracts/utils/Context.sol\":{\"keccak256\":\"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://6a708e8a5bdb1011c2c381c9a5cfd8a9a956d7d0a9dc1bd8bcdaf52f76ef2f12\",\"dweb:/ipfs/Qmax9WHBnVsZP46ZxEMNRQpLQnrdE4dK8LehML1Py8FowF\"]},\"node_modules/@openzeppelin/contracts/utils/cryptography/ECDSA.sol\":{\"keccak256\":\"0xbeb5cad8aaabe0d35d2ec1a8414d91e81e5a8ca679add4cf57e2f33476861f40\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://ebb272a5ee2da4e8bd5551334e0ce8dce4e9c56a04570d6bf046d260fab3116a\",\"dweb:/ipfs/QmNw6RyM769qcqFocDq6HJMG2WiEnQbvizpRaUXsACHho2\"]},\"node_modules/@openzeppelin/contracts/utils/introspection/ERC165.sol\":{\"keccak256\":\"0x2d9dc2fe26180f74c11c13663647d38e259e45f95eb88f57b61d2160b0109d3e\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://81233d1f98060113d9922180bb0f14f8335856fe9f339134b09335e9f678c377\",\"dweb:/ipfs/QmWh6R35SarhAn4z2wH8SU456jJSYL2FgucfTFgbHJJN4E\"]},\"node_modules/@openzeppelin/contracts/utils/introspection/IERC165.sol\":{\"keccak256\":\"0x8891738ffe910f0cf2da09566928589bf5d63f4524dd734fd9cedbac3274dd5c\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://971f954442df5c2ef5b5ebf1eb245d7105d9fbacc7386ee5c796df1d45b21617\",\"dweb:/ipfs/QmadRjHbkicwqwwh61raUEapaVEtaLMcYbQZWs9gUkgj3u\"]}},\"version\":1}","metadata":{"compiler":{"version":"0.8.28+commit.7893614a"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"address","name":"ibcRouter","type":"address"},{"internalType":"uint64","name":"initialTrustedHeight","type":"uint64"},{"internalType":"uint64","name":"initialTrustedTimestamp","type":"uint64"},{"internalType":"bytes32","name":"initialTrustedStorageRoot","type":"bytes32"},{"internalType":"address[]","name":"initialTrustedValidators","type":"address[]"},{"internalType":"uint64","name":"trustingPeriod","type":"uint64"},{"internalType":"uint64","name":"maxClockDrift","type":"uint64"},{"internalType":"address","name":"roleManager","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"type":"error","name":"AccessControlBadConfirmation"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bytes32","name":"neededRole","type":"bytes32"}],"type":"error","name":"AccessControlUnauthorizedAccount"},{"inputs":[{"internalType":"uint64","name":"revisionHeight","type":"uint64"}],"type":"error","name":"ConflictingConsensusState"},{"inputs":[{"internalType":"uint64","name":"trustedTimestamp","type":"uint64"},{"internalType":"uint256","name":"currentTimestamp","type":"uint256"},{"internalType":"uint64","name":"trustingPeriod","type":"uint64"}],"type":"error","name":"ConsensusStateExpired"},{"inputs":[{"internalType":"uint64","name":"revisionHeight","type":"uint64"}],"type":"error","name":"ConsensusStateNotFound"},{"inputs":[{"internalType":"address","name":"signer","type":"address"}],"type":"error","name":"DuplicateCommitSealSigner"},{"inputs":[{"internalType":"address","name":"validator","type":"address"}],"type":"error","name":"DuplicateValidator"},{"inputs":[],"type":"error","name":"EmptyValidatorSet"},{"inputs":[{"internalType":"uint256","name":"currentTimestamp","type":"uint256"},{"internalType":"uint256","name":"headerTimestamp","type":"uint256"},{"internalType":"uint256","name":"maxClockDrift","type":"uint256"}],"type":"error","name":"HeaderFromFuture"},{"inputs":[{"internalType":"uint256","name":"actual","type":"uint256"},{"internalType":"uint256","name":"required","type":"uint256"}],"type":"error","name":"InsufficientTrustedValidatorOverlap"},{"inputs":[{"internalType":"uint256","name":"actual","type":"uint256"},{"internalType":"uint256","name":"required","type":"uint256"}],"type":"error","name":"InsufficientValidatorQuorum"},{"inputs":[],"type":"error","name":"InvalidCommitSeal"},{"inputs":[{"internalType":"bytes32","name":"expectedValue","type":"bytes32"},{"internalType":"bytes32","name":"actualValue","type":"bytes32"}],"type":"error","name":"InvalidCommitmentValue"},{"inputs":[{"internalType":"uint256","name":"actualDifficulty","type":"uint256"}],"type":"error","name":"InvalidDifficulty"},{"inputs":[{"internalType":"uint256","name":"length","type":"uint256"}],"type":"error","name":"InvalidECDSASignatureLength"},{"inputs":[{"internalType":"uint256","name":"itemsLength","type":"uint256"}],"type":"error","name":"InvalidExtraDataFormat"},{"inputs":[{"internalType":"uint256","name":"itemsLength","type":"uint256"}],"type":"error","name":"InvalidHeaderFormat"},{"inputs":[],"type":"error","name":"InvalidHeaderHeight"},{"inputs":[],"type":"error","name":"InvalidHeaderTimestamp"},{"inputs":[{"internalType":"bytes32","name":"actualMixHash","type":"bytes32"}],"type":"error","name":"InvalidMixHash"},{"inputs":[{"internalType":"bytes","name":"actualNonce","type":"bytes"}],"type":"error","name":"InvalidNonce"},{"inputs":[{"internalType":"bytes32","name":"actualOmmersHash","type":"bytes32"}],"type":"error","name":"InvalidOmmersHash"},{"inputs":[{"internalType":"uint256","name":"expectedLength","type":"uint256"},{"internalType":"uint256","name":"actualLength","type":"uint256"}],"type":"error","name":"InvalidPathLength"},{"inputs":[{"internalType":"uint64","name":"providedRevisionNumber","type":"uint64"}],"type":"error","name":"InvalidRevisionNumber"},{"inputs":[{"internalType":"address","name":"validator","type":"address"}],"type":"error","name":"InvalidValidatorAddress"},{"inputs":[{"internalType":"uint256","name":"length","type":"uint256"}],"type":"error","name":"InvalidValidatorAddressLength"},{"inputs":[{"internalType":"uint256","name":"expectedLength","type":"uint256"},{"internalType":"uint256","name":"actualLength","type":"uint256"}],"type":"error","name":"InvalidValueLength"},{"inputs":[],"type":"error","name":"UnsupportedMisbehaviour"},{"inputs":[{"internalType":"bytes32","name":"actualValue","type":"bytes32"}],"type":"error","name":"ValueExists"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32","indexed":true},{"internalType":"bytes32","name":"previousAdminRole","type":"bytes32","indexed":true},{"internalType":"bytes32","name":"newAdminRole","type":"bytes32","indexed":true}],"type":"event","name":"RoleAdminChanged","anonymous":false},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32","indexed":true},{"internalType":"address","name":"account","type":"address","indexed":true},{"internalType":"address","name":"sender","type":"address","indexed":true}],"type":"event","name":"RoleGranted","anonymous":false},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32","indexed":true},{"internalType":"address","name":"account","type":"address","indexed":true},{"internalType":"address","name":"sender","type":"address","indexed":true}],"type":"event","name":"RoleRevoked","anonymous":false},{"inputs":[],"stateMutability":"view","type":"function","name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"PROOF_SUBMITTER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"getClientState","outputs":[{"internalType":"bytes","name":"","type":"bytes"}]},{"inputs":[{"internalType":"uint64","name":"revisionHeight","type":"uint64"}],"stateMutability":"view","type":"function","name":"getConsensusState","outputs":[{"internalType":"bytes","name":"","type":"bytes"}]},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"stateMutability":"view","type":"function","name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}]},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"stateMutability":"nonpayable","type":"function","name":"grantRole"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"stateMutability":"view","type":"function","name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}]},{"inputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function","name":"misbehaviour"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"callerConfirmation","type":"address"}],"stateMutability":"nonpayable","type":"function","name":"renounceRole"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"stateMutability":"nonpayable","type":"function","name":"revokeRole"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"stateMutability":"view","type":"function","name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}]},{"inputs":[{"internalType":"bytes","name":"updateMsg","type":"bytes"}],"stateMutability":"nonpayable","type":"function","name":"updateClient","outputs":[{"internalType":"enum ILightClientMsgs.UpdateResult","name":"","type":"uint8"}]},{"inputs":[{"internalType":"struct ILightClientMsgs.MsgVerifyMembership","name":"msg_","type":"tuple","components":[{"internalType":"bytes","name":"proof","type":"bytes"},{"internalType":"struct IICS02ClientMsgs.Height","name":"proofHeight","type":"tuple","components":[{"internalType":"uint64","name":"revisionNumber","type":"uint64"},{"internalType":"uint64","name":"revisionHeight","type":"uint64"}]},{"internalType":"bytes[]","name":"path","type":"bytes[]"},{"internalType":"bytes","name":"value","type":"bytes"}]}],"stateMutability":"view","type":"function","name":"verifyMembership","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[{"internalType":"struct ILightClientMsgs.MsgVerifyNonMembership","name":"msg_","type":"tuple","components":[{"internalType":"bytes","name":"proof","type":"bytes"},{"internalType":"struct IICS02ClientMsgs.Height","name":"proofHeight","type":"tuple","components":[{"internalType":"uint64","name":"revisionNumber","type":"uint64"},{"internalType":"uint64","name":"revisionHeight","type":"uint64"}]},{"internalType":"bytes[]","name":"path","type":"bytes[]"}]}],"stateMutability":"view","type":"function","name":"verifyNonMembership","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]}],"devdoc":{"kind":"dev","methods":{"constructor":{"params":{"ibcRouter":"Counterparty ICS26 router address whose storage is proven.","initialTrustedHeight":"Initial trusted Besu height.","initialTrustedStorageRoot":"Initial trusted storage root of `ibcRouter`.","initialTrustedTimestamp":"Initial trusted header timestamp in seconds.","initialTrustedValidators":"Initial trusted validator set.","maxClockDrift":"Maximum allowed future drift in seconds for submitted headers.","roleManager":"Address that administers proof submission; if zero, proof submission is open.","trustingPeriod":"Maximum age in seconds for trusted consensus states."}},"getClientState()":{"returns":{"_0":"The client state."}},"getConsensusState(uint64)":{"params":{"revisionHeight":"The revision height to query."},"returns":{"_0":"The ABI-encoded consensus state."}},"getRoleAdmin(bytes32)":{"details":"Returns the admin role that controls `role`. See {grantRole} and {revokeRole}. To change a role's admin, use {_setRoleAdmin}."},"grantRole(bytes32,address)":{"details":"Grants `role` to `account`. If `account` had not been already granted `role`, emits a {RoleGranted} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleGranted} event."},"hasRole(bytes32,address)":{"details":"Returns `true` if `account` has been granted `role`."},"misbehaviour(bytes)":{"params":{"misbehaviourMsg":"The misbehaviour message"}},"renounceRole(bytes32,address)":{"details":"Revokes `role` from the calling account. Roles are often managed via {grantRole} and {revokeRole}: this function's purpose is to provide a mechanism for accounts to lose their privileges if they are compromised (such as when a trusted device is misplaced). If the calling account had been revoked `role`, emits a {RoleRevoked} event. Requirements: - the caller must be `callerConfirmation`. May emit a {RoleRevoked} event."},"revokeRole(bytes32,address)":{"details":"Revokes `role` from `account`. If `account` had been granted `role`, emits a {RoleRevoked} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleRevoked} event."},"supportsInterface(bytes4)":{"details":"Returns true if this contract implements the interface defined by `interfaceId`. See the corresponding https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[ERC section] to learn more about how these ids are created. This function call must use less than 30 000 gas."},"updateClient(bytes)":{"params":{"updateMsg":"The encoded update message e.g., an SP1 proof."},"returns":{"_0":"The result of the update operation"}},"verifyMembership((bytes,(uint64,uint64),bytes[],bytes))":{"details":"Notice that this message is not view, as it may update the client state for caching purposes.","params":{"msg_":"The membership message"},"returns":{"_0":"The unix timestamp of the verification height in the counterparty chain in seconds."}},"verifyNonMembership((bytes,(uint64,uint64),bytes[]))":{"details":"Notice that this message is not view, as it may update the client state for caching purposes.","params":{"msg_":"The membership message"},"returns":{"_0":"The unix timestamp of the verification height in the counterparty chain in seconds."}}},"version":1},"userdoc":{"kind":"user","methods":{"PROOF_SUBMITTER_ROLE()":{"notice":"Role allowed to submit client updates and proof verifications."},"constructor":{"notice":"Creates a Besu IBFT2 light client from an initial trusted consensus state."},"getClientState()":{"notice":"Returns the client state."},"getConsensusState(uint64)":{"notice":"Returns the encoded consensus state for a revision height."},"misbehaviour(bytes)":{"notice":"Misbehaviour handling, moves the light client to the frozen state if misbehaviour is detected"},"updateClient(bytes)":{"notice":"Updating the client and consensus state"},"verifyMembership((bytes,(uint64,uint64),bytes[],bytes))":{"notice":"Querying the membership of a key-value pair"},"verifyNonMembership((bytes,(uint64,uint64),bytes[]))":{"notice":"Querying the non-membership of a key"}},"version":1}},"settings":{"remappings":["@openzeppelin-contracts/=node_modules/@openzeppelin/contracts/","@openzeppelin-upgradeable/=node_modules/@openzeppelin/contracts-upgradeable/","@openzeppelin/=node_modules/@openzeppelin/","@sp1-contracts/=node_modules/sp1-contracts/contracts/src/","@uniswap/permit2/=node_modules/@uniswap/permit2/","forge-std/=node_modules/forge-std/src/","sp1-contracts/=node_modules/sp1-contracts/"],"optimizer":{"enabled":true,"runs":10000},"metadata":{"bytecodeHash":"none"},"compilationTarget":{"contracts/light-clients/besu/BesuIBFT2LightClient.sol":"BesuIBFT2LightClient"},"evmVersion":"cancun","libraries":{},"viaIR":true},"sources":{"contracts/interfaces/ILightClient.sol":{"keccak256":"0x3b2361546ee834a442d844c979fbad3458ee13146b093f585587a09e19a266af","urls":["bzz-raw://5b5d53101bb598f14a79cb1092479736fa18e8f84945ea6ef80f4dac84466042","dweb:/ipfs/QmaTCo6M3Z9aYCSX65AQtixo1sB4ymQUDAgTXSKHqJHGDh"],"license":"Apache-2.0"},"contracts/light-clients/besu/BesuIBFT2LightClient.sol":{"keccak256":"0xc8536dfc90aa5a55d128e40d6d9715a9fbd55cef5353001da2e773cc9810160e","urls":["bzz-raw://8790efb3e5909701669411298cdc72cc4e8ccdb8fcb6797e1d50e218e76a625d","dweb:/ipfs/QmNiFBhRfaHHG3Tj3R8Y1nvojGs3sVCdL5ANBSgKfVj9Fz"],"license":"Apache-2.0"},"contracts/light-clients/besu/BesuLightClientBase.sol":{"keccak256":"0x0e2957f1e184e52c1f007f7bbbe5279fe46aa54e02b7fea9ad96c06639fc704d","urls":["bzz-raw://cfa0d54ac2be000860a378a9119f70d72615e7627c80862033684e2f90d32e15","dweb:/ipfs/QmefzqCmWMghrgTQRoGkM7DSRZ3E8dUDFBCrHUhphPJCwB"],"license":"Apache-2.0"},"contracts/light-clients/besu/MPTProof.sol":{"keccak256":"0x9ab26e6445b20541e8725b190006444d3b16eb3e021174e280451f934d9535c6","urls":["bzz-raw://b6f3fd58b06b942a454bb9b21e9be40a2dab8a09f78e75ff4357c8afbc7e2d5b","dweb:/ipfs/QmPeUwNScDiU91Xx4UQduYjyCPALYLPq73ZUMEn8Nr1rTG"],"license":"Apache-2.0"},"contracts/light-clients/besu/RLPReader.sol":{"keccak256":"0xa64ad17e6da7fed2bd206df52189286694339a8061dc5d158e717eda982af1d9","urls":["bzz-raw://7020db2fe854e90e1b791e0e587610fc26bed3073ba1811faa275a1d8bf3c2c7","dweb:/ipfs/QmdXdKghNFZSX7N9qD6BsKuJQdrFoqatsVWvHRL7vJCmeP"],"license":"Apache-2.0"},"contracts/light-clients/besu/errors/IBesuLightClientErrors.sol":{"keccak256":"0x66eff5c2f400de52896b24768de7a157eae68ca951aca2b0c271b8e03015986b","urls":["bzz-raw://3a13f7651324fab436f31dcaa25cea7d4c0cd432ddecd6e17b6876b1c80c6408","dweb:/ipfs/QmQHcMexxFzKcgfbE5rcFKq31PYBprppUEsy76dU8MRPvN"],"license":"Apache-2.0"},"contracts/light-clients/besu/msgs/IBesuLightClientMsgs.sol":{"keccak256":"0x3fc43a3daaae2f89dca4cadbc99ea71086282f987b47a95c13489ae3384532cf","urls":["bzz-raw://36083aa6833eb30d26023f7dc0b2e22b7d0723d922fcd50cf86999edc9aeb474","dweb:/ipfs/QmbPv9KJj5AuJkgppuyuoaTHtiw91Qkx1tdkf1R5D4wad2"],"license":"Apache-2.0"},"contracts/msgs/IICS02ClientMsgs.sol":{"keccak256":"0x03d1265eae327c3744d774bf22a30d845233d50664921c9aa57cef2d71fd89d2","urls":["bzz-raw://89900781cc5c60540a237d92d42745ea6165765ee8fb4d50e8137a717195cc75","dweb:/ipfs/Qmbx5p8gZ8sEMMeZytXsLee49JUayhAaoJ2yxX93WUrvQo"],"license":"Apache-2.0"},"contracts/msgs/ILightClientMsgs.sol":{"keccak256":"0x8d1e56ab166a7b4aa6999708e3214a4645ebbc3835c2b2a4c255c9923eebafde","urls":["bzz-raw://8bd4200dc04d950c0f050623fa9a8accdbec877fd446c039d4dd6c678bdf1513","dweb:/ipfs/QmZQTViaA7N6BVNDzJ1Z6w799PrPoE4ajPueZSPwX4sGZ9"],"license":"Apache-2.0"},"node_modules/@openzeppelin/contracts/access/AccessControl.sol":{"keccak256":"0x4686ec784d75f95beaf2bf5b5f26e5f946d4c864aaee9c3c62bdc18381f5e017","urls":["bzz-raw://26710ca191913f3c9df542079c4a6dcff02968e92d4f7357daefef9fbe72a19c","dweb:/ipfs/QmanHbeWuBbVEqXySHa1zhm2rExjYpChDBubBaJNTCa2JB"],"license":"MIT"},"node_modules/@openzeppelin/contracts/access/IAccessControl.sol":{"keccak256":"0xbff9f59c84e5337689161ce7641c0ef8e872d6a7536fbc1f5133f128887aba3c","urls":["bzz-raw://b308f882e796f7b79c9502deacb0a62983035c6f6f4e962b319ba6a1f4a77d3d","dweb:/ipfs/QmaWCW7ahEQqFjwhSUhV7Ae7WhfNvzSpE7DQ58hvEooqPL"],"license":"MIT"},"node_modules/@openzeppelin/contracts/utils/Context.sol":{"keccak256":"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2","urls":["bzz-raw://6a708e8a5bdb1011c2c381c9a5cfd8a9a956d7d0a9dc1bd8bcdaf52f76ef2f12","dweb:/ipfs/Qmax9WHBnVsZP46ZxEMNRQpLQnrdE4dK8LehML1Py8FowF"],"license":"MIT"},"node_modules/@openzeppelin/contracts/utils/cryptography/ECDSA.sol":{"keccak256":"0xbeb5cad8aaabe0d35d2ec1a8414d91e81e5a8ca679add4cf57e2f33476861f40","urls":["bzz-raw://ebb272a5ee2da4e8bd5551334e0ce8dce4e9c56a04570d6bf046d260fab3116a","dweb:/ipfs/QmNw6RyM769qcqFocDq6HJMG2WiEnQbvizpRaUXsACHho2"],"license":"MIT"},"node_modules/@openzeppelin/contracts/utils/introspection/ERC165.sol":{"keccak256":"0x2d9dc2fe26180f74c11c13663647d38e259e45f95eb88f57b61d2160b0109d3e","urls":["bzz-raw://81233d1f98060113d9922180bb0f14f8335856fe9f339134b09335e9f678c377","dweb:/ipfs/QmWh6R35SarhAn4z2wH8SU456jJSYL2FgucfTFgbHJJN4E"],"license":"MIT"},"node_modules/@openzeppelin/contracts/utils/introspection/IERC165.sol":{"keccak256":"0x8891738ffe910f0cf2da09566928589bf5d63f4524dd734fd9cedbac3274dd5c","urls":["bzz-raw://971f954442df5c2ef5b5ebf1eb245d7105d9fbacc7386ee5c796df1d45b21617","dweb:/ipfs/QmadRjHbkicwqwwh61raUEapaVEtaLMcYbQZWs9gUkgj3u"],"license":"MIT"}},"version":1},"id":34} \ No newline at end of file +{"abi":[{"type":"constructor","inputs":[{"name":"ibcRouter","type":"address","internalType":"address"},{"name":"initialTrustedHeight","type":"uint64","internalType":"uint64"},{"name":"initialTrustedTimestamp","type":"uint64","internalType":"uint64"},{"name":"initialTrustedStorageRoot","type":"bytes32","internalType":"bytes32"},{"name":"initialTrustedValidators","type":"address[]","internalType":"address[]"},{"name":"trustingPeriod","type":"uint64","internalType":"uint64"},{"name":"maxClockDrift","type":"uint64","internalType":"uint64"},{"name":"roleManager","type":"address","internalType":"address"}],"stateMutability":"nonpayable"},{"type":"function","name":"DEFAULT_ADMIN_ROLE","inputs":[],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"type":"function","name":"PROOF_SUBMITTER_ROLE","inputs":[],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"type":"function","name":"getClientState","inputs":[],"outputs":[{"name":"","type":"bytes","internalType":"bytes"}],"stateMutability":"view"},{"type":"function","name":"getConsensusState","inputs":[{"name":"revisionHeight","type":"uint64","internalType":"uint64"}],"outputs":[{"name":"","type":"bytes","internalType":"bytes"}],"stateMutability":"view"},{"type":"function","name":"getRoleAdmin","inputs":[{"name":"role","type":"bytes32","internalType":"bytes32"}],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"type":"function","name":"grantRole","inputs":[{"name":"role","type":"bytes32","internalType":"bytes32"},{"name":"account","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"hasRole","inputs":[{"name":"role","type":"bytes32","internalType":"bytes32"},{"name":"account","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"misbehaviour","inputs":[{"name":"","type":"bytes","internalType":"bytes"}],"outputs":[],"stateMutability":"view"},{"type":"function","name":"renounceRole","inputs":[{"name":"role","type":"bytes32","internalType":"bytes32"},{"name":"callerConfirmation","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"revokeRole","inputs":[{"name":"role","type":"bytes32","internalType":"bytes32"},{"name":"account","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"supportsInterface","inputs":[{"name":"interfaceId","type":"bytes4","internalType":"bytes4"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"updateClient","inputs":[{"name":"updateMsg","type":"bytes","internalType":"bytes"}],"outputs":[{"name":"","type":"uint8","internalType":"enum ILightClientMsgs.UpdateResult"}],"stateMutability":"nonpayable"},{"type":"function","name":"verifyMembership","inputs":[{"name":"msg_","type":"tuple","internalType":"struct ILightClientMsgs.MsgVerifyMembership","components":[{"name":"proof","type":"bytes","internalType":"bytes"},{"name":"proofHeight","type":"tuple","internalType":"struct IICS02ClientMsgs.Height","components":[{"name":"revisionNumber","type":"uint64","internalType":"uint64"},{"name":"revisionHeight","type":"uint64","internalType":"uint64"}]},{"name":"path","type":"bytes[]","internalType":"bytes[]"},{"name":"value","type":"bytes","internalType":"bytes"}]}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"verifyNonMembership","inputs":[{"name":"msg_","type":"tuple","internalType":"struct ILightClientMsgs.MsgVerifyNonMembership","components":[{"name":"proof","type":"bytes","internalType":"bytes"},{"name":"proofHeight","type":"tuple","internalType":"struct IICS02ClientMsgs.Height","components":[{"name":"revisionNumber","type":"uint64","internalType":"uint64"},{"name":"revisionHeight","type":"uint64","internalType":"uint64"}]},{"name":"path","type":"bytes[]","internalType":"bytes[]"}]}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"event","name":"RoleAdminChanged","inputs":[{"name":"role","type":"bytes32","indexed":true,"internalType":"bytes32"},{"name":"previousAdminRole","type":"bytes32","indexed":true,"internalType":"bytes32"},{"name":"newAdminRole","type":"bytes32","indexed":true,"internalType":"bytes32"}],"anonymous":false},{"type":"event","name":"RoleGranted","inputs":[{"name":"role","type":"bytes32","indexed":true,"internalType":"bytes32"},{"name":"account","type":"address","indexed":true,"internalType":"address"},{"name":"sender","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"type":"event","name":"RoleRevoked","inputs":[{"name":"role","type":"bytes32","indexed":true,"internalType":"bytes32"},{"name":"account","type":"address","indexed":true,"internalType":"address"},{"name":"sender","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"type":"error","name":"AccessControlBadConfirmation","inputs":[]},{"type":"error","name":"AccessControlUnauthorizedAccount","inputs":[{"name":"account","type":"address","internalType":"address"},{"name":"neededRole","type":"bytes32","internalType":"bytes32"}]},{"type":"error","name":"ConflictingConsensusState","inputs":[{"name":"revisionHeight","type":"uint64","internalType":"uint64"}]},{"type":"error","name":"ConsensusStateExpired","inputs":[{"name":"trustedTimestamp","type":"uint64","internalType":"uint64"},{"name":"currentTimestamp","type":"uint256","internalType":"uint256"},{"name":"trustingPeriod","type":"uint64","internalType":"uint64"}]},{"type":"error","name":"ConsensusStateNotFound","inputs":[{"name":"revisionHeight","type":"uint64","internalType":"uint64"}]},{"type":"error","name":"DuplicateCommitSealSigner","inputs":[{"name":"signer","type":"address","internalType":"address"}]},{"type":"error","name":"DuplicateValidator","inputs":[{"name":"validator","type":"address","internalType":"address"}]},{"type":"error","name":"EmptyValidatorSet","inputs":[]},{"type":"error","name":"HeaderFromFuture","inputs":[{"name":"currentTimestamp","type":"uint256","internalType":"uint256"},{"name":"headerTimestamp","type":"uint256","internalType":"uint256"},{"name":"maxClockDrift","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"InsufficientTrustedValidatorOverlap","inputs":[{"name":"actual","type":"uint256","internalType":"uint256"},{"name":"required","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"InsufficientValidatorQuorum","inputs":[{"name":"actual","type":"uint256","internalType":"uint256"},{"name":"required","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"InvalidCommitSeal","inputs":[]},{"type":"error","name":"InvalidCommitmentValue","inputs":[{"name":"expectedValue","type":"bytes32","internalType":"bytes32"},{"name":"actualValue","type":"bytes32","internalType":"bytes32"}]},{"type":"error","name":"InvalidDifficulty","inputs":[{"name":"actualDifficulty","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"InvalidECDSASignatureLength","inputs":[{"name":"length","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"InvalidExtraDataFormat","inputs":[{"name":"itemsLength","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"InvalidHeaderFormat","inputs":[{"name":"itemsLength","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"InvalidHeaderHeight","inputs":[]},{"type":"error","name":"InvalidHeaderTimestamp","inputs":[]},{"type":"error","name":"InvalidMixHash","inputs":[{"name":"actualMixHash","type":"bytes32","internalType":"bytes32"}]},{"type":"error","name":"InvalidNonce","inputs":[{"name":"actualNonce","type":"bytes","internalType":"bytes"}]},{"type":"error","name":"InvalidOmmersHash","inputs":[{"name":"actualOmmersHash","type":"bytes32","internalType":"bytes32"}]},{"type":"error","name":"InvalidPathLength","inputs":[{"name":"expectedLength","type":"uint256","internalType":"uint256"},{"name":"actualLength","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"InvalidRevisionNumber","inputs":[{"name":"providedRevisionNumber","type":"uint64","internalType":"uint64"}]},{"type":"error","name":"InvalidValidatorAddress","inputs":[{"name":"validator","type":"address","internalType":"address"}]},{"type":"error","name":"InvalidValidatorAddressLength","inputs":[{"name":"length","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"InvalidValueLength","inputs":[{"name":"expectedLength","type":"uint256","internalType":"uint256"},{"name":"actualLength","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"UnsupportedMisbehaviour","inputs":[]},{"type":"error","name":"ValueExists","inputs":[{"name":"actualValue","type":"bytes32","internalType":"bytes32"}]}],"bytecode":{"object":"0x6080604052346103d85761390380380380610019816103dc565b928339810190610100818303126103d85761003381610401565b9061004060208201610415565b9061004d60408201610415565b92606082015191608081015160018060401b0381116103d85781019286601f850112156103d8578351966001600160401b03881161037f578760051b9460206100978188016103dc565b809a81520190602082978201019283116103d857602001905b8282106103c0575050506100c660a08301610415565b956100df60e06100d860c08601610415565b9401610401565b956001600160401b03169081156103b1576001600160401b03169283156103a257885115610393575f5b89518110156101bf576001600160a01b03610124828c610429565b511615610198575f5b81811061013d5750600101610109565b6001600160a01b0361014f828d610429565b51166001600160a01b03610163848e610429565b5116146101725760010161012d565b6001600160a01b03610184838d610429565b511663107f863360e21b5f5260045260245ffd5b6001600160a01b03906101ab908b610429565b51166359bff38760e01b5f5260045260245ffd5b5060408051979896978a979181016001600160401b0381118282101761037f576040525f81526020810190848252604051926080840198848a1060018060401b038b111761037f576040998a526001600160a01b031680855260208086018490526001600160401b03928316868c01819052878416606090970196909652600180546001600160a01b031916909217825592516002805495516fffffffffffffffff0000000000000000908d1b81169285166001600160801b03199788161792909217815560038054988d1b90921697909516909517959095179093555f948552600490529590922080546001600160401b031916949094178455830191909155925193910191831161037f5768010000000000000000831161037f578154838355808410610359575b50905f5260205f205f5b83811061033c57846001600160a01b0381166103235750610312610547565b505b60405161329990816105ca8239f35b8061033061033692610451565b506104c7565b50610314565b82516001600160a01b0316818301556020909201916001016102f3565b825f528360205f2091820191015b81811061037457506102e9565b5f8155600101610367565b634e487b7160e01b5f52604160045260245ffd5b63339e1ffb60e01b5f5260045ffd5b63574f4e6160e01b5f5260045ffd5b6359d119e360e01b5f5260045ffd5b602080916103cd84610401565b8152019101906100b0565b5f80fd5b6040519190601f01601f191682016001600160401b0381118382101761037f57604052565b51906001600160a01b03821682036103d857565b51906001600160401b03821682036103d857565b805182101561043d5760209160051b010190565b634e487b7160e01b5f52603260045260245ffd5b6001600160a01b0381165f9081525f5160206138e35f395f51905f52602052604090205460ff166104c2576001600160a01b03165f8181525f5160206138e35f395f51905f5260205260408120805460ff191660011790553391905f5160206138635f395f51905f528180a4600190565b505f90565b6001600160a01b0381165f9081525f5160206138835f395f51905f52602052604090205460ff166104c2576001600160a01b03165f8181525f5160206138835f395f51905f5260205260408120805460ff191660011790553391905f5160206138c35f395f51905f52905f5160206138635f395f51905f529080a4600190565b5f80525f5160206138835f395f51905f526020525f5160206138a35f395f51905f525460ff166105c5575f8080525f5160206138835f395f51905f526020525f5160206138a35f395f51905f52805460ff1916600117905533905f5160206138c35f395f51905f525f5160206138635f395f51905f528280a4600190565b5f9056fe60806040526004361015610011575f80fd5b5f3560e01c806301ffc9a7146100f45780630bece356146100ef578063248a9ca3146100ea5780632f2ff15d146100e557806336568abe146100e05780634d6d9ffb146100db5780635972185a146100d6578063682ed5f0146100d157806391d14854146100cc578063a217fddf146100c7578063d547741f146100c2578063ddba6537146100bd578063edce8bdc146100b85763ef913a4b146100b3575f80fd5b610a16565b61095e565b61088b565b61085c565b610842565b6107f4565b6105e6565b6105ac565b6103ac565b610350565b61031a565b6102b5565b610217565b34610195576020600319360112610195576004357fffffffff00000000000000000000000000000000000000000000000000000000811680910361019557807f7965db0b000000000000000000000000000000000000000000000000000000006020921490811561016b575b506040519015158152f35b7f01ffc9a7000000000000000000000000000000000000000000000000000000009150145f610160565b5f80fd5b9060206003198301126101955760043567ffffffffffffffff811161019557826023820112156101955780600401359267ffffffffffffffff84116101955760248483010111610195576024019190565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b346101955761028161022836610199565b5f80527f4c48d1d2b0f4f7485fc28e3db22341d96a20aa29e6efa8149da9751603abd4e06020527f6e0c24a6e293ff9b755263dbaa15ba3796b0b8d3fe17cfb4ddf8143b268eac475490919060ff161561029957610d65565b6040516003821015610294576020918152f35b6101ea565b6102a1611276565b610d65565b90816020910312610195573590565b346101955760206003193601126101955760206102df6004355f525f602052600160405f20015490565b604051908152f35b6003196040910112610195576004359060243573ffffffffffffffffffffffffffffffffffffffff811681036101955790565b346101955761034e61032b366102e7565b90610349610344825f525f602052600160405f20015490565b6112fe565b6121a1565b005b346101955761035e366102e7565b3373ffffffffffffffffffffffffffffffffffffffff8216036103845761034e91612278565b7f6697b232000000000000000000000000000000000000000000000000000000005f5260045ffd5b346101955760206003193601126101955760043567ffffffffffffffff8111610195578060040160806003198336030112610195575f80527f4c48d1d2b0f4f7485fc28e3db22341d96a20aa29e6efa8149da9751603abd4e060205260ff7f6e0c24a6e293ff9b755263dbaa15ba3796b0b8d3fe17cfb4ddf8143b268eac4754161561059f575b61044761044260248401611181565b61136b565b60648201916001610458848461118b565b90500361056157906104a96104966104a261049d61049661049061048961048460446104e09a01611181565b611b10565b988761118b565b9061125d565b3691610b4d565b61234d565b928061120c565b906001840154906040516104d7816104c960208201948560209181520190565b03601f198101835282610afd565b519020916123db565b805161051f5761051b61050b6104fe845467ffffffffffffffff1690565b67ffffffffffffffff1690565b6040519081529081906020820190565b0390f35b61053361052e61055e92612520565b61254d565b7fd039601e000000000000000000000000000000000000000000000000000000005f52600452602490565b5ffd5b61055e61056e848461118b565b7f88b3170e000000000000000000000000000000000000000000000000000000005f52600160045260245250604490565b6105a7611276565b610433565b34610195575f6003193601126101955760206040517fbd893629a699470e4ec82a5715bb4981fdaacc5d0a728bf5f55b801d8f4ef10b8152f35b346101955760206003193601126101955760043567ffffffffffffffff8111610195578060040160a06003198336030112610195575f80527f4c48d1d2b0f4f7485fc28e3db22341d96a20aa29e6efa8149da9751603abd4e060205260ff7f6e0c24a6e293ff9b755263dbaa15ba3796b0b8d3fe17cfb4ddf8143b268eac475416156107e7575b61067c61044260248401611181565b6064820191600161068d848461118b565b90500361056157608481019060206106a5838561120c565b9050036107a957906106f46104966106ed6106e56106de61049d6104966104906106d761048460446107149c01611181565b9b8b61118b565b948761120c565b8101906102a6565b948061120c565b906001850154906040516104d7816104c960208201948560209181520190565b8051156107755761052e61072791612520565b908082036107475761051b61050b6104fe855467ffffffffffffffff1690565b7f56ed1b63000000000000000000000000000000000000000000000000000000005f5260045260245260445ffd5b61055e827f56ed1b63000000000000000000000000000000000000000000000000000000005f52906044916004525f602452565b61055e6107b6838561120c565b7f24fadac8000000000000000000000000000000000000000000000000000000005f52602060045260245250604490565b6107ef611276565b61066d565b3461019557602060ff610836610809366102e7565b905f525f845260405f209073ffffffffffffffffffffffffffffffffffffffff165f5260205260405f2090565b54166040519015158152f35b34610195575f6003193601126101955760206040515f8152f35b346101955761034e61086d366102e7565b90610886610344825f525f602052600160405f20015490565b612278565b346101955761089936610199565b50505f80527f4c48d1d2b0f4f7485fc28e3db22341d96a20aa29e6efa8149da9751603abd4e06020527f6e0c24a6e293ff9b755263dbaa15ba3796b0b8d3fe17cfb4ddf8143b268eac475460ff1615610915575b7f2c1ed462000000000000000000000000000000000000000000000000000000005f5260045ffd5b61091d611276565b6108ed565b67ffffffffffffffff81160361019557565b601f19601f602060409481855280519182918282880152018686015e5f8582860101520116010190565b346101955760206003193601126101955761097e60043561048481610922565b67ffffffffffffffff8154166002600183015492019060405192608084019160208501526040840152606080840152815480915260a08301915f5260205f20905f5b8181106109ea5761051b856109de818703601f198101835282610afd565b60405191829182610934565b825473ffffffffffffffffffffffffffffffffffffffff168452602090930192600192830192016109c0565b34610195575f6003193601126101955761051b60405173ffffffffffffffffffffffffffffffffffffffff60015416602082015267ffffffffffffffff600254818116604084015260401c16606082015267ffffffffffffffff600354818116608084015260401c1660a082015260a081526109de60c082610afd565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b6060810190811067ffffffffffffffff821117610adc57604052565b610a93565b6040810190811067ffffffffffffffff821117610adc57604052565b90601f601f19910116810190811067ffffffffffffffff821117610adc57604052565b60405190610b2f604083610afd565b565b67ffffffffffffffff8111610adc57601f01601f191660200190565b929192610b5982610b31565b91610b676040519384610afd565b829481845281830111610195578281602093845f960137010152565b9080601f8301121561019557816020610b9e93359101610b4d565b90565b6020818303126101955780359067ffffffffffffffff8211610195570180820391608083126101955760405192610bd784610ac0565b823567ffffffffffffffff811161019557604091610bfa84601f19938701610b83565b8652011261019557604051610c0e81610ae1565b6020830135610c1c81610922565b81526040830135610c2c81610922565b60208201526020840152606082013567ffffffffffffffff811161019557610c549201610b83565b604082015290565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b9060018201809211610c9757565b610c5c565b91908201809211610c9757565b908160011b9180830460021490151715610c9757565b81519167ffffffffffffffff8311610adc57680100000000000000008311610adc578154838355808410610d3f575b506020610d009101915f5260205f2090565b5f5b838110610d0f5750505050565b6001906020610d32855173ffffffffffffffffffffffffffffffffffffffff1690565b9401938184015501610d02565b825f528360205f2091820191015b818110610d5a5750610cee565b5f8155600101610d4d565b610d7191810190610ba1565b906020820191610d8d61044284515167ffffffffffffffff1690565b610d9781516115fc565b92604084019367ffffffffffffffff610db8865167ffffffffffffffff1690565b1615611159576080810192610dd86104fe855167ffffffffffffffff1690565b15611131576003549267ffffffffffffffff604085901c16610dfa8142610c9c565b865167ffffffffffffffff169081116110f25750505160200151610e3990610e2b9067ffffffffffffffff16611b10565b9367ffffffffffffffff1690565b67ffffffffffffffff811680151590816110c9575b50611074575090610ebc91610e7d6002610e75610e6a85611b67565b60c086015190611c7c565b950185611e95565b610e8d60a0830194855190611fba565b60406060610eb060015473ffffffffffffffffffffffffffffffffffffffff1690565b9301519101519161205d565b610ee9610ed1865167ffffffffffffffff1690565b67ffffffffffffffff165f52600460205260405f2090565b610efe6104fe825467ffffffffffffffff1690565b6110025750916002610f7c928694610f6f610f3a610f2b610ed1610f8a9a9b5167ffffffffffffffff1690565b955167ffffffffffffffff1690565b859067ffffffffffffffff167fffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000825416179055565b6001840155519101610cbf565b5167ffffffffffffffff1690565b600254610fa39060401c67ffffffffffffffff166104fe565b67ffffffffffffffff821611610fb857505f90565b610ffe907fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff6fffffffffffffffff00000000000000006002549260401b16911617600255565b5f90565b91611018611020945167ffffffffffffffff1690565b9051926120d3565b61106e5761055e611039835167ffffffffffffffff1690565b7fc1aea5f7000000000000000000000000000000000000000000000000000000005f5267ffffffffffffffff16600452602490565b60029150565b61055e9061108a855467ffffffffffffffff1690565b7feae35725000000000000000000000000000000000000000000000000000000005f5267ffffffffffffffff9081166004524260245216604452606490565b90506110ea42916110e56104fe885467ffffffffffffffff1690565b610c9c565b11155f610e4e565b7f9b772277000000000000000000000000000000000000000000000000000000005f524260045267ffffffffffffffff9081166024521660445260645ffd5b7f574f4e61000000000000000000000000000000000000000000000000000000005f5260045ffd5b7f59d119e3000000000000000000000000000000000000000000000000000000005f5260045ffd5b35610b9e81610922565b9035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe181360301821215610195570180359067ffffffffffffffff821161019557602001918160051b3603831361019557565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b9035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe181360301821215610195570180359067ffffffffffffffff82116101955760200191813603831361019557565b9015611271578061126d9161120c565b9091565b6111df565b335f9081527f4c48d1d2b0f4f7485fc28e3db22341d96a20aa29e6efa8149da9751603abd4e0602052604090205460ff16156112ae57565b7fe2517d3f000000000000000000000000000000000000000000000000000000005f52336004527fbd893629a699470e4ec82a5715bb4981fdaacc5d0a728bf5f55b801d8f4ef10b60245260445ffd5b805f525f60205260ff6113323360405f209073ffffffffffffffffffffffffffffffffffffffff165f5260205260405f2090565b54161561133c5750565b7fe2517d3f000000000000000000000000000000000000000000000000000000005f523360045260245260445ffd5b67ffffffffffffffff168061137d5750565b7f3ce598a9000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b6040519060e0820182811067ffffffffffffffff821117610adc57604052606060c0838281528260208201525f60408201525f838201525f60808201528260a08201520152565b8051600110156112715760400190565b805160071015611271576101000190565b8051600d1015611271576101c00190565b8051600e1015611271576101e00190565b805160081015611271576101200190565b8051600310156112715760800190565b8051600b1015611271576101800190565b8051600c1015611271576101a00190565b8051600410156112715760a00190565b8051156112715760200190565b8051600210156112715760600190565b805160101015611271576102200190565b80518210156112715760209160051b010190565b67ffffffffffffffff8111610adc5760051b60200190565b906114e9826114c7565b6114f66040519182610afd565b828152601f1961150682946114c7565b0190602036910137565b90602082519201517fffffffffffffffffffffffffffffffffffffffff00000000000000000000000081169260148110611548575050565b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000929350829060140360031b1b161690565b60405160a0919061158b8382610afd565b6004815291601f1901825f5b8281106115a357505050565b806060602080938501015201611597565b906115be826114c7565b6115cb6040519182610afd565b828152601f196115db82946114c7565b01905f5b8281106115eb57505050565b8060606020809385010152016115df565b61161561161061160a6113a8565b92612520565b61258f565b80825251600f8110611ae557507f1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d4934761165661165083516113ef565b5161265a565b03611aaa57600161167061166a83516113ff565b5161254d565b03611a6f577f63746963616c2062797a616e74696e65206661756c7420746f6c6572616e63656116a36116508351611410565b03611a34576116bb6116b58251611421565b51612676565b80516008811490811591611a04575b506119ca57506116f46116e36104fe61166a8451611432565b67ffffffffffffffff166040830152565b6117016116508251611443565b606082015261172a6117196104fe61166a8451611453565b67ffffffffffffffff166080830152565b61174261161061173d6116b58451611464565b612520565b906020810191808352516005810361199f575061176861176283516113ef565b5161258f565b908151156119775761177a82516114df565b9360a082019485525f5b83518110156119135761179a6116b582866114b3565b8051601481036118e857506117b16117b791611510565b60601c90565b73ffffffffffffffffffffffffffffffffffffffff811680156118a6575f5b8381106118125750509061180c6001926117f1838a516114b3565b9073ffffffffffffffffffffffffffffffffffffffff169052565b01611784565b8161185761183e611824848d516114b3565b5173ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff1690565b14611864576001016117d6565b7f41fe18cc000000000000000000000000000000000000000000000000000000005f5273ffffffffffffffffffffffffffffffffffffffff831660045260245ffd5b7f59bff387000000000000000000000000000000000000000000000000000000005f5273ffffffffffffffffffffffffffffffffffffffff821660045260245ffd5b7f83e46ad2000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b5092611762919450611926925051611475565b61193081516115b4565b9260c081019384525f5b8251811015611971578061196a816119576116b5600195886114b3565b88519061196483836114b3565b526114b3565b500161193a565b50925050565b7f339e1ffb000000000000000000000000000000000000000000000000000000005f5260045ffd5b7f30c6792a000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b611a00906040519182917fd5edd2a500000000000000000000000000000000000000000000000000000000835260048301610934565b0390fd5b7f011b4d03dd8c01f1049143cf9c4c817e4b167f1d1b83e5c6f0f10d89ba1e7bce9150602083012014155f6116ca565b611a4461165061055e9251611410565b7fa19e609c000000000000000000000000000000000000000000000000000000005f52600452602490565b611a7f61166a61055e92516113ff565b7ff71b722f000000000000000000000000000000000000000000000000000000005f52600452602490565b611aba61165061055e92516113ef565b7fb8120dca000000000000000000000000000000000000000000000000000000005f52600452602490565b7fbc277732000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b67ffffffffffffffff1690815f52600460205260405f209167ffffffffffffffff83541615611b3c5750565b7ff761631b000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b611c04611b7261157a565b611beb611b8960208501611b8f611b898251611485565b51612f60565b611b9885611485565b52611ba284611485565b50611bb0611b8982516113ef565b611bb9856113ef565b52611bc3846113ef565b50611bd1611b898251611492565b611bda85611492565b52611be484611492565b5051611443565b611bf482611443565b52611bfe81611443565b506126a0565b611c0f8251516115b4565b905f5b83518051821015611c65579080600192600c82145f14611c53575050611c3783612738565b611c4182866114b3565b52611c4c81856114b3565b5001611c12565b611c6091611b89916114b3565b611c37565b505050611c7291506126a0565b6020815191012090565b919091611c8983516114df565b925f5b8151811015611e8257611c9f81836114b3565b51805160418103611e57575080601b60ff611cee611ce8611cc2611cfb96612717565b517fff000000000000000000000000000000000000000000000000000000000000001690565b60f81c90565b1610611e04575b8461304c565b90611d0581612866565b1590811591611dfa575b508015611ddc575b611db45773ffffffffffffffffffffffffffffffffffffffff81165f5b838110611d5457505090611d4e6001926117f183896114b3565b01611c8c565b81611d6561183e611824848c6114b3565b14611d7257600101611d34565b7f33af0d5f000000000000000000000000000000000000000000000000000000005f5273ffffffffffffffffffffffffffffffffffffffff831660045260245ffd5b7f09cb44e6000000000000000000000000000000000000000000000000000000005f5260045ffd5b5073ffffffffffffffffffffffffffffffffffffffff811615611d17565b905015155f611d0f565b611e46611e1e611e19611ce8611cc285612717565b612854565b60f81b7fff000000000000000000000000000000000000000000000000000000000000001690565b5f1a611e5182612717565b53611cf5565b7ff2db9ce1000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b505050565b5f198114610c975760010190565b905f915f5b8151811015611eee57611ecd73ffffffffffffffffffffffffffffffffffffffff611ec583856114b3565b511684612870565b611eda575b600101611e9a565b92611ee6600191611e87565b939050611ed2565b50506003611efd915404610c89565b90818110611f09575050565b7fe2dcb1b9000000000000000000000000000000000000000000000000000000005f5260045260245260445ffd5b905f198201918211610c9757565b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff408201918211610c9757565b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff808201918211610c9757565b6020039060208211610c9757565b91908203918211610c9757565b905f915f5b815181101561201357611ff273ffffffffffffffffffffffffffffffffffffffff611fea83856114b3565b5116846128c7565b611fff575b600101611fbf565b9261200b600191611e87565b939050611ff7565b50505190600382048203918211610c975781811061202f575050565b7f7818f4e4000000000000000000000000000000000000000000000000000000005f5260045260245260445ffd5b6120a7926116109261173d926040517fffffffffffffffffffffffffffffffffffffffff000000000000000000000000602082019260601b168252601481526104d7603482610afd565b805160021015611271576060610b9e91015161265a565b8054821015611271575f5260205f2001905f90565b919067ffffffffffffffff806120f1855467ffffffffffffffff1690565b921691161490811591612192575b5061218c5760020190815481510361218c575f5b81518110156121845761214961212982856120be565b905473ffffffffffffffffffffffffffffffffffffffff9160031b1c1690565b73ffffffffffffffffffffffffffffffffffffffff61216e61183e61182485876114b3565b91160361217d57600101612113565b5050505f90565b505050600190565b50505f90565b9050600182015414155f6120ff565b805f525f60205260ff6121d58360405f209073ffffffffffffffffffffffffffffffffffffffff165f5260205260405f2090565b541661218c57805f525f60205261220d8260405f209073ffffffffffffffffffffffffffffffffffffffff165f5260205260405f2090565b60017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0082541617905573ffffffffffffffffffffffffffffffffffffffff339216907f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d5f80a4600190565b805f525f60205260ff6122ac8360405f209073ffffffffffffffffffffffffffffffffffffffff165f5260205260405f2090565b54161561218c57805f525f6020526122e58260405f209073ffffffffffffffffffffffffffffffffffffffff165f5260205260405f2090565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00815416905573ffffffffffffffffffffffffffffffffffffffff339216907ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b5f80a4600190565b60208151910120604051602081019182527f1260944489272988d9df285149b5aa1b0f48f2136d6f416159f840a3e0747600604082015260408152612393606082610afd565b51902090565b604051906123a8602083610afd565b5f808352366020840137565b906123be82610b31565b6123cb6040519182610afd565b828152601f196115068294610b31565b61161061241d919493946123ef6020610b31565b956123fd6040519788610afd565b6020875261240b6020610b31565b601f1960208901910136823752612520565b906124288451610ca9565b918451151580612500575b61243c90612546565b61244e6124495f85611fad565b6123b4565b925f19015f5b818110612468575050610b9e939450612a3b565b806124ea600f6124ad6124e4611ce8611cc28d61248760029960011c90565b908d6124de8a6124d68a6124ad6124a4611ce8611cc28a8a612727565b60041c600f1690565b1660f81b7fff000000000000000000000000000000000000000000000000000000000000001690565b5f1a92612727565b53612727565b60ff1690565b5f1a6124f96001830188612727565b5301612454565b506001612433565b6040519061251582610ae1565b5f6020838281520152565b612528612508565b5060208151916040519261253b84610ae1565b835201602082015290565b1561019557565b80518015159081612583575b50156101955761256890612d11565b90519060208110612577575090565b6020036101000a900490565b6021915011155f612559565b61259881612d3d565b15610195576125a681612d5d565b6125af816114c7565b916125bd6040519384610afd565b818352601f196125cc836114c7565b015f5b81811061264357505060206125ef9101516125e981612dbe565b90610c9c565b5f905b8282106125ff5750505090565b61263b8161260e600193612e24565b90612617610b20565b82815281602082015261262a86896114b3565b5261263585886114b3565b50610c9c565b9101906125f2565b60209061264e612508565b828288010152016125cf565b6021815103610195576020015160018101809111610c97575190565b80511561019557612689610b9e91612d11565b612695819392936123b4565b928360200190612eed565b5f9190825b81518410156126ce576126b884836114b3565b51518101809111610c97576001909301926126a5565b6126d99193506123b4565b5f9060205b8451831015612709576001906126f484876114b3565b518051602082018386015e51019201916126de565b509050610b9e919250612f8c565b8051604010156112715760600190565b908151811015611271570160200190565b805160018114908161283c575b501561277857610b9e602080926040519381859251918291018484015e81015f838201520301601f198101835282610afd565b8051603781116127a857806021916020604051946001830186526080830182870153018385015e82010160405290565b906021906128056128008460ff6fffffffffffffffffffffffffffffffff821160071b67ffffffffffffffff83821c1160061b1763ffffffff83821c1160051b1761ffff83821c1160041b17918260031c921c111790565b610c89565b92604051938360208284019460018601885260b7840182890153848460031b610100031b8389015201918601015e82010160405290565b905015611271576080602082015160f81c105f612745565b60ff601b9116019060ff8211610c9757565b6004111561029457565b905f5b825481101561217d5773ffffffffffffffffffffffffffffffffffffffff61289b82856120be565b90549060031b1c1673ffffffffffffffffffffffffffffffffffffffff83161461218457600101612873565b905f5b825181101561217d5773ffffffffffffffffffffffffffffffffffffffff6128f282856114b3565b511673ffffffffffffffffffffffffffffffffffffffff831614612184576001016128ca565b91906129248351610ca9565b908351151580612a31575b61293890612546565b6129456124498284611fad565b9381926001808416146129cf575b5f19869101935b848110612968575050505050565b836129c660016129bc600f6124ad6124e4611ce8611cc28b60029b6129b56129a8886124ad8f611ce8611cc26129a16124a49360011c90565b8099612727565b9b8d03809c5f1a92612727565b538c612727565b5f1a920189612727565b5301859061295a565b92507f0f00000000000000000000000000000000000000000000000000000000000000612a0e6124e4611ce8611cc2612a088760011c90565b86612727565b60f81b165f1a612a1d86611485565b535f19612a2983611e87565b939050612953565b508181111561292f565b915f915f612a47612508565b50845115612cd85790935f915b81518310156101955782158080612cc2575b61019557159081612ca5575b5061019557612a8461176283836114b3565b948551600281145f14612b815750612aa6612aa16116b588611485565b6130e1565b95612abc612ab588888461314e565b8092610c9c565b965111612b635715612af35750612ad39051611f37565b11610195575111612aea576116b5610b9e916113ef565b50610b9e612399565b919094612b008651611f37565b82146101955780612b22612b1e612b186001946113ef565b51612d3d565b1590565b15612b4457612b33612b39916113ef565b516130d3565b915b01919490612a54565b612b50612b5d916113ef565b5160208101519051902090565b91612b3b565b505091509250612b74915051611f37565b1161019557610b9e612399565b929491939192601103612c465781518314612c2857612bb2612bac6124e4611ce8611cc28787612727565b93610c89565b92601081101561019557612bcf612bc982896114b3565b516130bd565b15612bf15750505050612be491925051611f37565b0361019557610b9e612399565b86612c09612b1e612b1884600196989a97999b6114b3565b15612c1b57612b5d91612b33916114b3565b612b5d91612b50916114b3565b505050612c359051611f37565b03610195576116b5610b9e916114a2565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f696e76616c6964206e6f6465206c656e677468000000000000000000000000006044820152606490fd5b9050612cba612cb484846114b3565b51613086565b14155f612a72565b50612cd0612b5085856114b3565b871415612a66565b509050612d0992507f56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421915014612546565b610b9e612399565b906020820191612d218351612dbe565b925190838201809211610c975751928303928311610c97579190565b805115612d5857602060c0910151515f1a10610ffe57600190565b505f90565b805115612d58575f9060208101908151612d7681612dbe565b8101809111610c9757915190518101809111610c975791905b828110612d9c5750905090565b612da581612e24565b8101809111610c9757612db89091611e87565b90612d8f565b515f1a6080811015612dcf57505f90565b60b881108015612e0e575b15612de55750600190565b60c0811015612dff57610b9e906128009060b75b90611fad565b610b9e906128009060f7612df9565b5060c08110158015612dda575060f88110612dda565b80515f1a906080821015612e39575050600190565b60b8821015612e4f5750612800610b9e91611f72565b60c0821015612e905760010151602082900360b7016101000a9004017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff4a0190565b60f8821015612ea65750612800610b9e91611f45565b60010151602082900360f7016101000a9004017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0a0190565b601f8111610c97576101000a90565b90918015611e82575b6020811015612f305780612f0957505050565b612f1d612f18612f2292611f9f565b612ede565b611f37565b905182518216911916179052565b91908051825260208101809111610c97579060208101809111610c975791601f19810190811115612ef657610c5c565b612f6a81516123b4565b90815115612f8857806020610b9e9201519051908360200190612eed565b5090565b805190919060378111612fbe578060219160206040519560018301875260c0830182880153018386015e830101604052565b916021906130166128008560ff6fffffffffffffffffffffffffffffffff821160071b67ffffffffffffffff83821c1160061b1763ffffffff83821c1160051b1761ffff83821c1160041b17918260031c921c111790565b93604051948360208284019460018601895260f78401828a0153848460031b610100031b838a015201918701015e830101604052565b815191906041830361307c576130759250602082015190606060408401519301515f1a906131f2565b9192909190565b50505f9160029190565b8051602081101561309e575060208101519051902090565b9060200151206040516020810191825260208152612393604082610afd565b6001815103612d585760200151515f1a60801490565b6130dc90612d11565b902090565b9081511561019557600f6130fd6124a4611ce8611cc286611485565b16806131105750610b9e60025f93612918565b600181036131255750610b9e60015f93612918565b6002810361313b5750610b9e6002600193612918565b60030361019557610b9e60018093612918565b91905f5b838101808211610c975782518110806131e8575b156131e0576131967fff000000000000000000000000000000000000000000000000000000000000009184612727565b51167fff000000000000000000000000000000000000000000000000000000000000006131c38386612727565b511690036131d9576131d490611e87565b613152565b9250505090565b509250505090565b5083518210613166565b91907f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08411613281579160209360809260ff5f9560405194855216868401526040830152606082015282805260015afa15613276575f5173ffffffffffffffffffffffffffffffffffffffff81161561326c57905f905f90565b505f906001905f90565b6040513d5f823e3d90fd5b5050505f916003919056fea164736f6c634300081c000a2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d4c48d1d2b0f4f7485fc28e3db22341d96a20aa29e6efa8149da9751603abd4e06e0c24a6e293ff9b755263dbaa15ba3796b0b8d3fe17cfb4ddf8143b268eac47bd893629a699470e4ec82a5715bb4981fdaacc5d0a728bf5f55b801d8f4ef10bad3228b676f7d3cd4284a5443f17f1962b36e491b30a40b2405849e597ba5fb5"}} diff --git a/ibc-solidity/abi/bytecode/BesuQBFTLightClient.json b/ibc-solidity/abi/bytecode/BesuQBFTLightClient.json index e41e1bc63..7f1556ff9 100644 --- a/ibc-solidity/abi/bytecode/BesuQBFTLightClient.json +++ b/ibc-solidity/abi/bytecode/BesuQBFTLightClient.json @@ -1 +1 @@ -{"abi":[{"type":"constructor","inputs":[{"name":"ibcRouter","type":"address","internalType":"address"},{"name":"initialTrustedHeight","type":"uint64","internalType":"uint64"},{"name":"initialTrustedTimestamp","type":"uint64","internalType":"uint64"},{"name":"initialTrustedStorageRoot","type":"bytes32","internalType":"bytes32"},{"name":"initialTrustedValidators","type":"address[]","internalType":"address[]"},{"name":"trustingPeriod","type":"uint64","internalType":"uint64"},{"name":"maxClockDrift","type":"uint64","internalType":"uint64"},{"name":"roleManager","type":"address","internalType":"address"}],"stateMutability":"nonpayable"},{"type":"function","name":"DEFAULT_ADMIN_ROLE","inputs":[],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"type":"function","name":"PROOF_SUBMITTER_ROLE","inputs":[],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"type":"function","name":"getClientState","inputs":[],"outputs":[{"name":"","type":"bytes","internalType":"bytes"}],"stateMutability":"view"},{"type":"function","name":"getConsensusState","inputs":[{"name":"revisionHeight","type":"uint64","internalType":"uint64"}],"outputs":[{"name":"","type":"bytes","internalType":"bytes"}],"stateMutability":"view"},{"type":"function","name":"getRoleAdmin","inputs":[{"name":"role","type":"bytes32","internalType":"bytes32"}],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"type":"function","name":"grantRole","inputs":[{"name":"role","type":"bytes32","internalType":"bytes32"},{"name":"account","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"hasRole","inputs":[{"name":"role","type":"bytes32","internalType":"bytes32"},{"name":"account","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"misbehaviour","inputs":[{"name":"","type":"bytes","internalType":"bytes"}],"outputs":[],"stateMutability":"view"},{"type":"function","name":"renounceRole","inputs":[{"name":"role","type":"bytes32","internalType":"bytes32"},{"name":"callerConfirmation","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"revokeRole","inputs":[{"name":"role","type":"bytes32","internalType":"bytes32"},{"name":"account","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"supportsInterface","inputs":[{"name":"interfaceId","type":"bytes4","internalType":"bytes4"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"updateClient","inputs":[{"name":"updateMsg","type":"bytes","internalType":"bytes"}],"outputs":[{"name":"","type":"uint8","internalType":"enum ILightClientMsgs.UpdateResult"}],"stateMutability":"nonpayable"},{"type":"function","name":"verifyMembership","inputs":[{"name":"msg_","type":"tuple","internalType":"struct ILightClientMsgs.MsgVerifyMembership","components":[{"name":"proof","type":"bytes","internalType":"bytes"},{"name":"proofHeight","type":"tuple","internalType":"struct IICS02ClientMsgs.Height","components":[{"name":"revisionNumber","type":"uint64","internalType":"uint64"},{"name":"revisionHeight","type":"uint64","internalType":"uint64"}]},{"name":"path","type":"bytes[]","internalType":"bytes[]"},{"name":"value","type":"bytes","internalType":"bytes"}]}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"verifyNonMembership","inputs":[{"name":"msg_","type":"tuple","internalType":"struct ILightClientMsgs.MsgVerifyNonMembership","components":[{"name":"proof","type":"bytes","internalType":"bytes"},{"name":"proofHeight","type":"tuple","internalType":"struct IICS02ClientMsgs.Height","components":[{"name":"revisionNumber","type":"uint64","internalType":"uint64"},{"name":"revisionHeight","type":"uint64","internalType":"uint64"}]},{"name":"path","type":"bytes[]","internalType":"bytes[]"}]}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"event","name":"RoleAdminChanged","inputs":[{"name":"role","type":"bytes32","indexed":true,"internalType":"bytes32"},{"name":"previousAdminRole","type":"bytes32","indexed":true,"internalType":"bytes32"},{"name":"newAdminRole","type":"bytes32","indexed":true,"internalType":"bytes32"}],"anonymous":false},{"type":"event","name":"RoleGranted","inputs":[{"name":"role","type":"bytes32","indexed":true,"internalType":"bytes32"},{"name":"account","type":"address","indexed":true,"internalType":"address"},{"name":"sender","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"type":"event","name":"RoleRevoked","inputs":[{"name":"role","type":"bytes32","indexed":true,"internalType":"bytes32"},{"name":"account","type":"address","indexed":true,"internalType":"address"},{"name":"sender","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"type":"error","name":"AccessControlBadConfirmation","inputs":[]},{"type":"error","name":"AccessControlUnauthorizedAccount","inputs":[{"name":"account","type":"address","internalType":"address"},{"name":"neededRole","type":"bytes32","internalType":"bytes32"}]},{"type":"error","name":"ConflictingConsensusState","inputs":[{"name":"revisionHeight","type":"uint64","internalType":"uint64"}]},{"type":"error","name":"ConsensusStateExpired","inputs":[{"name":"trustedTimestamp","type":"uint64","internalType":"uint64"},{"name":"currentTimestamp","type":"uint256","internalType":"uint256"},{"name":"trustingPeriod","type":"uint64","internalType":"uint64"}]},{"type":"error","name":"ConsensusStateNotFound","inputs":[{"name":"revisionHeight","type":"uint64","internalType":"uint64"}]},{"type":"error","name":"DuplicateCommitSealSigner","inputs":[{"name":"signer","type":"address","internalType":"address"}]},{"type":"error","name":"DuplicateValidator","inputs":[{"name":"validator","type":"address","internalType":"address"}]},{"type":"error","name":"EmptyValidatorSet","inputs":[]},{"type":"error","name":"HeaderFromFuture","inputs":[{"name":"currentTimestamp","type":"uint256","internalType":"uint256"},{"name":"headerTimestamp","type":"uint256","internalType":"uint256"},{"name":"maxClockDrift","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"InsufficientTrustedValidatorOverlap","inputs":[{"name":"actual","type":"uint256","internalType":"uint256"},{"name":"required","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"InsufficientValidatorQuorum","inputs":[{"name":"actual","type":"uint256","internalType":"uint256"},{"name":"required","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"InvalidCommitSeal","inputs":[]},{"type":"error","name":"InvalidCommitmentValue","inputs":[{"name":"expectedValue","type":"bytes32","internalType":"bytes32"},{"name":"actualValue","type":"bytes32","internalType":"bytes32"}]},{"type":"error","name":"InvalidDifficulty","inputs":[{"name":"actualDifficulty","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"InvalidECDSASignatureLength","inputs":[{"name":"length","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"InvalidExtraDataFormat","inputs":[{"name":"itemsLength","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"InvalidHeaderFormat","inputs":[{"name":"itemsLength","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"InvalidHeaderHeight","inputs":[]},{"type":"error","name":"InvalidHeaderTimestamp","inputs":[]},{"type":"error","name":"InvalidMixHash","inputs":[{"name":"actualMixHash","type":"bytes32","internalType":"bytes32"}]},{"type":"error","name":"InvalidNonce","inputs":[{"name":"actualNonce","type":"bytes","internalType":"bytes"}]},{"type":"error","name":"InvalidOmmersHash","inputs":[{"name":"actualOmmersHash","type":"bytes32","internalType":"bytes32"}]},{"type":"error","name":"InvalidPathLength","inputs":[{"name":"expectedLength","type":"uint256","internalType":"uint256"},{"name":"actualLength","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"InvalidRevisionNumber","inputs":[{"name":"providedRevisionNumber","type":"uint64","internalType":"uint64"}]},{"type":"error","name":"InvalidValidatorAddress","inputs":[{"name":"validator","type":"address","internalType":"address"}]},{"type":"error","name":"InvalidValidatorAddressLength","inputs":[{"name":"length","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"InvalidValueLength","inputs":[{"name":"expectedLength","type":"uint256","internalType":"uint256"},{"name":"actualLength","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"UnsupportedMisbehaviour","inputs":[]},{"type":"error","name":"ValueExists","inputs":[{"name":"actualValue","type":"bytes32","internalType":"bytes32"}]}],"bytecode":{"object":"0x6080604052346103d85761395e80380380610019816103dc565b928339810190610100818303126103d85761003381610401565b9061004060208201610415565b9061004d60408201610415565b92606082015191608081015160018060401b0381116103d85781019286601f850112156103d8578351966001600160401b03881161037f578760051b9460206100978188016103dc565b809a81520190602082978201019283116103d857602001905b8282106103c0575050506100c660a08301610415565b956100df60e06100d860c08601610415565b9401610401565b956001600160401b03169081156103b1576001600160401b03169283156103a257885115610393575f5b89518110156101bf576001600160a01b03610124828c610429565b511615610198575f5b81811061013d5750600101610109565b6001600160a01b0361014f828d610429565b51166001600160a01b03610163848e610429565b5116146101725760010161012d565b6001600160a01b03610184838d610429565b511663107f863360e21b5f5260045260245ffd5b6001600160a01b03906101ab908b610429565b51166359bff38760e01b5f5260045260245ffd5b5060408051979896978a979181016001600160401b0381118282101761037f576040525f81526020810190848252604051926080840198848a1060018060401b038b111761037f576040998a526001600160a01b031680855260208086018490526001600160401b03928316868c01819052878416606090970196909652600180546001600160a01b031916909217825592516002805495516fffffffffffffffff0000000000000000908d1b81169285166001600160801b03199788161792909217815560038054988d1b90921697909516909517959095179093555f948552600490529590922080546001600160401b031916949094178455830191909155925193910191831161037f5768010000000000000000831161037f578154838355808410610359575b50905f5260205f205f5b83811061033c57846001600160a01b0381166103235750610312610547565b505b6040516132f490816105ca8239f35b8061033061033692610451565b506104c7565b50610314565b82516001600160a01b0316818301556020909201916001016102f3565b825f528360205f2091820191015b81811061037457506102e9565b5f8155600101610367565b634e487b7160e01b5f52604160045260245ffd5b63339e1ffb60e01b5f5260045ffd5b63574f4e6160e01b5f5260045ffd5b6359d119e360e01b5f5260045ffd5b602080916103cd84610401565b8152019101906100b0565b5f80fd5b6040519190601f01601f191682016001600160401b0381118382101761037f57604052565b51906001600160a01b03821682036103d857565b51906001600160401b03821682036103d857565b805182101561043d5760209160051b010190565b634e487b7160e01b5f52603260045260245ffd5b6001600160a01b0381165f9081525f51602061393e5f395f51905f52602052604090205460ff166104c2576001600160a01b03165f8181525f51602061393e5f395f51905f5260205260408120805460ff191660011790553391905f5160206138be5f395f51905f528180a4600190565b505f90565b6001600160a01b0381165f9081525f5160206138de5f395f51905f52602052604090205460ff166104c2576001600160a01b03165f8181525f5160206138de5f395f51905f5260205260408120805460ff191660011790553391905f51602061391e5f395f51905f52905f5160206138be5f395f51905f529080a4600190565b5f80525f5160206138de5f395f51905f526020525f5160206138fe5f395f51905f525460ff166105c5575f8080525f5160206138de5f395f51905f526020525f5160206138fe5f395f51905f52805460ff1916600117905533905f51602061391e5f395f51905f525f5160206138be5f395f51905f528280a4600190565b5f9056fe60806040526004361015610011575f80fd5b5f3560e01c806301ffc9a7146100f45780630bece356146100ef578063248a9ca3146100ea5780632f2ff15d146100e557806336568abe146100e05780634d6d9ffb146100db5780635972185a146100d6578063682ed5f0146100d157806391d14854146100cc578063a217fddf146100c7578063d547741f146100c2578063ddba6537146100bd578063edce8bdc146100b85763ef913a4b146100b3575f80fd5b610a16565b61095e565b61088b565b61085c565b610842565b6107f4565b6105e6565b6105ac565b6103ac565b610350565b61031a565b6102b5565b610217565b34610195576020600319360112610195576004357fffffffff00000000000000000000000000000000000000000000000000000000811680910361019557807f7965db0b000000000000000000000000000000000000000000000000000000006020921490811561016b575b506040519015158152f35b7f01ffc9a7000000000000000000000000000000000000000000000000000000009150145f610160565b5f80fd5b9060206003198301126101955760043567ffffffffffffffff811161019557826023820112156101955780600401359267ffffffffffffffff84116101955760248483010111610195576024019190565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b346101955761028161022836610199565b5f80527f4c48d1d2b0f4f7485fc28e3db22341d96a20aa29e6efa8149da9751603abd4e06020527f6e0c24a6e293ff9b755263dbaa15ba3796b0b8d3fe17cfb4ddf8143b268eac475490919060ff161561029957610d9d565b6040516003821015610294576020918152f35b6101ea565b6102a1611287565b610d9d565b90816020910312610195573590565b346101955760206003193601126101955760206102df6004355f525f602052600160405f20015490565b604051908152f35b6003196040910112610195576004359060243573ffffffffffffffffffffffffffffffffffffffff811681036101955790565b346101955761034e61032b366102e7565b90610349610344825f525f602052600160405f20015490565b61130f565b61221d565b005b346101955761035e366102e7565b3373ffffffffffffffffffffffffffffffffffffffff8216036103845761034e916122f4565b7f6697b232000000000000000000000000000000000000000000000000000000005f5260045ffd5b346101955760206003193601126101955760043567ffffffffffffffff8111610195578060040160806003198336030112610195575f80527f4c48d1d2b0f4f7485fc28e3db22341d96a20aa29e6efa8149da9751603abd4e060205260ff7f6e0c24a6e293ff9b755263dbaa15ba3796b0b8d3fe17cfb4ddf8143b268eac4754161561059f575b61044761044260248401611192565b61137c565b60648201916001610458848461119c565b90500361056157906104a96104966104a261049d61049661049061048961048460446104e09a01611192565b611b30565b988761119c565b9061126e565b3691610b4d565b6123c9565b928061121d565b906001840154906040516104d7816104c960208201948560209181520190565b03601f198101835282610afd565b51902091612457565b805161051f5761051b61050b6104fe845467ffffffffffffffff1690565b67ffffffffffffffff1690565b6040519081529081906020820190565b0390f35b61053361052e61055e9261259c565b6125c9565b7fd039601e000000000000000000000000000000000000000000000000000000005f52600452602490565b5ffd5b61055e61056e848461119c565b7f88b3170e000000000000000000000000000000000000000000000000000000005f52600160045260245250604490565b6105a7611287565b610433565b34610195575f6003193601126101955760206040517fbd893629a699470e4ec82a5715bb4981fdaacc5d0a728bf5f55b801d8f4ef10b8152f35b346101955760206003193601126101955760043567ffffffffffffffff8111610195578060040160a06003198336030112610195575f80527f4c48d1d2b0f4f7485fc28e3db22341d96a20aa29e6efa8149da9751603abd4e060205260ff7f6e0c24a6e293ff9b755263dbaa15ba3796b0b8d3fe17cfb4ddf8143b268eac475416156107e7575b61067c61044260248401611192565b6064820191600161068d848461119c565b90500361056157608481019060206106a5838561121d565b9050036107a957906106f46104966106ed6106e56106de61049d6104966104906106d761048460446107149c01611192565b9b8b61119c565b948761121d565b8101906102a6565b948061121d565b906001850154906040516104d7816104c960208201948560209181520190565b8051156107755761052e6107279161259c565b908082036107475761051b61050b6104fe855467ffffffffffffffff1690565b7f56ed1b63000000000000000000000000000000000000000000000000000000005f5260045260245260445ffd5b61055e827f56ed1b63000000000000000000000000000000000000000000000000000000005f52906044916004525f602452565b61055e6107b6838561121d565b7f24fadac8000000000000000000000000000000000000000000000000000000005f52602060045260245250604490565b6107ef611287565b61066d565b3461019557602060ff610836610809366102e7565b905f525f845260405f209073ffffffffffffffffffffffffffffffffffffffff165f5260205260405f2090565b54166040519015158152f35b34610195575f6003193601126101955760206040515f8152f35b346101955761034e61086d366102e7565b90610886610344825f525f602052600160405f20015490565b6122f4565b346101955761089936610199565b50505f80527f4c48d1d2b0f4f7485fc28e3db22341d96a20aa29e6efa8149da9751603abd4e06020527f6e0c24a6e293ff9b755263dbaa15ba3796b0b8d3fe17cfb4ddf8143b268eac475460ff1615610915575b7f2c1ed462000000000000000000000000000000000000000000000000000000005f5260045ffd5b61091d611287565b6108ed565b67ffffffffffffffff81160361019557565b601f19601f602060409481855280519182918282880152018686015e5f8582860101520116010190565b346101955760206003193601126101955761097e60043561048481610922565b67ffffffffffffffff8154166002600183015492019060405192608084019160208501526040840152606080840152815480915260a08301915f5260205f20905f5b8181106109ea5761051b856109de818703601f198101835282610afd565b60405191829182610934565b825473ffffffffffffffffffffffffffffffffffffffff168452602090930192600192830192016109c0565b34610195575f6003193601126101955761051b60405173ffffffffffffffffffffffffffffffffffffffff60015416602082015267ffffffffffffffff600254818116604084015260401c16606082015267ffffffffffffffff600354818116608084015260401c1660a082015260a081526109de60c082610afd565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b6060810190811067ffffffffffffffff821117610adc57604052565b610a93565b6040810190811067ffffffffffffffff821117610adc57604052565b90601f601f19910116810190811067ffffffffffffffff821117610adc57604052565b60405190610b2f604083610afd565b565b67ffffffffffffffff8111610adc57601f01601f191660200190565b929192610b5982610b31565b91610b676040519384610afd565b829481845281830111610195578281602093845f960137010152565b9080601f8301121561019557816020610b9e93359101610b4d565b90565b6020818303126101955780359067ffffffffffffffff8211610195570180820391608083126101955760405192610bd784610ac0565b823567ffffffffffffffff811161019557604091610bfa84601f19938701610b83565b8652011261019557604051610c0e81610ae1565b6020830135610c1c81610922565b81526040830135610c2c81610922565b60208201526020840152606082013567ffffffffffffffff811161019557610c549201610b83565b604082015290565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b9060018201809211610c9757565b610c5c565b60c001908160c011610c9757565b60f701908160f711610c9757565b6080019081608011610c9757565b60b701908160b711610c9757565b91908201809211610c9757565b908160011b9180830460021490151715610c9757565b81519167ffffffffffffffff8311610adc57680100000000000000008311610adc578154838355808410610d77575b506020610d389101915f5260205f2090565b5f5b838110610d475750505050565b6001906020610d6a855173ffffffffffffffffffffffffffffffffffffffff1690565b9401938184015501610d3a565b825f528360205f2091820191015b818110610d925750610d26565b5f8155600101610d85565b610da991810190610ba1565b9060208201610dc461044282515167ffffffffffffffff1690565b610dce8351611614565b92606084019367ffffffffffffffff610def865167ffffffffffffffff1690565b161561116a5760035491604083901c67ffffffffffffffff1693610e1d67ffffffffffffffff861642610cd4565b9460a0840195610e35875167ffffffffffffffff1690565b9067ffffffffffffffff82161161112b5750505160200151610e7290610e649067ffffffffffffffff16611b30565b9367ffffffffffffffff1690565b67ffffffffffffffff81168015159081611102575b506110ad575090610ef591610eb66002610eae610ea385611bc2565b60e086015190611cf8565b950185611f11565b610ec660c0830194855190612036565b60406080610ee960015473ffffffffffffffffffffffffffffffffffffffff1690565b930151910151916120d9565b610f22610f0a865167ffffffffffffffff1690565b67ffffffffffffffff165f52600460205260405f2090565b610f376104fe825467ffffffffffffffff1690565b61103b5750916002610fb5928694610fa8610f73610f64610f0a610fc39a9b5167ffffffffffffffff1690565b955167ffffffffffffffff1690565b859067ffffffffffffffff167fffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000825416179055565b6001840155519101610cf7565b5167ffffffffffffffff1690565b600254610fdc9060401c67ffffffffffffffff166104fe565b67ffffffffffffffff821611610ff157505f90565b611037907fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff6fffffffffffffffff00000000000000006002549260401b16911617600255565b5f90565b91611051611059945167ffffffffffffffff1690565b90519261214f565b6110a75761055e611072835167ffffffffffffffff1690565b7fc1aea5f7000000000000000000000000000000000000000000000000000000005f5267ffffffffffffffff16600452602490565b60029150565b61055e906110c3855467ffffffffffffffff1690565b7feae35725000000000000000000000000000000000000000000000000000000005f5267ffffffffffffffff9081166004524260245216604452606490565b9050611123429161111e6104fe885467ffffffffffffffff1690565b610cd4565b11155f610e87565b7f9b772277000000000000000000000000000000000000000000000000000000005f524260045267ffffffffffffffff9081166024521660445260645ffd5b7f59d119e3000000000000000000000000000000000000000000000000000000005f5260045ffd5b35610b9e81610922565b9035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe181360301821215610195570180359067ffffffffffffffff821161019557602001918160051b3603831361019557565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b9035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe181360301821215610195570180359067ffffffffffffffff82116101955760200191813603831361019557565b9015611282578061127e9161121d565b9091565b6111f0565b335f9081527f4c48d1d2b0f4f7485fc28e3db22341d96a20aa29e6efa8149da9751603abd4e0602052604090205460ff16156112bf57565b7fe2517d3f000000000000000000000000000000000000000000000000000000005f52336004527fbd893629a699470e4ec82a5715bb4981fdaacc5d0a728bf5f55b801d8f4ef10b60245260445ffd5b805f525f60205260ff6113433360405f209073ffffffffffffffffffffffffffffffffffffffff165f5260205260405f2090565b54161561134d5750565b7fe2517d3f000000000000000000000000000000000000000000000000000000005f523360045260245260445ffd5b67ffffffffffffffff168061138e5750565b7f3ce598a9000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b60405190610100820182811067ffffffffffffffff821117610adc57604052606060e0838281528260208201528260408201525f838201525f60808201525f60a08201528260c08201520152565b8051600110156112825760400190565b805160071015611282576101000190565b8051600d1015611282576101c00190565b8051600e1015611282576101e00190565b805160081015611282576101200190565b8051600310156112825760800190565b8051600b1015611282576101800190565b8051600c1015611282576101a00190565b8051600410156112825760a00190565b8051156112825760200190565b8051600210156112825760600190565b805160101015611282576102200190565b80518210156112825760209160051b010190565b67ffffffffffffffff8111610adc5760051b60200190565b90611501826114df565b61150e6040519182610afd565b828152601f1961151e82946114df565b0190602036910137565b90602082519201517fffffffffffffffffffffffffffffffffffffffff00000000000000000000000081169260148110611560575050565b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000929350829060140360031b1b161690565b60405160c091906115a38382610afd565b6005815291601f1901825f5b8281106115bb57505050565b8060606020809385010152016115af565b906115d6826114df565b6115e36040519182610afd565b828152601f196115f382946114df565b01905f5b82811061160357505050565b8060606020809385010152016115f7565b61163061162b6116226113b9565b9280845261259c565b61260b565b602082019080825251600f8110611b0557507f1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d493476116766116708351611407565b516126d6565b03611aca57600161169061168a8351611417565b516125c9565b03611a8f577f63746963616c2062797a616e74696e65206661756c7420746f6c6572616e63656116c36116708351611428565b03611a54576116db6116d58251611439565b516126f2565b80516008811490811591611a24575b506119ea575061162b61175d6116d5836117216117106104fe61168a611762985161144a565b67ffffffffffffffff166060880152565b61172e611670825161145b565b60808701526117576117466104fe61168a845161146b565b67ffffffffffffffff1660a0880152565b5161147c565b61259c565b90604081019180835251600581036119bf57506117886117828351611407565b5161260b565b908151156119975761179a82516114f7565b9360c082019485525f5b8351811015611933576117ba6116d582866114cb565b80516014810361190857506117d16117d791611528565b60601c90565b73ffffffffffffffffffffffffffffffffffffffff811680156118c6575f5b8381106118325750509061182c600192611811838a516114cb565b9073ffffffffffffffffffffffffffffffffffffffff169052565b016117a4565b8161187761185e611844848d516114cb565b5173ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff1690565b14611884576001016117f6565b7f41fe18cc000000000000000000000000000000000000000000000000000000005f5273ffffffffffffffffffffffffffffffffffffffff831660045260245ffd5b7f59bff387000000000000000000000000000000000000000000000000000000005f5273ffffffffffffffffffffffffffffffffffffffff821660045260245ffd5b7f83e46ad2000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b509261178291945061194692505161148d565b61195081516115cc565b9260e081019384525f5b8251811015611991578061198a816119776116d5600195886114cb565b88519061198483836114cb565b526114cb565b500161195a565b50925050565b7f339e1ffb000000000000000000000000000000000000000000000000000000005f5260045ffd5b7f30c6792a000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b611a20906040519182917fd5edd2a500000000000000000000000000000000000000000000000000000000835260048301610934565b0390fd5b7f011b4d03dd8c01f1049143cf9c4c817e4b167f1d1b83e5c6f0f10d89ba1e7bce9150602083012014155f6116ea565b611a6461167061055e9251611428565b7fa19e609c000000000000000000000000000000000000000000000000000000005f52600452602490565b611a9f61168a61055e9251611417565b7ff71b722f000000000000000000000000000000000000000000000000000000005f52600452602490565b611ada61167061055e9251611407565b7fb8120dca000000000000000000000000000000000000000000000000000000005f52600452602490565b7fbc277732000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b67ffffffffffffffff1690815f52600460205260405f209167ffffffffffffffff83541615611b5c5750565b7ff761631b000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b60405190611b96604083610afd565b600182527fc0000000000000000000000000000000000000000000000000000000000000006020830152565b6020611c7d611bcf611592565b611c48611be660408601611bec611be6825161149d565b51612ff9565b611bf58561149d565b52611bff8461149d565b50611c0d611be68251611407565b611c1685611407565b52611c2084611407565b50611c2e611be682516114aa565b611c37856114aa565b52611c41846114aa565b505161145b565b611c518261145b565b52611c5b8161145b565b50611c64611b87565b611c6d8261148d565b52611c778161148d565b506127c8565b910190611c8b8251516115cc565b905f5b83518051821015611ce1579080600192600c82145f14611ccf575050611cb383612880565b611cbd82866114cb565b52611cc881856114cb565b5001611c8e565b611cdc91611be6916114cb565b611cb3565b505050611cee91506127c8565b6020815191012090565b919091611d0583516114f7565b925f5b8151811015611efe57611d1b81836114cb565b51805160418103611ed3575080601b60ff611d6a611d64611d3e611d779661285f565b517fff000000000000000000000000000000000000000000000000000000000000001690565b60f81c90565b1610611e80575b846130a7565b90611d81816128fa565b1590811591611e76575b508015611e58575b611e305773ffffffffffffffffffffffffffffffffffffffff81165f5b838110611dd057505090611dca60019261181183896114cb565b01611d08565b81611de161185e611844848c6114cb565b14611dee57600101611db0565b7f33af0d5f000000000000000000000000000000000000000000000000000000005f5273ffffffffffffffffffffffffffffffffffffffff831660045260245ffd5b7f09cb44e6000000000000000000000000000000000000000000000000000000005f5260045ffd5b5073ffffffffffffffffffffffffffffffffffffffff811615611d93565b905015155f611d8b565b611ec2611e9a611e95611d64611d3e8561285f565b6128e8565b60f81b7fff000000000000000000000000000000000000000000000000000000000000001690565b5f1a611ecd8261285f565b53611d71565b7ff2db9ce1000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b505050565b5f198114610c975760010190565b905f915f5b8151811015611f6a57611f4973ffffffffffffffffffffffffffffffffffffffff611f4183856114cb565b511684612904565b611f56575b600101611f16565b92611f62600191611f03565b939050611f4e565b50506003611f79915404610c89565b90818110611f85575050565b7fe2dcb1b9000000000000000000000000000000000000000000000000000000005f5260045260245260445ffd5b905f198201918211610c9757565b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff408201918211610c9757565b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff808201918211610c9757565b6020039060208211610c9757565b91908203918211610c9757565b905f915f5b815181101561208f5761206e73ffffffffffffffffffffffffffffffffffffffff61206683856114cb565b51168461295b565b61207b575b60010161203b565b92612087600191611f03565b939050612073565b50505190600382048203918211610c97578181106120ab575050565b7f7818f4e4000000000000000000000000000000000000000000000000000000005f5260045260245260445ffd5b6121239261162b9261175d926040517fffffffffffffffffffffffffffffffffffffffff000000000000000000000000602082019260601b168252601481526104d7603482610afd565b805160021015611282576060610b9e9101516126d6565b8054821015611282575f5260205f2001905f90565b919067ffffffffffffffff8061216d855467ffffffffffffffff1690565b92169116149081159161220e575b5061220857600201908154815103612208575f5b8151811015612200576121c56121a5828561213a565b905473ffffffffffffffffffffffffffffffffffffffff9160031b1c1690565b73ffffffffffffffffffffffffffffffffffffffff6121ea61185e61184485876114cb565b9116036121f95760010161218f565b5050505f90565b505050600190565b50505f90565b9050600182015414155f61217b565b805f525f60205260ff6122518360405f209073ffffffffffffffffffffffffffffffffffffffff165f5260205260405f2090565b541661220857805f525f6020526122898260405f209073ffffffffffffffffffffffffffffffffffffffff165f5260205260405f2090565b60017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0082541617905573ffffffffffffffffffffffffffffffffffffffff339216907f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d5f80a4600190565b805f525f60205260ff6123288360405f209073ffffffffffffffffffffffffffffffffffffffff165f5260205260405f2090565b54161561220857805f525f6020526123618260405f209073ffffffffffffffffffffffffffffffffffffffff165f5260205260405f2090565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00815416905573ffffffffffffffffffffffffffffffffffffffff339216907ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b5f80a4600190565b60208151910120604051602081019182527f1260944489272988d9df285149b5aa1b0f48f2136d6f416159f840a3e074760060408201526040815261240f606082610afd565b51902090565b60405190612424602083610afd565b5f808352366020840137565b9061243a82610b31565b6124476040519182610afd565b828152601f1961151e8294610b31565b61162b6124999194939461246b6020610b31565b956124796040519788610afd565b602087526124876020610b31565b601f196020890191013682375261259c565b906124a48451610ce1565b91845115158061257c575b6124b8906125c2565b6124ca6124c55f85612029565b612430565b925f19015f5b8181106124e4575050610b9e939450612acf565b80612566600f612529612560611d64611d3e8d61250360029960011c90565b908d61255a8a6125528a612529612520611d64611d3e8a8a61286f565b60041c600f1690565b1660f81b7fff000000000000000000000000000000000000000000000000000000000000001690565b5f1a9261286f565b5361286f565b60ff1690565b5f1a612575600183018861286f565b53016124d0565b5060016124af565b6040519061259182610ae1565b5f6020838281520152565b6125a4612584565b506020815191604051926125b784610ae1565b835201602082015290565b1561019557565b805180151590816125ff575b5015610195576125e490612da5565b905190602081106125f3575090565b6020036101000a900490565b6021915011155f6125d5565b61261481612dd1565b156101955761262281612df1565b61262b816114df565b916126396040519384610afd565b818352601f19612648836114df565b015f5b8181106126bf575050602061266b91015161266581612e52565b90610cd4565b5f905b82821061267b5750505090565b6126b78161268a600193612ebd565b90612693610b20565b8281528160208201526126a686896114cb565b526126b185886114cb565b50610cd4565b91019061266e565b6020906126ca612584565b8282880101520161264b565b6021815103610195576020015160018101809111610c97575190565b80511561019557612705610b9e91612da5565b61271181939293612430565b928360200190612f86565b805191908290602001825e015f815290565b610b2f9061275061274a9493604051958693602085019061271c565b9061271c565b03601f198101845283610afd565b6001907fff00000000000000000000000000000000000000000000000000000000000000610b9e9493168152019061271c565b916001610b9e94937fff0000000000000000000000000000000000000000000000000000000000000061274a94168152019061271c565b6127d0612415565b905f915b81518310156127fc576127f46001916127ed85856114cb565b519061272e565b9201916127d4565b91505080516038811061283b5750610b9e6128178251613025565b916104c961282b611e9a6125608651610caa565b9160405194859360208501612791565b61284d611e9a612560610b9e93610c9c565b6104c96040519384926020840161275e565b8051604010156112825760600190565b908151811015611282570160200190565b6001815114806128cd575b610b9e578051603881106128bb5750610b9e6128a78251613025565b916104c961282b611e9a6125608651610cc6565b61284d611e9a612560610b9e93610cb8565b50608060ff6128e1611d64611d3e8561149d565b161061288b565b60ff601b9116019060ff8211610c9757565b6004111561029457565b905f5b82548110156121f95773ffffffffffffffffffffffffffffffffffffffff61292f828561213a565b90549060031b1c1673ffffffffffffffffffffffffffffffffffffffff83161461220057600101612907565b905f5b82518110156121f95773ffffffffffffffffffffffffffffffffffffffff61298682856114cb565b511673ffffffffffffffffffffffffffffffffffffffff8316146122005760010161295e565b91906129b88351610ce1565b908351151580612ac5575b6129cc906125c2565b6129d96124c58284612029565b938192600180841614612a63575b5f19869101935b8481106129fc575050505050565b83612a5a6001612a50600f612529612560611d64611d3e8b60029b612a49612a3c886125298f611d64611d3e612a356125209360011c90565b809961286f565b9b8d03809c5f1a9261286f565b538c61286f565b5f1a92018961286f565b530185906129ee565b92507f0f00000000000000000000000000000000000000000000000000000000000000612aa2612560611d64611d3e612a9c8760011c90565b8661286f565b60f81b165f1a612ab18661149d565b535f19612abd83611f03565b9390506129e7565b50818111156129c3565b915f915f612adb612584565b50845115612d6c5790935f915b81518310156101955782158080612d56575b61019557159081612d39575b5061019557612b1861178283836114cb565b948551600281145f14612c155750612b3a612b356116d58861149d565b61313c565b95612b50612b498888846131a9565b8092610cd4565b965111612bf75715612b875750612b679051611fb3565b11610195575111612b7e576116d5610b9e91611407565b50610b9e612415565b919094612b948651611fb3565b82146101955780612bb6612bb2612bac600194611407565b51612dd1565b1590565b15612bd857612bc7612bcd91611407565b5161312e565b915b01919490612ae8565b612be4612bf191611407565b5160208101519051902090565b91612bcf565b505091509250612c08915051611fb3565b1161019557610b9e612415565b929491939192601103612cda5781518314612cbc57612c46612c40612560611d64611d3e878761286f565b93610c89565b92601081101561019557612c63612c5d82896114cb565b51613118565b15612c855750505050612c7891925051611fb3565b0361019557610b9e612415565b86612c9d612bb2612bac84600196989a97999b6114cb565b15612caf57612bf191612bc7916114cb565b612bf191612be4916114cb565b505050612cc99051611fb3565b03610195576116d5610b9e916114ba565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f696e76616c6964206e6f6465206c656e677468000000000000000000000000006044820152606490fd5b9050612d4e612d4884846114cb565b516130e1565b14155f612b06565b50612d64612be485856114cb565b871415612afa565b509050612d9d92507f56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b4219150146125c2565b610b9e612415565b906020820191612db58351612e52565b925190838201809211610c975751928303928311610c97579190565b805115612dec57602060c0910151515f1a1061103757600190565b505f90565b805115612dec575f9060208101908151612e0a81612e52565b8101809111610c9757915190518101809111610c975791905b828110612e305750905090565b612e3981612ebd565b8101809111610c9757612e4c9091611f03565b90612e23565b515f1a6080811015612e6357505f90565b60b881108015612ea7575b15612e795750600190565b60c0811015612e9857610b9e90612e939060b75b90612029565b610c89565b610b9e90612e939060f7612e8d565b5060c08110158015612e6e575060f88110612e6e565b80515f1a906080821015612ed2575050600190565b60b8821015612ee85750612e93610b9e91611fee565b60c0821015612f295760010151602082900360b7016101000a9004017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff4a0190565b60f8821015612f3f5750612e93610b9e91611fc1565b60010151602082900360f7016101000a9004017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0a0190565b601f8111610c97576101000a90565b90918015611efe575b6020811015612fc95780612fa257505050565b612fb6612fb1612fbb9261201b565b612f77565b611fb3565b905182518216911916179052565b91908051825260208101809111610c97579060208101809111610c975791601f19810190811115612f8f57610c5c565b6130038151612430565b9081511561302157806020610b9e9201519051908360200190612f86565b5090565b5f81805b613093575061303781612430565b91815b61304357505090565b61304c82611fb3565b61307e7fff000000000000000000000000000000000000000000000000000000000000008360f81b165f1a918561286f565b5360081c908015610c97575f1901908161303a565b9061309d90611f03565b9060081c80613029565b81519190604183036130d7576130d09250602082015190606060408401519301515f1a9061324d565b9192909190565b50505f9160029190565b805160208110156130f9575060208101519051902090565b906020015120604051602081019182526020815261240f604082610afd565b6001815103612dec5760200151515f1a60801490565b61313790612da5565b902090565b9081511561019557600f613158612520611d64611d3e8661149d565b168061316b5750610b9e60025f936129ac565b600181036131805750610b9e60015f936129ac565b600281036131965750610b9e60026001936129ac565b60030361019557610b9e600180936129ac565b91905f5b838101808211610c97578251811080613243575b1561323b576131f17fff00000000000000000000000000000000000000000000000000000000000000918461286f565b51167fff0000000000000000000000000000000000000000000000000000000000000061321e838661286f565b511690036132345761322f90611f03565b6131ad565b9250505090565b509250505090565b50835182106131c1565b91907f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a084116132dc579160209360809260ff5f9560405194855216868401526040830152606082015282805260015afa156132d1575f5173ffffffffffffffffffffffffffffffffffffffff8116156132c757905f905f90565b505f906001905f90565b6040513d5f823e3d90fd5b5050505f916003919056fea164736f6c634300081c000a2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d4c48d1d2b0f4f7485fc28e3db22341d96a20aa29e6efa8149da9751603abd4e06e0c24a6e293ff9b755263dbaa15ba3796b0b8d3fe17cfb4ddf8143b268eac47bd893629a699470e4ec82a5715bb4981fdaacc5d0a728bf5f55b801d8f4ef10bad3228b676f7d3cd4284a5443f17f1962b36e491b30a40b2405849e597ba5fb5","sourceMap":"237:2306:36:-:0;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;237:2306:36;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;:::i;:::-;;-1:-1:-1;;;;;237:2306:36;;3952:25:35;;3948:84;;-1:-1:-1;;;;;237:2306:36;;4045:28:35;;4041:90;;237:2306:36;;17766:22:35;17762:79;;-1:-1:-1;17893:3:35;237:2306:36;;17870:21:35;;;;;-1:-1:-1;;;;;17916:13:35;;;;:::i;:::-;237:2306:36;;17916:27:35;17912:111;;-1:-1:-1;18056:5:35;;;;;;17893:3;237:2306:36;;17855:13:35;;18063:3;-1:-1:-1;;;;;18090:13:35;;;;:::i;:::-;237:2306:36;;-1:-1:-1;;;;;18107:13:35;237:2306:36;;18107:13:35;:::i;:::-;237:2306:36;;18090:30:35;18086:117;;237:2306:36;;18041:13:35;;18086:117;-1:-1:-1;;;;;18170:13:35;237:2306:36;;18170:13:35;:::i;:::-;237:2306:36;;18151:33:35;;;-1:-1:-1;18151:33:35;;237:2306:36;;-1:-1:-1;18151:33:35;17912:111;-1:-1:-1;;;;;237:2306:36;17994:13:35;;237:2306:36;17994:13:35;:::i;:::-;237:2306:36;;17970:38:35;;;-1:-1:-1;17970:38:35;;237:2306:36;;-1:-1:-1;17970:38:35;17870:21;-1:-1:-1;237:2306:36;;;17870:21:35;;;;;;;237:2306:36;;-1:-1:-1;;;;;237:2306:36;;;;;;;;;;-1:-1:-1;237:2306:36;;;4285:84:35;;237:2306:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;237:2306:36;;;;;4211:255:35;;;237:2306:36;;;-1:-1:-1;;;;;237:2306:36;;;4211:255:35;;;237:2306:36;;;;;;;4211:255:35;;;237:2306:36;;;;;;;-1:-1:-1;;;;;;237:2306:36;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;237:2306:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;237:2306:36;;;4517:15:35;237:2306:36;;;;;;;;-1:-1:-1;;;;;;237:2306:36;;;;;;;4624:26:35;;237:2306:36;;;;;;;4688:25:35;;;237:2306:36;;;;;;;;;;;;;;;;;;;17850:377:35;237:2306:36;;-1:-1:-1;237:2306:36;;-1:-1:-1;237:2306:36;-1:-1:-1;237:2306:36;;;;;;;-1:-1:-1;;;;;237:2306:36;;;;4796:44:35;;;:::i;:::-;;4751:233;237:2306:36;;;;;;;;;4751:233:35;4871:43;;4928:45;4871:43;;:::i;:::-;;4928:45;:::i;:::-;;4751:233;;237:2306:36;;;-1:-1:-1;;;;;237:2306:36;;;;;;;;;;;;;;;;-1:-1:-1;237:2306:36;;;-1:-1:-1;237:2306:36;;;;;;;;;;;;;;;;-1:-1:-1;237:2306:36;;;;;;;;;;-1:-1:-1;237:2306:36;;4517:15:35;237:2306:36;;-1:-1:-1;237:2306:36;17762:79:35;17811:19;;;-1:-1:-1;17811:19:35;;-1:-1:-1;17811:19:35;4041:90;4096:24;;;-1:-1:-1;4096:24:35;;-1:-1:-1;4096:24:35;3948:84;4000:21;;;-1:-1:-1;4000:21:35;;-1:-1:-1;4000:21:35;237:2306:36;;;;;;;:::i;:::-;;;;;;;;;;-1:-1:-1;237:2306:36;;;;;;;;;-1:-1:-1;;237:2306:36;;;-1:-1:-1;;;;;237:2306:36;;;;;;;;;;:::o;:::-;;;-1:-1:-1;;;;;237:2306:36;;;;;;:::o;:::-;;;-1:-1:-1;;;;;237:2306:36;;;;;;:::o;:::-;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;6145:316:93;-1:-1:-1;;;;;237:2306:36;;3976:1:35;237:2306:36;;;-1:-1:-1;;;;;;;;;;;237:2306:36;;;;;;;;;;-1:-1:-1;;;;;237:2306:36;3976:1:35;237:2306:36;;;-1:-1:-1;;;;;;;;;;;237:2306:36;;;;;;;-1:-1:-1;;237:2306:36;;;;;735:10:121;;237:2306:36;-1:-1:-1;;;;;;;;;;;3976:1:35;;6336:40:93;6313:4;6390:11;:::o;6238:217::-;6432:12;3976:1:35;6432:12:93;:::o;6145:316::-;-1:-1:-1;;;;;237:2306:36;;;;;;-1:-1:-1;;;;;;;;;;;237:2306:36;;;;;;;;;;-1:-1:-1;;;;;237:2306:36;;;;;-1:-1:-1;;;;;;;;;;;237:2306:36;;;;;;;-1:-1:-1;;237:2306:36;;;;;735:10:121;;237:2306:36;-1:-1:-1;;;;;;;;;;;2089:33:35;-1:-1:-1;;;;;;;;;;;6336:40:93;237:2306:36;6336:40:93;6313:4;6390:11;:::o;6145:316::-;237:2306:36;;;-1:-1:-1;;;;;;;;;;;237:2306:36;;-1:-1:-1;;;;;;;;;;;237:2306:36;;;;;;;;;-1:-1:-1;;;;;;;;;;;237:2306:36;;-1:-1:-1;;;;;;;;;;;237:2306:36;;-1:-1:-1;;237:2306:36;6313:4:93;237:2306:36;;;735:10:121;;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;237:2306:36;;6336:40:93;6313:4;6390:11;:::o;6238:217::-;237:2306:36;6432:12:93;:::o","linkReferences":{}},"deployedBytecode":{"object":"0x60806040526004361015610011575f80fd5b5f3560e01c806301ffc9a7146100f45780630bece356146100ef578063248a9ca3146100ea5780632f2ff15d146100e557806336568abe146100e05780634d6d9ffb146100db5780635972185a146100d6578063682ed5f0146100d157806391d14854146100cc578063a217fddf146100c7578063d547741f146100c2578063ddba6537146100bd578063edce8bdc146100b85763ef913a4b146100b3575f80fd5b610a16565b61095e565b61088b565b61085c565b610842565b6107f4565b6105e6565b6105ac565b6103ac565b610350565b61031a565b6102b5565b610217565b34610195576020600319360112610195576004357fffffffff00000000000000000000000000000000000000000000000000000000811680910361019557807f7965db0b000000000000000000000000000000000000000000000000000000006020921490811561016b575b506040519015158152f35b7f01ffc9a7000000000000000000000000000000000000000000000000000000009150145f610160565b5f80fd5b9060206003198301126101955760043567ffffffffffffffff811161019557826023820112156101955780600401359267ffffffffffffffff84116101955760248483010111610195576024019190565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b346101955761028161022836610199565b5f80527f4c48d1d2b0f4f7485fc28e3db22341d96a20aa29e6efa8149da9751603abd4e06020527f6e0c24a6e293ff9b755263dbaa15ba3796b0b8d3fe17cfb4ddf8143b268eac475490919060ff161561029957610d9d565b6040516003821015610294576020918152f35b6101ea565b6102a1611287565b610d9d565b90816020910312610195573590565b346101955760206003193601126101955760206102df6004355f525f602052600160405f20015490565b604051908152f35b6003196040910112610195576004359060243573ffffffffffffffffffffffffffffffffffffffff811681036101955790565b346101955761034e61032b366102e7565b90610349610344825f525f602052600160405f20015490565b61130f565b61221d565b005b346101955761035e366102e7565b3373ffffffffffffffffffffffffffffffffffffffff8216036103845761034e916122f4565b7f6697b232000000000000000000000000000000000000000000000000000000005f5260045ffd5b346101955760206003193601126101955760043567ffffffffffffffff8111610195578060040160806003198336030112610195575f80527f4c48d1d2b0f4f7485fc28e3db22341d96a20aa29e6efa8149da9751603abd4e060205260ff7f6e0c24a6e293ff9b755263dbaa15ba3796b0b8d3fe17cfb4ddf8143b268eac4754161561059f575b61044761044260248401611192565b61137c565b60648201916001610458848461119c565b90500361056157906104a96104966104a261049d61049661049061048961048460446104e09a01611192565b611b30565b988761119c565b9061126e565b3691610b4d565b6123c9565b928061121d565b906001840154906040516104d7816104c960208201948560209181520190565b03601f198101835282610afd565b51902091612457565b805161051f5761051b61050b6104fe845467ffffffffffffffff1690565b67ffffffffffffffff1690565b6040519081529081906020820190565b0390f35b61053361052e61055e9261259c565b6125c9565b7fd039601e000000000000000000000000000000000000000000000000000000005f52600452602490565b5ffd5b61055e61056e848461119c565b7f88b3170e000000000000000000000000000000000000000000000000000000005f52600160045260245250604490565b6105a7611287565b610433565b34610195575f6003193601126101955760206040517fbd893629a699470e4ec82a5715bb4981fdaacc5d0a728bf5f55b801d8f4ef10b8152f35b346101955760206003193601126101955760043567ffffffffffffffff8111610195578060040160a06003198336030112610195575f80527f4c48d1d2b0f4f7485fc28e3db22341d96a20aa29e6efa8149da9751603abd4e060205260ff7f6e0c24a6e293ff9b755263dbaa15ba3796b0b8d3fe17cfb4ddf8143b268eac475416156107e7575b61067c61044260248401611192565b6064820191600161068d848461119c565b90500361056157608481019060206106a5838561121d565b9050036107a957906106f46104966106ed6106e56106de61049d6104966104906106d761048460446107149c01611192565b9b8b61119c565b948761121d565b8101906102a6565b948061121d565b906001850154906040516104d7816104c960208201948560209181520190565b8051156107755761052e6107279161259c565b908082036107475761051b61050b6104fe855467ffffffffffffffff1690565b7f56ed1b63000000000000000000000000000000000000000000000000000000005f5260045260245260445ffd5b61055e827f56ed1b63000000000000000000000000000000000000000000000000000000005f52906044916004525f602452565b61055e6107b6838561121d565b7f24fadac8000000000000000000000000000000000000000000000000000000005f52602060045260245250604490565b6107ef611287565b61066d565b3461019557602060ff610836610809366102e7565b905f525f845260405f209073ffffffffffffffffffffffffffffffffffffffff165f5260205260405f2090565b54166040519015158152f35b34610195575f6003193601126101955760206040515f8152f35b346101955761034e61086d366102e7565b90610886610344825f525f602052600160405f20015490565b6122f4565b346101955761089936610199565b50505f80527f4c48d1d2b0f4f7485fc28e3db22341d96a20aa29e6efa8149da9751603abd4e06020527f6e0c24a6e293ff9b755263dbaa15ba3796b0b8d3fe17cfb4ddf8143b268eac475460ff1615610915575b7f2c1ed462000000000000000000000000000000000000000000000000000000005f5260045ffd5b61091d611287565b6108ed565b67ffffffffffffffff81160361019557565b601f19601f602060409481855280519182918282880152018686015e5f8582860101520116010190565b346101955760206003193601126101955761097e60043561048481610922565b67ffffffffffffffff8154166002600183015492019060405192608084019160208501526040840152606080840152815480915260a08301915f5260205f20905f5b8181106109ea5761051b856109de818703601f198101835282610afd565b60405191829182610934565b825473ffffffffffffffffffffffffffffffffffffffff168452602090930192600192830192016109c0565b34610195575f6003193601126101955761051b60405173ffffffffffffffffffffffffffffffffffffffff60015416602082015267ffffffffffffffff600254818116604084015260401c16606082015267ffffffffffffffff600354818116608084015260401c1660a082015260a081526109de60c082610afd565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b6060810190811067ffffffffffffffff821117610adc57604052565b610a93565b6040810190811067ffffffffffffffff821117610adc57604052565b90601f601f19910116810190811067ffffffffffffffff821117610adc57604052565b60405190610b2f604083610afd565b565b67ffffffffffffffff8111610adc57601f01601f191660200190565b929192610b5982610b31565b91610b676040519384610afd565b829481845281830111610195578281602093845f960137010152565b9080601f8301121561019557816020610b9e93359101610b4d565b90565b6020818303126101955780359067ffffffffffffffff8211610195570180820391608083126101955760405192610bd784610ac0565b823567ffffffffffffffff811161019557604091610bfa84601f19938701610b83565b8652011261019557604051610c0e81610ae1565b6020830135610c1c81610922565b81526040830135610c2c81610922565b60208201526020840152606082013567ffffffffffffffff811161019557610c549201610b83565b604082015290565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b9060018201809211610c9757565b610c5c565b60c001908160c011610c9757565b60f701908160f711610c9757565b6080019081608011610c9757565b60b701908160b711610c9757565b91908201809211610c9757565b908160011b9180830460021490151715610c9757565b81519167ffffffffffffffff8311610adc57680100000000000000008311610adc578154838355808410610d77575b506020610d389101915f5260205f2090565b5f5b838110610d475750505050565b6001906020610d6a855173ffffffffffffffffffffffffffffffffffffffff1690565b9401938184015501610d3a565b825f528360205f2091820191015b818110610d925750610d26565b5f8155600101610d85565b610da991810190610ba1565b9060208201610dc461044282515167ffffffffffffffff1690565b610dce8351611614565b92606084019367ffffffffffffffff610def865167ffffffffffffffff1690565b161561116a5760035491604083901c67ffffffffffffffff1693610e1d67ffffffffffffffff861642610cd4565b9460a0840195610e35875167ffffffffffffffff1690565b9067ffffffffffffffff82161161112b5750505160200151610e7290610e649067ffffffffffffffff16611b30565b9367ffffffffffffffff1690565b67ffffffffffffffff81168015159081611102575b506110ad575090610ef591610eb66002610eae610ea385611bc2565b60e086015190611cf8565b950185611f11565b610ec660c0830194855190612036565b60406080610ee960015473ffffffffffffffffffffffffffffffffffffffff1690565b930151910151916120d9565b610f22610f0a865167ffffffffffffffff1690565b67ffffffffffffffff165f52600460205260405f2090565b610f376104fe825467ffffffffffffffff1690565b61103b5750916002610fb5928694610fa8610f73610f64610f0a610fc39a9b5167ffffffffffffffff1690565b955167ffffffffffffffff1690565b859067ffffffffffffffff167fffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000825416179055565b6001840155519101610cf7565b5167ffffffffffffffff1690565b600254610fdc9060401c67ffffffffffffffff166104fe565b67ffffffffffffffff821611610ff157505f90565b611037907fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff6fffffffffffffffff00000000000000006002549260401b16911617600255565b5f90565b91611051611059945167ffffffffffffffff1690565b90519261214f565b6110a75761055e611072835167ffffffffffffffff1690565b7fc1aea5f7000000000000000000000000000000000000000000000000000000005f5267ffffffffffffffff16600452602490565b60029150565b61055e906110c3855467ffffffffffffffff1690565b7feae35725000000000000000000000000000000000000000000000000000000005f5267ffffffffffffffff9081166004524260245216604452606490565b9050611123429161111e6104fe885467ffffffffffffffff1690565b610cd4565b11155f610e87565b7f9b772277000000000000000000000000000000000000000000000000000000005f524260045267ffffffffffffffff9081166024521660445260645ffd5b7f59d119e3000000000000000000000000000000000000000000000000000000005f5260045ffd5b35610b9e81610922565b9035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe181360301821215610195570180359067ffffffffffffffff821161019557602001918160051b3603831361019557565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b9035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe181360301821215610195570180359067ffffffffffffffff82116101955760200191813603831361019557565b9015611282578061127e9161121d565b9091565b6111f0565b335f9081527f4c48d1d2b0f4f7485fc28e3db22341d96a20aa29e6efa8149da9751603abd4e0602052604090205460ff16156112bf57565b7fe2517d3f000000000000000000000000000000000000000000000000000000005f52336004527fbd893629a699470e4ec82a5715bb4981fdaacc5d0a728bf5f55b801d8f4ef10b60245260445ffd5b805f525f60205260ff6113433360405f209073ffffffffffffffffffffffffffffffffffffffff165f5260205260405f2090565b54161561134d5750565b7fe2517d3f000000000000000000000000000000000000000000000000000000005f523360045260245260445ffd5b67ffffffffffffffff168061138e5750565b7f3ce598a9000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b60405190610100820182811067ffffffffffffffff821117610adc57604052606060e0838281528260208201528260408201525f838201525f60808201525f60a08201528260c08201520152565b8051600110156112825760400190565b805160071015611282576101000190565b8051600d1015611282576101c00190565b8051600e1015611282576101e00190565b805160081015611282576101200190565b8051600310156112825760800190565b8051600b1015611282576101800190565b8051600c1015611282576101a00190565b8051600410156112825760a00190565b8051156112825760200190565b8051600210156112825760600190565b805160101015611282576102200190565b80518210156112825760209160051b010190565b67ffffffffffffffff8111610adc5760051b60200190565b90611501826114df565b61150e6040519182610afd565b828152601f1961151e82946114df565b0190602036910137565b90602082519201517fffffffffffffffffffffffffffffffffffffffff00000000000000000000000081169260148110611560575050565b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000929350829060140360031b1b161690565b60405160c091906115a38382610afd565b6005815291601f1901825f5b8281106115bb57505050565b8060606020809385010152016115af565b906115d6826114df565b6115e36040519182610afd565b828152601f196115f382946114df565b01905f5b82811061160357505050565b8060606020809385010152016115f7565b61163061162b6116226113b9565b9280845261259c565b61260b565b602082019080825251600f8110611b0557507f1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d493476116766116708351611407565b516126d6565b03611aca57600161169061168a8351611417565b516125c9565b03611a8f577f63746963616c2062797a616e74696e65206661756c7420746f6c6572616e63656116c36116708351611428565b03611a54576116db6116d58251611439565b516126f2565b80516008811490811591611a24575b506119ea575061162b61175d6116d5836117216117106104fe61168a611762985161144a565b67ffffffffffffffff166060880152565b61172e611670825161145b565b60808701526117576117466104fe61168a845161146b565b67ffffffffffffffff1660a0880152565b5161147c565b61259c565b90604081019180835251600581036119bf57506117886117828351611407565b5161260b565b908151156119975761179a82516114f7565b9360c082019485525f5b8351811015611933576117ba6116d582866114cb565b80516014810361190857506117d16117d791611528565b60601c90565b73ffffffffffffffffffffffffffffffffffffffff811680156118c6575f5b8381106118325750509061182c600192611811838a516114cb565b9073ffffffffffffffffffffffffffffffffffffffff169052565b016117a4565b8161187761185e611844848d516114cb565b5173ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff1690565b14611884576001016117f6565b7f41fe18cc000000000000000000000000000000000000000000000000000000005f5273ffffffffffffffffffffffffffffffffffffffff831660045260245ffd5b7f59bff387000000000000000000000000000000000000000000000000000000005f5273ffffffffffffffffffffffffffffffffffffffff821660045260245ffd5b7f83e46ad2000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b509261178291945061194692505161148d565b61195081516115cc565b9260e081019384525f5b8251811015611991578061198a816119776116d5600195886114cb565b88519061198483836114cb565b526114cb565b500161195a565b50925050565b7f339e1ffb000000000000000000000000000000000000000000000000000000005f5260045ffd5b7f30c6792a000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b611a20906040519182917fd5edd2a500000000000000000000000000000000000000000000000000000000835260048301610934565b0390fd5b7f011b4d03dd8c01f1049143cf9c4c817e4b167f1d1b83e5c6f0f10d89ba1e7bce9150602083012014155f6116ea565b611a6461167061055e9251611428565b7fa19e609c000000000000000000000000000000000000000000000000000000005f52600452602490565b611a9f61168a61055e9251611417565b7ff71b722f000000000000000000000000000000000000000000000000000000005f52600452602490565b611ada61167061055e9251611407565b7fb8120dca000000000000000000000000000000000000000000000000000000005f52600452602490565b7fbc277732000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b67ffffffffffffffff1690815f52600460205260405f209167ffffffffffffffff83541615611b5c5750565b7ff761631b000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b60405190611b96604083610afd565b600182527fc0000000000000000000000000000000000000000000000000000000000000006020830152565b6020611c7d611bcf611592565b611c48611be660408601611bec611be6825161149d565b51612ff9565b611bf58561149d565b52611bff8461149d565b50611c0d611be68251611407565b611c1685611407565b52611c2084611407565b50611c2e611be682516114aa565b611c37856114aa565b52611c41846114aa565b505161145b565b611c518261145b565b52611c5b8161145b565b50611c64611b87565b611c6d8261148d565b52611c778161148d565b506127c8565b910190611c8b8251516115cc565b905f5b83518051821015611ce1579080600192600c82145f14611ccf575050611cb383612880565b611cbd82866114cb565b52611cc881856114cb565b5001611c8e565b611cdc91611be6916114cb565b611cb3565b505050611cee91506127c8565b6020815191012090565b919091611d0583516114f7565b925f5b8151811015611efe57611d1b81836114cb565b51805160418103611ed3575080601b60ff611d6a611d64611d3e611d779661285f565b517fff000000000000000000000000000000000000000000000000000000000000001690565b60f81c90565b1610611e80575b846130a7565b90611d81816128fa565b1590811591611e76575b508015611e58575b611e305773ffffffffffffffffffffffffffffffffffffffff81165f5b838110611dd057505090611dca60019261181183896114cb565b01611d08565b81611de161185e611844848c6114cb565b14611dee57600101611db0565b7f33af0d5f000000000000000000000000000000000000000000000000000000005f5273ffffffffffffffffffffffffffffffffffffffff831660045260245ffd5b7f09cb44e6000000000000000000000000000000000000000000000000000000005f5260045ffd5b5073ffffffffffffffffffffffffffffffffffffffff811615611d93565b905015155f611d8b565b611ec2611e9a611e95611d64611d3e8561285f565b6128e8565b60f81b7fff000000000000000000000000000000000000000000000000000000000000001690565b5f1a611ecd8261285f565b53611d71565b7ff2db9ce1000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b505050565b5f198114610c975760010190565b905f915f5b8151811015611f6a57611f4973ffffffffffffffffffffffffffffffffffffffff611f4183856114cb565b511684612904565b611f56575b600101611f16565b92611f62600191611f03565b939050611f4e565b50506003611f79915404610c89565b90818110611f85575050565b7fe2dcb1b9000000000000000000000000000000000000000000000000000000005f5260045260245260445ffd5b905f198201918211610c9757565b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff408201918211610c9757565b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff808201918211610c9757565b6020039060208211610c9757565b91908203918211610c9757565b905f915f5b815181101561208f5761206e73ffffffffffffffffffffffffffffffffffffffff61206683856114cb565b51168461295b565b61207b575b60010161203b565b92612087600191611f03565b939050612073565b50505190600382048203918211610c97578181106120ab575050565b7f7818f4e4000000000000000000000000000000000000000000000000000000005f5260045260245260445ffd5b6121239261162b9261175d926040517fffffffffffffffffffffffffffffffffffffffff000000000000000000000000602082019260601b168252601481526104d7603482610afd565b805160021015611282576060610b9e9101516126d6565b8054821015611282575f5260205f2001905f90565b919067ffffffffffffffff8061216d855467ffffffffffffffff1690565b92169116149081159161220e575b5061220857600201908154815103612208575f5b8151811015612200576121c56121a5828561213a565b905473ffffffffffffffffffffffffffffffffffffffff9160031b1c1690565b73ffffffffffffffffffffffffffffffffffffffff6121ea61185e61184485876114cb565b9116036121f95760010161218f565b5050505f90565b505050600190565b50505f90565b9050600182015414155f61217b565b805f525f60205260ff6122518360405f209073ffffffffffffffffffffffffffffffffffffffff165f5260205260405f2090565b541661220857805f525f6020526122898260405f209073ffffffffffffffffffffffffffffffffffffffff165f5260205260405f2090565b60017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0082541617905573ffffffffffffffffffffffffffffffffffffffff339216907f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d5f80a4600190565b805f525f60205260ff6123288360405f209073ffffffffffffffffffffffffffffffffffffffff165f5260205260405f2090565b54161561220857805f525f6020526123618260405f209073ffffffffffffffffffffffffffffffffffffffff165f5260205260405f2090565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00815416905573ffffffffffffffffffffffffffffffffffffffff339216907ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b5f80a4600190565b60208151910120604051602081019182527f1260944489272988d9df285149b5aa1b0f48f2136d6f416159f840a3e074760060408201526040815261240f606082610afd565b51902090565b60405190612424602083610afd565b5f808352366020840137565b9061243a82610b31565b6124476040519182610afd565b828152601f1961151e8294610b31565b61162b6124999194939461246b6020610b31565b956124796040519788610afd565b602087526124876020610b31565b601f196020890191013682375261259c565b906124a48451610ce1565b91845115158061257c575b6124b8906125c2565b6124ca6124c55f85612029565b612430565b925f19015f5b8181106124e4575050610b9e939450612acf565b80612566600f612529612560611d64611d3e8d61250360029960011c90565b908d61255a8a6125528a612529612520611d64611d3e8a8a61286f565b60041c600f1690565b1660f81b7fff000000000000000000000000000000000000000000000000000000000000001690565b5f1a9261286f565b5361286f565b60ff1690565b5f1a612575600183018861286f565b53016124d0565b5060016124af565b6040519061259182610ae1565b5f6020838281520152565b6125a4612584565b506020815191604051926125b784610ae1565b835201602082015290565b1561019557565b805180151590816125ff575b5015610195576125e490612da5565b905190602081106125f3575090565b6020036101000a900490565b6021915011155f6125d5565b61261481612dd1565b156101955761262281612df1565b61262b816114df565b916126396040519384610afd565b818352601f19612648836114df565b015f5b8181106126bf575050602061266b91015161266581612e52565b90610cd4565b5f905b82821061267b5750505090565b6126b78161268a600193612ebd565b90612693610b20565b8281528160208201526126a686896114cb565b526126b185886114cb565b50610cd4565b91019061266e565b6020906126ca612584565b8282880101520161264b565b6021815103610195576020015160018101809111610c97575190565b80511561019557612705610b9e91612da5565b61271181939293612430565b928360200190612f86565b805191908290602001825e015f815290565b610b2f9061275061274a9493604051958693602085019061271c565b9061271c565b03601f198101845283610afd565b6001907fff00000000000000000000000000000000000000000000000000000000000000610b9e9493168152019061271c565b916001610b9e94937fff0000000000000000000000000000000000000000000000000000000000000061274a94168152019061271c565b6127d0612415565b905f915b81518310156127fc576127f46001916127ed85856114cb565b519061272e565b9201916127d4565b91505080516038811061283b5750610b9e6128178251613025565b916104c961282b611e9a6125608651610caa565b9160405194859360208501612791565b61284d611e9a612560610b9e93610c9c565b6104c96040519384926020840161275e565b8051604010156112825760600190565b908151811015611282570160200190565b6001815114806128cd575b610b9e578051603881106128bb5750610b9e6128a78251613025565b916104c961282b611e9a6125608651610cc6565b61284d611e9a612560610b9e93610cb8565b50608060ff6128e1611d64611d3e8561149d565b161061288b565b60ff601b9116019060ff8211610c9757565b6004111561029457565b905f5b82548110156121f95773ffffffffffffffffffffffffffffffffffffffff61292f828561213a565b90549060031b1c1673ffffffffffffffffffffffffffffffffffffffff83161461220057600101612907565b905f5b82518110156121f95773ffffffffffffffffffffffffffffffffffffffff61298682856114cb565b511673ffffffffffffffffffffffffffffffffffffffff8316146122005760010161295e565b91906129b88351610ce1565b908351151580612ac5575b6129cc906125c2565b6129d96124c58284612029565b938192600180841614612a63575b5f19869101935b8481106129fc575050505050565b83612a5a6001612a50600f612529612560611d64611d3e8b60029b612a49612a3c886125298f611d64611d3e612a356125209360011c90565b809961286f565b9b8d03809c5f1a9261286f565b538c61286f565b5f1a92018961286f565b530185906129ee565b92507f0f00000000000000000000000000000000000000000000000000000000000000612aa2612560611d64611d3e612a9c8760011c90565b8661286f565b60f81b165f1a612ab18661149d565b535f19612abd83611f03565b9390506129e7565b50818111156129c3565b915f915f612adb612584565b50845115612d6c5790935f915b81518310156101955782158080612d56575b61019557159081612d39575b5061019557612b1861178283836114cb565b948551600281145f14612c155750612b3a612b356116d58861149d565b61313c565b95612b50612b498888846131a9565b8092610cd4565b965111612bf75715612b875750612b679051611fb3565b11610195575111612b7e576116d5610b9e91611407565b50610b9e612415565b919094612b948651611fb3565b82146101955780612bb6612bb2612bac600194611407565b51612dd1565b1590565b15612bd857612bc7612bcd91611407565b5161312e565b915b01919490612ae8565b612be4612bf191611407565b5160208101519051902090565b91612bcf565b505091509250612c08915051611fb3565b1161019557610b9e612415565b929491939192601103612cda5781518314612cbc57612c46612c40612560611d64611d3e878761286f565b93610c89565b92601081101561019557612c63612c5d82896114cb565b51613118565b15612c855750505050612c7891925051611fb3565b0361019557610b9e612415565b86612c9d612bb2612bac84600196989a97999b6114cb565b15612caf57612bf191612bc7916114cb565b612bf191612be4916114cb565b505050612cc99051611fb3565b03610195576116d5610b9e916114ba565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f696e76616c6964206e6f6465206c656e677468000000000000000000000000006044820152606490fd5b9050612d4e612d4884846114cb565b516130e1565b14155f612b06565b50612d64612be485856114cb565b871415612afa565b509050612d9d92507f56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b4219150146125c2565b610b9e612415565b906020820191612db58351612e52565b925190838201809211610c975751928303928311610c97579190565b805115612dec57602060c0910151515f1a1061103757600190565b505f90565b805115612dec575f9060208101908151612e0a81612e52565b8101809111610c9757915190518101809111610c975791905b828110612e305750905090565b612e3981612ebd565b8101809111610c9757612e4c9091611f03565b90612e23565b515f1a6080811015612e6357505f90565b60b881108015612ea7575b15612e795750600190565b60c0811015612e9857610b9e90612e939060b75b90612029565b610c89565b610b9e90612e939060f7612e8d565b5060c08110158015612e6e575060f88110612e6e565b80515f1a906080821015612ed2575050600190565b60b8821015612ee85750612e93610b9e91611fee565b60c0821015612f295760010151602082900360b7016101000a9004017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff4a0190565b60f8821015612f3f5750612e93610b9e91611fc1565b60010151602082900360f7016101000a9004017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0a0190565b601f8111610c97576101000a90565b90918015611efe575b6020811015612fc95780612fa257505050565b612fb6612fb1612fbb9261201b565b612f77565b611fb3565b905182518216911916179052565b91908051825260208101809111610c97579060208101809111610c975791601f19810190811115612f8f57610c5c565b6130038151612430565b9081511561302157806020610b9e9201519051908360200190612f86565b5090565b5f81805b613093575061303781612430565b91815b61304357505090565b61304c82611fb3565b61307e7fff000000000000000000000000000000000000000000000000000000000000008360f81b165f1a918561286f565b5360081c908015610c97575f1901908161303a565b9061309d90611f03565b9060081c80613029565b81519190604183036130d7576130d09250602082015190606060408401519301515f1a9061324d565b9192909190565b50505f9160029190565b805160208110156130f9575060208101519051902090565b906020015120604051602081019182526020815261240f604082610afd565b6001815103612dec5760200151515f1a60801490565b61313790612da5565b902090565b9081511561019557600f613158612520611d64611d3e8661149d565b168061316b5750610b9e60025f936129ac565b600181036131805750610b9e60015f936129ac565b600281036131965750610b9e60026001936129ac565b60030361019557610b9e600180936129ac565b91905f5b838101808211610c97578251811080613243575b1561323b576131f17fff00000000000000000000000000000000000000000000000000000000000000918461286f565b51167fff0000000000000000000000000000000000000000000000000000000000000061321e838661286f565b511690036132345761322f90611f03565b6131ad565b9250505090565b509250505090565b50835182106131c1565b91907f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a084116132dc579160209360809260ff5f9560405194855216868401526040830152606082015282805260015afa156132d1575f5173ffffffffffffffffffffffffffffffffffffffff8116156132c757905f905f90565b505f906001905f90565b6040513d5f823e3d90fd5b5050505f916003919056fea164736f6c634300081c000a","sourceMap":"237:2306:36:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;;;;-1:-1:-1;;237:2306:36;;;;;;;;;;;;;;;2639:47:93;2654:32;237:2306:36;2639:47:93;;:87;;;;;237:2306:36;;;;;;;;;;2639:87:93;844:25:133;829:40;;;2639:87:93;;;237:2306:36;-1:-1:-1;237:2306:36;;;;;-1:-1:-1;;237:2306:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;5705:2265:35;237:2306:36;;;:::i;:::-;-1:-1:-1;237:2306:36;;;;;;;;;;;;23324:42:35;23320:105;;5705:2265;:::i;:::-;237:2306:36;;;;;;;;;;;;;;;:::i;23320:105:35:-;23393:20;;:::i;:::-;5705:2265;:::i;237:2306:36:-;;;;;;;;;;;:::o;:::-;;;;;-1:-1:-1;;237:2306:36;;;;;;;;;3867:6:93;237:2306:36;3867:6:93;237:2306:36;;3867:22:93;237:2306:36;3867:6:93;237:2306:36;3867:22:93;237:2306:36;3776:120:93;;237:2306:36;;;;;;;;-1:-1:-1;;237:2306:36;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;4296:25:93;237:2306:36;;;:::i;:::-;4266:18:93;2475:4;4266:18;;3867:6;237:2306:36;3867:6:93;237:2306:36;;3867:22:93;237:2306:36;3867:6:93;237:2306:36;3867:22:93;237:2306:36;3776:120:93;;4266:18;2475:4;:::i;:::-;4296:25;:::i;:::-;237:2306:36;;;;;;;;:::i;:::-;735:10:121;237:2306:36;;;5387:34:93;5383:102;;5495:37;;;:::i;5383:102::-;5444:30;;;237:2306:36;5444:30:93;;237:2306:36;;;;;-1:-1:-1;;237:2306:36;;;;;;;;;;;;;;;;-1:-1:-1;;237:2306:36;;;;;;;-1:-1:-1;237:2306:36;;;;;;;;;23324:42:35;23320:105;;237:2306:36;9433:31:35;;:16;;;:31;:::i;:::-;;:::i;:::-;9479:9;;;;9499:1;9479:9;;;;:::i;:::-;:21;;;9475:97;;9641:31;237:2306:36;9787:10:35;9705:36;237:2306:36;9728:12:35;:9;9622:51;9641:31;;9787:95;9641:31;;;:::i;:::-;9622:51;:::i;:::-;9728:9;;;:::i;:::-;:12;;:::i;:::-;237:2306:36;;;:::i;:::-;9705:36:35;:::i;:::-;9787:10;;;:::i;237:2306:36:-;9813:26:35;9499:1;9813:26;;237:2306:36;;;;9851:29:35;;;237:2306:36;9851:29:35;;;;237:2306:36;;;;;;;9851:29:35;;-1:-1:-1;;9851:29:35;;;;;;:::i;:::-;237:2306:36;9841:40:35;;9787:95;;:::i;:::-;237:2306:36;;9892:109:35;;237:2306:36;10010:31:35;237:2306:36;;;;;;;;;;;;10010:31:35;237:2306:36;;;;;;;;;;;;;;;;;9892:109:35;9959:29;:20;9939:51;9959:20;;:::i;:::-;:29;:::i;:::-;9939:51;-1:-1:-1;9939:51:35;237:2306:36;;;;;9939:51:35;-1:-1:-1;9939:51:35;9475:97;9523:38;9544:9;;;;:::i;:::-;9523:38;-1:-1:-1;9523:38:35;9499:1;237:2306:36;;;;-1:-1:-1;237:2306:36;;;23320:105:35;23393:20;;:::i;:::-;23320:105;;237:2306:36;;;;;-1:-1:-1;;237:2306:36;;;;;;;;2089:33:35;237:2306:36;;;;;;;;-1:-1:-1;;237:2306:36;;;;;;;;;;;;;;;;-1:-1:-1;;237:2306:36;;;;;;;-1:-1:-1;237:2306:36;;;;;;;;;23324:42:35;23320:105;;237:2306:36;8205:31:35;;:16;;;:31;:::i;:::-;8251:9;;;;8271:1;8251:9;;;;:::i;:::-;:21;;;8247:97;;8357:10;;;;237:2306:36;8357:10:35;;;;:::i;:::-;:23;;;8353:102;;8524:31;237:2306:36;8737:10:35;8658:33;8669:10;8588:36;237:2306:36;8611:12:35;:9;8505:51;8524:31;;8737:95;8524:31;;;:::i;8505:51::-;8611:9;;;:::i;8588:36::-;8669:10;;;:::i;:::-;8658:33;;;;:::i;:::-;8737:10;;;:::i;237:2306:36:-;8763:26:35;8271:1;8763:26;;237:2306:36;;;;8801:29:35;;;237:2306:36;8801:29:35;;;;237:2306:36;;;;;;;8737:95:35;237:2306:36;;8846:20:35;8842:107;;8989:20;:29;:20;;:::i;:29::-;9033:28;;;;9029:116;;237:2306:36;9154:31:35;237:2306:36;;;;;;;9029:116:35;9084:50;-1:-1:-1;9084:50:35;237:2306:36;;;;;-1:-1:-1;9939:51:35;8842:107;8889:49;;;-1:-1:-1;8889:49:35;237:2306:36;;;;;-1:-1:-1;237:2306:36;;;8353:102:35;8403:41;8426:10;;;;:::i;:::-;8403:41;-1:-1:-1;8403:41:35;237:2306:36;;;;;-1:-1:-1;237:2306:36;;;23320:105:35;23393:20;;:::i;:::-;23320:105;;237:2306:36;;;;;;2920:29:93;237:2306:36;;;:::i;:::-;;2920:6:93;237:2306:36;2920:6:93;237:2306:36;;;2920:6:93;237:2306:36;;;;;;;;;;;;;2920:29:93;237:2306:36;;;;;;;;;;;;;;;-1:-1:-1;;237:2306:36;;;;;;;;;;;;;;;;4713:26:93;237:2306:36;;;:::i;:::-;4683:18:93;2475:4;4683:18;;3867:6;237:2306:36;3867:6:93;237:2306:36;;3867:22:93;237:2306:36;3867:6:93;237:2306:36;3867:22:93;237:2306:36;3776:120:93;;2475:4;4713:26;:::i;237:2306:36:-;;;;;;;:::i;:::-;-1:-1:-1;;23363:1:35;237:2306:36;;;;;;;;;23324:42:35;23320:105;;237:2306:36;10175:25:35;23363:1;10175:25;237:2306:36;23363:1:35;10175:25;23320:105;23393:20;;:::i;:::-;23320:105;;237:2306:36;;;;;;;:::o;:::-;-1:-1:-1;;237:2306:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;-1:-1:-1;;237:2306:36;;;;;5517:34:35;237:2306:36;;;;;:::i;5517:34:35:-;237:2306:36;;;;5633:25:35;5605:26;;;237:2306:36;5633:25:35;;237:2306:36;;;;;;;5568:91:35;237:2306:36;5568:91:35;;237:2306:36;;;;;;;;;;;;;;;;;;;-1:-1:-1;237:2306:36;;-1:-1:-1;237:2306:36;;-1:-1:-1;237:2306:36;;;;;;;5568:91:35;;;;;-1:-1:-1;;5568:91:35;;;;;;:::i;:::-;237:2306:36;;;;;;;:::i;:::-;;;;;;;;;;;;5605:26:35;237:2306:36;;;;;;;;;;;;-1:-1:-1;;237:2306:36;;;;;;;;;5120:11:35;237:2306:36;;5109:23:35;;;237:2306:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5109:23:35;;;;;;:::i;237:2306:36:-;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;:::i;:::-;;;;;;;;;;;;;;;:::o;:::-;;;-1:-1:-1;;237:2306:36;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;:::i;:::-;:::o;:::-;;;;;;;;-1:-1:-1;;237:2306:36;;;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;-1:-1:-1;237:2306:36;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;:::i;:::-;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;-1:-1:-1;;237:2306:36;;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;:::o;:::-;;;;;;;;;;;;2219:66:35;237:2306:36;;;;;;;:::o;:::-;;:::i;:::-;22386:4:35;237:2306:36;;;22386:4:35;237:2306:36;;;:::o;:::-;22540:4:35;237:2306:36;;;22540:4:35;237:2306:36;;;:::o;:::-;21713:4:35;237:2306:36;;;21713:4:35;237:2306:36;;;:::o;:::-;21855:4:35;237:2306:36;;;21855:4:35;237:2306:36;;;:::o;:::-;;;;;;;;;;:::o;:::-;;;;;;;;;8605:1:37;237:2306:36;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;237:2306:36;;;-1:-1:-1;237:2306:36;;;;;;;;;;;;;;;;-1:-1:-1;237:2306:36;;;;;;5705:2265:35;5889:40;5705:2265;5889:40;;;;:::i;:::-;5960:18;;;;:33;237:2306:36;5960:18:35;;237:2306:36;;;;;5960:33:35;6034:28;6047:14;;6034:28;:::i;:::-;6076:13;;;;237:2306:36;;;;;;;;;;;6076:18:35;6072:77;;6180:25;237:2306:36;;;;;;;;6162:43:35;;237:2306:36;;;6162:15:35;:43;:::i;:::-;6208:16;;;;237:2306:36;;;;;;;;;6162:62:35;237:2306:36;;;-1:-1:-1;6158:178:35;;-1:-1:-1;;6412:18:35;5960;6412:33;237:2306:36;;;6393:53:35;;237:2306:36;;9622:51:35;:::i;6393:53::-;237:2306:36;;;;;;;;;6473:31:35;;;:139;;;;5705:2265;6456:298;;;6807:25;;7027:79;6807:25;6863:72;6180:25;6791:62;6807:25;;;:::i;:::-;6834:18;;;;6791:62;;:::i;:::-;6902:32;;6863:72;;:::i;:::-;6976:17;;;;;;;;;:::i;:::-;7088;7070:16;237:2306:36;6180:11:35;237:2306:36;;;;;;7070:16:35;;237:2306:36;7088:17:35;;;7027:79;;:::i;:::-;7165:30;237:2306:36;;;;;;;;;;;;7165:15:35;237:2306:36;;;;;;;7165:30:35;7209:37;237:2306:36;;;;;;;7209:37:35;7205:303;;237:2306:36;;6180:25:35;237:2306:36;;;;7601:46:35;237:2306:36;7561:30:35;237:2306:36;;;;;;;;;7561:30:35;237:2306:36;;;;;;;7601:46:35;237:2306:36;;;;;;;;;;;7601:46:35;6180:11;7657:29;;237:2306:36;7741:17:35;7710:28;;237:2306:36;:::i;:::-;;;;;;;6180:25:35;237:2306:36;7773:55:35;;237:2306:36;;;;;;7773:55:35;237:2306:36;;;7773:55:35;7769:141;;7920:43;5960:33;5705:2265;:::o;7769:141::-;7844:55;;237:2306:36;;6180:25:35;237:2306:36;;;;;;;;6180:25:35;237:2306:36;;7844:55:35;5960:33;5705:2265;:::o;7205:303::-;237:2306:36;;7266:95:35;237:2306:36;;;;;;;7343:17:35;;7266:95;;:::i;:::-;7262:175;;7457:40;237:2306:36;;;;;;;;7457:40:35;5960:33;7457:40;237:2306:36;;7165:15:35;237:2306:36;;;;7262:175:35;6180:25;;-1:-1:-1;7381:41:35:o;6456:298::-;6644:99;237:2306:36;;;;;;;;;6644:99:35;5960:33;6644:99;237:2306:36;;;;6644:99:35;237:2306:36;6162:15:35;237:2306:36;;;;;;;;6473:139:35;6162:15;;6524:69;6162:15;237:2306:36;6524:40:35;237:2306:36;;;;;;;6524:40:35;:69;:::i;:::-;:88;;6473:139;;;6158:178;6247:78;5960:33;6247:78;6162:15;6247:78;237:2306:36;;;;;;;;;;;-1:-1:-1;9939:51:35;6072:77;6117:21;5960:33;6117:21;;5960:33;6117:21;237:2306:36;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;:::i;:::-;;;:::o;:::-;;:::i;3165:103:93:-;735:10:121;2920:6:93;237:2306:36;;;;;;;;;;;;3485:23:93;3481:108;;3165:103::o;3481:108::-;3531:47;2920:6;3531:47;735:10:121;3531:47:93;237:2306:36;2089:33:35;237:2306:36;;;2920:6:93;3531:47;3165:103;237:2306:36;2920:6:93;237:2306:36;2920:6:93;237:2306:36;;;2920:29:93;735:10:121;237:2306:36;2920:6:93;237:2306:36;;;;;;;;;;;;;2920:29:93;237:2306:36;;3485:23:93;3481:108;;3165:103;:::o;3481:108::-;3531:47;2920:6;3531:47;735:10:121;3531:47:93;237:2306:36;;;;2920:6:93;3531:47;19876:177:35;237:2306:36;;19957:19:35;19953:94;;19876:177;:::o;19953:94::-;19999:37;19975:1;19999:37;;237:2306:36;;19975:1:35;19999:37;237:2306:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;237:2306:36;;;;-1:-1:-1;237:2306:36;;;;-1:-1:-1;237:2306:36;;;;;;;;;;;:::o;:::-;;;11070:1:35;237:2306:36;;;;;;;:::o;:::-;;;11239:1:35;237:2306:36;;;;;;;:::o;:::-;;;11378:2:35;237:2306:36;;;;;;;:::o;:::-;;;11564:2:35;237:2306:36;;;;;;;:::o;:::-;;;11607:1:35;237:2306:36;;;;;;;:::o;:::-;;;11837:1:35;237:2306:36;;;;;;;:::o;:::-;;;11910:2:35;237:2306:36;;;;;;;:::o;:::-;;;11978:2:35;237:2306:36;;;;;;;:::o;:::-;;;13209:1:35;237:2306:36;;;;;;;:::o;:::-;;;;;;;;;:::o;:::-;;;2043:1;237:2306;;;;;;;:::o;:::-;;;7571:2:37;237:2306:36;;;;;;;:::o;:::-;;;;;;;;;;;;;;;:::o;2219:66:35:-;;;;;;;;;;;:::o;:::-;;;;;:::i;:::-;237:2306:36;;;;;;:::i;:::-;2219:66:35;;;-1:-1:-1;;2219:66:35;;;;:::i;:::-;;;;;;;;:::o;:::-;;237:2306:36;;;;;2219:66:35;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;237:2306:36;2219:66:35;;;:::o;:::-;237:2306:36;;2219:66:35;;237:2306:36;;2219:66:35;237:2306:36;;:::i;:::-;1849:1;2219:66:35;;;-1:-1:-1;;2219:66:35;;-1:-1:-1;2219:66:35;;;;;;;;;:::o;:::-;;237:2306:36;2219:66:35;;;;;;;;;;;;;;;:::i;:::-;237:2306:36;;;;;;:::i;:::-;2219:66:35;;;-1:-1:-1;;2219:66:35;;;;:::i;:::-;;;-1:-1:-1;2219:66:35;;;;;;;;;:::o;:::-;;237:2306:36;2219:66:35;;;;;;;;;;10709:2705;10875:30;:21;237:2306:36;;:::i;:::-;10816:28:35;;;;10875:21;:::i;:::-;:30;:::i;:::-;10854:18;;;:51;;;;237:2306:36;10947:2:35;10919:30;;10915:114;;11051:18;2401:66;11051:36;:21;:18;;:21;:::i;:::-;;:36;:::i;:::-;11043:66;11039:168;;11070:1;11220:30;:21;:18;;:21;:::i;:::-;;:30;:::i;:::-;:35;11216:122;;2219:66;11359:37;:22;:18;;:22;:::i;:37::-;11351:67;11347:167;;11545:32;:22;:18;;:22;:::i;:::-;;:32;:::i;:::-;237:2306:36;;11607:1:35;11591:17;;;;;:73;;;10709:2705;11587:130;;;11750:18;12025:21;11959:32;:22;11750:18;11727:54;11743:38;11750:30;:21;12025:30;11750:18;;:21;:::i;11743:38::-;237:2306:36;;11727:13:35;;;2219:66;;11727:54;11818:36;:21;:18;;:21;:::i;:36::-;11791:16;;;2219:66;11865:58;11884:39;11891:31;:22;:18;;:22;:::i;11884:39::-;237:2306:36;;11865:16:35;;;2219:66;;11865:58;11959:18;:22;:::i;:32::-;12025:21;:::i;:30::-;12001:21;;;;:54;;;;237:2306:36;12101:1:35;12069:33;;12065:123;;12242:21;:33;:24;:21;;:24;:::i;:::-;;:33;:::i;:::-;237:2306:36;;;12289:26:35;12285:83;;12398:36;237:2306:36;;12398:36:35;:::i;:::-;12378:17;;;;:56;;;-1:-1:-1;12491:3:35;237:2306:36;;12464:25:35;;;;;12540:27;:17;;;;:::i;:27::-;237:2306:36;;12610:2:35;12585:27;;12581:125;;12748:23;;12740:32;12748:23;;:::i;:::-;2219:66;;;;12740:32;237:2306:36;;;12790:23:35;;12786:103;;-1:-1:-1;12922:5:35;;;;;;13095:17;;;:32;11070:1;13095:17;:32;:17;;;:32;:::i;:::-;2219:66;237:2306:36;;2219:66:35;;;13095:32;2219:66;12449:13;;12929:3;12956:17;:33;:20;;:17;;;:20;:::i;:::-;237:2306:36;;;;;12956:20:35;237:2306:36;;;;12956:33:35;;12952:116;;11070:1;2219:66;12907:13;;12952:116;13020:29;-1:-1:-1;13020:29:35;237:2306:36;;;12840:34:35;237:2306:36;2219:66:35;-1:-1:-1;9939:51:35;12786:103;12840:34;-1:-1:-1;12840:34:35;237:2306:36;;;12840:34:35;237:2306:36;2219:66:35;-1:-1:-1;9939:51:35;12581:125;12639:52;-1:-1:-1;12639:52:35;237:2306:36;;;-1:-1:-1;9939:51:35;12464:25;;;13187:24;12464:25;;;13187:33;12464:25;;13187:21;:24;:::i;:33::-;13251:29;237:2306:36;;13251:29:35;:::i;:::-;13230:18;;;;:50;;;-1:-1:-1;13332:3:35;237:2306:36;;13310:20:35;;;;;13375:12;13351:46;13375:12;:22;:12;11070:1;13375:12;;;:::i;:22::-;13351:18;;:46;;;;;:::i;:::-;;;:::i;:::-;;2219:66;13295:13;;13310:20;;;;;10709:2705::o;12285:83::-;12338:19;-1:-1:-1;12338:19:35;;-1:-1:-1;12338:19:35;12065:123;12125:52;-1:-1:-1;12125:52:35;237:2306:36;;;-1:-1:-1;9939:51:35;11587:130;11687:19;237:2306:36;;;11687:19:35;;;;;;;;;;:::i;:::-;;;;11591:73;11632:32;237:2306:36;;10854:18:35;237:2306:36;;11612:16:35;:52;;11591:73;;;11347:167;11464:37;:22;11441:62;11464:18;;:22;:::i;:37::-;11441:62;-1:-1:-1;11441:62:35;237:2306:36;;;;;11216:122:35;11296:30;:21;11278:49;11296:18;;:21;:::i;:30::-;11278:49;-1:-1:-1;11278:49:35;237:2306:36;;;;;11039:168:35;11158:36;:21;11132:64;11158:18;;:21;:::i;:36::-;11132:64;-1:-1:-1;11132:64:35;237:2306:36;;;;;10915:114:35;10972:46;10816:16;10972:46;237:2306:36;;;-1:-1:-1;9939:51:35;19455:292;237:2306:36;;;;-1:-1:-1;237:2306:36;19595:15:35;237:2306:36;;;-1:-1:-1;237:2306:36;;;;;;19640:29:35;19636:105;;19455:292;:::o;19636:105::-;19692:38;-1:-1:-1;19692:38:35;19595:15;237:2306:36;;-1:-1:-1;19692:38:35;237:2306:36;;;;;;;;:::i;:::-;;;;;;;;;:::o;1703:838::-;2264:18;2187:26;1837:14;;:::i;:::-;21300:17:35;2086:24:36;1891:21;;;21300:17:35;1891:24:36;:21;;:24;:::i;:::-;;21300:17:35;:::i;:::-;1861:55:36;;;:::i;:::-;;;;;:::i;:::-;;21300:17:35;1956:24:36;:21;;:24;:::i;21300:17:35:-;1926:55:36;;;:::i;:::-;;;;;:::i;:::-;;21300:17:35;2021:24:36;:21;;:24;:::i;21300:17:35:-;1991:55:36;;;:::i;:::-;;;;;:::i;:::-;;2086:21;:24;:::i;21300:17:35:-;2056:55:36;;;:::i;:::-;;;;;:::i;:::-;;2121:23;;:::i;:::-;;;;:::i;:::-;2219:66:35;2121:23:36;;;:::i;:::-;;2187:26;:::i;:::-;2264:18;;;2252:38;2264:18;;237:2306;2252:38;:::i;:::-;2305:13;1913:1;2351:3;2324:18;;237:2306;;2320:29;;;;;2387:82;;1978:1;2387:82;2392:2;2387:7;;:82;2392:2;;;2397:33;;;;;:::i;:::-;2370:99;;;;:::i;:::-;;;;;;:::i;:::-;;2219:66:35;2305:13:36;;2387:82;21300:17:35;2447:21:36;;;;:::i;21300:17:35:-;2387:82:36;;2320:29;;;;2506:27;2320:29;;2506:27;:::i;:::-;2264:18;237:2306;;;;2496:38;1703:838;:::o;14731:509:35:-;;;;14863:27;237:2306:36;;14863:27:35;:::i;:::-;14905:13;14917:1;14938:3;237:2306:36;;14920:16:35;;;;;14997:8;;;;:::i;:::-;;237:2306:36;;15558:2:35;15543:17;;15539:95;;15653:8;;15665:2;237:2306:36;15647:15:35;15653:8;;15808:30;15653:8;;:::i;:::-;237:2306:36;;;;;15653:8:35;237:2306:36;;;;15647:15:35;237:2306:36;15647:20:35;15643:90;;14938:3;15808:30;;:::i;:::-;237:2306:36;;;;:::i;:::-;15852:33:35;;;;:64;;;14938:3;15852:88;;;;;14938:3;15848:145;;237:2306:36;;;14917:1:35;15040:5;;;;;;15204:19;;;;2219:66;15204:19;;;;;:::i;:::-;2219:66;14905:13;;15047:3;15074:10;:20;:10;;;;;:::i;:20::-;;15070:107;;2219:66;;15025:13;;15070:107;15125:33;14917:1;15125:33;237:2306:36;;;12840:34:35;237:2306:36;2219:66:35;-1:-1:-1;9939:51:35;15848:145;15963:19;14917:1;15963:19;;14917:1;15963:19;15852:88;237:2306:36;;;;15920:20:35;15852:88;;:64;15889:27;;;;15852:64;;;15643:90;15694:28;15701:20;:15;15707:8;;;;:::i;15701:15::-;:20;:::i;:::-;237:2306:36;;;;;;15694:28:35;14917:1;15683:39;;;;:::i;:::-;;15643:90;;15539:95;15583:40;14917:1;15583:40;237:2306:36;;;-1:-1:-1;9939:51:35;14920:16;;;;14731:509::o;237:2306:36:-;-1:-1:-1;;237:2306:36;;;;;;;:::o;16229:544:35:-;;16414:1;16430:13;16414:1;16465:3;237:2306:36;;16445:18:35;;;;;16488:47;237:2306:36;16524:10:35;;;;:::i;:::-;237:2306:36;;16488:47:35;;:::i;:::-;16484:94;;16465:3;2219:66;;16430:13;;16484:94;16555:8;;2219:66;16555:8;;:::i;:::-;16484:94;;;;;16445:18;;;16644:1;16617:32;16445:18;237:2306:36;;16617:32:35;:::i;:::-;16663:17;;;;16659:108;;16229:544;;:::o;16659:108::-;16703:53;16414:1;16703:53;237:2306:36;;;;;16414:1:35;16703:53;237:2306:36;;-1:-1:-1;;237:2306:36;;;;;;;:::o;:::-;;;;;;;;;;:::o;:::-;;;;;;;;;;:::o;:::-;;;;;;;;;:::o;:::-;;;;;;;;;;:::o;16996:549:35:-;;17123:1;17139:13;17123:1;17174:3;237:2306:36;;17154:18:35;;;;;17197:39;237:2306:36;17225:10:35;;;;:::i;:::-;237:2306:36;;17197:39:35;;:::i;:::-;17193:86;;17174:3;2219:66;;17139:13;;17193:86;17256:8;;2219:66;17256:8;;:::i;:::-;17193:86;;;;;17154:18;;;237:2306:36;;17428:1:35;237:2306:36;;;;;;;;;17443:17:35;;;17439:100;;16996:549;;:::o;17439:100::-;17483:45;17123:1;17483:45;237:2306:36;;;;;17123:1:35;17483:45;13709:440;14055:31;13709:440;14055:22;13709:440;13927:76;13709:440;237:2306:36;;;13976:25:35;;;237:2306:36;;;;;;13976:25:35;;;;;;;:::i;14055:31::-;237:2306:36;;14124:1:35;237:2306:36;;;;;14111:30:35;237:2306:36;;14111:15:35;:30;:::i;237:2306:36:-;;;;;;;;-1:-1:-1;237:2306:36;;-1:-1:-1;237:2306:36;;;-1:-1:-1;237:2306:36;:::o;18568:677:35:-;;;237:2306:36;;;;;;;;;;;;;;18815:37:35;;;;:82;;;18568:677;18811:125;;;18949:25;;237:2306:36;;;;;18949:53:35;18945:96;;237:2306:36;19093:3:35;237:2306:36;;19070:21:35;;;;;237:2306:36;19116:28:35;;;;:::i;:::-;237:2306:36;;;;;;;;;;;;19116:45:35;19148:13;;;;;:::i;19116:45::-;237:2306:36;;19116:45:35;19112:96;;2219:66;;19055:13;;19112:96;19181:12;;;237:2306:36;19181:12:35;:::o;19070:21::-;;;;2219:66;18568:677;:::o;18945:96::-;19018:12;;237:2306:36;19018:12:35;:::o;18815:82::-;18856:26;;;;;237:2306:36;18856:41:35;;18815:82;;;6145:316:93;237:2306:36;;;;;;;2920:29:93;237:2306:36;;;;;;;;;;;;;;;;2920:29:93;237:2306:36;;;;;;;;;;6281:29:93;237:2306:36;;;;;;;;;;;;;;;;6281:29:93;6313:4;237:2306:36;;;;;;;;735:10:121;237:2306:36;;6336:40:93;;237:2306:36;6336:40:93;;6313:4;6390:11;:::o;6698:317::-;237:2306:36;;;;;;;2920:29:93;237:2306:36;;;;;;;;;;;;;;;;2920:29:93;237:2306:36;;;;;;;;;;;6834:29:93;237:2306:36;;;;;;;;;;;;;;;;6834:29:93;237:2306:36;;;;;;;735:10:121;237:2306:36;;6890:40:93;;237:2306:36;6890:40:93;;237:2306:36;6944:11:93;:::o;14333:174:35:-;237:2306:36;;;;;14457:18:35;237:2306:36;;;14446:53:35;;237:2306:36;;;2612:66:35;237:2306:36;;;;;14446:53:35;;;;;;:::i;:::-;237:2306:36;14436:64:35;;14333:174;:::o;237:2306:36:-;;;;;;;;:::i;:::-;22179:1:35;237:2306:36;;;2219:66:35;237:2306:36;;;2219:66:35;237:2306:36:o;:::-;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;-1:-1:-1;;237:2306:36;;;;:::i;1287:390:37:-;1607:20;:29;1287:390;;;;237:2306:36;1508:2:37;237:2306:36;:::i;:::-;;;;;;;;:::i;:::-;1508:2:37;237:2306:36;;;1508:2:37;237:2306:36;:::i;:::-;-1:-1:-1;;1508:2:37;237:2306:36;;;;2219:66:35;;;1521:63:37;1607:20;:::i;:29::-;1648:21;8593:13;237:2306:36;;8593:13:37;:::i;:::-;237:2306:36;;;8624:13:37;;:33;;;1287:390;8616:42;;;:::i;:::-;8679:26;8689:15;-1:-1:-1;8689:15:37;;:::i;:::-;8679:26;:::i;:::-;8715:18;-1:-1:-1;;237:2306:36;1667:1:37;8901:14;;;;;;1600:70;;;;;;;:::i;8917:6::-;8982:5;9046:37;8998:3;9054:21;:16;9060:9;;8982:5;;8605:1;8982:5;237:2306:36;;;;8982:5:37;8979:9;;8943:59;8979:9;8965:37;8979:9;8973:21;:16;8979:9;;;;;:::i;8973:16::-;237:2306:36;;;;;;8973:21:37;8972:29;237:2306:36;;;;;;8965:37:37;1667:1;8943:59;;;:::i;:::-;;9060:9;:::i;9054:16::-;237:2306:36;;;;9046:37:37;1667:1;9020:63;;8756:1;237:2306:36;;9020:63:37;;:::i;:::-;;237:2306:36;8894:204:37;;8624:33;-1:-1:-1;8641:16:37;8624:33;;237:2306:36;;;;;;;:::i;:::-;-1:-1:-1;237:2306:36;;;;;;;:::o;2457:221:38:-;237:2306:36;;:::i;:::-;;2568:58:38;237:2306:36;;;;;;;;;:::i;:::-;2219:66:35;;2568:58:38;;2643:28;;2219:66:35;2457:221:38;:::o;237:2306:36:-;;;;:::o;7796:439:38:-;237:2306:36;;7883:12:38;;;:30;;;;7796:439;237:2306:36;;;;7957:21:38;;;:::i;:::-;7989:14;8013:192;;;;;;;8215:13;7796:439;:::o;8013:192::-;;;;;;;7796:439;:::o;7883:30::-;7911:2;7899:14;;;;7883:30;;;4170:519;4266:12;;;:::i;:::-;237:2306:36;;;4306:14:38;;;:::i;:::-;2219:66:35;;;:::i;:::-;237:2306:36;;;;;;;:::i;:::-;2219:66:35;;;-1:-1:-1;;237:2306:36;;;:::i;:::-;;-1:-1:-1;237:2306:36;;;;;;4404:11:38;;237:2306:36;4404:41:38;:11;;237:2306:36;4418:27:38;;;:::i;:::-;4404:41;;:::i;:::-;-1:-1:-1;4480:179:38;4500:9;;;;;;4669:13;;;4170:519;:::o;4511:3::-;4632:16;4540:19;;2219:66:35;4540:19:38;;:::i;:::-;237:2306:36;;;:::i;:::-;2219:66:35;;;4585:24:38;237:2306:36;4585:24:38;;2219:66:35;4573:36:38;;;;:::i;:::-;;;;;;:::i;:::-;;4632:16;:::i;:::-;4511:3;2219:66:35;4485:13:38;;;237:2306:36;;;;;:::i;:::-;;;;;;;;;;8413:298:38;8545:2;237:2306:36;;8533:14:38;237:2306:36;;8600:11:38;;237:2306:36;8614:1:38;237:2306:36;;;;;;;8625:56:38;8413:298;:::o;8857:379::-;237:2306:36;;8950:12:38;237:2306:36;;9006:21:38;9202:3;9006:21;;:::i;:::-;9059:14;;;;;;:::i;:::-;9109:61;;;;9202:3;;:::i;237:2306:36:-;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;:::i;:::-;;;:::i;:::-;;-1:-1:-1;;237:2306:36;;;;;;:::i;:::-;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;22053:538:35:-;22169:12;;:::i;:::-;22196:13;22179:1;22191:109;22229:3;237:2306:36;;22211:16:35;;;;;22258:31;2219:66;22280:8;;;;;:::i;:::-;;22258:31;;:::i;:::-;22229:3;2219:66;22196:13;;;22211:16;;;;237:2306:36;;22331:2:35;22314:19;;22310:120;;237:2306:36;22510:74:35;22464:29;237:2306:36;;22464:29:35;:::i;:::-;237:2306:36;22510:74:35;22527:37;22534:29;22540:22;237:2306:36;;22540:22:35;:::i;22527:37::-;237:2306:36;;;22510:74:35;;;;;;;:::i;22310:120::-;22373:36;22380:28;22386:21;22356:63;22386:21;;:::i;22373:36::-;22356:63;237:2306:36;;22356:63:35;;;;;;;:::i;237:2306:36:-;;;15658:2:35;237:2306:36;;;;;;;:::o;:::-;;;;;;;;;;;;;:::o;21462:440:35:-;21570:1;237:2306:36;;21556:15:35;:39;;;21462:440;21552:80;;237:2306:36;;21658:2:35;21645:15;;21641:108;;237:2306:36;21825:70:35;21783:25;237:2306:36;;21783:25:35;:::i;:::-;237:2306:36;21825:70:35;21842:37;21849:29;21855:22;237:2306:36;;21855:22:35;:::i;21641:108::-;21700:32;21707:24;21713:17;21683:55;21713:17;;:::i;21556:39::-;21581:6;21591:4;237:2306:36;21575:13:35;21581:6;;;;:::i;21575:13::-;237:2306:36;21575:20:35;21556:39;;237:2306:36;;;;;;;;;;;;:::o;:::-;;-1:-1:-1;237:2306:36;;;:::o;20273:284:35:-;;237:2306:36;20427:3:35;237:2306:36;;20404:21:35;;;;;237:2306:36;20450:13:35;;;;:::i;:::-;237:2306:36;;;;;;;;;;20450:23:35;20446:73;;2219:66;;20389:13;;20775:282;;237:2306:36;20927:3:35;237:2306:36;;20904:21:35;;;;;237:2306:36;20950:13:35;;;;:::i;:::-;237:2306:36;;;;;20950:23:35;20946:73;;2219:66;;20889:13;;8465:649:37;;;8593:13;237:2306:36;;8593:13:37;:::i;:::-;237:2306:36;;;8624:13:37;;:33;;;8465:649;8616:42;;;:::i;:::-;8679:26;8689:15;;;;:::i;8679:26::-;8715:18;;8747:10;8756:1;8747:10;;;:15;8743:118;;8465:649;-1:-1:-1;;237:2306:36;;;8894:204:37;8901:14;;;;;;8465:649;;;;;:::o;8917:6::-;8982:5;9020:63;8756:1;9046:37;8998:3;9054:21;:16;9060:9;;8982:5;8605:1;8982:5;8943:59;8965:37;8982:5;8973:21;8982:5;8979:9;;8982:5;8973:16;8982:5;237:2306:36;;;;8982:5:37;8979:9;;;:::i;8965:37::-;237:2306:36;;;8943:59:37;;8636:1;8943:59;;;:::i;:::-;;9060:9;;:::i;9046:37::-;8636:1;9020:63;237:2306:36;;9020:63:37;;:::i;:::-;;237:2306:36;8894:204:37;;;;8743:118;8808:10;;237:2306:36;8799:26:37;:21;8805:14;;8808:10;;237:2306:36;;;;8808:10:37;8805:14;;:::i;8799:26::-;237:2306:36;;;8636:1:37;8778:55;;;;:::i;:::-;;-1:-1:-1;;8847:3:37;;;:::i;:::-;8743:118;;;;;8624:33;-1:-1:-1;8641:16:37;;;;8624:33;;2316:5431;;2546:1;2557:33;2546:1;237:2306:36;;:::i;:::-;;;;2689:17:37;2685:223;;2976:13;;2546:1;2971:4724;3009:3;237:2306:36;;2991:16:37;;;;;3091:6;;;;:50;;3009:3;3087:97;;3298:6;:47;;;;3009:3;3294:94;;;3514:17;:8;;;;:::i;:17::-;237:2306:36;;;3565:1:37;3550:16;;3546:4139;3565:1;;;3744:7;3716:46;3744:17;:7;;;:::i;:17::-;3716:46;:::i;:::-;3804:56;3878:28;3804:56;;;;;:::i;:::-;3878:28;;;:::i;:::-;237:2306:36;;-1:-1:-1;3925:994:37;;4937:1185;;;237:2306:36;5015:16:37;237:2306:36;;5015:16:37;:::i;:::-;-1:-1:-1;5007:144:37;;237:2306:36;-1:-1:-1;5173:109:37;;5315:7;5351:18;5315:7;;:::i;5173:109::-;5247:12;;;:::i;4937:1185::-;237:2306:36;;;5494:16:37;237:2306:36;;5494:16:37;:::i;:::-;5489:21;;5485:138;;5650:7;5649:17;5650:16;:7;2219:66:35;5650:7:37;;:::i;:::-;;:16;:::i;:::-;5649:17;;237:2306:36;5649:17:37;5650:7;;;5837;:26;:7;;:::i;:::-;;:26;:::i;:::-;5645:459;;2219:66:35;2976:13:37;;;;;5645:459;6054:7;:27;:7;;:::i;:::-;;5445:11:38;;;237:2306:36;;;5522:62:38;;5341:272;;6054:27:37;5645:459;;;3925:994;237:2306:36;;;;;;4718:16:37;237:2306:36;;;4718:16:37;:::i;:::-;-1:-1:-1;4710:149:37;;4888:12;;:::i;3546:4139::-;6146:17;;;;;;6161:2;6146:17;6161:2;;237:2306:36;;6219:36:37;;6235:20;;6451:17;6386:43;6394:34;6400:27;;;;;:::i;6386:43::-;6451:17;;:::i;:::-;6494:12;6504:2;6494:12;;;6490:146;;6662:33;6682:12;;;;:::i;:::-;;6662:33;:::i;:::-;6682:12;;;237:2306:36;;;;6766:16:37;237:2306:36;;;;6766:16:37;:::i;:::-;6761:21;6757:157;;6947:12;;:::i;6658:555::-;6993:12;6992:22;6993:21;:12;;2219:66:35;6993:12:37;;;;;;;:::i;6992:22::-;6993:12;;;7057:31;:12;;;;:::i;6988:225::-;7158:32;:12;;;;:::i;6215:1388::-;237:2306:36;;;7411:16:37;237:2306:36;;7411:16:37;:::i;:::-;7406:21;7402:135;;7566:8;:18;:8;;:::i;6142:1543::-;237:2306:36;;7641:29:37;;;237:2306:36;7641:29:37;;;237:2306:36;;;;;;;;;;;;;11687:19:35;3298:47:37;3336:8;;3324:21;3336:8;;;;:::i;:::-;;3324:21;:::i;:::-;3308:37;;3298:47;;;3091:50;3113:8;:28;:8;;;;:::i;:28::-;3101:40;;;3091:50;;2685:223;2785:78;;;2777:87;2785:78;;2797:66;2785:78;;;2777:87;:::i;:::-;2885:12;;:::i;3469:281:38:-;;3598:11;;;237:2306:36;3583:27:38;237:2306:36;;3583:27:38;:::i;:::-;237:2306:36;;;;;;;;;;;;;;;;;;;;3723:20:38;3469:281;:::o;4838:321::-;237:2306:36;;4918:13:38;4914:31;;4994:11;868:4;4994:11;;237:2306:36;5015:64:38;237:2306:36;5015:64:38;5093:24;5089:42;;5148:4;4838:321;:::o;4914:31::-;4933:12;237:2306:36;4933:12:38;:::o;9434:424::-;237:2306:36;;9518:13:38;9514:27;;237:2306:36;9597:11:38;;;;237:2306:36;;;9611:27:38;;;:::i;:::-;237:2306:36;;;;;;;;;;;;;;;;;;9697:132:38;;9704:16;;;;;;9839:12;;;9434:424;:::o;9697:132::-;9756:20;;;:::i;:::-;237:2306:36;;;;;;;9811:7:38;9736:40;9811:7;;:::i;:::-;9697:132;;;11485:581;11589:64;237:2306:36;11589:64:38;682:4;11667:26;;682:4;;;11709:8;237:2306:36;11709:8:38;:::o;11663:397::-;776:4;11738:25;;:83;;;;11663:397;11734:326;;;11837:8;11844:1;11837:8;:::o;11734:326::-;868:4;11866:24;;868:4;;;11943:35;;:31;;958:4;11943:31;;;:::i;:::-;:35;:::i;11862:198::-;12016:33;;:29;;958:4;12016:29;237:2306:36;11738:83:38;11768:25;868:4;11768:25;;;:52;;11738:83;11768:52;11797:23;958:4;11797:23;;11738:83;;10045:1263;10171:64;;-1:-1:-1;10171:64:38;;682:4;10249:26;;682:4;;;10291:11;;10301:1;10045:1263;:::o;10245:1032::-;776:4;10323:25;;776:4;;;10374:26;;:30;:26;;:::i;10319:958::-;868:4;10425:24;;868:4;;;10465:385;;;;;;;;;;;;;;;;237:2306:36;:::o;10421:856:38:-;958:4;10870:23;;958:4;;;10919:24;;:28;:24;;:::i;10866:411::-;10978:289;;;;;;;;;;;;;;;;237:2306:36;:::o;1035:2:38:-;;;;;;;;;:::o;12279:770::-;;;12360:8;;12356:21;;12441:16;1035:2;12441:16;;;;;12642:7;12638:405;;12279:770;;;:::o;12638:405::-;12764:24;12772:15;12764:28;12772:15;;:::i;:::-;12764:24;:::i;:::-;:28;:::i;:::-;12806:227;;;;;;;;;;;;12279:770::o;12459:16::-;12491:65;;;;;;1035:2;237:2306:36;;;;;;;12600:17:38;1035:2;237:2306:36;;;;;;;12459:16:38;-1:-1:-1;;237:2306:36;;;;;;12434:194:38;237:2306:36;;:::i;6262:337:38:-;6372:19;237:2306:36;;6372:19:38;:::i;:::-;237:2306:36;;;6405:18:38;6401:37;;6542:11;6470:57;6560:8;6542:11;;237:2306:36;;;6470:57:38;;;;6560:8;;:::i;6401:37::-;6425:13;;:::o;22754:430:35:-;-1:-1:-1;22839:19:35;;22899:8;;;22994:17;;;;:::i;:::-;23021:11;23042:116;23067:5;;;23167:10;;22754:430;:::o;23074:3::-;23097:5;;;:::i;:::-;23093:31;237:2306:36;;;;;-1:-1:-1;23093:31:35;;;;:::i;:::-;;237:2306:36;;23074:3:35;237:2306:36;;;;-1:-1:-1;;237:2306:36;23047:18:35;;;;22892:73;22923:8;;;;:::i;:::-;237:2306:36;22953:1:35;237:2306:36;22892:73:35;;;2419:778:131;237:2306:36;;;2419:778:131;2609:2;2589:22;;2609:2;;3041:25;2825:196;;;;;;;;;;;;;;;-1:-1:-1;2825:196:131;3041:25;;:::i;:::-;3034:32;;;;;:::o;2585:606::-;3097:83;;3113:1;3097:83;3117:35;3097:83;;:::o;10983:270:37:-;237:2306:36;;11094:2:37;11082:14;;11094:2;;;5445:11:38;11094:2:37;5445:11:38;;237:2306:36;;;5522:62:38;;11112:32:37;:::o;11078:169::-;5445:11:38;11094:2:37;5445:11:38;237:2306:36;5522:62:38;237:2306:36;;11094:2:37;11192:43;;237:2306:36;;;11094:2:37;11192:43;;;237:2306:36;11192:43:37;;:::i;7932:335::-;8047:1;237:2306:36;;8035:13:37;8031:56;;8130:11;;237:2306:36;8151:60:37;237:2306:36;8151:60:37;8232:4;8227:9;;7932:335::o;5788:270:38:-;5909:21;5788:270;5909:21;:::i;:::-;5964:65;;5788:270;:::o;9355:729:37:-;;237:2306:36;;9485:13:37;237:2306:36;;9551:3:37;9531:17;:12;9537:5;;;;:::i;9531:17::-;:23;9596:16;;;9628:10;10051:25;9637:1;237:2306:36;9592:434:37;10051:25;:::i;9592:434::-;9702:1;9687:16;;9702:1;;9719:10;10051:25;9702:1;237:2306:36;9683:343:37;10051:25;:::i;9683:343::-;9793:1;9778:16;;9793:1;;9810:10;10051:25;9793:1;9702;9774:252;10051:25;:::i;9774:252::-;9883:1;9868:16;9883:1;;10051:25;9702:1;9924:13;9864:162;10051:25;:::i;10366:320::-;;;237:2306:36;10561:3:37;237:2306:36;;;;;;;;;;10518:24:37;;:41;;;10561:3;10518:41;;;10584:16;237:2306:36;;10584:16:37;;:::i;:::-;237:2306:36;;;10604:5:37;;;;:::i;:::-;237:2306:36;;10584:25:37;;10580:72;;10561:3;;;:::i;:::-;10511:151;;10580:72;10629:8;;;;;:::o;10518:41::-;;;;;;10366:320;:::o;10518:41::-;237:2306:36;;;10546:13:37;;10518:41;;7129:1551:131;;;8209:66;8196:79;;8192:164;;237:2306:36;;;;;;-1:-1:-1;237:2306:36;;;;;;;;;;;;;;;;;;;8467:24:131;;;;;;;;;-1:-1:-1;8467:24:131;237:2306:36;;;8505:20:131;8501:113;;8624:49;-1:-1:-1;8624:49:131;-1:-1:-1;7129:1551:131;:::o;8501:113::-;8541:62;-1:-1:-1;8541:62:131;8467:24;8541:62;-1:-1:-1;8541:62:131;:::o;8467:24::-;237:2306:36;;;;;;;;;8192:164:131;8291:54;;;8307:1;8291:54;8311:30;8291:54;;:::o","linkReferences":{}},"methodIdentifiers":{"DEFAULT_ADMIN_ROLE()":"a217fddf","PROOF_SUBMITTER_ROLE()":"5972185a","getClientState()":"ef913a4b","getConsensusState(uint64)":"edce8bdc","getRoleAdmin(bytes32)":"248a9ca3","grantRole(bytes32,address)":"2f2ff15d","hasRole(bytes32,address)":"91d14854","misbehaviour(bytes)":"ddba6537","renounceRole(bytes32,address)":"36568abe","revokeRole(bytes32,address)":"d547741f","supportsInterface(bytes4)":"01ffc9a7","updateClient(bytes)":"0bece356","verifyMembership((bytes,(uint64,uint64),bytes[],bytes))":"682ed5f0","verifyNonMembership((bytes,(uint64,uint64),bytes[]))":"4d6d9ffb"},"rawMetadata":"{\"compiler\":{\"version\":\"0.8.28+commit.7893614a\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"ibcRouter\",\"type\":\"address\"},{\"internalType\":\"uint64\",\"name\":\"initialTrustedHeight\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"initialTrustedTimestamp\",\"type\":\"uint64\"},{\"internalType\":\"bytes32\",\"name\":\"initialTrustedStorageRoot\",\"type\":\"bytes32\"},{\"internalType\":\"address[]\",\"name\":\"initialTrustedValidators\",\"type\":\"address[]\"},{\"internalType\":\"uint64\",\"name\":\"trustingPeriod\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"maxClockDrift\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"roleManager\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"AccessControlBadConfirmation\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"internalType\":\"bytes32\",\"name\":\"neededRole\",\"type\":\"bytes32\"}],\"name\":\"AccessControlUnauthorizedAccount\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"revisionHeight\",\"type\":\"uint64\"}],\"name\":\"ConflictingConsensusState\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"trustedTimestamp\",\"type\":\"uint64\"},{\"internalType\":\"uint256\",\"name\":\"currentTimestamp\",\"type\":\"uint256\"},{\"internalType\":\"uint64\",\"name\":\"trustingPeriod\",\"type\":\"uint64\"}],\"name\":\"ConsensusStateExpired\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"revisionHeight\",\"type\":\"uint64\"}],\"name\":\"ConsensusStateNotFound\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"signer\",\"type\":\"address\"}],\"name\":\"DuplicateCommitSealSigner\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"validator\",\"type\":\"address\"}],\"name\":\"DuplicateValidator\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"EmptyValidatorSet\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"currentTimestamp\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"headerTimestamp\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxClockDrift\",\"type\":\"uint256\"}],\"name\":\"HeaderFromFuture\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"actual\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"required\",\"type\":\"uint256\"}],\"name\":\"InsufficientTrustedValidatorOverlap\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"actual\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"required\",\"type\":\"uint256\"}],\"name\":\"InsufficientValidatorQuorum\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidCommitSeal\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"expectedValue\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"actualValue\",\"type\":\"bytes32\"}],\"name\":\"InvalidCommitmentValue\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"actualDifficulty\",\"type\":\"uint256\"}],\"name\":\"InvalidDifficulty\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"length\",\"type\":\"uint256\"}],\"name\":\"InvalidECDSASignatureLength\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"itemsLength\",\"type\":\"uint256\"}],\"name\":\"InvalidExtraDataFormat\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"itemsLength\",\"type\":\"uint256\"}],\"name\":\"InvalidHeaderFormat\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidHeaderHeight\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidHeaderTimestamp\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"actualMixHash\",\"type\":\"bytes32\"}],\"name\":\"InvalidMixHash\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"actualNonce\",\"type\":\"bytes\"}],\"name\":\"InvalidNonce\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"actualOmmersHash\",\"type\":\"bytes32\"}],\"name\":\"InvalidOmmersHash\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"expectedLength\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"actualLength\",\"type\":\"uint256\"}],\"name\":\"InvalidPathLength\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"providedRevisionNumber\",\"type\":\"uint64\"}],\"name\":\"InvalidRevisionNumber\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"validator\",\"type\":\"address\"}],\"name\":\"InvalidValidatorAddress\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"length\",\"type\":\"uint256\"}],\"name\":\"InvalidValidatorAddressLength\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"expectedLength\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"actualLength\",\"type\":\"uint256\"}],\"name\":\"InvalidValueLength\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"UnsupportedMisbehaviour\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"actualValue\",\"type\":\"bytes32\"}],\"name\":\"ValueExists\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"previousAdminRole\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"newAdminRole\",\"type\":\"bytes32\"}],\"name\":\"RoleAdminChanged\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"RoleGranted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"RoleRevoked\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"DEFAULT_ADMIN_ROLE\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"PROOF_SUBMITTER_ROLE\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getClientState\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"revisionHeight\",\"type\":\"uint64\"}],\"name\":\"getConsensusState\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"}],\"name\":\"getRoleAdmin\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"grantRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"hasRole\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"name\":\"misbehaviour\",\"outputs\":[],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"callerConfirmation\",\"type\":\"address\"}],\"name\":\"renounceRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"revokeRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes4\",\"name\":\"interfaceId\",\"type\":\"bytes4\"}],\"name\":\"supportsInterface\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"updateMsg\",\"type\":\"bytes\"}],\"name\":\"updateClient\",\"outputs\":[{\"internalType\":\"enum ILightClientMsgs.UpdateResult\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes\",\"name\":\"proof\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"uint64\",\"name\":\"revisionNumber\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"revisionHeight\",\"type\":\"uint64\"}],\"internalType\":\"struct IICS02ClientMsgs.Height\",\"name\":\"proofHeight\",\"type\":\"tuple\"},{\"internalType\":\"bytes[]\",\"name\":\"path\",\"type\":\"bytes[]\"},{\"internalType\":\"bytes\",\"name\":\"value\",\"type\":\"bytes\"}],\"internalType\":\"struct ILightClientMsgs.MsgVerifyMembership\",\"name\":\"msg_\",\"type\":\"tuple\"}],\"name\":\"verifyMembership\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes\",\"name\":\"proof\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"uint64\",\"name\":\"revisionNumber\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"revisionHeight\",\"type\":\"uint64\"}],\"internalType\":\"struct IICS02ClientMsgs.Height\",\"name\":\"proofHeight\",\"type\":\"tuple\"},{\"internalType\":\"bytes[]\",\"name\":\"path\",\"type\":\"bytes[]\"}],\"internalType\":\"struct ILightClientMsgs.MsgVerifyNonMembership\",\"name\":\"msg_\",\"type\":\"tuple\"}],\"name\":\"verifyNonMembership\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"errors\":{\"AccessControlBadConfirmation()\":[{\"details\":\"The caller of a function is not the expected one. NOTE: Don't confuse with {AccessControlUnauthorizedAccount}.\"}],\"AccessControlUnauthorizedAccount(address,bytes32)\":[{\"details\":\"The `account` is missing a role.\"}],\"ConflictingConsensusState(uint64)\":[{\"params\":{\"revisionHeight\":\"The conflicting revision height.\"}}],\"ConsensusStateExpired(uint64,uint256,uint64)\":[{\"params\":{\"currentTimestamp\":\"The current block timestamp.\",\"trustedTimestamp\":\"Timestamp of the trusted consensus state.\",\"trustingPeriod\":\"The configured trusting period.\"}}],\"ConsensusStateNotFound(uint64)\":[{\"params\":{\"revisionHeight\":\"The requested revision height.\"}}],\"DuplicateCommitSealSigner(address)\":[{\"params\":{\"signer\":\"The duplicate signer address.\"}}],\"DuplicateValidator(address)\":[{\"params\":{\"validator\":\"The duplicate validator address.\"}}],\"HeaderFromFuture(uint256,uint256,uint256)\":[{\"params\":{\"currentTimestamp\":\"The current block timestamp.\",\"headerTimestamp\":\"The submitted header timestamp.\",\"maxClockDrift\":\"The configured maximum clock drift.\"}}],\"InsufficientTrustedValidatorOverlap(uint256,uint256)\":[{\"params\":{\"actual\":\"The number of trusted validators that signed.\",\"required\":\"The minimum required trusted signer count.\"}}],\"InsufficientValidatorQuorum(uint256,uint256)\":[{\"params\":{\"actual\":\"The number of new validators that signed.\",\"required\":\"The minimum required signer count.\"}}],\"InvalidCommitmentValue(bytes32,bytes32)\":[{\"params\":{\"actualValue\":\"The proven commitment value.\",\"expectedValue\":\"The expected commitment value.\"}}],\"InvalidDifficulty(uint256)\":[{\"params\":{\"actualDifficulty\":\"The difficulty found in the header.\"}}],\"InvalidECDSASignatureLength(uint256)\":[{\"params\":{\"length\":\"The invalid signature length.\"}}],\"InvalidExtraDataFormat(uint256)\":[{\"params\":{\"itemsLength\":\"The decoded `extraData` item count.\"}}],\"InvalidHeaderFormat(uint256)\":[{\"params\":{\"itemsLength\":\"The decoded header item count.\"}}],\"InvalidMixHash(bytes32)\":[{\"params\":{\"actualMixHash\":\"The mix hash found in the header.\"}}],\"InvalidNonce(bytes)\":[{\"params\":{\"actualNonce\":\"The nonce found in the header.\"}}],\"InvalidOmmersHash(bytes32)\":[{\"params\":{\"actualOmmersHash\":\"The ommers hash found in the header.\"}}],\"InvalidPathLength(uint256,uint256)\":[{\"params\":{\"actualLength\":\"The actual path length.\",\"expectedLength\":\"The expected path length.\"}}],\"InvalidRevisionNumber(uint64)\":[{\"params\":{\"providedRevisionNumber\":\"The non-zero revision number.\"}}],\"InvalidValidatorAddress(address)\":[{\"params\":{\"validator\":\"The invalid validator address.\"}}],\"InvalidValidatorAddressLength(uint256)\":[{\"params\":{\"length\":\"The decoded validator address length.\"}}],\"InvalidValueLength(uint256,uint256)\":[{\"params\":{\"actualLength\":\"The actual value length.\",\"expectedLength\":\"The expected value length.\"}}],\"ValueExists(bytes32)\":[{\"params\":{\"actualValue\":\"The value found at the proven storage slot.\"}}]},\"events\":{\"RoleAdminChanged(bytes32,bytes32,bytes32)\":{\"details\":\"Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite {RoleAdminChanged} not being emitted to signal this.\"},\"RoleGranted(bytes32,address,address)\":{\"details\":\"Emitted when `account` is granted `role`. `sender` is the account that originated the contract call. This account bears the admin role (for the granted role). Expected in cases where the role was granted using the internal {AccessControl-_grantRole}.\"},\"RoleRevoked(bytes32,address,address)\":{\"details\":\"Emitted when `account` is revoked `role`. `sender` is the account that originated the contract call: - if using `revokeRole`, it is the admin role bearer - if using `renounceRole`, it is the role bearer (i.e. `account`)\"}},\"kind\":\"dev\",\"methods\":{\"constructor\":{\"params\":{\"ibcRouter\":\"Counterparty ICS26 router address whose storage is proven.\",\"initialTrustedHeight\":\"Initial trusted Besu height.\",\"initialTrustedStorageRoot\":\"Initial trusted storage root of `ibcRouter`.\",\"initialTrustedTimestamp\":\"Initial trusted header timestamp in seconds.\",\"initialTrustedValidators\":\"Initial trusted validator set.\",\"maxClockDrift\":\"Maximum allowed future drift in seconds for submitted headers.\",\"roleManager\":\"Address that administers proof submission; if zero, proof submission is open.\",\"trustingPeriod\":\"Maximum age in seconds for trusted consensus states.\"}},\"getClientState()\":{\"returns\":{\"_0\":\"The client state.\"}},\"getConsensusState(uint64)\":{\"params\":{\"revisionHeight\":\"The revision height to query.\"},\"returns\":{\"_0\":\"The ABI-encoded consensus state.\"}},\"getRoleAdmin(bytes32)\":{\"details\":\"Returns the admin role that controls `role`. See {grantRole} and {revokeRole}. To change a role's admin, use {_setRoleAdmin}.\"},\"grantRole(bytes32,address)\":{\"details\":\"Grants `role` to `account`. If `account` had not been already granted `role`, emits a {RoleGranted} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleGranted} event.\"},\"hasRole(bytes32,address)\":{\"details\":\"Returns `true` if `account` has been granted `role`.\"},\"misbehaviour(bytes)\":{\"params\":{\"misbehaviourMsg\":\"The misbehaviour message\"}},\"renounceRole(bytes32,address)\":{\"details\":\"Revokes `role` from the calling account. Roles are often managed via {grantRole} and {revokeRole}: this function's purpose is to provide a mechanism for accounts to lose their privileges if they are compromised (such as when a trusted device is misplaced). If the calling account had been revoked `role`, emits a {RoleRevoked} event. Requirements: - the caller must be `callerConfirmation`. May emit a {RoleRevoked} event.\"},\"revokeRole(bytes32,address)\":{\"details\":\"Revokes `role` from `account`. If `account` had been granted `role`, emits a {RoleRevoked} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleRevoked} event.\"},\"supportsInterface(bytes4)\":{\"details\":\"Returns true if this contract implements the interface defined by `interfaceId`. See the corresponding https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[ERC section] to learn more about how these ids are created. This function call must use less than 30 000 gas.\"},\"updateClient(bytes)\":{\"params\":{\"updateMsg\":\"The encoded update message e.g., an SP1 proof.\"},\"returns\":{\"_0\":\"The result of the update operation\"}},\"verifyMembership((bytes,(uint64,uint64),bytes[],bytes))\":{\"details\":\"Notice that this message is not view, as it may update the client state for caching purposes.\",\"params\":{\"msg_\":\"The membership message\"},\"returns\":{\"_0\":\"The unix timestamp of the verification height in the counterparty chain in seconds.\"}},\"verifyNonMembership((bytes,(uint64,uint64),bytes[]))\":{\"details\":\"Notice that this message is not view, as it may update the client state for caching purposes.\",\"params\":{\"msg_\":\"The membership message\"},\"returns\":{\"_0\":\"The unix timestamp of the verification height in the counterparty chain in seconds.\"}}},\"title\":\"Besu QBFT Light Client\",\"version\":1},\"userdoc\":{\"errors\":{\"ConflictingConsensusState(uint64)\":[{\"notice\":\"A different consensus state already exists at the submitted height.\"}],\"ConsensusStateExpired(uint64,uint256,uint64)\":[{\"notice\":\"The trusted consensus state is outside the trusting period.\"}],\"ConsensusStateNotFound(uint64)\":[{\"notice\":\"No consensus state exists for the requested height.\"}],\"DuplicateCommitSealSigner(address)\":[{\"notice\":\"A commit seal signer appears more than once.\"}],\"DuplicateValidator(address)\":[{\"notice\":\"A validator appears more than once.\"}],\"EmptyValidatorSet()\":[{\"notice\":\"The validator set is empty.\"}],\"HeaderFromFuture(uint256,uint256,uint256)\":[{\"notice\":\"The submitted header timestamp is too far in the future.\"}],\"InsufficientTrustedValidatorOverlap(uint256,uint256)\":[{\"notice\":\"The submitted signers do not overlap enough with the trusted validator set.\"}],\"InsufficientValidatorQuorum(uint256,uint256)\":[{\"notice\":\"The submitted signers do not meet quorum for the new validator set.\"}],\"InvalidCommitSeal()\":[{\"notice\":\"A commit seal did not recover a valid signer.\"}],\"InvalidCommitmentValue(bytes32,bytes32)\":[{\"notice\":\"A proven commitment value does not match the expected value.\"}],\"InvalidDifficulty(uint256)\":[{\"notice\":\"The Besu BFT difficulty is invalid.\"}],\"InvalidECDSASignatureLength(uint256)\":[{\"notice\":\"An ECDSA signature has an invalid length.\"}],\"InvalidExtraDataFormat(uint256)\":[{\"notice\":\"The submitted `extraData` field has an invalid RLP item count.\"}],\"InvalidHeaderFormat(uint256)\":[{\"notice\":\"The submitted header has an invalid RLP item count.\"}],\"InvalidHeaderHeight()\":[{\"notice\":\"The submitted header height is zero.\"}],\"InvalidHeaderTimestamp()\":[{\"notice\":\"The submitted header timestamp is zero.\"}],\"InvalidMixHash(bytes32)\":[{\"notice\":\"The Besu BFT mix hash is invalid.\"}],\"InvalidNonce(bytes)\":[{\"notice\":\"The Besu BFT nonce is invalid.\"}],\"InvalidOmmersHash(bytes32)\":[{\"notice\":\"The ommers hash is invalid.\"}],\"InvalidPathLength(uint256,uint256)\":[{\"notice\":\"A proof path has an invalid length.\"}],\"InvalidRevisionNumber(uint64)\":[{\"notice\":\"The revision number must be zero for Besu light client heights.\"}],\"InvalidValidatorAddress(address)\":[{\"notice\":\"A validator address is invalid.\"}],\"InvalidValidatorAddressLength(uint256)\":[{\"notice\":\"A validator address has an invalid byte length.\"}],\"InvalidValueLength(uint256,uint256)\":[{\"notice\":\"A membership value has an invalid length.\"}],\"UnsupportedMisbehaviour()\":[{\"notice\":\"Misbehaviour handling is not supported by this client.\"}],\"ValueExists(bytes32)\":[{\"notice\":\"A non-membership proof found an existing value.\"}]},\"kind\":\"user\",\"methods\":{\"PROOF_SUBMITTER_ROLE()\":{\"notice\":\"Role allowed to submit client updates and proof verifications.\"},\"constructor\":{\"notice\":\"Creates a Besu QBFT light client from an initial trusted consensus state.\"},\"getClientState()\":{\"notice\":\"Returns the client state.\"},\"getConsensusState(uint64)\":{\"notice\":\"Returns the encoded consensus state for a revision height.\"},\"misbehaviour(bytes)\":{\"notice\":\"Misbehaviour handling, moves the light client to the frozen state if misbehaviour is detected\"},\"updateClient(bytes)\":{\"notice\":\"Updating the client and consensus state\"},\"verifyMembership((bytes,(uint64,uint64),bytes[],bytes))\":{\"notice\":\"Querying the membership of a key-value pair\"},\"verifyNonMembership((bytes,(uint64,uint64),bytes[]))\":{\"notice\":\"Querying the non-membership of a key\"}},\"notice\":\"Verifies Besu QBFT headers and ICS26 router storage proofs.\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/light-clients/besu/BesuQBFTLightClient.sol\":\"BesuQBFTLightClient\"},\"evmVersion\":\"cancun\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"none\"},\"optimizer\":{\"enabled\":true,\"runs\":10000},\"remappings\":[\":@openzeppelin-contracts/=node_modules/@openzeppelin/contracts/\",\":@openzeppelin-upgradeable/=node_modules/@openzeppelin/contracts-upgradeable/\",\":@openzeppelin/=node_modules/@openzeppelin/\",\":@sp1-contracts/=node_modules/sp1-contracts/contracts/src/\",\":@uniswap/permit2/=node_modules/@uniswap/permit2/\",\":forge-std/=node_modules/forge-std/src/\",\":sp1-contracts/=node_modules/sp1-contracts/\"],\"viaIR\":true},\"sources\":{\"contracts/interfaces/ILightClient.sol\":{\"keccak256\":\"0x3b2361546ee834a442d844c979fbad3458ee13146b093f585587a09e19a266af\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://5b5d53101bb598f14a79cb1092479736fa18e8f84945ea6ef80f4dac84466042\",\"dweb:/ipfs/QmaTCo6M3Z9aYCSX65AQtixo1sB4ymQUDAgTXSKHqJHGDh\"]},\"contracts/light-clients/besu/BesuLightClientBase.sol\":{\"keccak256\":\"0x0e2957f1e184e52c1f007f7bbbe5279fe46aa54e02b7fea9ad96c06639fc704d\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://cfa0d54ac2be000860a378a9119f70d72615e7627c80862033684e2f90d32e15\",\"dweb:/ipfs/QmefzqCmWMghrgTQRoGkM7DSRZ3E8dUDFBCrHUhphPJCwB\"]},\"contracts/light-clients/besu/BesuQBFTLightClient.sol\":{\"keccak256\":\"0xaeb51b2596e5959273edc43f9db73effe6c8f0f05bdedda140db66e2dfdd0fea\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://28beb01f795950c145576718eb64a4c65948c5c04db20d9b9105d416ada277b4\",\"dweb:/ipfs/Qmb2CjEjmrF8pFj4eo9mCfRA2VWCVQ5H1F81DA9sBtvaVA\"]},\"contracts/light-clients/besu/MPTProof.sol\":{\"keccak256\":\"0x9ab26e6445b20541e8725b190006444d3b16eb3e021174e280451f934d9535c6\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://b6f3fd58b06b942a454bb9b21e9be40a2dab8a09f78e75ff4357c8afbc7e2d5b\",\"dweb:/ipfs/QmPeUwNScDiU91Xx4UQduYjyCPALYLPq73ZUMEn8Nr1rTG\"]},\"contracts/light-clients/besu/RLPReader.sol\":{\"keccak256\":\"0xa64ad17e6da7fed2bd206df52189286694339a8061dc5d158e717eda982af1d9\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://7020db2fe854e90e1b791e0e587610fc26bed3073ba1811faa275a1d8bf3c2c7\",\"dweb:/ipfs/QmdXdKghNFZSX7N9qD6BsKuJQdrFoqatsVWvHRL7vJCmeP\"]},\"contracts/light-clients/besu/errors/IBesuLightClientErrors.sol\":{\"keccak256\":\"0x66eff5c2f400de52896b24768de7a157eae68ca951aca2b0c271b8e03015986b\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://3a13f7651324fab436f31dcaa25cea7d4c0cd432ddecd6e17b6876b1c80c6408\",\"dweb:/ipfs/QmQHcMexxFzKcgfbE5rcFKq31PYBprppUEsy76dU8MRPvN\"]},\"contracts/light-clients/besu/msgs/IBesuLightClientMsgs.sol\":{\"keccak256\":\"0x3fc43a3daaae2f89dca4cadbc99ea71086282f987b47a95c13489ae3384532cf\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://36083aa6833eb30d26023f7dc0b2e22b7d0723d922fcd50cf86999edc9aeb474\",\"dweb:/ipfs/QmbPv9KJj5AuJkgppuyuoaTHtiw91Qkx1tdkf1R5D4wad2\"]},\"contracts/msgs/IICS02ClientMsgs.sol\":{\"keccak256\":\"0x03d1265eae327c3744d774bf22a30d845233d50664921c9aa57cef2d71fd89d2\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://89900781cc5c60540a237d92d42745ea6165765ee8fb4d50e8137a717195cc75\",\"dweb:/ipfs/Qmbx5p8gZ8sEMMeZytXsLee49JUayhAaoJ2yxX93WUrvQo\"]},\"contracts/msgs/ILightClientMsgs.sol\":{\"keccak256\":\"0x8d1e56ab166a7b4aa6999708e3214a4645ebbc3835c2b2a4c255c9923eebafde\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://8bd4200dc04d950c0f050623fa9a8accdbec877fd446c039d4dd6c678bdf1513\",\"dweb:/ipfs/QmZQTViaA7N6BVNDzJ1Z6w799PrPoE4ajPueZSPwX4sGZ9\"]},\"node_modules/@openzeppelin/contracts/access/AccessControl.sol\":{\"keccak256\":\"0x4686ec784d75f95beaf2bf5b5f26e5f946d4c864aaee9c3c62bdc18381f5e017\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://26710ca191913f3c9df542079c4a6dcff02968e92d4f7357daefef9fbe72a19c\",\"dweb:/ipfs/QmanHbeWuBbVEqXySHa1zhm2rExjYpChDBubBaJNTCa2JB\"]},\"node_modules/@openzeppelin/contracts/access/IAccessControl.sol\":{\"keccak256\":\"0xbff9f59c84e5337689161ce7641c0ef8e872d6a7536fbc1f5133f128887aba3c\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://b308f882e796f7b79c9502deacb0a62983035c6f6f4e962b319ba6a1f4a77d3d\",\"dweb:/ipfs/QmaWCW7ahEQqFjwhSUhV7Ae7WhfNvzSpE7DQ58hvEooqPL\"]},\"node_modules/@openzeppelin/contracts/utils/Context.sol\":{\"keccak256\":\"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://6a708e8a5bdb1011c2c381c9a5cfd8a9a956d7d0a9dc1bd8bcdaf52f76ef2f12\",\"dweb:/ipfs/Qmax9WHBnVsZP46ZxEMNRQpLQnrdE4dK8LehML1Py8FowF\"]},\"node_modules/@openzeppelin/contracts/utils/cryptography/ECDSA.sol\":{\"keccak256\":\"0xbeb5cad8aaabe0d35d2ec1a8414d91e81e5a8ca679add4cf57e2f33476861f40\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://ebb272a5ee2da4e8bd5551334e0ce8dce4e9c56a04570d6bf046d260fab3116a\",\"dweb:/ipfs/QmNw6RyM769qcqFocDq6HJMG2WiEnQbvizpRaUXsACHho2\"]},\"node_modules/@openzeppelin/contracts/utils/introspection/ERC165.sol\":{\"keccak256\":\"0x2d9dc2fe26180f74c11c13663647d38e259e45f95eb88f57b61d2160b0109d3e\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://81233d1f98060113d9922180bb0f14f8335856fe9f339134b09335e9f678c377\",\"dweb:/ipfs/QmWh6R35SarhAn4z2wH8SU456jJSYL2FgucfTFgbHJJN4E\"]},\"node_modules/@openzeppelin/contracts/utils/introspection/IERC165.sol\":{\"keccak256\":\"0x8891738ffe910f0cf2da09566928589bf5d63f4524dd734fd9cedbac3274dd5c\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://971f954442df5c2ef5b5ebf1eb245d7105d9fbacc7386ee5c796df1d45b21617\",\"dweb:/ipfs/QmadRjHbkicwqwwh61raUEapaVEtaLMcYbQZWs9gUkgj3u\"]}},\"version\":1}","metadata":{"compiler":{"version":"0.8.28+commit.7893614a"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"address","name":"ibcRouter","type":"address"},{"internalType":"uint64","name":"initialTrustedHeight","type":"uint64"},{"internalType":"uint64","name":"initialTrustedTimestamp","type":"uint64"},{"internalType":"bytes32","name":"initialTrustedStorageRoot","type":"bytes32"},{"internalType":"address[]","name":"initialTrustedValidators","type":"address[]"},{"internalType":"uint64","name":"trustingPeriod","type":"uint64"},{"internalType":"uint64","name":"maxClockDrift","type":"uint64"},{"internalType":"address","name":"roleManager","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"type":"error","name":"AccessControlBadConfirmation"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bytes32","name":"neededRole","type":"bytes32"}],"type":"error","name":"AccessControlUnauthorizedAccount"},{"inputs":[{"internalType":"uint64","name":"revisionHeight","type":"uint64"}],"type":"error","name":"ConflictingConsensusState"},{"inputs":[{"internalType":"uint64","name":"trustedTimestamp","type":"uint64"},{"internalType":"uint256","name":"currentTimestamp","type":"uint256"},{"internalType":"uint64","name":"trustingPeriod","type":"uint64"}],"type":"error","name":"ConsensusStateExpired"},{"inputs":[{"internalType":"uint64","name":"revisionHeight","type":"uint64"}],"type":"error","name":"ConsensusStateNotFound"},{"inputs":[{"internalType":"address","name":"signer","type":"address"}],"type":"error","name":"DuplicateCommitSealSigner"},{"inputs":[{"internalType":"address","name":"validator","type":"address"}],"type":"error","name":"DuplicateValidator"},{"inputs":[],"type":"error","name":"EmptyValidatorSet"},{"inputs":[{"internalType":"uint256","name":"currentTimestamp","type":"uint256"},{"internalType":"uint256","name":"headerTimestamp","type":"uint256"},{"internalType":"uint256","name":"maxClockDrift","type":"uint256"}],"type":"error","name":"HeaderFromFuture"},{"inputs":[{"internalType":"uint256","name":"actual","type":"uint256"},{"internalType":"uint256","name":"required","type":"uint256"}],"type":"error","name":"InsufficientTrustedValidatorOverlap"},{"inputs":[{"internalType":"uint256","name":"actual","type":"uint256"},{"internalType":"uint256","name":"required","type":"uint256"}],"type":"error","name":"InsufficientValidatorQuorum"},{"inputs":[],"type":"error","name":"InvalidCommitSeal"},{"inputs":[{"internalType":"bytes32","name":"expectedValue","type":"bytes32"},{"internalType":"bytes32","name":"actualValue","type":"bytes32"}],"type":"error","name":"InvalidCommitmentValue"},{"inputs":[{"internalType":"uint256","name":"actualDifficulty","type":"uint256"}],"type":"error","name":"InvalidDifficulty"},{"inputs":[{"internalType":"uint256","name":"length","type":"uint256"}],"type":"error","name":"InvalidECDSASignatureLength"},{"inputs":[{"internalType":"uint256","name":"itemsLength","type":"uint256"}],"type":"error","name":"InvalidExtraDataFormat"},{"inputs":[{"internalType":"uint256","name":"itemsLength","type":"uint256"}],"type":"error","name":"InvalidHeaderFormat"},{"inputs":[],"type":"error","name":"InvalidHeaderHeight"},{"inputs":[],"type":"error","name":"InvalidHeaderTimestamp"},{"inputs":[{"internalType":"bytes32","name":"actualMixHash","type":"bytes32"}],"type":"error","name":"InvalidMixHash"},{"inputs":[{"internalType":"bytes","name":"actualNonce","type":"bytes"}],"type":"error","name":"InvalidNonce"},{"inputs":[{"internalType":"bytes32","name":"actualOmmersHash","type":"bytes32"}],"type":"error","name":"InvalidOmmersHash"},{"inputs":[{"internalType":"uint256","name":"expectedLength","type":"uint256"},{"internalType":"uint256","name":"actualLength","type":"uint256"}],"type":"error","name":"InvalidPathLength"},{"inputs":[{"internalType":"uint64","name":"providedRevisionNumber","type":"uint64"}],"type":"error","name":"InvalidRevisionNumber"},{"inputs":[{"internalType":"address","name":"validator","type":"address"}],"type":"error","name":"InvalidValidatorAddress"},{"inputs":[{"internalType":"uint256","name":"length","type":"uint256"}],"type":"error","name":"InvalidValidatorAddressLength"},{"inputs":[{"internalType":"uint256","name":"expectedLength","type":"uint256"},{"internalType":"uint256","name":"actualLength","type":"uint256"}],"type":"error","name":"InvalidValueLength"},{"inputs":[],"type":"error","name":"UnsupportedMisbehaviour"},{"inputs":[{"internalType":"bytes32","name":"actualValue","type":"bytes32"}],"type":"error","name":"ValueExists"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32","indexed":true},{"internalType":"bytes32","name":"previousAdminRole","type":"bytes32","indexed":true},{"internalType":"bytes32","name":"newAdminRole","type":"bytes32","indexed":true}],"type":"event","name":"RoleAdminChanged","anonymous":false},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32","indexed":true},{"internalType":"address","name":"account","type":"address","indexed":true},{"internalType":"address","name":"sender","type":"address","indexed":true}],"type":"event","name":"RoleGranted","anonymous":false},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32","indexed":true},{"internalType":"address","name":"account","type":"address","indexed":true},{"internalType":"address","name":"sender","type":"address","indexed":true}],"type":"event","name":"RoleRevoked","anonymous":false},{"inputs":[],"stateMutability":"view","type":"function","name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"PROOF_SUBMITTER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"getClientState","outputs":[{"internalType":"bytes","name":"","type":"bytes"}]},{"inputs":[{"internalType":"uint64","name":"revisionHeight","type":"uint64"}],"stateMutability":"view","type":"function","name":"getConsensusState","outputs":[{"internalType":"bytes","name":"","type":"bytes"}]},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"stateMutability":"view","type":"function","name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}]},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"stateMutability":"nonpayable","type":"function","name":"grantRole"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"stateMutability":"view","type":"function","name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}]},{"inputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function","name":"misbehaviour"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"callerConfirmation","type":"address"}],"stateMutability":"nonpayable","type":"function","name":"renounceRole"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"stateMutability":"nonpayable","type":"function","name":"revokeRole"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"stateMutability":"view","type":"function","name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}]},{"inputs":[{"internalType":"bytes","name":"updateMsg","type":"bytes"}],"stateMutability":"nonpayable","type":"function","name":"updateClient","outputs":[{"internalType":"enum ILightClientMsgs.UpdateResult","name":"","type":"uint8"}]},{"inputs":[{"internalType":"struct ILightClientMsgs.MsgVerifyMembership","name":"msg_","type":"tuple","components":[{"internalType":"bytes","name":"proof","type":"bytes"},{"internalType":"struct IICS02ClientMsgs.Height","name":"proofHeight","type":"tuple","components":[{"internalType":"uint64","name":"revisionNumber","type":"uint64"},{"internalType":"uint64","name":"revisionHeight","type":"uint64"}]},{"internalType":"bytes[]","name":"path","type":"bytes[]"},{"internalType":"bytes","name":"value","type":"bytes"}]}],"stateMutability":"view","type":"function","name":"verifyMembership","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[{"internalType":"struct ILightClientMsgs.MsgVerifyNonMembership","name":"msg_","type":"tuple","components":[{"internalType":"bytes","name":"proof","type":"bytes"},{"internalType":"struct IICS02ClientMsgs.Height","name":"proofHeight","type":"tuple","components":[{"internalType":"uint64","name":"revisionNumber","type":"uint64"},{"internalType":"uint64","name":"revisionHeight","type":"uint64"}]},{"internalType":"bytes[]","name":"path","type":"bytes[]"}]}],"stateMutability":"view","type":"function","name":"verifyNonMembership","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]}],"devdoc":{"kind":"dev","methods":{"constructor":{"params":{"ibcRouter":"Counterparty ICS26 router address whose storage is proven.","initialTrustedHeight":"Initial trusted Besu height.","initialTrustedStorageRoot":"Initial trusted storage root of `ibcRouter`.","initialTrustedTimestamp":"Initial trusted header timestamp in seconds.","initialTrustedValidators":"Initial trusted validator set.","maxClockDrift":"Maximum allowed future drift in seconds for submitted headers.","roleManager":"Address that administers proof submission; if zero, proof submission is open.","trustingPeriod":"Maximum age in seconds for trusted consensus states."}},"getClientState()":{"returns":{"_0":"The client state."}},"getConsensusState(uint64)":{"params":{"revisionHeight":"The revision height to query."},"returns":{"_0":"The ABI-encoded consensus state."}},"getRoleAdmin(bytes32)":{"details":"Returns the admin role that controls `role`. See {grantRole} and {revokeRole}. To change a role's admin, use {_setRoleAdmin}."},"grantRole(bytes32,address)":{"details":"Grants `role` to `account`. If `account` had not been already granted `role`, emits a {RoleGranted} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleGranted} event."},"hasRole(bytes32,address)":{"details":"Returns `true` if `account` has been granted `role`."},"misbehaviour(bytes)":{"params":{"misbehaviourMsg":"The misbehaviour message"}},"renounceRole(bytes32,address)":{"details":"Revokes `role` from the calling account. Roles are often managed via {grantRole} and {revokeRole}: this function's purpose is to provide a mechanism for accounts to lose their privileges if they are compromised (such as when a trusted device is misplaced). If the calling account had been revoked `role`, emits a {RoleRevoked} event. Requirements: - the caller must be `callerConfirmation`. May emit a {RoleRevoked} event."},"revokeRole(bytes32,address)":{"details":"Revokes `role` from `account`. If `account` had been granted `role`, emits a {RoleRevoked} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleRevoked} event."},"supportsInterface(bytes4)":{"details":"Returns true if this contract implements the interface defined by `interfaceId`. See the corresponding https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[ERC section] to learn more about how these ids are created. This function call must use less than 30 000 gas."},"updateClient(bytes)":{"params":{"updateMsg":"The encoded update message e.g., an SP1 proof."},"returns":{"_0":"The result of the update operation"}},"verifyMembership((bytes,(uint64,uint64),bytes[],bytes))":{"details":"Notice that this message is not view, as it may update the client state for caching purposes.","params":{"msg_":"The membership message"},"returns":{"_0":"The unix timestamp of the verification height in the counterparty chain in seconds."}},"verifyNonMembership((bytes,(uint64,uint64),bytes[]))":{"details":"Notice that this message is not view, as it may update the client state for caching purposes.","params":{"msg_":"The membership message"},"returns":{"_0":"The unix timestamp of the verification height in the counterparty chain in seconds."}}},"version":1},"userdoc":{"kind":"user","methods":{"PROOF_SUBMITTER_ROLE()":{"notice":"Role allowed to submit client updates and proof verifications."},"constructor":{"notice":"Creates a Besu QBFT light client from an initial trusted consensus state."},"getClientState()":{"notice":"Returns the client state."},"getConsensusState(uint64)":{"notice":"Returns the encoded consensus state for a revision height."},"misbehaviour(bytes)":{"notice":"Misbehaviour handling, moves the light client to the frozen state if misbehaviour is detected"},"updateClient(bytes)":{"notice":"Updating the client and consensus state"},"verifyMembership((bytes,(uint64,uint64),bytes[],bytes))":{"notice":"Querying the membership of a key-value pair"},"verifyNonMembership((bytes,(uint64,uint64),bytes[]))":{"notice":"Querying the non-membership of a key"}},"version":1}},"settings":{"remappings":["@openzeppelin-contracts/=node_modules/@openzeppelin/contracts/","@openzeppelin-upgradeable/=node_modules/@openzeppelin/contracts-upgradeable/","@openzeppelin/=node_modules/@openzeppelin/","@sp1-contracts/=node_modules/sp1-contracts/contracts/src/","@uniswap/permit2/=node_modules/@uniswap/permit2/","forge-std/=node_modules/forge-std/src/","sp1-contracts/=node_modules/sp1-contracts/"],"optimizer":{"enabled":true,"runs":10000},"metadata":{"bytecodeHash":"none"},"compilationTarget":{"contracts/light-clients/besu/BesuQBFTLightClient.sol":"BesuQBFTLightClient"},"evmVersion":"cancun","libraries":{},"viaIR":true},"sources":{"contracts/interfaces/ILightClient.sol":{"keccak256":"0x3b2361546ee834a442d844c979fbad3458ee13146b093f585587a09e19a266af","urls":["bzz-raw://5b5d53101bb598f14a79cb1092479736fa18e8f84945ea6ef80f4dac84466042","dweb:/ipfs/QmaTCo6M3Z9aYCSX65AQtixo1sB4ymQUDAgTXSKHqJHGDh"],"license":"Apache-2.0"},"contracts/light-clients/besu/BesuLightClientBase.sol":{"keccak256":"0x0e2957f1e184e52c1f007f7bbbe5279fe46aa54e02b7fea9ad96c06639fc704d","urls":["bzz-raw://cfa0d54ac2be000860a378a9119f70d72615e7627c80862033684e2f90d32e15","dweb:/ipfs/QmefzqCmWMghrgTQRoGkM7DSRZ3E8dUDFBCrHUhphPJCwB"],"license":"Apache-2.0"},"contracts/light-clients/besu/BesuQBFTLightClient.sol":{"keccak256":"0xaeb51b2596e5959273edc43f9db73effe6c8f0f05bdedda140db66e2dfdd0fea","urls":["bzz-raw://28beb01f795950c145576718eb64a4c65948c5c04db20d9b9105d416ada277b4","dweb:/ipfs/Qmb2CjEjmrF8pFj4eo9mCfRA2VWCVQ5H1F81DA9sBtvaVA"],"license":"Apache-2.0"},"contracts/light-clients/besu/MPTProof.sol":{"keccak256":"0x9ab26e6445b20541e8725b190006444d3b16eb3e021174e280451f934d9535c6","urls":["bzz-raw://b6f3fd58b06b942a454bb9b21e9be40a2dab8a09f78e75ff4357c8afbc7e2d5b","dweb:/ipfs/QmPeUwNScDiU91Xx4UQduYjyCPALYLPq73ZUMEn8Nr1rTG"],"license":"Apache-2.0"},"contracts/light-clients/besu/RLPReader.sol":{"keccak256":"0xa64ad17e6da7fed2bd206df52189286694339a8061dc5d158e717eda982af1d9","urls":["bzz-raw://7020db2fe854e90e1b791e0e587610fc26bed3073ba1811faa275a1d8bf3c2c7","dweb:/ipfs/QmdXdKghNFZSX7N9qD6BsKuJQdrFoqatsVWvHRL7vJCmeP"],"license":"Apache-2.0"},"contracts/light-clients/besu/errors/IBesuLightClientErrors.sol":{"keccak256":"0x66eff5c2f400de52896b24768de7a157eae68ca951aca2b0c271b8e03015986b","urls":["bzz-raw://3a13f7651324fab436f31dcaa25cea7d4c0cd432ddecd6e17b6876b1c80c6408","dweb:/ipfs/QmQHcMexxFzKcgfbE5rcFKq31PYBprppUEsy76dU8MRPvN"],"license":"Apache-2.0"},"contracts/light-clients/besu/msgs/IBesuLightClientMsgs.sol":{"keccak256":"0x3fc43a3daaae2f89dca4cadbc99ea71086282f987b47a95c13489ae3384532cf","urls":["bzz-raw://36083aa6833eb30d26023f7dc0b2e22b7d0723d922fcd50cf86999edc9aeb474","dweb:/ipfs/QmbPv9KJj5AuJkgppuyuoaTHtiw91Qkx1tdkf1R5D4wad2"],"license":"Apache-2.0"},"contracts/msgs/IICS02ClientMsgs.sol":{"keccak256":"0x03d1265eae327c3744d774bf22a30d845233d50664921c9aa57cef2d71fd89d2","urls":["bzz-raw://89900781cc5c60540a237d92d42745ea6165765ee8fb4d50e8137a717195cc75","dweb:/ipfs/Qmbx5p8gZ8sEMMeZytXsLee49JUayhAaoJ2yxX93WUrvQo"],"license":"Apache-2.0"},"contracts/msgs/ILightClientMsgs.sol":{"keccak256":"0x8d1e56ab166a7b4aa6999708e3214a4645ebbc3835c2b2a4c255c9923eebafde","urls":["bzz-raw://8bd4200dc04d950c0f050623fa9a8accdbec877fd446c039d4dd6c678bdf1513","dweb:/ipfs/QmZQTViaA7N6BVNDzJ1Z6w799PrPoE4ajPueZSPwX4sGZ9"],"license":"Apache-2.0"},"node_modules/@openzeppelin/contracts/access/AccessControl.sol":{"keccak256":"0x4686ec784d75f95beaf2bf5b5f26e5f946d4c864aaee9c3c62bdc18381f5e017","urls":["bzz-raw://26710ca191913f3c9df542079c4a6dcff02968e92d4f7357daefef9fbe72a19c","dweb:/ipfs/QmanHbeWuBbVEqXySHa1zhm2rExjYpChDBubBaJNTCa2JB"],"license":"MIT"},"node_modules/@openzeppelin/contracts/access/IAccessControl.sol":{"keccak256":"0xbff9f59c84e5337689161ce7641c0ef8e872d6a7536fbc1f5133f128887aba3c","urls":["bzz-raw://b308f882e796f7b79c9502deacb0a62983035c6f6f4e962b319ba6a1f4a77d3d","dweb:/ipfs/QmaWCW7ahEQqFjwhSUhV7Ae7WhfNvzSpE7DQ58hvEooqPL"],"license":"MIT"},"node_modules/@openzeppelin/contracts/utils/Context.sol":{"keccak256":"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2","urls":["bzz-raw://6a708e8a5bdb1011c2c381c9a5cfd8a9a956d7d0a9dc1bd8bcdaf52f76ef2f12","dweb:/ipfs/Qmax9WHBnVsZP46ZxEMNRQpLQnrdE4dK8LehML1Py8FowF"],"license":"MIT"},"node_modules/@openzeppelin/contracts/utils/cryptography/ECDSA.sol":{"keccak256":"0xbeb5cad8aaabe0d35d2ec1a8414d91e81e5a8ca679add4cf57e2f33476861f40","urls":["bzz-raw://ebb272a5ee2da4e8bd5551334e0ce8dce4e9c56a04570d6bf046d260fab3116a","dweb:/ipfs/QmNw6RyM769qcqFocDq6HJMG2WiEnQbvizpRaUXsACHho2"],"license":"MIT"},"node_modules/@openzeppelin/contracts/utils/introspection/ERC165.sol":{"keccak256":"0x2d9dc2fe26180f74c11c13663647d38e259e45f95eb88f57b61d2160b0109d3e","urls":["bzz-raw://81233d1f98060113d9922180bb0f14f8335856fe9f339134b09335e9f678c377","dweb:/ipfs/QmWh6R35SarhAn4z2wH8SU456jJSYL2FgucfTFgbHJJN4E"],"license":"MIT"},"node_modules/@openzeppelin/contracts/utils/introspection/IERC165.sol":{"keccak256":"0x8891738ffe910f0cf2da09566928589bf5d63f4524dd734fd9cedbac3274dd5c","urls":["bzz-raw://971f954442df5c2ef5b5ebf1eb245d7105d9fbacc7386ee5c796df1d45b21617","dweb:/ipfs/QmadRjHbkicwqwwh61raUEapaVEtaLMcYbQZWs9gUkgj3u"],"license":"MIT"}},"version":1},"id":36} \ No newline at end of file +{"abi":[{"type":"constructor","inputs":[{"name":"ibcRouter","type":"address","internalType":"address"},{"name":"initialTrustedHeight","type":"uint64","internalType":"uint64"},{"name":"initialTrustedTimestamp","type":"uint64","internalType":"uint64"},{"name":"initialTrustedStorageRoot","type":"bytes32","internalType":"bytes32"},{"name":"initialTrustedValidators","type":"address[]","internalType":"address[]"},{"name":"trustingPeriod","type":"uint64","internalType":"uint64"},{"name":"maxClockDrift","type":"uint64","internalType":"uint64"},{"name":"roleManager","type":"address","internalType":"address"}],"stateMutability":"nonpayable"},{"type":"function","name":"DEFAULT_ADMIN_ROLE","inputs":[],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"type":"function","name":"PROOF_SUBMITTER_ROLE","inputs":[],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"type":"function","name":"getClientState","inputs":[],"outputs":[{"name":"","type":"bytes","internalType":"bytes"}],"stateMutability":"view"},{"type":"function","name":"getConsensusState","inputs":[{"name":"revisionHeight","type":"uint64","internalType":"uint64"}],"outputs":[{"name":"","type":"bytes","internalType":"bytes"}],"stateMutability":"view"},{"type":"function","name":"getRoleAdmin","inputs":[{"name":"role","type":"bytes32","internalType":"bytes32"}],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"type":"function","name":"grantRole","inputs":[{"name":"role","type":"bytes32","internalType":"bytes32"},{"name":"account","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"hasRole","inputs":[{"name":"role","type":"bytes32","internalType":"bytes32"},{"name":"account","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"misbehaviour","inputs":[{"name":"","type":"bytes","internalType":"bytes"}],"outputs":[],"stateMutability":"view"},{"type":"function","name":"renounceRole","inputs":[{"name":"role","type":"bytes32","internalType":"bytes32"},{"name":"callerConfirmation","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"revokeRole","inputs":[{"name":"role","type":"bytes32","internalType":"bytes32"},{"name":"account","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"supportsInterface","inputs":[{"name":"interfaceId","type":"bytes4","internalType":"bytes4"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"updateClient","inputs":[{"name":"updateMsg","type":"bytes","internalType":"bytes"}],"outputs":[{"name":"","type":"uint8","internalType":"enum ILightClientMsgs.UpdateResult"}],"stateMutability":"nonpayable"},{"type":"function","name":"verifyMembership","inputs":[{"name":"msg_","type":"tuple","internalType":"struct ILightClientMsgs.MsgVerifyMembership","components":[{"name":"proof","type":"bytes","internalType":"bytes"},{"name":"proofHeight","type":"tuple","internalType":"struct IICS02ClientMsgs.Height","components":[{"name":"revisionNumber","type":"uint64","internalType":"uint64"},{"name":"revisionHeight","type":"uint64","internalType":"uint64"}]},{"name":"path","type":"bytes[]","internalType":"bytes[]"},{"name":"value","type":"bytes","internalType":"bytes"}]}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"verifyNonMembership","inputs":[{"name":"msg_","type":"tuple","internalType":"struct ILightClientMsgs.MsgVerifyNonMembership","components":[{"name":"proof","type":"bytes","internalType":"bytes"},{"name":"proofHeight","type":"tuple","internalType":"struct IICS02ClientMsgs.Height","components":[{"name":"revisionNumber","type":"uint64","internalType":"uint64"},{"name":"revisionHeight","type":"uint64","internalType":"uint64"}]},{"name":"path","type":"bytes[]","internalType":"bytes[]"}]}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"event","name":"RoleAdminChanged","inputs":[{"name":"role","type":"bytes32","indexed":true,"internalType":"bytes32"},{"name":"previousAdminRole","type":"bytes32","indexed":true,"internalType":"bytes32"},{"name":"newAdminRole","type":"bytes32","indexed":true,"internalType":"bytes32"}],"anonymous":false},{"type":"event","name":"RoleGranted","inputs":[{"name":"role","type":"bytes32","indexed":true,"internalType":"bytes32"},{"name":"account","type":"address","indexed":true,"internalType":"address"},{"name":"sender","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"type":"event","name":"RoleRevoked","inputs":[{"name":"role","type":"bytes32","indexed":true,"internalType":"bytes32"},{"name":"account","type":"address","indexed":true,"internalType":"address"},{"name":"sender","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"type":"error","name":"AccessControlBadConfirmation","inputs":[]},{"type":"error","name":"AccessControlUnauthorizedAccount","inputs":[{"name":"account","type":"address","internalType":"address"},{"name":"neededRole","type":"bytes32","internalType":"bytes32"}]},{"type":"error","name":"ConflictingConsensusState","inputs":[{"name":"revisionHeight","type":"uint64","internalType":"uint64"}]},{"type":"error","name":"ConsensusStateExpired","inputs":[{"name":"trustedTimestamp","type":"uint64","internalType":"uint64"},{"name":"currentTimestamp","type":"uint256","internalType":"uint256"},{"name":"trustingPeriod","type":"uint64","internalType":"uint64"}]},{"type":"error","name":"ConsensusStateNotFound","inputs":[{"name":"revisionHeight","type":"uint64","internalType":"uint64"}]},{"type":"error","name":"DuplicateCommitSealSigner","inputs":[{"name":"signer","type":"address","internalType":"address"}]},{"type":"error","name":"DuplicateValidator","inputs":[{"name":"validator","type":"address","internalType":"address"}]},{"type":"error","name":"EmptyValidatorSet","inputs":[]},{"type":"error","name":"HeaderFromFuture","inputs":[{"name":"currentTimestamp","type":"uint256","internalType":"uint256"},{"name":"headerTimestamp","type":"uint256","internalType":"uint256"},{"name":"maxClockDrift","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"InsufficientTrustedValidatorOverlap","inputs":[{"name":"actual","type":"uint256","internalType":"uint256"},{"name":"required","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"InsufficientValidatorQuorum","inputs":[{"name":"actual","type":"uint256","internalType":"uint256"},{"name":"required","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"InvalidCommitSeal","inputs":[]},{"type":"error","name":"InvalidCommitmentValue","inputs":[{"name":"expectedValue","type":"bytes32","internalType":"bytes32"},{"name":"actualValue","type":"bytes32","internalType":"bytes32"}]},{"type":"error","name":"InvalidDifficulty","inputs":[{"name":"actualDifficulty","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"InvalidECDSASignatureLength","inputs":[{"name":"length","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"InvalidExtraDataFormat","inputs":[{"name":"itemsLength","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"InvalidHeaderFormat","inputs":[{"name":"itemsLength","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"InvalidHeaderHeight","inputs":[]},{"type":"error","name":"InvalidHeaderTimestamp","inputs":[]},{"type":"error","name":"InvalidMixHash","inputs":[{"name":"actualMixHash","type":"bytes32","internalType":"bytes32"}]},{"type":"error","name":"InvalidNonce","inputs":[{"name":"actualNonce","type":"bytes","internalType":"bytes"}]},{"type":"error","name":"InvalidOmmersHash","inputs":[{"name":"actualOmmersHash","type":"bytes32","internalType":"bytes32"}]},{"type":"error","name":"InvalidPathLength","inputs":[{"name":"expectedLength","type":"uint256","internalType":"uint256"},{"name":"actualLength","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"InvalidRevisionNumber","inputs":[{"name":"providedRevisionNumber","type":"uint64","internalType":"uint64"}]},{"type":"error","name":"InvalidValidatorAddress","inputs":[{"name":"validator","type":"address","internalType":"address"}]},{"type":"error","name":"InvalidValidatorAddressLength","inputs":[{"name":"length","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"InvalidValueLength","inputs":[{"name":"expectedLength","type":"uint256","internalType":"uint256"},{"name":"actualLength","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"UnsupportedMisbehaviour","inputs":[]},{"type":"error","name":"ValueExists","inputs":[{"name":"actualValue","type":"bytes32","internalType":"bytes32"}]}],"bytecode":{"object":"0x6080604052346103d85761395a80380380610019816103dc565b928339810190610100818303126103d85761003381610401565b9061004060208201610415565b9061004d60408201610415565b92606082015191608081015160018060401b0381116103d85781019286601f850112156103d8578351966001600160401b03881161037f578760051b9460206100978188016103dc565b809a81520190602082978201019283116103d857602001905b8282106103c0575050506100c660a08301610415565b956100df60e06100d860c08601610415565b9401610401565b956001600160401b03169081156103b1576001600160401b03169283156103a257885115610393575f5b89518110156101bf576001600160a01b03610124828c610429565b511615610198575f5b81811061013d5750600101610109565b6001600160a01b0361014f828d610429565b51166001600160a01b03610163848e610429565b5116146101725760010161012d565b6001600160a01b03610184838d610429565b511663107f863360e21b5f5260045260245ffd5b6001600160a01b03906101ab908b610429565b51166359bff38760e01b5f5260045260245ffd5b5060408051979896978a979181016001600160401b0381118282101761037f576040525f81526020810190848252604051926080840198848a1060018060401b038b111761037f576040998a526001600160a01b031680855260208086018490526001600160401b03928316868c01819052878416606090970196909652600180546001600160a01b031916909217825592516002805495516fffffffffffffffff0000000000000000908d1b81169285166001600160801b03199788161792909217815560038054988d1b90921697909516909517959095179093555f948552600490529590922080546001600160401b031916949094178455830191909155925193910191831161037f5768010000000000000000831161037f578154838355808410610359575b50905f5260205f205f5b83811061033c57846001600160a01b0381166103235750610312610547565b505b6040516132f090816105ca8239f35b8061033061033692610451565b506104c7565b50610314565b82516001600160a01b0316818301556020909201916001016102f3565b825f528360205f2091820191015b81811061037457506102e9565b5f8155600101610367565b634e487b7160e01b5f52604160045260245ffd5b63339e1ffb60e01b5f5260045ffd5b63574f4e6160e01b5f5260045ffd5b6359d119e360e01b5f5260045ffd5b602080916103cd84610401565b8152019101906100b0565b5f80fd5b6040519190601f01601f191682016001600160401b0381118382101761037f57604052565b51906001600160a01b03821682036103d857565b51906001600160401b03821682036103d857565b805182101561043d5760209160051b010190565b634e487b7160e01b5f52603260045260245ffd5b6001600160a01b0381165f9081525f51602061393a5f395f51905f52602052604090205460ff166104c2576001600160a01b03165f8181525f51602061393a5f395f51905f5260205260408120805460ff191660011790553391905f5160206138ba5f395f51905f528180a4600190565b505f90565b6001600160a01b0381165f9081525f5160206138da5f395f51905f52602052604090205460ff166104c2576001600160a01b03165f8181525f5160206138da5f395f51905f5260205260408120805460ff191660011790553391905f51602061391a5f395f51905f52905f5160206138ba5f395f51905f529080a4600190565b5f80525f5160206138da5f395f51905f526020525f5160206138fa5f395f51905f525460ff166105c5575f8080525f5160206138da5f395f51905f526020525f5160206138fa5f395f51905f52805460ff1916600117905533905f51602061391a5f395f51905f525f5160206138ba5f395f51905f528280a4600190565b5f9056fe60806040526004361015610011575f80fd5b5f3560e01c806301ffc9a7146100f45780630bece356146100ef578063248a9ca3146100ea5780632f2ff15d146100e557806336568abe146100e05780634d6d9ffb146100db5780635972185a146100d6578063682ed5f0146100d157806391d14854146100cc578063a217fddf146100c7578063d547741f146100c2578063ddba6537146100bd578063edce8bdc146100b85763ef913a4b146100b3575f80fd5b610a16565b61095e565b61088b565b61085c565b610842565b6107f4565b6105e6565b6105ac565b6103ac565b610350565b61031a565b6102b5565b610217565b34610195576020600319360112610195576004357fffffffff00000000000000000000000000000000000000000000000000000000811680910361019557807f7965db0b000000000000000000000000000000000000000000000000000000006020921490811561016b575b506040519015158152f35b7f01ffc9a7000000000000000000000000000000000000000000000000000000009150145f610160565b5f80fd5b9060206003198301126101955760043567ffffffffffffffff811161019557826023820112156101955780600401359267ffffffffffffffff84116101955760248483010111610195576024019190565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b346101955761028161022836610199565b5f80527f4c48d1d2b0f4f7485fc28e3db22341d96a20aa29e6efa8149da9751603abd4e06020527f6e0c24a6e293ff9b755263dbaa15ba3796b0b8d3fe17cfb4ddf8143b268eac475490919060ff161561029957610d65565b6040516003821015610294576020918152f35b6101ea565b6102a1611276565b610d65565b90816020910312610195573590565b346101955760206003193601126101955760206102df6004355f525f602052600160405f20015490565b604051908152f35b6003196040910112610195576004359060243573ffffffffffffffffffffffffffffffffffffffff811681036101955790565b346101955761034e61032b366102e7565b90610349610344825f525f602052600160405f20015490565b6112fe565b6121f8565b005b346101955761035e366102e7565b3373ffffffffffffffffffffffffffffffffffffffff8216036103845761034e916122cf565b7f6697b232000000000000000000000000000000000000000000000000000000005f5260045ffd5b346101955760206003193601126101955760043567ffffffffffffffff8111610195578060040160806003198336030112610195575f80527f4c48d1d2b0f4f7485fc28e3db22341d96a20aa29e6efa8149da9751603abd4e060205260ff7f6e0c24a6e293ff9b755263dbaa15ba3796b0b8d3fe17cfb4ddf8143b268eac4754161561059f575b61044761044260248401611181565b61136b565b60648201916001610458848461118b565b90500361056157906104a96104966104a261049d61049661049061048961048460446104e09a01611181565b611b10565b988761118b565b9061125d565b3691610b4d565b6123a4565b928061120c565b906001840154906040516104d7816104c960208201948560209181520190565b03601f198101835282610afd565b51902091612432565b805161051f5761051b61050b6104fe845467ffffffffffffffff1690565b67ffffffffffffffff1690565b6040519081529081906020820190565b0390f35b61053361052e61055e92612577565b6125a4565b7fd039601e000000000000000000000000000000000000000000000000000000005f52600452602490565b5ffd5b61055e61056e848461118b565b7f88b3170e000000000000000000000000000000000000000000000000000000005f52600160045260245250604490565b6105a7611276565b610433565b34610195575f6003193601126101955760206040517fbd893629a699470e4ec82a5715bb4981fdaacc5d0a728bf5f55b801d8f4ef10b8152f35b346101955760206003193601126101955760043567ffffffffffffffff8111610195578060040160a06003198336030112610195575f80527f4c48d1d2b0f4f7485fc28e3db22341d96a20aa29e6efa8149da9751603abd4e060205260ff7f6e0c24a6e293ff9b755263dbaa15ba3796b0b8d3fe17cfb4ddf8143b268eac475416156107e7575b61067c61044260248401611181565b6064820191600161068d848461118b565b90500361056157608481019060206106a5838561120c565b9050036107a957906106f46104966106ed6106e56106de61049d6104966104906106d761048460446107149c01611181565b9b8b61118b565b948761120c565b8101906102a6565b948061120c565b906001850154906040516104d7816104c960208201948560209181520190565b8051156107755761052e61072791612577565b908082036107475761051b61050b6104fe855467ffffffffffffffff1690565b7f56ed1b63000000000000000000000000000000000000000000000000000000005f5260045260245260445ffd5b61055e827f56ed1b63000000000000000000000000000000000000000000000000000000005f52906044916004525f602452565b61055e6107b6838561120c565b7f24fadac8000000000000000000000000000000000000000000000000000000005f52602060045260245250604490565b6107ef611276565b61066d565b3461019557602060ff610836610809366102e7565b905f525f845260405f209073ffffffffffffffffffffffffffffffffffffffff165f5260205260405f2090565b54166040519015158152f35b34610195575f6003193601126101955760206040515f8152f35b346101955761034e61086d366102e7565b90610886610344825f525f602052600160405f20015490565b6122cf565b346101955761089936610199565b50505f80527f4c48d1d2b0f4f7485fc28e3db22341d96a20aa29e6efa8149da9751603abd4e06020527f6e0c24a6e293ff9b755263dbaa15ba3796b0b8d3fe17cfb4ddf8143b268eac475460ff1615610915575b7f2c1ed462000000000000000000000000000000000000000000000000000000005f5260045ffd5b61091d611276565b6108ed565b67ffffffffffffffff81160361019557565b601f19601f602060409481855280519182918282880152018686015e5f8582860101520116010190565b346101955760206003193601126101955761097e60043561048481610922565b67ffffffffffffffff8154166002600183015492019060405192608084019160208501526040840152606080840152815480915260a08301915f5260205f20905f5b8181106109ea5761051b856109de818703601f198101835282610afd565b60405191829182610934565b825473ffffffffffffffffffffffffffffffffffffffff168452602090930192600192830192016109c0565b34610195575f6003193601126101955761051b60405173ffffffffffffffffffffffffffffffffffffffff60015416602082015267ffffffffffffffff600254818116604084015260401c16606082015267ffffffffffffffff600354818116608084015260401c1660a082015260a081526109de60c082610afd565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b6060810190811067ffffffffffffffff821117610adc57604052565b610a93565b6040810190811067ffffffffffffffff821117610adc57604052565b90601f601f19910116810190811067ffffffffffffffff821117610adc57604052565b60405190610b2f604083610afd565b565b67ffffffffffffffff8111610adc57601f01601f191660200190565b929192610b5982610b31565b91610b676040519384610afd565b829481845281830111610195578281602093845f960137010152565b9080601f8301121561019557816020610b9e93359101610b4d565b90565b6020818303126101955780359067ffffffffffffffff8211610195570180820391608083126101955760405192610bd784610ac0565b823567ffffffffffffffff811161019557604091610bfa84601f19938701610b83565b8652011261019557604051610c0e81610ae1565b6020830135610c1c81610922565b81526040830135610c2c81610922565b60208201526020840152606082013567ffffffffffffffff811161019557610c549201610b83565b604082015290565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b9060018201809211610c9757565b610c5c565b91908201809211610c9757565b908160011b9180830460021490151715610c9757565b81519167ffffffffffffffff8311610adc57680100000000000000008311610adc578154838355808410610d3f575b506020610d009101915f5260205f2090565b5f5b838110610d0f5750505050565b6001906020610d32855173ffffffffffffffffffffffffffffffffffffffff1690565b9401938184015501610d02565b825f528360205f2091820191015b818110610d5a5750610cee565b5f8155600101610d4d565b610d7191810190610ba1565b906020820191610d8d61044284515167ffffffffffffffff1690565b610d9781516115fc565b92604084019367ffffffffffffffff610db8865167ffffffffffffffff1690565b1615611159576080810192610dd86104fe855167ffffffffffffffff1690565b15611131576003549267ffffffffffffffff604085901c16610dfa8142610c9c565b865167ffffffffffffffff169081116110f25750505160200151610e3990610e2b9067ffffffffffffffff16611b10565b9367ffffffffffffffff1690565b67ffffffffffffffff811680151590816110c9575b50611074575090610ebc91610e7d6002610e75610e6a85611ba2565b60c086015190611cd3565b950185611eec565b610e8d60a0830194855190612011565b60406060610eb060015473ffffffffffffffffffffffffffffffffffffffff1690565b930151910151916120b4565b610ee9610ed1865167ffffffffffffffff1690565b67ffffffffffffffff165f52600460205260405f2090565b610efe6104fe825467ffffffffffffffff1690565b6110025750916002610f7c928694610f6f610f3a610f2b610ed1610f8a9a9b5167ffffffffffffffff1690565b955167ffffffffffffffff1690565b859067ffffffffffffffff167fffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000825416179055565b6001840155519101610cbf565b5167ffffffffffffffff1690565b600254610fa39060401c67ffffffffffffffff166104fe565b67ffffffffffffffff821611610fb857505f90565b610ffe907fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff6fffffffffffffffff00000000000000006002549260401b16911617600255565b5f90565b91611018611020945167ffffffffffffffff1690565b90519261212a565b61106e5761055e611039835167ffffffffffffffff1690565b7fc1aea5f7000000000000000000000000000000000000000000000000000000005f5267ffffffffffffffff16600452602490565b60029150565b61055e9061108a855467ffffffffffffffff1690565b7feae35725000000000000000000000000000000000000000000000000000000005f5267ffffffffffffffff9081166004524260245216604452606490565b90506110ea42916110e56104fe885467ffffffffffffffff1690565b610c9c565b11155f610e4e565b7f9b772277000000000000000000000000000000000000000000000000000000005f524260045267ffffffffffffffff9081166024521660445260645ffd5b7f574f4e61000000000000000000000000000000000000000000000000000000005f5260045ffd5b7f59d119e3000000000000000000000000000000000000000000000000000000005f5260045ffd5b35610b9e81610922565b9035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe181360301821215610195570180359067ffffffffffffffff821161019557602001918160051b3603831361019557565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b9035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe181360301821215610195570180359067ffffffffffffffff82116101955760200191813603831361019557565b9015611271578061126d9161120c565b9091565b6111df565b335f9081527f4c48d1d2b0f4f7485fc28e3db22341d96a20aa29e6efa8149da9751603abd4e0602052604090205460ff16156112ae57565b7fe2517d3f000000000000000000000000000000000000000000000000000000005f52336004527fbd893629a699470e4ec82a5715bb4981fdaacc5d0a728bf5f55b801d8f4ef10b60245260445ffd5b805f525f60205260ff6113323360405f209073ffffffffffffffffffffffffffffffffffffffff165f5260205260405f2090565b54161561133c5750565b7fe2517d3f000000000000000000000000000000000000000000000000000000005f523360045260245260445ffd5b67ffffffffffffffff168061137d5750565b7f3ce598a9000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b6040519060e0820182811067ffffffffffffffff821117610adc57604052606060c0838281528260208201525f60408201525f838201525f60808201528260a08201520152565b8051600110156112715760400190565b805160071015611271576101000190565b8051600d1015611271576101c00190565b8051600e1015611271576101e00190565b805160081015611271576101200190565b8051600310156112715760800190565b8051600b1015611271576101800190565b8051600c1015611271576101a00190565b8051600410156112715760a00190565b8051156112715760200190565b8051600210156112715760600190565b805160101015611271576102200190565b80518210156112715760209160051b010190565b67ffffffffffffffff8111610adc5760051b60200190565b906114e9826114c7565b6114f66040519182610afd565b828152601f1961150682946114c7565b0190602036910137565b90602082519201517fffffffffffffffffffffffffffffffffffffffff00000000000000000000000081169260148110611548575050565b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000929350829060140360031b1b161690565b60405160c0919061158b8382610afd565b6005815291601f1901825f5b8281106115a357505050565b806060602080938501015201611597565b906115be826114c7565b6115cb6040519182610afd565b828152601f196115db82946114c7565b01905f5b8281106115eb57505050565b8060606020809385010152016115df565b61161561161061160a6113a8565b92612577565b6125e6565b80825251600f8110611ae557507f1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d4934761165661165083516113ef565b516126b1565b03611aaa57600161167061166a83516113ff565b516125a4565b03611a6f577f63746963616c2062797a616e74696e65206661756c7420746f6c6572616e63656116a36116508351611410565b03611a34576116bb6116b58251611421565b516126cd565b80516008811490811591611a04575b506119ca57506116f46116e36104fe61166a8451611432565b67ffffffffffffffff166040830152565b6117016116508251611443565b606082015261172a6117196104fe61166a8451611453565b67ffffffffffffffff166080830152565b61174261161061173d6116b58451611464565b612577565b906020810191808352516005810361199f575061176861176283516113ef565b516125e6565b908151156119775761177a82516114df565b9360a082019485525f5b83518110156119135761179a6116b582866114b3565b8051601481036118e857506117b16117b791611510565b60601c90565b73ffffffffffffffffffffffffffffffffffffffff811680156118a6575f5b8381106118125750509061180c6001926117f1838a516114b3565b9073ffffffffffffffffffffffffffffffffffffffff169052565b01611784565b8161185761183e611824848d516114b3565b5173ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff1690565b14611864576001016117d6565b7f41fe18cc000000000000000000000000000000000000000000000000000000005f5273ffffffffffffffffffffffffffffffffffffffff831660045260245ffd5b7f59bff387000000000000000000000000000000000000000000000000000000005f5273ffffffffffffffffffffffffffffffffffffffff821660045260245ffd5b7f83e46ad2000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b5092611762919450611926925051611475565b61193081516115b4565b9260c081019384525f5b8251811015611971578061196a816119576116b5600195886114b3565b88519061196483836114b3565b526114b3565b500161193a565b50925050565b7f339e1ffb000000000000000000000000000000000000000000000000000000005f5260045ffd5b7f30c6792a000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b611a00906040519182917fd5edd2a500000000000000000000000000000000000000000000000000000000835260048301610934565b0390fd5b7f011b4d03dd8c01f1049143cf9c4c817e4b167f1d1b83e5c6f0f10d89ba1e7bce9150602083012014155f6116ca565b611a4461165061055e9251611410565b7fa19e609c000000000000000000000000000000000000000000000000000000005f52600452602490565b611a7f61166a61055e92516113ff565b7ff71b722f000000000000000000000000000000000000000000000000000000005f52600452602490565b611aba61165061055e92516113ef565b7fb8120dca000000000000000000000000000000000000000000000000000000005f52600452602490565b7fbc277732000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b67ffffffffffffffff1690815f52600460205260405f209167ffffffffffffffff83541615611b3c5750565b7ff761631b000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b60405190611b76604083610afd565b600182527fc0000000000000000000000000000000000000000000000000000000000000006020830152565b611c5b611bad61157a565b611c26611bc460208501611bca611bc48251611485565b51612fb7565b611bd385611485565b52611bdd84611485565b50611beb611bc482516113ef565b611bf4856113ef565b52611bfe846113ef565b50611c0c611bc48251611492565b611c1585611492565b52611c1f84611492565b5051611443565b611c2f82611443565b52611c3981611443565b50611c42611b67565b611c4b82611475565b52611c5581611475565b506126f7565b611c668251516115b4565b905f5b83518051821015611cbc579080600192600c82145f14611caa575050611c8e8361278f565b611c9882866114b3565b52611ca381856114b3565b5001611c69565b611cb791611bc4916114b3565b611c8e565b505050611cc991506126f7565b6020815191012090565b919091611ce083516114df565b925f5b8151811015611ed957611cf681836114b3565b51805160418103611eae575080601b60ff611d45611d3f611d19611d529661276e565b517fff000000000000000000000000000000000000000000000000000000000000001690565b60f81c90565b1610611e5b575b846130a3565b90611d5c816128bd565b1590811591611e51575b508015611e33575b611e0b5773ffffffffffffffffffffffffffffffffffffffff81165f5b838110611dab57505090611da56001926117f183896114b3565b01611ce3565b81611dbc61183e611824848c6114b3565b14611dc957600101611d8b565b7f33af0d5f000000000000000000000000000000000000000000000000000000005f5273ffffffffffffffffffffffffffffffffffffffff831660045260245ffd5b7f09cb44e6000000000000000000000000000000000000000000000000000000005f5260045ffd5b5073ffffffffffffffffffffffffffffffffffffffff811615611d6e565b905015155f611d66565b611e9d611e75611e70611d3f611d198561276e565b6128ab565b60f81b7fff000000000000000000000000000000000000000000000000000000000000001690565b5f1a611ea88261276e565b53611d4c565b7ff2db9ce1000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b505050565b5f198114610c975760010190565b905f915f5b8151811015611f4557611f2473ffffffffffffffffffffffffffffffffffffffff611f1c83856114b3565b5116846128c7565b611f31575b600101611ef1565b92611f3d600191611ede565b939050611f29565b50506003611f54915404610c89565b90818110611f60575050565b7fe2dcb1b9000000000000000000000000000000000000000000000000000000005f5260045260245260445ffd5b905f198201918211610c9757565b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff408201918211610c9757565b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff808201918211610c9757565b6020039060208211610c9757565b91908203918211610c9757565b905f915f5b815181101561206a5761204973ffffffffffffffffffffffffffffffffffffffff61204183856114b3565b51168461291e565b612056575b600101612016565b92612062600191611ede565b93905061204e565b50505190600382048203918211610c9757818110612086575050565b7f7818f4e4000000000000000000000000000000000000000000000000000000005f5260045260245260445ffd5b6120fe926116109261173d926040517fffffffffffffffffffffffffffffffffffffffff000000000000000000000000602082019260601b168252601481526104d7603482610afd565b805160021015611271576060610b9e9101516126b1565b8054821015611271575f5260205f2001905f90565b919067ffffffffffffffff80612148855467ffffffffffffffff1690565b9216911614908115916121e9575b506121e3576002019081548151036121e3575f5b81518110156121db576121a06121808285612115565b905473ffffffffffffffffffffffffffffffffffffffff9160031b1c1690565b73ffffffffffffffffffffffffffffffffffffffff6121c561183e61182485876114b3565b9116036121d45760010161216a565b5050505f90565b505050600190565b50505f90565b9050600182015414155f612156565b805f525f60205260ff61222c8360405f209073ffffffffffffffffffffffffffffffffffffffff165f5260205260405f2090565b54166121e357805f525f6020526122648260405f209073ffffffffffffffffffffffffffffffffffffffff165f5260205260405f2090565b60017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0082541617905573ffffffffffffffffffffffffffffffffffffffff339216907f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d5f80a4600190565b805f525f60205260ff6123038360405f209073ffffffffffffffffffffffffffffffffffffffff165f5260205260405f2090565b5416156121e357805f525f60205261233c8260405f209073ffffffffffffffffffffffffffffffffffffffff165f5260205260405f2090565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00815416905573ffffffffffffffffffffffffffffffffffffffff339216907ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b5f80a4600190565b60208151910120604051602081019182527f1260944489272988d9df285149b5aa1b0f48f2136d6f416159f840a3e07476006040820152604081526123ea606082610afd565b51902090565b604051906123ff602083610afd565b5f808352366020840137565b9061241582610b31565b6124226040519182610afd565b828152601f196115068294610b31565b611610612474919493946124466020610b31565b956124546040519788610afd565b602087526124626020610b31565b601f1960208901910136823752612577565b9061247f8451610ca9565b918451151580612557575b6124939061259d565b6124a56124a05f85612004565b61240b565b925f19015f5b8181106124bf575050610b9e939450612a92565b80612541600f61250461253b611d3f611d198d6124de60029960011c90565b908d6125358a61252d8a6125046124fb611d3f611d198a8a61277e565b60041c600f1690565b1660f81b7fff000000000000000000000000000000000000000000000000000000000000001690565b5f1a9261277e565b5361277e565b60ff1690565b5f1a612550600183018861277e565b53016124ab565b50600161248a565b6040519061256c82610ae1565b5f6020838281520152565b61257f61255f565b5060208151916040519261259284610ae1565b835201602082015290565b1561019557565b805180151590816125da575b5015610195576125bf90612d68565b905190602081106125ce575090565b6020036101000a900490565b6021915011155f6125b0565b6125ef81612d94565b15610195576125fd81612db4565b612606816114c7565b916126146040519384610afd565b818352601f19612623836114c7565b015f5b81811061269a575050602061264691015161264081612e15565b90610c9c565b5f905b8282106126565750505090565b61269281612665600193612e7b565b9061266e610b20565b82815281602082015261268186896114b3565b5261268c85886114b3565b50610c9c565b910190612649565b6020906126a561255f565b82828801015201612626565b6021815103610195576020015160018101809111610c97575190565b805115610195576126e0610b9e91612d68565b6126ec8193929361240b565b928360200190612f44565b5f9190825b81518410156127255761270f84836114b3565b51518101809111610c97576001909301926126fc565b61273091935061240b565b5f9060205b84518310156127605760019061274b84876114b3565b518051602082018386015e5101920191612735565b509050610b9e919250612fe3565b8051604010156112715760600190565b908151811015611271570160200190565b8051600181149081612893575b50156127cf57610b9e602080926040519381859251918291018484015e81015f838201520301601f198101835282610afd565b8051603781116127ff57806021916020604051946001830186526080830182870153018385015e82010160405290565b9060219061285c6128578460ff6fffffffffffffffffffffffffffffffff821160071b67ffffffffffffffff83821c1160061b1763ffffffff83821c1160051b1761ffff83821c1160041b17918260031c921c111790565b610c89565b92604051938360208284019460018601885260b7840182890153848460031b610100031b8389015201918601015e82010160405290565b905015611271576080602082015160f81c105f61279c565b60ff601b9116019060ff8211610c9757565b6004111561029457565b905f5b82548110156121d45773ffffffffffffffffffffffffffffffffffffffff6128f28285612115565b90549060031b1c1673ffffffffffffffffffffffffffffffffffffffff8316146121db576001016128ca565b905f5b82518110156121d45773ffffffffffffffffffffffffffffffffffffffff61294982856114b3565b511673ffffffffffffffffffffffffffffffffffffffff8316146121db57600101612921565b919061297b8351610ca9565b908351151580612a88575b61298f9061259d565b61299c6124a08284612004565b938192600180841614612a26575b5f19869101935b8481106129bf575050505050565b83612a1d6001612a13600f61250461253b611d3f611d198b60029b612a0c6129ff886125048f611d3f611d196129f86124fb9360011c90565b809961277e565b9b8d03809c5f1a9261277e565b538c61277e565b5f1a92018961277e565b530185906129b1565b92507f0f00000000000000000000000000000000000000000000000000000000000000612a6561253b611d3f611d19612a5f8760011c90565b8661277e565b60f81b165f1a612a7486611485565b535f19612a8083611ede565b9390506129aa565b5081811115612986565b915f915f612a9e61255f565b50845115612d2f5790935f915b81518310156101955782158080612d19575b61019557159081612cfc575b5061019557612adb61176283836114b3565b948551600281145f14612bd85750612afd612af86116b588611485565b613138565b95612b13612b0c8888846131a5565b8092610c9c565b965111612bba5715612b4a5750612b2a9051611f8e565b11610195575111612b41576116b5610b9e916113ef565b50610b9e6123f0565b919094612b578651611f8e565b82146101955780612b79612b75612b6f6001946113ef565b51612d94565b1590565b15612b9b57612b8a612b90916113ef565b5161312a565b915b01919490612aab565b612ba7612bb4916113ef565b5160208101519051902090565b91612b92565b505091509250612bcb915051611f8e565b1161019557610b9e6123f0565b929491939192601103612c9d5781518314612c7f57612c09612c0361253b611d3f611d19878761277e565b93610c89565b92601081101561019557612c26612c2082896114b3565b51613114565b15612c485750505050612c3b91925051611f8e565b0361019557610b9e6123f0565b86612c60612b75612b6f84600196989a97999b6114b3565b15612c7257612bb491612b8a916114b3565b612bb491612ba7916114b3565b505050612c8c9051611f8e565b03610195576116b5610b9e916114a2565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f696e76616c6964206e6f6465206c656e677468000000000000000000000000006044820152606490fd5b9050612d11612d0b84846114b3565b516130dd565b14155f612ac9565b50612d27612ba785856114b3565b871415612abd565b509050612d6092507f56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b42191501461259d565b610b9e6123f0565b906020820191612d788351612e15565b925190838201809211610c975751928303928311610c97579190565b805115612daf57602060c0910151515f1a10610ffe57600190565b505f90565b805115612daf575f9060208101908151612dcd81612e15565b8101809111610c9757915190518101809111610c975791905b828110612df35750905090565b612dfc81612e7b565b8101809111610c9757612e0f9091611ede565b90612de6565b515f1a6080811015612e2657505f90565b60b881108015612e65575b15612e3c5750600190565b60c0811015612e5657610b9e906128579060b75b90612004565b610b9e906128579060f7612e50565b5060c08110158015612e31575060f88110612e31565b80515f1a906080821015612e90575050600190565b60b8821015612ea65750612857610b9e91611fc9565b60c0821015612ee75760010151602082900360b7016101000a9004017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff4a0190565b60f8821015612efd5750612857610b9e91611f9c565b60010151602082900360f7016101000a9004017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0a0190565b601f8111610c97576101000a90565b90918015611ed9575b6020811015612f875780612f6057505050565b612f74612f6f612f7992611ff6565b612f35565b611f8e565b905182518216911916179052565b91908051825260208101809111610c97579060208101809111610c975791601f19810190811115612f4d57610c5c565b612fc1815161240b565b90815115612fdf57806020610b9e9201519051908360200190612f44565b5090565b805190919060378111613015578060219160206040519560018301875260c0830182880153018386015e830101604052565b9160219061306d6128578560ff6fffffffffffffffffffffffffffffffff821160071b67ffffffffffffffff83821c1160061b1763ffffffff83821c1160051b1761ffff83821c1160041b17918260031c921c111790565b93604051948360208284019460018601895260f78401828a0153848460031b610100031b838a015201918701015e830101604052565b81519190604183036130d3576130cc9250602082015190606060408401519301515f1a90613249565b9192909190565b50505f9160029190565b805160208110156130f5575060208101519051902090565b90602001512060405160208101918252602081526123ea604082610afd565b6001815103612daf5760200151515f1a60801490565b61313390612d68565b902090565b9081511561019557600f6131546124fb611d3f611d1986611485565b16806131675750610b9e60025f9361296f565b6001810361317c5750610b9e60015f9361296f565b600281036131925750610b9e600260019361296f565b60030361019557610b9e6001809361296f565b91905f5b838101808211610c9757825181108061323f575b15613237576131ed7fff00000000000000000000000000000000000000000000000000000000000000918461277e565b51167fff0000000000000000000000000000000000000000000000000000000000000061321a838661277e565b511690036132305761322b90611ede565b6131a9565b9250505090565b509250505090565b50835182106131bd565b91907f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a084116132d8579160209360809260ff5f9560405194855216868401526040830152606082015282805260015afa156132cd575f5173ffffffffffffffffffffffffffffffffffffffff8116156132c357905f905f90565b505f906001905f90565b6040513d5f823e3d90fd5b5050505f916003919056fea164736f6c634300081c000a2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d4c48d1d2b0f4f7485fc28e3db22341d96a20aa29e6efa8149da9751603abd4e06e0c24a6e293ff9b755263dbaa15ba3796b0b8d3fe17cfb4ddf8143b268eac47bd893629a699470e4ec82a5715bb4981fdaacc5d0a728bf5f55b801d8f4ef10bad3228b676f7d3cd4284a5443f17f1962b36e491b30a40b2405849e597ba5fb5"}} diff --git a/ibc-solidity/abi/bytecode/CosmosIFTSendCallConstructor.json b/ibc-solidity/abi/bytecode/CosmosIFTSendCallConstructor.json deleted file mode 100644 index a4369292e..000000000 --- a/ibc-solidity/abi/bytecode/CosmosIFTSendCallConstructor.json +++ /dev/null @@ -1 +0,0 @@ -{"abi":[{"type":"constructor","inputs":[{"name":"bridgeReceiveTypeUrl_","type":"string","internalType":"string"},{"name":"denom_","type":"string","internalType":"string"},{"name":"icaAddress_","type":"string","internalType":"string"}],"stateMutability":"nonpayable"},{"type":"function","name":"bridgeReceiveTypeUrl","inputs":[],"outputs":[{"name":"","type":"string","internalType":"string"}],"stateMutability":"view"},{"type":"function","name":"constructMintCall","inputs":[{"name":"receiver","type":"string","internalType":"string"},{"name":"amount","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"bytes","internalType":"bytes"}],"stateMutability":"view"},{"type":"function","name":"denom","inputs":[],"outputs":[{"name":"","type":"string","internalType":"string"}],"stateMutability":"view"},{"type":"function","name":"icaAddress","inputs":[],"outputs":[{"name":"","type":"string","internalType":"string"}],"stateMutability":"view"}],"bytecode":{"object":"0x60806040523461046857610ecb803803806100198161046c565b92833981016060828203126104685781516001600160401b0381116104685781610044918401610491565b60208301519092906001600160401b0381116104685782610066918301610491565b60408201519092906001600160401b038111610468576100869201610491565b82516001600160401b0381116102a3575f54600181811c9116801561045e575b602082101461028557601f81116103fc575b506020601f821160011461039b57819293945f92610390575b50508160011b915f199060031b1c1916175f555b81516001600160401b0381116102a357600154600181811c91168015610386575b602082101461028557601f8111610323575b50602092601f82116001146102c257928192935f926102b7575b50508160011b915f199060031b1c1916176001555b80516001600160401b0381116102a357600254600181811c91168015610299575b602082101461028557601f8111610222575b50602091601f82116001146101c2579181925f926101b7575b50508160011b915f199060031b1c1916176002555b6040516109e890816104e38239f35b015190505f80610193565b601f1982169260025f52805f20915f5b85811061020a575083600195106101f2575b505050811b016002556101a8565b01515f1960f88460031b161c191690555f80806101e4565b919260206001819286850151815501940192016101d2565b60025f527f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace601f830160051c8101916020841061027b575b601f0160051c01905b818110610270575061017a565b5f8155600101610263565b909150819061025a565b634e487b7160e01b5f52602260045260245ffd5b90607f1690610168565b634e487b7160e01b5f52604160045260245ffd5b015190505f80610132565b601f1982169360015f52805f20915f5b86811061030b57508360019596106102f3575b505050811b01600155610147565b01515f1960f88460031b161c191690555f80806102e5565b919260206001819286850151815501940192016102d2565b60015f527fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf6601f830160051c8101916020841061037c575b601f0160051c01905b8181106103715750610118565b5f8155600101610364565b909150819061035b565b90607f1690610106565b015190505f806100d1565b601f198216905f8052805f20915f5b8181106103e4575095836001959697106103cc575b505050811b015f556100e5565b01515f1960f88460031b161c191690555f80806103bf565b9192602060018192868b0151815501940192016103aa565b5f80527f290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e563601f830160051c81019160208410610454575b601f0160051c01905b81811061044957506100b8565b5f815560010161043c565b9091508190610433565b90607f16906100a6565b5f80fd5b6040519190601f01601f191682016001600160401b038111838210176102a357604052565b81601f82011215610468578051906001600160401b0382116102a3576104c0601f8301601f191660200161046c565b928284526020838301011161046857815f9260208093018386015e830101529056fe60806040526004361015610011575f80fd5b5f3560e01c80632ff02e27146107dc57806356d981a7146102275780638f2edc84146101675763c370b04214610045575f80fd5b34610163575f7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610163576040515f6001546100838161089f565b808452906001811690811561012157506001146100c3575b6100bf836100ab818503826108f0565b60405191829160208352602083019061095e565b0390f35b60015f9081527fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf6939250905b808210610107575090915081016020016100ab61009b565b9192600181602092548385880101520191019092916100ef565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660208086019190915291151560051b840190910191506100ab905061009b565b5f80fd5b34610163575f7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610163576040515f5f546101a48161089f565b808452906001811690811561012157506001146101cb576100bf836100ab818503826108f0565b5f8080527f290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e563939250905b80821061020d575090915081016020016100ab61009b565b9192600181602092548385880101520191019092916101f5565b346101635760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101635760043567ffffffffffffffff8111610163573660238201121561016357806004013567ffffffffffffffff8111610163573660248284010111610163575f602435807a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008110156107b4575b806d04ee2d6d415b85acef8100000000600a921015610799575b662386f26fc10000811015610785575b6305f5e100811015610774575b612710811015610765575b6064811015610757575b101561074d575b6001820190600a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff602161035b610345866109a1565b9561035360405197886108f0565b8087526109a1565b957fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe06020870197013688378501015b01917f30313233343536373839616263646566000000000000000000000000000000008282061a83530480156103e4577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600a919261038a565b5050604051927f7b226d65737361676573223a5b7b224074797065223a2200000000000000000060208501525f945f5461041d8161089f565b906001811690811561071257506001146106bc575b507f222c227369676e6572223a22000000000000000000000000000000000000000086526002545f966104648261089f565b916001811690811561067e5750600114610625575b50507f222c2264656e6f6d223a2200000000000000000000000000000000000000000086525f956001546104ac8161089f565b90600181169081156105e25750600114610584575b5050600e6100ab946004948489600c9660248b977f222c227265636569766572223a220000000000000000000000000000000000006100bf9e52018683013701907f222c22616d6f756e74223a22000000000000000000000000000000000000000084830152518092601a83015e01017f227d5d7d000000000000000000000000000000000000000000000000000000008382015203017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe48101845201826108f0565b60015f908152919750907fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf65b8282106105cb57505095909501600b0194600e6100ab6104c1565b60018160209254600b858d010152019101906105b0565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600b84810191909152821515909202909201019650600e90506100ab6104c1565b60025f90815292975090917f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace5b83821061066757505001600c01948680610479565b60018160209254600c858701015201910190610652565b600c9499507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0091509291921683830152801515020101948680610479565b5f808052919650907f290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e5635b8282106106fb57505084016037019486610432565b600181602092546037858b010152019101906106e6565b60379398507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0091501682870152801515028501019486610432565b906001019061030f565b606460029104930192610308565b612710600491049301926102fe565b6305f5e100600891049301926102f3565b662386f26fc10000601091049301926102e6565b6d04ee2d6d415b85acef8100000000602091049301926102d6565b50604091507a184f03e93ff9f4daa797ed6e38ed64bf6a1f01000000000000000081046102bc565b34610163575f7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610163576040515f60025461081a8161089f565b80845290600181169081156101215750600114610841576100bf836100ab818503826108f0565b60025f9081527f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace939250905b808210610885575090915081016020016100ab61009b565b91926001816020925483858801015201910190929161086d565b90600182811c921680156108e6575b60208310146108b957565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b91607f16916108ae565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff82111761093157604052565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f602080948051918291828752018686015e5f8582860101520116010190565b67ffffffffffffffff811161093157601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0166020019056fea164736f6c634300081c000a","sourceMap":"462:1821:57:-:0;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;-1:-1:-1;;;;;462:1821:57;;;;;;;;;;:::i;:::-;;;;;;;;-1:-1:-1;;;;;462:1821:57;;;;;;;;;;:::i;:::-;;;;;;;;-1:-1:-1;;;;;462:1821:57;;;;;;;;:::i;:::-;;;-1:-1:-1;;;;;462:1821:57;;;;-1:-1:-1;462:1821:57;;;;;;;;;;;-1:-1:-1;462:1821:57;;;;;;;;;;;-1:-1:-1;462:1821:57;;;;;;;;;;;;;-1:-1:-1;462:1821:57;;;;;;;;;;;;;;;;;;;-1:-1:-1;462:1821:57;;;;-1:-1:-1;;;;;462:1821:57;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;462:1821:57;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;462:1821:57;;;;1624:24;462:1821;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;462:1821:57;;;;;;;;;;;;;;;;;;;1624:24;462:1821;;;;;;;;;;;;;;;-1:-1:-1;462:1821:57;;;;;;;;;;1624:24;-1:-1:-1;462:1821:57;;-1:-1:-1;462:1821:57;;-1:-1:-1;462:1821:57;;;;;;;;;;;;;;;;;;;;1624:24;462:1821;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1624:24;-1:-1:-1;462:1821:57;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;462:1821:57;;;;;;;;;-1:-1:-1;462:1821:57;;;;;;;;-1:-1:-1;462:1821:57;;;;;-1:-1:-1;462:1821:57;;;;;;;;;;;;-1:-1:-1;462:1821:57;;;;;-1:-1:-1;462:1821:57;;;;;-1:-1:-1;462:1821:57;;;;;;;;;;;-1:-1:-1;462:1821:57;;-1:-1:-1;462:1821:57;;-1:-1:-1;462:1821:57;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;462:1821:57;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;462:1821:57;;;;;;;;;-1:-1:-1;462:1821:57;;;;;;;;;;;;;;;-1:-1:-1;462:1821:57;;;;;;;;;;-1:-1:-1;462:1821:57;;;-1:-1:-1;462:1821:57;;-1:-1:-1;462:1821:57;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;462:1821:57;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;462:1821:57;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;462:1821:57;;;;;;;;;-1:-1:-1;462:1821:57;;;;;;;;;;;;-1:-1:-1;462:1821:57;;;;;;;;;-1:-1:-1;;462:1821:57;;;-1:-1:-1;;;;;462:1821:57;;;;;;;;;;:::o;:::-;;;;;;;;;;;;-1:-1:-1;;;;;462:1821:57;;;;;;;;-1:-1:-1;;462:1821:57;;;;:::i;:::-;;;;;;;;;;;;;;-1:-1:-1;462:1821:57;;;;;;;;;;;;;;:::o","linkReferences":{}},"deployedBytecode":{"object":"0x60806040526004361015610011575f80fd5b5f3560e01c80632ff02e27146107dc57806356d981a7146102275780638f2edc84146101675763c370b04214610045575f80fd5b34610163575f7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610163576040515f6001546100838161089f565b808452906001811690811561012157506001146100c3575b6100bf836100ab818503826108f0565b60405191829160208352602083019061095e565b0390f35b60015f9081527fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf6939250905b808210610107575090915081016020016100ab61009b565b9192600181602092548385880101520191019092916100ef565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660208086019190915291151560051b840190910191506100ab905061009b565b5f80fd5b34610163575f7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610163576040515f5f546101a48161089f565b808452906001811690811561012157506001146101cb576100bf836100ab818503826108f0565b5f8080527f290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e563939250905b80821061020d575090915081016020016100ab61009b565b9192600181602092548385880101520191019092916101f5565b346101635760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101635760043567ffffffffffffffff8111610163573660238201121561016357806004013567ffffffffffffffff8111610163573660248284010111610163575f602435807a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008110156107b4575b806d04ee2d6d415b85acef8100000000600a921015610799575b662386f26fc10000811015610785575b6305f5e100811015610774575b612710811015610765575b6064811015610757575b101561074d575b6001820190600a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff602161035b610345866109a1565b9561035360405197886108f0565b8087526109a1565b957fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe06020870197013688378501015b01917f30313233343536373839616263646566000000000000000000000000000000008282061a83530480156103e4577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600a919261038a565b5050604051927f7b226d65737361676573223a5b7b224074797065223a2200000000000000000060208501525f945f5461041d8161089f565b906001811690811561071257506001146106bc575b507f222c227369676e6572223a22000000000000000000000000000000000000000086526002545f966104648261089f565b916001811690811561067e5750600114610625575b50507f222c2264656e6f6d223a2200000000000000000000000000000000000000000086525f956001546104ac8161089f565b90600181169081156105e25750600114610584575b5050600e6100ab946004948489600c9660248b977f222c227265636569766572223a220000000000000000000000000000000000006100bf9e52018683013701907f222c22616d6f756e74223a22000000000000000000000000000000000000000084830152518092601a83015e01017f227d5d7d000000000000000000000000000000000000000000000000000000008382015203017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe48101845201826108f0565b60015f908152919750907fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf65b8282106105cb57505095909501600b0194600e6100ab6104c1565b60018160209254600b858d010152019101906105b0565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600b84810191909152821515909202909201019650600e90506100ab6104c1565b60025f90815292975090917f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace5b83821061066757505001600c01948680610479565b60018160209254600c858701015201910190610652565b600c9499507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0091509291921683830152801515020101948680610479565b5f808052919650907f290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e5635b8282106106fb57505084016037019486610432565b600181602092546037858b010152019101906106e6565b60379398507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0091501682870152801515028501019486610432565b906001019061030f565b606460029104930192610308565b612710600491049301926102fe565b6305f5e100600891049301926102f3565b662386f26fc10000601091049301926102e6565b6d04ee2d6d415b85acef8100000000602091049301926102d6565b50604091507a184f03e93ff9f4daa797ed6e38ed64bf6a1f01000000000000000081046102bc565b34610163575f7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610163576040515f60025461081a8161089f565b80845290600181169081156101215750600114610841576100bf836100ab818503826108f0565b60025f9081527f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace939250905b808210610885575090915081016020016100ab61009b565b91926001816020925483858801015201910190929161086d565b90600182811c921680156108e6575b60208310146108b957565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b91607f16916108ae565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff82111761093157604052565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f602080948051918291828752018686015e5f8582860101520116010190565b67ffffffffffffffff811161093157601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0166020019056fea164736f6c634300081c000a","sourceMap":"462:1821:57:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;842:19;462:1821;;;;:::i;:::-;;;;;842:19;462:1821;;;842:19;;;;462:1821;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;;;;;842:19;462:1821;;;;;;;-1:-1:-1;462:1821:57;;;;;;;-1:-1:-1;462:1821:57;;-1:-1:-1;462:1821:57;;;;;;;;;;842:19;462:1821;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;462:1821:57;;-1:-1:-1;462:1821:57;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;-1:-1:-1;462:1821:57;;;;;;;-1:-1:-1;462:1821:57;;-1:-1:-1;462:1821:57;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29291:8:123;29282:17;;;29278:103;;462:1821:57;29398:17:123;29407:8;29978:7;29398:17;;;29394:103;;462:1821:57;29523:8:123;29514:17;;;29510:103;;462:1821:57;29639:7:123;29630:16;;;29626:100;;462:1821:57;29752:7:123;29743:16;;;29739:100;;462:1821:57;29865:7:123;29856:16;;;29852:100;;462:1821:57;29969:16:123;;29965:66;;462:1821:57;;;;;29978:7:123;462:1821:57;1545:94:117;462:1821:57;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;:::i;:::-;;;;;;;;;;;1545:94:117;;;1652:247;462:1821:57;1706:111:117;;;;;;;;462:1821:57;1867:10:117;;1863:21;;462:1821:57;29978:7:123;1652:247:117;;;;1863:21;1879:5;;462:1821:57;;1917:357;462:1821;;1917:357;;462:1821;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;-1:-1:-1;462:1821:57;;;2057:10;462:1821;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;1917:357;462:1821;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1917:357;;;;;;;;;;:::i;462:1821::-;;;;;;;;-1:-1:-1;462:1821:57;;;;;;;;-1:-1:-1;;462:1821:57;;;;;;;;1917:357;462:1821;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;462:1821:57;;-1:-1:-1;1917:357:57;462:1821;;;2057:10;462:1821;;;;;;-1:-1:-1;462:1821:57;;;;;;;;;-1:-1:-1;;462:1821:57;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;462:1821:57;;;;;;;;-1:-1:-1;;462:1821:57;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29965:66:123;462:1821:57;;;29965:66:123;;;29852:100;29865:7;29936:1;462:1821:57;;;;29852:100:123;;;29739;29752:7;462:1821:57;;;;;29739:100:123;;;29626;29639:7;29710:1;462:1821:57;;;;29626:100:123;;;29510:103;29523:8;29596:2;462:1821:57;;;;29510:103:123;;;29394;29407:8;462:1821:57;;;;;29394:103:123;;;29278;-1:-1:-1;462:1821:57;;-1:-1:-1;29291:8:123;462:1821:57;;29278:103:123;;462:1821:57;;;;;;;;;;;;;;1105:24;462:1821;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;1105:24;462:1821;;;;;;;-1:-1:-1;462:1821:57;;;;;;;-1:-1:-1;462:1821:57;;-1:-1:-1;462:1821:57;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;-1:-1:-1;462:1821:57;;;;;-1:-1:-1;462:1821:57;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;462:1821:57;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;:::o","linkReferences":{}},"methodIdentifiers":{"bridgeReceiveTypeUrl()":"8f2edc84","constructMintCall(string,uint256)":"56d981a7","denom()":"c370b042","icaAddress()":"2ff02e27"},"rawMetadata":"{\"compiler\":{\"version\":\"0.8.28+commit.7893614a\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"string\",\"name\":\"bridgeReceiveTypeUrl_\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"denom_\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"icaAddress_\",\"type\":\"string\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"bridgeReceiveTypeUrl\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"receiver\",\"type\":\"string\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"constructMintCall\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"denom\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"icaAddress\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"This implementation encodes mint calls in protojson format for Cosmos SDK IFT module\",\"kind\":\"dev\",\"methods\":{\"constructMintCall(string,uint256)\":{\"details\":\"Encodes the mint call as protojson CosmosTx for Cosmos SDK ICS27-GMP module\",\"params\":{\"amount\":\"The amount of tokens to mint\",\"receiver\":\"The address of the receiver on the counterparty chain\"},\"returns\":{\"_0\":\"The constructed call data for the ICS27-GMP message\"}},\"constructor\":{\"params\":{\"bridgeReceiveTypeUrl_\":\"The type URL for MsgIFTMint\",\"denom_\":\"The denom of the token on the Cosmos SDK chain (e.g., \\\"uatom\\\", \\\"ibc/...\\\")\",\"icaAddress_\":\"The interchain account address on the Cosmos SDK chain\"}}},\"stateVariables\":{\"icaAddress\":{\"details\":\"Required to set the signer of the MsgIFTMint message (Cosmos SDK limitation)\"}},\"title\":\"Cosmos SDK IFT Send Call Constructor\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"bridgeReceiveTypeUrl()\":{\"notice\":\"The type URL for the MsgIFTMint message in the TokenFactory module\"},\"constructMintCall(string,uint256)\":{\"notice\":\"Constructs the ICS27-GMP call data for minting IFT tokens on the counterparty chain\"},\"constructor\":{\"notice\":\"Creates a new CosmosIFTSendCallConstructor\"},\"denom()\":{\"notice\":\"The denomination of the counterparty token on the Cosmos SDK chain\"},\"icaAddress()\":{\"notice\":\"The interchain account address of the submitter account on the Cosmos SDK chain\"}},\"notice\":\"Constructs ICS27-GMP call data for minting IFT tokens on Cosmos SDK-based counterparty chains\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/utils/CosmosIFTSendCallConstructor.sol\":\"CosmosIFTSendCallConstructor\"},\"evmVersion\":\"cancun\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"none\"},\"optimizer\":{\"enabled\":true,\"runs\":10000},\"remappings\":[\":@openzeppelin-contracts/=node_modules/@openzeppelin/contracts/\",\":@openzeppelin-upgradeable/=node_modules/@openzeppelin/contracts-upgradeable/\",\":@openzeppelin/=node_modules/@openzeppelin/\",\":@sp1-contracts/=node_modules/sp1-contracts/contracts/src/\",\":@uniswap/permit2/=node_modules/@uniswap/permit2/\",\":forge-std/=node_modules/forge-std/src/\",\":sp1-contracts/=node_modules/sp1-contracts/\"],\"viaIR\":true},\"sources\":{\"contracts/interfaces/IIFTSendCallConstructor.sol\":{\"keccak256\":\"0xaa49a7ac2dbdc445c5d6c2d49484f39c343da930f9d6dd62ad20b5b0c7a99e55\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://014c493ca7b15906323cc74464dbfacce33d5c1025670971074f5d54572c6970\",\"dweb:/ipfs/QmdbaM8S4jyT3PBDoHuWJnsrXx24K566qZgDjhD1EFzhrS\"]},\"contracts/utils/CosmosIFTSendCallConstructor.sol\":{\"keccak256\":\"0xc231e15347e5d16bca9d699025402b3ed0631ce4b9b389bb1e161d9a4f5a9646\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://73977e15c36a317001a3482bad415526461708d4f85028d0276f47eccaabb759\",\"dweb:/ipfs/QmeM1NatEEZ3a5bcL5uGZs7GxeniXo4sWX3jeXs6aGuQFH\"]},\"node_modules/@openzeppelin/contracts/utils/Panic.sol\":{\"keccak256\":\"0xf7fe324703a64fc51702311dc51562d5cb1497734f074e4f483bfb6717572d7a\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://c6a5ff4f9fd8649b7ee20800b7fa387d3465bd77cf20c2d1068cd5c98e1ed57a\",\"dweb:/ipfs/QmVSaVJf9FXFhdYEYeCEfjMVHrxDh5qL4CGkxdMWpQCrqG\"]},\"node_modules/@openzeppelin/contracts/utils/Strings.sol\":{\"keccak256\":\"0xad148d59f05165f9217d0a9e1ac8f772abb02ea6aaad8a756315c532bf79f9f4\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://15e3599867c2182f5831e9268b274b2ef2047825837df6b4d81c9e89254b093e\",\"dweb:/ipfs/QmZbL7XAYr5RmaNaooPgZRmcDXaudfsYQfYD9y5iAECvpS\"]},\"node_modules/@openzeppelin/contracts/utils/math/Math.sol\":{\"keccak256\":\"0x1225214420c83ebcca88f2ae2b50f053aaa7df7bd684c3e878d334627f2edfc6\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://6c5fab4970634f9ab9a620983dc1c8a30153981a0b1a521666e269d0a11399d3\",\"dweb:/ipfs/QmVRnBC575MESGkEHndjujtR7qub2FzU9RWy9eKLp4hPZB\"]},\"node_modules/@openzeppelin/contracts/utils/math/SafeCast.sol\":{\"keccak256\":\"0x195533c86d0ef72bcc06456a4f66a9b941f38eb403739b00f21fd7c1abd1ae54\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://b1d578337048cad08c1c03041cca5978eff5428aa130c781b271ad9e5566e1f8\",\"dweb:/ipfs/QmPFKL2r9CBsMwmUqqdcFPfHZB2qcs9g1HDrPxzWSxomvy\"]},\"node_modules/@openzeppelin/contracts/utils/math/SignedMath.sol\":{\"keccak256\":\"0xb1970fac7b64e6c09611e6691791e848d5e3fe410fa5899e7df2e0afd77a99e3\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://db5fbb3dddd8b7047465b62575d96231ba8a2774d37fb4737fbf23340fabbb03\",\"dweb:/ipfs/QmVUSvooZKEdEdap619tcJjTLcAuH6QBdZqAzWwnAXZAWJ\"]}},\"version\":1}","metadata":{"compiler":{"version":"0.8.28+commit.7893614a"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"string","name":"bridgeReceiveTypeUrl_","type":"string"},{"internalType":"string","name":"denom_","type":"string"},{"internalType":"string","name":"icaAddress_","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"stateMutability":"view","type":"function","name":"bridgeReceiveTypeUrl","outputs":[{"internalType":"string","name":"","type":"string"}]},{"inputs":[{"internalType":"string","name":"receiver","type":"string"},{"internalType":"uint256","name":"amount","type":"uint256"}],"stateMutability":"view","type":"function","name":"constructMintCall","outputs":[{"internalType":"bytes","name":"","type":"bytes"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"denom","outputs":[{"internalType":"string","name":"","type":"string"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"icaAddress","outputs":[{"internalType":"string","name":"","type":"string"}]}],"devdoc":{"kind":"dev","methods":{"constructMintCall(string,uint256)":{"details":"Encodes the mint call as protojson CosmosTx for Cosmos SDK ICS27-GMP module","params":{"amount":"The amount of tokens to mint","receiver":"The address of the receiver on the counterparty chain"},"returns":{"_0":"The constructed call data for the ICS27-GMP message"}},"constructor":{"params":{"bridgeReceiveTypeUrl_":"The type URL for MsgIFTMint","denom_":"The denom of the token on the Cosmos SDK chain (e.g., \"uatom\", \"ibc/...\")","icaAddress_":"The interchain account address on the Cosmos SDK chain"}}},"version":1},"userdoc":{"kind":"user","methods":{"bridgeReceiveTypeUrl()":{"notice":"The type URL for the MsgIFTMint message in the TokenFactory module"},"constructMintCall(string,uint256)":{"notice":"Constructs the ICS27-GMP call data for minting IFT tokens on the counterparty chain"},"constructor":{"notice":"Creates a new CosmosIFTSendCallConstructor"},"denom()":{"notice":"The denomination of the counterparty token on the Cosmos SDK chain"},"icaAddress()":{"notice":"The interchain account address of the submitter account on the Cosmos SDK chain"}},"version":1}},"settings":{"remappings":["@openzeppelin-contracts/=node_modules/@openzeppelin/contracts/","@openzeppelin-upgradeable/=node_modules/@openzeppelin/contracts-upgradeable/","@openzeppelin/=node_modules/@openzeppelin/","@sp1-contracts/=node_modules/sp1-contracts/contracts/src/","@uniswap/permit2/=node_modules/@uniswap/permit2/","forge-std/=node_modules/forge-std/src/","sp1-contracts/=node_modules/sp1-contracts/"],"optimizer":{"enabled":true,"runs":10000},"metadata":{"bytecodeHash":"none"},"compilationTarget":{"contracts/utils/CosmosIFTSendCallConstructor.sol":"CosmosIFTSendCallConstructor"},"evmVersion":"cancun","libraries":{},"viaIR":true},"sources":{"contracts/interfaces/IIFTSendCallConstructor.sol":{"keccak256":"0xaa49a7ac2dbdc445c5d6c2d49484f39c343da930f9d6dd62ad20b5b0c7a99e55","urls":["bzz-raw://014c493ca7b15906323cc74464dbfacce33d5c1025670971074f5d54572c6970","dweb:/ipfs/QmdbaM8S4jyT3PBDoHuWJnsrXx24K566qZgDjhD1EFzhrS"],"license":"MIT"},"contracts/utils/CosmosIFTSendCallConstructor.sol":{"keccak256":"0xc231e15347e5d16bca9d699025402b3ed0631ce4b9b389bb1e161d9a4f5a9646","urls":["bzz-raw://73977e15c36a317001a3482bad415526461708d4f85028d0276f47eccaabb759","dweb:/ipfs/QmeM1NatEEZ3a5bcL5uGZs7GxeniXo4sWX3jeXs6aGuQFH"],"license":"MIT"},"node_modules/@openzeppelin/contracts/utils/Panic.sol":{"keccak256":"0xf7fe324703a64fc51702311dc51562d5cb1497734f074e4f483bfb6717572d7a","urls":["bzz-raw://c6a5ff4f9fd8649b7ee20800b7fa387d3465bd77cf20c2d1068cd5c98e1ed57a","dweb:/ipfs/QmVSaVJf9FXFhdYEYeCEfjMVHrxDh5qL4CGkxdMWpQCrqG"],"license":"MIT"},"node_modules/@openzeppelin/contracts/utils/Strings.sol":{"keccak256":"0xad148d59f05165f9217d0a9e1ac8f772abb02ea6aaad8a756315c532bf79f9f4","urls":["bzz-raw://15e3599867c2182f5831e9268b274b2ef2047825837df6b4d81c9e89254b093e","dweb:/ipfs/QmZbL7XAYr5RmaNaooPgZRmcDXaudfsYQfYD9y5iAECvpS"],"license":"MIT"},"node_modules/@openzeppelin/contracts/utils/math/Math.sol":{"keccak256":"0x1225214420c83ebcca88f2ae2b50f053aaa7df7bd684c3e878d334627f2edfc6","urls":["bzz-raw://6c5fab4970634f9ab9a620983dc1c8a30153981a0b1a521666e269d0a11399d3","dweb:/ipfs/QmVRnBC575MESGkEHndjujtR7qub2FzU9RWy9eKLp4hPZB"],"license":"MIT"},"node_modules/@openzeppelin/contracts/utils/math/SafeCast.sol":{"keccak256":"0x195533c86d0ef72bcc06456a4f66a9b941f38eb403739b00f21fd7c1abd1ae54","urls":["bzz-raw://b1d578337048cad08c1c03041cca5978eff5428aa130c781b271ad9e5566e1f8","dweb:/ipfs/QmPFKL2r9CBsMwmUqqdcFPfHZB2qcs9g1HDrPxzWSxomvy"],"license":"MIT"},"node_modules/@openzeppelin/contracts/utils/math/SignedMath.sol":{"keccak256":"0xb1970fac7b64e6c09611e6691791e848d5e3fe410fa5899e7df2e0afd77a99e3","urls":["bzz-raw://db5fbb3dddd8b7047465b62575d96231ba8a2774d37fb4737fbf23340fabbb03","dweb:/ipfs/QmVUSvooZKEdEdap619tcJjTLcAuH6QBdZqAzWwnAXZAWJ"],"license":"MIT"}},"version":1},"id":57} \ No newline at end of file diff --git a/ibc-solidity/abi/bytecode/DummyLightClient.json b/ibc-solidity/abi/bytecode/DummyLightClient.json index f0e60cef3..6ea4810e3 100644 --- a/ibc-solidity/abi/bytecode/DummyLightClient.json +++ b/ibc-solidity/abi/bytecode/DummyLightClient.json @@ -1 +1 @@ -{"abi":[{"type":"function","name":"getClientState","inputs":[],"outputs":[{"name":"","type":"bytes","internalType":"bytes"}],"stateMutability":"view"},{"type":"function","name":"misbehaviour","inputs":[{"name":"","type":"bytes","internalType":"bytes"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"updateClient","inputs":[{"name":"updateMsg","type":"bytes","internalType":"bytes"}],"outputs":[{"name":"","type":"uint8","internalType":"enum ILightClientMsgs.UpdateResult"}],"stateMutability":"nonpayable"},{"type":"function","name":"verifyMembership","inputs":[{"name":"msg_","type":"tuple","internalType":"struct ILightClientMsgs.MsgVerifyMembership","components":[{"name":"proof","type":"bytes","internalType":"bytes"},{"name":"proofHeight","type":"tuple","internalType":"struct IICS02ClientMsgs.Height","components":[{"name":"revisionNumber","type":"uint64","internalType":"uint64"},{"name":"revisionHeight","type":"uint64","internalType":"uint64"}]},{"name":"path","type":"bytes[]","internalType":"bytes[]"},{"name":"value","type":"bytes","internalType":"bytes"}]}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"nonpayable"},{"type":"function","name":"verifyNonMembership","inputs":[{"name":"msg_","type":"tuple","internalType":"struct ILightClientMsgs.MsgVerifyNonMembership","components":[{"name":"proof","type":"bytes","internalType":"bytes"},{"name":"proofHeight","type":"tuple","internalType":"struct IICS02ClientMsgs.Height","components":[{"name":"revisionNumber","type":"uint64","internalType":"uint64"},{"name":"revisionHeight","type":"uint64","internalType":"uint64"}]},{"name":"path","type":"bytes[]","internalType":"bytes[]"}]}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"nonpayable"},{"type":"error","name":"MembershipExists","inputs":[]},{"type":"error","name":"MissingMembership","inputs":[]},{"type":"error","name":"UnknownHeight","inputs":[]},{"type":"error","name":"ValueMismatch","inputs":[]},{"type":"error","name":"ZeroTimestamp","inputs":[]}],"bytecode":{"object":"0x60808060405234601557610ab7908161001a8239f35b5f80fdfe6080806040526004361015610012575f80fd5b5f3560e01c9081630bece356146102ac575080634d6d9ffb1461020d578063682ed5f0146100d2578063ddba6537146100c25763ef913a4b14610053575f80fd5b346100be575f6003193601126100be576100ba60405167ffffffffffffffff5f54818116602084015260401c16604082015267ffffffffffffffff600154166060820152606081526100a66080826107a9565b604051918291602083526020830190610768565b0390f35b5f80fd5b346100be576100d036610717565b005b346100be5760206003193601126100be5760043567ffffffffffffffff81116100be578036039060a06003198301126100be57602481019161012d61011684610929565b93610127606485018560040161085d565b9161098f565b5f52600360205260405f20549182156101e5577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdd608482013592018212156100be570160048101359067ffffffffffffffff82116100be5760240181360381136100be5761019c9136916107f9565b60208151910120036101bd5760209067ffffffffffffffff60405191168152f35b7fdd8e4af7000000000000000000000000000000000000000000000000000000005f5260045ffd5b7ff6b593a3000000000000000000000000000000000000000000000000000000005f5260045ffd5b346100be5760206003193601126100be5760043567ffffffffffffffff81116100be57608060031982360301126100be5761025f6024820161012761025182610929565b93606481019060040161085d565b5f52600360205260405f20546102845760209067ffffffffffffffff60405191168152f35b7f679fc91d000000000000000000000000000000000000000000000000000000005f5260045ffd5b346100be576102ba36610717565b8101906020818303126100be5780359067ffffffffffffffff82116100be570191828203608081126100be57606082019082821067ffffffffffffffff8311176106ea576040918252126100be576040516103148161078d565b61031d846107cc565b815261032b602085016107cc565b6020820152815261033e604084016107cc565b926020820193845260608101359067ffffffffffffffff82116100be57019180601f840112156100be57823592610374846107e1565b9361038260405195866107a9565b80855260208086019160051b830101918383116100be5760208101915b8383106105ef578787876040810191825267ffffffffffffffff835116156105c757519167ffffffffffffffff80845116916103e3602086019383855116906108b1565b82825116905f52600260205260405f20907fffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000825416179055511680602060405161042c8161078d565b868152015267ffffffffffffffff8451167fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000005f5416175f5581517fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff6fffffffffffffffff00000000000000005f549260401b169116175f557fffffffffffffffffffffffffffffffffffffffffffffffff000000000000000060015416176001555f5b825180518210156105bd576020908260051b010151805160405160208101916040820160208452815180915260608301602060608360051b8601019301915f5b81811061057657505050506001949392826105386020946105599403601f1981018352826107a9565b51902067ffffffffffffffff89511667ffffffffffffffff885116906108e3565b91015160208151910120905f52600360205260405f2055016104cf565b909192936020806105b1837fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa08a600196030188528851610768565b9601940192910161050f565b60206040515f8152f35b7fda16d767000000000000000000000000000000000000000000000000000000005f5260045ffd5b823567ffffffffffffffff81116100be578201906040601f1983880301126100be576040519061061e8261078d565b602083013567ffffffffffffffff81116100be5760209084010187601f820112156100be57803561064e816107e1565b9161065c60405193846107a9565b81835260208084019260051b820101918a83116100be5760208201905b8382106106bc5750505050825260408301359167ffffffffffffffff83116100be576106ad8860208096958196010161083f565b8382015281520192019161039f565b813567ffffffffffffffff81116100be576020916106df8e84809488010161083f565b815201910190610679565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b9060206003198301126100be5760043567ffffffffffffffff81116100be57826023820112156100be5780600401359267ffffffffffffffff84116100be57602484830101116100be576024019190565b90601f19601f602080948051918291828752018686015e5f8582860101520116010190565b6040810190811067ffffffffffffffff8211176106ea57604052565b90601f601f19910116810190811067ffffffffffffffff8211176106ea57604052565b359067ffffffffffffffff821682036100be57565b67ffffffffffffffff81116106ea5760051b60200190565b92919267ffffffffffffffff82116106ea57604051916108236020601f19601f84011601846107a9565b8294818452818301116100be578281602093845f960137010152565b9080601f830112156100be5781602061085a933591016107f9565b90565b9035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1813603018212156100be570180359067ffffffffffffffff82116100be57602001918160051b360383136100be57565b9067ffffffffffffffff60405191816020840194168452166040820152604081526108dd6060826107a9565b51902090565b9167ffffffffffffffff604051928160208501951685521660408301526060820152606081526108dd6080826107a9565b3567ffffffffffffffff811681036100be5790565b61094890610942602061093b83610914565b9201610914565b906108b1565b5f52600260205267ffffffffffffffff60405f20541680156109675790565b7f8da291bd000000000000000000000000000000000000000000000000000000005f5260045ffd5b909291926109a860206109a184610914565b9301610914565b90604051946020860191816040880160208552526060870160608360051b89010192825f907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1813603015b838310610a215750505050505094610a188161085a969703601f1981018352826107a9565b519020916108e3565b9091929394957fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa08c82030186528635828112156100be578301906020823592019167ffffffffffffffff81116100be5780360383136100be57602082601f19601f8480600198869897879852868601375f848201860152011601019801960194930191906109f356fea164736f6c634300081c000a","sourceMap":"387:5920:41:-:0;;;;;;;;;;;;;;;;;","linkReferences":{}},"deployedBytecode":{"object":"0x6080806040526004361015610012575f80fd5b5f3560e01c9081630bece356146102ac575080634d6d9ffb1461020d578063682ed5f0146100d2578063ddba6537146100c25763ef913a4b14610053575f80fd5b346100be575f6003193601126100be576100ba60405167ffffffffffffffff5f54818116602084015260401c16604082015267ffffffffffffffff600154166060820152606081526100a66080826107a9565b604051918291602083526020830190610768565b0390f35b5f80fd5b346100be576100d036610717565b005b346100be5760206003193601126100be5760043567ffffffffffffffff81116100be578036039060a06003198301126100be57602481019161012d61011684610929565b93610127606485018560040161085d565b9161098f565b5f52600360205260405f20549182156101e5577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdd608482013592018212156100be570160048101359067ffffffffffffffff82116100be5760240181360381136100be5761019c9136916107f9565b60208151910120036101bd5760209067ffffffffffffffff60405191168152f35b7fdd8e4af7000000000000000000000000000000000000000000000000000000005f5260045ffd5b7ff6b593a3000000000000000000000000000000000000000000000000000000005f5260045ffd5b346100be5760206003193601126100be5760043567ffffffffffffffff81116100be57608060031982360301126100be5761025f6024820161012761025182610929565b93606481019060040161085d565b5f52600360205260405f20546102845760209067ffffffffffffffff60405191168152f35b7f679fc91d000000000000000000000000000000000000000000000000000000005f5260045ffd5b346100be576102ba36610717565b8101906020818303126100be5780359067ffffffffffffffff82116100be570191828203608081126100be57606082019082821067ffffffffffffffff8311176106ea576040918252126100be576040516103148161078d565b61031d846107cc565b815261032b602085016107cc565b6020820152815261033e604084016107cc565b926020820193845260608101359067ffffffffffffffff82116100be57019180601f840112156100be57823592610374846107e1565b9361038260405195866107a9565b80855260208086019160051b830101918383116100be5760208101915b8383106105ef578787876040810191825267ffffffffffffffff835116156105c757519167ffffffffffffffff80845116916103e3602086019383855116906108b1565b82825116905f52600260205260405f20907fffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000825416179055511680602060405161042c8161078d565b868152015267ffffffffffffffff8451167fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000005f5416175f5581517fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff6fffffffffffffffff00000000000000005f549260401b169116175f557fffffffffffffffffffffffffffffffffffffffffffffffff000000000000000060015416176001555f5b825180518210156105bd576020908260051b010151805160405160208101916040820160208452815180915260608301602060608360051b8601019301915f5b81811061057657505050506001949392826105386020946105599403601f1981018352826107a9565b51902067ffffffffffffffff89511667ffffffffffffffff885116906108e3565b91015160208151910120905f52600360205260405f2055016104cf565b909192936020806105b1837fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa08a600196030188528851610768565b9601940192910161050f565b60206040515f8152f35b7fda16d767000000000000000000000000000000000000000000000000000000005f5260045ffd5b823567ffffffffffffffff81116100be578201906040601f1983880301126100be576040519061061e8261078d565b602083013567ffffffffffffffff81116100be5760209084010187601f820112156100be57803561064e816107e1565b9161065c60405193846107a9565b81835260208084019260051b820101918a83116100be5760208201905b8382106106bc5750505050825260408301359167ffffffffffffffff83116100be576106ad8860208096958196010161083f565b8382015281520192019161039f565b813567ffffffffffffffff81116100be576020916106df8e84809488010161083f565b815201910190610679565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b9060206003198301126100be5760043567ffffffffffffffff81116100be57826023820112156100be5780600401359267ffffffffffffffff84116100be57602484830101116100be576024019190565b90601f19601f602080948051918291828752018686015e5f8582860101520116010190565b6040810190811067ffffffffffffffff8211176106ea57604052565b90601f601f19910116810190811067ffffffffffffffff8211176106ea57604052565b359067ffffffffffffffff821682036100be57565b67ffffffffffffffff81116106ea5760051b60200190565b92919267ffffffffffffffff82116106ea57604051916108236020601f19601f84011601846107a9565b8294818452818301116100be578281602093845f960137010152565b9080601f830112156100be5781602061085a933591016107f9565b90565b9035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1813603018212156100be570180359067ffffffffffffffff82116100be57602001918160051b360383136100be57565b9067ffffffffffffffff60405191816020840194168452166040820152604081526108dd6060826107a9565b51902090565b9167ffffffffffffffff604051928160208501951685521660408301526060820152606081526108dd6080826107a9565b3567ffffffffffffffff811681036100be5790565b61094890610942602061093b83610914565b9201610914565b906108b1565b5f52600260205267ffffffffffffffff60405f20541680156109675790565b7f8da291bd000000000000000000000000000000000000000000000000000000005f5260045ffd5b909291926109a860206109a184610914565b9301610914565b90604051946020860191816040880160208552526060870160608360051b89010192825f907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1813603015b838310610a215750505050505094610a188161085a969703601f1981018352826107a9565b519020916108e3565b9091929394957fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa08c82030186528635828112156100be578301906020823592019167ffffffffffffffff81116100be5780360383136100be57602082601f19601f8480600198869897879852868601375f848201860152011601019801960194930191906109f356fea164736f6c634300081c000a","sourceMap":"387:5920:41:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;387:5920:41;;;;;;;;;;;;;;4446:24;;;387:5920;;;;;;;;;;;;;;;;;4446:24;;;;;;:::i;:::-;387:5920;;;;;4446:24;387:5920;;4446:24;387:5920;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;387:5920:41;;;;;;;;;;;;;;;;;-1:-1:-1;;387:5920:41;;;;;3457:16;;;3446:28;3528:43;3446:28;;;:::i;:::-;3561:9;;;;;387:5920;;;3561:9;:::i;:::-;3528:43;;:::i;:::-;387:5920;;3505:22;387:5920;;;;;;3586:23;;;3582:80;;387:5920;3698:10;;;387:5920;;;;;;;;;;;;;;;;;;;3457:16;387:5920;;;;;;;;;;;;;:::i;:::-;;;;;;3688:21;3675:34;3671:87;;387:5920;;;;;;;;;;3671:87;3732:15;387:5920;3732:15;387:5920;;3732:15;3582:80;3632:19;387:5920;3632:19;387:5920;;3632:19;387:5920;;;;;-1:-1:-1;;387:5920:41;;;;;;;;;;;;;-1:-1:-1;;387:5920:41;;;;;;;4052:43;3981:16;;;4085:9;3970:28;;;:::i;:::-;4085:9;;;;387:5920;;;4085:9;:::i;4052:43::-;387:5920;;4029:22;387:5920;;;;;;4106:79;;387:5920;;;;;;;;;;4106:79;4156:18;387:5920;4156:18;387:5920;;4156:18;387:5920;;;;;;;:::i;:::-;2399:40;;387:5920;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2453:19;2449:72;;2571:11;387:5920;;;;;;2646:21;2612:56;387:5920;2646:21;;387:5920;;;;;2612:56;;:::i;:::-;387:5920;;;;;;;2678:11;387:5920;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;2742:70;387:5920;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2872:3;2847:16;;387:5920;;2843:27;;;;;387:5920;;;;;;;2922:19;2996:15;;387:5920;;;2985:27;;387:5920;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2985:27;;;;387:5920;2985:27;;;;;387:5920;2985:27;3051:70;2985:27;;-1:-1:-1;;2985:27:41;;;;;;:::i;:::-;387:5920;2975:38;;387:5920;;;;;;;;3051:70;;:::i;:::-;3185:16;;;387:5920;;;;;3175:27;387:5920;;;3135:22;387:5920;;;;;;;2828:13;;387:5920;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;2843:27;387:5920;;;;;;;2449:72;2495:15;387:5920;2495:15;387:5920;;2495:15;387:5920;;;;;;;;;;;;-1:-1:-1;;387:5920:41;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;387:5920:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;-1:-1:-1;;387:5920:41;;;;;;;;;;;;;;;;;-1:-1:-1;387:5920:41;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;:::o;:::-;;;-1:-1:-1;;387:5920:41;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;:::o;:::-;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;-1:-1:-1;;387:5920:41;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;-1:-1:-1;387:5920:41;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;:::i;:::-;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;5589:174::-;;387:5920;;;5713:42;;;;;387:5920;;;;;;;;;;5713:42;;;;;;:::i;:::-;387:5920;5703:53;;5589:174;:::o;6041:264::-;;387:5920;;;6245:52;;;;;387:5920;;;;;;;;;;;;;;6245:52;;;;;;:::i;387:5920::-;;;;;;;;;;:::o;4633:298::-;4765:56;4633:298;4799:21;;4776;;;:::i;:::-;4799;;;:::i;:::-;4765:56;;:::i;:::-;-1:-1:-1;387:5920:41;4753:11;4799:21;387:5920;;;-1:-1:-1;387:5920:41;;;4836:14;;4832:67;;4633:298;:::o;4832:67::-;4873:15;-1:-1:-1;4873:15:41;;-1:-1:-1;4873:15:41;5112:282;;;;;5336:21;;5313;;;:::i;:::-;5336;;;:::i;:::-;387:5920;;;5369:16;5336:21;5369:16;;387:5920;;;;;5336:21;387:5920;;;;;;;;;;;;;;;-1:-1:-1;387:5920:41;;;;;;;;;;;;5369:16;;;;;;;;;5298:89;5369:16;;;-1:-1:-1;;5369:16:41;;;;;;:::i;:::-;387:5920;5359:27;;5298:89;;:::i;387:5920::-;;;;;;;;;;;;;;;;;;;;;;;;;5336:21;387:5920;;;;;;;;;;;;;;;;;5336:21;387:5920;-1:-1:-1;;387:5920:41;;;;;;;;;;;;;;;-1:-1:-1;387:5920:41;;;;;;;;;;;;;;;;;;;;","linkReferences":{}},"methodIdentifiers":{"getClientState()":"ef913a4b","misbehaviour(bytes)":"ddba6537","updateClient(bytes)":"0bece356","verifyMembership((bytes,(uint64,uint64),bytes[],bytes))":"682ed5f0","verifyNonMembership((bytes,(uint64,uint64),bytes[]))":"4d6d9ffb"},"rawMetadata":"{\"compiler\":{\"version\":\"0.8.28+commit.7893614a\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"name\":\"MembershipExists\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"MissingMembership\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"UnknownHeight\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ValueMismatch\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ZeroTimestamp\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"getClientState\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"name\":\"misbehaviour\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"updateMsg\",\"type\":\"bytes\"}],\"name\":\"updateClient\",\"outputs\":[{\"internalType\":\"enum ILightClientMsgs.UpdateResult\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes\",\"name\":\"proof\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"uint64\",\"name\":\"revisionNumber\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"revisionHeight\",\"type\":\"uint64\"}],\"internalType\":\"struct IICS02ClientMsgs.Height\",\"name\":\"proofHeight\",\"type\":\"tuple\"},{\"internalType\":\"bytes[]\",\"name\":\"path\",\"type\":\"bytes[]\"},{\"internalType\":\"bytes\",\"name\":\"value\",\"type\":\"bytes\"}],\"internalType\":\"struct ILightClientMsgs.MsgVerifyMembership\",\"name\":\"msg_\",\"type\":\"tuple\"}],\"name\":\"verifyMembership\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes\",\"name\":\"proof\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"uint64\",\"name\":\"revisionNumber\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"revisionHeight\",\"type\":\"uint64\"}],\"internalType\":\"struct IICS02ClientMsgs.Height\",\"name\":\"proofHeight\",\"type\":\"tuple\"},{\"internalType\":\"bytes[]\",\"name\":\"path\",\"type\":\"bytes[]\"}],\"internalType\":\"struct ILightClientMsgs.MsgVerifyNonMembership\",\"name\":\"msg_\",\"type\":\"tuple\"}],\"name\":\"verifyNonMembership\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"getClientState()\":{\"returns\":{\"_0\":\"The client state.\"}},\"misbehaviour(bytes)\":{\"params\":{\"misbehaviourMsg\":\"The misbehaviour message\"}},\"updateClient(bytes)\":{\"params\":{\"updateMsg\":\"The encoded update message e.g., an SP1 proof.\"},\"returns\":{\"_0\":\"The result of the update operation\"}},\"verifyMembership((bytes,(uint64,uint64),bytes[],bytes))\":{\"details\":\"Notice that this message is not view, as it may update the client state for caching purposes.\",\"params\":{\"msg_\":\"The membership message\"},\"returns\":{\"_0\":\"The unix timestamp of the verification height in the counterparty chain in seconds.\"}},\"verifyNonMembership((bytes,(uint64,uint64),bytes[]))\":{\"details\":\"Notice that this message is not view, as it may update the client state for caching purposes.\",\"params\":{\"msg_\":\"The membership message\"},\"returns\":{\"_0\":\"The unix timestamp of the verification height in the counterparty chain in seconds.\"}}},\"title\":\"Dummy Light Client\",\"version\":1},\"userdoc\":{\"errors\":{\"MembershipExists()\":[{\"notice\":\"A membership record exists for the queried height and path.\"}],\"MissingMembership()\":[{\"notice\":\"No membership record exists for the queried height and path.\"}],\"UnknownHeight()\":[{\"notice\":\"No timestamp has been registered for the queried height.\"}],\"ValueMismatch()\":[{\"notice\":\"The queried value does not match the stored value hash.\"}],\"ZeroTimestamp()\":[{\"notice\":\"Consensus timestamps must be non-zero.\"}]},\"kind\":\"user\",\"methods\":{\"getClientState()\":{\"notice\":\"Returns the client state.\"},\"misbehaviour(bytes)\":{\"notice\":\"Misbehaviour handling, moves the light client to the frozen state if misbehaviour is detected\"},\"updateClient(bytes)\":{\"notice\":\"Updating the client and consensus state\"},\"verifyMembership((bytes,(uint64,uint64),bytes[],bytes))\":{\"notice\":\"Querying the membership of a key-value pair\"},\"verifyNonMembership((bytes,(uint64,uint64),bytes[]))\":{\"notice\":\"Querying the non-membership of a key\"}},\"notice\":\"Insecure light client for local development and testing; proofs are ignored.\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/light-clients/dummy/DummyLightClient.sol\":\"DummyLightClient\"},\"evmVersion\":\"cancun\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"none\"},\"optimizer\":{\"enabled\":true,\"runs\":10000},\"remappings\":[\":@openzeppelin-contracts/=node_modules/@openzeppelin/contracts/\",\":@openzeppelin-upgradeable/=node_modules/@openzeppelin/contracts-upgradeable/\",\":@openzeppelin/=node_modules/@openzeppelin/\",\":@sp1-contracts/=node_modules/sp1-contracts/contracts/src/\",\":@uniswap/permit2/=node_modules/@uniswap/permit2/\",\":forge-std/=node_modules/forge-std/src/\",\":sp1-contracts/=node_modules/sp1-contracts/\"],\"viaIR\":true},\"sources\":{\"contracts/interfaces/ILightClient.sol\":{\"keccak256\":\"0x3b2361546ee834a442d844c979fbad3458ee13146b093f585587a09e19a266af\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://5b5d53101bb598f14a79cb1092479736fa18e8f84945ea6ef80f4dac84466042\",\"dweb:/ipfs/QmaTCo6M3Z9aYCSX65AQtixo1sB4ymQUDAgTXSKHqJHGDh\"]},\"contracts/light-clients/dummy/DummyLightClient.sol\":{\"keccak256\":\"0xc437cd8a47fe9aaaca75d70d1a8334f92a5a14a2165dac7125142786363f6b0b\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://928edc008c2a0748bcb36822d7a347cd5a1d30b26917cdeaa8b01b49bb3dd12b\",\"dweb:/ipfs/QmekzYQLNGG2JHW1deJ2mPLuoCxoHyjiT73K9fh5HMavW5\"]},\"contracts/msgs/IICS02ClientMsgs.sol\":{\"keccak256\":\"0x03d1265eae327c3744d774bf22a30d845233d50664921c9aa57cef2d71fd89d2\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://89900781cc5c60540a237d92d42745ea6165765ee8fb4d50e8137a717195cc75\",\"dweb:/ipfs/Qmbx5p8gZ8sEMMeZytXsLee49JUayhAaoJ2yxX93WUrvQo\"]},\"contracts/msgs/ILightClientMsgs.sol\":{\"keccak256\":\"0x8d1e56ab166a7b4aa6999708e3214a4645ebbc3835c2b2a4c255c9923eebafde\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://8bd4200dc04d950c0f050623fa9a8accdbec877fd446c039d4dd6c678bdf1513\",\"dweb:/ipfs/QmZQTViaA7N6BVNDzJ1Z6w799PrPoE4ajPueZSPwX4sGZ9\"]}},\"version\":1}","metadata":{"compiler":{"version":"0.8.28+commit.7893614a"},"language":"Solidity","output":{"abi":[{"inputs":[],"type":"error","name":"MembershipExists"},{"inputs":[],"type":"error","name":"MissingMembership"},{"inputs":[],"type":"error","name":"UnknownHeight"},{"inputs":[],"type":"error","name":"ValueMismatch"},{"inputs":[],"type":"error","name":"ZeroTimestamp"},{"inputs":[],"stateMutability":"view","type":"function","name":"getClientState","outputs":[{"internalType":"bytes","name":"","type":"bytes"}]},{"inputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"nonpayable","type":"function","name":"misbehaviour"},{"inputs":[{"internalType":"bytes","name":"updateMsg","type":"bytes"}],"stateMutability":"nonpayable","type":"function","name":"updateClient","outputs":[{"internalType":"enum ILightClientMsgs.UpdateResult","name":"","type":"uint8"}]},{"inputs":[{"internalType":"struct ILightClientMsgs.MsgVerifyMembership","name":"msg_","type":"tuple","components":[{"internalType":"bytes","name":"proof","type":"bytes"},{"internalType":"struct IICS02ClientMsgs.Height","name":"proofHeight","type":"tuple","components":[{"internalType":"uint64","name":"revisionNumber","type":"uint64"},{"internalType":"uint64","name":"revisionHeight","type":"uint64"}]},{"internalType":"bytes[]","name":"path","type":"bytes[]"},{"internalType":"bytes","name":"value","type":"bytes"}]}],"stateMutability":"nonpayable","type":"function","name":"verifyMembership","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[{"internalType":"struct ILightClientMsgs.MsgVerifyNonMembership","name":"msg_","type":"tuple","components":[{"internalType":"bytes","name":"proof","type":"bytes"},{"internalType":"struct IICS02ClientMsgs.Height","name":"proofHeight","type":"tuple","components":[{"internalType":"uint64","name":"revisionNumber","type":"uint64"},{"internalType":"uint64","name":"revisionHeight","type":"uint64"}]},{"internalType":"bytes[]","name":"path","type":"bytes[]"}]}],"stateMutability":"nonpayable","type":"function","name":"verifyNonMembership","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]}],"devdoc":{"kind":"dev","methods":{"getClientState()":{"returns":{"_0":"The client state."}},"misbehaviour(bytes)":{"params":{"misbehaviourMsg":"The misbehaviour message"}},"updateClient(bytes)":{"params":{"updateMsg":"The encoded update message e.g., an SP1 proof."},"returns":{"_0":"The result of the update operation"}},"verifyMembership((bytes,(uint64,uint64),bytes[],bytes))":{"details":"Notice that this message is not view, as it may update the client state for caching purposes.","params":{"msg_":"The membership message"},"returns":{"_0":"The unix timestamp of the verification height in the counterparty chain in seconds."}},"verifyNonMembership((bytes,(uint64,uint64),bytes[]))":{"details":"Notice that this message is not view, as it may update the client state for caching purposes.","params":{"msg_":"The membership message"},"returns":{"_0":"The unix timestamp of the verification height in the counterparty chain in seconds."}}},"version":1},"userdoc":{"kind":"user","methods":{"getClientState()":{"notice":"Returns the client state."},"misbehaviour(bytes)":{"notice":"Misbehaviour handling, moves the light client to the frozen state if misbehaviour is detected"},"updateClient(bytes)":{"notice":"Updating the client and consensus state"},"verifyMembership((bytes,(uint64,uint64),bytes[],bytes))":{"notice":"Querying the membership of a key-value pair"},"verifyNonMembership((bytes,(uint64,uint64),bytes[]))":{"notice":"Querying the non-membership of a key"}},"version":1}},"settings":{"remappings":["@openzeppelin-contracts/=node_modules/@openzeppelin/contracts/","@openzeppelin-upgradeable/=node_modules/@openzeppelin/contracts-upgradeable/","@openzeppelin/=node_modules/@openzeppelin/","@sp1-contracts/=node_modules/sp1-contracts/contracts/src/","@uniswap/permit2/=node_modules/@uniswap/permit2/","forge-std/=node_modules/forge-std/src/","sp1-contracts/=node_modules/sp1-contracts/"],"optimizer":{"enabled":true,"runs":10000},"metadata":{"bytecodeHash":"none"},"compilationTarget":{"contracts/light-clients/dummy/DummyLightClient.sol":"DummyLightClient"},"evmVersion":"cancun","libraries":{},"viaIR":true},"sources":{"contracts/interfaces/ILightClient.sol":{"keccak256":"0x3b2361546ee834a442d844c979fbad3458ee13146b093f585587a09e19a266af","urls":["bzz-raw://5b5d53101bb598f14a79cb1092479736fa18e8f84945ea6ef80f4dac84466042","dweb:/ipfs/QmaTCo6M3Z9aYCSX65AQtixo1sB4ymQUDAgTXSKHqJHGDh"],"license":"Apache-2.0"},"contracts/light-clients/dummy/DummyLightClient.sol":{"keccak256":"0xc437cd8a47fe9aaaca75d70d1a8334f92a5a14a2165dac7125142786363f6b0b","urls":["bzz-raw://928edc008c2a0748bcb36822d7a347cd5a1d30b26917cdeaa8b01b49bb3dd12b","dweb:/ipfs/QmekzYQLNGG2JHW1deJ2mPLuoCxoHyjiT73K9fh5HMavW5"],"license":"Apache-2.0"},"contracts/msgs/IICS02ClientMsgs.sol":{"keccak256":"0x03d1265eae327c3744d774bf22a30d845233d50664921c9aa57cef2d71fd89d2","urls":["bzz-raw://89900781cc5c60540a237d92d42745ea6165765ee8fb4d50e8137a717195cc75","dweb:/ipfs/Qmbx5p8gZ8sEMMeZytXsLee49JUayhAaoJ2yxX93WUrvQo"],"license":"Apache-2.0"},"contracts/msgs/ILightClientMsgs.sol":{"keccak256":"0x8d1e56ab166a7b4aa6999708e3214a4645ebbc3835c2b2a4c255c9923eebafde","urls":["bzz-raw://8bd4200dc04d950c0f050623fa9a8accdbec877fd446c039d4dd6c678bdf1513","dweb:/ipfs/QmZQTViaA7N6BVNDzJ1Z6w799PrPoE4ajPueZSPwX4sGZ9"],"license":"Apache-2.0"}},"version":1},"id":41} \ No newline at end of file +{"abi":[{"type":"function","name":"getClientState","inputs":[],"outputs":[{"name":"","type":"bytes","internalType":"bytes"}],"stateMutability":"view"},{"type":"function","name":"misbehaviour","inputs":[{"name":"","type":"bytes","internalType":"bytes"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"updateClient","inputs":[{"name":"updateMsg","type":"bytes","internalType":"bytes"}],"outputs":[{"name":"","type":"uint8","internalType":"enum ILightClientMsgs.UpdateResult"}],"stateMutability":"nonpayable"},{"type":"function","name":"verifyMembership","inputs":[{"name":"msg_","type":"tuple","internalType":"struct ILightClientMsgs.MsgVerifyMembership","components":[{"name":"proof","type":"bytes","internalType":"bytes"},{"name":"proofHeight","type":"tuple","internalType":"struct IICS02ClientMsgs.Height","components":[{"name":"revisionNumber","type":"uint64","internalType":"uint64"},{"name":"revisionHeight","type":"uint64","internalType":"uint64"}]},{"name":"path","type":"bytes[]","internalType":"bytes[]"},{"name":"value","type":"bytes","internalType":"bytes"}]}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"nonpayable"},{"type":"function","name":"verifyNonMembership","inputs":[{"name":"msg_","type":"tuple","internalType":"struct ILightClientMsgs.MsgVerifyNonMembership","components":[{"name":"proof","type":"bytes","internalType":"bytes"},{"name":"proofHeight","type":"tuple","internalType":"struct IICS02ClientMsgs.Height","components":[{"name":"revisionNumber","type":"uint64","internalType":"uint64"},{"name":"revisionHeight","type":"uint64","internalType":"uint64"}]},{"name":"path","type":"bytes[]","internalType":"bytes[]"}]}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"nonpayable"},{"type":"error","name":"MembershipExists","inputs":[]},{"type":"error","name":"MissingMembership","inputs":[]},{"type":"error","name":"UnknownHeight","inputs":[]},{"type":"error","name":"ValueMismatch","inputs":[]},{"type":"error","name":"ZeroTimestamp","inputs":[]}],"bytecode":{"object":"0x60808060405234601557610ab7908161001a8239f35b5f80fdfe6080806040526004361015610012575f80fd5b5f3560e01c9081630bece356146102ac575080634d6d9ffb1461020d578063682ed5f0146100d2578063ddba6537146100c25763ef913a4b14610053575f80fd5b346100be575f6003193601126100be576100ba60405167ffffffffffffffff5f54818116602084015260401c16604082015267ffffffffffffffff600154166060820152606081526100a66080826107a9565b604051918291602083526020830190610768565b0390f35b5f80fd5b346100be576100d036610717565b005b346100be5760206003193601126100be5760043567ffffffffffffffff81116100be578036039060a06003198301126100be57602481019161012d61011684610929565b93610127606485018560040161085d565b9161098f565b5f52600360205260405f20549182156101e5577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdd608482013592018212156100be570160048101359067ffffffffffffffff82116100be5760240181360381136100be5761019c9136916107f9565b60208151910120036101bd5760209067ffffffffffffffff60405191168152f35b7fdd8e4af7000000000000000000000000000000000000000000000000000000005f5260045ffd5b7ff6b593a3000000000000000000000000000000000000000000000000000000005f5260045ffd5b346100be5760206003193601126100be5760043567ffffffffffffffff81116100be57608060031982360301126100be5761025f6024820161012761025182610929565b93606481019060040161085d565b5f52600360205260405f20546102845760209067ffffffffffffffff60405191168152f35b7f679fc91d000000000000000000000000000000000000000000000000000000005f5260045ffd5b346100be576102ba36610717565b8101906020818303126100be5780359067ffffffffffffffff82116100be570191828203608081126100be57606082019082821067ffffffffffffffff8311176106ea576040918252126100be576040516103148161078d565b61031d846107cc565b815261032b602085016107cc565b6020820152815261033e604084016107cc565b926020820193845260608101359067ffffffffffffffff82116100be57019180601f840112156100be57823592610374846107e1565b9361038260405195866107a9565b80855260208086019160051b830101918383116100be5760208101915b8383106105ef578787876040810191825267ffffffffffffffff835116156105c757519167ffffffffffffffff80845116916103e3602086019383855116906108b1565b82825116905f52600260205260405f20907fffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000825416179055511680602060405161042c8161078d565b868152015267ffffffffffffffff8451167fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000005f5416175f5581517fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff6fffffffffffffffff00000000000000005f549260401b169116175f557fffffffffffffffffffffffffffffffffffffffffffffffff000000000000000060015416176001555f5b825180518210156105bd576020908260051b010151805160405160208101916040820160208452815180915260608301602060608360051b8601019301915f5b81811061057657505050506001949392826105386020946105599403601f1981018352826107a9565b51902067ffffffffffffffff89511667ffffffffffffffff885116906108e3565b91015160208151910120905f52600360205260405f2055016104cf565b909192936020806105b1837fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa08a600196030188528851610768565b9601940192910161050f565b60206040515f8152f35b7fda16d767000000000000000000000000000000000000000000000000000000005f5260045ffd5b823567ffffffffffffffff81116100be578201906040601f1983880301126100be576040519061061e8261078d565b602083013567ffffffffffffffff81116100be5760209084010187601f820112156100be57803561064e816107e1565b9161065c60405193846107a9565b81835260208084019260051b820101918a83116100be5760208201905b8382106106bc5750505050825260408301359167ffffffffffffffff83116100be576106ad8860208096958196010161083f565b8382015281520192019161039f565b813567ffffffffffffffff81116100be576020916106df8e84809488010161083f565b815201910190610679565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b9060206003198301126100be5760043567ffffffffffffffff81116100be57826023820112156100be5780600401359267ffffffffffffffff84116100be57602484830101116100be576024019190565b90601f19601f602080948051918291828752018686015e5f8582860101520116010190565b6040810190811067ffffffffffffffff8211176106ea57604052565b90601f601f19910116810190811067ffffffffffffffff8211176106ea57604052565b359067ffffffffffffffff821682036100be57565b67ffffffffffffffff81116106ea5760051b60200190565b92919267ffffffffffffffff82116106ea57604051916108236020601f19601f84011601846107a9565b8294818452818301116100be578281602093845f960137010152565b9080601f830112156100be5781602061085a933591016107f9565b90565b9035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1813603018212156100be570180359067ffffffffffffffff82116100be57602001918160051b360383136100be57565b9067ffffffffffffffff60405191816020840194168452166040820152604081526108dd6060826107a9565b51902090565b9167ffffffffffffffff604051928160208501951685521660408301526060820152606081526108dd6080826107a9565b3567ffffffffffffffff811681036100be5790565b61094890610942602061093b83610914565b9201610914565b906108b1565b5f52600260205267ffffffffffffffff60405f20541680156109675790565b7f8da291bd000000000000000000000000000000000000000000000000000000005f5260045ffd5b909291926109a860206109a184610914565b9301610914565b90604051946020860191816040880160208552526060870160608360051b89010192825f907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1813603015b838310610a215750505050505094610a188161085a969703601f1981018352826107a9565b519020916108e3565b9091929394957fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa08c82030186528635828112156100be578301906020823592019167ffffffffffffffff81116100be5780360383136100be57602082601f19601f8480600198869897879852868601375f848201860152011601019801960194930191906109f356fea164736f6c634300081c000a"}} diff --git a/ibc-solidity/abi/bytecode/SP1ICS07Tendermint.json b/ibc-solidity/abi/bytecode/SP1ICS07Tendermint.json index aa7cd9e37..3c553641c 100644 --- a/ibc-solidity/abi/bytecode/SP1ICS07Tendermint.json +++ b/ibc-solidity/abi/bytecode/SP1ICS07Tendermint.json @@ -1 +1 @@ -{"abi":[{"type":"constructor","inputs":[{"name":"updateClientProgramVkey","type":"bytes32","internalType":"bytes32"},{"name":"membershipProgramVkey","type":"bytes32","internalType":"bytes32"},{"name":"updateClientAndMembershipProgramVkey","type":"bytes32","internalType":"bytes32"},{"name":"misbehaviourProgramVkey","type":"bytes32","internalType":"bytes32"},{"name":"sp1Verifier","type":"address","internalType":"address"},{"name":"_clientState","type":"bytes","internalType":"bytes"},{"name":"_consensusState","type":"bytes32","internalType":"bytes32"},{"name":"roleManager","type":"address","internalType":"address"}],"stateMutability":"nonpayable"},{"type":"function","name":"ALLOWED_SP1_CLOCK_DRIFT","inputs":[],"outputs":[{"name":"","type":"uint16","internalType":"uint16"}],"stateMutability":"view"},{"type":"function","name":"DEFAULT_ADMIN_ROLE","inputs":[],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"type":"function","name":"MEMBERSHIP_PROGRAM_VKEY","inputs":[],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"type":"function","name":"MISBEHAVIOUR_PROGRAM_VKEY","inputs":[],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"type":"function","name":"PROOF_SUBMITTER_ROLE","inputs":[],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"type":"function","name":"UPDATE_CLIENT_AND_MEMBERSHIP_PROGRAM_VKEY","inputs":[],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"type":"function","name":"UPDATE_CLIENT_PROGRAM_VKEY","inputs":[],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"type":"function","name":"VERIFIER","inputs":[],"outputs":[{"name":"","type":"address","internalType":"contract ISP1Verifier"}],"stateMutability":"view"},{"type":"function","name":"clientState","inputs":[],"outputs":[{"name":"chainId","type":"string","internalType":"string"},{"name":"trustLevel","type":"tuple","internalType":"struct IICS07TendermintMsgs.TrustThreshold","components":[{"name":"numerator","type":"uint8","internalType":"uint8"},{"name":"denominator","type":"uint8","internalType":"uint8"}]},{"name":"latestHeight","type":"tuple","internalType":"struct IICS02ClientMsgs.Height","components":[{"name":"revisionNumber","type":"uint64","internalType":"uint64"},{"name":"revisionHeight","type":"uint64","internalType":"uint64"}]},{"name":"trustingPeriod","type":"uint32","internalType":"uint32"},{"name":"unbondingPeriod","type":"uint32","internalType":"uint32"},{"name":"isFrozen","type":"bool","internalType":"bool"},{"name":"zkAlgorithm","type":"uint8","internalType":"enum IICS07TendermintMsgs.SupportedZkAlgorithm"}],"stateMutability":"view"},{"type":"function","name":"getClientState","inputs":[],"outputs":[{"name":"","type":"bytes","internalType":"bytes"}],"stateMutability":"view"},{"type":"function","name":"getConsensusStateHash","inputs":[{"name":"revisionHeight","type":"uint64","internalType":"uint64"}],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"type":"function","name":"getRoleAdmin","inputs":[{"name":"role","type":"bytes32","internalType":"bytes32"}],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"type":"function","name":"grantRole","inputs":[{"name":"role","type":"bytes32","internalType":"bytes32"},{"name":"account","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"hasRole","inputs":[{"name":"role","type":"bytes32","internalType":"bytes32"},{"name":"account","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"misbehaviour","inputs":[{"name":"misbehaviourMsg","type":"bytes","internalType":"bytes"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"multicall","inputs":[{"name":"data","type":"bytes[]","internalType":"bytes[]"}],"outputs":[{"name":"results","type":"bytes[]","internalType":"bytes[]"}],"stateMutability":"nonpayable"},{"type":"function","name":"renounceRole","inputs":[{"name":"role","type":"bytes32","internalType":"bytes32"},{"name":"callerConfirmation","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"revokeRole","inputs":[{"name":"role","type":"bytes32","internalType":"bytes32"},{"name":"account","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"supportsInterface","inputs":[{"name":"interfaceId","type":"bytes4","internalType":"bytes4"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"updateClient","inputs":[{"name":"updateMsg","type":"bytes","internalType":"bytes"}],"outputs":[{"name":"","type":"uint8","internalType":"enum ILightClientMsgs.UpdateResult"}],"stateMutability":"nonpayable"},{"type":"function","name":"verifyMembership","inputs":[{"name":"msg_","type":"tuple","internalType":"struct ILightClientMsgs.MsgVerifyMembership","components":[{"name":"proof","type":"bytes","internalType":"bytes"},{"name":"proofHeight","type":"tuple","internalType":"struct IICS02ClientMsgs.Height","components":[{"name":"revisionNumber","type":"uint64","internalType":"uint64"},{"name":"revisionHeight","type":"uint64","internalType":"uint64"}]},{"name":"path","type":"bytes[]","internalType":"bytes[]"},{"name":"value","type":"bytes","internalType":"bytes"}]}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"nonpayable"},{"type":"function","name":"verifyNonMembership","inputs":[{"name":"msg_","type":"tuple","internalType":"struct ILightClientMsgs.MsgVerifyNonMembership","components":[{"name":"proof","type":"bytes","internalType":"bytes"},{"name":"proofHeight","type":"tuple","internalType":"struct IICS02ClientMsgs.Height","components":[{"name":"revisionNumber","type":"uint64","internalType":"uint64"},{"name":"revisionHeight","type":"uint64","internalType":"uint64"}]},{"name":"path","type":"bytes[]","internalType":"bytes[]"}]}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"nonpayable"},{"type":"event","name":"RoleAdminChanged","inputs":[{"name":"role","type":"bytes32","indexed":true,"internalType":"bytes32"},{"name":"previousAdminRole","type":"bytes32","indexed":true,"internalType":"bytes32"},{"name":"newAdminRole","type":"bytes32","indexed":true,"internalType":"bytes32"}],"anonymous":false},{"type":"event","name":"RoleGranted","inputs":[{"name":"role","type":"bytes32","indexed":true,"internalType":"bytes32"},{"name":"account","type":"address","indexed":true,"internalType":"address"},{"name":"sender","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"type":"event","name":"RoleRevoked","inputs":[{"name":"role","type":"bytes32","indexed":true,"internalType":"bytes32"},{"name":"account","type":"address","indexed":true,"internalType":"address"},{"name":"sender","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"type":"error","name":"AccessControlBadConfirmation","inputs":[]},{"type":"error","name":"AccessControlUnauthorizedAccount","inputs":[{"name":"account","type":"address","internalType":"address"},{"name":"neededRole","type":"bytes32","internalType":"bytes32"}]},{"type":"error","name":"AddressEmptyCode","inputs":[{"name":"target","type":"address","internalType":"address"}]},{"type":"error","name":"CannotHandleMisbehavior","inputs":[]},{"type":"error","name":"ChainIdMismatch","inputs":[{"name":"expected","type":"string","internalType":"string"},{"name":"actual","type":"string","internalType":"string"}]},{"type":"error","name":"ClientStateMismatch","inputs":[{"name":"expected","type":"bytes","internalType":"bytes"},{"name":"actual","type":"bytes","internalType":"bytes"}]},{"type":"error","name":"ConsensusStateHashMismatch","inputs":[{"name":"expected","type":"bytes32","internalType":"bytes32"},{"name":"actual","type":"bytes32","internalType":"bytes32"}]},{"type":"error","name":"ConsensusStateNotFound","inputs":[]},{"type":"error","name":"ConsensusStateRootMismatch","inputs":[{"name":"expected","type":"bytes32","internalType":"bytes32"},{"name":"actual","type":"bytes32","internalType":"bytes32"}]},{"type":"error","name":"EmptyValue","inputs":[]},{"type":"error","name":"FailedCall","inputs":[]},{"type":"error","name":"FeatureNotSupported","inputs":[]},{"type":"error","name":"FrozenClientState","inputs":[]},{"type":"error","name":"InvalidMembershipProof","inputs":[]},{"type":"error","name":"KeyValuePairNotInCache","inputs":[{"name":"path","type":"bytes[]","internalType":"bytes[]"},{"name":"value","type":"bytes","internalType":"bytes"}]},{"type":"error","name":"LengthIsOutOfRange","inputs":[{"name":"length","type":"uint256","internalType":"uint256"},{"name":"min","type":"uint256","internalType":"uint256"},{"name":"max","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"MembershipProofKeyNotFound","inputs":[{"name":"path","type":"bytes[]","internalType":"bytes[]"}]},{"type":"error","name":"MembershipProofValueMismatch","inputs":[{"name":"expected","type":"bytes","internalType":"bytes"},{"name":"actual","type":"bytes","internalType":"bytes"}]},{"type":"error","name":"ProofHeightMismatch","inputs":[{"name":"expectedRevisionNumber","type":"uint64","internalType":"uint64"},{"name":"expectedRevisionHeight","type":"uint64","internalType":"uint64"},{"name":"actualRevisionNumber","type":"uint64","internalType":"uint64"},{"name":"actualRevisionHeight","type":"uint64","internalType":"uint64"}]},{"type":"error","name":"ProofIsInTheFuture","inputs":[{"name":"now","type":"uint256","internalType":"uint256"},{"name":"proofTimestamp","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"ProofIsTooOld","inputs":[{"name":"now","type":"uint256","internalType":"uint256"},{"name":"proofTimestamp","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"TrustThresholdMismatch","inputs":[{"name":"expectedNumerator","type":"uint256","internalType":"uint256"},{"name":"expectedDenominator","type":"uint256","internalType":"uint256"},{"name":"actualNumerator","type":"uint256","internalType":"uint256"},{"name":"actualDenominator","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"TrustingPeriodMismatch","inputs":[{"name":"expected","type":"uint256","internalType":"uint256"},{"name":"actual","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"TrustingPeriodTooLong","inputs":[{"name":"trustingPeriod","type":"uint256","internalType":"uint256"},{"name":"unbondingPeriod","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"UnbondingPeriodMismatch","inputs":[{"name":"expected","type":"uint256","internalType":"uint256"},{"name":"actual","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"UnknownMembershipProofType","inputs":[{"name":"proofType","type":"uint8","internalType":"uint8"}]},{"type":"error","name":"UnknownZkAlgorithm","inputs":[{"name":"algorithm","type":"uint8","internalType":"uint8"}]},{"type":"error","name":"VerificationKeyMismatch","inputs":[{"name":"expected","type":"bytes32","internalType":"bytes32"},{"name":"actual","type":"bytes32","internalType":"bytes32"}]}],"bytecode":{"object":"0x61012060405234610541576137268038038061001a81610564565b928339810161010082820312610541578151916020810151604082015160608301519061004960808501610589565b60a08501519095906001600160401b0381116105415785019080601f8301121561054157815161007b9260200161059d565b9261008d60e060c08701519601610589565b9660805260a05260c05260e05280518101906020820190602081840312610541576020810151906001600160401b038211610541570191829003601f1981019061012013610541576040519160e083016001600160401b0381118482101761052d5760405260208401516001600160401b038111610541576020908501019080601f830112156105415781516101259260200161059d565b825260408112610541576040610139610545565b916101458286016105dd565b8352610153606086016105dd565b602084015260208401928352603f19011261054157610170610545565b61017c608085016105eb565b815261018a60a085016105eb565b6020820152604083019081526101a260c085016105ff565b90606084019182526101b660e086016105ff565b92608085019384526101008601519586151587036105415760a0860196875261012001519460028610156105415760c08101958652518051906001600160401b03821161052d57600154600181811c91168015610523575b602082101461050f57601f81116104ac575b50602090601f831160011461043f5763ffffffff95949392915f9183610434575b50508160011b915f199060031b1c1916176001555b5160ff81511661ff00602060025493015160081b169161ffff191617176002555160018060401b0381511660035491602068010000000000000000600160801b0391015160401b169160018060801b031916171760035551169267ffffffff00000000600454925160201b169051151560401b92519160028310156104205769ff00000000000000000068ff00000000000000009360481b169469ff000000000000000000199160018060481b0319161716179116171760045560018060401b0360035460401c165f52600560205260405f205560018060a01b03166101005260045463ffffffff8116610708810163ffffffff811161040c5763ffffffff809360201c1692839116116103f757826001600160a01b0381166103de575061037c610706565b505b604051612efd908161078982396080518181816105570152611445015260a0518181816101f90152611e01015260c051818181610cb30152612185015260e0518181816102a00152610ac1015261010051818181610c780152611a1a0152f35b806103eb6103f192610610565b50610686565b5061037e565b6333fae18560e21b5f5260045260245260445ffd5b634e487b7160e01b5f52601160045260245ffd5b634e487b7160e01b5f52602160045260245ffd5b015190505f80610241565b90601f1983169160015f52815f20925f5b818110610494575091600193918563ffffffff99989796941061047c575b505050811b01600155610256565b01515f1960f88460031b161c191690555f808061046e565b92936020600181928786015181550195019301610450565b60015f527fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf6601f840160051c81019160208510610505575b601f0160051c01905b8181106104fa5750610220565b5f81556001016104ed565b90915081906104e4565b634e487b7160e01b5f52602260045260245ffd5b90607f169061020e565b634e487b7160e01b5f52604160045260245ffd5b5f80fd5b60408051919082016001600160401b0381118382101761052d57604052565b6040519190601f01601f191682016001600160401b0381118382101761052d57604052565b51906001600160a01b038216820361054157565b9192916001600160401b03821161052d576105c1601f8301601f1916602001610564565b938285528282011161054157815f926020928387015e84010152565b519060ff8216820361054157565b51906001600160401b038216820361054157565b519063ffffffff8216820361054157565b6001600160a01b0381165f9081525f5160206137065f395f51905f52602052604090205460ff16610681576001600160a01b03165f8181525f5160206137065f395f51905f5260205260408120805460ff191660011790553391905f5160206136865f395f51905f528180a4600190565b505f90565b6001600160a01b0381165f9081525f5160206136a65f395f51905f52602052604090205460ff16610681576001600160a01b03165f8181525f5160206136a65f395f51905f5260205260408120805460ff191660011790553391905f5160206136e65f395f51905f52905f5160206136865f395f51905f529080a4600190565b5f80525f5160206136a65f395f51905f526020525f5160206136c65f395f51905f525460ff16610784575f8080525f5160206136a65f395f51905f526020525f5160206136c65f395f51905f52805460ff1916600117905533905f5160206136e65f395f51905f525f5160206136865f395f51905f528280a4600190565b5f9056fe6080806040526004361015610012575f80fd5b5f3560e01c90816301ffc9a714610cd6575080630225293e14610c9c57806308c84e7014610c4c5780630bece35614610b8957806323842fb814610b59578063248a9ca314610b2f5780632c3ee47414610b135780632f2ff15d14610ae4578063314d4dff14610aaa57806336568abe14610a4e5780634d6d9ffb1461096c5780635972185a14610932578063682ed5f01461080e57806391d14854146107c5578063a217fddf146107ab578063ac9650d81461066a578063bd3ce6b01461057a578063ca7242f914610540578063d547741f1461050a578063ddba65371461021c578063e45a6d0d146101e25763ef913a4b1461010e575f80fd5b346101de575f6003193601126101de576101da60405160208082015261012060408201526101c6816101436101608201610ec6565b60ff600254818116606085015260081c16608083015267ffffffffffffffff60035481811660a085015260401c1660c083015260ff60045463ffffffff811660e085015263ffffffff8160201c16610100850152818160401c16151561012085015260481c166101b28161105f565b61014083015203601f19810183528261103c565b604051918291602083526020830190610df8565b0390f35b5f80fd5b346101de575f6003193601126101de5760206040517f00000000000000000000000000000000000000000000000000000000000000008152f35b346101de5761022a36610d74565b6004549160ff8360401c166104e2575f80527f4c48d1d2b0f4f7485fc28e3db22341d96a20aa29e6efa8149da9751603abd4e06020527f6e0c24a6e293ff9b755263dbaa15ba3796b0b8d3fe17cfb4ddf8143b268eac4754610298929060ff16156104d5575b8101906110d9565b6102c78151517f0000000000000000000000000000000000000000000000000000000000000000808214611189565b6020815101518051810160208101916020818303126101de57602081015167ffffffffffffffff81116101de57019061018090829003126101de576040519061030f82610fcc565b602081015167ffffffffffffffff81116101de57839082016020019061033491611260565b825261034260408201611348565b60208301908152906103578460608301611219565b604084019081529161036c8560a08401611219565b60608501908152946103818160e08501611365565b9260808601938452610140019061039791611365565b9360a081019485525190516fffffffffffffffffffffffffffffffff166103bd916126e8565b516040805182516fffffffffffffffffffffffffffffffff16602080830191825284015182840152919092015160608084019190915282529061040160808261103c565b51902090516020015167ffffffffffffffff1661041d90611649565b61042a919081811461187c565b516040805182516fffffffffffffffffffffffffffffffff16602080830191825284015182840152919092015160608084019190915282529061046e60808261103c565b51902090516020015167ffffffffffffffff1661048a90611649565b610497919081811461187c565b516104a190611a03565b7fffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffff1668010000000000000000176004555f80f35b6104dd61178e565b610290565b7f928b1233000000000000000000000000000000000000000000000000000000005f5260045ffd5b346101de5761053e61051b36610dc5565b90610539610534825f525f602052600160405f20015490565b611816565b611ba5565b005b346101de575f6003193601126101de5760206040517f00000000000000000000000000000000000000000000000000000000000000008152f35b346101de575f6003193601126101de576040516105a18161059a81610ec6565b038261103c565b6101206040516105b081610f83565b60025460ff8116825260ff602083019160081c16815260ff6040516105d481610f83565b67ffffffffffffffff600354818116835281602084019160401c168152816004549385808660481c1697816106146040519d8d8f9e8f9081520190610df8565b9a511660208c0152511660408a0152511660608801525116608086015263ffffffff811660a086015263ffffffff8160201c1660c086015260401c16151560e08401526106608161105f565b6101008301520390f35b346101de5760206003193601126101de5760043567ffffffffffffffff81116101de57366023820112156101de57806004013567ffffffffffffffff81116101de57602482013660248360051b850101116101de5760405160206106ce818361103c565b5f825280820192601f1982013685376106e685611735565b956106f4604051978861103c565b858752601f1961070387611735565b01835f5b82811061079b575050505f5b868110156107885760019061076c61076661073660248460051b87010187611690565b9190888b846040519586948486013783018281015f81528d519283915e01015f815203601f19810183528261103c565b30612621565b610776828b61174d565b52610781818a61174d565b5001610713565b604051848152806101da8187018b610e1d565b606082828c010152018490610707565b346101de575f6003193601126101de5760206040515f8152f35b346101de576107d336610dc5565b905f525f60205273ffffffffffffffffffffffffffffffffffffffff60405f2091165f52602052602060ff60405f2054166040519015158152f35b346101de5760206003193601126101de5760043567ffffffffffffffff81116101de578060040160a060031983360301126101de5760ff60045460401c166104e2575f80527f4c48d1d2b0f4f7485fc28e3db22341d96a20aa29e6efa8149da9751603abd4e06020527f6e0c24a6e293ff9b755263dbaa15ba3796b0b8d3fe17cfb4ddf8143b268eac475460ff1615610925575b60848201916108b18383611690565b9050156108fd57602092826108c9816108f595611690565b60246108ed6108e66108de60648901876116e1565b979096611690565b3691611085565b950191611cee565b604051908152f35b7f1208b21b000000000000000000000000000000000000000000000000000000005f5260045ffd5b61092d61178e565b6108a2565b346101de575f6003193601126101de5760206040517fbd893629a699470e4ec82a5715bb4981fdaacc5d0a728bf5f55b801d8f4ef10b8152f35b346101de5760206003193601126101de5760043567ffffffffffffffff81116101de5780600401608060031983360301126101de5760ff60045460401c166104e2575f80527f4c48d1d2b0f4f7485fc28e3db22341d96a20aa29e6efa8149da9751603abd4e060209081527f6e0c24a6e293ff9b755263dbaa15ba3796b0b8d3fe17cfb4ddf8143b268eac475490926108f592909160ff1615610a41575b610a24610a178280611690565b91909260648501906116e1565b929091602460405195610a37898861103c565b5f87520191611cee565b610a4961178e565b610a0a565b346101de57610a5c36610dc5565b3373ffffffffffffffffffffffffffffffffffffffff821603610a825761053e91611ba5565b7f6697b232000000000000000000000000000000000000000000000000000000005f5260045ffd5b346101de575f6003193601126101de5760206040517f00000000000000000000000000000000000000000000000000000000000000008152f35b346101de5761053e610af536610dc5565b90610b0e610534825f525f602052600160405f20015490565b611ad3565b346101de575f6003193601126101de5760206040516107088152f35b346101de5760206003193601126101de5760206108f56004355f525f602052600160405f20015490565b346101de5760206003193601126101de5760043567ffffffffffffffff811681036101de576108f5602091611649565b346101de57610b9736610d74565b60ff60045460401c166104e2575f80527f4c48d1d2b0f4f7485fc28e3db22341d96a20aa29e6efa8149da9751603abd4e06020527f6e0c24a6e293ff9b755263dbaa15ba3796b0b8d3fe17cfb4ddf8143b268eac4754610bff929060ff1615610c3f57611431565b6040516003821015610c12576020918152f35b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b610c4761178e565b611431565b346101de575f6003193601126101de57602060405173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b346101de575f6003193601126101de5760206040517f00000000000000000000000000000000000000000000000000000000000000008152f35b346101de5760206003193601126101de57600435907fffffffff0000000000000000000000000000000000000000000000000000000082168092036101de57817f7965db0b0000000000000000000000000000000000000000000000000000000060209314908115610d4a575b5015158152f35b7f01ffc9a70000000000000000000000000000000000000000000000000000000091501483610d43565b9060206003198301126101de5760043567ffffffffffffffff81116101de57826023820112156101de5780600401359267ffffffffffffffff84116101de57602484830101116101de576024019190565b60031960409101126101de576004359060243573ffffffffffffffffffffffffffffffffffffffff811681036101de5790565b90601f19601f602080948051918291828752018686015e5f8582860101520116010190565b9080602083519182815201916020808360051b8301019401925f915b838310610e4857505050505090565b9091929394602080610e6683601f1986600196030187528951610df8565b97019301930191939290610e39565b90600182811c92168015610ebc575b6020831014610e8f57565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b91607f1691610e84565b6001545f9291610ed582610e75565b8082529160018116908115610f495750600114610ef0575050565b60015f9081529293509091907fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf65b838310610f2f575060209250010190565b600181602092949394548385870101520191019190610f1e565b60209495507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0091509291921683830152151560051b010190565b6040810190811067ffffffffffffffff821117610f9f57604052565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b60c0810190811067ffffffffffffffff821117610f9f57604052565b6020810190811067ffffffffffffffff821117610f9f57604052565b6060810190811067ffffffffffffffff821117610f9f57604052565b60e0810190811067ffffffffffffffff821117610f9f57604052565b90601f601f19910116810190811067ffffffffffffffff821117610f9f57604052565b60021115610c1257565b67ffffffffffffffff8111610f9f57601f01601f191660200190565b92919261109182611069565b9161109f604051938461103c565b8294818452818301116101de578281602093845f960137010152565b9080601f830112156101de578160206110d693359101611085565b90565b6020818303126101de5780359067ffffffffffffffff82116101de5701906020828203126101de576040519161110e83610fe8565b80359067ffffffffffffffff82116101de57016060818303126101de576040519161113883611004565b81358352602082013567ffffffffffffffff81116101de578161115c9184016110bb565b6020840152604082013567ffffffffffffffff81116101de5761117f92016110bb565b6040820152815290565b15611192575050565b7fd56bdc26000000000000000000000000000000000000000000000000000000005f5260045260245260445ffd5b9291926111cc82611069565b916111da604051938461103c565b8294818452818301116101de578281602093845f96015e010152565b519060ff821682036101de57565b519067ffffffffffffffff821682036101de57565b91908260409103126101de5760405161123181610f83565b602061124a81839561124281611204565b855201611204565b910152565b519063ffffffff821682036101de57565b91908281039261012084126101de576040519161127c83611020565b8294825167ffffffffffffffff81116101de57830182601f820112156101de576040916112b284836020601f19955191016111c0565b865201126101de576112f7906040516112ca81610f83565b6112d6602085016111f6565b81526112e4604085016111f6565b6020820152602085015260608301611219565b604083015261130860a0820161124f565b606083015261131960c0820161124f565b608083015260e08101519081151582036101de576101009160a084015201519060028210156101de5760c00152565b51906fffffffffffffffffffffffffffffffff821682036101de57565b91908260609103126101de5760405161137d81611004565b604080829461138b81611348565b8452602081015160208501520151910152565b9190610180838203126101de57604051906113b882610fcc565b819380519167ffffffffffffffff83116101de57610140826113e18360a09661124a9601611260565b86526113f08360208301611365565b60208701526114028360808301611365565b604087015261141360e08201611348565b6060870152611426836101008301611219565b608087015201611219565b61143d918101906110d9565b61146c8151517f0000000000000000000000000000000000000000000000000000000000000000808214611189565b60208151015180518101906020818303126101de5760208101519167ffffffffffffffff83116101de576114a792602080920192010161139e565b906114b1826118b3565b6114ba82611946565b916003831015610c1257826115ec57908167ffffffffffffffff6020604060a06110d6960193845184848201511685600354851c168111611564575b505001516040516115498161153b858201948591909160408060608301946fffffffffffffffffffffffffffffffff8151168452602081015160208501520151910152565b03601f19810183528261103c565b51902092510151165f52600560205260405f20555b51611a03565b6115a3866115e593511667ffffffffffffffff167fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000006003541617600355565b7fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff6fffffffffffffffff00000000000000006003549260401b16911617600355565b5f806114f6565b5060018203611631576110d690680100000000000000007fffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffff600454161760045561155e565b60028214611642576110d69061155e565b5050600290565b67ffffffffffffffff165f52600560205260405f205480156116685790565b7f5b48b457000000000000000000000000000000000000000000000000000000005f5260045ffd5b9035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1813603018212156101de570180359067ffffffffffffffff82116101de576020019181360383136101de57565b9035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1813603018212156101de570180359067ffffffffffffffff82116101de57602001918160051b360383136101de57565b67ffffffffffffffff8111610f9f5760051b60200190565b80518210156117615760209160051b010190565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b335f9081527f4c48d1d2b0f4f7485fc28e3db22341d96a20aa29e6efa8149da9751603abd4e0602052604090205460ff16156117c657565b7fe2517d3f000000000000000000000000000000000000000000000000000000005f52336004527fbd893629a699470e4ec82a5715bb4981fdaacc5d0a728bf5f55b801d8f4ef10b60245260445ffd5b805f525f60205260405f2073ffffffffffffffffffffffffffffffffffffffff33165f5260205260ff60405f2054161561184d5750565b7fe2517d3f000000000000000000000000000000000000000000000000000000005f523360045260245260445ffd5b15611885575050565b7f6d23e8a3000000000000000000000000000000000000000000000000000000005f5260045260245260445ffd5b611944906118d981516fffffffffffffffffffffffffffffffff606084015116906126e8565b61193c67ffffffffffffffff602060808185015160405161192e8161153b868201948591909160408060608301946fffffffffffffffffffffffffffffffff8151168452602081015160208501520151910152565b519020940151015116611649565b80821461187c565b565b67ffffffffffffffff602060a08301510151165f52600560205260405f205480155f146119735750505f90565b604082019081516040516119bc8161153b60208201948591909160408060608301946fffffffffffffffffffffffffffffffff8151168452602081015160208501520151910152565b51902014918215926119da575b5050156119d557600190565b600290565b6fffffffffffffffffffffffffffffffff91925060208291015151169151511611155f806119c9565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169080516040602083015192015192803b156101de575f92611a9b92611aad604051968795869485947f41493c600000000000000000000000000000000000000000000000000000000086526004860152606060248601526064850190610df8565b90600319848303016044850152610df8565b03915afa8015611ac857611abe5750565b5f6119449161103c565b6040513d5f823e3d90fd5b805f525f60205260405f2073ffffffffffffffffffffffffffffffffffffffff83165f5260205260ff60405f205416155f14611b9f57805f525f60205260405f2073ffffffffffffffffffffffffffffffffffffffff83165f5260205260405f2060017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0082541617905573ffffffffffffffffffffffffffffffffffffffff339216907f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d5f80a4600190565b50505f90565b805f525f60205260405f2073ffffffffffffffffffffffffffffffffffffffff83165f5260205260ff60405f2054165f14611b9f57805f525f60205260405f2073ffffffffffffffffffffffffffffffffffffffff83165f5260205260405f207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00815416905573ffffffffffffffffffffffffffffffffffffffff339216907ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b5f80a4600190565b3567ffffffffffffffff811681036101de5790565b929190611c8e81611735565b93611c9c604051958661103c565b602085838152019160051b8101918383116101de5781905b838210611cc2575050505050565b813567ffffffffffffffff81116101de57602091611ce387849387016110bb565b815201910190611cb4565b9094929193948015612568578101906020818303126101de5780359067ffffffffffffffff82116101de57016040818303126101de5760405191611d3183610f83565b813560028110156101de578352602082013567ffffffffffffffff81116101de57611d5c92016110bb565b90602081019182528051611d6f8161105f565b611d788161105f565b611fe5575051908151820160208101926020818303126101de57602081015167ffffffffffffffff81116101de570190608090829003126101de5760405192611dc084610f83565b602082015167ffffffffffffffff81116101de5782611de9836020604094611df1970101612a5a565b865201611365565b9460208301958652611e288351517f0000000000000000000000000000000000000000000000000000000000000000808214611189565b6020835101519182518301926020818503126101de5760208101519067ffffffffffffffff82116101de5701926040848203126101de5760405193611e6c85610f83565b6020810151855260408101519167ffffffffffffffff83116101de57611e99926020809201920101612ac0565b94611eb360208501968088525180151580611fd957612c0d565b5f805b87518051831015611fa657611ece83611ee19261174d565b5151611edb368888611c82565b90612da9565b15611f9c57508694611f40611f55956fffffffffffffffffffffffffffffffff9a9895611f3961155e966020633b9aca009f9d8198611f20915161174d565b51015190815181518082149182611f88575b5050612c4b565b6001612c99565b51950194611f4d86611c6d565b875191612e1b565b516001815111611f69575b50505151160490565b611f75611f8192611c6d565b90848451511691612eab565b5f80611f60565b909150898401209089830120145f80611f32565b9060010190611eb6565b5061155e92506020915094611f40611f55956fffffffffffffffffffffffffffffffff9a9895633b9aca009c9a98612c99565b5061ffff811115612c0d565b94906001869593949551611ff88161105f565b6120018161105f565b146120485760ff86516120138161105f565b61201c8161105f565b7fd3a2e6c9000000000000000000000000000000000000000000000000000000005f521660045260245ffd5b90919293945051926060602060405161206081610f83565b60405161206c81610fcc565b60405161207881611020565b84815260405161208781610f83565b5f81525f858201528482015260405161209f81610f83565b5f81525f8582015260408201525f858201525f60808201525f60a08201525f60c082015281526120cd612a22565b838201526120d9612a22565b60408201525f848201526040516120ef81610f83565b5f81525f84820152608082015260405161210881610f83565b5f81525f8482015260a08201528152015283518401936020818603126101de5760208101519067ffffffffffffffff82116101de5701936020858203126101de576040519461215686610fe8565b60208101519067ffffffffffffffff82116101de57602061217f92816121ac9501920101612a5a565b808652517f0000000000000000000000000000000000000000000000000000000000000000808214611189565b602084510151948551860160208101966020818303126101de57602081015167ffffffffffffffff81116101de570190604090829003126101de57604051966121f488610f83565b602082015167ffffffffffffffff81116101de578160206122179285010161139e565b885260408201519167ffffffffffffffff83116101de5761223b9201602001612ac0565b9361225560208801958087525180151580611fd957612c0d565b602081019561226387611c6d565b67ffffffffffffffff60a08a5101519181602084015116918291161480612549575b61228e85611c6d565b9267ffffffffffffffff6122a18c611c6d565b91511691156124fb57505050506122bc9061155e89516118b3565b6122c68751611946565b6003811015610c1257806124ca57506122de86611c6d565b67ffffffffffffffff8060035460401c16911611612477575b506040865101516040516123408161153b60208201948591909160408060608301946fffffffffffffffffffffffffffffffff8151168452602081015160208501520151910152565b51902067ffffffffffffffff61235587611c6d565b165f52600560205260405f20555b5f805b8551805183101561244c57611ece8361237e9261174d565b156124425750633b9aca0096936fffffffffffffffffffffffffffffffff9693611f39879460206123b56123cd9660409b5161174d565b5101519081518151808214918261242c575050612c4b565b6123f48351858101519067ffffffffffffffff602060a08185015193015101511690612e1b565b51600181511161240a575b505051015151160490565b61241661242592611c6d565b90858585510151511691612eab565b5f806123ff565b9091506020840120906020830120145f80611f32565b9060010190612366565b5060409592506123cd9150936fffffffffffffffffffffffffffffffff9693633b9aca009895612c99565b6124836124b891611c6d565b67ffffffffffffffff167fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000006003541617600355565b6124c46115a386611c6d565b5f6122f7565b6001915003612363577f59bc8fd3000000000000000000000000000000000000000000000000000000005f5260045ffd5b6084945067ffffffffffffffff9081604051957fb8d8167e00000000000000000000000000000000000000000000000000000000875216600486015216602484015260448301526064820152fd5b5061255384611c6d565b67ffffffffffffffff80845116911614612285565b5050909161257b60206125909201611c6d565b916040519461258986610f83565b3691611c82565b8352602083019182526040516125af8161153b86602083019586612954565b5190205c9151905182156125c9575050633b9aca00900490565b9061261d61260b926040519384937ff06fc33b000000000000000000000000000000000000000000000000000000008552604060048601526044850190610e1d565b90600319848303016024850152610df8565b0390fd5b905f8091602081519101845af480806126d5575b156126555750506040513d81523d5f602083013e60203d82010160405290565b1561269c5773ffffffffffffffffffffffffffffffffffffffff907f9996b315000000000000000000000000000000000000000000000000000000005f521660045260245ffd5b3d156126ad576040513d5f823e3d90fd5b7fd6bda275000000000000000000000000000000000000000000000000000000005f5260045ffd5b503d1515806126355750813b1515612635565b906fffffffffffffffffffffffffffffffff633b9aca00911604428111612925578042034281116128f857610708106128c9575080515161272a600154610e75565b14806128a2575b815190156128625750602081015160ff815116906002549160ff8316928382149283612849575b6020015160ff169215612801575050505063ffffffff606082015116906004549163ffffffff83168082036127d357505063ffffffff608081920151169160201c168082036127a5575050565b7f1eb5c1eb000000000000000000000000000000000000000000000000000000005f5260045260245260445ffd5b7f73b1bde3000000000000000000000000000000000000000000000000000000005f5260045260245260445ffd5b6084945060ff90604051947fd382033a000000000000000000000000000000000000000000000000000000008652600486015260081c16602484015260448301526064820152fd5b6020810151600883901c60ff9081169116149350612758565b61261d906040519182917ff6b6676b0000000000000000000000000000000000000000000000000000000083526040600484015261260b60448401610ec6565b508051602081519101206040516128bc8161059a81610ec6565b6020815191012014612731565b7f12e74add000000000000000000000000000000000000000000000000000000005f524260045260245260445ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b7f20daedb6000000000000000000000000000000000000000000000000000000005f524260045260245260445ffd5b9067ffffffffffffffff90939293168152604060208201526080810190835191604080830152825180915260a0820190602060a08260051b8501019401915f905b8282106129d9575050505060206110d6939401519060607fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc082850301910152610df8565b90919294602080612a14837fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6089600196030186528951610df8565b970192019201909291612995565b60405190612a2f82611004565b5f6040838281528260208201520152565b9080601f830112156101de5781516110d6926020016111c0565b91906060838203126101de5760405190612a7382611004565b819380518352602081015167ffffffffffffffff81116101de5782612a99918301612a40565b602084015260408101519167ffffffffffffffff83116101de5760409261124a9201612a40565b9080601f830112156101de57815191612ad883611735565b92612ae6604051948561103c565b80845260208085019160051b830101918383116101de5760208101915b838310612b1257505050505090565b825167ffffffffffffffff81116101de578201906040601f1983880301126101de5760405190612b4182610f83565b602083015167ffffffffffffffff81116101de5760209084010187601f820112156101de578051612b7181611735565b91612b7f604051938461103c565b81835260208084019260051b820101918a83116101de5760208201905b838210612bdf5750505050825260408301519167ffffffffffffffff83116101de57612bd088602080969581960101612a40565b83820152815201920191612b03565b815167ffffffffffffffff81116101de57602091612c028e848094880101612a40565b815201910190612b9c565b15612c155750565b7fb0369c31000000000000000000000000000000000000000000000000000000005f52600452600160245261ffff60445260645ffd5b91909115612c57575050565b9061261d61260b926040519384937f5f1ca381000000000000000000000000000000000000000000000000000000008552604060048601526044850190610df8565b91909115612ca5575050565b604051907ffef760c700000000000000000000000000000000000000000000000000000000825280602483016020600485015252604482019260448260051b84010191815f907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1813603015b838310612d1e5786860387fd5b90919293947fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbc8782030188528535828112156101de578301906020823592019167ffffffffffffffff81116101de5780360383136101de57602082601f19601f8480600198869897879852868601375f85828601015201160101970198019301919096939296612d11565b908151815103611b9f575f5b8251811015612e1357612dc8818461174d565b5151612dd4828461174d565b515103612e0c57612de5818461174d565b5160208151910120612df7828461174d565b516020815191012003612e0c57600101612db5565b5050505f90565b505050600190565b91612e7060209261193c60405185810190612e678161153b888591909160408060608301946fffffffffffffffffffffffffffffffff8151168452602081015160208501520151910152565b51902091611649565b0151808203612e7d575050565b7f4b2dfe98000000000000000000000000000000000000000000000000000000005f5260045260245260445ffd5b929190925f5b8451811015612ee9578083612ec86001938861174d565b51604051612edf8161153b60208201948986612954565b5190205d01612eb1565b505050905056fea164736f6c634300081c000a2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d4c48d1d2b0f4f7485fc28e3db22341d96a20aa29e6efa8149da9751603abd4e06e0c24a6e293ff9b755263dbaa15ba3796b0b8d3fe17cfb4ddf8143b268eac47bd893629a699470e4ec82a5715bb4981fdaacc5d0a728bf5f55b801d8f4ef10bad3228b676f7d3cd4284a5443f17f1962b36e491b30a40b2405849e597ba5fb5","sourceMap":"1362:25496:46:-:0;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;-1:-1:-1;;;;;1362:25496:46;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;:::i;:::-;3781:52;1362:25496;3781:52;1362:25496;3843:47;1362:25496;3900:80;1362:25496;3990:51;1362:25496;;4066:60;;;1362:25496;4066:60;;1362:25496;;;;;;;;;4066:60;;1362:25496;;-1:-1:-1;;;;;1362:25496:46;;;;;;;;;-1:-1:-1;;1362:25496:46;;;;-1:-1:-1;1362:25496:46;;;;;;;;-1:-1:-1;;;;;1362:25496:46;;;;;;;;;;;;;;-1:-1:-1;;;;;1362:25496:46;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;1362:25496:46;;;;;;;;;;;;;;;;-1:-1:-1;1362:25496:46;;;;;;;;;;;-1:-1:-1;1362:25496:46;;;;;;;;;;;;;;;;-1:-1:-1;;1362:25496:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1362:25496:46;4136:21;1362:25496;;;-1:-1:-1;1362:25496:46;;;;;;;;;4227:36;1362:25496;;;;;2479:10;;;1362:25496;2479:10;;;;1362:25496;2479:10;;1362:25496;2479:10;1362:25496;;;;;4295:83;2479:10;;1362:25496;-1:-1:-1;;;;;1362:25496:46;;;;4536:44;;;:::i;:::-;;4491:351;1362:25496;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4491:351;4644:43;;4743:45;4644:43;;:::i;:::-;;4743:45;:::i;:::-;;4491:351;;2479:10;;;;-1:-1:-1;2479:10:46;1362:25496;2479:10;;;;-1:-1:-1;2479:10:46;;1362:25496;;;-1:-1:-1;2479:10:46;;1362:25496;2479:10;;-1:-1:-1;2479:10:46;1362:25496;;;;-1:-1:-1;1362:25496:46;;;;;-1:-1:-1;1362:25496:46;;;;;-1:-1:-1;1362:25496:46;;;;;;;;;;;;-1:-1:-1;1362:25496:46;;-1:-1:-1;1362:25496:46;;-1:-1:-1;1362:25496:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1362:25496:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1362:25496:46;;;;;;;;;-1:-1:-1;1362:25496:46;;;;;;;;-1:-1:-1;1362:25496:46;;;;;-1:-1:-1;1362:25496:46;;;;;;;;;;;;-1:-1:-1;1362:25496:46;;;;;-1:-1:-1;1362:25496:46;;-1:-1:-1;1362:25496:46;;;;;;;;;;-1:-1:-1;;;;;1362:25496:46;;;;;;;;;;:::o;:::-;;;;;;;-1:-1:-1;;1362:25496:46;;;-1:-1:-1;;;;;1362:25496:46;;;;;;;;;;:::o;:::-;;;-1:-1:-1;;;;;1362:25496:46;;;;;;:::o;:::-;;;;-1:-1:-1;;;;;1362:25496:46;;;;;;;;-1:-1:-1;;1362:25496:46;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;:::o;:::-;;;-1:-1:-1;;;;;1362:25496:46;;;;;;:::o;:::-;;;;;;;;;;:::o;6145:316:93:-;-1:-1:-1;;;;;1362:25496:46;;;;;;-1:-1:-1;;;;;;;;;;;1362:25496:46;;;;;;;;;;-1:-1:-1;;;;;1362:25496:46;;;;;-1:-1:-1;;;;;;;;;;;1362:25496:46;;;;;;;-1:-1:-1;;1362:25496:46;;;;;735:10:121;;1362:25496:46;-1:-1:-1;;;;;;;;;;;1362:25496:46;;6336:40:93;6313:4;6390:11;:::o;6238:217::-;6432:12;1362:25496:46;6432:12:93;:::o;6145:316::-;-1:-1:-1;;;;;1362:25496:46;;;;;;-1:-1:-1;;;;;;;;;;;1362:25496:46;;;;;;;;;;-1:-1:-1;;;;;1362:25496:46;;;;;-1:-1:-1;;;;;;;;;;;1362:25496:46;;;;;;;-1:-1:-1;;1362:25496:46;;;;;735:10:121;;1362:25496:46;-1:-1:-1;;;;;;;;;;;2583:33:46;-1:-1:-1;;;;;;;;;;;6336:40:93;1362:25496:46;6336:40:93;6313:4;6390:11;:::o;6145:316::-;1362:25496:46;;;-1:-1:-1;;;;;;;;;;;1362:25496:46;;-1:-1:-1;;;;;;;;;;;1362:25496:46;;;;;;;;;-1:-1:-1;;;;;;;;;;;1362:25496:46;;-1:-1:-1;;;;;;;;;;;1362:25496:46;;-1:-1:-1;;1362:25496:46;6313:4:93;1362:25496:46;;;735:10:121;;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;1362:25496:46;;6336:40:93;6313:4;6390:11;:::o;6238:217::-;1362:25496:46;6432:12:93;:::o","linkReferences":{}},"deployedBytecode":{"object":"0x6080806040526004361015610012575f80fd5b5f3560e01c90816301ffc9a714610cd6575080630225293e14610c9c57806308c84e7014610c4c5780630bece35614610b8957806323842fb814610b59578063248a9ca314610b2f5780632c3ee47414610b135780632f2ff15d14610ae4578063314d4dff14610aaa57806336568abe14610a4e5780634d6d9ffb1461096c5780635972185a14610932578063682ed5f01461080e57806391d14854146107c5578063a217fddf146107ab578063ac9650d81461066a578063bd3ce6b01461057a578063ca7242f914610540578063d547741f1461050a578063ddba65371461021c578063e45a6d0d146101e25763ef913a4b1461010e575f80fd5b346101de575f6003193601126101de576101da60405160208082015261012060408201526101c6816101436101608201610ec6565b60ff600254818116606085015260081c16608083015267ffffffffffffffff60035481811660a085015260401c1660c083015260ff60045463ffffffff811660e085015263ffffffff8160201c16610100850152818160401c16151561012085015260481c166101b28161105f565b61014083015203601f19810183528261103c565b604051918291602083526020830190610df8565b0390f35b5f80fd5b346101de575f6003193601126101de5760206040517f00000000000000000000000000000000000000000000000000000000000000008152f35b346101de5761022a36610d74565b6004549160ff8360401c166104e2575f80527f4c48d1d2b0f4f7485fc28e3db22341d96a20aa29e6efa8149da9751603abd4e06020527f6e0c24a6e293ff9b755263dbaa15ba3796b0b8d3fe17cfb4ddf8143b268eac4754610298929060ff16156104d5575b8101906110d9565b6102c78151517f0000000000000000000000000000000000000000000000000000000000000000808214611189565b6020815101518051810160208101916020818303126101de57602081015167ffffffffffffffff81116101de57019061018090829003126101de576040519061030f82610fcc565b602081015167ffffffffffffffff81116101de57839082016020019061033491611260565b825261034260408201611348565b60208301908152906103578460608301611219565b604084019081529161036c8560a08401611219565b60608501908152946103818160e08501611365565b9260808601938452610140019061039791611365565b9360a081019485525190516fffffffffffffffffffffffffffffffff166103bd916126e8565b516040805182516fffffffffffffffffffffffffffffffff16602080830191825284015182840152919092015160608084019190915282529061040160808261103c565b51902090516020015167ffffffffffffffff1661041d90611649565b61042a919081811461187c565b516040805182516fffffffffffffffffffffffffffffffff16602080830191825284015182840152919092015160608084019190915282529061046e60808261103c565b51902090516020015167ffffffffffffffff1661048a90611649565b610497919081811461187c565b516104a190611a03565b7fffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffff1668010000000000000000176004555f80f35b6104dd61178e565b610290565b7f928b1233000000000000000000000000000000000000000000000000000000005f5260045ffd5b346101de5761053e61051b36610dc5565b90610539610534825f525f602052600160405f20015490565b611816565b611ba5565b005b346101de575f6003193601126101de5760206040517f00000000000000000000000000000000000000000000000000000000000000008152f35b346101de575f6003193601126101de576040516105a18161059a81610ec6565b038261103c565b6101206040516105b081610f83565b60025460ff8116825260ff602083019160081c16815260ff6040516105d481610f83565b67ffffffffffffffff600354818116835281602084019160401c168152816004549385808660481c1697816106146040519d8d8f9e8f9081520190610df8565b9a511660208c0152511660408a0152511660608801525116608086015263ffffffff811660a086015263ffffffff8160201c1660c086015260401c16151560e08401526106608161105f565b6101008301520390f35b346101de5760206003193601126101de5760043567ffffffffffffffff81116101de57366023820112156101de57806004013567ffffffffffffffff81116101de57602482013660248360051b850101116101de5760405160206106ce818361103c565b5f825280820192601f1982013685376106e685611735565b956106f4604051978861103c565b858752601f1961070387611735565b01835f5b82811061079b575050505f5b868110156107885760019061076c61076661073660248460051b87010187611690565b9190888b846040519586948486013783018281015f81528d519283915e01015f815203601f19810183528261103c565b30612621565b610776828b61174d565b52610781818a61174d565b5001610713565b604051848152806101da8187018b610e1d565b606082828c010152018490610707565b346101de575f6003193601126101de5760206040515f8152f35b346101de576107d336610dc5565b905f525f60205273ffffffffffffffffffffffffffffffffffffffff60405f2091165f52602052602060ff60405f2054166040519015158152f35b346101de5760206003193601126101de5760043567ffffffffffffffff81116101de578060040160a060031983360301126101de5760ff60045460401c166104e2575f80527f4c48d1d2b0f4f7485fc28e3db22341d96a20aa29e6efa8149da9751603abd4e06020527f6e0c24a6e293ff9b755263dbaa15ba3796b0b8d3fe17cfb4ddf8143b268eac475460ff1615610925575b60848201916108b18383611690565b9050156108fd57602092826108c9816108f595611690565b60246108ed6108e66108de60648901876116e1565b979096611690565b3691611085565b950191611cee565b604051908152f35b7f1208b21b000000000000000000000000000000000000000000000000000000005f5260045ffd5b61092d61178e565b6108a2565b346101de575f6003193601126101de5760206040517fbd893629a699470e4ec82a5715bb4981fdaacc5d0a728bf5f55b801d8f4ef10b8152f35b346101de5760206003193601126101de5760043567ffffffffffffffff81116101de5780600401608060031983360301126101de5760ff60045460401c166104e2575f80527f4c48d1d2b0f4f7485fc28e3db22341d96a20aa29e6efa8149da9751603abd4e060209081527f6e0c24a6e293ff9b755263dbaa15ba3796b0b8d3fe17cfb4ddf8143b268eac475490926108f592909160ff1615610a41575b610a24610a178280611690565b91909260648501906116e1565b929091602460405195610a37898861103c565b5f87520191611cee565b610a4961178e565b610a0a565b346101de57610a5c36610dc5565b3373ffffffffffffffffffffffffffffffffffffffff821603610a825761053e91611ba5565b7f6697b232000000000000000000000000000000000000000000000000000000005f5260045ffd5b346101de575f6003193601126101de5760206040517f00000000000000000000000000000000000000000000000000000000000000008152f35b346101de5761053e610af536610dc5565b90610b0e610534825f525f602052600160405f20015490565b611ad3565b346101de575f6003193601126101de5760206040516107088152f35b346101de5760206003193601126101de5760206108f56004355f525f602052600160405f20015490565b346101de5760206003193601126101de5760043567ffffffffffffffff811681036101de576108f5602091611649565b346101de57610b9736610d74565b60ff60045460401c166104e2575f80527f4c48d1d2b0f4f7485fc28e3db22341d96a20aa29e6efa8149da9751603abd4e06020527f6e0c24a6e293ff9b755263dbaa15ba3796b0b8d3fe17cfb4ddf8143b268eac4754610bff929060ff1615610c3f57611431565b6040516003821015610c12576020918152f35b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b610c4761178e565b611431565b346101de575f6003193601126101de57602060405173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b346101de575f6003193601126101de5760206040517f00000000000000000000000000000000000000000000000000000000000000008152f35b346101de5760206003193601126101de57600435907fffffffff0000000000000000000000000000000000000000000000000000000082168092036101de57817f7965db0b0000000000000000000000000000000000000000000000000000000060209314908115610d4a575b5015158152f35b7f01ffc9a70000000000000000000000000000000000000000000000000000000091501483610d43565b9060206003198301126101de5760043567ffffffffffffffff81116101de57826023820112156101de5780600401359267ffffffffffffffff84116101de57602484830101116101de576024019190565b60031960409101126101de576004359060243573ffffffffffffffffffffffffffffffffffffffff811681036101de5790565b90601f19601f602080948051918291828752018686015e5f8582860101520116010190565b9080602083519182815201916020808360051b8301019401925f915b838310610e4857505050505090565b9091929394602080610e6683601f1986600196030187528951610df8565b97019301930191939290610e39565b90600182811c92168015610ebc575b6020831014610e8f57565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b91607f1691610e84565b6001545f9291610ed582610e75565b8082529160018116908115610f495750600114610ef0575050565b60015f9081529293509091907fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf65b838310610f2f575060209250010190565b600181602092949394548385870101520191019190610f1e565b60209495507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0091509291921683830152151560051b010190565b6040810190811067ffffffffffffffff821117610f9f57604052565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b60c0810190811067ffffffffffffffff821117610f9f57604052565b6020810190811067ffffffffffffffff821117610f9f57604052565b6060810190811067ffffffffffffffff821117610f9f57604052565b60e0810190811067ffffffffffffffff821117610f9f57604052565b90601f601f19910116810190811067ffffffffffffffff821117610f9f57604052565b60021115610c1257565b67ffffffffffffffff8111610f9f57601f01601f191660200190565b92919261109182611069565b9161109f604051938461103c565b8294818452818301116101de578281602093845f960137010152565b9080601f830112156101de578160206110d693359101611085565b90565b6020818303126101de5780359067ffffffffffffffff82116101de5701906020828203126101de576040519161110e83610fe8565b80359067ffffffffffffffff82116101de57016060818303126101de576040519161113883611004565b81358352602082013567ffffffffffffffff81116101de578161115c9184016110bb565b6020840152604082013567ffffffffffffffff81116101de5761117f92016110bb565b6040820152815290565b15611192575050565b7fd56bdc26000000000000000000000000000000000000000000000000000000005f5260045260245260445ffd5b9291926111cc82611069565b916111da604051938461103c565b8294818452818301116101de578281602093845f96015e010152565b519060ff821682036101de57565b519067ffffffffffffffff821682036101de57565b91908260409103126101de5760405161123181610f83565b602061124a81839561124281611204565b855201611204565b910152565b519063ffffffff821682036101de57565b91908281039261012084126101de576040519161127c83611020565b8294825167ffffffffffffffff81116101de57830182601f820112156101de576040916112b284836020601f19955191016111c0565b865201126101de576112f7906040516112ca81610f83565b6112d6602085016111f6565b81526112e4604085016111f6565b6020820152602085015260608301611219565b604083015261130860a0820161124f565b606083015261131960c0820161124f565b608083015260e08101519081151582036101de576101009160a084015201519060028210156101de5760c00152565b51906fffffffffffffffffffffffffffffffff821682036101de57565b91908260609103126101de5760405161137d81611004565b604080829461138b81611348565b8452602081015160208501520151910152565b9190610180838203126101de57604051906113b882610fcc565b819380519167ffffffffffffffff83116101de57610140826113e18360a09661124a9601611260565b86526113f08360208301611365565b60208701526114028360808301611365565b604087015261141360e08201611348565b6060870152611426836101008301611219565b608087015201611219565b61143d918101906110d9565b61146c8151517f0000000000000000000000000000000000000000000000000000000000000000808214611189565b60208151015180518101906020818303126101de5760208101519167ffffffffffffffff83116101de576114a792602080920192010161139e565b906114b1826118b3565b6114ba82611946565b916003831015610c1257826115ec57908167ffffffffffffffff6020604060a06110d6960193845184848201511685600354851c168111611564575b505001516040516115498161153b858201948591909160408060608301946fffffffffffffffffffffffffffffffff8151168452602081015160208501520151910152565b03601f19810183528261103c565b51902092510151165f52600560205260405f20555b51611a03565b6115a3866115e593511667ffffffffffffffff167fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000006003541617600355565b7fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff6fffffffffffffffff00000000000000006003549260401b16911617600355565b5f806114f6565b5060018203611631576110d690680100000000000000007fffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffff600454161760045561155e565b60028214611642576110d69061155e565b5050600290565b67ffffffffffffffff165f52600560205260405f205480156116685790565b7f5b48b457000000000000000000000000000000000000000000000000000000005f5260045ffd5b9035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1813603018212156101de570180359067ffffffffffffffff82116101de576020019181360383136101de57565b9035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1813603018212156101de570180359067ffffffffffffffff82116101de57602001918160051b360383136101de57565b67ffffffffffffffff8111610f9f5760051b60200190565b80518210156117615760209160051b010190565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b335f9081527f4c48d1d2b0f4f7485fc28e3db22341d96a20aa29e6efa8149da9751603abd4e0602052604090205460ff16156117c657565b7fe2517d3f000000000000000000000000000000000000000000000000000000005f52336004527fbd893629a699470e4ec82a5715bb4981fdaacc5d0a728bf5f55b801d8f4ef10b60245260445ffd5b805f525f60205260405f2073ffffffffffffffffffffffffffffffffffffffff33165f5260205260ff60405f2054161561184d5750565b7fe2517d3f000000000000000000000000000000000000000000000000000000005f523360045260245260445ffd5b15611885575050565b7f6d23e8a3000000000000000000000000000000000000000000000000000000005f5260045260245260445ffd5b611944906118d981516fffffffffffffffffffffffffffffffff606084015116906126e8565b61193c67ffffffffffffffff602060808185015160405161192e8161153b868201948591909160408060608301946fffffffffffffffffffffffffffffffff8151168452602081015160208501520151910152565b519020940151015116611649565b80821461187c565b565b67ffffffffffffffff602060a08301510151165f52600560205260405f205480155f146119735750505f90565b604082019081516040516119bc8161153b60208201948591909160408060608301946fffffffffffffffffffffffffffffffff8151168452602081015160208501520151910152565b51902014918215926119da575b5050156119d557600190565b600290565b6fffffffffffffffffffffffffffffffff91925060208291015151169151511611155f806119c9565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169080516040602083015192015192803b156101de575f92611a9b92611aad604051968795869485947f41493c600000000000000000000000000000000000000000000000000000000086526004860152606060248601526064850190610df8565b90600319848303016044850152610df8565b03915afa8015611ac857611abe5750565b5f6119449161103c565b6040513d5f823e3d90fd5b805f525f60205260405f2073ffffffffffffffffffffffffffffffffffffffff83165f5260205260ff60405f205416155f14611b9f57805f525f60205260405f2073ffffffffffffffffffffffffffffffffffffffff83165f5260205260405f2060017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0082541617905573ffffffffffffffffffffffffffffffffffffffff339216907f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d5f80a4600190565b50505f90565b805f525f60205260405f2073ffffffffffffffffffffffffffffffffffffffff83165f5260205260ff60405f2054165f14611b9f57805f525f60205260405f2073ffffffffffffffffffffffffffffffffffffffff83165f5260205260405f207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00815416905573ffffffffffffffffffffffffffffffffffffffff339216907ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b5f80a4600190565b3567ffffffffffffffff811681036101de5790565b929190611c8e81611735565b93611c9c604051958661103c565b602085838152019160051b8101918383116101de5781905b838210611cc2575050505050565b813567ffffffffffffffff81116101de57602091611ce387849387016110bb565b815201910190611cb4565b9094929193948015612568578101906020818303126101de5780359067ffffffffffffffff82116101de57016040818303126101de5760405191611d3183610f83565b813560028110156101de578352602082013567ffffffffffffffff81116101de57611d5c92016110bb565b90602081019182528051611d6f8161105f565b611d788161105f565b611fe5575051908151820160208101926020818303126101de57602081015167ffffffffffffffff81116101de570190608090829003126101de5760405192611dc084610f83565b602082015167ffffffffffffffff81116101de5782611de9836020604094611df1970101612a5a565b865201611365565b9460208301958652611e288351517f0000000000000000000000000000000000000000000000000000000000000000808214611189565b6020835101519182518301926020818503126101de5760208101519067ffffffffffffffff82116101de5701926040848203126101de5760405193611e6c85610f83565b6020810151855260408101519167ffffffffffffffff83116101de57611e99926020809201920101612ac0565b94611eb360208501968088525180151580611fd957612c0d565b5f805b87518051831015611fa657611ece83611ee19261174d565b5151611edb368888611c82565b90612da9565b15611f9c57508694611f40611f55956fffffffffffffffffffffffffffffffff9a9895611f3961155e966020633b9aca009f9d8198611f20915161174d565b51015190815181518082149182611f88575b5050612c4b565b6001612c99565b51950194611f4d86611c6d565b875191612e1b565b516001815111611f69575b50505151160490565b611f75611f8192611c6d565b90848451511691612eab565b5f80611f60565b909150898401209089830120145f80611f32565b9060010190611eb6565b5061155e92506020915094611f40611f55956fffffffffffffffffffffffffffffffff9a9895633b9aca009c9a98612c99565b5061ffff811115612c0d565b94906001869593949551611ff88161105f565b6120018161105f565b146120485760ff86516120138161105f565b61201c8161105f565b7fd3a2e6c9000000000000000000000000000000000000000000000000000000005f521660045260245ffd5b90919293945051926060602060405161206081610f83565b60405161206c81610fcc565b60405161207881611020565b84815260405161208781610f83565b5f81525f858201528482015260405161209f81610f83565b5f81525f8582015260408201525f858201525f60808201525f60a08201525f60c082015281526120cd612a22565b838201526120d9612a22565b60408201525f848201526040516120ef81610f83565b5f81525f84820152608082015260405161210881610f83565b5f81525f8482015260a08201528152015283518401936020818603126101de5760208101519067ffffffffffffffff82116101de5701936020858203126101de576040519461215686610fe8565b60208101519067ffffffffffffffff82116101de57602061217f92816121ac9501920101612a5a565b808652517f0000000000000000000000000000000000000000000000000000000000000000808214611189565b602084510151948551860160208101966020818303126101de57602081015167ffffffffffffffff81116101de570190604090829003126101de57604051966121f488610f83565b602082015167ffffffffffffffff81116101de578160206122179285010161139e565b885260408201519167ffffffffffffffff83116101de5761223b9201602001612ac0565b9361225560208801958087525180151580611fd957612c0d565b602081019561226387611c6d565b67ffffffffffffffff60a08a5101519181602084015116918291161480612549575b61228e85611c6d565b9267ffffffffffffffff6122a18c611c6d565b91511691156124fb57505050506122bc9061155e89516118b3565b6122c68751611946565b6003811015610c1257806124ca57506122de86611c6d565b67ffffffffffffffff8060035460401c16911611612477575b506040865101516040516123408161153b60208201948591909160408060608301946fffffffffffffffffffffffffffffffff8151168452602081015160208501520151910152565b51902067ffffffffffffffff61235587611c6d565b165f52600560205260405f20555b5f805b8551805183101561244c57611ece8361237e9261174d565b156124425750633b9aca0096936fffffffffffffffffffffffffffffffff9693611f39879460206123b56123cd9660409b5161174d565b5101519081518151808214918261242c575050612c4b565b6123f48351858101519067ffffffffffffffff602060a08185015193015101511690612e1b565b51600181511161240a575b505051015151160490565b61241661242592611c6d565b90858585510151511691612eab565b5f806123ff565b9091506020840120906020830120145f80611f32565b9060010190612366565b5060409592506123cd9150936fffffffffffffffffffffffffffffffff9693633b9aca009895612c99565b6124836124b891611c6d565b67ffffffffffffffff167fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000006003541617600355565b6124c46115a386611c6d565b5f6122f7565b6001915003612363577f59bc8fd3000000000000000000000000000000000000000000000000000000005f5260045ffd5b6084945067ffffffffffffffff9081604051957fb8d8167e00000000000000000000000000000000000000000000000000000000875216600486015216602484015260448301526064820152fd5b5061255384611c6d565b67ffffffffffffffff80845116911614612285565b5050909161257b60206125909201611c6d565b916040519461258986610f83565b3691611c82565b8352602083019182526040516125af8161153b86602083019586612954565b5190205c9151905182156125c9575050633b9aca00900490565b9061261d61260b926040519384937ff06fc33b000000000000000000000000000000000000000000000000000000008552604060048601526044850190610e1d565b90600319848303016024850152610df8565b0390fd5b905f8091602081519101845af480806126d5575b156126555750506040513d81523d5f602083013e60203d82010160405290565b1561269c5773ffffffffffffffffffffffffffffffffffffffff907f9996b315000000000000000000000000000000000000000000000000000000005f521660045260245ffd5b3d156126ad576040513d5f823e3d90fd5b7fd6bda275000000000000000000000000000000000000000000000000000000005f5260045ffd5b503d1515806126355750813b1515612635565b906fffffffffffffffffffffffffffffffff633b9aca00911604428111612925578042034281116128f857610708106128c9575080515161272a600154610e75565b14806128a2575b815190156128625750602081015160ff815116906002549160ff8316928382149283612849575b6020015160ff169215612801575050505063ffffffff606082015116906004549163ffffffff83168082036127d357505063ffffffff608081920151169160201c168082036127a5575050565b7f1eb5c1eb000000000000000000000000000000000000000000000000000000005f5260045260245260445ffd5b7f73b1bde3000000000000000000000000000000000000000000000000000000005f5260045260245260445ffd5b6084945060ff90604051947fd382033a000000000000000000000000000000000000000000000000000000008652600486015260081c16602484015260448301526064820152fd5b6020810151600883901c60ff9081169116149350612758565b61261d906040519182917ff6b6676b0000000000000000000000000000000000000000000000000000000083526040600484015261260b60448401610ec6565b508051602081519101206040516128bc8161059a81610ec6565b6020815191012014612731565b7f12e74add000000000000000000000000000000000000000000000000000000005f524260045260245260445ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b7f20daedb6000000000000000000000000000000000000000000000000000000005f524260045260245260445ffd5b9067ffffffffffffffff90939293168152604060208201526080810190835191604080830152825180915260a0820190602060a08260051b8501019401915f905b8282106129d9575050505060206110d6939401519060607fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc082850301910152610df8565b90919294602080612a14837fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6089600196030186528951610df8565b970192019201909291612995565b60405190612a2f82611004565b5f6040838281528260208201520152565b9080601f830112156101de5781516110d6926020016111c0565b91906060838203126101de5760405190612a7382611004565b819380518352602081015167ffffffffffffffff81116101de5782612a99918301612a40565b602084015260408101519167ffffffffffffffff83116101de5760409261124a9201612a40565b9080601f830112156101de57815191612ad883611735565b92612ae6604051948561103c565b80845260208085019160051b830101918383116101de5760208101915b838310612b1257505050505090565b825167ffffffffffffffff81116101de578201906040601f1983880301126101de5760405190612b4182610f83565b602083015167ffffffffffffffff81116101de5760209084010187601f820112156101de578051612b7181611735565b91612b7f604051938461103c565b81835260208084019260051b820101918a83116101de5760208201905b838210612bdf5750505050825260408301519167ffffffffffffffff83116101de57612bd088602080969581960101612a40565b83820152815201920191612b03565b815167ffffffffffffffff81116101de57602091612c028e848094880101612a40565b815201910190612b9c565b15612c155750565b7fb0369c31000000000000000000000000000000000000000000000000000000005f52600452600160245261ffff60445260645ffd5b91909115612c57575050565b9061261d61260b926040519384937f5f1ca381000000000000000000000000000000000000000000000000000000008552604060048601526044850190610df8565b91909115612ca5575050565b604051907ffef760c700000000000000000000000000000000000000000000000000000000825280602483016020600485015252604482019260448260051b84010191815f907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1813603015b838310612d1e5786860387fd5b90919293947fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbc8782030188528535828112156101de578301906020823592019167ffffffffffffffff81116101de5780360383136101de57602082601f19601f8480600198869897879852868601375f85828601015201160101970198019301919096939296612d11565b908151815103611b9f575f5b8251811015612e1357612dc8818461174d565b5151612dd4828461174d565b515103612e0c57612de5818461174d565b5160208151910120612df7828461174d565b516020815191012003612e0c57600101612db5565b5050505f90565b505050600190565b91612e7060209261193c60405185810190612e678161153b888591909160408060608301946fffffffffffffffffffffffffffffffff8151168452602081015160208501520151910152565b51902091611649565b0151808203612e7d575050565b7f4b2dfe98000000000000000000000000000000000000000000000000000000005f5260045260245260445ffd5b929190925f5b8451811015612ee9578083612ec86001938861174d565b51604051612edf8161153b60208201948986612954565b5190205d01612eb1565b505050905056fea164736f6c634300081c000a","sourceMap":"1362:25496:46:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;1362:25496:46;;;;;;;;4967:23;;;;1362:25496;;;;;;4967:23;1362:25496;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4967:23;1362:25496;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;4967:23;-1:-1:-1;;4967:23:46;;;;;;:::i;:::-;1362:25496;;;;;4967:23;1362:25496;;4967:23;1362:25496;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;1362:25496:46;;;;;;;;1655:48;1362:25496;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;9626:70;;1362:25496;;;26738:42;26734:105;;1362:25496;9626:70;;;;:::i;:::-;9706:196;9727:30;;1362:25496;9766:25;9727:64;;;9706:196;:::i;:::-;1362:25496;9989:30;;:43;;1362:25496;;9978:95;;1362:25496;9978:95;;1362:25496;;;;;;;;;9978:95;;1362:25496;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;;;;;;;;19053:18;1362:25496;;;;19073:11;;;:::i;:::-;19289:29;1362:25496;;;;;;;;19278:41;;;1362:25496;;;;;;;;;;;;;;;;;;;;;;;19278:41;;;;1362:25496;;19278:41;:::i;:::-;1362:25496;19268:52;;19388:21;;1362:25496;19388:36;1362:25496;;;19366:59;;;:::i;:::-;19435:179;;19456:54;;;;19435:179;:::i;:::-;19818:29;1362:25496;;;;;;;;19807:41;;;1362:25496;;;;;;;;;;;;;;;;;;;;;;;19807:41;;;;1362:25496;;19807:41;:::i;:::-;1362:25496;19797:52;;19917:21;;1362:25496;19917:36;1362:25496;;;19895:59;;;:::i;:::-;19964:179;;19985:54;;;;19964:179;:::i;:::-;10146:30;;;;:::i;:::-;1362:25496;;;;;;;;;26734:105;26807:20;;:::i;:::-;26734:105;;1362:25496;;;;;;;;;;;4713:26:93;1362:25496:46;;;:::i;:::-;4683:18:93;2475:4;4683:18;;3867:6;1362:25496:46;3867:6:93;1362:25496:46;;3867:22:93;1362:25496:46;3867:6:93;1362:25496:46;3867:22:93;1362:25496:46;3776:120:93;;4683:18;2475:4;:::i;:::-;4713:26;:::i;:::-;1362:25496:46;;;;;;-1:-1:-1;;1362:25496:46;;;;;;;;1558:51;1362:25496;;;;;;;;-1:-1:-1;;1362:25496:46;;;;;;;;;;;;:::i;:::-;;;;:::i;:::-;;;;;;;:::i;:::-;2102:51;1362:25496;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;2102:51;1362:25496;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;1362:25496:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;-1:-1:-1;;1362:25496:46;;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;-1:-1:-1;;1362:25496:46;;;:::i;:::-;;;;;;;;;;1526:13:125;;;1362:25496:46;1558:3:125;1541:15;;;;;;1347:26;1362:25496:46;1590:75:125;1362:25496:46;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;1362:25496:46;;;;;;:::i;:::-;1627:4:125;1590:75;:::i;:::-;1577:88;;;;:::i;:::-;;;;;;:::i;:::-;;1362:25496:46;1526:13:125;;1541:15;1362:25496:46;;;;;;;;;;1541:15:125;1362:25496:46;:::i;:::-;;;;;;;;;;;;;;;;;;-1:-1:-1;;1362:25496:46;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;2920:29:93;1362:25496:46;-1:-1:-1;1362:25496:46;;;;;;-1:-1:-1;1362:25496:46;;;;;;;;;;;;;;;;-1:-1:-1;;1362:25496:46;;;;;;;;;;;;;;;;-1:-1:-1;;1362:25496:46;;;;;;;;;;;;;;;;;;;;;;;;;26738:42;26734:105;;1362:25496;7195:10;;;;;;;;:::i;:::-;:21;;;1362:25496;;;7260:10;;;;7248:64;7260:10;;:::i;:::-;7272:16;1362:25496;7301:10;7290:9;;;;;;:::i;:::-;7301:10;;;;:::i;:::-;1362:25496;;;:::i;:::-;7272:16;;7248:64;;:::i;:::-;1362:25496;;;;;;;;;;;;;26734:105;26807:20;;:::i;:::-;26734:105;;1362:25496;;;;;-1:-1:-1;;1362:25496:46;;;;;;;;2583:33;1362:25496;;;;;;;;-1:-1:-1;;1362:25496:46;;;;;;;;;;;;;;;;-1:-1:-1;;1362:25496:46;;;;;;;;;;;;;;;;;;;;;;;;;;;7551:63;;1362:25496;;;;26738:42;26734:105;;1362:25496;7593:9;7563:10;;;;:::i;:::-;7593:9;;;;;;;;:::i;:::-;1362:25496;;;7575:16;1362:25496;;;;;;;:::i;:::-;;;;7575:16;7551:63;;:::i;26734:105::-;26807:20;;:::i;:::-;26734:105;;1362:25496;;;;;;;:::i;:::-;735:10:121;1362:25496:46;;;5387:34:93;5383:102;;5495:37;;;:::i;5383:102::-;5444:30;1362:25496:46;5444:30:93;1362:25496:46;;5444:30:93;1362:25496:46;;;;;-1:-1:-1;;1362:25496:46;;;;;;;;1861:50;1362:25496;;;;;;;4296:25:93;1362:25496:46;;;:::i;:::-;4266:18:93;2475:4;4266:18;;3867:6;1362:25496:46;3867:6:93;1362:25496:46;;3867:22:93;1362:25496:46;3867:6:93;1362:25496:46;3867:22:93;1362:25496:46;3776:120:93;;2475:4;4296:25;:::i;1362:25496:46:-;;;;;-1:-1:-1;;1362:25496:46;;;;;;;;2479:10;1362:25496;;;;;;;;-1:-1:-1;;1362:25496:46;;;;;;;;;3867:6:93;1362:25496:46;3867:6:93;1362:25496:46;;3867:22:93;1362:25496:46;3867:6:93;1362:25496:46;3867:22:93;1362:25496:46;3776:120:93;;1362:25496:46;;;;;-1:-1:-1;;1362:25496:46;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;5408:1560;;1362:25496;;;26738:42;26734:105;;5408:1560;:::i;:::-;1362:25496;;;;;;;;;;;;;;;;;;;;;;;26734:105;26807:20;;:::i;:::-;5408:1560;:::i;1362:25496::-;;;;;-1:-1:-1;;1362:25496:46;;;;;;;;;1957:38;1362:25496;;;;;;;;;-1:-1:-1;;1362:25496:46;;;;;;;;1749:66;1362:25496;;;;;;;;-1:-1:-1;;1362:25496:46;;;;;;;;;;;;;;;;2639:47:93;2654:32;1362:25496:46;2639:47:93;;:87;;;;;1362:25496:46;;;;;;;2639:87:93;844:25:133;829:40;;;2639:87:93;;;1362:25496:46;;;-1:-1:-1;;1362:25496:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;-1:-1:-1;;1362:25496:46;;;;;;;;;;;;;;;;;;;:::o;:::-;;-1:-1:-1;;1362:25496:46;;;;;;;;;;;;;;;;;-1:-1:-1;1362:25496:46;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1362:25496:46;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;-1:-1:-1;;1362:25496:46;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;2102:51;1362:25496;;;;;;;:::i;:::-;;;;;2102:51;1362:25496;;;2102:51;;;;1362:25496;;;;;;;:::o;:::-;2102:51;-1:-1:-1;1362:25496:46;;;;;-1:-1:-1;1362:25496:46;;-1:-1:-1;1362:25496:46;;;;;;;;;;;;;;:::o;:::-;2102:51;1362:25496;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;:::o;:::-;;-1:-1:-1;1362:25496:46;;;;;-1:-1:-1;1362:25496:46;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;:::o;:::-;;;-1:-1:-1;;1362:25496:46;;;;;;;;;;;;;;;;:::o;:::-;;-1:-1:-1;1362:25496:46;;;:::o;:::-;;;;;;;;-1:-1:-1;;1362:25496:46;;;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;-1:-1:-1;1362:25496:46;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;:::i;:::-;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;:::o;:::-;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;-1:-1:-1;1362:25496:46;;;;;;:::o;:::-;;;;;;;;;;:::o;:::-;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;:::i;:::-;;;;:::o;:::-;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;1362:25496:46;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;;;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;;;;;;;;:::i;:::-;;;;;;;:::i;5408:1560::-;5651:58;5408:1560;5651:58;;;;:::i;:::-;5719:186;5740:24;;1362:25496;5773:26;5740:59;;;5719:186;:::i;:::-;5992:37;:24;;:37;;1362:25496;;5981:89;;1362:25496;5992:37;1362:25496;;;;;;5992:37;5981:89;;1362:25496;;;;;;;;5981:89;5992:37;5981:89;;;1362:25496;;;;:::i;:::-;6115:6;;;;:::i;:::-;6178:26;;;:::i;:::-;1362:25496;;;;;;;6218:52;;;6351:16;;1362:25496;5992:37;1362:25496;6351:16;6906:24;6351:16;;;;;:31;;;;1362:25496;;;;;;;;6351:73;;6347:155;;6214:666;6593:24;;;;1362:25496;;6582:36;;;;;;;;1362:25496;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6582:36;;-1:-1:-1;;6582:36:46;;;;;;:::i;:::-;1362:25496;6572:47;;6537:16;;:31;1362:25496;;-1:-1:-1;1362:25496:46;6515:21;5992:37;1362:25496;;-1:-1:-1;1362:25496:46;;6214:666;6906:24;;:::i;6347:155::-;1362:25496;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6347:155;;;;6214:666;-1:-1:-1;1362:25496:46;6640:58;;1362:25496;;6906:24;1362:25496;;;6714:20;1362:25496;;;6714:20;1362:25496;6214:666;;6636:244;6778:34;6762:50;;6758:122;;6906:24;6636:244;6214:666;;6758:122;6828:41;;6778:34;6828:41;:::o;5043:228::-;1362:25496;;-1:-1:-1;1362:25496:46;5152:21;1362:25496;;;-1:-1:-1;1362:25496:46;;5207:9;;1362:25496;;5043:228;:::o;1362:25496::-;;-1:-1:-1;1362:25496:46;;-1:-1:-1;1362:25496:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;3165:103:93;735:10:121;2920:6:93;1362:25496:46;;;;;;;;;;;;3485:23:93;3481:108;;3165:103::o;3481:108::-;3531:47;2920:6;3531:47;735:10:121;3531:47:93;1362:25496:46;2583:33;1362:25496;;;2920:6:93;3531:47;3165:103;1362:25496:46;2920:6:93;1362:25496:46;2920:6:93;1362:25496:46;;;2920:6:93;1362:25496:46;;735:10:121;1362:25496:46;-1:-1:-1;1362:25496:46;;;;;-1:-1:-1;1362:25496:46;;;3485:23:93;3481:108;;3165:103;:::o;3481:108::-;3531:47;2920:6;3531:47;735:10:121;3531:47:93;1362:25496:46;;;;2920:6:93;3531:47;1362:25496:46;;;;;;:::o;:::-;;;;;;;;;;;18224:570;18612:175;18224:570;18390:11;18370:18;;1362:25496;18390:11;;;1362:25496;;18390:11;;:::i;:::-;18544:58;1362:25496;18469:28;18566:20;18469:28;;;;1362:25496;;18458:40;;;;;;;;1362:25496;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18458:40;1362:25496;18448:51;;18566:20;;;:35;1362:25496;;18544:58;:::i;:::-;18633:52;;;18612:175;:::i;:::-;18224:570::o;22969:1028::-;1362:25496;23191:31;:16;;;;:31;1362:25496;;;;23169:21;23191:31;1362:25496;;;;;23237:32;;23233:758;23237:32;;;23357:43;;1362:25496;23357:43;:::o;23233:758::-;1362:25496;23477:24;;;;;1362:25496;;23466:36;;;23191:31;23466:36;;;;1362:25496;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23466:36;1362:25496;23456:47;;23434:69;;;;:165;;;23233:758;-1:-1:-1;;23417:574:46;;;23775:42;23768:49;:::o;23417:574::-;23946:34;23939:41;:::o;23434:165::-;1362:25496;23523:28;;;23191:31;23523:28;;;;1362:25496;;23565:24;;1362:25496;;-1:-1:-1;23523:76:46;23434:165;;;;24158:152;1362:25496;24238:8;1362:25496;;;;24291:11;24271:18;;;;24291:11;;;24238:65;;;;;;-1:-1:-1;1362:25496:46;;;;24291:11;1362:25496;24238:65;;;;;;;1362:25496;24238:65;;;;;1362:25496;;;;;;;;;;;:::i;:::-;;-1:-1:-1;;1362:25496:46;;;;;;;;;:::i;:::-;24238:65;;;;;;;;;;24158:152;:::o;24238:65::-;-1:-1:-1;24238:65:46;;;:::i;:::-;24291:11;1362:25496;;-1:-1:-1;1362:25496:46;;;;;6145:316:93;1362:25496:46;;;;;;;;;;;;-1:-1:-1;1362:25496:46;;;;;-1:-1:-1;1362:25496:46;;;6242:23:93;6238:217;1362:25496:46;;;;;;;;;;;;;;;-1:-1:-1;1362:25496:46;;;;-1:-1:-1;1362:25496:46;6313:4:93;1362:25496:46;;;;;;;;735:10:121;1362:25496:46;;6336:40:93;;1362:25496:46;6336:40:93;;6313:4;6390:11;:::o;6238:217::-;6432:12;;1362:25496:46;6432:12:93;:::o;6698:317::-;1362:25496:46;;;;;;;;;;;;-1:-1:-1;1362:25496:46;;;;;-1:-1:-1;1362:25496:46;;;6792:217:93;1362:25496:46;;;;;;;;;;;;;;;-1:-1:-1;1362:25496:46;;;;-1:-1:-1;1362:25496:46;;;;;;;;735:10:121;1362:25496:46;;6890:40:93;;1362:25496:46;6890:40:93;;1362:25496:46;6944:11:93;:::o;1362:25496:46:-;;;;;;;;;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;8198:1064;;;;;;;8428:17;;8424:181;;8672:52;;1362:25496;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;:::i;:::-;;;;:::i;:::-;8738:83;;8883:21;;1362:25496;;;10936:60;;1362:25496;10936:60;;1362:25496;;;;;;;;;10936:60;;1362:25496;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;:::i;:::-;;;;;;;;11006:160;11027:14;;1362:25496;11050:23;11027:46;;;11006:160;:::i;:::-;1362:25496;11249:14;;:27;;1362:25496;;;11238:75;;1362:25496;;;;;;;;;11238:75;;1362:25496;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;11238:75;1362:25496;11238:75;;;1362:25496;;;;:::i;:::-;;11323:177;1362:25496;;;;;;;;11344:25;;;:70;;;11323:177;:::i;:::-;1362:25496;;11670:3;11647:14;;1362:25496;;11643:25;;;;;11710:17;;11698:43;11710:17;;:::i;:::-;;:22;1362:25496;;;;;:::i;:::-;11698:43;;:::i;:::-;11697:44;11693:99;;11831:14;;;12139:50;12342:14;11831;1362:25496;11831:14;;;11872:185;12287:27;11831:14;1362:25496;26392:3;11831:14;;;;:17;:14;;:17;:::i;:::-;;:23;;1362:25496;;;;;11901:30;;;:72;;;;11670:3;11872:185;;;:::i;:::-;1362:25496;12139:50;:::i;:::-;1362:25496;12259:26;;;;;;:::i;:::-;12287:27;;;;:::i;12342:14::-;12471;1362:25496;;;12471:25;12467:152;;11623:503;12658:27;;;1362:25496;;;8837:81;:::o;12467:152::-;12526:26;12512:96;12526:26;;:::i;:::-;12570:27;;;;1362:25496;;12512:96;;:::i;:::-;12467:152;;;;11901:72;1362:25496;;;;;;11935:16;1362:25496;;;;11955:18;11935:38;11901:72;;;;11693:99;11765:8;1362:25496;;11628:13;;;11643:25;;12287:27;11643:25;;1362:25496;11643:25;;;12139:50;12342:14;11643:25;1362:25496;11643:25;;;26392:3;11643:25;;;12139:50;:::i;11344:70::-;11373:41;1362:25496;11373:41;;;11323:177;:::i;8734:421::-;1362:25496;;;;;;;;;;;;:::i;:::-;;;;:::i;:::-;8939:98;8935:220;;1362:25496;8734:421;1362:25496;;;;:::i;:::-;;;;:::i;:::-;9195:60;1362:25496;9195:60;1362:25496;9195:60;1362:25496;;;9195:60;8935:220;9109:21;;;;;;;1362:25496;;;;;;;;:::i;:::-;;;;;;:::i;:::-;;;;;;:::i;:::-;;;;;;;;;:::i;:::-;-1:-1:-1;1362:25496:46;;-1:-1:-1;1362:25496:46;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;1362:25496:46;;-1:-1:-1;1362:25496:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;1362:25496:46;;-1:-1:-1;1362:25496:46;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;1362:25496:46;;-1:-1:-1;1362:25496:46;;;;;;;;;;;;;;13703:75;;1362:25496;;;;;;;;;13703:75;;1362:25496;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;13703:75;;13792:208;13703:75;;1362:25496;;;;:::i;:::-;;;;;13840:41;13817:64;;;13792:208;:::i;:::-;1362:25496;14035:14;;:27;;1362:25496;;;14024:95;;1362:25496;14024:95;;1362:25496;;;;;;;;;14024:95;;1362:25496;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;:::i;:::-;;14133:189;1362:25496;;;;;;;;14158:25;;;:70;;;14133:189;:::i;:::-;1362:25496;14362:26;;;;;;:::i;:::-;1362:25496;;14392:25;;:35;;:50;;1362:25496;14392:50;;1362:25496;;;;;;14362:80;:184;;;8935:220;14605:26;;;:::i;:::-;14653;1362:25496;14653:26;;;:::i;:::-;1362:25496;;;;;;;14904:25;;;;14961:14;14904:25;;;;;:::i;14961:14::-;15087:45;15106:25;;15087:45;:::i;:::-;1362:25496;;;;;;15150:52;;;15291:26;;;;:::i;:::-;1362:25496;;;;;;;;;15291:68;15287:153;;15146:599;15550:25;1362:25496;15550:25;;:43;;1362:25496;;15539:55;;;1362:25496;15539:55;;;;1362:25496;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15539:55;1362:25496;15529:66;;1362:25496;15479:26;;;:::i;:::-;1362:25496;;;15457:21;1362:25496;;;;;;15146:599;1362:25496;;15934:3;15911:14;;1362:25496;;15907:25;;;;;15974:17;;15962:43;15974:17;;:::i;15962:43::-;15961:44;15957:99;;16095:14;26392:3;16095:14;;1362:25496;16095:14;;16136:185;16095:14;;1362:25496;16095:17;16403:50;16095:14;1362:25496;16095:14;;:17;:::i;:::-;;:23;;1362:25496;;;;;16165:30;;;:72;;;;16136:185;;;:::i;16403:50::-;16639:43;16513:25;;:43;;;;:48;1362:25496;;;16513:48;;;1362:25496;16575:35;;;:50;1362:25496;;16639:43;;:::i;:::-;16806:14;1362:25496;;;16806:25;16802:198;;15887:503;17039:25;;;:43;;1362:25496;;;9053:91;:::o;16802:198::-;16878:26;16847:142;16878:26;;:::i;:::-;16922:25;;;;;:43;;1362:25496;;16847:142;;:::i;:::-;16802:198;;;;16165:72;1362:25496;;;;;;16199:16;1362:25496;;;;16219:18;16199:38;16165:72;;;;15957:99;16029:8;1362:25496;;15892:13;;;15907:25;;1362:25496;15907:25;;;16403:50;15907:25;;;1362:25496;15907:25;;26392:3;15907:25;;16403:50;:::i;15287:153::-;1362:25496;;;;:::i;:::-;;;;;;;;;;;;;;;;:::i;:::-;15287:153;;;15146:599;1362:25496;;;15620:58;15146:599;15616:129;15705:25;1362:25496;15705:25;;1362:25496;15705:25;1362:25496;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14362:184;14466:26;;;;:::i;:::-;1362:25496;;;;;;;14466:80;14362:184;;8424:181;8529:26;;;;;;1362:25496;8529:26;;;:::i;:::-;1362:25496;;;;;;;:::i;:::-;;;;:::i;:::-;;;8529:26;8557:35;;1362:25496;;;;;25529:31;;;;8529:26;25529:31;;;;;:::i;:::-;1362:25496;25519:42;;4288:69:130;25678:11:46;;25691:12;;25639:14;;1362:25496;;8496:98;;26392:3;8496:98;1362:25496;8489:105;:::o;1362:25496::-;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;-1:-1:-1;;1362:25496:46;;;;;;;;;:::i;:::-;;;;4691:549:119;;-1:-1:-1;4691:549:119;;3526:129:124;;;;;;;;;;4874:72:119;;4691:549;4870:364;;;4816:252:124;;;;;;;;-1:-1:-1;3526:129:124;4816:252;;;3526:129;4816:252;;;;;;4962:32:119;:::o;4870:364::-;5011:223;;;1362:25496:46;5045:24:119;;-1:-1:-1;5045:24:119;1362:25496:46;5045:24:119;1362:25496:46;;-1:-1:-1;5045:24:119;5011:223;4578:73:124;5090:33:119;4578:73:124;;1362:25496:46;;;-1:-1:-1;1362:25496:46;;;;;5086:148:119;5204:19;-1:-1:-1;5204:19:119;;-1:-1:-1;5204:19:119;4874:72;-1:-1:-1;4578:73:124;4886:33:119;;;4874:72;4886:59;4923:18;;;:22;;4874:72;;20407:2140:46;;1362:25496;26392:3;20407:2140;1362:25496;;20615:15;20590:40;;1362:25496;;20615:15;;1362:25496;20615:15;1362:25496;;;;2479:10;-1:-1:-1;1362:25496:46;;21393:25;;;1362:25496;;21436:11;1362:25496;;:::i;:::-;21387:76;:180;;;20407:2140;21618:25;;1362:25496;;;;21685:28;;;;;1362:25496;;;;;21727:22;1362:25496;;;;;21685:74;;;;:172;;;;20407:2140;21685:28;22069:40;1362:25496;;;;;;;22164:32;;;;1362:25496;22164:32;;;1362:25496;;;22200:26;1362:25496;;;;;22164:62;;;1362:25496;;22365:33;;1362:25496;22365:33;;;;1362:25496;;;21685:28;1362:25496;;22365:64;;;1362:25496;;20407:2140;;:::o;1362:25496::-;;-1:-1:-1;1362:25496:46;22200:26;1362:25496;;;;-1:-1:-1;1362:25496:46;;;-1:-1:-1;1362:25496:46;22200:26;1362:25496;;;;-1:-1:-1;1362:25496:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21685:172;:28;21779:40;;1362:25496;;;;;;;;;;;21779:78;;-1:-1:-1;21685:172:46;;1362:25496;;;;;;;;;;;;;;;;;;;;;:::i;21387:180::-;21499:25;;;1362:25496;;;;;21483:43;1362:25496;;;;;;;:::i;:::-;;;;;;21530:37;21483:84;21387:180;;1362:25496;;-1:-1:-1;1362:25496:46;20615:15;1362:25496;;;;;-1:-1:-1;1362:25496:46;;;-1:-1:-1;1362:25496:46;;;;;-1:-1:-1;1362:25496:46;;;-1:-1:-1;1362:25496:46;20615:15;1362:25496;;;;;-1:-1:-1;1362:25496:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;1362:25496:46;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;-1:-1:-1;;1362:25496:46;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::o;:::-;;;;;;8968:69;1362:25496;;14291:16;1362:25496;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1362:25496:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;1362:25496:46;;;;;;;;;;;;;;;-1:-1:-1;1362:25496:46;;;;;;;;;;;;;;;;;;;;;;;;365:427:55;;1362:25496:46;;;;459:20:55;455:63;;1362:25496:46;561:3:55;1362:25496:46;;547:12:55;;;;;584:4;;;;:::i;:::-;;1362:25496:46;599:4:55;;;;:::i;:::-;;1362:25496:46;584:26:55;580:77;;684:4;;;;:::i;:::-;;1362:25496:46;;;;;674:15:55;703:4;;;;:::i;:::-;;1362:25496:46;;;;;693:15:55;674:34;670:85;;1362:25496:46;;532:13:55;;670:85;728:12;;;1362:25496:46;728:12:55;:::o;547:::-;;;;1362:25496:46;365:427:55;:::o;17346:759:46:-;;17739:177;17616:33;17346:759;17695:34;1362:25496;;17616:33;;;;;;;;;1362:25496;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17616:33;1362:25496;17606:44;;17695:34;;:::i;17739:177::-;17972:26;1362:25496;17948:50;;;1362:25496;;17346:759;;:::o;1362:25496::-;;-1:-1:-1;1362:25496:46;;;;;;-1:-1:-1;1362:25496:46;24783:318;;;;;24921:1;24944:3;1362:25496;;24924:18;;;;;25018:10;;;1362:25496;25018:10;;;:::i;:::-;;1362:25496;;24994:35;;;;;;;;;;:::i;:::-;1362:25496;24984:46;;4520:68:130;1362:25496:46;24909:13;;24924:18;;;;;;24783:318::o","linkReferences":{},"immutableReferences":{"10759":[{"start":1367,"length":32},{"start":5189,"length":32}],"10762":[{"start":505,"length":32},{"start":7681,"length":32}],"10765":[{"start":3251,"length":32},{"start":8581,"length":32}],"10768":[{"start":672,"length":32},{"start":2753,"length":32}],"10772":[{"start":3192,"length":32},{"start":6682,"length":32}]}},"methodIdentifiers":{"ALLOWED_SP1_CLOCK_DRIFT()":"2c3ee474","DEFAULT_ADMIN_ROLE()":"a217fddf","MEMBERSHIP_PROGRAM_VKEY()":"e45a6d0d","MISBEHAVIOUR_PROGRAM_VKEY()":"314d4dff","PROOF_SUBMITTER_ROLE()":"5972185a","UPDATE_CLIENT_AND_MEMBERSHIP_PROGRAM_VKEY()":"0225293e","UPDATE_CLIENT_PROGRAM_VKEY()":"ca7242f9","VERIFIER()":"08c84e70","clientState()":"bd3ce6b0","getClientState()":"ef913a4b","getConsensusStateHash(uint64)":"23842fb8","getRoleAdmin(bytes32)":"248a9ca3","grantRole(bytes32,address)":"2f2ff15d","hasRole(bytes32,address)":"91d14854","misbehaviour(bytes)":"ddba6537","multicall(bytes[])":"ac9650d8","renounceRole(bytes32,address)":"36568abe","revokeRole(bytes32,address)":"d547741f","supportsInterface(bytes4)":"01ffc9a7","updateClient(bytes)":"0bece356","verifyMembership((bytes,(uint64,uint64),bytes[],bytes))":"682ed5f0","verifyNonMembership((bytes,(uint64,uint64),bytes[]))":"4d6d9ffb"},"rawMetadata":"{\"compiler\":{\"version\":\"0.8.28+commit.7893614a\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"updateClientProgramVkey\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"membershipProgramVkey\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"updateClientAndMembershipProgramVkey\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"misbehaviourProgramVkey\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"sp1Verifier\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"_clientState\",\"type\":\"bytes\"},{\"internalType\":\"bytes32\",\"name\":\"_consensusState\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"roleManager\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"AccessControlBadConfirmation\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"internalType\":\"bytes32\",\"name\":\"neededRole\",\"type\":\"bytes32\"}],\"name\":\"AccessControlUnauthorizedAccount\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"target\",\"type\":\"address\"}],\"name\":\"AddressEmptyCode\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"CannotHandleMisbehavior\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"expected\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"actual\",\"type\":\"string\"}],\"name\":\"ChainIdMismatch\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"expected\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"actual\",\"type\":\"bytes\"}],\"name\":\"ClientStateMismatch\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"expected\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"actual\",\"type\":\"bytes32\"}],\"name\":\"ConsensusStateHashMismatch\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ConsensusStateNotFound\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"expected\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"actual\",\"type\":\"bytes32\"}],\"name\":\"ConsensusStateRootMismatch\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"EmptyValue\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"FailedCall\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"FeatureNotSupported\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"FrozenClientState\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidMembershipProof\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes[]\",\"name\":\"path\",\"type\":\"bytes[]\"},{\"internalType\":\"bytes\",\"name\":\"value\",\"type\":\"bytes\"}],\"name\":\"KeyValuePairNotInCache\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"length\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"min\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"max\",\"type\":\"uint256\"}],\"name\":\"LengthIsOutOfRange\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes[]\",\"name\":\"path\",\"type\":\"bytes[]\"}],\"name\":\"MembershipProofKeyNotFound\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"expected\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"actual\",\"type\":\"bytes\"}],\"name\":\"MembershipProofValueMismatch\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"expectedRevisionNumber\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"expectedRevisionHeight\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"actualRevisionNumber\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"actualRevisionHeight\",\"type\":\"uint64\"}],\"name\":\"ProofHeightMismatch\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"now\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"proofTimestamp\",\"type\":\"uint256\"}],\"name\":\"ProofIsInTheFuture\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"now\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"proofTimestamp\",\"type\":\"uint256\"}],\"name\":\"ProofIsTooOld\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"expectedNumerator\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"expectedDenominator\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"actualNumerator\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"actualDenominator\",\"type\":\"uint256\"}],\"name\":\"TrustThresholdMismatch\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"expected\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"actual\",\"type\":\"uint256\"}],\"name\":\"TrustingPeriodMismatch\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"trustingPeriod\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"unbondingPeriod\",\"type\":\"uint256\"}],\"name\":\"TrustingPeriodTooLong\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"expected\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"actual\",\"type\":\"uint256\"}],\"name\":\"UnbondingPeriodMismatch\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint8\",\"name\":\"proofType\",\"type\":\"uint8\"}],\"name\":\"UnknownMembershipProofType\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint8\",\"name\":\"algorithm\",\"type\":\"uint8\"}],\"name\":\"UnknownZkAlgorithm\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"expected\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"actual\",\"type\":\"bytes32\"}],\"name\":\"VerificationKeyMismatch\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"previousAdminRole\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"newAdminRole\",\"type\":\"bytes32\"}],\"name\":\"RoleAdminChanged\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"RoleGranted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"RoleRevoked\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"ALLOWED_SP1_CLOCK_DRIFT\",\"outputs\":[{\"internalType\":\"uint16\",\"name\":\"\",\"type\":\"uint16\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"DEFAULT_ADMIN_ROLE\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"MEMBERSHIP_PROGRAM_VKEY\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"MISBEHAVIOUR_PROGRAM_VKEY\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"PROOF_SUBMITTER_ROLE\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"UPDATE_CLIENT_AND_MEMBERSHIP_PROGRAM_VKEY\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"UPDATE_CLIENT_PROGRAM_VKEY\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"VERIFIER\",\"outputs\":[{\"internalType\":\"contract ISP1Verifier\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"clientState\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"chainId\",\"type\":\"string\"},{\"components\":[{\"internalType\":\"uint8\",\"name\":\"numerator\",\"type\":\"uint8\"},{\"internalType\":\"uint8\",\"name\":\"denominator\",\"type\":\"uint8\"}],\"internalType\":\"struct IICS07TendermintMsgs.TrustThreshold\",\"name\":\"trustLevel\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint64\",\"name\":\"revisionNumber\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"revisionHeight\",\"type\":\"uint64\"}],\"internalType\":\"struct IICS02ClientMsgs.Height\",\"name\":\"latestHeight\",\"type\":\"tuple\"},{\"internalType\":\"uint32\",\"name\":\"trustingPeriod\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"unbondingPeriod\",\"type\":\"uint32\"},{\"internalType\":\"bool\",\"name\":\"isFrozen\",\"type\":\"bool\"},{\"internalType\":\"enum IICS07TendermintMsgs.SupportedZkAlgorithm\",\"name\":\"zkAlgorithm\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getClientState\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"revisionHeight\",\"type\":\"uint64\"}],\"name\":\"getConsensusStateHash\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"}],\"name\":\"getRoleAdmin\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"grantRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"hasRole\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"misbehaviourMsg\",\"type\":\"bytes\"}],\"name\":\"misbehaviour\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes[]\",\"name\":\"data\",\"type\":\"bytes[]\"}],\"name\":\"multicall\",\"outputs\":[{\"internalType\":\"bytes[]\",\"name\":\"results\",\"type\":\"bytes[]\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"callerConfirmation\",\"type\":\"address\"}],\"name\":\"renounceRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"revokeRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes4\",\"name\":\"interfaceId\",\"type\":\"bytes4\"}],\"name\":\"supportsInterface\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"updateMsg\",\"type\":\"bytes\"}],\"name\":\"updateClient\",\"outputs\":[{\"internalType\":\"enum ILightClientMsgs.UpdateResult\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes\",\"name\":\"proof\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"uint64\",\"name\":\"revisionNumber\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"revisionHeight\",\"type\":\"uint64\"}],\"internalType\":\"struct IICS02ClientMsgs.Height\",\"name\":\"proofHeight\",\"type\":\"tuple\"},{\"internalType\":\"bytes[]\",\"name\":\"path\",\"type\":\"bytes[]\"},{\"internalType\":\"bytes\",\"name\":\"value\",\"type\":\"bytes\"}],\"internalType\":\"struct ILightClientMsgs.MsgVerifyMembership\",\"name\":\"msg_\",\"type\":\"tuple\"}],\"name\":\"verifyMembership\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes\",\"name\":\"proof\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"uint64\",\"name\":\"revisionNumber\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"revisionHeight\",\"type\":\"uint64\"}],\"internalType\":\"struct IICS02ClientMsgs.Height\",\"name\":\"proofHeight\",\"type\":\"tuple\"},{\"internalType\":\"bytes[]\",\"name\":\"path\",\"type\":\"bytes[]\"}],\"internalType\":\"struct ILightClientMsgs.MsgVerifyNonMembership\",\"name\":\"msg_\",\"type\":\"tuple\"}],\"name\":\"verifyNonMembership\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"author\":\"srdtrk\",\"errors\":{\"AccessControlBadConfirmation()\":[{\"details\":\"The caller of a function is not the expected one. NOTE: Don't confuse with {AccessControlUnauthorizedAccount}.\"}],\"AccessControlUnauthorizedAccount(address,bytes32)\":[{\"details\":\"The `account` is missing a role.\"}],\"AddressEmptyCode(address)\":[{\"details\":\"There's no code at `target` (it is not a contract).\"}],\"CannotHandleMisbehavior()\":[{\"details\":\"Misbehavior cannot be handled in membership handler, so it is returned as an error.\"}],\"ChainIdMismatch(string,string)\":[{\"params\":{\"actual\":\"The actual chain ID.\",\"expected\":\"The expected chain ID.\"}}],\"ClientStateMismatch(bytes,bytes)\":[{\"params\":{\"actual\":\"The actual client state.\",\"expected\":\"The expected client state.\"}}],\"ConsensusStateHashMismatch(bytes32,bytes32)\":[{\"params\":{\"actual\":\"The actual consensus state hash.\",\"expected\":\"The expected consensus state hash.\"}}],\"ConsensusStateRootMismatch(bytes32,bytes32)\":[{\"params\":{\"actual\":\"The actual consensus state root.\",\"expected\":\"The expected consensus state root.\"}}],\"FailedCall()\":[{\"details\":\"A call to an address target failed. The target may have reverted.\"}],\"KeyValuePairNotInCache(bytes[],bytes)\":[{\"params\":{\"path\":\"The path of the key-value pair.\",\"value\":\"The value of the key-value pair.\"}}],\"LengthIsOutOfRange(uint256,uint256,uint256)\":[{\"params\":{\"length\":\"The length of the value.\",\"max\":\"The maximum length of the value.\",\"min\":\"The minimum length of the value.\"}}],\"MembershipProofKeyNotFound(bytes[])\":[{\"params\":{\"path\":\"The path of the key-value pair.\"}}],\"MembershipProofValueMismatch(bytes,bytes)\":[{\"params\":{\"actual\":\"The actual value.\",\"expected\":\"The expected value.\"}}],\"ProofHeightMismatch(uint64,uint64,uint64,uint64)\":[{\"params\":{\"actualRevisionHeight\":\"The actual revision height.\",\"actualRevisionNumber\":\"The actual revision number.\",\"expectedRevisionHeight\":\"The expected revision height.\",\"expectedRevisionNumber\":\"The expected revision number.\"}}],\"ProofIsInTheFuture(uint256,uint256)\":[{\"params\":{\"now\":\"The current timestamp in seconds.\",\"proofTimestamp\":\"The timestamp in the proof in seconds.\"}}],\"ProofIsTooOld(uint256,uint256)\":[{\"params\":{\"now\":\"The current timestamp in seconds.\",\"proofTimestamp\":\"The timestamp in the proof in seconds.\"}}],\"TrustThresholdMismatch(uint256,uint256,uint256,uint256)\":[{\"params\":{\"actualDenominator\":\"The actual denominator of the trust threshold.\",\"actualNumerator\":\"The actual numerator of the trust threshold.\",\"expectedDenominator\":\"The expected denominator of the trust threshold.\",\"expectedNumerator\":\"The expected numerator of the trust threshold.\"}}],\"TrustingPeriodMismatch(uint256,uint256)\":[{\"params\":{\"actual\":\"The actual trusting period in seconds.\",\"expected\":\"The expected trusting period in seconds.\"}}],\"TrustingPeriodTooLong(uint256,uint256)\":[{\"params\":{\"trustingPeriod\":\"The trusting period in seconds.\",\"unbondingPeriod\":\"The unbonding period in seconds.\"}}],\"UnbondingPeriodMismatch(uint256,uint256)\":[{\"params\":{\"actual\":\"The actual unbonding period in seconds.\",\"expected\":\"The expected unbonding period in seconds.\"}}],\"UnknownMembershipProofType(uint8)\":[{\"params\":{\"proofType\":\"The unknown membership proof type.\"}}],\"UnknownZkAlgorithm(uint8)\":[{\"params\":{\"algorithm\":\"The unknown zk algorithm.\"}}],\"VerificationKeyMismatch(bytes32,bytes32)\":[{\"params\":{\"actual\":\"The actual verification key.\",\"expected\":\"The expected verification key.\"}}]},\"events\":{\"RoleAdminChanged(bytes32,bytes32,bytes32)\":{\"details\":\"Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite {RoleAdminChanged} not being emitted to signal this.\"},\"RoleGranted(bytes32,address,address)\":{\"details\":\"Emitted when `account` is granted `role`. `sender` is the account that originated the contract call. This account bears the admin role (for the granted role). Expected in cases where the role was granted using the internal {AccessControl-_grantRole}.\"},\"RoleRevoked(bytes32,address,address)\":{\"details\":\"Emitted when `account` is revoked `role`. `sender` is the account that originated the contract call: - if using `revokeRole`, it is the admin role bearer - if using `renounceRole`, it is the role bearer (i.e. `account`)\"}},\"kind\":\"dev\",\"methods\":{\"constructor\":{\"params\":{\"_clientState\":\"The encoded initial client state.\",\"_consensusState\":\"The encoded initial consensus state.\",\"membershipProgramVkey\":\"The verification key for the verify (non)membership program.\",\"misbehaviourProgramVkey\":\"The verification key for the misbehaviour program.\",\"roleManager\":\"Manages the proof submitters and can submit proofs. Should be the ICS26Router if used in IBC.\",\"sp1Verifier\":\"The address of the SP1 verifier contract.\",\"updateClientAndMembershipProgramVkey\":\"The verification key for the update client and membership program.\",\"updateClientProgramVkey\":\"The verification key for the update client program.\"}},\"getClientState()\":{\"returns\":{\"_0\":\"The client state.\"}},\"getConsensusStateHash(uint64)\":{\"params\":{\"revisionHeight\":\"The revision height.\"},\"returns\":{\"_0\":\"The consensus state at the given revision height.\"}},\"getRoleAdmin(bytes32)\":{\"details\":\"Returns the admin role that controls `role`. See {grantRole} and {revokeRole}. To change a role's admin, use {_setRoleAdmin}.\"},\"grantRole(bytes32,address)\":{\"details\":\"Grants `role` to `account`. If `account` had not been already granted `role`, emits a {RoleGranted} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleGranted} event.\"},\"hasRole(bytes32,address)\":{\"details\":\"Returns `true` if `account` has been granted `role`.\"},\"misbehaviour(bytes)\":{\"details\":\"The misbehavior is verfied in the sp1 program. Here we only check the public values which contain the trusted headers.\",\"params\":{\"misbehaviourMsg\":\"The misbehaviour message\"}},\"multicall(bytes[])\":{\"custom:oz-upgrades-unsafe-allow-reachable\":\"delegatecall\",\"details\":\"Receives and executes a batch of function calls on this contract.\"},\"renounceRole(bytes32,address)\":{\"details\":\"Revokes `role` from the calling account. Roles are often managed via {grantRole} and {revokeRole}: this function's purpose is to provide a mechanism for accounts to lose their privileges if they are compromised (such as when a trusted device is misplaced). If the calling account had been revoked `role`, emits a {RoleRevoked} event. Requirements: - the caller must be `callerConfirmation`. May emit a {RoleRevoked} event.\"},\"revokeRole(bytes32,address)\":{\"details\":\"Revokes `role` from `account`. If `account` had been granted `role`, emits a {RoleRevoked} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleRevoked} event.\"},\"supportsInterface(bytes4)\":{\"details\":\"Returns true if this contract implements the interface defined by `interfaceId`. See the corresponding https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[ERC section] to learn more about how these ids are created. This function call must use less than 30 000 gas.\"},\"updateClient(bytes)\":{\"details\":\"This function verifies the public values and forwards the proof to the SP1 verifier.\",\"params\":{\"updateMsg\":\"The encoded update message e.g., an SP1 proof.\"},\"returns\":{\"_0\":\"The result of the update operation\"}},\"verifyMembership((bytes,(uint64,uint64),bytes[],bytes))\":{\"details\":\"Notice that this message is not view, as it may update the client state for caching purposes.\",\"params\":{\"msg_\":\"The membership message\"},\"returns\":{\"_0\":\"The unix timestamp of the verification height in the counterparty chain in seconds.\"}},\"verifyNonMembership((bytes,(uint64,uint64),bytes[]))\":{\"details\":\"Notice that this message is not view, as it may update the client state for caching purposes.\",\"params\":{\"msg_\":\"The membership message\"},\"returns\":{\"_0\":\"The unix timestamp of the verification height in the counterparty chain in seconds.\"}}},\"stateVariables\":{\"ALLOWED_SP1_CLOCK_DRIFT\":{\"return\":\"The allowed prover clock drift in seconds.\",\"returns\":{\"_0\":\"The allowed prover clock drift in seconds.\"}},\"MEMBERSHIP_PROGRAM_VKEY\":{\"return\":\"The verification key for the membership program.\",\"returns\":{\"_0\":\"The verification key for the membership program.\"}},\"MISBEHAVIOUR_PROGRAM_VKEY\":{\"return\":\"The verification key for the misbehaviour program.\",\"returns\":{\"_0\":\"The verification key for the misbehaviour program.\"}},\"PROOF_SUBMITTER_ROLE\":{\"details\":\"The proof submitter role is used to whitelist addresses that can submit proofsIf `address(0)` has this role, then anyone can submit proofsIf this client is hooked up to ICS26Router, the router must be given this role\",\"return\":\"The role identifier\",\"returns\":{\"_0\":\"The role identifier\"}},\"UPDATE_CLIENT_AND_MEMBERSHIP_PROGRAM_VKEY\":{\"return\":\"The verification key for the update client and membership program.\",\"returns\":{\"_0\":\"The verification key for the update client and membership program.\"}},\"UPDATE_CLIENT_PROGRAM_VKEY\":{\"return\":\"The verification key for the update client program.\",\"returns\":{\"_0\":\"The verification key for the update client program.\"}},\"VERIFIER\":{\"return\":\"The SP1 verifier contract.\",\"returns\":{\"_0\":\"The SP1 verifier contract.\"}},\"_consensusStateHashes\":{\"details\":\"Revision number need not be keyed as it is not allowed to change.\"}},\"title\":\"SP1 ICS07 Tendermint Light Client\",\"version\":1},\"userdoc\":{\"errors\":{\"CannotHandleMisbehavior()\":[{\"notice\":\"The error that is returned when the update client and membership program contains misbehavior.\"}],\"ChainIdMismatch(string,string)\":[{\"notice\":\"The error that is returned when the chain ID does not match the expected value.\"}],\"ClientStateMismatch(bytes,bytes)\":[{\"notice\":\"The error that is returned when the client state does not match the expected value.\"}],\"ConsensusStateHashMismatch(bytes32,bytes32)\":[{\"notice\":\"The error that is returned when the consensus state hash does not match the expected value.\"}],\"ConsensusStateNotFound()\":[{\"notice\":\"The error that is returned when the consensus state is not found.\"}],\"ConsensusStateRootMismatch(bytes32,bytes32)\":[{\"notice\":\"The error that is returned when the consensus state root does not match the expected value.\"}],\"EmptyValue()\":[{\"notice\":\"Returned when the membership value is empty.\"}],\"FeatureNotSupported()\":[{\"notice\":\"Returned when the feature is not supported.\"}],\"FrozenClientState()\":[{\"notice\":\"The error that is returned when the client state is frozen.\"}],\"InvalidMembershipProof()\":[{\"notice\":\"Returned when the membership proof is invalid.\"}],\"KeyValuePairNotInCache(bytes[],bytes)\":[{\"notice\":\"Returned when a key-value pair is not in the cache.\"}],\"LengthIsOutOfRange(uint256,uint256,uint256)\":[{\"notice\":\"The error that is returned when the length of a value is out of range.\"}],\"MembershipProofKeyNotFound(bytes[])\":[{\"notice\":\"The error that is returned when the key-value pair's path is not contained in the proof.\"}],\"MembershipProofValueMismatch(bytes,bytes)\":[{\"notice\":\"The error that is returned when the key-value pair's value does not match the expected value.\"}],\"ProofHeightMismatch(uint64,uint64,uint64,uint64)\":[{\"notice\":\"The error that is returned when the proof height does not match the expected value.\"}],\"ProofIsInTheFuture(uint256,uint256)\":[{\"notice\":\"The error that is returned when a proof is in the future.\"}],\"ProofIsTooOld(uint256,uint256)\":[{\"notice\":\"The error that is returned when a proof is too old.\"}],\"TrustThresholdMismatch(uint256,uint256,uint256,uint256)\":[{\"notice\":\"The error that is returned when the trust threshold does not match the expected value.\"}],\"TrustingPeriodMismatch(uint256,uint256)\":[{\"notice\":\"The error that is returned when the trusting period does not match the expected value.\"}],\"TrustingPeriodTooLong(uint256,uint256)\":[{\"notice\":\"The error that is returned when the trusting period is longer than the unbonding period.\"}],\"UnbondingPeriodMismatch(uint256,uint256)\":[{\"notice\":\"The error that is returned when the unbonding period does not match the expected value.\"}],\"UnknownMembershipProofType(uint8)\":[{\"notice\":\"The error that is returned when the membership proof type is unknown.\"}],\"UnknownZkAlgorithm(uint8)\":[{\"notice\":\"The error that is returned when the zk algorithm is unknown.\"}],\"VerificationKeyMismatch(bytes32,bytes32)\":[{\"notice\":\"The error that is returned when the verification key does not match the expected value.\"}]},\"kind\":\"user\",\"methods\":{\"ALLOWED_SP1_CLOCK_DRIFT()\":{\"notice\":\"Constant allowed prover clock drift in seconds.\"},\"MEMBERSHIP_PROGRAM_VKEY()\":{\"notice\":\"Immutable membership program verification key.\"},\"MISBEHAVIOUR_PROGRAM_VKEY()\":{\"notice\":\"Immutable misbehaviour program verification key.\"},\"PROOF_SUBMITTER_ROLE()\":{\"notice\":\"The role identifier for the proof submitter role\"},\"UPDATE_CLIENT_AND_MEMBERSHIP_PROGRAM_VKEY()\":{\"notice\":\"Immutable update client and membership program verification key.\"},\"UPDATE_CLIENT_PROGRAM_VKEY()\":{\"notice\":\"Immutable update client program verification key.\"},\"VERIFIER()\":{\"notice\":\"Immutable SP1 verifier contract address.\"},\"clientState()\":{\"notice\":\"The ICS07Tendermint client state\"},\"constructor\":{\"notice\":\"The constructor sets the program verification key and the initial client and consensus states.\"},\"getClientState()\":{\"notice\":\"Returns the client state.\"},\"getConsensusStateHash(uint64)\":{\"notice\":\"Returns the consensus state keccak256 hash at the given revision height.\"},\"misbehaviour(bytes)\":{\"notice\":\"Misbehaviour handling, moves the light client to the frozen state if misbehaviour is detected\"},\"updateClient(bytes)\":{\"notice\":\"Updating the client and consensus state\"},\"verifyMembership((bytes,(uint64,uint64),bytes[],bytes))\":{\"notice\":\"Querying the membership of a key-value pair\"},\"verifyNonMembership((bytes,(uint64,uint64),bytes[]))\":{\"notice\":\"Querying the non-membership of a key\"}},\"notice\":\"This contract implements an ICS07 IBC tendermint light client using SP1.\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/light-clients/sp1-ics07/SP1ICS07Tendermint.sol\":\"SP1ICS07Tendermint\"},\"evmVersion\":\"cancun\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"none\"},\"optimizer\":{\"enabled\":true,\"runs\":10000},\"remappings\":[\":@openzeppelin-contracts/=node_modules/@openzeppelin/contracts/\",\":@openzeppelin-upgradeable/=node_modules/@openzeppelin/contracts-upgradeable/\",\":@openzeppelin/=node_modules/@openzeppelin/\",\":@sp1-contracts/=node_modules/sp1-contracts/contracts/src/\",\":@uniswap/permit2/=node_modules/@uniswap/permit2/\",\":forge-std/=node_modules/forge-std/src/\",\":sp1-contracts/=node_modules/sp1-contracts/\"],\"viaIR\":true},\"sources\":{\"contracts/interfaces/ILightClient.sol\":{\"keccak256\":\"0x3b2361546ee834a442d844c979fbad3458ee13146b093f585587a09e19a266af\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://5b5d53101bb598f14a79cb1092479736fa18e8f84945ea6ef80f4dac84466042\",\"dweb:/ipfs/QmaTCo6M3Z9aYCSX65AQtixo1sB4ymQUDAgTXSKHqJHGDh\"]},\"contracts/light-clients/sp1-ics07/SP1ICS07Tendermint.sol\":{\"keccak256\":\"0x3e2b4354c5d91484f6a77473b5ce478de3d7156a2d267cb3799ce8f052a4ffba\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://990de6d73b4e7560a9eaa879481feda3917f47ab6af035868b1af396e67ec198\",\"dweb:/ipfs/QmZutWg3B1fofn7VzpTqXi8Qknobdr592KSxCAVKUJDJg5\"]},\"contracts/light-clients/sp1-ics07/errors/ISP1ICS07TendermintErrors.sol\":{\"keccak256\":\"0x3460656846878c1e2ce7dbfd2b4ecb4e32906cc3703b1a3401ce665cd756dcc3\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://c6d3fc12f236e9cf823a882338e1f87ca97384a5c3d5b1150eb39d35ab527d87\",\"dweb:/ipfs/QmVRrav4NbauHVShNtA5SvrrhZSUrwXX3rqDayrMiqKUWJ\"]},\"contracts/light-clients/sp1-ics07/interfaces/ISP1ICS07Tendermint.sol\":{\"keccak256\":\"0x54c633827f1a455060d941aecf4ddd629c3ed2d422c309c2eaa8b5c9536329e8\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://6c5cf4ff32cf8c7d392dc24eb4d959e487104b0539bfc1f62a3899b72ce7afe4\",\"dweb:/ipfs/QmQPXSJ6x26gXUg9Dso9bktAdG4E7wMhReupFMyGLMMaFX\"]},\"contracts/light-clients/sp1-ics07/msgs/IICS07TendermintMsgs.sol\":{\"keccak256\":\"0x8d77a9f176e2897a85a349afdc7661d48bc62fd403e8e41794578c25b611b599\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://d96574ec9152f4c26e5f9a666d1887d3db25265f46ddd10c619433aa075ff97e\",\"dweb:/ipfs/QmfWEtkZspYtRKzgB4ppkN9DwAPVqDsBZcViUJYExyprL4\"]},\"contracts/light-clients/sp1-ics07/msgs/IMembershipMsgs.sol\":{\"keccak256\":\"0x1314aa3eb8567d0f26f303e7b6341009a0bc755bf4293b9326e5e607b5eb8bf5\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://e3b01f086562ba146a54b8e1255d3ba356cd9ac47a9e31650ebca0ea7e0c21da\",\"dweb:/ipfs/Qma43UYbSA2FwYJKvY1APDZAqvEQccE7gtYtNHYMwMXj9o\"]},\"contracts/light-clients/sp1-ics07/msgs/IMisbehaviourMsgs.sol\":{\"keccak256\":\"0x0e67f4b02ca8314bea5d9cb1b86a56961871a35fab8bfa420ad6e9a534918d2b\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://ebb8a2af8276cc1b9fd23877d0cace5270e8bdb0ae38c033a373d97d1fa3bf5e\",\"dweb:/ipfs/QmYHqw3iTKKN7kw1foeP896XwB1SxE1xQD1RcpsoS2uorp\"]},\"contracts/light-clients/sp1-ics07/msgs/ISP1Msgs.sol\":{\"keccak256\":\"0xdb31e69fad51c6875c51240f10e4b9de73869e3175c86f9d21eefa68737f3511\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://b5a7128f622d096dc914232268b01fbb95e3bd988bf78f1072e5d54341be4029\",\"dweb:/ipfs/QmU4GeqmToWLeZYRsJ4g6zdA9can54n1fHSASF4uFBT7XT\"]},\"contracts/light-clients/sp1-ics07/msgs/IUcAndMembershipMsgs.sol\":{\"keccak256\":\"0x59c5842f974c4fbe8b1fd4ee672313dd1e071971499d791742485eb76d090c8d\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://eccb269297161eaf02cb5a42e9b19b87e523e438c18086f224696a699f78166b\",\"dweb:/ipfs/QmaxyatbUphRHxcnBx8CQtQB8htiHRvAPeopSMtvHutM44\"]},\"contracts/light-clients/sp1-ics07/msgs/IUpdateClientMsgs.sol\":{\"keccak256\":\"0x48b559036506205363c5363564a3e33d774f748a52323517fe9c47359169ddb9\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://c323ba40ced44e2979fd95acb9c3ff2808dcb930913dc6692fe7912266f25f57\",\"dweb:/ipfs/QmYwHJLYXs9qSc9XCBpLFR94Rg43NsACZTDdZioPFDmkGS\"]},\"contracts/light-clients/sp1-ics07/utils/Paths.sol\":{\"keccak256\":\"0xbb62ada9681458b6eb50cf57d867091d9807b2fcad86c0e7bb76131c15dc3c36\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://58a47a038a5ec37dcdc72b6b0fde15c5059325a68f0044da73ba88caa3525e24\",\"dweb:/ipfs/QmPZQxnSSrUJ9LjrKZSwXFCb7NXtUs9kB285m2B8LW7gF4\"]},\"contracts/msgs/IICS02ClientMsgs.sol\":{\"keccak256\":\"0x03d1265eae327c3744d774bf22a30d845233d50664921c9aa57cef2d71fd89d2\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://89900781cc5c60540a237d92d42745ea6165765ee8fb4d50e8137a717195cc75\",\"dweb:/ipfs/Qmbx5p8gZ8sEMMeZytXsLee49JUayhAaoJ2yxX93WUrvQo\"]},\"contracts/msgs/ILightClientMsgs.sol\":{\"keccak256\":\"0x8d1e56ab166a7b4aa6999708e3214a4645ebbc3835c2b2a4c255c9923eebafde\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://8bd4200dc04d950c0f050623fa9a8accdbec877fd446c039d4dd6c678bdf1513\",\"dweb:/ipfs/QmZQTViaA7N6BVNDzJ1Z6w799PrPoE4ajPueZSPwX4sGZ9\"]},\"node_modules/@openzeppelin/contracts/access/AccessControl.sol\":{\"keccak256\":\"0x4686ec784d75f95beaf2bf5b5f26e5f946d4c864aaee9c3c62bdc18381f5e017\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://26710ca191913f3c9df542079c4a6dcff02968e92d4f7357daefef9fbe72a19c\",\"dweb:/ipfs/QmanHbeWuBbVEqXySHa1zhm2rExjYpChDBubBaJNTCa2JB\"]},\"node_modules/@openzeppelin/contracts/access/IAccessControl.sol\":{\"keccak256\":\"0xbff9f59c84e5337689161ce7641c0ef8e872d6a7536fbc1f5133f128887aba3c\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://b308f882e796f7b79c9502deacb0a62983035c6f6f4e962b319ba6a1f4a77d3d\",\"dweb:/ipfs/QmaWCW7ahEQqFjwhSUhV7Ae7WhfNvzSpE7DQ58hvEooqPL\"]},\"node_modules/@openzeppelin/contracts/utils/Address.sol\":{\"keccak256\":\"0x0fa9e0d3a859900b5a46f70a03c73adf259603d5e05027a37fe0b45529d85346\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://c2add4da0240c9f2ce47649c8bb6b11b40e98cf6f88b8bdc76b2704e89391710\",\"dweb:/ipfs/QmNQTwF2uVzu4CRtNxr8bxyP9XuW6VsZuo2Nr4KR2bZr3d\"]},\"node_modules/@openzeppelin/contracts/utils/Context.sol\":{\"keccak256\":\"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://6a708e8a5bdb1011c2c381c9a5cfd8a9a956d7d0a9dc1bd8bcdaf52f76ef2f12\",\"dweb:/ipfs/Qmax9WHBnVsZP46ZxEMNRQpLQnrdE4dK8LehML1Py8FowF\"]},\"node_modules/@openzeppelin/contracts/utils/Errors.sol\":{\"keccak256\":\"0x6afa713bfd42cf0f7656efa91201007ac465e42049d7de1d50753a373648c123\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://ba1d02f4847670a1b83dec9f7d37f0b0418d6043447b69f3a29a5f9efc547fcf\",\"dweb:/ipfs/QmQ7iH2keLNUKgq2xSWcRmuBE5eZ3F5whYAkAGzCNNoEWB\"]},\"node_modules/@openzeppelin/contracts/utils/LowLevelCall.sol\":{\"keccak256\":\"0x6ba3db1346fc75a832aa6cd075e12f6f1fa172fa2122a020f324c319fe5be75e\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://ab92e9e1cb08144c43fa3a383a87c48f49a652d51156950b928c2a50bee6b3a5\",\"dweb:/ipfs/QmWeKkKZBgLDKgRFGKCzsKybYF7C8g9ysg5kU1b1p7QFBi\"]},\"node_modules/@openzeppelin/contracts/utils/Multicall.sol\":{\"keccak256\":\"0x72a5499dfae7676e4298a7299bccd3b27438ba1a4c72df5cd69c1c343c7ea20d\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://de0fb51ccae3a0ff377ed185d187440fc612a71bf8e42fdb0e032ce747fa3eef\",\"dweb:/ipfs/QmPNBaiVsAiUhz8qfXcSy27S7CqBbtSd8rPqmaykKBhw7Q\"]},\"node_modules/@openzeppelin/contracts/utils/TransientSlot.sol\":{\"keccak256\":\"0xac673fa1e374d9e6107504af363333e3e5f6344d2e83faf57d9bfd41d77cc946\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://5982478dbbb218e9dd5a6e83f5c0e8d1654ddf20178484b43ef21dd2246809de\",\"dweb:/ipfs/QmaB1hS68n2kG8vTbt7EPEzmrGhkUbfiFyykGGLsAr9X22\"]},\"node_modules/@openzeppelin/contracts/utils/introspection/ERC165.sol\":{\"keccak256\":\"0x2d9dc2fe26180f74c11c13663647d38e259e45f95eb88f57b61d2160b0109d3e\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://81233d1f98060113d9922180bb0f14f8335856fe9f339134b09335e9f678c377\",\"dweb:/ipfs/QmWh6R35SarhAn4z2wH8SU456jJSYL2FgucfTFgbHJJN4E\"]},\"node_modules/@openzeppelin/contracts/utils/introspection/IERC165.sol\":{\"keccak256\":\"0x8891738ffe910f0cf2da09566928589bf5d63f4524dd734fd9cedbac3274dd5c\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://971f954442df5c2ef5b5ebf1eb245d7105d9fbacc7386ee5c796df1d45b21617\",\"dweb:/ipfs/QmadRjHbkicwqwwh61raUEapaVEtaLMcYbQZWs9gUkgj3u\"]},\"node_modules/sp1-contracts/contracts/src/ISP1Verifier.sol\":{\"keccak256\":\"0x9e3ba64860bea920772dcf16be7946de2a2900d80bd51e9c0771184138f4f4d3\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://0ec7230ca1fdd74edc6ab597d80bb345282aed3f0db4788ed96b4cc373ff46a3\",\"dweb:/ipfs/QmXPuSS5gzxMhFKWr1gsxBVu6WHh53ZZEvWkGgzrkM6Y7Q\"]}},\"version\":1}","metadata":{"compiler":{"version":"0.8.28+commit.7893614a"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"bytes32","name":"updateClientProgramVkey","type":"bytes32"},{"internalType":"bytes32","name":"membershipProgramVkey","type":"bytes32"},{"internalType":"bytes32","name":"updateClientAndMembershipProgramVkey","type":"bytes32"},{"internalType":"bytes32","name":"misbehaviourProgramVkey","type":"bytes32"},{"internalType":"address","name":"sp1Verifier","type":"address"},{"internalType":"bytes","name":"_clientState","type":"bytes"},{"internalType":"bytes32","name":"_consensusState","type":"bytes32"},{"internalType":"address","name":"roleManager","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"type":"error","name":"AccessControlBadConfirmation"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bytes32","name":"neededRole","type":"bytes32"}],"type":"error","name":"AccessControlUnauthorizedAccount"},{"inputs":[{"internalType":"address","name":"target","type":"address"}],"type":"error","name":"AddressEmptyCode"},{"inputs":[],"type":"error","name":"CannotHandleMisbehavior"},{"inputs":[{"internalType":"string","name":"expected","type":"string"},{"internalType":"string","name":"actual","type":"string"}],"type":"error","name":"ChainIdMismatch"},{"inputs":[{"internalType":"bytes","name":"expected","type":"bytes"},{"internalType":"bytes","name":"actual","type":"bytes"}],"type":"error","name":"ClientStateMismatch"},{"inputs":[{"internalType":"bytes32","name":"expected","type":"bytes32"},{"internalType":"bytes32","name":"actual","type":"bytes32"}],"type":"error","name":"ConsensusStateHashMismatch"},{"inputs":[],"type":"error","name":"ConsensusStateNotFound"},{"inputs":[{"internalType":"bytes32","name":"expected","type":"bytes32"},{"internalType":"bytes32","name":"actual","type":"bytes32"}],"type":"error","name":"ConsensusStateRootMismatch"},{"inputs":[],"type":"error","name":"EmptyValue"},{"inputs":[],"type":"error","name":"FailedCall"},{"inputs":[],"type":"error","name":"FeatureNotSupported"},{"inputs":[],"type":"error","name":"FrozenClientState"},{"inputs":[],"type":"error","name":"InvalidMembershipProof"},{"inputs":[{"internalType":"bytes[]","name":"path","type":"bytes[]"},{"internalType":"bytes","name":"value","type":"bytes"}],"type":"error","name":"KeyValuePairNotInCache"},{"inputs":[{"internalType":"uint256","name":"length","type":"uint256"},{"internalType":"uint256","name":"min","type":"uint256"},{"internalType":"uint256","name":"max","type":"uint256"}],"type":"error","name":"LengthIsOutOfRange"},{"inputs":[{"internalType":"bytes[]","name":"path","type":"bytes[]"}],"type":"error","name":"MembershipProofKeyNotFound"},{"inputs":[{"internalType":"bytes","name":"expected","type":"bytes"},{"internalType":"bytes","name":"actual","type":"bytes"}],"type":"error","name":"MembershipProofValueMismatch"},{"inputs":[{"internalType":"uint64","name":"expectedRevisionNumber","type":"uint64"},{"internalType":"uint64","name":"expectedRevisionHeight","type":"uint64"},{"internalType":"uint64","name":"actualRevisionNumber","type":"uint64"},{"internalType":"uint64","name":"actualRevisionHeight","type":"uint64"}],"type":"error","name":"ProofHeightMismatch"},{"inputs":[{"internalType":"uint256","name":"now","type":"uint256"},{"internalType":"uint256","name":"proofTimestamp","type":"uint256"}],"type":"error","name":"ProofIsInTheFuture"},{"inputs":[{"internalType":"uint256","name":"now","type":"uint256"},{"internalType":"uint256","name":"proofTimestamp","type":"uint256"}],"type":"error","name":"ProofIsTooOld"},{"inputs":[{"internalType":"uint256","name":"expectedNumerator","type":"uint256"},{"internalType":"uint256","name":"expectedDenominator","type":"uint256"},{"internalType":"uint256","name":"actualNumerator","type":"uint256"},{"internalType":"uint256","name":"actualDenominator","type":"uint256"}],"type":"error","name":"TrustThresholdMismatch"},{"inputs":[{"internalType":"uint256","name":"expected","type":"uint256"},{"internalType":"uint256","name":"actual","type":"uint256"}],"type":"error","name":"TrustingPeriodMismatch"},{"inputs":[{"internalType":"uint256","name":"trustingPeriod","type":"uint256"},{"internalType":"uint256","name":"unbondingPeriod","type":"uint256"}],"type":"error","name":"TrustingPeriodTooLong"},{"inputs":[{"internalType":"uint256","name":"expected","type":"uint256"},{"internalType":"uint256","name":"actual","type":"uint256"}],"type":"error","name":"UnbondingPeriodMismatch"},{"inputs":[{"internalType":"uint8","name":"proofType","type":"uint8"}],"type":"error","name":"UnknownMembershipProofType"},{"inputs":[{"internalType":"uint8","name":"algorithm","type":"uint8"}],"type":"error","name":"UnknownZkAlgorithm"},{"inputs":[{"internalType":"bytes32","name":"expected","type":"bytes32"},{"internalType":"bytes32","name":"actual","type":"bytes32"}],"type":"error","name":"VerificationKeyMismatch"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32","indexed":true},{"internalType":"bytes32","name":"previousAdminRole","type":"bytes32","indexed":true},{"internalType":"bytes32","name":"newAdminRole","type":"bytes32","indexed":true}],"type":"event","name":"RoleAdminChanged","anonymous":false},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32","indexed":true},{"internalType":"address","name":"account","type":"address","indexed":true},{"internalType":"address","name":"sender","type":"address","indexed":true}],"type":"event","name":"RoleGranted","anonymous":false},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32","indexed":true},{"internalType":"address","name":"account","type":"address","indexed":true},{"internalType":"address","name":"sender","type":"address","indexed":true}],"type":"event","name":"RoleRevoked","anonymous":false},{"inputs":[],"stateMutability":"view","type":"function","name":"ALLOWED_SP1_CLOCK_DRIFT","outputs":[{"internalType":"uint16","name":"","type":"uint16"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"MEMBERSHIP_PROGRAM_VKEY","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"MISBEHAVIOUR_PROGRAM_VKEY","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"PROOF_SUBMITTER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"UPDATE_CLIENT_AND_MEMBERSHIP_PROGRAM_VKEY","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"UPDATE_CLIENT_PROGRAM_VKEY","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"VERIFIER","outputs":[{"internalType":"contract ISP1Verifier","name":"","type":"address"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"clientState","outputs":[{"internalType":"string","name":"chainId","type":"string"},{"internalType":"struct IICS07TendermintMsgs.TrustThreshold","name":"trustLevel","type":"tuple","components":[{"internalType":"uint8","name":"numerator","type":"uint8"},{"internalType":"uint8","name":"denominator","type":"uint8"}]},{"internalType":"struct IICS02ClientMsgs.Height","name":"latestHeight","type":"tuple","components":[{"internalType":"uint64","name":"revisionNumber","type":"uint64"},{"internalType":"uint64","name":"revisionHeight","type":"uint64"}]},{"internalType":"uint32","name":"trustingPeriod","type":"uint32"},{"internalType":"uint32","name":"unbondingPeriod","type":"uint32"},{"internalType":"bool","name":"isFrozen","type":"bool"},{"internalType":"enum IICS07TendermintMsgs.SupportedZkAlgorithm","name":"zkAlgorithm","type":"uint8"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"getClientState","outputs":[{"internalType":"bytes","name":"","type":"bytes"}]},{"inputs":[{"internalType":"uint64","name":"revisionHeight","type":"uint64"}],"stateMutability":"view","type":"function","name":"getConsensusStateHash","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}]},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"stateMutability":"view","type":"function","name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}]},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"stateMutability":"nonpayable","type":"function","name":"grantRole"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"stateMutability":"view","type":"function","name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}]},{"inputs":[{"internalType":"bytes","name":"misbehaviourMsg","type":"bytes"}],"stateMutability":"nonpayable","type":"function","name":"misbehaviour"},{"inputs":[{"internalType":"bytes[]","name":"data","type":"bytes[]"}],"stateMutability":"nonpayable","type":"function","name":"multicall","outputs":[{"internalType":"bytes[]","name":"results","type":"bytes[]"}]},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"callerConfirmation","type":"address"}],"stateMutability":"nonpayable","type":"function","name":"renounceRole"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"stateMutability":"nonpayable","type":"function","name":"revokeRole"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"stateMutability":"view","type":"function","name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}]},{"inputs":[{"internalType":"bytes","name":"updateMsg","type":"bytes"}],"stateMutability":"nonpayable","type":"function","name":"updateClient","outputs":[{"internalType":"enum ILightClientMsgs.UpdateResult","name":"","type":"uint8"}]},{"inputs":[{"internalType":"struct ILightClientMsgs.MsgVerifyMembership","name":"msg_","type":"tuple","components":[{"internalType":"bytes","name":"proof","type":"bytes"},{"internalType":"struct IICS02ClientMsgs.Height","name":"proofHeight","type":"tuple","components":[{"internalType":"uint64","name":"revisionNumber","type":"uint64"},{"internalType":"uint64","name":"revisionHeight","type":"uint64"}]},{"internalType":"bytes[]","name":"path","type":"bytes[]"},{"internalType":"bytes","name":"value","type":"bytes"}]}],"stateMutability":"nonpayable","type":"function","name":"verifyMembership","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[{"internalType":"struct ILightClientMsgs.MsgVerifyNonMembership","name":"msg_","type":"tuple","components":[{"internalType":"bytes","name":"proof","type":"bytes"},{"internalType":"struct IICS02ClientMsgs.Height","name":"proofHeight","type":"tuple","components":[{"internalType":"uint64","name":"revisionNumber","type":"uint64"},{"internalType":"uint64","name":"revisionHeight","type":"uint64"}]},{"internalType":"bytes[]","name":"path","type":"bytes[]"}]}],"stateMutability":"nonpayable","type":"function","name":"verifyNonMembership","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]}],"devdoc":{"kind":"dev","methods":{"constructor":{"params":{"_clientState":"The encoded initial client state.","_consensusState":"The encoded initial consensus state.","membershipProgramVkey":"The verification key for the verify (non)membership program.","misbehaviourProgramVkey":"The verification key for the misbehaviour program.","roleManager":"Manages the proof submitters and can submit proofs. Should be the ICS26Router if used in IBC.","sp1Verifier":"The address of the SP1 verifier contract.","updateClientAndMembershipProgramVkey":"The verification key for the update client and membership program.","updateClientProgramVkey":"The verification key for the update client program."}},"getClientState()":{"returns":{"_0":"The client state."}},"getConsensusStateHash(uint64)":{"params":{"revisionHeight":"The revision height."},"returns":{"_0":"The consensus state at the given revision height."}},"getRoleAdmin(bytes32)":{"details":"Returns the admin role that controls `role`. See {grantRole} and {revokeRole}. To change a role's admin, use {_setRoleAdmin}."},"grantRole(bytes32,address)":{"details":"Grants `role` to `account`. If `account` had not been already granted `role`, emits a {RoleGranted} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleGranted} event."},"hasRole(bytes32,address)":{"details":"Returns `true` if `account` has been granted `role`."},"misbehaviour(bytes)":{"details":"The misbehavior is verfied in the sp1 program. Here we only check the public values which contain the trusted headers.","params":{"misbehaviourMsg":"The misbehaviour message"}},"multicall(bytes[])":{"custom:oz-upgrades-unsafe-allow-reachable":"delegatecall","details":"Receives and executes a batch of function calls on this contract."},"renounceRole(bytes32,address)":{"details":"Revokes `role` from the calling account. Roles are often managed via {grantRole} and {revokeRole}: this function's purpose is to provide a mechanism for accounts to lose their privileges if they are compromised (such as when a trusted device is misplaced). If the calling account had been revoked `role`, emits a {RoleRevoked} event. Requirements: - the caller must be `callerConfirmation`. May emit a {RoleRevoked} event."},"revokeRole(bytes32,address)":{"details":"Revokes `role` from `account`. If `account` had been granted `role`, emits a {RoleRevoked} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleRevoked} event."},"supportsInterface(bytes4)":{"details":"Returns true if this contract implements the interface defined by `interfaceId`. See the corresponding https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[ERC section] to learn more about how these ids are created. This function call must use less than 30 000 gas."},"updateClient(bytes)":{"details":"This function verifies the public values and forwards the proof to the SP1 verifier.","params":{"updateMsg":"The encoded update message e.g., an SP1 proof."},"returns":{"_0":"The result of the update operation"}},"verifyMembership((bytes,(uint64,uint64),bytes[],bytes))":{"details":"Notice that this message is not view, as it may update the client state for caching purposes.","params":{"msg_":"The membership message"},"returns":{"_0":"The unix timestamp of the verification height in the counterparty chain in seconds."}},"verifyNonMembership((bytes,(uint64,uint64),bytes[]))":{"details":"Notice that this message is not view, as it may update the client state for caching purposes.","params":{"msg_":"The membership message"},"returns":{"_0":"The unix timestamp of the verification height in the counterparty chain in seconds."}}},"version":1},"userdoc":{"kind":"user","methods":{"ALLOWED_SP1_CLOCK_DRIFT()":{"notice":"Constant allowed prover clock drift in seconds."},"MEMBERSHIP_PROGRAM_VKEY()":{"notice":"Immutable membership program verification key."},"MISBEHAVIOUR_PROGRAM_VKEY()":{"notice":"Immutable misbehaviour program verification key."},"PROOF_SUBMITTER_ROLE()":{"notice":"The role identifier for the proof submitter role"},"UPDATE_CLIENT_AND_MEMBERSHIP_PROGRAM_VKEY()":{"notice":"Immutable update client and membership program verification key."},"UPDATE_CLIENT_PROGRAM_VKEY()":{"notice":"Immutable update client program verification key."},"VERIFIER()":{"notice":"Immutable SP1 verifier contract address."},"clientState()":{"notice":"The ICS07Tendermint client state"},"constructor":{"notice":"The constructor sets the program verification key and the initial client and consensus states."},"getClientState()":{"notice":"Returns the client state."},"getConsensusStateHash(uint64)":{"notice":"Returns the consensus state keccak256 hash at the given revision height."},"misbehaviour(bytes)":{"notice":"Misbehaviour handling, moves the light client to the frozen state if misbehaviour is detected"},"updateClient(bytes)":{"notice":"Updating the client and consensus state"},"verifyMembership((bytes,(uint64,uint64),bytes[],bytes))":{"notice":"Querying the membership of a key-value pair"},"verifyNonMembership((bytes,(uint64,uint64),bytes[]))":{"notice":"Querying the non-membership of a key"}},"version":1}},"settings":{"remappings":["@openzeppelin-contracts/=node_modules/@openzeppelin/contracts/","@openzeppelin-upgradeable/=node_modules/@openzeppelin/contracts-upgradeable/","@openzeppelin/=node_modules/@openzeppelin/","@sp1-contracts/=node_modules/sp1-contracts/contracts/src/","@uniswap/permit2/=node_modules/@uniswap/permit2/","forge-std/=node_modules/forge-std/src/","sp1-contracts/=node_modules/sp1-contracts/"],"optimizer":{"enabled":true,"runs":10000},"metadata":{"bytecodeHash":"none"},"compilationTarget":{"contracts/light-clients/sp1-ics07/SP1ICS07Tendermint.sol":"SP1ICS07Tendermint"},"evmVersion":"cancun","libraries":{},"viaIR":true},"sources":{"contracts/interfaces/ILightClient.sol":{"keccak256":"0x3b2361546ee834a442d844c979fbad3458ee13146b093f585587a09e19a266af","urls":["bzz-raw://5b5d53101bb598f14a79cb1092479736fa18e8f84945ea6ef80f4dac84466042","dweb:/ipfs/QmaTCo6M3Z9aYCSX65AQtixo1sB4ymQUDAgTXSKHqJHGDh"],"license":"Apache-2.0"},"contracts/light-clients/sp1-ics07/SP1ICS07Tendermint.sol":{"keccak256":"0x3e2b4354c5d91484f6a77473b5ce478de3d7156a2d267cb3799ce8f052a4ffba","urls":["bzz-raw://990de6d73b4e7560a9eaa879481feda3917f47ab6af035868b1af396e67ec198","dweb:/ipfs/QmZutWg3B1fofn7VzpTqXi8Qknobdr592KSxCAVKUJDJg5"],"license":"Apache-2.0"},"contracts/light-clients/sp1-ics07/errors/ISP1ICS07TendermintErrors.sol":{"keccak256":"0x3460656846878c1e2ce7dbfd2b4ecb4e32906cc3703b1a3401ce665cd756dcc3","urls":["bzz-raw://c6d3fc12f236e9cf823a882338e1f87ca97384a5c3d5b1150eb39d35ab527d87","dweb:/ipfs/QmVRrav4NbauHVShNtA5SvrrhZSUrwXX3rqDayrMiqKUWJ"],"license":"Apache-2.0"},"contracts/light-clients/sp1-ics07/interfaces/ISP1ICS07Tendermint.sol":{"keccak256":"0x54c633827f1a455060d941aecf4ddd629c3ed2d422c309c2eaa8b5c9536329e8","urls":["bzz-raw://6c5cf4ff32cf8c7d392dc24eb4d959e487104b0539bfc1f62a3899b72ce7afe4","dweb:/ipfs/QmQPXSJ6x26gXUg9Dso9bktAdG4E7wMhReupFMyGLMMaFX"],"license":"Apache-2.0"},"contracts/light-clients/sp1-ics07/msgs/IICS07TendermintMsgs.sol":{"keccak256":"0x8d77a9f176e2897a85a349afdc7661d48bc62fd403e8e41794578c25b611b599","urls":["bzz-raw://d96574ec9152f4c26e5f9a666d1887d3db25265f46ddd10c619433aa075ff97e","dweb:/ipfs/QmfWEtkZspYtRKzgB4ppkN9DwAPVqDsBZcViUJYExyprL4"],"license":"Apache-2.0"},"contracts/light-clients/sp1-ics07/msgs/IMembershipMsgs.sol":{"keccak256":"0x1314aa3eb8567d0f26f303e7b6341009a0bc755bf4293b9326e5e607b5eb8bf5","urls":["bzz-raw://e3b01f086562ba146a54b8e1255d3ba356cd9ac47a9e31650ebca0ea7e0c21da","dweb:/ipfs/Qma43UYbSA2FwYJKvY1APDZAqvEQccE7gtYtNHYMwMXj9o"],"license":"Apache-2.0"},"contracts/light-clients/sp1-ics07/msgs/IMisbehaviourMsgs.sol":{"keccak256":"0x0e67f4b02ca8314bea5d9cb1b86a56961871a35fab8bfa420ad6e9a534918d2b","urls":["bzz-raw://ebb8a2af8276cc1b9fd23877d0cace5270e8bdb0ae38c033a373d97d1fa3bf5e","dweb:/ipfs/QmYHqw3iTKKN7kw1foeP896XwB1SxE1xQD1RcpsoS2uorp"],"license":"Apache-2.0"},"contracts/light-clients/sp1-ics07/msgs/ISP1Msgs.sol":{"keccak256":"0xdb31e69fad51c6875c51240f10e4b9de73869e3175c86f9d21eefa68737f3511","urls":["bzz-raw://b5a7128f622d096dc914232268b01fbb95e3bd988bf78f1072e5d54341be4029","dweb:/ipfs/QmU4GeqmToWLeZYRsJ4g6zdA9can54n1fHSASF4uFBT7XT"],"license":"Apache-2.0"},"contracts/light-clients/sp1-ics07/msgs/IUcAndMembershipMsgs.sol":{"keccak256":"0x59c5842f974c4fbe8b1fd4ee672313dd1e071971499d791742485eb76d090c8d","urls":["bzz-raw://eccb269297161eaf02cb5a42e9b19b87e523e438c18086f224696a699f78166b","dweb:/ipfs/QmaxyatbUphRHxcnBx8CQtQB8htiHRvAPeopSMtvHutM44"],"license":"Apache-2.0"},"contracts/light-clients/sp1-ics07/msgs/IUpdateClientMsgs.sol":{"keccak256":"0x48b559036506205363c5363564a3e33d774f748a52323517fe9c47359169ddb9","urls":["bzz-raw://c323ba40ced44e2979fd95acb9c3ff2808dcb930913dc6692fe7912266f25f57","dweb:/ipfs/QmYwHJLYXs9qSc9XCBpLFR94Rg43NsACZTDdZioPFDmkGS"],"license":"Apache-2.0"},"contracts/light-clients/sp1-ics07/utils/Paths.sol":{"keccak256":"0xbb62ada9681458b6eb50cf57d867091d9807b2fcad86c0e7bb76131c15dc3c36","urls":["bzz-raw://58a47a038a5ec37dcdc72b6b0fde15c5059325a68f0044da73ba88caa3525e24","dweb:/ipfs/QmPZQxnSSrUJ9LjrKZSwXFCb7NXtUs9kB285m2B8LW7gF4"],"license":"Apache-2.0"},"contracts/msgs/IICS02ClientMsgs.sol":{"keccak256":"0x03d1265eae327c3744d774bf22a30d845233d50664921c9aa57cef2d71fd89d2","urls":["bzz-raw://89900781cc5c60540a237d92d42745ea6165765ee8fb4d50e8137a717195cc75","dweb:/ipfs/Qmbx5p8gZ8sEMMeZytXsLee49JUayhAaoJ2yxX93WUrvQo"],"license":"Apache-2.0"},"contracts/msgs/ILightClientMsgs.sol":{"keccak256":"0x8d1e56ab166a7b4aa6999708e3214a4645ebbc3835c2b2a4c255c9923eebafde","urls":["bzz-raw://8bd4200dc04d950c0f050623fa9a8accdbec877fd446c039d4dd6c678bdf1513","dweb:/ipfs/QmZQTViaA7N6BVNDzJ1Z6w799PrPoE4ajPueZSPwX4sGZ9"],"license":"Apache-2.0"},"node_modules/@openzeppelin/contracts/access/AccessControl.sol":{"keccak256":"0x4686ec784d75f95beaf2bf5b5f26e5f946d4c864aaee9c3c62bdc18381f5e017","urls":["bzz-raw://26710ca191913f3c9df542079c4a6dcff02968e92d4f7357daefef9fbe72a19c","dweb:/ipfs/QmanHbeWuBbVEqXySHa1zhm2rExjYpChDBubBaJNTCa2JB"],"license":"MIT"},"node_modules/@openzeppelin/contracts/access/IAccessControl.sol":{"keccak256":"0xbff9f59c84e5337689161ce7641c0ef8e872d6a7536fbc1f5133f128887aba3c","urls":["bzz-raw://b308f882e796f7b79c9502deacb0a62983035c6f6f4e962b319ba6a1f4a77d3d","dweb:/ipfs/QmaWCW7ahEQqFjwhSUhV7Ae7WhfNvzSpE7DQ58hvEooqPL"],"license":"MIT"},"node_modules/@openzeppelin/contracts/utils/Address.sol":{"keccak256":"0x0fa9e0d3a859900b5a46f70a03c73adf259603d5e05027a37fe0b45529d85346","urls":["bzz-raw://c2add4da0240c9f2ce47649c8bb6b11b40e98cf6f88b8bdc76b2704e89391710","dweb:/ipfs/QmNQTwF2uVzu4CRtNxr8bxyP9XuW6VsZuo2Nr4KR2bZr3d"],"license":"MIT"},"node_modules/@openzeppelin/contracts/utils/Context.sol":{"keccak256":"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2","urls":["bzz-raw://6a708e8a5bdb1011c2c381c9a5cfd8a9a956d7d0a9dc1bd8bcdaf52f76ef2f12","dweb:/ipfs/Qmax9WHBnVsZP46ZxEMNRQpLQnrdE4dK8LehML1Py8FowF"],"license":"MIT"},"node_modules/@openzeppelin/contracts/utils/Errors.sol":{"keccak256":"0x6afa713bfd42cf0f7656efa91201007ac465e42049d7de1d50753a373648c123","urls":["bzz-raw://ba1d02f4847670a1b83dec9f7d37f0b0418d6043447b69f3a29a5f9efc547fcf","dweb:/ipfs/QmQ7iH2keLNUKgq2xSWcRmuBE5eZ3F5whYAkAGzCNNoEWB"],"license":"MIT"},"node_modules/@openzeppelin/contracts/utils/LowLevelCall.sol":{"keccak256":"0x6ba3db1346fc75a832aa6cd075e12f6f1fa172fa2122a020f324c319fe5be75e","urls":["bzz-raw://ab92e9e1cb08144c43fa3a383a87c48f49a652d51156950b928c2a50bee6b3a5","dweb:/ipfs/QmWeKkKZBgLDKgRFGKCzsKybYF7C8g9ysg5kU1b1p7QFBi"],"license":"MIT"},"node_modules/@openzeppelin/contracts/utils/Multicall.sol":{"keccak256":"0x72a5499dfae7676e4298a7299bccd3b27438ba1a4c72df5cd69c1c343c7ea20d","urls":["bzz-raw://de0fb51ccae3a0ff377ed185d187440fc612a71bf8e42fdb0e032ce747fa3eef","dweb:/ipfs/QmPNBaiVsAiUhz8qfXcSy27S7CqBbtSd8rPqmaykKBhw7Q"],"license":"MIT"},"node_modules/@openzeppelin/contracts/utils/TransientSlot.sol":{"keccak256":"0xac673fa1e374d9e6107504af363333e3e5f6344d2e83faf57d9bfd41d77cc946","urls":["bzz-raw://5982478dbbb218e9dd5a6e83f5c0e8d1654ddf20178484b43ef21dd2246809de","dweb:/ipfs/QmaB1hS68n2kG8vTbt7EPEzmrGhkUbfiFyykGGLsAr9X22"],"license":"MIT"},"node_modules/@openzeppelin/contracts/utils/introspection/ERC165.sol":{"keccak256":"0x2d9dc2fe26180f74c11c13663647d38e259e45f95eb88f57b61d2160b0109d3e","urls":["bzz-raw://81233d1f98060113d9922180bb0f14f8335856fe9f339134b09335e9f678c377","dweb:/ipfs/QmWh6R35SarhAn4z2wH8SU456jJSYL2FgucfTFgbHJJN4E"],"license":"MIT"},"node_modules/@openzeppelin/contracts/utils/introspection/IERC165.sol":{"keccak256":"0x8891738ffe910f0cf2da09566928589bf5d63f4524dd734fd9cedbac3274dd5c","urls":["bzz-raw://971f954442df5c2ef5b5ebf1eb245d7105d9fbacc7386ee5c796df1d45b21617","dweb:/ipfs/QmadRjHbkicwqwwh61raUEapaVEtaLMcYbQZWs9gUkgj3u"],"license":"MIT"},"node_modules/sp1-contracts/contracts/src/ISP1Verifier.sol":{"keccak256":"0x9e3ba64860bea920772dcf16be7946de2a2900d80bd51e9c0771184138f4f4d3","urls":["bzz-raw://0ec7230ca1fdd74edc6ab597d80bb345282aed3f0db4788ed96b4cc373ff46a3","dweb:/ipfs/QmXPuSS5gzxMhFKWr1gsxBVu6WHh53ZZEvWkGgzrkM6Y7Q"],"license":"MIT"}},"version":1},"id":46} \ No newline at end of file +{"abi":[{"type":"constructor","inputs":[{"name":"updateClientProgramVkey","type":"bytes32","internalType":"bytes32"},{"name":"membershipProgramVkey","type":"bytes32","internalType":"bytes32"},{"name":"updateClientAndMembershipProgramVkey","type":"bytes32","internalType":"bytes32"},{"name":"misbehaviourProgramVkey","type":"bytes32","internalType":"bytes32"},{"name":"sp1Verifier","type":"address","internalType":"address"},{"name":"_clientState","type":"bytes","internalType":"bytes"},{"name":"_consensusState","type":"bytes32","internalType":"bytes32"},{"name":"roleManager","type":"address","internalType":"address"}],"stateMutability":"nonpayable"},{"type":"function","name":"ALLOWED_SP1_CLOCK_DRIFT","inputs":[],"outputs":[{"name":"","type":"uint16","internalType":"uint16"}],"stateMutability":"view"},{"type":"function","name":"DEFAULT_ADMIN_ROLE","inputs":[],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"type":"function","name":"MEMBERSHIP_PROGRAM_VKEY","inputs":[],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"type":"function","name":"MISBEHAVIOUR_PROGRAM_VKEY","inputs":[],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"type":"function","name":"PROOF_SUBMITTER_ROLE","inputs":[],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"type":"function","name":"UPDATE_CLIENT_AND_MEMBERSHIP_PROGRAM_VKEY","inputs":[],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"type":"function","name":"UPDATE_CLIENT_PROGRAM_VKEY","inputs":[],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"type":"function","name":"VERIFIER","inputs":[],"outputs":[{"name":"","type":"address","internalType":"contract ISP1Verifier"}],"stateMutability":"view"},{"type":"function","name":"clientState","inputs":[],"outputs":[{"name":"chainId","type":"string","internalType":"string"},{"name":"trustLevel","type":"tuple","internalType":"struct IICS07TendermintMsgs.TrustThreshold","components":[{"name":"numerator","type":"uint8","internalType":"uint8"},{"name":"denominator","type":"uint8","internalType":"uint8"}]},{"name":"latestHeight","type":"tuple","internalType":"struct IICS02ClientMsgs.Height","components":[{"name":"revisionNumber","type":"uint64","internalType":"uint64"},{"name":"revisionHeight","type":"uint64","internalType":"uint64"}]},{"name":"trustingPeriod","type":"uint32","internalType":"uint32"},{"name":"unbondingPeriod","type":"uint32","internalType":"uint32"},{"name":"isFrozen","type":"bool","internalType":"bool"},{"name":"zkAlgorithm","type":"uint8","internalType":"enum IICS07TendermintMsgs.SupportedZkAlgorithm"}],"stateMutability":"view"},{"type":"function","name":"getClientState","inputs":[],"outputs":[{"name":"","type":"bytes","internalType":"bytes"}],"stateMutability":"view"},{"type":"function","name":"getConsensusStateHash","inputs":[{"name":"revisionHeight","type":"uint64","internalType":"uint64"}],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"type":"function","name":"getRoleAdmin","inputs":[{"name":"role","type":"bytes32","internalType":"bytes32"}],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"type":"function","name":"grantRole","inputs":[{"name":"role","type":"bytes32","internalType":"bytes32"},{"name":"account","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"hasRole","inputs":[{"name":"role","type":"bytes32","internalType":"bytes32"},{"name":"account","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"misbehaviour","inputs":[{"name":"misbehaviourMsg","type":"bytes","internalType":"bytes"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"multicall","inputs":[{"name":"data","type":"bytes[]","internalType":"bytes[]"}],"outputs":[{"name":"results","type":"bytes[]","internalType":"bytes[]"}],"stateMutability":"nonpayable"},{"type":"function","name":"renounceRole","inputs":[{"name":"role","type":"bytes32","internalType":"bytes32"},{"name":"callerConfirmation","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"revokeRole","inputs":[{"name":"role","type":"bytes32","internalType":"bytes32"},{"name":"account","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"supportsInterface","inputs":[{"name":"interfaceId","type":"bytes4","internalType":"bytes4"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"updateClient","inputs":[{"name":"updateMsg","type":"bytes","internalType":"bytes"}],"outputs":[{"name":"","type":"uint8","internalType":"enum ILightClientMsgs.UpdateResult"}],"stateMutability":"nonpayable"},{"type":"function","name":"verifyMembership","inputs":[{"name":"msg_","type":"tuple","internalType":"struct ILightClientMsgs.MsgVerifyMembership","components":[{"name":"proof","type":"bytes","internalType":"bytes"},{"name":"proofHeight","type":"tuple","internalType":"struct IICS02ClientMsgs.Height","components":[{"name":"revisionNumber","type":"uint64","internalType":"uint64"},{"name":"revisionHeight","type":"uint64","internalType":"uint64"}]},{"name":"path","type":"bytes[]","internalType":"bytes[]"},{"name":"value","type":"bytes","internalType":"bytes"}]}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"nonpayable"},{"type":"function","name":"verifyNonMembership","inputs":[{"name":"msg_","type":"tuple","internalType":"struct ILightClientMsgs.MsgVerifyNonMembership","components":[{"name":"proof","type":"bytes","internalType":"bytes"},{"name":"proofHeight","type":"tuple","internalType":"struct IICS02ClientMsgs.Height","components":[{"name":"revisionNumber","type":"uint64","internalType":"uint64"},{"name":"revisionHeight","type":"uint64","internalType":"uint64"}]},{"name":"path","type":"bytes[]","internalType":"bytes[]"}]}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"nonpayable"},{"type":"event","name":"RoleAdminChanged","inputs":[{"name":"role","type":"bytes32","indexed":true,"internalType":"bytes32"},{"name":"previousAdminRole","type":"bytes32","indexed":true,"internalType":"bytes32"},{"name":"newAdminRole","type":"bytes32","indexed":true,"internalType":"bytes32"}],"anonymous":false},{"type":"event","name":"RoleGranted","inputs":[{"name":"role","type":"bytes32","indexed":true,"internalType":"bytes32"},{"name":"account","type":"address","indexed":true,"internalType":"address"},{"name":"sender","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"type":"event","name":"RoleRevoked","inputs":[{"name":"role","type":"bytes32","indexed":true,"internalType":"bytes32"},{"name":"account","type":"address","indexed":true,"internalType":"address"},{"name":"sender","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"type":"error","name":"AccessControlBadConfirmation","inputs":[]},{"type":"error","name":"AccessControlUnauthorizedAccount","inputs":[{"name":"account","type":"address","internalType":"address"},{"name":"neededRole","type":"bytes32","internalType":"bytes32"}]},{"type":"error","name":"AddressEmptyCode","inputs":[{"name":"target","type":"address","internalType":"address"}]},{"type":"error","name":"CannotHandleMisbehavior","inputs":[]},{"type":"error","name":"ChainIdMismatch","inputs":[{"name":"expected","type":"string","internalType":"string"},{"name":"actual","type":"string","internalType":"string"}]},{"type":"error","name":"ClientStateMismatch","inputs":[{"name":"expected","type":"bytes","internalType":"bytes"},{"name":"actual","type":"bytes","internalType":"bytes"}]},{"type":"error","name":"ConsensusStateHashMismatch","inputs":[{"name":"expected","type":"bytes32","internalType":"bytes32"},{"name":"actual","type":"bytes32","internalType":"bytes32"}]},{"type":"error","name":"ConsensusStateNotFound","inputs":[]},{"type":"error","name":"ConsensusStateRootMismatch","inputs":[{"name":"expected","type":"bytes32","internalType":"bytes32"},{"name":"actual","type":"bytes32","internalType":"bytes32"}]},{"type":"error","name":"EmptyValue","inputs":[]},{"type":"error","name":"FailedCall","inputs":[]},{"type":"error","name":"FeatureNotSupported","inputs":[]},{"type":"error","name":"FrozenClientState","inputs":[]},{"type":"error","name":"InvalidMembershipProof","inputs":[]},{"type":"error","name":"KeyValuePairNotInCache","inputs":[{"name":"path","type":"bytes[]","internalType":"bytes[]"},{"name":"value","type":"bytes","internalType":"bytes"}]},{"type":"error","name":"LengthIsOutOfRange","inputs":[{"name":"length","type":"uint256","internalType":"uint256"},{"name":"min","type":"uint256","internalType":"uint256"},{"name":"max","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"MembershipProofKeyNotFound","inputs":[{"name":"path","type":"bytes[]","internalType":"bytes[]"}]},{"type":"error","name":"MembershipProofValueMismatch","inputs":[{"name":"expected","type":"bytes","internalType":"bytes"},{"name":"actual","type":"bytes","internalType":"bytes"}]},{"type":"error","name":"ProofHeightMismatch","inputs":[{"name":"expectedRevisionNumber","type":"uint64","internalType":"uint64"},{"name":"expectedRevisionHeight","type":"uint64","internalType":"uint64"},{"name":"actualRevisionNumber","type":"uint64","internalType":"uint64"},{"name":"actualRevisionHeight","type":"uint64","internalType":"uint64"}]},{"type":"error","name":"ProofIsInTheFuture","inputs":[{"name":"now","type":"uint256","internalType":"uint256"},{"name":"proofTimestamp","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"ProofIsTooOld","inputs":[{"name":"now","type":"uint256","internalType":"uint256"},{"name":"proofTimestamp","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"TrustThresholdMismatch","inputs":[{"name":"expectedNumerator","type":"uint256","internalType":"uint256"},{"name":"expectedDenominator","type":"uint256","internalType":"uint256"},{"name":"actualNumerator","type":"uint256","internalType":"uint256"},{"name":"actualDenominator","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"TrustingPeriodMismatch","inputs":[{"name":"expected","type":"uint256","internalType":"uint256"},{"name":"actual","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"TrustingPeriodTooLong","inputs":[{"name":"trustingPeriod","type":"uint256","internalType":"uint256"},{"name":"unbondingPeriod","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"UnbondingPeriodMismatch","inputs":[{"name":"expected","type":"uint256","internalType":"uint256"},{"name":"actual","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"UnknownMembershipProofType","inputs":[{"name":"proofType","type":"uint8","internalType":"uint8"}]},{"type":"error","name":"UnknownZkAlgorithm","inputs":[{"name":"algorithm","type":"uint8","internalType":"uint8"}]},{"type":"error","name":"VerificationKeyMismatch","inputs":[{"name":"expected","type":"bytes32","internalType":"bytes32"},{"name":"actual","type":"bytes32","internalType":"bytes32"}]}],"bytecode":{"object":"0x61012060405234610541576137268038038061001a81610564565b928339810161010082820312610541578151916020810151604082015160608301519061004960808501610589565b60a08501519095906001600160401b0381116105415785019080601f8301121561054157815161007b9260200161059d565b9261008d60e060c08701519601610589565b9660805260a05260c05260e05280518101906020820190602081840312610541576020810151906001600160401b038211610541570191829003601f1981019061012013610541576040519160e083016001600160401b0381118482101761052d5760405260208401516001600160401b038111610541576020908501019080601f830112156105415781516101259260200161059d565b825260408112610541576040610139610545565b916101458286016105dd565b8352610153606086016105dd565b602084015260208401928352603f19011261054157610170610545565b61017c608085016105eb565b815261018a60a085016105eb565b6020820152604083019081526101a260c085016105ff565b90606084019182526101b660e086016105ff565b92608085019384526101008601519586151587036105415760a0860196875261012001519460028610156105415760c08101958652518051906001600160401b03821161052d57600154600181811c91168015610523575b602082101461050f57601f81116104ac575b50602090601f831160011461043f5763ffffffff95949392915f9183610434575b50508160011b915f199060031b1c1916176001555b5160ff81511661ff00602060025493015160081b169161ffff191617176002555160018060401b0381511660035491602068010000000000000000600160801b0391015160401b169160018060801b031916171760035551169267ffffffff00000000600454925160201b169051151560401b92519160028310156104205769ff00000000000000000068ff00000000000000009360481b169469ff000000000000000000199160018060481b0319161716179116171760045560018060401b0360035460401c165f52600560205260405f205560018060a01b03166101005260045463ffffffff8116610708810163ffffffff811161040c5763ffffffff809360201c1692839116116103f757826001600160a01b0381166103de575061037c610706565b505b604051612efd908161078982396080518181816105570152611445015260a0518181816101f90152611e01015260c051818181610cb30152612185015260e0518181816102a00152610ac1015261010051818181610c780152611a1a0152f35b806103eb6103f192610610565b50610686565b5061037e565b6333fae18560e21b5f5260045260245260445ffd5b634e487b7160e01b5f52601160045260245ffd5b634e487b7160e01b5f52602160045260245ffd5b015190505f80610241565b90601f1983169160015f52815f20925f5b818110610494575091600193918563ffffffff99989796941061047c575b505050811b01600155610256565b01515f1960f88460031b161c191690555f808061046e565b92936020600181928786015181550195019301610450565b60015f527fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf6601f840160051c81019160208510610505575b601f0160051c01905b8181106104fa5750610220565b5f81556001016104ed565b90915081906104e4565b634e487b7160e01b5f52602260045260245ffd5b90607f169061020e565b634e487b7160e01b5f52604160045260245ffd5b5f80fd5b60408051919082016001600160401b0381118382101761052d57604052565b6040519190601f01601f191682016001600160401b0381118382101761052d57604052565b51906001600160a01b038216820361054157565b9192916001600160401b03821161052d576105c1601f8301601f1916602001610564565b938285528282011161054157815f926020928387015e84010152565b519060ff8216820361054157565b51906001600160401b038216820361054157565b519063ffffffff8216820361054157565b6001600160a01b0381165f9081525f5160206137065f395f51905f52602052604090205460ff16610681576001600160a01b03165f8181525f5160206137065f395f51905f5260205260408120805460ff191660011790553391905f5160206136865f395f51905f528180a4600190565b505f90565b6001600160a01b0381165f9081525f5160206136a65f395f51905f52602052604090205460ff16610681576001600160a01b03165f8181525f5160206136a65f395f51905f5260205260408120805460ff191660011790553391905f5160206136e65f395f51905f52905f5160206136865f395f51905f529080a4600190565b5f80525f5160206136a65f395f51905f526020525f5160206136c65f395f51905f525460ff16610784575f8080525f5160206136a65f395f51905f526020525f5160206136c65f395f51905f52805460ff1916600117905533905f5160206136e65f395f51905f525f5160206136865f395f51905f528280a4600190565b5f9056fe6080806040526004361015610012575f80fd5b5f3560e01c90816301ffc9a714610cd6575080630225293e14610c9c57806308c84e7014610c4c5780630bece35614610b8957806323842fb814610b59578063248a9ca314610b2f5780632c3ee47414610b135780632f2ff15d14610ae4578063314d4dff14610aaa57806336568abe14610a4e5780634d6d9ffb1461096c5780635972185a14610932578063682ed5f01461080e57806391d14854146107c5578063a217fddf146107ab578063ac9650d81461066a578063bd3ce6b01461057a578063ca7242f914610540578063d547741f1461050a578063ddba65371461021c578063e45a6d0d146101e25763ef913a4b1461010e575f80fd5b346101de575f6003193601126101de576101da60405160208082015261012060408201526101c6816101436101608201610ec6565b60ff600254818116606085015260081c16608083015267ffffffffffffffff60035481811660a085015260401c1660c083015260ff60045463ffffffff811660e085015263ffffffff8160201c16610100850152818160401c16151561012085015260481c166101b28161105f565b61014083015203601f19810183528261103c565b604051918291602083526020830190610df8565b0390f35b5f80fd5b346101de575f6003193601126101de5760206040517f00000000000000000000000000000000000000000000000000000000000000008152f35b346101de5761022a36610d74565b6004549160ff8360401c166104e2575f80527f4c48d1d2b0f4f7485fc28e3db22341d96a20aa29e6efa8149da9751603abd4e06020527f6e0c24a6e293ff9b755263dbaa15ba3796b0b8d3fe17cfb4ddf8143b268eac4754610298929060ff16156104d5575b8101906110d9565b6102c78151517f0000000000000000000000000000000000000000000000000000000000000000808214611189565b6020815101518051810160208101916020818303126101de57602081015167ffffffffffffffff81116101de57019061018090829003126101de576040519061030f82610fcc565b602081015167ffffffffffffffff81116101de57839082016020019061033491611260565b825261034260408201611348565b60208301908152906103578460608301611219565b604084019081529161036c8560a08401611219565b60608501908152946103818160e08501611365565b9260808601938452610140019061039791611365565b9360a081019485525190516fffffffffffffffffffffffffffffffff166103bd916126e8565b516040805182516fffffffffffffffffffffffffffffffff16602080830191825284015182840152919092015160608084019190915282529061040160808261103c565b51902090516020015167ffffffffffffffff1661041d90611649565b61042a919081811461187c565b516040805182516fffffffffffffffffffffffffffffffff16602080830191825284015182840152919092015160608084019190915282529061046e60808261103c565b51902090516020015167ffffffffffffffff1661048a90611649565b610497919081811461187c565b516104a190611a03565b7fffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffff1668010000000000000000176004555f80f35b6104dd61178e565b610290565b7f928b1233000000000000000000000000000000000000000000000000000000005f5260045ffd5b346101de5761053e61051b36610dc5565b90610539610534825f525f602052600160405f20015490565b611816565b611ba5565b005b346101de575f6003193601126101de5760206040517f00000000000000000000000000000000000000000000000000000000000000008152f35b346101de575f6003193601126101de576040516105a18161059a81610ec6565b038261103c565b6101206040516105b081610f83565b60025460ff8116825260ff602083019160081c16815260ff6040516105d481610f83565b67ffffffffffffffff600354818116835281602084019160401c168152816004549385808660481c1697816106146040519d8d8f9e8f9081520190610df8565b9a511660208c0152511660408a0152511660608801525116608086015263ffffffff811660a086015263ffffffff8160201c1660c086015260401c16151560e08401526106608161105f565b6101008301520390f35b346101de5760206003193601126101de5760043567ffffffffffffffff81116101de57366023820112156101de57806004013567ffffffffffffffff81116101de57602482013660248360051b850101116101de5760405160206106ce818361103c565b5f825280820192601f1982013685376106e685611735565b956106f4604051978861103c565b858752601f1961070387611735565b01835f5b82811061079b575050505f5b868110156107885760019061076c61076661073660248460051b87010187611690565b9190888b846040519586948486013783018281015f81528d519283915e01015f815203601f19810183528261103c565b30612621565b610776828b61174d565b52610781818a61174d565b5001610713565b604051848152806101da8187018b610e1d565b606082828c010152018490610707565b346101de575f6003193601126101de5760206040515f8152f35b346101de576107d336610dc5565b905f525f60205273ffffffffffffffffffffffffffffffffffffffff60405f2091165f52602052602060ff60405f2054166040519015158152f35b346101de5760206003193601126101de5760043567ffffffffffffffff81116101de578060040160a060031983360301126101de5760ff60045460401c166104e2575f80527f4c48d1d2b0f4f7485fc28e3db22341d96a20aa29e6efa8149da9751603abd4e06020527f6e0c24a6e293ff9b755263dbaa15ba3796b0b8d3fe17cfb4ddf8143b268eac475460ff1615610925575b60848201916108b18383611690565b9050156108fd57602092826108c9816108f595611690565b60246108ed6108e66108de60648901876116e1565b979096611690565b3691611085565b950191611cee565b604051908152f35b7f1208b21b000000000000000000000000000000000000000000000000000000005f5260045ffd5b61092d61178e565b6108a2565b346101de575f6003193601126101de5760206040517fbd893629a699470e4ec82a5715bb4981fdaacc5d0a728bf5f55b801d8f4ef10b8152f35b346101de5760206003193601126101de5760043567ffffffffffffffff81116101de5780600401608060031983360301126101de5760ff60045460401c166104e2575f80527f4c48d1d2b0f4f7485fc28e3db22341d96a20aa29e6efa8149da9751603abd4e060209081527f6e0c24a6e293ff9b755263dbaa15ba3796b0b8d3fe17cfb4ddf8143b268eac475490926108f592909160ff1615610a41575b610a24610a178280611690565b91909260648501906116e1565b929091602460405195610a37898861103c565b5f87520191611cee565b610a4961178e565b610a0a565b346101de57610a5c36610dc5565b3373ffffffffffffffffffffffffffffffffffffffff821603610a825761053e91611ba5565b7f6697b232000000000000000000000000000000000000000000000000000000005f5260045ffd5b346101de575f6003193601126101de5760206040517f00000000000000000000000000000000000000000000000000000000000000008152f35b346101de5761053e610af536610dc5565b90610b0e610534825f525f602052600160405f20015490565b611ad3565b346101de575f6003193601126101de5760206040516107088152f35b346101de5760206003193601126101de5760206108f56004355f525f602052600160405f20015490565b346101de5760206003193601126101de5760043567ffffffffffffffff811681036101de576108f5602091611649565b346101de57610b9736610d74565b60ff60045460401c166104e2575f80527f4c48d1d2b0f4f7485fc28e3db22341d96a20aa29e6efa8149da9751603abd4e06020527f6e0c24a6e293ff9b755263dbaa15ba3796b0b8d3fe17cfb4ddf8143b268eac4754610bff929060ff1615610c3f57611431565b6040516003821015610c12576020918152f35b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b610c4761178e565b611431565b346101de575f6003193601126101de57602060405173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b346101de575f6003193601126101de5760206040517f00000000000000000000000000000000000000000000000000000000000000008152f35b346101de5760206003193601126101de57600435907fffffffff0000000000000000000000000000000000000000000000000000000082168092036101de57817f7965db0b0000000000000000000000000000000000000000000000000000000060209314908115610d4a575b5015158152f35b7f01ffc9a70000000000000000000000000000000000000000000000000000000091501483610d43565b9060206003198301126101de5760043567ffffffffffffffff81116101de57826023820112156101de5780600401359267ffffffffffffffff84116101de57602484830101116101de576024019190565b60031960409101126101de576004359060243573ffffffffffffffffffffffffffffffffffffffff811681036101de5790565b90601f19601f602080948051918291828752018686015e5f8582860101520116010190565b9080602083519182815201916020808360051b8301019401925f915b838310610e4857505050505090565b9091929394602080610e6683601f1986600196030187528951610df8565b97019301930191939290610e39565b90600182811c92168015610ebc575b6020831014610e8f57565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b91607f1691610e84565b6001545f9291610ed582610e75565b8082529160018116908115610f495750600114610ef0575050565b60015f9081529293509091907fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf65b838310610f2f575060209250010190565b600181602092949394548385870101520191019190610f1e565b60209495507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0091509291921683830152151560051b010190565b6040810190811067ffffffffffffffff821117610f9f57604052565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b60c0810190811067ffffffffffffffff821117610f9f57604052565b6020810190811067ffffffffffffffff821117610f9f57604052565b6060810190811067ffffffffffffffff821117610f9f57604052565b60e0810190811067ffffffffffffffff821117610f9f57604052565b90601f601f19910116810190811067ffffffffffffffff821117610f9f57604052565b60021115610c1257565b67ffffffffffffffff8111610f9f57601f01601f191660200190565b92919261109182611069565b9161109f604051938461103c565b8294818452818301116101de578281602093845f960137010152565b9080601f830112156101de578160206110d693359101611085565b90565b6020818303126101de5780359067ffffffffffffffff82116101de5701906020828203126101de576040519161110e83610fe8565b80359067ffffffffffffffff82116101de57016060818303126101de576040519161113883611004565b81358352602082013567ffffffffffffffff81116101de578161115c9184016110bb565b6020840152604082013567ffffffffffffffff81116101de5761117f92016110bb565b6040820152815290565b15611192575050565b7fd56bdc26000000000000000000000000000000000000000000000000000000005f5260045260245260445ffd5b9291926111cc82611069565b916111da604051938461103c565b8294818452818301116101de578281602093845f96015e010152565b519060ff821682036101de57565b519067ffffffffffffffff821682036101de57565b91908260409103126101de5760405161123181610f83565b602061124a81839561124281611204565b855201611204565b910152565b519063ffffffff821682036101de57565b91908281039261012084126101de576040519161127c83611020565b8294825167ffffffffffffffff81116101de57830182601f820112156101de576040916112b284836020601f19955191016111c0565b865201126101de576112f7906040516112ca81610f83565b6112d6602085016111f6565b81526112e4604085016111f6565b6020820152602085015260608301611219565b604083015261130860a0820161124f565b606083015261131960c0820161124f565b608083015260e08101519081151582036101de576101009160a084015201519060028210156101de5760c00152565b51906fffffffffffffffffffffffffffffffff821682036101de57565b91908260609103126101de5760405161137d81611004565b604080829461138b81611348565b8452602081015160208501520151910152565b9190610180838203126101de57604051906113b882610fcc565b819380519167ffffffffffffffff83116101de57610140826113e18360a09661124a9601611260565b86526113f08360208301611365565b60208701526114028360808301611365565b604087015261141360e08201611348565b6060870152611426836101008301611219565b608087015201611219565b61143d918101906110d9565b61146c8151517f0000000000000000000000000000000000000000000000000000000000000000808214611189565b60208151015180518101906020818303126101de5760208101519167ffffffffffffffff83116101de576114a792602080920192010161139e565b906114b1826118b3565b6114ba82611946565b916003831015610c1257826115ec57908167ffffffffffffffff6020604060a06110d6960193845184848201511685600354851c168111611564575b505001516040516115498161153b858201948591909160408060608301946fffffffffffffffffffffffffffffffff8151168452602081015160208501520151910152565b03601f19810183528261103c565b51902092510151165f52600560205260405f20555b51611a03565b6115a3866115e593511667ffffffffffffffff167fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000006003541617600355565b7fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff6fffffffffffffffff00000000000000006003549260401b16911617600355565b5f806114f6565b5060018203611631576110d690680100000000000000007fffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffff600454161760045561155e565b60028214611642576110d69061155e565b5050600290565b67ffffffffffffffff165f52600560205260405f205480156116685790565b7f5b48b457000000000000000000000000000000000000000000000000000000005f5260045ffd5b9035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1813603018212156101de570180359067ffffffffffffffff82116101de576020019181360383136101de57565b9035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1813603018212156101de570180359067ffffffffffffffff82116101de57602001918160051b360383136101de57565b67ffffffffffffffff8111610f9f5760051b60200190565b80518210156117615760209160051b010190565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b335f9081527f4c48d1d2b0f4f7485fc28e3db22341d96a20aa29e6efa8149da9751603abd4e0602052604090205460ff16156117c657565b7fe2517d3f000000000000000000000000000000000000000000000000000000005f52336004527fbd893629a699470e4ec82a5715bb4981fdaacc5d0a728bf5f55b801d8f4ef10b60245260445ffd5b805f525f60205260405f2073ffffffffffffffffffffffffffffffffffffffff33165f5260205260ff60405f2054161561184d5750565b7fe2517d3f000000000000000000000000000000000000000000000000000000005f523360045260245260445ffd5b15611885575050565b7f6d23e8a3000000000000000000000000000000000000000000000000000000005f5260045260245260445ffd5b611944906118d981516fffffffffffffffffffffffffffffffff606084015116906126e8565b61193c67ffffffffffffffff602060808185015160405161192e8161153b868201948591909160408060608301946fffffffffffffffffffffffffffffffff8151168452602081015160208501520151910152565b519020940151015116611649565b80821461187c565b565b67ffffffffffffffff602060a08301510151165f52600560205260405f205480155f146119735750505f90565b604082019081516040516119bc8161153b60208201948591909160408060608301946fffffffffffffffffffffffffffffffff8151168452602081015160208501520151910152565b51902014918215926119da575b5050156119d557600190565b600290565b6fffffffffffffffffffffffffffffffff91925060208291015151169151511611155f806119c9565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169080516040602083015192015192803b156101de575f92611a9b92611aad604051968795869485947f41493c600000000000000000000000000000000000000000000000000000000086526004860152606060248601526064850190610df8565b90600319848303016044850152610df8565b03915afa8015611ac857611abe5750565b5f6119449161103c565b6040513d5f823e3d90fd5b805f525f60205260405f2073ffffffffffffffffffffffffffffffffffffffff83165f5260205260ff60405f205416155f14611b9f57805f525f60205260405f2073ffffffffffffffffffffffffffffffffffffffff83165f5260205260405f2060017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0082541617905573ffffffffffffffffffffffffffffffffffffffff339216907f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d5f80a4600190565b50505f90565b805f525f60205260405f2073ffffffffffffffffffffffffffffffffffffffff83165f5260205260ff60405f2054165f14611b9f57805f525f60205260405f2073ffffffffffffffffffffffffffffffffffffffff83165f5260205260405f207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00815416905573ffffffffffffffffffffffffffffffffffffffff339216907ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b5f80a4600190565b3567ffffffffffffffff811681036101de5790565b929190611c8e81611735565b93611c9c604051958661103c565b602085838152019160051b8101918383116101de5781905b838210611cc2575050505050565b813567ffffffffffffffff81116101de57602091611ce387849387016110bb565b815201910190611cb4565b9094929193948015612568578101906020818303126101de5780359067ffffffffffffffff82116101de57016040818303126101de5760405191611d3183610f83565b813560028110156101de578352602082013567ffffffffffffffff81116101de57611d5c92016110bb565b90602081019182528051611d6f8161105f565b611d788161105f565b611fe5575051908151820160208101926020818303126101de57602081015167ffffffffffffffff81116101de570190608090829003126101de5760405192611dc084610f83565b602082015167ffffffffffffffff81116101de5782611de9836020604094611df1970101612a5a565b865201611365565b9460208301958652611e288351517f0000000000000000000000000000000000000000000000000000000000000000808214611189565b6020835101519182518301926020818503126101de5760208101519067ffffffffffffffff82116101de5701926040848203126101de5760405193611e6c85610f83565b6020810151855260408101519167ffffffffffffffff83116101de57611e99926020809201920101612ac0565b94611eb360208501968088525180151580611fd957612c0d565b5f805b87518051831015611fa657611ece83611ee19261174d565b5151611edb368888611c82565b90612da9565b15611f9c57508694611f40611f55956fffffffffffffffffffffffffffffffff9a9895611f3961155e966020633b9aca009f9d8198611f20915161174d565b51015190815181518082149182611f88575b5050612c4b565b6001612c99565b51950194611f4d86611c6d565b875191612e1b565b516001815111611f69575b50505151160490565b611f75611f8192611c6d565b90848451511691612eab565b5f80611f60565b909150898401209089830120145f80611f32565b9060010190611eb6565b5061155e92506020915094611f40611f55956fffffffffffffffffffffffffffffffff9a9895633b9aca009c9a98612c99565b5061ffff811115612c0d565b94906001869593949551611ff88161105f565b6120018161105f565b146120485760ff86516120138161105f565b61201c8161105f565b7fd3a2e6c9000000000000000000000000000000000000000000000000000000005f521660045260245ffd5b90919293945051926060602060405161206081610f83565b60405161206c81610fcc565b60405161207881611020565b84815260405161208781610f83565b5f81525f858201528482015260405161209f81610f83565b5f81525f8582015260408201525f858201525f60808201525f60a08201525f60c082015281526120cd612a22565b838201526120d9612a22565b60408201525f848201526040516120ef81610f83565b5f81525f84820152608082015260405161210881610f83565b5f81525f8482015260a08201528152015283518401936020818603126101de5760208101519067ffffffffffffffff82116101de5701936020858203126101de576040519461215686610fe8565b60208101519067ffffffffffffffff82116101de57602061217f92816121ac9501920101612a5a565b808652517f0000000000000000000000000000000000000000000000000000000000000000808214611189565b602084510151948551860160208101966020818303126101de57602081015167ffffffffffffffff81116101de570190604090829003126101de57604051966121f488610f83565b602082015167ffffffffffffffff81116101de578160206122179285010161139e565b885260408201519167ffffffffffffffff83116101de5761223b9201602001612ac0565b9361225560208801958087525180151580611fd957612c0d565b602081019561226387611c6d565b67ffffffffffffffff60a08a5101519181602084015116918291161480612549575b61228e85611c6d565b9267ffffffffffffffff6122a18c611c6d565b91511691156124fb57505050506122bc9061155e89516118b3565b6122c68751611946565b6003811015610c1257806124ca57506122de86611c6d565b67ffffffffffffffff8060035460401c16911611612477575b506040865101516040516123408161153b60208201948591909160408060608301946fffffffffffffffffffffffffffffffff8151168452602081015160208501520151910152565b51902067ffffffffffffffff61235587611c6d565b165f52600560205260405f20555b5f805b8551805183101561244c57611ece8361237e9261174d565b156124425750633b9aca0096936fffffffffffffffffffffffffffffffff9693611f39879460206123b56123cd9660409b5161174d565b5101519081518151808214918261242c575050612c4b565b6123f48351858101519067ffffffffffffffff602060a08185015193015101511690612e1b565b51600181511161240a575b505051015151160490565b61241661242592611c6d565b90858585510151511691612eab565b5f806123ff565b9091506020840120906020830120145f80611f32565b9060010190612366565b5060409592506123cd9150936fffffffffffffffffffffffffffffffff9693633b9aca009895612c99565b6124836124b891611c6d565b67ffffffffffffffff167fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000006003541617600355565b6124c46115a386611c6d565b5f6122f7565b6001915003612363577f59bc8fd3000000000000000000000000000000000000000000000000000000005f5260045ffd5b6084945067ffffffffffffffff9081604051957fb8d8167e00000000000000000000000000000000000000000000000000000000875216600486015216602484015260448301526064820152fd5b5061255384611c6d565b67ffffffffffffffff80845116911614612285565b5050909161257b60206125909201611c6d565b916040519461258986610f83565b3691611c82565b8352602083019182526040516125af8161153b86602083019586612954565b5190205c9151905182156125c9575050633b9aca00900490565b9061261d61260b926040519384937ff06fc33b000000000000000000000000000000000000000000000000000000008552604060048601526044850190610e1d565b90600319848303016024850152610df8565b0390fd5b905f8091602081519101845af480806126d5575b156126555750506040513d81523d5f602083013e60203d82010160405290565b1561269c5773ffffffffffffffffffffffffffffffffffffffff907f9996b315000000000000000000000000000000000000000000000000000000005f521660045260245ffd5b3d156126ad576040513d5f823e3d90fd5b7fd6bda275000000000000000000000000000000000000000000000000000000005f5260045ffd5b503d1515806126355750813b1515612635565b906fffffffffffffffffffffffffffffffff633b9aca00911604428111612925578042034281116128f857610708106128c9575080515161272a600154610e75565b14806128a2575b815190156128625750602081015160ff815116906002549160ff8316928382149283612849575b6020015160ff169215612801575050505063ffffffff606082015116906004549163ffffffff83168082036127d357505063ffffffff608081920151169160201c168082036127a5575050565b7f1eb5c1eb000000000000000000000000000000000000000000000000000000005f5260045260245260445ffd5b7f73b1bde3000000000000000000000000000000000000000000000000000000005f5260045260245260445ffd5b6084945060ff90604051947fd382033a000000000000000000000000000000000000000000000000000000008652600486015260081c16602484015260448301526064820152fd5b6020810151600883901c60ff9081169116149350612758565b61261d906040519182917ff6b6676b0000000000000000000000000000000000000000000000000000000083526040600484015261260b60448401610ec6565b508051602081519101206040516128bc8161059a81610ec6565b6020815191012014612731565b7f12e74add000000000000000000000000000000000000000000000000000000005f524260045260245260445ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b7f20daedb6000000000000000000000000000000000000000000000000000000005f524260045260245260445ffd5b9067ffffffffffffffff90939293168152604060208201526080810190835191604080830152825180915260a0820190602060a08260051b8501019401915f905b8282106129d9575050505060206110d6939401519060607fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc082850301910152610df8565b90919294602080612a14837fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6089600196030186528951610df8565b970192019201909291612995565b60405190612a2f82611004565b5f6040838281528260208201520152565b9080601f830112156101de5781516110d6926020016111c0565b91906060838203126101de5760405190612a7382611004565b819380518352602081015167ffffffffffffffff81116101de5782612a99918301612a40565b602084015260408101519167ffffffffffffffff83116101de5760409261124a9201612a40565b9080601f830112156101de57815191612ad883611735565b92612ae6604051948561103c565b80845260208085019160051b830101918383116101de5760208101915b838310612b1257505050505090565b825167ffffffffffffffff81116101de578201906040601f1983880301126101de5760405190612b4182610f83565b602083015167ffffffffffffffff81116101de5760209084010187601f820112156101de578051612b7181611735565b91612b7f604051938461103c565b81835260208084019260051b820101918a83116101de5760208201905b838210612bdf5750505050825260408301519167ffffffffffffffff83116101de57612bd088602080969581960101612a40565b83820152815201920191612b03565b815167ffffffffffffffff81116101de57602091612c028e848094880101612a40565b815201910190612b9c565b15612c155750565b7fb0369c31000000000000000000000000000000000000000000000000000000005f52600452600160245261ffff60445260645ffd5b91909115612c57575050565b9061261d61260b926040519384937f5f1ca381000000000000000000000000000000000000000000000000000000008552604060048601526044850190610df8565b91909115612ca5575050565b604051907ffef760c700000000000000000000000000000000000000000000000000000000825280602483016020600485015252604482019260448260051b84010191815f907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1813603015b838310612d1e5786860387fd5b90919293947fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbc8782030188528535828112156101de578301906020823592019167ffffffffffffffff81116101de5780360383136101de57602082601f19601f8480600198869897879852868601375f85828601015201160101970198019301919096939296612d11565b908151815103611b9f575f5b8251811015612e1357612dc8818461174d565b5151612dd4828461174d565b515103612e0c57612de5818461174d565b5160208151910120612df7828461174d565b516020815191012003612e0c57600101612db5565b5050505f90565b505050600190565b91612e7060209261193c60405185810190612e678161153b888591909160408060608301946fffffffffffffffffffffffffffffffff8151168452602081015160208501520151910152565b51902091611649565b0151808203612e7d575050565b7f4b2dfe98000000000000000000000000000000000000000000000000000000005f5260045260245260445ffd5b929190925f5b8451811015612ee9578083612ec86001938861174d565b51604051612edf8161153b60208201948986612954565b5190205d01612eb1565b505050905056fea164736f6c634300081c000a2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d4c48d1d2b0f4f7485fc28e3db22341d96a20aa29e6efa8149da9751603abd4e06e0c24a6e293ff9b755263dbaa15ba3796b0b8d3fe17cfb4ddf8143b268eac47bd893629a699470e4ec82a5715bb4981fdaacc5d0a728bf5f55b801d8f4ef10bad3228b676f7d3cd4284a5443f17f1962b36e491b30a40b2405849e597ba5fb5"}} diff --git a/ibc-solidity/contracts/light-clients/besu/BesuLightClientBase.sol b/ibc-solidity/contracts/light-clients/besu/BesuLightClientBase.sol index ba20ce588..42f4be8c5 100644 --- a/ibc-solidity/contracts/light-clients/besu/BesuLightClientBase.sol +++ b/ibc-solidity/contracts/light-clients/besu/BesuLightClientBase.sol @@ -131,6 +131,9 @@ abstract contract BesuLightClientBase is ILightClient, IBesuLightClientErrors, I if (header.height == 0) { revert InvalidHeaderHeight(); } + if (header.timestamp == 0) { + revert InvalidHeaderTimestamp(); + } if (block.timestamp + clientState.maxClockDrift < header.timestamp) { revert HeaderFromFuture(block.timestamp, header.timestamp, clientState.maxClockDrift); } diff --git a/ibc-solidity/contracts/light-clients/besu/RLPReader.sol b/ibc-solidity/contracts/light-clients/besu/RLPReader.sol index b842bd816..173b50a96 100644 --- a/ibc-solidity/contracts/light-clients/besu/RLPReader.sol +++ b/ibc-solidity/contracts/light-clients/besu/RLPReader.sol @@ -4,7 +4,7 @@ * @author Hamdi Allam hamdi.allam97@gmail.com * Please reach out with any questions or concerns */ -// This file is copied from solidity-rlp library. +// This file is adapted from the solidity-rlp library. // https://github.com/hamdiallam/Solidity-RLP/blob/0212f8e754471da67fc5387df7855f47f944f925/contracts/RLPReader.sol pragma solidity ^0.8.28; @@ -33,35 +33,6 @@ library RLPReader { uint256 memPtr; } - /// @notice Iterator over an RLP list. - /// @param item List item being iterated. - /// @param nextPtr Memory pointer to the next item in the list. - struct Iterator { - RLPItem item; // Item that's being iterated over. - uint256 nextPtr; // Position of the next item in the list. - } - - /// @notice Returns the next item from an iterator. - /// @param self The iterator. - /// @return The next item in the iteration. - function next(Iterator memory self) internal pure returns (RLPItem memory) { - require(hasNext(self)); - - uint256 ptr = self.nextPtr; - uint256 itemLength = _itemLength(ptr); - self.nextPtr = ptr + itemLength; - - return RLPItem(itemLength, ptr); - } - - /// @notice Checks whether an iterator has more items. - /// @param self The iterator. - /// @return True if the iterator has another item. - function hasNext(Iterator memory self) internal pure returns (bool) { - RLPItem memory item = self.item; - return self.nextPtr < item.memPtr + item.len; - } - /// @notice Wraps RLP-encoded bytes as an RLP item. /// @param item RLP-encoded bytes. /// @return The RLP item memory view. @@ -74,23 +45,6 @@ library RLPReader { return RLPItem(item.length, memPtr); } - /// @notice Creates an iterator over an RLP list. - /// @param self The RLP list item. - /// @return An iterator over the list. - function iterator(RLPItem memory self) internal pure returns (Iterator memory) { - require(isList(self)); - - uint256 ptr = self.memPtr + _payloadOffset(self.memPtr); - return Iterator(self, ptr); - } - - /// @notice Returns the encoded length of an RLP item. - /// @param item The RLP item. - /// @return The encoded item length. - function rlpLen(RLPItem memory item) internal pure returns (uint256) { - return item.len; - } - /// @notice Returns the payload memory location for an RLP item. /// @param item The RLP item. /// @return The payload memory pointer. @@ -102,14 +56,6 @@ library RLPReader { return (memPtr, len); } - /// @notice Returns the payload length for an RLP item. - /// @param item The RLP item. - /// @return The payload length. - function payloadLen(RLPItem memory item) internal pure returns (uint256) { - (, uint256 len) = payloadLocation(item); - return len; - } - /// @notice Decodes an RLP list into item views. /// @param item The RLP list item. /// @return The list item views. @@ -191,38 +137,6 @@ library RLPReader { return result; } - /// @notice Converts an RLP item to a boolean. - /// @param item The RLP item. - /// @return The decoded boolean value. - function toBoolean(RLPItem memory item) internal pure returns (bool) { - require(item.len == 1); - uint256 result; - uint256 memPtr = item.memPtr; - assembly { - result := byte(0, mload(memPtr)) - } - - // SEE Github Issue #5. - // Summary: Most commonly used RLP libraries (i.e Geth) will encode - // "0" as "0x80" instead of as "0". We handle this edge case explicitly - // here. - if (result == 0 || result == STRING_SHORT_START) { - return false; - } else { - return true; - } - } - - /// @notice Converts an RLP item to an address. - /// @param item The RLP item. - /// @return The decoded address. - function toAddress(RLPItem memory item) internal pure returns (address) { - // 1 byte for the length prefix - require(item.len == 21); - - return address(uint160(toUint(item))); - } - /// @notice Converts an RLP item to an unsigned integer. /// @param item The RLP item. /// @return The decoded unsigned integer. diff --git a/ibc-solidity/contracts/light-clients/dummy/DummyLightClient.sol b/ibc-solidity/contracts/light-clients/dummy/DummyLightClient.sol index 631f01fe1..217045354 100644 --- a/ibc-solidity/contracts/light-clients/dummy/DummyLightClient.sol +++ b/ibc-solidity/contracts/light-clients/dummy/DummyLightClient.sol @@ -4,10 +4,11 @@ pragma solidity ^0.8.28; import { ILightClient } from "../../interfaces/ILightClient.sol"; import { ILightClientMsgs } from "../../msgs/ILightClientMsgs.sol"; import { IICS02ClientMsgs } from "../../msgs/IICS02ClientMsgs.sol"; +import { IDummyLightClientMsgs } from "./msgs/IDummyLightClientMsgs.sol"; /// @title Dummy Light Client /// @notice Insecure light client for local development and testing; proofs are ignored. -contract DummyLightClient is ILightClient { +contract DummyLightClient is ILightClient, IDummyLightClientMsgs { /// @notice A membership record exists for the queried height and path. error MembershipExists(); /// @notice No membership record exists for the queried height and path. @@ -19,32 +20,6 @@ contract DummyLightClient is ILightClient { /// @notice Consensus timestamps must be non-zero. error ZeroTimestamp(); - /// @notice Dummy client state returned by `getClientState`. - /// @param latestHeight Latest updated height. - /// @param latestTimestamp Timestamp for the latest updated height. - struct ClientState { - IICS02ClientMsgs.Height latestHeight; - uint64 latestTimestamp; - } - - /// @notice Membership record supplied in an update. - /// @param path Merkle path for the record. - /// @param value Value for the record. - struct Membership { - bytes[] path; - bytes value; - } - - /// @notice Update message accepted by the dummy client. - /// @param height Height whose timestamp and membership records are being set. - /// @param timestamp Consensus timestamp for the height. - /// @param memberships Membership records for the height. - struct MsgUpdateClient { - IICS02ClientMsgs.Height height; - uint64 timestamp; - Membership[] memberships; - } - /// @notice Latest dummy client state. ClientState private _clientState; diff --git a/ibc-solidity/contracts/light-clients/dummy/README.md b/ibc-solidity/contracts/light-clients/dummy/README.md index ab925ef5c..dfe600063 100644 --- a/ibc-solidity/contracts/light-clients/dummy/README.md +++ b/ibc-solidity/contracts/light-clients/dummy/README.md @@ -2,7 +2,7 @@ `DummyLightClient` is an insecure `ILightClient` implementation for local development and tests only. It accepts arbitrary updates and does not verify cryptographic proofs. -- `updateClient(bytes)` expects ABI encoding of `DummyLightClient.MsgUpdateClient`. +- `updateClient(bytes)` expects ABI encoding of `IDummyLightClientMsgs.MsgUpdateClient`. - Updates populate known consensus timestamps and explicit `(height, path) -> value hash` membership records. - Membership succeeds when the queried `(height, path, value)` matches a stored record. - Non-membership succeeds when no record exists for `(height, path)` at a known height. diff --git a/ibc-solidity/contracts/light-clients/dummy/msgs/IDummyLightClientMsgs.sol b/ibc-solidity/contracts/light-clients/dummy/msgs/IDummyLightClientMsgs.sol new file mode 100644 index 000000000..eb726e3b6 --- /dev/null +++ b/ibc-solidity/contracts/light-clients/dummy/msgs/IDummyLightClientMsgs.sol @@ -0,0 +1,34 @@ +// SPDX-License-Identifier: Apache-2.0 +pragma solidity ^0.8.28; + +import { IICS02ClientMsgs } from "../../../msgs/IICS02ClientMsgs.sol"; + +/// @title Dummy Light Client Messages +/// @notice Defines message and state types for the dummy light client. +interface IDummyLightClientMsgs { + /// @notice Dummy client state returned by `getClientState`. + /// @param latestHeight Latest updated height. + /// @param latestTimestamp Timestamp for the latest updated height. + struct ClientState { + IICS02ClientMsgs.Height latestHeight; + uint64 latestTimestamp; + } + + /// @notice Membership record supplied in an update. + /// @param path Merkle path for the record. + /// @param value Value for the record. + struct Membership { + bytes[] path; + bytes value; + } + + /// @notice Update message accepted by the dummy client. + /// @param height Height whose timestamp and membership records are being set. + /// @param timestamp Consensus timestamp for the height. + /// @param memberships Membership records for the height. + struct MsgUpdateClient { + IICS02ClientMsgs.Height height; + uint64 timestamp; + Membership[] memberships; + } +} diff --git a/ibc-solidity/solidity.just b/ibc-solidity/solidity.just index 1b8f61f14..8139ffb11 100644 --- a/ibc-solidity/solidity.just +++ b/ibc-solidity/solidity.just @@ -33,7 +33,7 @@ test-foundry testname=".\\*": test-benchmark testname=".\\*": forge test -vvv --show-progress --gas-report --match-path test/solidity-ibc/BenchmarkTest.t.sol --match-test {{testname}} -# Generate ABI/bin artifacts and Go abigen bindings +# Generate all tracked contract artifacts and Go abigen bindings [group('generate')] generate-abi: build-contracts mkdir -p tmp/abigen @@ -79,16 +79,18 @@ generate-abi: build-contracts abigen --abi abi/EVMIFTSendCallConstructor.json --bin tmp/abigen/EVMIFTSendCallConstructor.bin --pkg evmiftsendcall --type Contract --out ../packages/go-abigen/evmiftsendcall/contract.go mkdir -p ../packages/go-abigen/dummy abigen --abi abi/DummyLightClient.json --bin tmp/abigen/DummyLightClient.bin --pkg dummy --type Contract --out ../packages/go-abigen/dummy/contract.go + rm -rf abi/bytecode + mkdir -p abi/bytecode + jq -c '{abi, bytecode: {object: .bytecode.object}}' out/SP1ICS07Tendermint.sol/SP1ICS07Tendermint.json > abi/bytecode/SP1ICS07Tendermint.json + jq -c '{abi, bytecode: {object: .bytecode.object}}' out/AttestationLightClient.sol/AttestationLightClient.json > abi/bytecode/AttestationLightClient.json + jq -c '{abi, bytecode: {object: .bytecode.object}}' out/BesuIBFT2LightClient.sol/BesuIBFT2LightClient.json > abi/bytecode/BesuIBFT2LightClient.json + jq -c '{abi, bytecode: {object: .bytecode.object}}' out/BesuQBFTLightClient.sol/BesuQBFTLightClient.json > abi/bytecode/BesuQBFTLightClient.json + jq -c '{abi, bytecode: {object: .bytecode.object}}' out/DummyLightClient.sol/DummyLightClient.json > abi/bytecode/DummyLightClient.json rm -rf tmp/abigen -# Generate the ABI files with bytecode for the required contracts +# Backwards-compatible alias for the canonical artifact generator. [group('generate')] -generate-abi-bytecode: build-contracts - cp out/SP1ICS07Tendermint.sol/SP1ICS07Tendermint.json abi/bytecode - cp out/AttestationLightClient.sol/AttestationLightClient.json abi/bytecode - cp out/BesuIBFT2LightClient.sol/BesuIBFT2LightClient.json abi/bytecode - cp out/BesuQBFTLightClient.sol/BesuQBFTLightClient.json abi/bytecode - cp out/DummyLightClient.sol/DummyLightClient.json abi/bytecode +generate-abi-bytecode: generate-abi # Clean up the foundry cache and out directories [group('clean')] diff --git a/ibc-solidity/test/besu-bft/BesuLightClientTestBase.sol b/ibc-solidity/test/besu-bft/BesuLightClientTestBase.sol index aeec957c1..1c1c9f225 100644 --- a/ibc-solidity/test/besu-bft/BesuLightClientTestBase.sol +++ b/ibc-solidity/test/besu-bft/BesuLightClientTestBase.sol @@ -11,6 +11,7 @@ import { ILightClientMsgs } from "../../contracts/msgs/ILightClientMsgs.sol"; import { IICS02ClientMsgs } from "../../contracts/msgs/IICS02ClientMsgs.sol"; import { IBesuLightClientMsgs } from "../../contracts/light-clients/besu/msgs/IBesuLightClientMsgs.sol"; import { IBesuLightClientErrors } from "../../contracts/light-clients/besu/errors/IBesuLightClientErrors.sol"; +import { RLPReader } from "../../contracts/light-clients/besu/RLPReader.sol"; struct BesuUpdateFixture { uint64 height; @@ -22,6 +23,13 @@ struct BesuUpdateFixture { address[] expectedValidators; } +struct BesuRejectionUpdateFixture { + uint64 height; + bytes headerRlp; + uint64 trustedHeight; + bytes accountProof; +} + struct BesuProofFixture { bytes proof; uint64 proofHeight; @@ -40,9 +48,9 @@ struct BesuFixture { uint64 maxClockDrift; BesuUpdateFixture updateHeight11; BesuUpdateFixture updateHeight12; - BesuUpdateFixture lowQuorumHeight12; - BesuUpdateFixture conflictingHeight12; - BesuUpdateFixture lowOverlapHeight13; + BesuRejectionUpdateFixture lowQuorumHeight12; + BesuRejectionUpdateFixture conflictingHeight12; + BesuRejectionUpdateFixture lowOverlapHeight13; BesuProofFixture membership; BesuProofFixture nonMembership; } @@ -53,6 +61,8 @@ interface IBesuTestLightClient is ILightClient { abstract contract BesuLightClientTestBase is Test { using stdJson for string; + using RLPReader for bytes; + using RLPReader for RLPReader.RLPItem; string internal constant FIXTURE_DIR = "/test/besu-bft/fixtures/"; @@ -92,6 +102,25 @@ abstract contract BesuLightClientTestBase is Test { ); } + function test_updateClient_revertZeroTimestampWithoutStateChange() public { + BesuUpdateFixture memory update = fixture.updateHeight12; + RLPReader.RLPItem memory headerItem = update.headerRlp.toRlpItem(); + RLPReader.RLPItem[] memory headerItems = headerItem.toList(); + (uint256 timestampPtr, uint256 timestampLen) = headerItems[11].payloadLocation(); + for (uint256 i = 0; i < timestampLen; ++i) { + update.headerRlp[timestampPtr - headerItem.memPtr + i] = 0; + } + + bytes memory clientStateBefore = client.getClientState(); + bytes memory consensusStateBefore = client.getConsensusState(fixture.initialTrustedHeight); + + vm.expectRevert(IBesuLightClientErrors.InvalidHeaderTimestamp.selector); + client.updateClient(_encodeUpdate(update)); + + assertEq(client.getClientState(), clientStateBefore); + assertEq(client.getConsensusState(fixture.initialTrustedHeight), consensusStateBefore); + } + function test_verifyMembership_returnsStoredTimestamp() public { vm.warp(fixture.initialTrustedTimestamp + 1); client.updateClient(_encodeUpdate(fixture.updateHeight12)); @@ -316,9 +345,9 @@ abstract contract BesuLightClientTestBase is Test { maxClockDrift: uint64(json.readUint(".maxClockDrift")), updateHeight11: _readUpdate(json, ".updateHeight11"), updateHeight12: _readUpdate(json, ".updateHeight12"), - lowQuorumHeight12: _readUpdate(json, ".lowQuorumHeight12"), - conflictingHeight12: _readUpdate(json, ".conflictingHeight12"), - lowOverlapHeight13: _readUpdate(json, ".lowOverlapHeight13"), + lowQuorumHeight12: _readRejectionUpdate(json, ".lowQuorumHeight12"), + conflictingHeight12: _readRejectionUpdate(json, ".conflictingHeight12"), + lowOverlapHeight13: _readRejectionUpdate(json, ".lowOverlapHeight13"), membership: _readProof(json, ".membership"), nonMembership: _readProof(json, ".nonMembership") }); @@ -336,6 +365,32 @@ abstract contract BesuLightClientTestBase is Test { }); } + function _readRejectionUpdate( + string memory json, + string memory path + ) + internal + view + returns (BesuRejectionUpdateFixture memory) + { + return BesuRejectionUpdateFixture({ + height: uint64(json.readUint(string.concat(path, ".height"))), + headerRlp: json.readBytes(string.concat(path, ".headerRlp")), + trustedHeight: uint64(json.readUint(string.concat(path, ".trustedHeight"))), + accountProof: json.readBytes(string.concat(path, ".accountProof")) + }); + } + + function _encodeUpdate(BesuRejectionUpdateFixture memory update) internal pure returns (bytes memory) { + return abi.encode( + IBesuLightClientMsgs.MsgUpdateClient({ + headerRlp: update.headerRlp, + trustedHeight: IICS02ClientMsgs.Height({ revisionNumber: 0, revisionHeight: update.trustedHeight }), + accountProof: update.accountProof + }) + ); + } + function _readProof(string memory json, string memory path) internal view returns (BesuProofFixture memory) { return BesuProofFixture({ proof: json.readBytes(string.concat(path, ".proof")), diff --git a/ibc-solidity/test/besu-bft/fixtures/qbft.json b/ibc-solidity/test/besu-bft/fixtures/qbft.json index d7d6f7856..18b58772c 100644 --- a/ibc-solidity/test/besu-bft/fixtures/qbft.json +++ b/ibc-solidity/test/besu-bft/fixtures/qbft.json @@ -1,8 +1,8 @@ { - "routerAddress": "0x786aaB752184e0494a34BD9BD7D001cbDcb51760", - "initialTrustedHeight": 26, - "initialTrustedTimestamp": 1776881173, - "initialTrustedStorageRoot": "0x39e8b39bf2488c61e195cae0fcb153f35079540fc3d41ce3c312b5f0e7cf1312", + "routerAddress": "0x07A6F66Beb52276B247A79B7B9D43416F9855f42", + "initialTrustedHeight": 33, + "initialTrustedTimestamp": 1787357305, + "initialTrustedStorageRoot": "0x2f39a2a5a30e1d6251aa6cbe8e47d8f8e2f01ebf00fb76e96abf17f5555089fc", "initialTrustedValidators": [ "0x065f139d8A49E9926232Cc4435159024cb5064FC", "0x0EB968DE631aBC65322EcDCa5DfDF9C6296e52f4", @@ -12,12 +12,12 @@ "trustingPeriod": 1209600, "maxClockDrift": 15, "updateHeight11": { - "height": 27, - "headerRlp": "0xf90341a035c5bc445cd81c61bc0aad8007aa516544feb0e1df4a14cf4814e633a3565529a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d4934794543d3796700ee35803a1c43562a69fec08e1e423a0b7639c4d45625b8b101b9db57a7c3dd480a6b4d87f05b20c0b36dbec0bd6bf39a04abda09b87c8b2c5f4d9026f4740c329505384b8abb1ad521a6e55bbb82a7fa8a0f5a30bc56f74a84f77824b92e5ac9a1e83fd2e3685f236542154b3eecbfa65a3b9010000000000000000080000000000000000000000000000000000000000080000000000000000000000800000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200200000000000000000000000000000000000000000000000000000000000000000000010000000000020000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000800000000000010000000000000000010000000000000000000000000000000000000000000011b8402faf08082b3498469e90e17b90147f90144a0000000000000000000000000000000000000000000626573752032352e342e31f85494065f139d8a49e9926232cc4435159024cb5064fc940eb968de631abc65322ecdca5dfdf9c6296e52f49420c5edbcf6263cd9e30df395a2b914f6e939b9ba94543d3796700ee35803a1c43562a69fec08e1e423c080f8c9b841a71881769fdd4ab6fc94b38a5e0575d160f60976be3ffabea13753358b1fa63859651be466e28107e85819a7c493db04c782344f7965b89f98e846018391d5ed01b841eda6db7423837da36d7e1330411093c62e809c95acd154e11eada002329e2a501329f936c901c111b85ed105a8fe4af5e01d455536aa28c5fa346197cfe84bca00b841df5eeb081556ae5fbe0b35240203c4451c8f2090b3ebe3ba556203cdcbec5678435c4fd9d3a87db14c4ea1b1c4e42949879171474d79dfd87ccbf1e08402ca4801a063746963616c2062797a616e74696e65206661756c7420746f6c6572616e636588000000000000000080", - "trustedHeight": 26, - "accountProof": "0xf902d2f90211a0de5c21ba73c9513557bec8115cfef22de5c40da75b1de113739c8536d44c26e0a0fdddfaa3686c209cf29f450b628a265bcec7322f41aece682d2783985d7c8572a0613bb9dbc25038f26fbdfe24fe22db94483a5989d10c31287f24023098f4b639a0fe624ba863bd1da723c27a7beebac3da9268c9dc3be6897eccb01b2013180adaa08a9ab7aa4d6d21b86753558d59bfc5cdf6462099fa08d2f9926f947e19efaaa3a03f3d3c226ffd088516d34893e299e8668de094e9eb6bc4d5c6702a2cdfa05f49a0a01fe57b6491d393642d78c4618cfaaba2f9e2aa194df17388c9569d5be1a477a0c904cae4342a3bcac4e1700a5f901d0879e94a7e2d1082d8990e20ce464a0541a02b3d64d2e068605ca040e9103399faaea2ea9e284b96a19b3bdf0c1ae1de2230a045cce42efa11fd4a7f95c21012c8879203778000bc38556007516cc151461a69a00577c3ce742dca1da3c9c2c542c7ec20acc55406cc404d163fa9574ca7cdeccea09ee9a7f476c1c39bcd9a50f8b231bee5eed6c5273bbe95ffc04b5b9512e3a5b2a09161fba8cdba31283ae38d8c0de3f1d6675522131a2e8726ceb3b1773759903ea0c6f5c701c23ece33240cbe3539ee4afdc5590abf087886b4ae5a29cb2523a388a0829e7c083af857745e4e54c14e16a823bc12090cdf913f952b6d5afc64f9ffe5a09a051df8aad5a6ad9a3eb241d266d61e77b318de293e4f5f3335581223fc8ff780f85180808080808080808080808080a074b0f7f831046999c3342bfcd97053d5a13a31cc36ddd65c41335a6ee5dc1548a010b1794fd0066616139058ceb6c74d1c19e630d1ed64f837c4897f10a92348d88080f869a02042d8b40f065e9e1bded8dc1a2a8c76ce8b0df1433d43d604232bdb8464f9e6b846f8440180a039e8b39bf2488c61e195cae0fcb153f35079540fc3d41ce3c312b5f0e7cf1312a07f79b8b370510aa3a9ea8536a9459c92de9493272cd5fe45c02364cfe254a9a7", - "expectedTimestamp": 1776881175, - "expectedStorageRoot": "0x39e8b39bf2488c61e195cae0fcb153f35079540fc3d41ce3c312b5f0e7cf1312", + "height": 34, + "headerRlp": "0xf90385a07ee4185f15b458dcff8936e722e3792ddf28a3f6801ce06374969f54031b762aa01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d493479420c5edbcf6263cd9e30df395a2b914f6e939b9baa030defd9bc19472d5ccbb248e391b49320a77fd71652b0bafeddb78725ef28515a078e6f2f4fe203157e3d5c67a75ce82947103e360cc17f0a3d60e38b6c552a08aa00149f44a46b46c6429cf561eda5e72322b31debaa8ff69357298cb2e8206a524b901001000000000000000000000000004000000000000000000000000000000000000008000000000000010000000000000000000000000000000000000000020000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000002008000000000000000000000000020000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000001228402faf08082b349846a88e87bb90147f90144a0000000000000000000000000000000000000000000626573752032362e342e30f85494065f139d8a49e9926232cc4435159024cb5064fc940eb968de631abc65322ecdca5dfdf9c6296e52f49420c5edbcf6263cd9e30df395a2b914f6e939b9ba94543d3796700ee35803a1c43562a69fec08e1e423c080f8c9b8410e4196ae86251b9ad1f92ccd0deb5c615f5d5f55d32fd232b303bdd8e18c6e806ee612e50f641ec37026ccfb294ed1631bf0c7eac49b710fe2e66fd4082d356401b841e0646ce5a4c2005b25d182bbdd0c22022156e007d243699b9f928d58e6cd9ffe6613aaf033ec261c48c224fa1cba87886161aae03362de1fcc3871b3da3c70f600b84142ce15667100923022aa210debed209729367078b1fc71108f8dcfaa7c102032012fb03c701e8c854062fb4281e9dda4509932121a33dbb79ec0a47a4f738ff800a063746963616c2062797a616e74696e65206661756c7420746f6c6572616e636588000000000000000080a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b4218080a00000000000000000000000000000000000000000000000000000000000000000", + "trustedHeight": 33, + "accountProof": "0xf902b2f901f1a0886aec3477fe3ac6276485bfaf3e5e1eea382e6911831691f50c734edcea799e80a08573bfe9264ed8b6afc58b400efeaae64f1d56bc8396d44a2dcfd17a9c14b7a2a092450fe708c280f7c52ea0eeb14974139fd3d4dcc7cc77a37fcafbe187480ea3a01d272d6cf8f93bc15533e54ea3f459a982fc32e1272d95cf1d0cde1361463cfda0682e0509d82289dcb84f9d366ed881bfe4655d3c15de298e3d6fe4183d7051cca0e8fbbb10bb2183848e739cd3654a1ff083ca953bee3b58fd56b063f810cf1722a074a59b1b84fc35ff94e4f762b894b113da5941ca99e21df30783140f4a33b1cca0014abed6a424575260405210754b1aa0d4cabe50e8616ac231e424973fc0a895a08d662e3f7d019145626a3d1e9d29c1ce0a98d49c8cd6a5c85398f6acbe83e23ea0397a811f344f0827d373cddaaac7063a83ed8a127e56864b2491774c97d01912a0ccca73c8748a8ec56ef293bee631a7d21ef1e1ec8b053e976f6ef3faa50187fba0613dbbef57a2660c21ec8c864749de69ac0bc4b59f6aef6477a090fdd51f467aa090c93d47b38631bbdc1156f9e0caa1eaaf5bd87827b8535e097ad48b274bc01ca05edc383ad614e86f1da2e1a91d7e85ae5ab1d098a0d47623ef13d49d02754f8ea0c345faa773370853ac7afa5d32956ce53465ceac1e060e424343b39d9793397680f8518080a065c2085561952935fde3dfd4a299d8d01d46529c6d3f69aaac4134c61e4cab3a808080808080808080a0df2fc47ed0c87770a1fbcd193fbba94e57e0aa2a3d3960a8daa84dd1fc39d76e80808080f869a020b221f4fe86714230ec6dfaf784ee106a9f8901d542e537af01e28564065574b846f8440180a02f39a2a5a30e1d6251aa6cbe8e47d8f8e2f01ebf00fb76e96abf17f5555089fca07f79b8b370510aa3a9ea8536a9459c92de9493272cd5fe45c02364cfe254a9a7", + "expectedTimestamp": 1787357307, + "expectedStorageRoot": "0x2f39a2a5a30e1d6251aa6cbe8e47d8f8e2f01ebf00fb76e96abf17f5555089fc", "expectedValidators": [ "0x065f139d8A49E9926232Cc4435159024cb5064FC", "0x0EB968DE631aBC65322EcDCa5DfDF9C6296e52f4", @@ -26,12 +26,12 @@ ] }, "updateHeight12": { - "height": 28, - "headerRlp": "0xf90342a0ed92bb528c7dd294ab7549dd6dac0fd5ee7154cabc6bd0c90f5fc7dc28c091eba01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d4934794065f139d8a49e9926232cc4435159024cb5064fca0b539b4896ff6a05822d22b29bb0f0c4153195183737a960eebc5e68827e8e5a0a0531d147c255cdb580ed377518263f5b6612f60e521585349b4b3ebee2cafed4ba02e6b1579393feba9511fa8bda2ab22b3b5aa0d5334a5ae88572f543b5ff68c1ab9010000000000000000088000000400000000000000000000000000000004000000400000000000000000800000000000000000000400008000040000000002040000000000000000000000000008001000000000000000040000000000020000000000000000000000000000000000000000000000080000200200000010000000000000000000001000000840000002080008000000000080000000000000000000000000000000001000000000000000000000000000000000000000000000000000800102000000000000100001000000000000000004000000800800000040000000000000000000001008000000000000000001000000000000000000000000011c8402faf08083067b0d8469e90e19b90147f90144a0000000000000000000000000000000000000000000626573752032352e342e31f85494065f139d8a49e9926232cc4435159024cb5064fc940eb968de631abc65322ecdca5dfdf9c6296e52f49420c5edbcf6263cd9e30df395a2b914f6e939b9ba94543d3796700ee35803a1c43562a69fec08e1e423c080f8c9b841b8e618346b5a5334c7fe3b652abd1493d0dc310c16cbd1f529e076ef2b1de8e63ce988e82abf4c8a6213006d38825391f1f6979492743e5046260c5a3d075b8501b84167d2015303744bb3ec25cb5b82a00964bb3ca2d5d0d7a723bff98c86abf86ebd041d20b39266a47b0de4a2faf0f2dc1930fcaee4480cd06b1e0c7cff888b72c901b8414ca7f6523abb401d701bf6c1d48d21e97fdd62df72a0c1978ec5dd20f494dd884a22dc551a8dc91439ad76ce6368e7bc2c30fcc31f132ba2c321c1c11b42cfed00a063746963616c2062797a616e74696e65206661756c7420746f6c6572616e636588000000000000000080", - "trustedHeight": 26, - "accountProof": "0xf902d2f90211a0578967a3c34ade0f095d67cc40ef701bc8a246d51705d0a6efa4ed09d63dd20aa0fdddfaa3686c209cf29f450b628a265bcec7322f41aece682d2783985d7c8572a0613bb9dbc25038f26fbdfe24fe22db94483a5989d10c31287f24023098f4b639a0fe624ba863bd1da723c27a7beebac3da9268c9dc3be6897eccb01b2013180adaa05a1a54fc2941666b81309313fbef1c25d75d0eca227dd94df58511e853907265a03f3d3c226ffd088516d34893e299e8668de094e9eb6bc4d5c6702a2cdfa05f49a0a01fe57b6491d393642d78c4618cfaaba2f9e2aa194df17388c9569d5be1a477a0c904cae4342a3bcac4e1700a5f901d0879e94a7e2d1082d8990e20ce464a0541a02b3d64d2e068605ca040e9103399faaea2ea9e284b96a19b3bdf0c1ae1de2230a045cce42efa11fd4a7f95c21012c8879203778000bc38556007516cc151461a69a00577c3ce742dca1da3c9c2c542c7ec20acc55406cc404d163fa9574ca7cdeccea0c450833b6cc6fa43152f3ec491f1613f469eb12d3d34437b4175719c63167a7fa09161fba8cdba31283ae38d8c0de3f1d6675522131a2e8726ceb3b1773759903ea0c6f5c701c23ece33240cbe3539ee4afdc5590abf087886b4ae5a29cb2523a388a0ff4fd9d6fb101fd9d0fd0b9febf52dc5ec616c5926441a7141899cbfb73dff26a09a051df8aad5a6ad9a3eb241d266d61e77b318de293e4f5f3335581223fc8ff780f85180808080808080808080808080a01629b71d649dccdf7987c5b10734677263c1a2275fc3915983f619e3c8120537a02f545c5b4c61204ae78295a00b9e7e94d794ea8e65353153970f9506365205898080f869a02042d8b40f065e9e1bded8dc1a2a8c76ce8b0df1433d43d604232bdb8464f9e6b846f8440180a0e5bbd74ef068c4956fc223d08a6623709e5d08b902032b85d59e84256349cc97a07f79b8b370510aa3a9ea8536a9459c92de9493272cd5fe45c02364cfe254a9a7", - "expectedTimestamp": 1776881177, - "expectedStorageRoot": "0xe5bbd74ef068c4956fc223d08a6623709e5d08b902032b85d59e84256349cc97", + "height": 35, + "headerRlp": "0xf90386a0e8eb81a5cc7e4bc105561f792aed8d6ed967305e1460902b48544d9198519a65a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d4934794543d3796700ee35803a1c43562a69fec08e1e423a00bcab205a2b4819b25f76797dc4582c3818a56731f31904884f817a1a27fa442a0faa58af4eab20011acc6e66b20b1bc8a8d8b444e62e76b6e49fa790284a6538fa08e05526631e8b9e7f21d1d65cfdef62d8ac6d6d11050db08db39741243eed4eeb901001000000000000008800000000004000000000000000000001000000000000000008000000000000010000000000000400000040000000000000000000204000000000040000000000000020800100400800000000004100000000002000000000000000000000000800001000000000000000008000000000000001000000000000000000000100000080000000008000800000000008000000000000000000000000000000000000004000000000000000000000000000000000000000000000010000200000000000010004000000000000000000400000080000000004000000000000000000000000800000008000000000000000000000000000000000001238402faf0808306784b846a88e87db90147f90144a0000000000000000000000000000000000000000000626573752032362e342e30f85494065f139d8a49e9926232cc4435159024cb5064fc940eb968de631abc65322ecdca5dfdf9c6296e52f49420c5edbcf6263cd9e30df395a2b914f6e939b9ba94543d3796700ee35803a1c43562a69fec08e1e423c080f8c9b841eae1fc67c37231c16d0db99ee0b2ef4e72351cccfad04fac8cd3a425e4adf73660f50280839ad121cbc89d352bb2b199b4ee44edfe19db2321933daedd261d9900b841328d044bbe376b4be8495b33faebea0bbfaf40f9c37604ef9d8fe49243cf7f4f2274fafe780d9a0d63e5177f25ecb4fa40382e767856a424467102ef8795530a01b841ad76a8c3edacc84e6341df92e64b3e1756c90bd8cb0d5c9194bf330c80da5e217ec191891813deb925a4b2d012cf919e561ac37359f1788abc589042ac115d9001a063746963616c2062797a616e74696e65206661756c7420746f6c6572616e636588000000000000000080a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b4218080a00000000000000000000000000000000000000000000000000000000000000000", + "trustedHeight": 33, + "accountProof": "0xf902b2f901f1a0886aec3477fe3ac6276485bfaf3e5e1eea382e6911831691f50c734edcea799e80a08573bfe9264ed8b6afc58b400efeaae64f1d56bc8396d44a2dcfd17a9c14b7a2a0174fa4f59759c5446865fa6777e34929c1bc09c97412a84c064dd7864ed625e7a01d272d6cf8f93bc15533e54ea3f459a982fc32e1272d95cf1d0cde1361463cfda0682e0509d82289dcb84f9d366ed881bfe4655d3c15de298e3d6fe4183d7051cca0bbb94f73543a77ce1f2e90a6ab92e5a6911e5af84dc8e1bcc33a0b20e10a2c5ba0fd265a27de5e8596bb6acaaf60ace61e3a9e724f75a7543af8b738754199998fa0014abed6a424575260405210754b1aa0d4cabe50e8616ac231e424973fc0a895a060bd3b16ddfd75eae7933b7d0dbf717adb2c8b16573d4706eec89b33a71be71ca00e4d3a60002f359ab48688dc19ebd727bccb488984e27264d91bcba10302b7faa0ccca73c8748a8ec56ef293bee631a7d21ef1e1ec8b053e976f6ef3faa50187fba0613dbbef57a2660c21ec8c864749de69ac0bc4b59f6aef6477a090fdd51f467aa090c93d47b38631bbdc1156f9e0caa1eaaf5bd87827b8535e097ad48b274bc01ca05edc383ad614e86f1da2e1a91d7e85ae5ab1d098a0d47623ef13d49d02754f8ea0c345faa773370853ac7afa5d32956ce53465ceac1e060e424343b39d9793397680f8518080a090a8eabac86b7acb55ccec8235f1372ffaa1bd13b53a97089bc04c4f48fb0620808080808080808080a0df2fc47ed0c87770a1fbcd193fbba94e57e0aa2a3d3960a8daa84dd1fc39d76e80808080f869a020b221f4fe86714230ec6dfaf784ee106a9f8901d542e537af01e28564065574b846f8440180a04bbf8536a690306e276e29d183d17b249edb483a00dd9ad732552be38f8e6301a07f79b8b370510aa3a9ea8536a9459c92de9493272cd5fe45c02364cfe254a9a7", + "expectedTimestamp": 1787357309, + "expectedStorageRoot": "0x4bbf8536a690306e276e29d183d17b249edb483a00dd9ad732552be38f8e6301", "expectedValidators": [ "0x065f139d8A49E9926232Cc4435159024cb5064FC", "0x0EB968DE631aBC65322EcDCa5DfDF9C6296e52f4", @@ -40,58 +40,34 @@ ] }, "lowQuorumHeight12": { - "height": 28, - "headerRlp": "0xf902ffa0ed92bb528c7dd294ab7549dd6dac0fd5ee7154cabc6bd0c90f5fc7dc28c091eba01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d4934794065f139d8a49e9926232cc4435159024cb5064fca0b539b4896ff6a05822d22b29bb0f0c4153195183737a960eebc5e68827e8e5a0a0531d147c255cdb580ed377518263f5b6612f60e521585349b4b3ebee2cafed4ba02e6b1579393feba9511fa8bda2ab22b3b5aa0d5334a5ae88572f543b5ff68c1ab9010000000000000000088000000400000000000000000000000000000004000000400000000000000000800000000000000000000400008000040000000002040000000000000000000000000008001000000000000000040000000000020000000000000000000000000000000000000000000000080000200200000010000000000000000000001000000840000002080008000000000080000000000000000000000000000000001000000000000000000000000000000000000000000000000000800102000000000000100001000000000000000004000000800800000040000000000000000000001008000000000000000001000000000000000000000000011c8402faf08083067b0d8469e90e19b90104f90101a0000000000000000000000000000000000000000000626573752032352e342e31f85494065f139d8a49e9926232cc4435159024cb5064fc940eb968de631abc65322ecdca5dfdf9c6296e52f49420c5edbcf6263cd9e30df395a2b914f6e939b9ba94543d3796700ee35803a1c43562a69fec08e1e423c080f886b841b8e618346b5a5334c7fe3b652abd1493d0dc310c16cbd1f529e076ef2b1de8e63ce988e82abf4c8a6213006d38825391f1f6979492743e5046260c5a3d075b8501b84167d2015303744bb3ec25cb5b82a00964bb3ca2d5d0d7a723bff98c86abf86ebd041d20b39266a47b0de4a2faf0f2dc1930fcaee4480cd06b1e0c7cff888b72c901a063746963616c2062797a616e74696e65206661756c7420746f6c6572616e636588000000000000000080", - "trustedHeight": 26, - "accountProof": "0xf902d2f90211a0578967a3c34ade0f095d67cc40ef701bc8a246d51705d0a6efa4ed09d63dd20aa0fdddfaa3686c209cf29f450b628a265bcec7322f41aece682d2783985d7c8572a0613bb9dbc25038f26fbdfe24fe22db94483a5989d10c31287f24023098f4b639a0fe624ba863bd1da723c27a7beebac3da9268c9dc3be6897eccb01b2013180adaa05a1a54fc2941666b81309313fbef1c25d75d0eca227dd94df58511e853907265a03f3d3c226ffd088516d34893e299e8668de094e9eb6bc4d5c6702a2cdfa05f49a0a01fe57b6491d393642d78c4618cfaaba2f9e2aa194df17388c9569d5be1a477a0c904cae4342a3bcac4e1700a5f901d0879e94a7e2d1082d8990e20ce464a0541a02b3d64d2e068605ca040e9103399faaea2ea9e284b96a19b3bdf0c1ae1de2230a045cce42efa11fd4a7f95c21012c8879203778000bc38556007516cc151461a69a00577c3ce742dca1da3c9c2c542c7ec20acc55406cc404d163fa9574ca7cdeccea0c450833b6cc6fa43152f3ec491f1613f469eb12d3d34437b4175719c63167a7fa09161fba8cdba31283ae38d8c0de3f1d6675522131a2e8726ceb3b1773759903ea0c6f5c701c23ece33240cbe3539ee4afdc5590abf087886b4ae5a29cb2523a388a0ff4fd9d6fb101fd9d0fd0b9febf52dc5ec616c5926441a7141899cbfb73dff26a09a051df8aad5a6ad9a3eb241d266d61e77b318de293e4f5f3335581223fc8ff780f85180808080808080808080808080a01629b71d649dccdf7987c5b10734677263c1a2275fc3915983f619e3c8120537a02f545c5b4c61204ae78295a00b9e7e94d794ea8e65353153970f9506365205898080f869a02042d8b40f065e9e1bded8dc1a2a8c76ce8b0df1433d43d604232bdb8464f9e6b846f8440180a0e5bbd74ef068c4956fc223d08a6623709e5d08b902032b85d59e84256349cc97a07f79b8b370510aa3a9ea8536a9459c92de9493272cd5fe45c02364cfe254a9a7", - "expectedTimestamp": 1776881177, - "expectedStorageRoot": "0xe5bbd74ef068c4956fc223d08a6623709e5d08b902032b85d59e84256349cc97", - "expectedValidators": [ - "0x065f139d8A49E9926232Cc4435159024cb5064FC", - "0x0EB968DE631aBC65322EcDCa5DfDF9C6296e52f4", - "0x20C5eDBCf6263Cd9E30Df395A2B914F6E939B9Ba", - "0x543d3796700eE35803A1C43562a69FEc08E1e423" - ] + "height": 35, + "headerRlp": "0xf90343a0e8eb81a5cc7e4bc105561f792aed8d6ed967305e1460902b48544d9198519a65a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d4934794543d3796700ee35803a1c43562a69fec08e1e423a00bcab205a2b4819b25f76797dc4582c3818a56731f31904884f817a1a27fa442a0faa58af4eab20011acc6e66b20b1bc8a8d8b444e62e76b6e49fa790284a6538fa08e05526631e8b9e7f21d1d65cfdef62d8ac6d6d11050db08db39741243eed4eeb901001000000000000008800000000004000000000000000000001000000000000000008000000000000010000000000000400000040000000000000000000204000000000040000000000000020800100400800000000004100000000002000000000000000000000000800001000000000000000008000000000000001000000000000000000000100000080000000008000800000000008000000000000000000000000000000000000004000000000000000000000000000000000000000000000010000200000000000010004000000000000000000400000080000000004000000000000000000000000800000008000000000000000000000000000000000001238402faf0808306784b846a88e87db90104f90101a0000000000000000000000000000000000000000000626573752032362e342e30f85494065f139d8a49e9926232cc4435159024cb5064fc940eb968de631abc65322ecdca5dfdf9c6296e52f49420c5edbcf6263cd9e30df395a2b914f6e939b9ba94543d3796700ee35803a1c43562a69fec08e1e423c080f886b841eae1fc67c37231c16d0db99ee0b2ef4e72351cccfad04fac8cd3a425e4adf73660f50280839ad121cbc89d352bb2b199b4ee44edfe19db2321933daedd261d9900b841328d044bbe376b4be8495b33faebea0bbfaf40f9c37604ef9d8fe49243cf7f4f2274fafe780d9a0d63e5177f25ecb4fa40382e767856a424467102ef8795530a01a063746963616c2062797a616e74696e65206661756c7420746f6c6572616e636588000000000000000080a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b4218080a00000000000000000000000000000000000000000000000000000000000000000", + "trustedHeight": 33, + "accountProof": "0x" }, "conflictingHeight12": { - "height": 28, - "headerRlp": "0xf90342a0a4fea040b164e3124ce98bb10504b7e0cccb1c96d33771ad2e6cfb67c6af1ff8a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347940eb968de631abc65322ecdca5dfdf9c6296e52f4a023500982a7c26a66dc297595b6e9fbb11b233eb8845bf8d613480a1d56bf7356a0ca819893c48c0aeaf83f32239163af46319f10722b09ba3636b474a1667ff6b6a018d442f3aa613b0cd1ceb1108213283b3191746d8f34766bd6d0c46ab1fcb070b9010000000000000000000000000000000000000000000000000000000000000000400400000000000000000000000000000000000000000000040000000002040000000000000000000000000000080000000000000000040000000000020000000000000000000000000000000000000002000000000000000000000000000000000000000000001800000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000002000000000001000000000000000000000000000000000000000000000011c8402faf080830b05a98469e90e1bb90147f90144a0000000000000000000000000000000000000000000626573752032352e342e31f85494065f139d8a49e9926232cc4435159024cb5064fc940eb968de631abc65322ecdca5dfdf9c6296e52f49420c5edbcf6263cd9e30df395a2b914f6e939b9ba94543d3796700ee35803a1c43562a69fec08e1e423c080f8c9b8414e11f05453d660f69ef200e325642fa2f38d38cd8c7ce9db58c0bccf624ccc0f697c06400bfa524ef67f82e677e441fc4d8bb06d2c8234b57a10385b33fa511500b8412f87310ed3249599d4e4e2709155973c323ba2a2126168c02c758439b948084f2fdeca53315727a6a1443ca2c7effc80fb917d1d30f77538acb5bbe0868fc4ba00b841cffac71947d2446ceaba6619cf7207b644f6d18564f3120d355763d66e4ac2b74c595129a961be0e0fa09a9a1c27ca87f90adf808eb7a04cd82f0b8e8e7e196b00a063746963616c2062797a616e74696e65206661756c7420746f6c6572616e636588000000000000000080", - "trustedHeight": 26, - "accountProof": "0xf902d2f90211a091b398cc201401fbcf9753f8f6423b7cd8e19f2561d78dbf4d192953fbe3e8b7a0fdddfaa3686c209cf29f450b628a265bcec7322f41aece682d2783985d7c8572a0613bb9dbc25038f26fbdfe24fe22db94483a5989d10c31287f24023098f4b639a0fe624ba863bd1da723c27a7beebac3da9268c9dc3be6897eccb01b2013180adaa05a1a54fc2941666b81309313fbef1c25d75d0eca227dd94df58511e853907265a03f3d3c226ffd088516d34893e299e8668de094e9eb6bc4d5c6702a2cdfa05f49a0a01fe57b6491d393642d78c4618cfaaba2f9e2aa194df17388c9569d5be1a477a0c904cae4342a3bcac4e1700a5f901d0879e94a7e2d1082d8990e20ce464a0541a02b3d64d2e068605ca040e9103399faaea2ea9e284b96a19b3bdf0c1ae1de2230a045cce42efa11fd4a7f95c21012c8879203778000bc38556007516cc151461a69a00577c3ce742dca1da3c9c2c542c7ec20acc55406cc404d163fa9574ca7cdeccea0c450833b6cc6fa43152f3ec491f1613f469eb12d3d34437b4175719c63167a7fa0733fe251e04519660b9f7df9ec9ad99d19767dfee5899fde96bb8c6ff4fe52f1a0c6f5c701c23ece33240cbe3539ee4afdc5590abf087886b4ae5a29cb2523a388a0ff4fd9d6fb101fd9d0fd0b9febf52dc5ec616c5926441a7141899cbfb73dff26a085d68ac5b64bd28a195ed65c08ece7c598001ccd7eca412c62659a9a313a2f2580f85180808080808080808080808080a01629b71d649dccdf7987c5b10734677263c1a2275fc3915983f619e3c8120537a0be3bcad4d55a33322e11ceca10b68c3ff08d259de19f389fc6f542e277872d578080f869a02042d8b40f065e9e1bded8dc1a2a8c76ce8b0df1433d43d604232bdb8464f9e6b846f8440180a0b3d9c4e8c2b0e5400037dab506d23e3284286bcb3752e60811520049866f1082a07f79b8b370510aa3a9ea8536a9459c92de9493272cd5fe45c02364cfe254a9a7", - "expectedTimestamp": 1776881179, - "expectedStorageRoot": "0xb3d9c4e8c2b0e5400037dab506d23e3284286bcb3752e60811520049866f1082", - "expectedValidators": [ - "0x065f139d8A49E9926232Cc4435159024cb5064FC", - "0x0EB968DE631aBC65322EcDCa5DfDF9C6296e52f4", - "0x20C5eDBCf6263Cd9E30Df395A2B914F6E939B9Ba", - "0x543d3796700eE35803A1C43562a69FEc08E1e423" - ] + "height": 35, + "headerRlp": "0xf90386a084d5dbd206ef4a465f66c8b14ce809687baa221677a986bc15ec5b99b8579e8da01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d4934794065f139d8a49e9926232cc4435159024cb5064fca02bbf0aa2342ab306dda9aa494f3ffe8a2fb2ebd327bf99fe2f4609e5d56a287fa0ede1198cf1f6072bfe88d1beabbbb3ceefda3094b5b6ca1aa0e50e5aa58d5aa0a0c2f035f70c9a89c2f0fbf3b4fad07d005b637eaaf0ae084de4a189de91414442b901000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000400000000000000000000000000204000000000000000000000000000008000000000000000004000000000002000000000000000000000000000000000000000200000000000000000000000000000000000000000000180000000000000000000000000000000000000000000000000000000100000000000004000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000004000000000200000000000000000000000000000000000000000000000000000000001238402faf080830b245a846a88e87fb90147f90144a0000000000000000000000000000000000000000000626573752032362e342e30f85494065f139d8a49e9926232cc4435159024cb5064fc940eb968de631abc65322ecdca5dfdf9c6296e52f49420c5edbcf6263cd9e30df395a2b914f6e939b9ba94543d3796700ee35803a1c43562a69fec08e1e423c080f8c9b841fa5785d98739747d89cb99b923440ce46a4d1c66c9cf9d1171a6b70bbaeeecf3000da2ce63d7c7e284da788bade5423ad89ca27b009cc5ab25f3d164e829b6bd01b841b05d0d27772ddb76da6b8094d099b4e6b158290825c7756f583be9fa887f0c9d528cb2cdfaa9147dbca6f947a97e488226bc4e0253a6f8a724b2b2a8eecd16fc00b8419e75966c499c86f1178194190c747387a0e70cdb7eb0a826896b66781fe381074df6b59ae6320464d9c5ad6417157390a8278bded19f5965b110edf22f684af500a063746963616c2062797a616e74696e65206661756c7420746f6c6572616e636588000000000000000080a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b4218080a00000000000000000000000000000000000000000000000000000000000000000", + "trustedHeight": 33, + "accountProof": "0xf902b2f901f1a0886aec3477fe3ac6276485bfaf3e5e1eea382e6911831691f50c734edcea799e80a08573bfe9264ed8b6afc58b400efeaae64f1d56bc8396d44a2dcfd17a9c14b7a2a0174fa4f59759c5446865fa6777e34929c1bc09c97412a84c064dd7864ed625e7a01d272d6cf8f93bc15533e54ea3f459a982fc32e1272d95cf1d0cde1361463cfda0682e0509d82289dcb84f9d366ed881bfe4655d3c15de298e3d6fe4183d7051cca0f9b17a214dc86111bc5c9310d57aac2486dd4eda6ae8da9caa0bb2185b4015b9a060613dc1091a24ed1576c9103e09c5267bf509441384562347123960d496cc8ba0014abed6a424575260405210754b1aa0d4cabe50e8616ac231e424973fc0a895a060bd3b16ddfd75eae7933b7d0dbf717adb2c8b16573d4706eec89b33a71be71ca00e4d3a60002f359ab48688dc19ebd727bccb488984e27264d91bcba10302b7faa0ccca73c8748a8ec56ef293bee631a7d21ef1e1ec8b053e976f6ef3faa50187fba0613dbbef57a2660c21ec8c864749de69ac0bc4b59f6aef6477a090fdd51f467aa034d7ac756aa6ef347f0e3dc9a6f4db4409baca5d1e7d75dbff0842795d3b3d11a05edc383ad614e86f1da2e1a91d7e85ae5ab1d098a0d47623ef13d49d02754f8ea0c345faa773370853ac7afa5d32956ce53465ceac1e060e424343b39d9793397680f8518080a0f3ae7979f8d7015e2141c041cec64bc388a9362583c0e9014baec75c098bbe24808080808080808080a0df2fc47ed0c87770a1fbcd193fbba94e57e0aa2a3d3960a8daa84dd1fc39d76e80808080f869a020b221f4fe86714230ec6dfaf784ee106a9f8901d542e537af01e28564065574b846f8440180a061734a2ddcb2c34ad14a2bb4f7326dc4fa7e4dd4c6be97ba2e2d2fdd03b77f20a07f79b8b370510aa3a9ea8536a9459c92de9493272cd5fe45c02364cfe254a9a7" }, "lowOverlapHeight13": { - "height": 29, - "headerRlp": "0xf90342a0a4fea040b164e3124ce98bb10504b7e0cccb1c96d33771ad2e6cfb67c6af1ff8a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347940eb968de631abc65322ecdca5dfdf9c6296e52f4a023500982a7c26a66dc297595b6e9fbb11b233eb8845bf8d613480a1d56bf7356a0ca819893c48c0aeaf83f32239163af46319f10722b09ba3636b474a1667ff6b6a018d442f3aa613b0cd1ceb1108213283b3191746d8f34766bd6d0c46ab1fcb070b9010000000000000000000000000000000000000000000000000000000000000000400400000000000000000000000000000000000000000000040000000002040000000000000000000000000000080000000000000000040000000000020000000000000000000000000000000000000002000000000000000000000000000000000000000000001800000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000002000000000001000000000000000000000000000000000000000000000011d8402faf080830b05a98469e90e1bb90147f90144a0000000000000000000000000000000000000000000626573752032352e342e31f85494065f139d8a49e9926232cc4435159024cb5064fc9446a5b7e742f9ad777ef8bb85aebc717e7433dc47946af3e238490ca4b6ae4f1efdf12c04cc160423c3941780ffe5324fe74e6f2ef012edc9bd205e74555bc080f8c9b8414af174c06abf4918523a17a4f191b958e912a0bbfa3fe0d9cd0f1a602b70467f0a28e7ec749ec23b23299e2e2f13cf4aeffd3af2ff9a9daaada88654adff435600b84150b90a3c1d4f7a0f6d803a94b1aaa4130644330a9ea6ff1e44cc3fb6f94cbc7721391f955e2d5a136403742fe21ee1a6fe0c600c1f4aa29f45385aa450990d1300b841f72ee63cc565b1fc8ecd929a023fa28d95334cb8b8344ae7e4b31d326efa77f53bd3e97e80e64a1505c80ff31d778968fa6a97b744576913022e776bc15ec06d01a063746963616c2062797a616e74696e65206661756c7420746f6c6572616e636588000000000000000080", - "trustedHeight": 26, - "accountProof": "0xf902d2f90211a091b398cc201401fbcf9753f8f6423b7cd8e19f2561d78dbf4d192953fbe3e8b7a0fdddfaa3686c209cf29f450b628a265bcec7322f41aece682d2783985d7c8572a0613bb9dbc25038f26fbdfe24fe22db94483a5989d10c31287f24023098f4b639a0fe624ba863bd1da723c27a7beebac3da9268c9dc3be6897eccb01b2013180adaa05a1a54fc2941666b81309313fbef1c25d75d0eca227dd94df58511e853907265a03f3d3c226ffd088516d34893e299e8668de094e9eb6bc4d5c6702a2cdfa05f49a0a01fe57b6491d393642d78c4618cfaaba2f9e2aa194df17388c9569d5be1a477a0c904cae4342a3bcac4e1700a5f901d0879e94a7e2d1082d8990e20ce464a0541a02b3d64d2e068605ca040e9103399faaea2ea9e284b96a19b3bdf0c1ae1de2230a045cce42efa11fd4a7f95c21012c8879203778000bc38556007516cc151461a69a00577c3ce742dca1da3c9c2c542c7ec20acc55406cc404d163fa9574ca7cdeccea0c450833b6cc6fa43152f3ec491f1613f469eb12d3d34437b4175719c63167a7fa0733fe251e04519660b9f7df9ec9ad99d19767dfee5899fde96bb8c6ff4fe52f1a0c6f5c701c23ece33240cbe3539ee4afdc5590abf087886b4ae5a29cb2523a388a0ff4fd9d6fb101fd9d0fd0b9febf52dc5ec616c5926441a7141899cbfb73dff26a085d68ac5b64bd28a195ed65c08ece7c598001ccd7eca412c62659a9a313a2f2580f85180808080808080808080808080a01629b71d649dccdf7987c5b10734677263c1a2275fc3915983f619e3c8120537a0be3bcad4d55a33322e11ceca10b68c3ff08d259de19f389fc6f542e277872d578080f869a02042d8b40f065e9e1bded8dc1a2a8c76ce8b0df1433d43d604232bdb8464f9e6b846f8440180a0b3d9c4e8c2b0e5400037dab506d23e3284286bcb3752e60811520049866f1082a07f79b8b370510aa3a9ea8536a9459c92de9493272cd5fe45c02364cfe254a9a7", - "expectedTimestamp": 1776881179, - "expectedStorageRoot": "0xb3d9c4e8c2b0e5400037dab506d23e3284286bcb3752e60811520049866f1082", - "expectedValidators": [ - "0x065f139d8A49E9926232Cc4435159024cb5064FC", - "0x46a5B7E742F9ad777EF8Bb85AEBc717E7433Dc47", - "0x6aF3E238490CA4b6aE4F1eFdF12C04CC160423c3", - "0x1780FFe5324FE74e6F2EF012EDC9bD205e74555B" - ] + "height": 36, + "headerRlp": "0xf90386a084d5dbd206ef4a465f66c8b14ce809687baa221677a986bc15ec5b99b8579e8da01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d4934794065f139d8a49e9926232cc4435159024cb5064fca02bbf0aa2342ab306dda9aa494f3ffe8a2fb2ebd327bf99fe2f4609e5d56a287fa0ede1198cf1f6072bfe88d1beabbbb3ceefda3094b5b6ca1aa0e50e5aa58d5aa0a0c2f035f70c9a89c2f0fbf3b4fad07d005b637eaaf0ae084de4a189de91414442b901000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000400000000000000000000000000204000000000000000000000000000008000000000000000004000000000002000000000000000000000000000000000000000200000000000000000000000000000000000000000000180000000000000000000000000000000000000000000000000000000100000000000004000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000004000000000200000000000000000000000000000000000000000000000000000000001248402faf080830b245a846a88e87fb90147f90144a0000000000000000000000000000000000000000000626573752032362e342e30f85494065f139d8a49e9926232cc4435159024cb5064fc9446a5b7e742f9ad777ef8bb85aebc717e7433dc47946af3e238490ca4b6ae4f1efdf12c04cc160423c3941780ffe5324fe74e6f2ef012edc9bd205e74555bc080f8c9b8411abc319e0b1a343bf29a207a0369df6b6869c7cd07611807e5ad78e514033fa700cafa3268fba741f02366e7fa5fb7c86074a5edac1da2b602a77f3b81bb33fa00b841f58c52cac0586900e5222700194f1c1745d0d1840f8e7f69b9cc3739da58d67a680b35b14ca35a8cc997e8cc8f05a22503349d897eaec6343bd6255f8dcd349101b841a22b308f750cc54f70abbe43c53310e9c774d652ee79ef1f08ec0ae44d2204331bbb8944e223f0f79455dfa52dcf4af24ae16e333db6c859728253fb2dcb7e9401a063746963616c2062797a616e74696e65206661756c7420746f6c6572616e636588000000000000000080a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b4218080a00000000000000000000000000000000000000000000000000000000000000000", + "trustedHeight": 33, + "accountProof": "0x" }, "membership": { - "proof": "0xf90159f90111a0e442138baf418fa0ed3a49e2d6e5cc173302db813570b4d7198669f05b8d34f780a04e510de4b9ef26070bc6f70273e868c69edbaf19a2517970a5dbd69902e1d434a0dde632f9a63c5d15111a239c3ab8e60c6ad42b937c78933d342e4b38632ecddfa078e97f4542b6ddc4349f8c953157ff559c14a6518eddf1212dbd5f15c6ec240da08bd4e17fccf748e41c20ea5e847696758313810b6e9c8c7fe02e5aefaa4b5b3580a0a1c9ae22f30d2511c9ebab94c8f089a794b16dfb0de7e544a0a608a9a247e1e0a00e8d54ce26b8005c92ece298e21e9c7d1225e884addcdfbea2ead81c551df8928080808080a028d7dc5ba83020579a12100e30fafb74f3c03531f786808a733392cd565ef0668080f843a0369632698e78112a478dabed541f773d2f5a93186d9d3b9d9774b73bf9018b08a1a012e79bf5f3d918d5d3899fe7547967eeb785697d54be29513c1695d8b82f8a5e", - "proofHeight": 28, + "proof": "0xf90159f90111a02e5a83120837eb86e4961e217014c155f98adcc18a96478d4942be68d231ef1f80a04e510de4b9ef26070bc6f70273e868c69edbaf19a2517970a5dbd69902e1d434a0961d17be355042d27b605ef5f08628781620f7925927a3fb4beab2c3f6ce960aa0c8f60c0b856b9c536a919218ed7620e4f347b78938a758dfbb7e51cf2987edd0a0121c2d3eac0ec9178354c8715a2c353722e19f48e88691c2212e92d9cfb289d480a0f383029e86bd678ed67013dba1678e499669b01ce6670f925b415326d2b0243fa00e8d54ce26b8005c92ece298e21e9c7d1225e884addcdfbea2ead81c551df8928080808080a028d7dc5ba83020579a12100e30fafb74f3c03531f786808a733392cd565ef0668080f843a0369632698e78112a478dabed541f773d2f5a93186d9d3b9d9774b73bf9018b08a1a0d7d01afac573bfdecea02b26ffc115aab06e9b364869695b5e22775c252ba5e6", + "proofHeight": 35, "path": "0x626573752d636861696e2d62010000000000000001", - "value": "0x12e79bf5f3d918d5d3899fe7547967eeb785697d54be29513c1695d8b82f8a5e", - "expectedTimestamp": 1776881177 + "value": "0xd7d01afac573bfdecea02b26ffc115aab06e9b364869695b5e22775c252ba5e6", + "expectedTimestamp": 1787357309 }, "nonMembership": { - "proof": "0xf90167f90111a0e442138baf418fa0ed3a49e2d6e5cc173302db813570b4d7198669f05b8d34f780a04e510de4b9ef26070bc6f70273e868c69edbaf19a2517970a5dbd69902e1d434a0dde632f9a63c5d15111a239c3ab8e60c6ad42b937c78933d342e4b38632ecddfa078e97f4542b6ddc4349f8c953157ff559c14a6518eddf1212dbd5f15c6ec240da08bd4e17fccf748e41c20ea5e847696758313810b6e9c8c7fe02e5aefaa4b5b3580a0a1c9ae22f30d2511c9ebab94c8f089a794b16dfb0de7e544a0a608a9a247e1e0a00e8d54ce26b8005c92ece298e21e9c7d1225e884addcdfbea2ead81c551df8928080808080a028d7dc5ba83020579a12100e30fafb74f3c03531f786808a733392cd565ef0668080f85180808080a0875eb9f9e615bfe1bd0884f44df3e2d591dd593d8009f0580aab4465dde3c0518080808080808080a0fb85839944b1ee5c49f237497287a3daac2424acceff350845be00a6f529ffdd808080", - "proofHeight": 28, + "proof": "0xf90167f90111a02e5a83120837eb86e4961e217014c155f98adcc18a96478d4942be68d231ef1f80a04e510de4b9ef26070bc6f70273e868c69edbaf19a2517970a5dbd69902e1d434a0961d17be355042d27b605ef5f08628781620f7925927a3fb4beab2c3f6ce960aa0c8f60c0b856b9c536a919218ed7620e4f347b78938a758dfbb7e51cf2987edd0a0121c2d3eac0ec9178354c8715a2c353722e19f48e88691c2212e92d9cfb289d480a0f383029e86bd678ed67013dba1678e499669b01ce6670f925b415326d2b0243fa00e8d54ce26b8005c92ece298e21e9c7d1225e884addcdfbea2ead81c551df8928080808080a028d7dc5ba83020579a12100e30fafb74f3c03531f786808a733392cd565ef0668080f85180808080a0875eb9f9e615bfe1bd0884f44df3e2d591dd593d8009f0580aab4465dde3c0518080808080808080a02e971ba04a6d372cbe0b0622575c81175795858250053878c51e727d46591fa8808080", + "proofHeight": 35, "path": "0x626573752d636861696e2d61020000000000000001", - "expectedTimestamp": 1776881177 + "expectedTimestamp": 1787357309 } } \ No newline at end of file diff --git a/ibc-solidity/test/dummy-lc/DummyLightClientTest.t.sol b/ibc-solidity/test/dummy-lc/DummyLightClientTest.t.sol index 14ba7b72b..defe3eb43 100644 --- a/ibc-solidity/test/dummy-lc/DummyLightClientTest.t.sol +++ b/ibc-solidity/test/dummy-lc/DummyLightClientTest.t.sol @@ -4,6 +4,7 @@ pragma solidity ^0.8.28; import { Test } from "forge-std/Test.sol"; import { DummyLightClient } from "../../contracts/light-clients/dummy/DummyLightClient.sol"; +import { IDummyLightClientMsgs } from "../../contracts/light-clients/dummy/msgs/IDummyLightClientMsgs.sol"; import { ILightClientMsgs } from "../../contracts/msgs/ILightClientMsgs.sol"; import { IICS02ClientMsgs } from "../../contracts/msgs/IICS02ClientMsgs.sol"; @@ -24,8 +25,8 @@ contract DummyLightClientTest is Test { function test_updateClient_stores_state() public { client.updateClient(_updateMsg(height, TIMESTAMP, path, value)); - DummyLightClient.ClientState memory clientState = - abi.decode(client.getClientState(), (DummyLightClient.ClientState)); + IDummyLightClientMsgs.ClientState memory clientState = + abi.decode(client.getClientState(), (IDummyLightClientMsgs.ClientState)); assertEq(clientState.latestHeight.revisionNumber, height.revisionNumber); assertEq(clientState.latestHeight.revisionHeight, height.revisionHeight); assertEq(clientState.latestTimestamp, TIMESTAMP); @@ -103,10 +104,10 @@ contract DummyLightClientTest is Test { pure returns (bytes memory) { - DummyLightClient.Membership[] memory memberships = new DummyLightClient.Membership[](1); - memberships[0] = DummyLightClient.Membership({ path: path_, value: value_ }); + IDummyLightClientMsgs.Membership[] memory memberships = new IDummyLightClientMsgs.Membership[](1); + memberships[0] = IDummyLightClientMsgs.Membership({ path: path_, value: value_ }); return abi.encode( - DummyLightClient.MsgUpdateClient({ height: height_, timestamp: timestamp, memberships: memberships }) + IDummyLightClientMsgs.MsgUpdateClient({ height: height_, timestamp: timestamp, memberships: memberships }) ); } diff --git a/packages/proof-api/modules/besu-to-besu/src/lib.rs b/packages/proof-api/modules/besu-to-besu/src/lib.rs index 70949b813..0359896c2 100644 --- a/packages/proof-api/modules/besu-to-besu/src/lib.rs +++ b/packages/proof-api/modules/besu-to-besu/src/lib.rs @@ -30,7 +30,6 @@ use tx_builder::TxBuilder; pub struct BesuToBesuProofApiModule; struct BesuToBesuProofApiModuleService { - src_chain_id: String, src_ics26_address: Address, src_listener: eth_eureka::ChainListener, dst_listener: eth_eureka::ChainListener, @@ -46,7 +45,6 @@ pub enum BesuConsensusType { #[derive(Clone, Debug, serde::Deserialize, serde::Serialize)] pub struct BesuToBesuConfig { - pub src_chain_id: String, pub src_rpc_url: String, pub src_ics26_address: Address, pub dst_rpc_url: String, @@ -78,7 +76,6 @@ impl BesuToBesuProofApiModuleService { ); Ok(Self { - src_chain_id: config.src_chain_id, src_ics26_address: config.src_ics26_address, src_listener, dst_listener, @@ -91,8 +88,9 @@ impl BesuToBesuProofApiModuleService { impl ProofApiService for BesuToBesuProofApiModuleService { async fn info( &self, - _request: Request, + request: Request, ) -> Result, tonic::Status> { + let src_chain = request.into_inner().src_chain; Ok(Response::new(api::InfoResponse { target_chain: Some(api::Chain { chain_id: self @@ -104,7 +102,7 @@ impl ProofApiService for BesuToBesuProofApiModuleService { ibc_contract: self.tx_builder.ics26_router_address().to_string(), }), source_chain: Some(api::Chain { - chain_id: self.src_chain_id.clone(), + chain_id: src_chain, ibc_version: "2".to_string(), ibc_contract: self.src_ics26_address.to_string(), }), @@ -219,3 +217,26 @@ impl ProofApiModule for BesuToBesuProofApiModule { Ok(Box::new(service)) } } + +#[cfg(test)] +mod tests { + use super::BesuToBesuConfig; + + #[test] + fn obsolete_src_chain_id_is_ignored() { + let config: BesuToBesuConfig = serde_json::from_value(serde_json::json!({ + "src_chain_id": "legacy", + "src_rpc_url": "http://localhost:8545", + "src_ics26_address": "0x0000000000000000000000000000000000000001", + "dst_rpc_url": "http://localhost:9545", + "dst_ics26_address": "0x0000000000000000000000000000000000000002", + "consensus_type": "qbft" + })) + .unwrap(); + + assert!( + serde_json::to_value(config).unwrap()["src_chain_id"].is_null(), + "obsolete field must be accepted but not emitted" + ); + } +} diff --git a/packages/proof-api/modules/besu-to-besu/src/tx_builder.rs b/packages/proof-api/modules/besu-to-besu/src/tx_builder.rs index c26ed9393..312d62a11 100644 --- a/packages/proof-api/modules/besu-to-besu/src/tx_builder.rs +++ b/packages/proof-api/modules/besu-to-besu/src/tx_builder.rs @@ -1,11 +1,16 @@ // SPDX-License-Identifier: Apache-2.0 -use std::{collections::HashMap, str::FromStr, time::UNIX_EPOCH}; +use std::{ + collections::{HashMap, HashSet}, + str::FromStr, + time::UNIX_EPOCH, +}; use alloy::{ network::Ethereum, primitives::{hex, Address, Bytes, B256, U256}, providers::{Provider, RootProvider}, + rpc::types::EIP1186StorageProof, sol_types::{SolCall, SolValue}, }; use alloy_rlp::Header as RlpHeader; @@ -145,22 +150,33 @@ impl TxBuilder { .get_block_number() .await .context("failed to fetch latest source block number")?; - - self.build_update_client_calldata(dst_client_id, trusted_height, target_height) + let header_rlp = self + .fetch_source_header_rlp(target_height) + .await + .with_context(|| format!("failed to fetch source block at height {target_height}"))?; + let (_, account_proof) = self + .fetch_source_account_proof(target_height) .await .with_context(|| { - format!("failed to build destination updateClient call for client {dst_client_id}") - }) + format!("failed to fetch account proof for source router at height {target_height}") + })?; + + Ok(Self::build_update_client_calldata( + dst_client_id, + trusted_height, + header_rlp, + account_proof, + )) } pub async fn relay_events(&self, params: RelayEventsParams) -> Result> { let proof_height = select_proof_height(¶ms.src_events, params.timeout_relay_height)?; - let proof_timestamp = EthApiClient::new(self.src_provider.clone()) + let proof_block = EthApiClient::new(self.src_provider.clone()) .get_block(proof_height) .await - .with_context(|| format!("failed to fetch source block at height {proof_height}"))? - .header - .timestamp; + .with_context(|| format!("failed to fetch source block at height {proof_height}"))?; + let proof_timestamp = proof_block.header.timestamp; + let header_rlp = alloy_rlp::encode(proof_block.into_consensus_header()); let now = std::time::SystemTime::now() .duration_since(UNIX_EPOCH) .context("failed to read system time")? @@ -178,7 +194,7 @@ impl TxBuilder { ¶ms.dst_packet_seqs, &proof_height_msg, now, - ); + )?; let timeout_msgs = target_events_to_timeout_msgs( params.target_events, ¶ms.src_client_id, @@ -202,22 +218,28 @@ impl TxBuilder { params.dst_client_id ) })?; - let update_call = self - .build_update_client_calldata( - ¶ms.dst_client_id, - client_state.latestHeight.revisionHeight, - proof_height, - ) + let mut storage_keys = packet_calls + .iter() + .map(packet_storage_key) + .collect::>(); + storage_keys.sort_unstable(); + storage_keys.dedup(); + let (_, account_proof, storage_proofs) = self + .fetch_source_proofs(proof_height, &storage_keys) .await .with_context(|| { format!( - "failed to build destination updateClient call for client {} at height {proof_height}", - params.dst_client_id + "failed to fetch account and storage proofs for source router at height {proof_height}" ) })?; + let update_call = Self::build_update_client_calldata( + ¶ms.dst_client_id, + client_state.latestHeight.revisionHeight, + header_rlp, + account_proof, + ); - self.attach_packet_proofs(&mut packet_calls, proof_height) - .await?; + attach_packet_proofs(&mut packet_calls, &storage_proofs)?; let all_calls: Vec = std::iter::once(update_call.into()) .chain(packet_calls.into_iter().map(|call| match call { @@ -231,23 +253,12 @@ impl TxBuilder { Ok(multicallCall { data: all_calls }.abi_encode()) } - async fn build_update_client_calldata( - &self, + fn build_update_client_calldata( dst_client_id: &str, trusted_height: u64, - target_height: u64, - ) -> Result> { - let header_rlp = self - .fetch_source_header_rlp(target_height) - .await - .with_context(|| format!("failed to fetch source block at height {target_height}"))?; - let (_, account_proof) = self - .fetch_source_account_proof(target_height) - .await - .with_context(|| { - format!("failed to fetch account proof for source router at height {target_height}") - })?; - + header_rlp: Vec, + account_proof: Vec, + ) -> Vec { let update_msg = IBesuLightClientMsgs::MsgUpdateClient { headerRlp: header_rlp.into(), trustedHeight: MsgHeight { @@ -257,11 +268,11 @@ impl TxBuilder { accountProof: account_proof.into(), }; - Ok(updateClientCall { + updateClientCall { clientId: dst_client_id.to_string(), updateMsg: update_msg.abi_encode().into(), } - .abi_encode()) + .abi_encode() } async fn fetch_source_header_rlp(&self, block_height: u64) -> Result> { @@ -272,101 +283,35 @@ impl TxBuilder { Ok(alloy_rlp::encode(block.into_consensus_header())) } - async fn attach_packet_proofs( - &self, - packet_calls: &mut [routerCalls], - proof_height: u64, - ) -> Result<()> { - for call in packet_calls { - match call { - routerCalls::recvPacket(call) => { - let path = call.msg_.packet.commitment_path(); - let proof = self - .fetch_source_storage_proof(proof_height, &path) - .await - .with_context(|| { - format!( - "failed to pack storage proof for packet sequence {}", - call.msg_.packet.sequence - ) - })?; - call.msg_.proofCommitment = proof.into(); - } - routerCalls::ackPacket(call) => { - let path = call.msg_.packet.ack_commitment_path(); - let proof = self - .fetch_source_storage_proof(proof_height, &path) - .await - .with_context(|| { - format!( - "failed to pack storage proof for packet sequence {}", - call.msg_.packet.sequence - ) - })?; - call.msg_.proofAcked = proof.into(); - } - routerCalls::timeoutPacket(call) => { - let path = call.msg_.packet.receipt_commitment_path(); - let proof = self - .fetch_source_storage_proof(proof_height, &path) - .await - .with_context(|| { - format!( - "failed to pack storage proof for packet sequence {}", - call.msg_.packet.sequence - ) - })?; - call.msg_.proofTimeout = proof.into(); - } - _ => unreachable!("only recv, ack, and timeout calls are constructed"), - } - } - - Ok(()) + async fn fetch_source_account_proof(&self, block_height: u64) -> Result<(B256, Vec)> { + let (storage_hash, account_proof, _) = self.fetch_source_proofs(block_height, &[]).await?; + Ok((storage_hash, account_proof)) } - async fn fetch_source_account_proof(&self, block_height: u64) -> Result<(B256, Vec)> { + async fn fetch_source_proofs( + &self, + block_height: u64, + storage_keys: &[B256], + ) -> Result<(B256, Vec, HashMap>)> { let proof = EthApiClient::new(self.src_provider.clone()) .get_proof( &self.src_ics26_router.address().to_string(), - vec![], + storage_keys + .iter() + .map(|key| format!("0x{}", hex::encode(key))) + .collect(), format!("0x{block_height:x}"), ) - .await - .with_context(|| { - format!("failed to fetch account proof for source router at height {block_height}") - })?; + .await?; + let storage_proofs = map_storage_proofs(storage_keys, proof.storage_proof)?; Ok(( proof.storage_hash, encode_rlp_node_list(&proof.account_proof), + storage_proofs, )) } - async fn fetch_source_storage_proof(&self, block_height: u64, path: &[u8]) -> Result> { - let storage_key = - evm_ics26_commitment_path(path, U256::from_be_slice(&ICS26_IBC_STORAGE_SLOT)); - let proof = EthApiClient::new(self.src_provider.clone()) - .get_proof( - &self.src_ics26_router.address().to_string(), - vec![format!( - "0x{}", - hex::encode(storage_key.to_be_bytes::<32>()) - )], - format!("0x{block_height:x}"), - ) - .await - .with_context(|| { - format!("failed to fetch storage proof for source router at height {block_height}") - })?; - let storage_proof = proof - .storage_proof - .first() - .ok_or_else(|| anyhow!("missing storage proof response"))?; - - Ok(encode_rlp_node_list(&storage_proof.proof)) - } - async fn fetch_destination_client_state( &self, dst_client_id: &str, @@ -394,6 +339,63 @@ impl TxBuilder { } } +fn packet_storage_key(call: &routerCalls) -> B256 { + let path = match call { + routerCalls::recvPacket(call) => call.msg_.packet.commitment_path(), + routerCalls::ackPacket(call) => call.msg_.packet.ack_commitment_path(), + routerCalls::timeoutPacket(call) => call.msg_.packet.receipt_commitment_path(), + _ => unreachable!("only recv, ack, and timeout calls are constructed"), + }; + evm_ics26_commitment_path(&path, U256::from_be_slice(&ICS26_IBC_STORAGE_SLOT)).into() +} + +fn attach_packet_proofs( + packet_calls: &mut [routerCalls], + storage_proofs: &HashMap>, +) -> Result<()> { + for call in packet_calls { + let storage_key = packet_storage_key(call); + let proof: Bytes = storage_proofs + .get(&storage_key) + .ok_or_else(|| anyhow!("missing storage proof for key {storage_key}"))? + .clone() + .into(); + match call { + routerCalls::recvPacket(call) => call.msg_.proofCommitment = proof, + routerCalls::ackPacket(call) => call.msg_.proofAcked = proof, + routerCalls::timeoutPacket(call) => call.msg_.proofTimeout = proof, + _ => unreachable!("only recv, ack, and timeout calls are constructed"), + } + } + Ok(()) +} + +fn map_storage_proofs( + expected_keys: &[B256], + storage_proofs: Vec, +) -> Result>> { + let expected_keys = expected_keys.iter().copied().collect::>(); + let mut proofs = HashMap::with_capacity(expected_keys.len()); + + for storage_proof in storage_proofs { + let key = storage_proof.key.as_b256(); + if !expected_keys.contains(&key) { + bail!("unexpected storage proof key {key}"); + } + if proofs + .insert(key, encode_rlp_node_list(&storage_proof.proof)) + .is_some() + { + bail!("duplicate storage proof key {key}"); + } + } + + if let Some(key) = expected_keys.iter().find(|key| !proofs.contains_key(*key)) { + bail!("missing storage proof for key {key}"); + } + Ok(proofs) +} + fn parse_create_client_params(parameters: &HashMap) -> Result { for key in parameters.keys() { if !matches!( @@ -494,9 +496,13 @@ fn select_proof_height( #[cfg(test)] mod tests { use super::{ - encode_rlp_node_list, extract_validators_from_header_extra_data, select_proof_height, + encode_rlp_node_list, extract_validators_from_header_extra_data, map_storage_proofs, + select_proof_height, + }; + use alloy::{ + primitives::{hex, Address, Bytes, B256, U256}, + rpc::types::EIP1186StorageProof, }; - use alloy::primitives::{hex, Address, Bytes}; use ibc_eureka_solidity_types::ics26::IICS26RouterMsgs::{Packet, Payload}; use proof_api_lib::events::{EurekaEvent, EurekaEventWithHeight}; use serde::Deserialize; @@ -600,6 +606,52 @@ mod tests { ); } + #[test] + fn maps_storage_proofs_by_normalized_key_and_validates_the_response() { + let first = B256::from(U256::from(1)); + let second = B256::from(U256::from(2)); + let make_proof = |key, marker| EIP1186StorageProof { + key, + value: U256::ZERO, + proof: vec![Bytes::from(vec![marker])], + }; + + let mapped = map_storage_proofs( + &[first, second, first], + vec![ + make_proof(second.into(), 2), + make_proof(U256::from(1).into(), 1), + ], + ) + .unwrap(); + assert_eq!( + mapped[&first], + encode_rlp_node_list(&[Bytes::from(vec![1])]) + ); + assert_eq!( + mapped[&second], + encode_rlp_node_list(&[Bytes::from(vec![2])]) + ); + + assert!(map_storage_proofs(&[first], vec![]) + .unwrap_err() + .to_string() + .contains("missing storage proof")); + assert!(map_storage_proofs( + &[first], + vec![make_proof(first.into(), 1), make_proof(first.into(), 1)] + ) + .unwrap_err() + .to_string() + .contains("duplicate storage proof")); + assert!( + map_storage_proofs(&[first], vec![make_proof(second.into(), 2)]) + .unwrap_err() + .to_string() + .contains("unexpected storage proof") + ); + } + #[test] fn selects_max_proof_height() { let src_events = vec![ diff --git a/packages/proof-api/modules/evmdummy-to-evmdummy/src/lib.rs b/packages/proof-api/modules/evmdummy-to-evmdummy/src/lib.rs index 7878b2b8c..9bd1735a6 100644 --- a/packages/proof-api/modules/evmdummy-to-evmdummy/src/lib.rs +++ b/packages/proof-api/modules/evmdummy-to-evmdummy/src/lib.rs @@ -27,7 +27,6 @@ use tx_builder::TxBuilder; #[derive(Clone, Debug, serde::Deserialize, serde::Serialize)] pub struct EvmDummyToEvmDummyConfig { - pub src_chain_id: String, pub src_rpc_url: String, pub src_ics26_address: Address, pub dst_rpc_url: String, @@ -38,7 +37,6 @@ pub struct EvmDummyToEvmDummyConfig { pub struct EvmDummyToEvmDummyProofApiModule; struct EvmDummyToEvmDummyProofApiModuleService { - src_chain_id: String, src_ics26_address: Address, src_listener: eth_eureka::ChainListener, dst_listener: eth_eureka::ChainListener, @@ -63,7 +61,6 @@ impl EvmDummyToEvmDummyProofApiModuleService { let tx_builder = TxBuilder::new(src_provider, dst_provider, config.dst_ics26_address); Ok(Self { - src_chain_id: config.src_chain_id, src_ics26_address: config.src_ics26_address, src_listener, dst_listener, @@ -76,8 +73,9 @@ impl EvmDummyToEvmDummyProofApiModuleService { impl ProofApiService for EvmDummyToEvmDummyProofApiModuleService { async fn info( &self, - _request: Request, + request: Request, ) -> Result, tonic::Status> { + let src_chain = request.into_inner().src_chain; Ok(Response::new(api::InfoResponse { target_chain: Some(api::Chain { chain_id: self @@ -89,7 +87,7 @@ impl ProofApiService for EvmDummyToEvmDummyProofApiModuleService { ibc_contract: self.tx_builder.ics26_router_address().to_string(), }), source_chain: Some(api::Chain { - chain_id: self.src_chain_id.clone(), + chain_id: src_chain, ibc_version: "2".to_string(), ibc_contract: self.src_ics26_address.to_string(), }), @@ -182,3 +180,25 @@ impl ProofApiModule for EvmDummyToEvmDummyProofApiModule { )) } } + +#[cfg(test)] +mod tests { + use super::EvmDummyToEvmDummyConfig; + + #[test] + fn obsolete_src_chain_id_is_ignored() { + let config: EvmDummyToEvmDummyConfig = serde_json::from_value(serde_json::json!({ + "src_chain_id": "legacy", + "src_rpc_url": "http://localhost:8545", + "src_ics26_address": "0x0000000000000000000000000000000000000001", + "dst_rpc_url": "http://localhost:9545", + "dst_ics26_address": "0x0000000000000000000000000000000000000002" + })) + .unwrap(); + + assert!( + serde_json::to_value(config).unwrap()["src_chain_id"].is_null(), + "obsolete field must be accepted but not emitted" + ); + } +} diff --git a/packages/proof-api/modules/evmdummy-to-evmdummy/src/tx_builder.rs b/packages/proof-api/modules/evmdummy-to-evmdummy/src/tx_builder.rs index 7fc17c382..aed47f440 100644 --- a/packages/proof-api/modules/evmdummy-to-evmdummy/src/tx_builder.rs +++ b/packages/proof-api/modules/evmdummy-to-evmdummy/src/tx_builder.rs @@ -10,15 +10,15 @@ use anyhow::{bail, Context, Result}; use ibc_eureka_solidity_types::{ dummy::{ dummy_light_client, - dummy_light_client_msgs::DummyLightClientMsgs::{ - Height as DummyHeight, Membership, MsgUpdateClient, - }, + IDummyLightClientMsgs::{Membership, MsgUpdateClient}, }, ics26::{ acknowledgement_commitment, router::{multicallCall, routerCalls, routerInstance, updateClientCall}, IICS02ClientMsgs::Height, + NoAcknowledgements, }, + msgs::IICS02ClientMsgs::Height as DummyHeight, }; use proof_api_lib::utils::{ eth_eureka::{src_events_to_recv_and_ack_msgs, target_events_to_timeout_msgs}, @@ -85,7 +85,7 @@ impl TxBuilder { ¶ms.dst_packet_seqs, &proof_height, latest_source_timestamp, - ); + )?; let timeout_msgs = target_events_to_timeout_msgs( params.target_events, ¶ms.src_client_id, @@ -99,7 +99,7 @@ impl TxBuilder { bail!("no packets collected"); } - let memberships = memberships_for_calls(&packet_calls, &counterparty.merklePrefix); + let memberships = memberships_for_calls(&packet_calls, &counterparty.merklePrefix)?; let update_call = update_client_call( ¶ms.dst_client_id, &dummy_update_msg(latest_source_height, latest_source_timestamp, memberships), @@ -120,19 +120,15 @@ impl TxBuilder { } async fn latest_source_consensus_state(&self) -> Result<(u64, u64)> { - let height = self - .src_provider - .get_block_number() - .await - .context("failed to fetch latest source block number")?; let block = self .src_provider - .get_block(height.into()) + .get_block(alloy::eips::BlockId::latest()) + .hashes() .await - .with_context(|| format!("failed to fetch source block at height {height}"))? - .with_context(|| format!("source block at height {height} not found"))?; + .context("failed to fetch latest source block")? + .context("latest source block not found")?; - Ok((height, block.header.timestamp)) + Ok((block.header.number, block.header.timestamp)) } } @@ -158,19 +154,25 @@ const fn dummy_update_msg( } } -fn memberships_for_calls(calls: &[routerCalls], merkle_prefix: &[Bytes]) -> Vec { +fn memberships_for_calls( + calls: &[routerCalls], + merkle_prefix: &[Bytes], +) -> std::result::Result, NoAcknowledgements> { calls .iter() .filter_map(|call| match call { - routerCalls::recvPacket(call) => Some(Membership { + routerCalls::recvPacket(call) => Some(Ok(Membership { path: prefixed_path(merkle_prefix, &call.msg_.packet.commitment_path()), value: call.msg_.packet.commitment().into(), - }), - routerCalls::ackPacket(call) => Some(Membership { - path: prefixed_path(merkle_prefix, &call.msg_.packet.ack_commitment_path()), - value: acknowledgement_commitment(std::slice::from_ref(&call.msg_.acknowledgement)) - .into(), - }), + })), + routerCalls::ackPacket(call) => Some( + acknowledgement_commitment(std::slice::from_ref(&call.msg_.acknowledgement)).map( + |value| Membership { + path: prefixed_path(merkle_prefix, &call.msg_.packet.ack_commitment_path()), + value: value.into(), + }, + ), + ), routerCalls::timeoutPacket(_) => None, _ => unreachable!(), }) @@ -253,12 +255,12 @@ mod tests { }, }), ]; - let memberships = memberships_for_calls(&calls, &[Bytes::from_static(b"ibc")]); + let memberships = memberships_for_calls(&calls, &[Bytes::from_static(b"ibc")]).unwrap(); assert_eq!(memberships.len(), 2); assert_eq!(memberships[0].value, Bytes::from(pkt.commitment())); assert_eq!( memberships[1].value, - Bytes::from(acknowledgement_commitment(&[ack])) + Bytes::from(acknowledgement_commitment(&[ack]).unwrap()) ); } } diff --git a/packages/solidity/src/dummy.rs b/packages/solidity/src/dummy.rs index bfcd39a4e..92a333d7f 100644 --- a/packages/solidity/src/dummy.rs +++ b/packages/solidity/src/dummy.rs @@ -2,6 +2,8 @@ //! Solidity types for dummy light client. +use crate::msgs::IICS02ClientMsgs; + pub mod dummy_light_client { #[cfg(feature = "rpc")] alloy_sol_types::sol!( @@ -18,25 +20,14 @@ pub mod dummy_light_client { ); } -pub mod dummy_light_client_msgs { - alloy_sol_types::sol! { - #[derive(Debug, PartialEq, Eq)] - library DummyLightClientMsgs { - struct Height { - uint64 revisionNumber; - uint64 revisionHeight; - } - - struct Membership { - bytes[] path; - bytes value; - } +alloy_sol_types::sol!( + "../../ibc-solidity/contracts/light-clients/dummy/msgs/IDummyLightClientMsgs.sol" +); - struct MsgUpdateClient { - Height height; - uint64 timestamp; - Membership[] memberships; - } - } +pub mod dummy_light_client_msgs { + #[allow(non_snake_case)] + pub mod DummyLightClientMsgs { + pub use super::super::IDummyLightClientMsgs::{Membership, MsgUpdateClient}; + pub use crate::msgs::IICS02ClientMsgs::Height; } } diff --git a/packages/solidity/src/ics26.rs b/packages/solidity/src/ics26.rs index 49d311eb2..b203fb438 100644 --- a/packages/solidity/src/ics26.rs +++ b/packages/solidity/src/ics26.rs @@ -90,15 +90,28 @@ impl IICS26RouterMsgs::Packet { } /// Returns the acknowledgement commitment for one or more acknowledgements. -#[must_use] -pub fn acknowledgement_commitment(acks: &[alloy_primitives::Bytes]) -> Vec { +/// +/// # Errors +/// Returns [`NoAcknowledgements`] when `acks` is empty. +pub fn acknowledgement_commitment( + acks: &[alloy_primitives::Bytes], +) -> Result<[u8; 32], NoAcknowledgements> { + if acks.is_empty() { + return Err(NoAcknowledgements); + } + let mut buf = vec![2_u8]; for ack in acks { buf.extend_from_slice(&Sha256::digest(ack)); } - Sha256::digest(&buf).to_vec() + Ok(Sha256::digest(&buf).into()) } +/// Acknowledgement commitments require at least one acknowledgement. +#[derive(Debug, PartialEq, Eq, thiserror::Error)] +#[error("no acknowledgements provided")] +pub struct NoAcknowledgements; + impl From for IICS26RouterMsgs::Packet { fn from(packet: Packet) -> Self { Self { @@ -178,3 +191,24 @@ impl IICS26RouterMsgs::Payload { final_hash.to_vec() } } + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn acknowledgement_commitment_rejects_empty_acknowledgements() { + assert_eq!(acknowledgement_commitment(&[]), Err(NoAcknowledgements)); + } + + #[test] + fn acknowledgement_commitment_matches_ics24_vector() { + let commitment = + acknowledgement_commitment(&[alloy_primitives::Bytes::from_static(b"some bytes")]) + .unwrap(); + assert_eq!( + alloy_primitives::hex::encode(commitment), + "f03b4667413e56aaf086663267913e525c442b56fa1af4fa3f3dab9f37044c5b" + ); + } +} diff --git a/programs/proof-api/README.md b/programs/proof-api/README.md index fa50251a5..280b01041 100644 --- a/programs/proof-api/README.md +++ b/programs/proof-api/README.md @@ -64,7 +64,7 @@ Key settings: - `observability.use_otel`: Enable OpenTelemetry export. - `observability.service_name`: Service name used in logs/traces. - `observability.otel_endpoint`: OpenTelemetry collector endpoint. -- `modules`: List of modules to run, each with `name`, `src_chain`, `dst_chain`, `config`, and optional `enabled` (defaults to true). For `eth_to_eth`, `Info` returns the routed `src_chain` as the source identity and the destination RPC chain ID as the target identity. +- `modules`: List of modules to run, each with `name`, `src_chain`, `dst_chain`, `config`, and optional `enabled` (defaults to true). For EVM-to-EVM modules, `Info` returns the routed `src_chain` as the source identity and the destination RPC chain ID as the target identity. Module configuration varies by module type. Mode-specific options are enumerated below. @@ -127,7 +127,6 @@ Module configuration varies by module type: - `mode.cache.state_cache_max_entries`. (default: 10000) - `mode.cache.packet_cache_max_entries`. (default: 10000) - `evmdummy_to_evmdummy`: - - `src_chain_id`: Source chain ID string. - `src_rpc_url`: Source EVM RPC endpoint. - `src_ics26_address`: Source IBC router contract address. - `dst_rpc_url`: Destination EVM RPC endpoint. @@ -135,7 +134,6 @@ Module configuration varies by module type: - Create-client returns only `DummyLightClient` deployment calldata; the caller must deploy it and register it with `ICS26Router.addClient(...)`. - Insecure, local/dev/testing only. Relay uses dummy membership records, not real proofs. - `besu_to_besu`: - - `src_chain_id`: Source chain ID string. - `src_rpc_url`: Source Besu RPC endpoint. - `src_ics26_address`: Source IBC router contract address. - `dst_rpc_url`: Destination Besu RPC endpoint. diff --git a/programs/proof-api/config.example.json b/programs/proof-api/config.example.json index 35b3a322b..5099c0dd7 100644 --- a/programs/proof-api/config.example.json +++ b/programs/proof-api/config.example.json @@ -139,7 +139,6 @@ "dst_chain": "evm-local-b", "enabled": false, "config": { - "src_chain_id": "evm-local-a", "src_rpc_url": "http://127.0.0.1:8545", "src_ics26_address": "0x4242424242424242424242424242424242424242", "dst_rpc_url": "http://127.0.0.1:9545", @@ -163,8 +162,8 @@ "name": "besu_to_besu", "src_chain": "besu-a", "dst_chain": "besu-b", + "enabled": false, "config": { - "src_chain_id": "besu-a", "src_rpc_url": "http://127.0.0.1:8545", "src_ics26_address": "0x4242424242424242424242424242424242424242", "dst_rpc_url": "http://127.0.0.1:9545", From 4ccf100fdef5810cca21e08a8dcac418b4e1719e Mon Sep 17 00:00:00 2001 From: Gjermund Garaba Date: Sat, 22 Aug 2026 16:04:39 +0200 Subject: [PATCH 10/22] fix(e2e): format Besu fixture imports Signed-off-by: Gjermund Garaba --- e2e/interchaintestv8/types/besu_fixtures_test.go | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/e2e/interchaintestv8/types/besu_fixtures_test.go b/e2e/interchaintestv8/types/besu_fixtures_test.go index beb825631..69dcfb42b 100644 --- a/e2e/interchaintestv8/types/besu_fixtures_test.go +++ b/e2e/interchaintestv8/types/besu_fixtures_test.go @@ -8,9 +8,10 @@ import ( "os" "testing" - transfertypes "github.com/cosmos/ibc-go/v11/modules/apps/transfer/types" ethcommon "github.com/ethereum/go-ethereum/common" + transfertypes "github.com/cosmos/ibc-go/v11/modules/apps/transfer/types" + "github.com/cosmos/solidity-ibc-eureka/packages/go-abigen/ics26router" ) From 0ac6ae6852f16fde3fb965929c2a2ef6e6676b9c Mon Sep 17 00:00:00 2001 From: Gjermund Garaba Date: Sat, 22 Aug 2026 18:08:05 +0200 Subject: [PATCH 11/22] fix(e2e): stabilize Besu transaction submission Signed-off-by: Gjermund Garaba --- .github/workflows/e2e-attestor.yml | 2 ++ e2e/interchaintestv8/besu_qbft_test.go | 2 +- e2e/interchaintestv8/besu_to_besu_test.go | 2 +- e2e/interchaintestv8/chainconfig/testdata/besu/qbft/config.toml | 1 + 4 files changed, 5 insertions(+), 2 deletions(-) diff --git a/.github/workflows/e2e-attestor.yml b/.github/workflows/e2e-attestor.yml index 40d4f5be8..c60fccd36 100644 --- a/.github/workflows/e2e-attestor.yml +++ b/.github/workflows/e2e-attestor.yml @@ -104,6 +104,8 @@ jobs: fail-fast: false matrix: ${{ fromJson(needs.generate-matrix-eth-to-eth.outputs.matrix) }} name: attestor-native/${{ matrix.entrypoint }}/${{ matrix.test }} + env: + ETH_LC_ON_COSMOS: attestor-native runs-on: depot-ubuntu-24.04-4 permissions: diff --git a/e2e/interchaintestv8/besu_qbft_test.go b/e2e/interchaintestv8/besu_qbft_test.go index 95612db3f..56878aa5e 100644 --- a/e2e/interchaintestv8/besu_qbft_test.go +++ b/e2e/interchaintestv8/besu_qbft_test.go @@ -62,7 +62,7 @@ func TestBesuQBFTChainBringUpAndDeploy(t *testing.T) { require.NoError(t, err) require.Len(t, validators, 4) - stdout, err := eth.ForgeScript(chain.Faucet, testvalues.E2EDeployScriptPath) + stdout, err := eth.ForgeScript(chain.Faucet, testvalues.E2EDeployScriptPath, "--slow") require.NoError(t, err) contracts, err := ethereum.GetEthContractsFromDeployOutput(string(stdout)) diff --git a/e2e/interchaintestv8/besu_to_besu_test.go b/e2e/interchaintestv8/besu_to_besu_test.go index bd540f42c..b5fb8ac22 100644 --- a/e2e/interchaintestv8/besu_to_besu_test.go +++ b/e2e/interchaintestv8/besu_to_besu_test.go @@ -306,7 +306,7 @@ func (s *BesuToBesuTestSuite) createUsers(chain *besuToBesuChainState) { func (s *BesuToBesuTestSuite) deployContracts(chain *besuToBesuChainState) { os.Setenv(testvalues.EnvKeyEthRPC, chain.eth.RPC) - stdout, err := chain.eth.ForgeScript(chain.deployer, testvalues.E2EDeployScriptPath) + stdout, err := chain.eth.ForgeScript(chain.deployer, testvalues.E2EDeployScriptPath, "--slow") s.Require().NoError(err) chain.contractAddresses, err = ethereum.GetEthContractsFromDeployOutput(string(stdout)) diff --git a/e2e/interchaintestv8/chainconfig/testdata/besu/qbft/config.toml b/e2e/interchaintestv8/chainconfig/testdata/besu/qbft/config.toml index df73eabe6..b8b111636 100644 --- a/e2e/interchaintestv8/chainconfig/testdata/besu/qbft/config.toml +++ b/e2e/interchaintestv8/chainconfig/testdata/besu/qbft/config.toml @@ -9,3 +9,4 @@ rpc-http-api=["ETH","NET","QBFT","WEB3","DEBUG"] host-allowlist=["*"] rpc-http-cors-origins=["all"] min-gas-price=0 +tx-pool="legacy" From 785c79f9267088dd63836599da350c00f9e91141 Mon Sep 17 00:00:00 2001 From: Gjermund Garaba Date: Sat, 22 Aug 2026 18:20:45 +0200 Subject: [PATCH 12/22] fix(e2e): recheck Besu after peer startup Signed-off-by: Gjermund Garaba --- e2e/interchaintestv8/besu_to_besu_test.go | 1 + e2e/interchaintestv8/chainconfig/besu_qbft.go | 4 ++++ 2 files changed, 5 insertions(+) diff --git a/e2e/interchaintestv8/besu_to_besu_test.go b/e2e/interchaintestv8/besu_to_besu_test.go index b5fb8ac22..56801c6aa 100644 --- a/e2e/interchaintestv8/besu_to_besu_test.go +++ b/e2e/interchaintestv8/besu_to_besu_test.go @@ -127,6 +127,7 @@ func (s *BesuToBesuTestSuite) SetupSuite() { Gateway: "10.43.0.1", ValidatorIPs: besuToBesuChainBIPs, }) + s.Require().NoError(s.chainA.network.WaitForTransactionHandling(ctx)) s.besuFixtureGenerator = e2etypes.NewBesuFixtureGenerator() diff --git a/e2e/interchaintestv8/chainconfig/besu_qbft.go b/e2e/interchaintestv8/chainconfig/besu_qbft.go index 833d90a26..c4c621622 100644 --- a/e2e/interchaintestv8/chainconfig/besu_qbft.go +++ b/e2e/interchaintestv8/chainconfig/besu_qbft.go @@ -65,6 +65,10 @@ type BesuQBFTChain struct { projectDir string } +func (c BesuQBFTChain) WaitForTransactionHandling(ctx context.Context) error { + return waitForBesuQBFTTransactionHandling(ctx, c.RPC, c.Faucet) +} + func SpinUpBesuQBFT(ctx context.Context, params BesuQBFTParams) (chain BesuQBFTChain, err error) { faucet, err := crypto.HexToECDSA(testvalues.E2EDeployerPrivateKeyHex) if err != nil { From e01e1cb0d11f32ed26f4cdbb7e0c66118b4b1ed0 Mon Sep 17 00:00:00 2001 From: Gjermund Garaba Date: Sat, 22 Aug 2026 19:03:41 +0200 Subject: [PATCH 13/22] fix(ci): update generated Go bindings Signed-off-by: Gjermund Garaba --- e2e/interchaintestv8/types/erc20/contract.go | 4 ---- packages/go-abigen/attestation/contract.go | 4 ---- packages/go-abigen/dummy/contract.go | 4 ---- packages/go-abigen/erc1967proxy/contract.go | 4 ---- packages/go-abigen/evmiftsendcall/contract.go | 4 ---- packages/go-abigen/ibcerc20/contract.go | 4 ---- packages/go-abigen/ics20transfer/contract.go | 4 ---- packages/go-abigen/ics26router/contract.go | 4 ---- packages/go-abigen/ics27account/contract.go | 4 ---- packages/go-abigen/ics27gmp/contract.go | 4 ---- packages/go-abigen/ift/contract.go | 4 ---- packages/go-abigen/relayerhelper/contract.go | 4 ---- packages/go-abigen/sp1ics07tendermint/contract.go | 4 ---- 13 files changed, 52 deletions(-) diff --git a/e2e/interchaintestv8/types/erc20/contract.go b/e2e/interchaintestv8/types/erc20/contract.go index 08d69b7ef..bae0ad8f9 100644 --- a/e2e/interchaintestv8/types/erc20/contract.go +++ b/e2e/interchaintestv8/types/erc20/contract.go @@ -4,11 +4,9 @@ package erc20 import ( - "context" "errors" "math/big" "strings" - "time" ethereum "github.com/ethereum/go-ethereum" "github.com/ethereum/go-ethereum/accounts/abi" @@ -29,8 +27,6 @@ var ( _ = types.BloomLookup _ = event.NewSubscription _ = abi.ConvertType - _ = time.Tick - _ = context.Background ) // ContractMetaData contains all meta data concerning the Contract contract. diff --git a/packages/go-abigen/attestation/contract.go b/packages/go-abigen/attestation/contract.go index 1c48488a5..661e57d90 100644 --- a/packages/go-abigen/attestation/contract.go +++ b/packages/go-abigen/attestation/contract.go @@ -4,11 +4,9 @@ package attestation import ( - "context" "errors" "math/big" "strings" - "time" ethereum "github.com/ethereum/go-ethereum" "github.com/ethereum/go-ethereum/accounts/abi" @@ -29,8 +27,6 @@ var ( _ = types.BloomLookup _ = event.NewSubscription _ = abi.ConvertType - _ = time.Tick - _ = context.Background ) // IICS02ClientMsgsHeight is an auto generated low-level Go binding around an user-defined struct. diff --git a/packages/go-abigen/dummy/contract.go b/packages/go-abigen/dummy/contract.go index 74006c8d2..b2eb6e848 100644 --- a/packages/go-abigen/dummy/contract.go +++ b/packages/go-abigen/dummy/contract.go @@ -4,11 +4,9 @@ package dummy import ( - "context" "errors" "math/big" "strings" - "time" ethereum "github.com/ethereum/go-ethereum" "github.com/ethereum/go-ethereum/accounts/abi" @@ -29,8 +27,6 @@ var ( _ = types.BloomLookup _ = event.NewSubscription _ = abi.ConvertType - _ = time.Tick - _ = context.Background ) // IICS02ClientMsgsHeight is an auto generated low-level Go binding around an user-defined struct. diff --git a/packages/go-abigen/erc1967proxy/contract.go b/packages/go-abigen/erc1967proxy/contract.go index 87ce1b508..1c34aaac1 100644 --- a/packages/go-abigen/erc1967proxy/contract.go +++ b/packages/go-abigen/erc1967proxy/contract.go @@ -4,11 +4,9 @@ package erc1967proxy import ( - "context" "errors" "math/big" "strings" - "time" ethereum "github.com/ethereum/go-ethereum" "github.com/ethereum/go-ethereum/accounts/abi" @@ -29,8 +27,6 @@ var ( _ = types.BloomLookup _ = event.NewSubscription _ = abi.ConvertType - _ = time.Tick - _ = context.Background ) // ContractMetaData contains all meta data concerning the Contract contract. diff --git a/packages/go-abigen/evmiftsendcall/contract.go b/packages/go-abigen/evmiftsendcall/contract.go index f129cdba6..205b2916f 100644 --- a/packages/go-abigen/evmiftsendcall/contract.go +++ b/packages/go-abigen/evmiftsendcall/contract.go @@ -4,11 +4,9 @@ package evmiftsendcall import ( - "context" "errors" "math/big" "strings" - "time" ethereum "github.com/ethereum/go-ethereum" "github.com/ethereum/go-ethereum/accounts/abi" @@ -29,8 +27,6 @@ var ( _ = types.BloomLookup _ = event.NewSubscription _ = abi.ConvertType - _ = time.Tick - _ = context.Background ) // ContractMetaData contains all meta data concerning the Contract contract. diff --git a/packages/go-abigen/ibcerc20/contract.go b/packages/go-abigen/ibcerc20/contract.go index 9f23f4366..7e73737c1 100644 --- a/packages/go-abigen/ibcerc20/contract.go +++ b/packages/go-abigen/ibcerc20/contract.go @@ -4,11 +4,9 @@ package ibcerc20 import ( - "context" "errors" "math/big" "strings" - "time" ethereum "github.com/ethereum/go-ethereum" "github.com/ethereum/go-ethereum/accounts/abi" @@ -29,8 +27,6 @@ var ( _ = types.BloomLookup _ = event.NewSubscription _ = abi.ConvertType - _ = time.Tick - _ = context.Background ) // ContractMetaData contains all meta data concerning the Contract contract. diff --git a/packages/go-abigen/ics20transfer/contract.go b/packages/go-abigen/ics20transfer/contract.go index aa9e9160f..70bc0c028 100644 --- a/packages/go-abigen/ics20transfer/contract.go +++ b/packages/go-abigen/ics20transfer/contract.go @@ -4,11 +4,9 @@ package ics20transfer import ( - "context" "errors" "math/big" "strings" - "time" ethereum "github.com/ethereum/go-ethereum" "github.com/ethereum/go-ethereum/accounts/abi" @@ -29,8 +27,6 @@ var ( _ = types.BloomLookup _ = event.NewSubscription _ = abi.ConvertType - _ = time.Tick - _ = context.Background ) // IIBCAppCallbacksOnAcknowledgementPacketCallback is an auto generated low-level Go binding around an user-defined struct. diff --git a/packages/go-abigen/ics26router/contract.go b/packages/go-abigen/ics26router/contract.go index b4164cf2f..6ce815e7e 100644 --- a/packages/go-abigen/ics26router/contract.go +++ b/packages/go-abigen/ics26router/contract.go @@ -4,11 +4,9 @@ package ics26router import ( - "context" "errors" "math/big" "strings" - "time" ethereum "github.com/ethereum/go-ethereum" "github.com/ethereum/go-ethereum/accounts/abi" @@ -29,8 +27,6 @@ var ( _ = types.BloomLookup _ = event.NewSubscription _ = abi.ConvertType - _ = time.Tick - _ = context.Background ) // IICS02ClientMsgsCounterpartyInfo is an auto generated low-level Go binding around an user-defined struct. diff --git a/packages/go-abigen/ics27account/contract.go b/packages/go-abigen/ics27account/contract.go index 570e15957..aed2c8f60 100644 --- a/packages/go-abigen/ics27account/contract.go +++ b/packages/go-abigen/ics27account/contract.go @@ -4,11 +4,9 @@ package ics27account import ( - "context" "errors" "math/big" "strings" - "time" ethereum "github.com/ethereum/go-ethereum" "github.com/ethereum/go-ethereum/accounts/abi" @@ -29,8 +27,6 @@ var ( _ = types.BloomLookup _ = event.NewSubscription _ = abi.ConvertType - _ = time.Tick - _ = context.Background ) // IICS27AccountMsgsCall is an auto generated low-level Go binding around an user-defined struct. diff --git a/packages/go-abigen/ics27gmp/contract.go b/packages/go-abigen/ics27gmp/contract.go index 6f1ea3ddf..83e5d82d9 100644 --- a/packages/go-abigen/ics27gmp/contract.go +++ b/packages/go-abigen/ics27gmp/contract.go @@ -4,11 +4,9 @@ package ics27gmp import ( - "context" "errors" "math/big" "strings" - "time" ethereum "github.com/ethereum/go-ethereum" "github.com/ethereum/go-ethereum/accounts/abi" @@ -29,8 +27,6 @@ var ( _ = types.BloomLookup _ = event.NewSubscription _ = abi.ConvertType - _ = time.Tick - _ = context.Background ) // IIBCAppCallbacksOnAcknowledgementPacketCallback is an auto generated low-level Go binding around an user-defined struct. diff --git a/packages/go-abigen/ift/contract.go b/packages/go-abigen/ift/contract.go index 943e90c0b..e685abdfa 100644 --- a/packages/go-abigen/ift/contract.go +++ b/packages/go-abigen/ift/contract.go @@ -4,11 +4,9 @@ package ift import ( - "context" "errors" "math/big" "strings" - "time" ethereum "github.com/ethereum/go-ethereum" "github.com/ethereum/go-ethereum/accounts/abi" @@ -29,8 +27,6 @@ var ( _ = types.BloomLookup _ = event.NewSubscription _ = abi.ConvertType - _ = time.Tick - _ = context.Background ) // IIBCAppCallbacksOnAcknowledgementPacketCallback is an auto generated low-level Go binding around an user-defined struct. diff --git a/packages/go-abigen/relayerhelper/contract.go b/packages/go-abigen/relayerhelper/contract.go index b4f361ea2..863149f37 100644 --- a/packages/go-abigen/relayerhelper/contract.go +++ b/packages/go-abigen/relayerhelper/contract.go @@ -4,11 +4,9 @@ package relayerhelper import ( - "context" "errors" "math/big" "strings" - "time" ethereum "github.com/ethereum/go-ethereum" "github.com/ethereum/go-ethereum/accounts/abi" @@ -29,8 +27,6 @@ var ( _ = types.BloomLookup _ = event.NewSubscription _ = abi.ConvertType - _ = time.Tick - _ = context.Background ) // IICS26RouterMsgsPacket is an auto generated low-level Go binding around an user-defined struct. diff --git a/packages/go-abigen/sp1ics07tendermint/contract.go b/packages/go-abigen/sp1ics07tendermint/contract.go index 3feda0a48..5c63ac60a 100644 --- a/packages/go-abigen/sp1ics07tendermint/contract.go +++ b/packages/go-abigen/sp1ics07tendermint/contract.go @@ -4,11 +4,9 @@ package sp1ics07tendermint import ( - "context" "errors" "math/big" "strings" - "time" ethereum "github.com/ethereum/go-ethereum" "github.com/ethereum/go-ethereum/accounts/abi" @@ -29,8 +27,6 @@ var ( _ = types.BloomLookup _ = event.NewSubscription _ = abi.ConvertType - _ = time.Tick - _ = context.Background ) // IICS02ClientMsgsHeight is an auto generated low-level Go binding around an user-defined struct. From 2d8c0c531c7c4ad427f011daabed54a5bf19e5a9 Mon Sep 17 00:00:00 2001 From: Gjermund Garaba Date: Tue, 25 Aug 2026 08:57:37 +0200 Subject: [PATCH 14/22] fix(besu): align fixtures, tests, and CI Signed-off-by: Gjermund Garaba --- .github/workflows/e2e-attestor.yml | 49 ++- e2e/interchaintestv8/README.md | 29 +- e2e/interchaintestv8/besu_qbft_test.go | 77 ---- e2e/interchaintestv8/besu_to_besu_test.go | 26 +- e2e/interchaintestv8/e2esuite/config.go | 3 + e2e/interchaintestv8/e2esuite/config_test.go | 10 + e2e/interchaintestv8/ibc_eureka_test.go | 123 +++---- e2e/interchaintestv8/types/besu_fixtures.go | 128 +++---- .../types/besu_fixtures_test.go | 27 +- .../besu/BesuLightClientBase.sol | 8 +- .../besu/interfaces/IBesuLightClient.sol | 13 + ibc-solidity/solidity.just | 7 - .../test/besu-bft/BesuIBFT2LightClient.t.sol | 13 +- ...sol => BesuLightClientFixtureTestBase.sol} | 90 ++--- .../test/besu-bft/BesuQBFTLightClient.t.sol | 13 +- .../test/besu-bft/fixtures/ibft2.json | 10 +- ibc-solidity/test/besu-bft/fixtures/qbft.json | 12 +- packages/go-abigen/dummy/contract.go | 339 ------------------ .../modules/besu-to-besu/src/tx_builder.rs | 8 +- 19 files changed, 294 insertions(+), 691 deletions(-) delete mode 100644 e2e/interchaintestv8/besu_qbft_test.go create mode 100644 ibc-solidity/contracts/light-clients/besu/interfaces/IBesuLightClient.sol rename ibc-solidity/test/besu-bft/{BesuLightClientTestBase.sol => BesuLightClientFixtureTestBase.sol} (84%) delete mode 100644 packages/go-abigen/dummy/contract.go diff --git a/.github/workflows/e2e-attestor.yml b/.github/workflows/e2e-attestor.yml index c60fccd36..7e9ad1bef 100644 --- a/.github/workflows/e2e-attestor.yml +++ b/.github/workflows/e2e-attestor.yml @@ -104,9 +104,6 @@ jobs: fail-fast: false matrix: ${{ fromJson(needs.generate-matrix-eth-to-eth.outputs.matrix) }} name: attestor-native/${{ matrix.entrypoint }}/${{ matrix.test }} - env: - ETH_LC_ON_COSMOS: attestor-native - runs-on: depot-ubuntu-24.04-4 permissions: contents: read @@ -123,6 +120,52 @@ jobs: cd e2e/interchaintestv8 go test -v -mod=readonly . -run "^${{ matrix.entrypoint }}$/${{ matrix.test }}$" -timeout 60m + e2e-besu-qbft: + needs: build-e2e-programs + name: besu-qbft/ics20-roundtrip + env: + ETH_TESTNET_TYPE: besu-qbft + ETH_LC_ON_COSMOS: attestor-native + COSMOS_LC_ON_ETH: sp1 + SP1_PROVER: mock + E2E_PROOF_TYPE: groth16 + runs-on: depot-ubuntu-24.04-4 + permissions: + contents: read + packages: read + steps: + - uses: actions/checkout@fbc6f3992d24b796d5a048ff273f7fcc4a7b6c09 # v5.1.0 + - name: Set up E2E environment + uses: ./.github/actions/e2e-setup + with: + github_token: ${{ secrets.GITHUB_TOKEN }} + - name: Run test + run: | + cd e2e/interchaintestv8 + go test -v -mod=readonly . -run '^TestWithIbcEurekaTestSuite$/^Test_ICS20TransferERC20TokenfromEthereumToCosmosAndBack$' -timeout 60m + + e2e-besu-to-besu: + needs: build-e2e-programs + name: besu-to-besu + runs-on: depot-ubuntu-24.04-4 + permissions: + contents: read + packages: read + steps: + - uses: actions/checkout@fbc6f3992d24b796d5a048ff273f7fcc4a7b6c09 # v5.1.0 + - name: Set up E2E environment + uses: ./.github/actions/e2e-setup + with: + github_token: ${{ secrets.GITHUB_TOKEN }} + - name: Run Go package tests + run: | + cd e2e/interchaintestv8 + go test ./e2esuite ./types + - name: Run Besu to Besu test suite + run: | + cd e2e/interchaintestv8 + go test -v -mod=readonly . -run '^TestWithBesuToBesuTestSuite$' -timeout 60m + e2e-multi-attestor-native: needs: build-e2e-programs strategy: diff --git a/e2e/interchaintestv8/README.md b/e2e/interchaintestv8/README.md index bc188ee49..cc04a8fbd 100644 --- a/e2e/interchaintestv8/README.md +++ b/e2e/interchaintestv8/README.md @@ -47,41 +47,27 @@ This pass supports the following Besu configuration: Validated coverage in this mode: -- Besu chain bring-up -- contract deployment -- `eth_getProof` smoke coverage +- Besu chain bring-up and contract deployment - Dockerized Ethereum attestors reading Besu RPC -- relayer startup and client creation through `Test_Deploy` -- one-way Ethereum → Cosmos ICS20 transfer, including acknowledgement relay back to Ethereum +- relayer startup and client creation +- full Ethereum ↔ Cosmos ICS20 transfer roundtrip ### Not supported - `ETH_LC_ON_COSMOS=full` - beacon-chain-based Ethereum verification on Cosmos -- full roundtrip Ethereum ↔ Cosmos ICS20 transfer in Besu mode ### Focused local test commands From the repo root, run: ```shell -# Besu bring-up, deploy, and proof smoke coverage -ETH_TESTNET_TYPE=besu-qbft \ -just test-e2e TestBesuQBFTChainBringUpAndDeploy - -# Full harness validation in the supported Besu mode +# Full ICS20 roundtrip in the supported Besu mode ETH_TESTNET_TYPE=besu-qbft \ ETH_LC_ON_COSMOS=attestor-native \ COSMOS_LC_ON_ETH=sp1 \ SP1_PROVER=mock \ -just test-e2e TestWithIbcEurekaTestSuite/Test_Deploy - -# Focused one-way Ethereum -> Cosmos transfer in the supported Besu mode -ETH_TESTNET_TYPE=besu-qbft \ -ETH_LC_ON_COSMOS=attestor-native \ -COSMOS_LC_ON_ETH=sp1 \ -SP1_PROVER=mock \ -just test-e2e TestWithIbcEurekaTestSuite/Test_ICS20TransferERC20TokenFromEthereumToCosmos +just test-e2e TestWithIbcEurekaTestSuite/Test_ICS20TransferERC20TokenfromEthereumToCosmosAndBack ``` ## Focused Besu ↔ Besu e2e @@ -93,9 +79,6 @@ This focused suite starts two independent Besu QBFT networks, deploys Eureka con From the repo root, run: ```shell -# Single Besu QBFT bring-up and deploy smoke test after helper changes -just test-e2e TestBesuQBFTChainBringUpAndDeploy - # Dual-Besu deploy / client-registration path just test-e2e TestWithBesuToBesuTestSuite/Test_Deploy @@ -109,4 +92,4 @@ just test-e2e TestWithBesuToBesuTestSuite/Test_ICS20TransferERC20FromChainAToCha When `GENERATE_BESU_LIGHT_CLIENT_FIXTURES=true` is set, the focused Besu↔Besu transfer test writes: -- `test/besu-bft/fixtures/qbft.json` +- `ibc-solidity/test/besu-bft/fixtures/qbft.json` diff --git a/e2e/interchaintestv8/besu_qbft_test.go b/e2e/interchaintestv8/besu_qbft_test.go deleted file mode 100644 index 56878aa5e..000000000 --- a/e2e/interchaintestv8/besu_qbft_test.go +++ /dev/null @@ -1,77 +0,0 @@ -// SPDX-License-Identifier: Apache-2.0 - -package main - -import ( - "context" - "os" - "testing" - - "github.com/stretchr/testify/require" - - ethcommon "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/ethclient/gethclient" - - interchaintest "github.com/cosmos/interchaintest/v11" - - "github.com/srdtrk/solidity-ibc-eureka/e2e/v8/chainconfig" - "github.com/srdtrk/solidity-ibc-eureka/e2e/v8/ethereum" - "github.com/srdtrk/solidity-ibc-eureka/e2e/v8/testvalues" -) - -func TestBesuQBFTChainBringUpAndDeploy(t *testing.T) { - ctx := context.Background() - - _, networkID := interchaintest.DockerSetup(t) - - chain, err := chainconfig.SpinUpBesuQBFT(ctx, chainconfig.BesuQBFTParams{ - ChainID: 1337, - Subnet: "10.42.0.0/16", - Gateway: "10.42.0.1", - ValidatorIPs: [4]string{"10.42.0.2", "10.42.0.3", "10.42.0.4", "10.42.0.5"}, - DockerRPCAlias: "besu-qbft-rpc", - InterchainNetworkID: networkID, - }) - require.NoError(t, err) - t.Cleanup(func() { - cleanupCtx := context.Background() - if t.Failed() { - _ = chain.DumpLogs(cleanupCtx) - } - chain.Destroy(cleanupCtx) - }) - - cwd, err := os.Getwd() - require.NoError(t, err) - require.NoError(t, os.Chdir("../..")) - t.Cleanup(func() { - require.NoError(t, os.Chdir(cwd)) - }) - - require.Equal(t, "http://besu-qbft-rpc:8545", chain.DockerRPC) - - eth, err := ethereum.NewEthereum(ctx, chain.RPC, nil, chain.Faucet) - require.NoError(t, err) - - latestBlock, err := eth.RPCClient.BlockNumber(ctx) - require.NoError(t, err) - require.Greater(t, latestBlock, uint64(0)) - - var validators []ethcommon.Address - err = eth.RPCClient.Client().CallContext(ctx, &validators, "qbft_getValidatorsByBlockNumber", "latest") - require.NoError(t, err) - require.Len(t, validators, 4) - - stdout, err := eth.ForgeScript(chain.Faucet, testvalues.E2EDeployScriptPath, "--slow") - require.NoError(t, err) - - contracts, err := ethereum.GetEthContractsFromDeployOutput(string(stdout)) - require.NoError(t, err) - require.NotEmpty(t, contracts.Ics26Router) - require.NotEmpty(t, contracts.Ics20Transfer) - require.NotEmpty(t, contracts.Erc20) - - proof, err := gethclient.New(eth.RPCClient.Client()).GetProof(ctx, ethcommon.HexToAddress(contracts.Ics26Router), nil, nil) - require.NoError(t, err) - require.NotEmpty(t, proof.AccountProof) -} diff --git a/e2e/interchaintestv8/besu_to_besu_test.go b/e2e/interchaintestv8/besu_to_besu_test.go index 56801c6aa..abe5528ab 100644 --- a/e2e/interchaintestv8/besu_to_besu_test.go +++ b/e2e/interchaintestv8/besu_to_besu_test.go @@ -21,6 +21,8 @@ import ( ethtypes "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/crypto" + transfertypes "github.com/cosmos/ibc-go/v11/modules/apps/transfer/types" + "github.com/cosmos/solidity-ibc-eureka/packages/go-abigen/ibcerc20" "github.com/cosmos/solidity-ibc-eureka/packages/go-abigen/ics20transfer" "github.com/cosmos/solidity-ibc-eureka/packages/go-abigen/ics26router" @@ -145,11 +147,11 @@ func (s *BesuToBesuTestSuite) SetupSuite() { } func (s *BesuToBesuTestSuite) Test_Deploy() { - transferOnA, err := s.chainA.ics26.GetIBCApp(nil, "transfer") + transferOnA, err := s.chainA.ics26.GetIBCApp(nil, transfertypes.PortID) s.Require().NoError(err) s.Require().Equal(strings.ToLower(s.chainA.contractAddresses.Ics20Transfer), strings.ToLower(transferOnA.Hex())) - transferOnB, err := s.chainB.ics26.GetIBCApp(nil, "transfer") + transferOnB, err := s.chainB.ics26.GetIBCApp(nil, transfertypes.PortID) s.Require().NoError(err) s.Require().Equal(strings.ToLower(s.chainB.contractAddresses.Ics20Transfer), strings.ToLower(transferOnB.Hex())) @@ -190,7 +192,7 @@ func (s *BesuToBesuTestSuite) Test_ICS20TransferERC20FromChainAToChainB() { Receiver: strings.ToLower(userAddressB.Hex()), TimeoutTimestamp: timeout, SourceClient: besuToBesuClientOnA, - DestPort: "transfer", + DestPort: transfertypes.PortID, Memo: "", }) s.Require().NoError(err) @@ -268,15 +270,15 @@ func (s *BesuToBesuTestSuite) Test_ICS20TransferERC20FromChainAToChainB() { s.Require().Greater(sendHeight, uint64(2)) s.Require().Greater(ackReceipt.BlockNumber.Uint64(), sendHeight) s.Require().NoError(s.besuFixtureGenerator.GenerateAndSaveQBFTFixture(ctx, e2etypes.GenerateQBFTFixtureParams{ - SourceChain: &s.chainA.eth, - RouterAddress: ics26AddressA, - Packet: sendEvent.Packet, - InitialTrustedHeight: sendHeight - 2, - UpdateHeight11: sendHeight - 1, - UpdateHeight12: sendHeight, - SyntheticSourceHeight: ackReceipt.BlockNumber.Uint64(), - TrustingPeriod: uint64(testvalues.DefaultTrustPeriod), - MaxClockDrift: uint64(testvalues.DefaultMaxClockDrift), + SourceChain: &s.chainA.eth, + RouterAddress: ics26AddressA, + Packet: sendEvent.Packet, + InitialTrustedHeight: sendHeight - 2, + AdjacentUpdateHeight: sendHeight - 1, + NonAdjacentUpdateHeight: sendHeight, + SyntheticSourceHeight: ackReceipt.BlockNumber.Uint64(), + TrustingPeriod: uint64(testvalues.DefaultTrustPeriod), + MaxClockDrift: uint64(testvalues.DefaultMaxClockDrift), })) } } diff --git a/e2e/interchaintestv8/e2esuite/config.go b/e2e/interchaintestv8/e2esuite/config.go index 026f44fe6..0424d01bd 100644 --- a/e2e/interchaintestv8/e2esuite/config.go +++ b/e2e/interchaintestv8/e2esuite/config.go @@ -69,6 +69,9 @@ func (c *setupConfig) validate() error { case "", testvalues.EthTestnetType_None: return nil case testvalues.EthTestnetTypeAnvil: + if c.ethereum.anvilCount > 1 { + return nil + } if ethLcOnCosmos == testvalues.EthLCOnCosmosTypeDummyWasm || ethLcOnCosmos == testvalues.EthLCOnCosmosTypeAttestorNative { return nil } diff --git a/e2e/interchaintestv8/e2esuite/config_test.go b/e2e/interchaintestv8/e2esuite/config_test.go index f0998ab79..92b9e297f 100644 --- a/e2e/interchaintestv8/e2esuite/config_test.go +++ b/e2e/interchaintestv8/e2esuite/config_test.go @@ -44,4 +44,14 @@ func TestSetupConfigValidateEthereumCompatibility(t *testing.T) { } }) } + + for _, clientType := range []string{"", unknown} { + cfg := setupConfig{ + ethereum: ethereumConfig{testnetType: testvalues.EthTestnetTypeAnvil, anvilCount: 2}, + cosmos: cosmosConfig{lightClientType: clientType}, + } + if err := cfg.validate(); err != nil { + t.Errorf("multiple Anvil chains with ETH_LC_ON_COSMOS=%q: %v", clientType, err) + } + } } diff --git a/e2e/interchaintestv8/ibc_eureka_test.go b/e2e/interchaintestv8/ibc_eureka_test.go index a517dbd00..c4ce49eca 100644 --- a/e2e/interchaintestv8/ibc_eureka_test.go +++ b/e2e/interchaintestv8/ibc_eureka_test.go @@ -184,7 +184,11 @@ func (s *IbcEurekaTestSuite) SetupSuite(ctx context.Context, proofType types.Sup s.solidityFixtureGenerator = types.NewSolidityFixtureGenerator() s.Require().True(s.Run("Deploy IBC contracts", func() { - stdout, err := eth.ForgeScript(s.deployer, testvalues.E2EDeployScriptPath) + var forgeArgs []string + if os.Getenv(testvalues.EnvKeyEthTestnetType) == testvalues.EthTestnetTypeBesuQBFT { + forgeArgs = []string{"--slow"} + } + stdout, err := eth.ForgeScript(s.deployer, testvalues.E2EDeployScriptPath, forgeArgs...) s.Require().NoError(err) s.contractAddresses, err = ethereum.GetEthContractsFromDeployOutput(string(stdout)) @@ -610,14 +614,38 @@ func (s *IbcEurekaTestSuite) DeployTest(ctx context.Context, proofType types.Sup })) } -type ethToCosmosTransferResult struct { - denomOnCosmos transfertypes.Denom - escrowAddress ethcommon.Address +func (s *IbcEurekaTestSuite) Test_ICS20TransferERC20TokenfromEthereumToCosmosAndBack() { + ctx := context.Background() + proofType := types.GetEnvProofType() + s.ICS20TransferERC20TokenfromEthereumToCosmosAndBackTest(ctx, proofType, 1, big.NewInt(testvalues.TransferAmount)) } -func (s *IbcEurekaTestSuite) transferERC20TokenFromEthereumToCosmos( +func (s *IbcEurekaTestSuite) Test_25_ICS20TransferERC20TokenfromEthereumToCosmosAndBack() { + ctx := context.Background() + proofType := types.GetEnvProofType() + s.ICS20TransferERC20TokenfromEthereumToCosmosAndBackTest(ctx, proofType, 25, big.NewInt(testvalues.TransferAmount)) +} + +func (s *IbcEurekaTestSuite) Test_50_ICS20TransferERC20TokenfromEthereumToCosmosAndBack() { + ctx := context.Background() + proofType := types.GetEnvProofType() + s.ICS20TransferERC20TokenfromEthereumToCosmosAndBackTest(ctx, proofType, 50, big.NewInt(testvalues.TransferAmount)) +} + +func (s *IbcEurekaTestSuite) Test_ICS20TransferUint256TokenfromEthereumToCosmosAndBack() { + ctx := context.Background() + proofType := types.GetEnvProofType() + transferAmount := new(big.Int).Div(testvalues.StartingERC20Balance, big.NewInt(2)) + s.ICS20TransferERC20TokenfromEthereumToCosmosAndBackTest(ctx, proofType, 1, transferAmount) +} + +// ICS20TransferERC20TokenfromEthereumToCosmosAndBackTest tests the ICS20 transfer functionality by transferring +// ERC20 tokens with n packets from Ethereum to Cosmos chain and then back from Cosmos chain to Ethereum +func (s *IbcEurekaTestSuite) ICS20TransferERC20TokenfromEthereumToCosmosAndBackTest( ctx context.Context, proofType types.SupportedProofType, numOfTransfers int, transferAmount *big.Int, -) ethToCosmosTransferResult { +) { + s.SetupSuite(ctx, proofType) + eth, simd := s.Eth.Chains[0], s.Cosmos.Chains[0] ics26Address := ethcommon.HexToAddress(s.contractAddresses.Ics26Router) @@ -645,10 +673,10 @@ func (s *IbcEurekaTestSuite) transferERC20TokenFromEthereumToCosmos( s.Require().Equal(totalTransferAmount, allowance) })) - result := ethToCosmosTransferResult{} var ( sendPacket ics26router.IICS26RouterMsgsPacket ethSendTxHash []byte + escrowAddress ethcommon.Address ) s.Require().True(s.Run(fmt.Sprintf("Send %d transfers on Ethereum", numOfTransfers), func() { timeout := uint64(time.Now().Add(30 * time.Minute).Unix()) @@ -691,20 +719,26 @@ func (s *IbcEurekaTestSuite) transferERC20TokenFromEthereumToCosmos( s.Require().Equal(transfertypes.EncodingABI, sendPacket.Payloads[0].Encoding) s.True(s.Run("Verify balances on Ethereum", func() { + // User balance on Ethereum userBalance, err := s.erc20Contract.BalanceOf(nil, ethereumUserAddress) s.Require().NoError(err) s.Require().Equal(new(big.Int).Sub(testvalues.StartingERC20Balance, totalTransferAmount), userBalance) - result.escrowAddress, err = s.ics20Contract.GetEscrow(nil, testvalues.CustomClientID) + // Get the escrow address + escrowAddress, err = s.ics20Contract.GetEscrow(nil, testvalues.CustomClientID) s.Require().NoError(err) - escrowBalance, err := s.erc20Contract.BalanceOf(nil, result.escrowAddress) + // ICS20 contract balance on Ethereum + escrowBalance, err := s.erc20Contract.BalanceOf(nil, escrowAddress) s.Require().NoError(err) s.Require().Equal(totalTransferAmount, escrowBalance) })) })) - var ackTxHash []byte + var ( + denomOnCosmos transfertypes.Denom + ackTxHash []byte + ) s.Require().True(s.Run("Receive packets on Cosmos chain", func() { var relayTxBodyBz []byte s.Require().True(s.Run("Retrieve relay tx", func() { @@ -735,16 +769,17 @@ func (s *IbcEurekaTestSuite) transferERC20TokenFromEthereumToCosmos( })) s.Require().True(s.Run("Verify balances on Cosmos chain", func() { - result.denomOnCosmos = transfertypes.NewDenom(s.contractAddresses.Erc20, transfertypes.NewHop(transfertypes.PortID, s.getEthLcClientIDOnCosmos())) + denomOnCosmos = transfertypes.NewDenom(s.contractAddresses.Erc20, transfertypes.NewHop(transfertypes.PortID, s.getEthLcClientIDOnCosmos())) + // User balance on Cosmos chain resp, err := e2esuite.GRPCQuery[banktypes.QueryBalanceResponse](ctx, simd, &banktypes.QueryBalanceRequest{ Address: cosmosUserAddress, - Denom: result.denomOnCosmos.IBCDenom(), + Denom: denomOnCosmos.IBCDenom(), }) s.Require().NoError(err) s.Require().NotNil(resp.Balance) s.Require().Equal(totalTransferAmount, resp.Balance.Amount.BigInt()) - s.Require().Equal(result.denomOnCosmos.IBCDenom(), resp.Balance.Denom) + s.Require().Equal(denomOnCosmos.IBCDenom(), resp.Balance.Denom) })) })) @@ -771,6 +806,7 @@ func (s *IbcEurekaTestSuite) transferERC20TokenFromEthereumToCosmos( s.Require().Equal(ethtypes.ReceiptStatusSuccessful, receipt.Status, fmt.Sprintf("Tx failed: %+v", receipt)) s.T().Logf("Multicall ack %d packets gas used: %d", numOfTransfers, receipt.GasUsed) + // Verify the ack packet event exists _, err = e2esuite.GetEvmEvent(receipt, s.ics26Contract.ParseAckPacket) s.Require().NoError(err) })) @@ -781,69 +817,18 @@ func (s *IbcEurekaTestSuite) transferERC20TokenFromEthereumToCosmos( )) s.Require().True(s.Run("Verify balances on Ethereum", func() { + // User balance on Ethereum userBalance, err := s.erc20Contract.BalanceOf(nil, ethereumUserAddress) s.Require().NoError(err) s.Require().Equal(new(big.Int).Sub(testvalues.StartingERC20Balance, totalTransferAmount), userBalance) - escrowBalance, err := s.erc20Contract.BalanceOf(nil, result.escrowAddress) + // ICS20 contract balance on Ethereum + escrowBalance, err := s.erc20Contract.BalanceOf(nil, escrowAddress) s.Require().NoError(err) s.Require().Equal(totalTransferAmount, escrowBalance) })) })) - return result -} - -func (s *IbcEurekaTestSuite) Test_ICS20TransferERC20TokenFromEthereumToCosmos() { - ctx := context.Background() - proofType := types.GetEnvProofType() - s.SetupSuite(ctx, proofType) - s.transferERC20TokenFromEthereumToCosmos(ctx, proofType, 1, big.NewInt(testvalues.TransferAmount)) -} - -func (s *IbcEurekaTestSuite) Test_ICS20TransferERC20TokenfromEthereumToCosmosAndBack() { - ctx := context.Background() - proofType := types.GetEnvProofType() - s.ICS20TransferERC20TokenfromEthereumToCosmosAndBackTest(ctx, proofType, 1, big.NewInt(testvalues.TransferAmount)) -} - -func (s *IbcEurekaTestSuite) Test_25_ICS20TransferERC20TokenfromEthereumToCosmosAndBack() { - ctx := context.Background() - proofType := types.GetEnvProofType() - s.ICS20TransferERC20TokenfromEthereumToCosmosAndBackTest(ctx, proofType, 25, big.NewInt(testvalues.TransferAmount)) -} - -func (s *IbcEurekaTestSuite) Test_50_ICS20TransferERC20TokenfromEthereumToCosmosAndBack() { - ctx := context.Background() - proofType := types.GetEnvProofType() - s.ICS20TransferERC20TokenfromEthereumToCosmosAndBackTest(ctx, proofType, 50, big.NewInt(testvalues.TransferAmount)) -} - -func (s *IbcEurekaTestSuite) Test_ICS20TransferUint256TokenfromEthereumToCosmosAndBack() { - ctx := context.Background() - proofType := types.GetEnvProofType() - transferAmount := new(big.Int).Div(testvalues.StartingERC20Balance, big.NewInt(2)) - s.ICS20TransferERC20TokenfromEthereumToCosmosAndBackTest(ctx, proofType, 1, transferAmount) -} - -// ICS20TransferERC20TokenfromEthereumToCosmosAndBackTest tests the ICS20 transfer functionality by transferring -// ERC20 tokens with n packets from Ethereum to Cosmos chain and then back from Cosmos chain to Ethereum -func (s *IbcEurekaTestSuite) ICS20TransferERC20TokenfromEthereumToCosmosAndBackTest( - ctx context.Context, proofType types.SupportedProofType, numOfTransfers int, transferAmount *big.Int, -) { - s.SetupSuite(ctx, proofType) - - eth, simd := s.Eth.Chains[0], s.Cosmos.Chains[0] - - ics26Address := ethcommon.HexToAddress(s.contractAddresses.Ics26Router) - ethereumUserAddress := crypto.PubkeyToAddress(s.key.PublicKey) - cosmosUserWallet := s.Cosmos.Users[0] - cosmosUserAddress := cosmosUserWallet.FormattedAddress() - - forwardTransfer := s.transferERC20TokenFromEthereumToCosmos(ctx, proofType, numOfTransfers, transferAmount) - denomOnCosmos := forwardTransfer.denomOnCosmos - escrowAddress := forwardTransfer.escrowAddress - var returnSendTxHash []byte s.Require().True(s.Run("Transfer tokens back from Cosmos chain", func() { timeout := uint64(time.Now().Add(30 * time.Minute).Unix()) @@ -948,7 +933,6 @@ func (s *IbcEurekaTestSuite) ICS20TransferERC20TokenfromEthereumToCosmosAndBackT })) })) - var ackTxHash []byte s.Require().True(s.Run("Acknowledge packets on Cosmos chain", func() { s.Require().True(s.Run("Verify commitments exists", func() { for i := range numOfTransfers { @@ -984,9 +968,8 @@ func (s *IbcEurekaTestSuite) ICS20TransferERC20TokenfromEthereumToCosmosAndBackT s.Require().True(s.Run("Broadcast relay tx", func() { resp := s.MustBroadcastSdkTxBody(ctx, simd, s.SimdRelayerSubmitter, 20_000_000, ackRelayTxBodyBz) - decodedAckTxHash, err := hex.DecodeString(resp.TxHash) + ackTxHash, err = hex.DecodeString(resp.TxHash) s.Require().NoError(err) - ackTxHash = decodedAckTxHash s.Require().NotEmpty(ackTxHash) })) diff --git a/e2e/interchaintestv8/types/besu_fixtures.go b/e2e/interchaintestv8/types/besu_fixtures.go index 93e6acfca..2303e7e85 100644 --- a/e2e/interchaintestv8/types/besu_fixtures.go +++ b/e2e/interchaintestv8/types/besu_fixtures.go @@ -5,8 +5,6 @@ package types import ( "context" "crypto/ecdsa" - "crypto/sha256" - "encoding/binary" "encoding/hex" "encoding/json" "fmt" @@ -21,6 +19,7 @@ import ( "github.com/ethereum/go-ethereum/ethclient/gethclient" "github.com/ethereum/go-ethereum/rlp" + channeltypesv2 "github.com/cosmos/ibc-go/v11/modules/core/04-channel/v2/types" ibchostv2 "github.com/cosmos/ibc-go/v11/modules/core/24-host/v2" "github.com/cosmos/solidity-ibc-eureka/packages/go-abigen/ics26router" @@ -34,15 +33,15 @@ type BesuFixtureGenerator struct { } type GenerateQBFTFixtureParams struct { - SourceChain *ethereum.Ethereum - RouterAddress ethcommon.Address - Packet ics26router.IICS26RouterMsgsPacket - InitialTrustedHeight uint64 - UpdateHeight11 uint64 - UpdateHeight12 uint64 - SyntheticSourceHeight uint64 - TrustingPeriod uint64 - MaxClockDrift uint64 + SourceChain *ethereum.Ethereum + RouterAddress ethcommon.Address + Packet ics26router.IICS26RouterMsgsPacket + InitialTrustedHeight uint64 + AdjacentUpdateHeight uint64 + NonAdjacentUpdateHeight uint64 + SyntheticSourceHeight uint64 + TrustingPeriod uint64 + MaxClockDrift uint64 } type besuFixture struct { @@ -53,11 +52,11 @@ type besuFixture struct { InitialTrustedValidators []string `json:"initialTrustedValidators"` TrustingPeriod uint64 `json:"trustingPeriod"` MaxClockDrift uint64 `json:"maxClockDrift"` - UpdateHeight11 besuUpdateFixture `json:"updateHeight11"` - UpdateHeight12 besuUpdateFixture `json:"updateHeight12"` - LowQuorumHeight12 besuRejectionUpdateFixture `json:"lowQuorumHeight12"` - ConflictingHeight12 besuRejectionUpdateFixture `json:"conflictingHeight12"` - LowOverlapHeight13 besuRejectionUpdateFixture `json:"lowOverlapHeight13"` + AdjacentUpdate besuUpdateFixture `json:"adjacentUpdate"` + NonAdjacentUpdate besuUpdateFixture `json:"nonAdjacentUpdate"` + LowQuorumUpdate besuRejectionUpdateFixture `json:"lowQuorumUpdate"` + ConflictingUpdate besuRejectionUpdateFixture `json:"conflictingUpdate"` + LowOverlapUpdate besuRejectionUpdateFixture `json:"lowOverlapUpdate"` Membership besuProofFixture `json:"membership"` NonMembership besuProofFixture `json:"nonMembership"` } @@ -137,21 +136,21 @@ func generateQBFTFixture(ctx context.Context, params GenerateQBFTFixtureParams) if params.InitialTrustedHeight == 0 { return besuFixture{}, fmt.Errorf("initial trusted height must be greater than zero") } - if params.UpdateHeight11 <= params.InitialTrustedHeight { - return besuFixture{}, fmt.Errorf("updateHeight11 must be greater than initial trusted height") + if params.AdjacentUpdateHeight <= params.InitialTrustedHeight || params.AdjacentUpdateHeight-params.InitialTrustedHeight != 1 { + return besuFixture{}, fmt.Errorf("adjacent update height must equal initial trusted height plus one") } - if params.UpdateHeight12 <= params.UpdateHeight11 { - return besuFixture{}, fmt.Errorf("updateHeight12 must be greater than updateHeight11") + if params.NonAdjacentUpdateHeight <= params.AdjacentUpdateHeight { + return besuFixture{}, fmt.Errorf("non-adjacent update height must be greater than adjacent update height") } - if params.SyntheticSourceHeight <= params.UpdateHeight12 { - return besuFixture{}, fmt.Errorf("synthetic source height must be greater than updateHeight12") + if params.SyntheticSourceHeight <= params.NonAdjacentUpdateHeight { + return besuFixture{}, fmt.Errorf("synthetic source height must be greater than non-adjacent update height") } trustedHeader, err := fetchLiveHeader(ctx, params.SourceChain, params.InitialTrustedHeight) if err != nil { return besuFixture{}, err } - update12Header, err := fetchLiveHeader(ctx, params.SourceChain, params.UpdateHeight12) + nonAdjacentHeader, err := fetchLiveHeader(ctx, params.SourceChain, params.NonAdjacentUpdateHeight) if err != nil { return besuFixture{}, err } @@ -169,22 +168,22 @@ func generateQBFTFixture(ctx context.Context, params GenerateQBFTFixtureParams) if err != nil { return besuFixture{}, err } - update11, err := buildLiveUpdateFixture(ctx, params.SourceChain, params.RouterAddress, params.InitialTrustedHeight, params.UpdateHeight11) + adjacentUpdate, err := buildLiveUpdateFixture(ctx, params.SourceChain, params.RouterAddress, params.InitialTrustedHeight, params.AdjacentUpdateHeight) if err != nil { return besuFixture{}, err } - update12, err := buildLiveUpdateFixture(ctx, params.SourceChain, params.RouterAddress, params.InitialTrustedHeight, params.UpdateHeight12) + nonAdjacentUpdate, err := buildLiveUpdateFixture(ctx, params.SourceChain, params.RouterAddress, params.InitialTrustedHeight, params.NonAdjacentUpdateHeight) if err != nil { return besuFixture{}, err } - lowQuorumHeight12, err := buildLowQuorumFixture(update12, update12Header) + lowQuorumUpdate, err := buildLowQuorumFixture(nonAdjacentUpdate, nonAdjacentHeader) if err != nil { return besuFixture{}, err } - conflictingHeight12, err := buildConflictingFixture( + conflictingUpdate, err := buildConflictingFixture( ctx, params.InitialTrustedHeight, - update12.Height, + nonAdjacentUpdate.Height, syntheticSourceHeader, validatorKeys, params.SourceChain, @@ -193,20 +192,20 @@ func generateQBFTFixture(ctx context.Context, params GenerateQBFTFixtureParams) if err != nil { return besuFixture{}, err } - lowOverlapHeight13, err := buildLowOverlapFixture( + lowOverlapUpdate, err := buildLowOverlapFixture( params.InitialTrustedHeight, - update12.Height+1, + nonAdjacentUpdate.Height+1, syntheticSourceHeader, validatorKeys, ) if err != nil { return besuFixture{}, err } - membership, err := buildMembershipFixture(ctx, params.SourceChain, params.RouterAddress, params.Packet, params.UpdateHeight12, update12Header.Header.Time) + membership, err := buildMembershipFixture(ctx, params.SourceChain, params.RouterAddress, params.Packet, params.NonAdjacentUpdateHeight, nonAdjacentHeader.Header.Time) if err != nil { return besuFixture{}, err } - nonMembership, err := buildNonMembershipFixture(ctx, params.SourceChain, params.RouterAddress, params.Packet, params.UpdateHeight12, update12Header.Header.Time) + nonMembership, err := buildNonMembershipFixture(ctx, params.SourceChain, params.RouterAddress, params.Packet, params.NonAdjacentUpdateHeight, nonAdjacentHeader.Header.Time) if err != nil { return besuFixture{}, err } @@ -219,11 +218,11 @@ func generateQBFTFixture(ctx context.Context, params GenerateQBFTFixtureParams) InitialTrustedValidators: addressesToHex(trustedHeader.Validators), TrustingPeriod: params.TrustingPeriod, MaxClockDrift: params.MaxClockDrift, - UpdateHeight11: update11, - UpdateHeight12: update12, - LowQuorumHeight12: lowQuorumHeight12, - ConflictingHeight12: conflictingHeight12, - LowOverlapHeight13: lowOverlapHeight13, + AdjacentUpdate: adjacentUpdate, + NonAdjacentUpdate: nonAdjacentUpdate, + LowQuorumUpdate: lowQuorumUpdate, + ConflictingUpdate: conflictingUpdate, + LowOverlapUpdate: lowOverlapUpdate, Membership: membership, NonMembership: nonMembership, }, nil @@ -495,46 +494,23 @@ func encodeProofNodes(nodes []string) ([]byte, error) { } func packetCommitment(packet ics26router.IICS26RouterMsgsPacket) []byte { - destHash := sha256.Sum256([]byte(packet.DestClient)) - timeoutBytes := make([]byte, 8) - binary.BigEndian.PutUint64(timeoutBytes, packet.TimeoutTimestamp) - timeoutHash := sha256.Sum256(timeoutBytes) - - appBytes := make([]byte, 0, len(packet.Payloads)*32) - for _, payload := range packet.Payloads { - appBytes = append(appBytes, payloadCommitmentHash(payload)...) - } - appHash := sha256.Sum256(appBytes) - - final := make([]byte, 0, 1+32+32+32) - final = append(final, 2) - final = append(final, destHash[:]...) - final = append(final, timeoutHash[:]...) - final = append(final, appHash[:]...) - - commitment := sha256.Sum256(final) - return commitment[:] -} - -func payloadCommitmentHash(payload ics26router.IICS26RouterMsgsPayload) []byte { - parts := [][]byte{ - sha256Bytes([]byte(payload.SourcePort)), - sha256Bytes([]byte(payload.DestPort)), - sha256Bytes([]byte(payload.Version)), - sha256Bytes([]byte(payload.Encoding)), - sha256Bytes(payload.Value), - } - - concatenated := make([]byte, 0, len(parts)*32) - for _, part := range parts { - concatenated = append(concatenated, part...) + payloads := make([]channeltypesv2.Payload, len(packet.Payloads)) + for i, payload := range packet.Payloads { + payloads[i] = channeltypesv2.Payload{ + SourcePort: payload.SourcePort, + DestinationPort: payload.DestPort, + Version: payload.Version, + Encoding: payload.Encoding, + Value: payload.Value, + } } - return sha256Bytes(concatenated) -} - -func sha256Bytes(input []byte) []byte { - sum := sha256.Sum256(input) - return sum[:] + return channeltypesv2.CommitPacket(channeltypesv2.Packet{ + Sequence: packet.Sequence, + SourceClient: packet.SourceClient, + DestinationClient: packet.DestClient, + TimeoutTimestamp: packet.TimeoutTimestamp, + Payloads: payloads, + }) } func decodeMutableQBFTHeader(headerRLP []byte) (*mutableQBFTHeader, error) { diff --git a/e2e/interchaintestv8/types/besu_fixtures_test.go b/e2e/interchaintestv8/types/besu_fixtures_test.go index 69dcfb42b..dad6dbc9f 100644 --- a/e2e/interchaintestv8/types/besu_fixtures_test.go +++ b/e2e/interchaintestv8/types/besu_fixtures_test.go @@ -13,8 +13,21 @@ import ( transfertypes "github.com/cosmos/ibc-go/v11/modules/apps/transfer/types" "github.com/cosmos/solidity-ibc-eureka/packages/go-abigen/ics26router" + + "github.com/srdtrk/solidity-ibc-eureka/e2e/v8/ethereum" ) +func TestGenerateQBFTFixtureRequiresAdjacentHeight(t *testing.T) { + _, err := generateQBFTFixture(t.Context(), GenerateQBFTFixtureParams{ + SourceChain: ðereum.Ethereum{}, + InitialTrustedHeight: 10, + AdjacentUpdateHeight: 12, + }) + if err == nil || err.Error() != "adjacent update height must equal initial trusted height plus one" { + t.Fatalf("unexpected error: %v", err) + } +} + func TestBuildLowOverlapFixtureNeedsNoAccountProof(t *testing.T) { t.Chdir("../../..") @@ -33,8 +46,8 @@ func TestBuildLowOverlapFixtureNeedsNoAccountProof(t *testing.T) { update, err := buildLowOverlapFixture( fixture.InitialTrustedHeight, - fixture.UpdateHeight12.Height+1, - liveHeader{HeaderRLP: ethcommon.FromHex(fixture.UpdateHeight12.HeaderRlp)}, + fixture.NonAdjacentUpdate.Height+1, + liveHeader{HeaderRLP: ethcommon.FromHex(fixture.NonAdjacentUpdate.HeaderRlp)}, validatorKeys, ) if err != nil { @@ -72,8 +85,8 @@ func TestRejectionFixturesOnlyContainUpdateInputs(t *testing.T) { } lowQuorum, err := buildLowQuorumFixture( - fixture.UpdateHeight12, - liveHeader{HeaderRLP: ethcommon.FromHex(fixture.UpdateHeight12.HeaderRlp)}, + fixture.NonAdjacentUpdate, + liveHeader{HeaderRLP: ethcommon.FromHex(fixture.NonAdjacentUpdate.HeaderRlp)}, ) if err != nil { t.Fatal(err) @@ -81,13 +94,13 @@ func TestRejectionFixturesOnlyContainUpdateInputs(t *testing.T) { if lowQuorum.AccountProof != "0x" { t.Fatalf("low quorum account proof: got %q, want empty hex bytes", lowQuorum.AccountProof) } - if fixture.ConflictingHeight12.AccountProof == "" || fixture.ConflictingHeight12.AccountProof == "0x" { + if fixture.ConflictingUpdate.AccountProof == "" || fixture.ConflictingUpdate.AccountProof == "0x" { t.Fatal("conflicting update must retain its account proof") } for name, update := range map[string]besuRejectionUpdateFixture{ "low quorum": lowQuorum, - "conflicting": fixture.ConflictingHeight12, + "conflicting": fixture.ConflictingUpdate, } { encoded, err := json.Marshal(update) if err != nil { @@ -105,7 +118,7 @@ func TestRejectionFixturesOnlyContainUpdateInputs(t *testing.T) { } } -func TestPacketCommitment(t *testing.T) { +func TestPacketCommitmentMatchesICS24Host(t *testing.T) { packetData := transfertypes.NewFungibleTokenPacketData("uatom", "1000000", "sender", "receiver", "memo") value, err := transfertypes.EncodeABIFungibleTokenPacketData(&packetData) if err != nil { diff --git a/ibc-solidity/contracts/light-clients/besu/BesuLightClientBase.sol b/ibc-solidity/contracts/light-clients/besu/BesuLightClientBase.sol index 42f4be8c5..3ba07394c 100644 --- a/ibc-solidity/contracts/light-clients/besu/BesuLightClientBase.sol +++ b/ibc-solidity/contracts/light-clients/besu/BesuLightClientBase.sol @@ -11,12 +11,13 @@ import { ILightClientMsgs } from "../../msgs/ILightClientMsgs.sol"; import { IICS02ClientMsgs } from "../../msgs/IICS02ClientMsgs.sol"; import { IBesuLightClientMsgs } from "./msgs/IBesuLightClientMsgs.sol"; import { IBesuLightClientErrors } from "./errors/IBesuLightClientErrors.sol"; +import { IBesuLightClient } from "./interfaces/IBesuLightClient.sol"; import { RLPReader } from "./RLPReader.sol"; import { MPTProof } from "./MPTProof.sol"; /// @title Besu Light Client Base /// @notice Shared implementation for Besu BFT light clients that verify headers and EVM storage proofs. -abstract contract BesuLightClientBase is ILightClient, IBesuLightClientErrors, IBesuLightClientMsgs, AccessControl { +abstract contract BesuLightClientBase is IBesuLightClient, IBesuLightClientErrors, IBesuLightClientMsgs, AccessControl { using MPTProof for bytes; using RLPReader for RLPReader.RLPItem; using RLPReader for bytes; @@ -109,10 +110,7 @@ abstract contract BesuLightClientBase is ILightClient, IBesuLightClientErrors, I return abi.encode(clientState); } - /// @notice Returns the encoded consensus state for a revision height. - /// @param revisionHeight The revision height to query. - /// @return The ABI-encoded consensus state. - // natlint-disable-next-line MissingInheritdoc + /// @inheritdoc IBesuLightClient function getConsensusState(uint64 revisionHeight) external view returns (bytes memory) { ConsensusState storage consensusState = _getConsensusState(revisionHeight); return abi.encode(consensusState.timestamp, consensusState.storageRoot, consensusState.validators); diff --git a/ibc-solidity/contracts/light-clients/besu/interfaces/IBesuLightClient.sol b/ibc-solidity/contracts/light-clients/besu/interfaces/IBesuLightClient.sol new file mode 100644 index 000000000..8374a32b6 --- /dev/null +++ b/ibc-solidity/contracts/light-clients/besu/interfaces/IBesuLightClient.sol @@ -0,0 +1,13 @@ +// SPDX-License-Identifier: Apache-2.0 +pragma solidity ^0.8.28; + +import { ILightClient } from "../../../interfaces/ILightClient.sol"; + +/// @title IBesuLightClient +/// @notice Interface for Besu BFT light clients. +interface IBesuLightClient is ILightClient { + /// @notice Returns the trusted consensus state at a revision height. + /// @param revisionHeight The revision height to query. + /// @return The ABI-encoded consensus state. + function getConsensusState(uint64 revisionHeight) external view returns (bytes memory); +} diff --git a/ibc-solidity/solidity.just b/ibc-solidity/solidity.just index 8139ffb11..eac18981c 100644 --- a/ibc-solidity/solidity.just +++ b/ibc-solidity/solidity.just @@ -58,7 +58,6 @@ generate-abi: build-contracts jq '.abi' out/BesuIBFT2LightClient.sol/BesuIBFT2LightClient.json > abi/BesuIBFT2LightClient.json jq '.abi' out/BesuQBFTLightClient.sol/BesuQBFTLightClient.json > abi/BesuQBFTLightClient.json jq '.abi' out/DummyLightClient.sol/DummyLightClient.json > abi/DummyLightClient.json - jq -r '.bytecode.object' out/DummyLightClient.sol/DummyLightClient.json > tmp/abigen/DummyLightClient.bin jq '.abi' out/IFTOwnable.sol/IFTOwnable.json > abi/IFTOwnable.json jq -r '.bytecode.object' out/IFTOwnable.sol/IFTOwnable.json > tmp/abigen/IFTOwnable.bin jq '.abi' out/ERC1967Proxy.sol/ERC1967Proxy.json > abi/ERC1967Proxy.json @@ -77,8 +76,6 @@ generate-abi: build-contracts abigen --abi abi/AttestationLightClient.json --bin tmp/abigen/AttestationLightClient.bin --pkg attestation --type Contract --out ../packages/go-abigen/attestation/contract.go abigen --abi abi/ERC1967Proxy.json --bin tmp/abigen/ERC1967Proxy.bin --pkg erc1967proxy --type Contract --out ../packages/go-abigen/erc1967proxy/contract.go abigen --abi abi/EVMIFTSendCallConstructor.json --bin tmp/abigen/EVMIFTSendCallConstructor.bin --pkg evmiftsendcall --type Contract --out ../packages/go-abigen/evmiftsendcall/contract.go - mkdir -p ../packages/go-abigen/dummy - abigen --abi abi/DummyLightClient.json --bin tmp/abigen/DummyLightClient.bin --pkg dummy --type Contract --out ../packages/go-abigen/dummy/contract.go rm -rf abi/bytecode mkdir -p abi/bytecode jq -c '{abi, bytecode: {object: .bytecode.object}}' out/SP1ICS07Tendermint.sol/SP1ICS07Tendermint.json > abi/bytecode/SP1ICS07Tendermint.json @@ -88,10 +85,6 @@ generate-abi: build-contracts jq -c '{abi, bytecode: {object: .bytecode.object}}' out/DummyLightClient.sol/DummyLightClient.json > abi/bytecode/DummyLightClient.json rm -rf tmp/abigen -# Backwards-compatible alias for the canonical artifact generator. -[group('generate')] -generate-abi-bytecode: generate-abi - # Clean up the foundry cache and out directories [group('clean')] clean-foundry: diff --git a/ibc-solidity/test/besu-bft/BesuIBFT2LightClient.t.sol b/ibc-solidity/test/besu-bft/BesuIBFT2LightClient.t.sol index 189e7478a..d9fc39a03 100644 --- a/ibc-solidity/test/besu-bft/BesuIBFT2LightClient.t.sol +++ b/ibc-solidity/test/besu-bft/BesuIBFT2LightClient.t.sol @@ -3,15 +3,16 @@ pragma solidity ^0.8.28; import { BesuIBFT2LightClient } from "../../contracts/light-clients/besu/BesuIBFT2LightClient.sol"; import { BesuQBFTLightClient } from "../../contracts/light-clients/besu/BesuQBFTLightClient.sol"; -import { BesuLightClientTestBase, IBesuTestLightClient } from "./BesuLightClientTestBase.sol"; +import { IBesuLightClient } from "../../contracts/light-clients/besu/interfaces/IBesuLightClient.sol"; +import { BesuLightClientFixtureTestBase } from "./BesuLightClientFixtureTestBase.sol"; -contract BesuIBFT2LightClientTest is BesuLightClientTestBase { +contract BesuIBFT2LightClientTest is BesuLightClientFixtureTestBase { function _fixtureFile() internal pure override returns (string memory) { return "ibft2.json"; } - function _deployPrimaryClient() internal override returns (IBesuTestLightClient) { - return IBesuTestLightClient( + function _deployPrimaryClient() internal override returns (IBesuLightClient) { + return IBesuLightClient( address( new BesuIBFT2LightClient( fixture.routerAddress, @@ -27,8 +28,8 @@ contract BesuIBFT2LightClientTest is BesuLightClientTestBase { ); } - function _deployWrongWrapper() internal override returns (IBesuTestLightClient) { - return IBesuTestLightClient( + function _deployWrongWrapper() internal override returns (IBesuLightClient) { + return IBesuLightClient( address( new BesuQBFTLightClient( fixture.routerAddress, diff --git a/ibc-solidity/test/besu-bft/BesuLightClientTestBase.sol b/ibc-solidity/test/besu-bft/BesuLightClientFixtureTestBase.sol similarity index 84% rename from ibc-solidity/test/besu-bft/BesuLightClientTestBase.sol rename to ibc-solidity/test/besu-bft/BesuLightClientFixtureTestBase.sol index 1c1c9f225..8a2f1d3c7 100644 --- a/ibc-solidity/test/besu-bft/BesuLightClientTestBase.sol +++ b/ibc-solidity/test/besu-bft/BesuLightClientFixtureTestBase.sol @@ -6,13 +6,14 @@ pragma solidity ^0.8.28; import { Test } from "forge-std/Test.sol"; import { stdJson } from "forge-std/StdJson.sol"; -import { ILightClient } from "../../contracts/interfaces/ILightClient.sol"; import { ILightClientMsgs } from "../../contracts/msgs/ILightClientMsgs.sol"; import { IICS02ClientMsgs } from "../../contracts/msgs/IICS02ClientMsgs.sol"; +import { IBesuLightClient } from "../../contracts/light-clients/besu/interfaces/IBesuLightClient.sol"; import { IBesuLightClientMsgs } from "../../contracts/light-clients/besu/msgs/IBesuLightClientMsgs.sol"; import { IBesuLightClientErrors } from "../../contracts/light-clients/besu/errors/IBesuLightClientErrors.sol"; import { RLPReader } from "../../contracts/light-clients/besu/RLPReader.sol"; +/// @dev Successful update input and expected consensus state. struct BesuUpdateFixture { uint64 height; bytes headerRlp; @@ -23,6 +24,7 @@ struct BesuUpdateFixture { address[] expectedValidators; } +/// @dev Update input expected to be rejected. struct BesuRejectionUpdateFixture { uint64 height; bytes headerRlp; @@ -30,6 +32,7 @@ struct BesuRejectionUpdateFixture { bytes accountProof; } +/// @dev Membership or non-membership proof and expected timestamp. struct BesuProofFixture { bytes proof; uint64 proofHeight; @@ -38,6 +41,7 @@ struct BesuProofFixture { uint64 expectedTimestamp; } +/// @dev Complete fixture shared by the Besu BFT light-client tests. struct BesuFixture { address routerAddress; uint64 initialTrustedHeight; @@ -46,20 +50,16 @@ struct BesuFixture { address[] initialTrustedValidators; uint64 trustingPeriod; uint64 maxClockDrift; - BesuUpdateFixture updateHeight11; - BesuUpdateFixture updateHeight12; - BesuRejectionUpdateFixture lowQuorumHeight12; - BesuRejectionUpdateFixture conflictingHeight12; - BesuRejectionUpdateFixture lowOverlapHeight13; + BesuUpdateFixture adjacentUpdate; + BesuUpdateFixture nonAdjacentUpdate; + BesuRejectionUpdateFixture lowQuorumUpdate; + BesuRejectionUpdateFixture conflictingUpdate; + BesuRejectionUpdateFixture lowOverlapUpdate; BesuProofFixture membership; BesuProofFixture nonMembership; } -interface IBesuTestLightClient is ILightClient { - function getConsensusState(uint64 revisionHeight) external view returns (bytes memory); -} - -abstract contract BesuLightClientTestBase is Test { +abstract contract BesuLightClientFixtureTestBase is Test { using stdJson for string; using RLPReader for bytes; using RLPReader for RLPReader.RLPItem; @@ -67,8 +67,8 @@ abstract contract BesuLightClientTestBase is Test { string internal constant FIXTURE_DIR = "/test/besu-bft/fixtures/"; BesuFixture internal fixture; - IBesuTestLightClient internal client; - IBesuTestLightClient internal wrongWrapper; + IBesuLightClient internal client; + IBesuLightClient internal wrongWrapper; function setUp() public virtual { fixture = _loadFixture(_fixtureFile()); @@ -79,31 +79,31 @@ abstract contract BesuLightClientTestBase is Test { function test_updateClient_validAdjacentUpdate() public { vm.warp(fixture.initialTrustedTimestamp + 1); - ILightClientMsgs.UpdateResult result = client.updateClient(_encodeUpdate(fixture.updateHeight11)); + ILightClientMsgs.UpdateResult result = client.updateClient(_encodeUpdate(fixture.adjacentUpdate)); assertEq(uint8(result), uint8(ILightClientMsgs.UpdateResult.Update)); _assertClientState( - fixture.updateHeight11.expectedTimestamp, - fixture.updateHeight11.expectedStorageRoot, - fixture.updateHeight11.height + fixture.adjacentUpdate.expectedTimestamp, + fixture.adjacentUpdate.expectedStorageRoot, + fixture.adjacentUpdate.height ); } function test_updateClient_validNonAdjacentUpdate() public { vm.warp(fixture.initialTrustedTimestamp + 1); - ILightClientMsgs.UpdateResult result = client.updateClient(_encodeUpdate(fixture.updateHeight12)); + ILightClientMsgs.UpdateResult result = client.updateClient(_encodeUpdate(fixture.nonAdjacentUpdate)); assertEq(uint8(result), uint8(ILightClientMsgs.UpdateResult.Update)); _assertClientState( - fixture.updateHeight12.expectedTimestamp, - fixture.updateHeight12.expectedStorageRoot, - fixture.updateHeight12.height + fixture.nonAdjacentUpdate.expectedTimestamp, + fixture.nonAdjacentUpdate.expectedStorageRoot, + fixture.nonAdjacentUpdate.height ); } function test_updateClient_revertZeroTimestampWithoutStateChange() public { - BesuUpdateFixture memory update = fixture.updateHeight12; + BesuUpdateFixture memory update = fixture.nonAdjacentUpdate; RLPReader.RLPItem memory headerItem = update.headerRlp.toRlpItem(); RLPReader.RLPItem[] memory headerItems = headerItem.toList(); (uint256 timestampPtr, uint256 timestampLen) = headerItems[11].payloadLocation(); @@ -123,7 +123,7 @@ abstract contract BesuLightClientTestBase is Test { function test_verifyMembership_returnsStoredTimestamp() public { vm.warp(fixture.initialTrustedTimestamp + 1); - client.updateClient(_encodeUpdate(fixture.updateHeight12)); + client.updateClient(_encodeUpdate(fixture.nonAdjacentUpdate)); uint256 timestamp = client.verifyMembership( ILightClientMsgs.MsgVerifyMembership({ @@ -141,7 +141,7 @@ abstract contract BesuLightClientTestBase is Test { function test_verifyNonMembership_returnsStoredTimestamp() public { vm.warp(fixture.initialTrustedTimestamp + 1); - client.updateClient(_encodeUpdate(fixture.updateHeight12)); + client.updateClient(_encodeUpdate(fixture.nonAdjacentUpdate)); uint256 timestamp = client.verifyNonMembership( ILightClientMsgs.MsgVerifyNonMembership({ @@ -167,7 +167,7 @@ abstract contract BesuLightClientTestBase is Test { fixture.trustingPeriod ) ); - client.updateClient(_encodeUpdate(fixture.updateHeight12)); + client.updateClient(_encodeUpdate(fixture.nonAdjacentUpdate)); } function test_updateClient_revertInsufficientTrustedOverlap() public { @@ -176,21 +176,21 @@ abstract contract BesuLightClientTestBase is Test { vm.expectRevert( abi.encodeWithSelector(IBesuLightClientErrors.InsufficientTrustedValidatorOverlap.selector, 1, 2) ); - client.updateClient(_encodeUpdate(fixture.lowOverlapHeight13)); + client.updateClient(_encodeUpdate(fixture.lowOverlapUpdate)); } function test_updateClient_revertInsufficientNewValidatorQuorum() public { vm.warp(fixture.initialTrustedTimestamp + 1); vm.expectRevert(abi.encodeWithSelector(IBesuLightClientErrors.InsufficientValidatorQuorum.selector, 2, 3)); - client.updateClient(_encodeUpdate(fixture.lowQuorumHeight12)); + client.updateClient(_encodeUpdate(fixture.lowQuorumUpdate)); } function test_updateClient_revertWrongRevisionNumber() public { vm.warp(fixture.initialTrustedTimestamp + 1); IBesuLightClientMsgs.MsgUpdateClient memory update = - abi.decode(_encodeUpdate(fixture.updateHeight12), (IBesuLightClientMsgs.MsgUpdateClient)); + abi.decode(_encodeUpdate(fixture.nonAdjacentUpdate), (IBesuLightClientMsgs.MsgUpdateClient)); update.trustedHeight.revisionNumber = 1; vm.expectRevert(abi.encodeWithSelector(IBesuLightClientErrors.InvalidRevisionNumber.selector, 1)); @@ -199,7 +199,7 @@ abstract contract BesuLightClientTestBase is Test { function test_verifyMembership_revertWrongRevisionNumber() public { vm.warp(fixture.initialTrustedTimestamp + 1); - client.updateClient(_encodeUpdate(fixture.updateHeight12)); + client.updateClient(_encodeUpdate(fixture.nonAdjacentUpdate)); vm.expectRevert(abi.encodeWithSelector(IBesuLightClientErrors.InvalidRevisionNumber.selector, 1)); client.verifyMembership( @@ -216,7 +216,7 @@ abstract contract BesuLightClientTestBase is Test { function test_verifyMembership_revertWrongPathShape() public { vm.warp(fixture.initialTrustedTimestamp + 1); - client.updateClient(_encodeUpdate(fixture.updateHeight12)); + client.updateClient(_encodeUpdate(fixture.nonAdjacentUpdate)); bytes[] memory path = new bytes[](2); path[0] = fixture.membership.path; @@ -237,7 +237,7 @@ abstract contract BesuLightClientTestBase is Test { function test_verifyMembership_revertWrongCommitmentValue() public { vm.warp(fixture.initialTrustedTimestamp + 1); - client.updateClient(_encodeUpdate(fixture.updateHeight12)); + client.updateClient(_encodeUpdate(fixture.nonAdjacentUpdate)); bytes memory wrongValue = abi.encodePacked(bytes32(uint256(1))); vm.expectRevert( @@ -261,14 +261,14 @@ abstract contract BesuLightClientTestBase is Test { function test_updateClient_revertConflictingSameHeight() public { vm.warp(fixture.initialTrustedTimestamp + 1); - client.updateClient(_encodeUpdate(fixture.updateHeight12)); + client.updateClient(_encodeUpdate(fixture.nonAdjacentUpdate)); vm.expectRevert( abi.encodeWithSelector( - IBesuLightClientErrors.ConflictingConsensusState.selector, fixture.conflictingHeight12.height + IBesuLightClientErrors.ConflictingConsensusState.selector, fixture.conflictingUpdate.height ) ); - client.updateClient(_encodeUpdate(fixture.conflictingHeight12)); + client.updateClient(_encodeUpdate(fixture.conflictingUpdate)); } function test_misbehaviour_reverts() public { @@ -282,7 +282,7 @@ abstract contract BesuLightClientTestBase is Test { vm.expectRevert( abi.encodeWithSelector(IBesuLightClientErrors.InsufficientTrustedValidatorOverlap.selector, 0, 2) ); - wrongWrapper.updateClient(_encodeUpdate(fixture.updateHeight12)); + wrongWrapper.updateClient(_encodeUpdate(fixture.nonAdjacentUpdate)); } function _assertClientState( @@ -306,9 +306,9 @@ abstract contract BesuLightClientTestBase is Test { assertEq(timestamp, expectedTimestamp); assertEq(storageRoot, expectedStorageRoot); - address[] memory expectedValidators = expectedLatestHeight == fixture.updateHeight11.height - ? fixture.updateHeight11.expectedValidators - : fixture.updateHeight12.expectedValidators; + address[] memory expectedValidators = expectedLatestHeight == fixture.adjacentUpdate.height + ? fixture.adjacentUpdate.expectedValidators + : fixture.nonAdjacentUpdate.expectedValidators; assertEq(validators.length, expectedValidators.length); for (uint256 i = 0; i < expectedValidators.length; ++i) { assertEq(validators[i], expectedValidators[i]); @@ -343,11 +343,11 @@ abstract contract BesuLightClientTestBase is Test { initialTrustedValidators: abi.decode(json.parseRaw(".initialTrustedValidators"), (address[])), trustingPeriod: uint64(json.readUint(".trustingPeriod")), maxClockDrift: uint64(json.readUint(".maxClockDrift")), - updateHeight11: _readUpdate(json, ".updateHeight11"), - updateHeight12: _readUpdate(json, ".updateHeight12"), - lowQuorumHeight12: _readRejectionUpdate(json, ".lowQuorumHeight12"), - conflictingHeight12: _readRejectionUpdate(json, ".conflictingHeight12"), - lowOverlapHeight13: _readRejectionUpdate(json, ".lowOverlapHeight13"), + adjacentUpdate: _readUpdate(json, ".adjacentUpdate"), + nonAdjacentUpdate: _readUpdate(json, ".nonAdjacentUpdate"), + lowQuorumUpdate: _readRejectionUpdate(json, ".lowQuorumUpdate"), + conflictingUpdate: _readRejectionUpdate(json, ".conflictingUpdate"), + lowOverlapUpdate: _readRejectionUpdate(json, ".lowOverlapUpdate"), membership: _readProof(json, ".membership"), nonMembership: _readProof(json, ".nonMembership") }); @@ -404,6 +404,6 @@ abstract contract BesuLightClientTestBase is Test { } function _fixtureFile() internal pure virtual returns (string memory); - function _deployPrimaryClient() internal virtual returns (IBesuTestLightClient); - function _deployWrongWrapper() internal virtual returns (IBesuTestLightClient); + function _deployPrimaryClient() internal virtual returns (IBesuLightClient); + function _deployWrongWrapper() internal virtual returns (IBesuLightClient); } diff --git a/ibc-solidity/test/besu-bft/BesuQBFTLightClient.t.sol b/ibc-solidity/test/besu-bft/BesuQBFTLightClient.t.sol index 4eaf77dc8..e7e8bf3cc 100644 --- a/ibc-solidity/test/besu-bft/BesuQBFTLightClient.t.sol +++ b/ibc-solidity/test/besu-bft/BesuQBFTLightClient.t.sol @@ -3,15 +3,16 @@ pragma solidity ^0.8.28; import { BesuIBFT2LightClient } from "../../contracts/light-clients/besu/BesuIBFT2LightClient.sol"; import { BesuQBFTLightClient } from "../../contracts/light-clients/besu/BesuQBFTLightClient.sol"; -import { BesuLightClientTestBase, IBesuTestLightClient } from "./BesuLightClientTestBase.sol"; +import { IBesuLightClient } from "../../contracts/light-clients/besu/interfaces/IBesuLightClient.sol"; +import { BesuLightClientFixtureTestBase } from "./BesuLightClientFixtureTestBase.sol"; -contract BesuQBFTLightClientTest is BesuLightClientTestBase { +contract BesuQBFTLightClientTest is BesuLightClientFixtureTestBase { function _fixtureFile() internal pure override returns (string memory) { return "qbft.json"; } - function _deployPrimaryClient() internal override returns (IBesuTestLightClient) { - return IBesuTestLightClient( + function _deployPrimaryClient() internal override returns (IBesuLightClient) { + return IBesuLightClient( address( new BesuQBFTLightClient( fixture.routerAddress, @@ -27,8 +28,8 @@ contract BesuQBFTLightClientTest is BesuLightClientTestBase { ); } - function _deployWrongWrapper() internal override returns (IBesuTestLightClient) { - return IBesuTestLightClient( + function _deployWrongWrapper() internal override returns (IBesuLightClient) { + return IBesuLightClient( address( new BesuIBFT2LightClient( fixture.routerAddress, diff --git a/ibc-solidity/test/besu-bft/fixtures/ibft2.json b/ibc-solidity/test/besu-bft/fixtures/ibft2.json index ee31f0cfa..57136043b 100644 --- a/ibc-solidity/test/besu-bft/fixtures/ibft2.json +++ b/ibc-solidity/test/besu-bft/fixtures/ibft2.json @@ -11,7 +11,7 @@ ], "trustingPeriod": 1000, "maxClockDrift": 30, - "updateHeight11": { + "adjacentUpdate": { "height": 11, "headerRlp": "0xf9033ca00000000000000000000000000000000000000000000000000000000000000000a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347940000000000000000000000000000000000000000a0f2081dd8c37a93ef3050951656b124dba1eb1e541e52e98c8bbbac27611bae73a00000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000000b9010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010b8401c9c380808203f2b90147f90144a00000000000000000000000000000000000000000000000000000000000000000f85494fe3b557e8fb62b89f4916b721be55ceb828dbd7394627306090abab3a6e1400e9345bc60c78a8bef5794f17f52151ebef6c7334fad080c5704d77216b73294a89f47c6b463f74d87572b058427da0a13ec54258080f8c9b8415c237229535cb5b756ac35933bd6460128d8358af7224b3d373bc1e58671b9e26ddd5f2f6318493978a02162192da231068943ef7d31f3d49a99912245c8933300b841737d327b80cc8c318cfc223a801b7d51f17a3e61a008ba796c9a8128c13f3a6f5d36764ac0aa1f4cf788d18831193962a7f4bd42e4356bc2d2cd6795d1cc29cd01b841681d75e13f57e972a3c7696b2ff358722ab0b5d0878095146fdb03a7a688975814d97fac43069952f0382aee020d77f554f4a31e502259e28c271f748e1c113e01a063746963616c2062797a616e74696e65206661756c7420746f6c6572616e6365880000000000000000", "trustedHeight": 10, @@ -25,7 +25,7 @@ "0xa89F47C6b463f74d87572b058427dA0A13ec5425" ] }, - "updateHeight12": { + "nonAdjacentUpdate": { "height": 12, "headerRlp": "0xf9033ca00000000000000000000000000000000000000000000000000000000000000000a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347940000000000000000000000000000000000000000a0f4fb47fab37d2702f85f5562b52da4e7b5e4a677298193c9f797e467e9cc046aa00000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000000b9010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010c8401c9c380808203fcb90147f90144a00000000000000000000000000000000000000000000000000000000000000000f85494fe3b557e8fb62b89f4916b721be55ceb828dbd7394627306090abab3a6e1400e9345bc60c78a8bef5794f17f52151ebef6c7334fad080c5704d77216b73294cbed645b1c1a6254f1149df51d3591c6b38030078080f8c9b84100eaa1df128060399277424940a4cccd0ceb29052f83358f1798cf9ad95c0f0c3e858beb37cd83332935b0927d2365e439a9b1c319bf0a0adaf2f62d61dff58901b841c4bf6688b64aa46676b969e679ed39c1a0b2ae13f8c7e49ff34629f49b03bb1336a7e049716855a50a637c49dbd01d576571ef9294335623d4d42ef3b184e73601b8412df49de5d8c13913300fd9ebd1d70d76ce9f73f26e122e451c464031744f079a438762535d0e5cc031383599d8b85ae91bff81d4d10980262f70ec6ed82666f700a063746963616c2062797a616e74696e65206661756c7420746f6c6572616e6365880000000000000000", "trustedHeight": 10, @@ -39,7 +39,7 @@ "0xcBED645B1C1a6254f1149Df51d3591c6B3803007" ] }, - "lowQuorumHeight12": { + "lowQuorumUpdate": { "height": 12, "headerRlp": "0xf902f9a00000000000000000000000000000000000000000000000000000000000000000a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347940000000000000000000000000000000000000000a0f4fb47fab37d2702f85f5562b52da4e7b5e4a677298193c9f797e467e9cc046aa00000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000000b9010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010c8401c9c380808203fcb90104f90101a00000000000000000000000000000000000000000000000000000000000000000f85494fe3b557e8fb62b89f4916b721be55ceb828dbd7394627306090abab3a6e1400e9345bc60c78a8bef5794f17f52151ebef6c7334fad080c5704d77216b73294cbed645b1c1a6254f1149df51d3591c6b38030078080f886b84100eaa1df128060399277424940a4cccd0ceb29052f83358f1798cf9ad95c0f0c3e858beb37cd83332935b0927d2365e439a9b1c319bf0a0adaf2f62d61dff58901b841c4bf6688b64aa46676b969e679ed39c1a0b2ae13f8c7e49ff34629f49b03bb1336a7e049716855a50a637c49dbd01d576571ef9294335623d4d42ef3b184e73601a063746963616c2062797a616e74696e65206661756c7420746f6c6572616e6365880000000000000000", "trustedHeight": 10, @@ -53,7 +53,7 @@ "0xcBED645B1C1a6254f1149Df51d3591c6B3803007" ] }, - "conflictingHeight12": { + "conflictingUpdate": { "height": 12, "headerRlp": "0xf9033ca00000000000000000000000000000000000000000000000000000000000000000a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347940000000000000000000000000000000000000000a002920b43c148d62cc879e6d86a0fea5cb5f6e9d5bc65b85f012955ddcf82b134a00000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000000b9010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010c8401c9c380808203fdb90147f90144a00000000000000000000000000000000000000000000000000000000000000000f85494fe3b557e8fb62b89f4916b721be55ceb828dbd7394627306090abab3a6e1400e9345bc60c78a8bef5794f17f52151ebef6c7334fad080c5704d77216b73294cbed645b1c1a6254f1149df51d3591c6b38030078080f8c9b8416f5732f70922c0ca46fc2bd56db36c79b7cc9da2b73f56513703b8daaf75001a1907b11de095b3ba30413d17584b7d448414ea87872609d89f264d76eb3c2bd800b8411ef65e4f2a8d80933195e7b1a1451fa114e9cfb44fe6c89688a73f0a77b72f04701d0de8cb85fcc7347ba5dc6e066bb14ff77bdcc582ed1cba0cc902ba0c698d01b841464fc7ac400db011dbfe93fe8ff28dfc13f94074c5225bfd0b63827d5dc40eb335d3982bdf385f569d668844155121ce0b74d681e914d79392b492698d10611800a063746963616c2062797a616e74696e65206661756c7420746f6c6572616e6365880000000000000000", "trustedHeight": 10, @@ -67,7 +67,7 @@ "0xcBED645B1C1a6254f1149Df51d3591c6B3803007" ] }, - "lowOverlapHeight13": { + "lowOverlapUpdate": { "height": 13, "headerRlp": "0xf9033ca00000000000000000000000000000000000000000000000000000000000000000a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347940000000000000000000000000000000000000000a00d2546fbdd16af694bb1e7a28440bd1d56197e4eb349532dba3b0b71778ac051a00000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000000b9010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010d8401c9c38080820406b90147f90144a00000000000000000000000000000000000000000000000000000000000000000f85494fe3b557e8fb62b89f4916b721be55ceb828dbd7394cbed645b1c1a6254f1149df51d3591c6b38030079400731540cd6060991d6b9c57ce295998d9bc2fab947e5f4552091a69125d5dfcb7b8c2659029395bdf8080f8c9b841ae4e5c4cd1f82a1d962f8ffde7c51396f2ac85fe4d3cc9b9a5eb249c1c3850665faa295fa6c0444025cc66b4e7d18b4b8469f3f851e735744babc3a99a12b58201b84194c7c8462d7d74c9bfd80f0e62b76a49316f2a0075ec7df65fb207d2c0eb75801f01c30b6a4f0445cb1cb8936d9f27587575449c1e25b17338c91eba6ac6a43301b841b854f80b9675f6b1f403b0c415ea6780f46e76d7c744f2d4d93004f4cdc533420efd490dcb0a80f298e6046ce974c64a45dab9cf86022bd478588e4f405b3e3d00a063746963616c2062797a616e74696e65206661756c7420746f6c6572616e6365880000000000000000", "trustedHeight": 10, diff --git a/ibc-solidity/test/besu-bft/fixtures/qbft.json b/ibc-solidity/test/besu-bft/fixtures/qbft.json index 18b58772c..6019bd0ca 100644 --- a/ibc-solidity/test/besu-bft/fixtures/qbft.json +++ b/ibc-solidity/test/besu-bft/fixtures/qbft.json @@ -11,7 +11,7 @@ ], "trustingPeriod": 1209600, "maxClockDrift": 15, - "updateHeight11": { + "adjacentUpdate": { "height": 34, "headerRlp": "0xf90385a07ee4185f15b458dcff8936e722e3792ddf28a3f6801ce06374969f54031b762aa01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d493479420c5edbcf6263cd9e30df395a2b914f6e939b9baa030defd9bc19472d5ccbb248e391b49320a77fd71652b0bafeddb78725ef28515a078e6f2f4fe203157e3d5c67a75ce82947103e360cc17f0a3d60e38b6c552a08aa00149f44a46b46c6429cf561eda5e72322b31debaa8ff69357298cb2e8206a524b901001000000000000000000000000004000000000000000000000000000000000000008000000000000010000000000000000000000000000000000000000020000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000002008000000000000000000000000020000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000001228402faf08082b349846a88e87bb90147f90144a0000000000000000000000000000000000000000000626573752032362e342e30f85494065f139d8a49e9926232cc4435159024cb5064fc940eb968de631abc65322ecdca5dfdf9c6296e52f49420c5edbcf6263cd9e30df395a2b914f6e939b9ba94543d3796700ee35803a1c43562a69fec08e1e423c080f8c9b8410e4196ae86251b9ad1f92ccd0deb5c615f5d5f55d32fd232b303bdd8e18c6e806ee612e50f641ec37026ccfb294ed1631bf0c7eac49b710fe2e66fd4082d356401b841e0646ce5a4c2005b25d182bbdd0c22022156e007d243699b9f928d58e6cd9ffe6613aaf033ec261c48c224fa1cba87886161aae03362de1fcc3871b3da3c70f600b84142ce15667100923022aa210debed209729367078b1fc71108f8dcfaa7c102032012fb03c701e8c854062fb4281e9dda4509932121a33dbb79ec0a47a4f738ff800a063746963616c2062797a616e74696e65206661756c7420746f6c6572616e636588000000000000000080a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b4218080a00000000000000000000000000000000000000000000000000000000000000000", "trustedHeight": 33, @@ -25,7 +25,7 @@ "0x543d3796700eE35803A1C43562a69FEc08E1e423" ] }, - "updateHeight12": { + "nonAdjacentUpdate": { "height": 35, "headerRlp": "0xf90386a0e8eb81a5cc7e4bc105561f792aed8d6ed967305e1460902b48544d9198519a65a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d4934794543d3796700ee35803a1c43562a69fec08e1e423a00bcab205a2b4819b25f76797dc4582c3818a56731f31904884f817a1a27fa442a0faa58af4eab20011acc6e66b20b1bc8a8d8b444e62e76b6e49fa790284a6538fa08e05526631e8b9e7f21d1d65cfdef62d8ac6d6d11050db08db39741243eed4eeb901001000000000000008800000000004000000000000000000001000000000000000008000000000000010000000000000400000040000000000000000000204000000000040000000000000020800100400800000000004100000000002000000000000000000000000800001000000000000000008000000000000001000000000000000000000100000080000000008000800000000008000000000000000000000000000000000000004000000000000000000000000000000000000000000000010000200000000000010004000000000000000000400000080000000004000000000000000000000000800000008000000000000000000000000000000000001238402faf0808306784b846a88e87db90147f90144a0000000000000000000000000000000000000000000626573752032362e342e30f85494065f139d8a49e9926232cc4435159024cb5064fc940eb968de631abc65322ecdca5dfdf9c6296e52f49420c5edbcf6263cd9e30df395a2b914f6e939b9ba94543d3796700ee35803a1c43562a69fec08e1e423c080f8c9b841eae1fc67c37231c16d0db99ee0b2ef4e72351cccfad04fac8cd3a425e4adf73660f50280839ad121cbc89d352bb2b199b4ee44edfe19db2321933daedd261d9900b841328d044bbe376b4be8495b33faebea0bbfaf40f9c37604ef9d8fe49243cf7f4f2274fafe780d9a0d63e5177f25ecb4fa40382e767856a424467102ef8795530a01b841ad76a8c3edacc84e6341df92e64b3e1756c90bd8cb0d5c9194bf330c80da5e217ec191891813deb925a4b2d012cf919e561ac37359f1788abc589042ac115d9001a063746963616c2062797a616e74696e65206661756c7420746f6c6572616e636588000000000000000080a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b4218080a00000000000000000000000000000000000000000000000000000000000000000", "trustedHeight": 33, @@ -39,19 +39,19 @@ "0x543d3796700eE35803A1C43562a69FEc08E1e423" ] }, - "lowQuorumHeight12": { + "lowQuorumUpdate": { "height": 35, "headerRlp": "0xf90343a0e8eb81a5cc7e4bc105561f792aed8d6ed967305e1460902b48544d9198519a65a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d4934794543d3796700ee35803a1c43562a69fec08e1e423a00bcab205a2b4819b25f76797dc4582c3818a56731f31904884f817a1a27fa442a0faa58af4eab20011acc6e66b20b1bc8a8d8b444e62e76b6e49fa790284a6538fa08e05526631e8b9e7f21d1d65cfdef62d8ac6d6d11050db08db39741243eed4eeb901001000000000000008800000000004000000000000000000001000000000000000008000000000000010000000000000400000040000000000000000000204000000000040000000000000020800100400800000000004100000000002000000000000000000000000800001000000000000000008000000000000001000000000000000000000100000080000000008000800000000008000000000000000000000000000000000000004000000000000000000000000000000000000000000000010000200000000000010004000000000000000000400000080000000004000000000000000000000000800000008000000000000000000000000000000000001238402faf0808306784b846a88e87db90104f90101a0000000000000000000000000000000000000000000626573752032362e342e30f85494065f139d8a49e9926232cc4435159024cb5064fc940eb968de631abc65322ecdca5dfdf9c6296e52f49420c5edbcf6263cd9e30df395a2b914f6e939b9ba94543d3796700ee35803a1c43562a69fec08e1e423c080f886b841eae1fc67c37231c16d0db99ee0b2ef4e72351cccfad04fac8cd3a425e4adf73660f50280839ad121cbc89d352bb2b199b4ee44edfe19db2321933daedd261d9900b841328d044bbe376b4be8495b33faebea0bbfaf40f9c37604ef9d8fe49243cf7f4f2274fafe780d9a0d63e5177f25ecb4fa40382e767856a424467102ef8795530a01a063746963616c2062797a616e74696e65206661756c7420746f6c6572616e636588000000000000000080a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b4218080a00000000000000000000000000000000000000000000000000000000000000000", "trustedHeight": 33, "accountProof": "0x" }, - "conflictingHeight12": { + "conflictingUpdate": { "height": 35, "headerRlp": "0xf90386a084d5dbd206ef4a465f66c8b14ce809687baa221677a986bc15ec5b99b8579e8da01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d4934794065f139d8a49e9926232cc4435159024cb5064fca02bbf0aa2342ab306dda9aa494f3ffe8a2fb2ebd327bf99fe2f4609e5d56a287fa0ede1198cf1f6072bfe88d1beabbbb3ceefda3094b5b6ca1aa0e50e5aa58d5aa0a0c2f035f70c9a89c2f0fbf3b4fad07d005b637eaaf0ae084de4a189de91414442b901000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000400000000000000000000000000204000000000000000000000000000008000000000000000004000000000002000000000000000000000000000000000000000200000000000000000000000000000000000000000000180000000000000000000000000000000000000000000000000000000100000000000004000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000004000000000200000000000000000000000000000000000000000000000000000000001238402faf080830b245a846a88e87fb90147f90144a0000000000000000000000000000000000000000000626573752032362e342e30f85494065f139d8a49e9926232cc4435159024cb5064fc940eb968de631abc65322ecdca5dfdf9c6296e52f49420c5edbcf6263cd9e30df395a2b914f6e939b9ba94543d3796700ee35803a1c43562a69fec08e1e423c080f8c9b841fa5785d98739747d89cb99b923440ce46a4d1c66c9cf9d1171a6b70bbaeeecf3000da2ce63d7c7e284da788bade5423ad89ca27b009cc5ab25f3d164e829b6bd01b841b05d0d27772ddb76da6b8094d099b4e6b158290825c7756f583be9fa887f0c9d528cb2cdfaa9147dbca6f947a97e488226bc4e0253a6f8a724b2b2a8eecd16fc00b8419e75966c499c86f1178194190c747387a0e70cdb7eb0a826896b66781fe381074df6b59ae6320464d9c5ad6417157390a8278bded19f5965b110edf22f684af500a063746963616c2062797a616e74696e65206661756c7420746f6c6572616e636588000000000000000080a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b4218080a00000000000000000000000000000000000000000000000000000000000000000", "trustedHeight": 33, "accountProof": "0xf902b2f901f1a0886aec3477fe3ac6276485bfaf3e5e1eea382e6911831691f50c734edcea799e80a08573bfe9264ed8b6afc58b400efeaae64f1d56bc8396d44a2dcfd17a9c14b7a2a0174fa4f59759c5446865fa6777e34929c1bc09c97412a84c064dd7864ed625e7a01d272d6cf8f93bc15533e54ea3f459a982fc32e1272d95cf1d0cde1361463cfda0682e0509d82289dcb84f9d366ed881bfe4655d3c15de298e3d6fe4183d7051cca0f9b17a214dc86111bc5c9310d57aac2486dd4eda6ae8da9caa0bb2185b4015b9a060613dc1091a24ed1576c9103e09c5267bf509441384562347123960d496cc8ba0014abed6a424575260405210754b1aa0d4cabe50e8616ac231e424973fc0a895a060bd3b16ddfd75eae7933b7d0dbf717adb2c8b16573d4706eec89b33a71be71ca00e4d3a60002f359ab48688dc19ebd727bccb488984e27264d91bcba10302b7faa0ccca73c8748a8ec56ef293bee631a7d21ef1e1ec8b053e976f6ef3faa50187fba0613dbbef57a2660c21ec8c864749de69ac0bc4b59f6aef6477a090fdd51f467aa034d7ac756aa6ef347f0e3dc9a6f4db4409baca5d1e7d75dbff0842795d3b3d11a05edc383ad614e86f1da2e1a91d7e85ae5ab1d098a0d47623ef13d49d02754f8ea0c345faa773370853ac7afa5d32956ce53465ceac1e060e424343b39d9793397680f8518080a0f3ae7979f8d7015e2141c041cec64bc388a9362583c0e9014baec75c098bbe24808080808080808080a0df2fc47ed0c87770a1fbcd193fbba94e57e0aa2a3d3960a8daa84dd1fc39d76e80808080f869a020b221f4fe86714230ec6dfaf784ee106a9f8901d542e537af01e28564065574b846f8440180a061734a2ddcb2c34ad14a2bb4f7326dc4fa7e4dd4c6be97ba2e2d2fdd03b77f20a07f79b8b370510aa3a9ea8536a9459c92de9493272cd5fe45c02364cfe254a9a7" }, - "lowOverlapHeight13": { + "lowOverlapUpdate": { "height": 36, "headerRlp": "0xf90386a084d5dbd206ef4a465f66c8b14ce809687baa221677a986bc15ec5b99b8579e8da01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d4934794065f139d8a49e9926232cc4435159024cb5064fca02bbf0aa2342ab306dda9aa494f3ffe8a2fb2ebd327bf99fe2f4609e5d56a287fa0ede1198cf1f6072bfe88d1beabbbb3ceefda3094b5b6ca1aa0e50e5aa58d5aa0a0c2f035f70c9a89c2f0fbf3b4fad07d005b637eaaf0ae084de4a189de91414442b901000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000400000000000000000000000000204000000000000000000000000000008000000000000000004000000000002000000000000000000000000000000000000000200000000000000000000000000000000000000000000180000000000000000000000000000000000000000000000000000000100000000000004000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000004000000000200000000000000000000000000000000000000000000000000000000001248402faf080830b245a846a88e87fb90147f90144a0000000000000000000000000000000000000000000626573752032362e342e30f85494065f139d8a49e9926232cc4435159024cb5064fc9446a5b7e742f9ad777ef8bb85aebc717e7433dc47946af3e238490ca4b6ae4f1efdf12c04cc160423c3941780ffe5324fe74e6f2ef012edc9bd205e74555bc080f8c9b8411abc319e0b1a343bf29a207a0369df6b6869c7cd07611807e5ad78e514033fa700cafa3268fba741f02366e7fa5fb7c86074a5edac1da2b602a77f3b81bb33fa00b841f58c52cac0586900e5222700194f1c1745d0d1840f8e7f69b9cc3739da58d67a680b35b14ca35a8cc997e8cc8f05a22503349d897eaec6343bd6255f8dcd349101b841a22b308f750cc54f70abbe43c53310e9c774d652ee79ef1f08ec0ae44d2204331bbb8944e223f0f79455dfa52dcf4af24ae16e333db6c859728253fb2dcb7e9401a063746963616c2062797a616e74696e65206661756c7420746f6c6572616e636588000000000000000080a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b4218080a00000000000000000000000000000000000000000000000000000000000000000", "trustedHeight": 33, @@ -70,4 +70,4 @@ "path": "0x626573752d636861696e2d61020000000000000001", "expectedTimestamp": 1787357309 } -} \ No newline at end of file +} diff --git a/packages/go-abigen/dummy/contract.go b/packages/go-abigen/dummy/contract.go deleted file mode 100644 index b2eb6e848..000000000 --- a/packages/go-abigen/dummy/contract.go +++ /dev/null @@ -1,339 +0,0 @@ -// Code generated - DO NOT EDIT. -// This file is a generated binding and any manual changes will be lost. - -package dummy - -import ( - "errors" - "math/big" - "strings" - - ethereum "github.com/ethereum/go-ethereum" - "github.com/ethereum/go-ethereum/accounts/abi" - "github.com/ethereum/go-ethereum/accounts/abi/bind" - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/core/types" - "github.com/ethereum/go-ethereum/event" -) - -// Reference imports to suppress errors if they are not otherwise used. -var ( - _ = errors.New - _ = big.NewInt - _ = strings.NewReader - _ = ethereum.NotFound - _ = bind.Bind - _ = common.Big1 - _ = types.BloomLookup - _ = event.NewSubscription - _ = abi.ConvertType -) - -// IICS02ClientMsgsHeight is an auto generated low-level Go binding around an user-defined struct. -type IICS02ClientMsgsHeight struct { - RevisionNumber uint64 - RevisionHeight uint64 -} - -// ILightClientMsgsMsgVerifyMembership is an auto generated low-level Go binding around an user-defined struct. -type ILightClientMsgsMsgVerifyMembership struct { - Proof []byte - ProofHeight IICS02ClientMsgsHeight - Path [][]byte - Value []byte -} - -// ILightClientMsgsMsgVerifyNonMembership is an auto generated low-level Go binding around an user-defined struct. -type ILightClientMsgsMsgVerifyNonMembership struct { - Proof []byte - ProofHeight IICS02ClientMsgsHeight - Path [][]byte -} - -// ContractMetaData contains all meta data concerning the Contract contract. -var ContractMetaData = &bind.MetaData{ - ABI: "[{\"type\":\"function\",\"name\":\"getClientState\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"misbehaviour\",\"inputs\":[{\"name\":\"\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"updateClient\",\"inputs\":[{\"name\":\"updateMsg\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"enumILightClientMsgs.UpdateResult\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"verifyMembership\",\"inputs\":[{\"name\":\"msg_\",\"type\":\"tuple\",\"internalType\":\"structILightClientMsgs.MsgVerifyMembership\",\"components\":[{\"name\":\"proof\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"proofHeight\",\"type\":\"tuple\",\"internalType\":\"structIICS02ClientMsgs.Height\",\"components\":[{\"name\":\"revisionNumber\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"revisionHeight\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"name\":\"path\",\"type\":\"bytes[]\",\"internalType\":\"bytes[]\"},{\"name\":\"value\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"verifyNonMembership\",\"inputs\":[{\"name\":\"msg_\",\"type\":\"tuple\",\"internalType\":\"structILightClientMsgs.MsgVerifyNonMembership\",\"components\":[{\"name\":\"proof\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"proofHeight\",\"type\":\"tuple\",\"internalType\":\"structIICS02ClientMsgs.Height\",\"components\":[{\"name\":\"revisionNumber\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"revisionHeight\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"name\":\"path\",\"type\":\"bytes[]\",\"internalType\":\"bytes[]\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"error\",\"name\":\"MembershipExists\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"MissingMembership\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"UnknownHeight\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ValueMismatch\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ZeroTimestamp\",\"inputs\":[]}]", - Bin: "0x60808060405234601557610ab7908161001a8239f35b5f80fdfe6080806040526004361015610012575f80fd5b5f3560e01c9081630bece356146102ac575080634d6d9ffb1461020d578063682ed5f0146100d2578063ddba6537146100c25763ef913a4b14610053575f80fd5b346100be575f6003193601126100be576100ba60405167ffffffffffffffff5f54818116602084015260401c16604082015267ffffffffffffffff600154166060820152606081526100a66080826107a9565b604051918291602083526020830190610768565b0390f35b5f80fd5b346100be576100d036610717565b005b346100be5760206003193601126100be5760043567ffffffffffffffff81116100be578036039060a06003198301126100be57602481019161012d61011684610929565b93610127606485018560040161085d565b9161098f565b5f52600360205260405f20549182156101e5577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdd608482013592018212156100be570160048101359067ffffffffffffffff82116100be5760240181360381136100be5761019c9136916107f9565b60208151910120036101bd5760209067ffffffffffffffff60405191168152f35b7fdd8e4af7000000000000000000000000000000000000000000000000000000005f5260045ffd5b7ff6b593a3000000000000000000000000000000000000000000000000000000005f5260045ffd5b346100be5760206003193601126100be5760043567ffffffffffffffff81116100be57608060031982360301126100be5761025f6024820161012761025182610929565b93606481019060040161085d565b5f52600360205260405f20546102845760209067ffffffffffffffff60405191168152f35b7f679fc91d000000000000000000000000000000000000000000000000000000005f5260045ffd5b346100be576102ba36610717565b8101906020818303126100be5780359067ffffffffffffffff82116100be570191828203608081126100be57606082019082821067ffffffffffffffff8311176106ea576040918252126100be576040516103148161078d565b61031d846107cc565b815261032b602085016107cc565b6020820152815261033e604084016107cc565b926020820193845260608101359067ffffffffffffffff82116100be57019180601f840112156100be57823592610374846107e1565b9361038260405195866107a9565b80855260208086019160051b830101918383116100be5760208101915b8383106105ef578787876040810191825267ffffffffffffffff835116156105c757519167ffffffffffffffff80845116916103e3602086019383855116906108b1565b82825116905f52600260205260405f20907fffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000825416179055511680602060405161042c8161078d565b868152015267ffffffffffffffff8451167fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000005f5416175f5581517fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff6fffffffffffffffff00000000000000005f549260401b169116175f557fffffffffffffffffffffffffffffffffffffffffffffffff000000000000000060015416176001555f5b825180518210156105bd576020908260051b010151805160405160208101916040820160208452815180915260608301602060608360051b8601019301915f5b81811061057657505050506001949392826105386020946105599403601f1981018352826107a9565b51902067ffffffffffffffff89511667ffffffffffffffff885116906108e3565b91015160208151910120905f52600360205260405f2055016104cf565b909192936020806105b1837fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa08a600196030188528851610768565b9601940192910161050f565b60206040515f8152f35b7fda16d767000000000000000000000000000000000000000000000000000000005f5260045ffd5b823567ffffffffffffffff81116100be578201906040601f1983880301126100be576040519061061e8261078d565b602083013567ffffffffffffffff81116100be5760209084010187601f820112156100be57803561064e816107e1565b9161065c60405193846107a9565b81835260208084019260051b820101918a83116100be5760208201905b8382106106bc5750505050825260408301359167ffffffffffffffff83116100be576106ad8860208096958196010161083f565b8382015281520192019161039f565b813567ffffffffffffffff81116100be576020916106df8e84809488010161083f565b815201910190610679565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b9060206003198301126100be5760043567ffffffffffffffff81116100be57826023820112156100be5780600401359267ffffffffffffffff84116100be57602484830101116100be576024019190565b90601f19601f602080948051918291828752018686015e5f8582860101520116010190565b6040810190811067ffffffffffffffff8211176106ea57604052565b90601f601f19910116810190811067ffffffffffffffff8211176106ea57604052565b359067ffffffffffffffff821682036100be57565b67ffffffffffffffff81116106ea5760051b60200190565b92919267ffffffffffffffff82116106ea57604051916108236020601f19601f84011601846107a9565b8294818452818301116100be578281602093845f960137010152565b9080601f830112156100be5781602061085a933591016107f9565b90565b9035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1813603018212156100be570180359067ffffffffffffffff82116100be57602001918160051b360383136100be57565b9067ffffffffffffffff60405191816020840194168452166040820152604081526108dd6060826107a9565b51902090565b9167ffffffffffffffff604051928160208501951685521660408301526060820152606081526108dd6080826107a9565b3567ffffffffffffffff811681036100be5790565b61094890610942602061093b83610914565b9201610914565b906108b1565b5f52600260205267ffffffffffffffff60405f20541680156109675790565b7f8da291bd000000000000000000000000000000000000000000000000000000005f5260045ffd5b909291926109a860206109a184610914565b9301610914565b90604051946020860191816040880160208552526060870160608360051b89010192825f907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1813603015b838310610a215750505050505094610a188161085a969703601f1981018352826107a9565b519020916108e3565b9091929394957fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa08c82030186528635828112156100be578301906020823592019167ffffffffffffffff81116100be5780360383136100be57602082601f19601f8480600198869897879852868601375f848201860152011601019801960194930191906109f356fea164736f6c634300081c000a", -} - -// ContractABI is the input ABI used to generate the binding from. -// Deprecated: Use ContractMetaData.ABI instead. -var ContractABI = ContractMetaData.ABI - -// ContractBin is the compiled bytecode used for deploying new contracts. -// Deprecated: Use ContractMetaData.Bin instead. -var ContractBin = ContractMetaData.Bin - -// DeployContract deploys a new Ethereum contract, binding an instance of Contract to it. -func DeployContract(auth *bind.TransactOpts, backend bind.ContractBackend) (common.Address, *types.Transaction, *Contract, error) { - parsed, err := ContractMetaData.GetAbi() - if err != nil { - return common.Address{}, nil, nil, err - } - if parsed == nil { - return common.Address{}, nil, nil, errors.New("GetABI returned nil") - } - - address, tx, contract, err := bind.DeployContract(auth, *parsed, common.FromHex(ContractBin), backend) - if err != nil { - return common.Address{}, nil, nil, err - } - return address, tx, &Contract{ContractCaller: ContractCaller{contract: contract}, ContractTransactor: ContractTransactor{contract: contract}, ContractFilterer: ContractFilterer{contract: contract}}, nil -} - -// Contract is an auto generated Go binding around an Ethereum contract. -type Contract struct { - ContractCaller // Read-only binding to the contract - ContractTransactor // Write-only binding to the contract - ContractFilterer // Log filterer for contract events -} - -// ContractCaller is an auto generated read-only Go binding around an Ethereum contract. -type ContractCaller struct { - contract *bind.BoundContract // Generic contract wrapper for the low level calls -} - -// ContractTransactor is an auto generated write-only Go binding around an Ethereum contract. -type ContractTransactor struct { - contract *bind.BoundContract // Generic contract wrapper for the low level calls -} - -// ContractFilterer is an auto generated log filtering Go binding around an Ethereum contract events. -type ContractFilterer struct { - contract *bind.BoundContract // Generic contract wrapper for the low level calls -} - -// ContractSession is an auto generated Go binding around an Ethereum contract, -// with pre-set call and transact options. -type ContractSession struct { - Contract *Contract // Generic contract binding to set the session for - CallOpts bind.CallOpts // Call options to use throughout this session - TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session -} - -// ContractCallerSession is an auto generated read-only Go binding around an Ethereum contract, -// with pre-set call options. -type ContractCallerSession struct { - Contract *ContractCaller // Generic contract caller binding to set the session for - CallOpts bind.CallOpts // Call options to use throughout this session -} - -// ContractTransactorSession is an auto generated write-only Go binding around an Ethereum contract, -// with pre-set transact options. -type ContractTransactorSession struct { - Contract *ContractTransactor // Generic contract transactor binding to set the session for - TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session -} - -// ContractRaw is an auto generated low-level Go binding around an Ethereum contract. -type ContractRaw struct { - Contract *Contract // Generic contract binding to access the raw methods on -} - -// ContractCallerRaw is an auto generated low-level read-only Go binding around an Ethereum contract. -type ContractCallerRaw struct { - Contract *ContractCaller // Generic read-only contract binding to access the raw methods on -} - -// ContractTransactorRaw is an auto generated low-level write-only Go binding around an Ethereum contract. -type ContractTransactorRaw struct { - Contract *ContractTransactor // Generic write-only contract binding to access the raw methods on -} - -// NewContract creates a new instance of Contract, bound to a specific deployed contract. -func NewContract(address common.Address, backend bind.ContractBackend) (*Contract, error) { - contract, err := bindContract(address, backend, backend, backend) - if err != nil { - return nil, err - } - return &Contract{ContractCaller: ContractCaller{contract: contract}, ContractTransactor: ContractTransactor{contract: contract}, ContractFilterer: ContractFilterer{contract: contract}}, nil -} - -// NewContractCaller creates a new read-only instance of Contract, bound to a specific deployed contract. -func NewContractCaller(address common.Address, caller bind.ContractCaller) (*ContractCaller, error) { - contract, err := bindContract(address, caller, nil, nil) - if err != nil { - return nil, err - } - return &ContractCaller{contract: contract}, nil -} - -// NewContractTransactor creates a new write-only instance of Contract, bound to a specific deployed contract. -func NewContractTransactor(address common.Address, transactor bind.ContractTransactor) (*ContractTransactor, error) { - contract, err := bindContract(address, nil, transactor, nil) - if err != nil { - return nil, err - } - return &ContractTransactor{contract: contract}, nil -} - -// NewContractFilterer creates a new log filterer instance of Contract, bound to a specific deployed contract. -func NewContractFilterer(address common.Address, filterer bind.ContractFilterer) (*ContractFilterer, error) { - contract, err := bindContract(address, nil, nil, filterer) - if err != nil { - return nil, err - } - return &ContractFilterer{contract: contract}, nil -} - -// bindContract binds a generic wrapper to an already deployed contract. -func bindContract(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error) { - parsed, err := ContractMetaData.GetAbi() - if err != nil { - return nil, err - } - return bind.NewBoundContract(address, *parsed, caller, transactor, filterer), nil -} - -// Call invokes the (constant) contract method with params as input values and -// sets the output to result. The result type might be a single field for simple -// returns, a slice of interfaces for anonymous returns and a struct for named -// returns. -func (_Contract *ContractRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error { - return _Contract.Contract.ContractCaller.contract.Call(opts, result, method, params...) -} - -// Transfer initiates a plain transaction to move funds to the contract, calling -// its default method if one is available. -func (_Contract *ContractRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { - return _Contract.Contract.ContractTransactor.contract.Transfer(opts) -} - -// Transact invokes the (paid) contract method with params as input values. -func (_Contract *ContractRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { - return _Contract.Contract.ContractTransactor.contract.Transact(opts, method, params...) -} - -// Call invokes the (constant) contract method with params as input values and -// sets the output to result. The result type might be a single field for simple -// returns, a slice of interfaces for anonymous returns and a struct for named -// returns. -func (_Contract *ContractCallerRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error { - return _Contract.Contract.contract.Call(opts, result, method, params...) -} - -// Transfer initiates a plain transaction to move funds to the contract, calling -// its default method if one is available. -func (_Contract *ContractTransactorRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { - return _Contract.Contract.contract.Transfer(opts) -} - -// Transact invokes the (paid) contract method with params as input values. -func (_Contract *ContractTransactorRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { - return _Contract.Contract.contract.Transact(opts, method, params...) -} - -// GetClientState is a free data retrieval call binding the contract method 0xef913a4b. -// -// Solidity: function getClientState() view returns(bytes) -func (_Contract *ContractCaller) GetClientState(opts *bind.CallOpts) ([]byte, error) { - var out []interface{} - err := _Contract.contract.Call(opts, &out, "getClientState") - - if err != nil { - return *new([]byte), err - } - - out0 := *abi.ConvertType(out[0], new([]byte)).(*[]byte) - - return out0, err - -} - -// GetClientState is a free data retrieval call binding the contract method 0xef913a4b. -// -// Solidity: function getClientState() view returns(bytes) -func (_Contract *ContractSession) GetClientState() ([]byte, error) { - return _Contract.Contract.GetClientState(&_Contract.CallOpts) -} - -// GetClientState is a free data retrieval call binding the contract method 0xef913a4b. -// -// Solidity: function getClientState() view returns(bytes) -func (_Contract *ContractCallerSession) GetClientState() ([]byte, error) { - return _Contract.Contract.GetClientState(&_Contract.CallOpts) -} - -// Misbehaviour is a paid mutator transaction binding the contract method 0xddba6537. -// -// Solidity: function misbehaviour(bytes ) returns() -func (_Contract *ContractTransactor) Misbehaviour(opts *bind.TransactOpts, arg0 []byte) (*types.Transaction, error) { - return _Contract.contract.Transact(opts, "misbehaviour", arg0) -} - -// Misbehaviour is a paid mutator transaction binding the contract method 0xddba6537. -// -// Solidity: function misbehaviour(bytes ) returns() -func (_Contract *ContractSession) Misbehaviour(arg0 []byte) (*types.Transaction, error) { - return _Contract.Contract.Misbehaviour(&_Contract.TransactOpts, arg0) -} - -// Misbehaviour is a paid mutator transaction binding the contract method 0xddba6537. -// -// Solidity: function misbehaviour(bytes ) returns() -func (_Contract *ContractTransactorSession) Misbehaviour(arg0 []byte) (*types.Transaction, error) { - return _Contract.Contract.Misbehaviour(&_Contract.TransactOpts, arg0) -} - -// UpdateClient is a paid mutator transaction binding the contract method 0x0bece356. -// -// Solidity: function updateClient(bytes updateMsg) returns(uint8) -func (_Contract *ContractTransactor) UpdateClient(opts *bind.TransactOpts, updateMsg []byte) (*types.Transaction, error) { - return _Contract.contract.Transact(opts, "updateClient", updateMsg) -} - -// UpdateClient is a paid mutator transaction binding the contract method 0x0bece356. -// -// Solidity: function updateClient(bytes updateMsg) returns(uint8) -func (_Contract *ContractSession) UpdateClient(updateMsg []byte) (*types.Transaction, error) { - return _Contract.Contract.UpdateClient(&_Contract.TransactOpts, updateMsg) -} - -// UpdateClient is a paid mutator transaction binding the contract method 0x0bece356. -// -// Solidity: function updateClient(bytes updateMsg) returns(uint8) -func (_Contract *ContractTransactorSession) UpdateClient(updateMsg []byte) (*types.Transaction, error) { - return _Contract.Contract.UpdateClient(&_Contract.TransactOpts, updateMsg) -} - -// VerifyMembership is a paid mutator transaction binding the contract method 0x682ed5f0. -// -// Solidity: function verifyMembership((bytes,(uint64,uint64),bytes[],bytes) msg_) returns(uint256) -func (_Contract *ContractTransactor) VerifyMembership(opts *bind.TransactOpts, msg_ ILightClientMsgsMsgVerifyMembership) (*types.Transaction, error) { - return _Contract.contract.Transact(opts, "verifyMembership", msg_) -} - -// VerifyMembership is a paid mutator transaction binding the contract method 0x682ed5f0. -// -// Solidity: function verifyMembership((bytes,(uint64,uint64),bytes[],bytes) msg_) returns(uint256) -func (_Contract *ContractSession) VerifyMembership(msg_ ILightClientMsgsMsgVerifyMembership) (*types.Transaction, error) { - return _Contract.Contract.VerifyMembership(&_Contract.TransactOpts, msg_) -} - -// VerifyMembership is a paid mutator transaction binding the contract method 0x682ed5f0. -// -// Solidity: function verifyMembership((bytes,(uint64,uint64),bytes[],bytes) msg_) returns(uint256) -func (_Contract *ContractTransactorSession) VerifyMembership(msg_ ILightClientMsgsMsgVerifyMembership) (*types.Transaction, error) { - return _Contract.Contract.VerifyMembership(&_Contract.TransactOpts, msg_) -} - -// VerifyNonMembership is a paid mutator transaction binding the contract method 0x4d6d9ffb. -// -// Solidity: function verifyNonMembership((bytes,(uint64,uint64),bytes[]) msg_) returns(uint256) -func (_Contract *ContractTransactor) VerifyNonMembership(opts *bind.TransactOpts, msg_ ILightClientMsgsMsgVerifyNonMembership) (*types.Transaction, error) { - return _Contract.contract.Transact(opts, "verifyNonMembership", msg_) -} - -// VerifyNonMembership is a paid mutator transaction binding the contract method 0x4d6d9ffb. -// -// Solidity: function verifyNonMembership((bytes,(uint64,uint64),bytes[]) msg_) returns(uint256) -func (_Contract *ContractSession) VerifyNonMembership(msg_ ILightClientMsgsMsgVerifyNonMembership) (*types.Transaction, error) { - return _Contract.Contract.VerifyNonMembership(&_Contract.TransactOpts, msg_) -} - -// VerifyNonMembership is a paid mutator transaction binding the contract method 0x4d6d9ffb. -// -// Solidity: function verifyNonMembership((bytes,(uint64,uint64),bytes[]) msg_) returns(uint256) -func (_Contract *ContractTransactorSession) VerifyNonMembership(msg_ ILightClientMsgsMsgVerifyNonMembership) (*types.Transaction, error) { - return _Contract.Contract.VerifyNonMembership(&_Contract.TransactOpts, msg_) -} diff --git a/packages/proof-api/modules/besu-to-besu/src/tx_builder.rs b/packages/proof-api/modules/besu-to-besu/src/tx_builder.rs index 312d62a11..11a80d44c 100644 --- a/packages/proof-api/modules/besu-to-besu/src/tx_builder.rs +++ b/packages/proof-api/modules/besu-to-besu/src/tx_builder.rs @@ -511,7 +511,7 @@ mod tests { #[derive(Debug, Deserialize)] #[serde(rename_all = "camelCase")] struct Fixture { - update_height12: UpdateFixture, + non_adjacent_update: UpdateFixture, membership: ProofFixture, non_membership: ProofFixture, } @@ -569,10 +569,10 @@ mod tests { #[test] fn extracts_validators_from_fixture_header() { let fixture = load_fixture(); - let header_rlp = decode_hex_bytes(&fixture.update_height12.header_rlp); + let header_rlp = decode_hex_bytes(&fixture.non_adjacent_update.header_rlp); let validators = extract_validators_from_header_extra_data(&header_rlp).unwrap(); let expected = fixture - .update_height12 + .non_adjacent_update .expected_validators .iter() .map(|address| Address::from_str(address).unwrap()) @@ -584,7 +584,7 @@ mod tests { #[test] fn packs_account_proof_nodes_without_reencoding_nodes() { let fixture = load_fixture(); - let account_proof_rlp = decode_hex_bytes(&fixture.update_height12.account_proof); + let account_proof_rlp = decode_hex_bytes(&fixture.non_adjacent_update.account_proof); let nodes = decode_proof_nodes(&account_proof_rlp); assert_eq!(encode_rlp_node_list(&nodes), account_proof_rlp); From 61e2829d38dc0805e3d72cca67497adfb9603c86 Mon Sep 17 00:00:00 2001 From: Gjermund Garaba Date: Tue, 25 Aug 2026 14:24:53 +0200 Subject: [PATCH 15/22] test(e2e): align Besu suite with project conventions Signed-off-by: Gjermund Garaba --- .github/workflows/e2e-attestor.yml | 2 +- e2e/interchaintestv8/besu_to_besu_test.go | 315 +++++++++++------- e2e/interchaintestv8/chainconfig/besu_qbft.go | 15 +- .../e2esuite/setup_ethereum.go | 13 +- .../ethereum/ethereum_test.go | 66 ---- .../types/besu_fixtures_test.go | 147 -------- 6 files changed, 209 insertions(+), 349 deletions(-) delete mode 100644 e2e/interchaintestv8/ethereum/ethereum_test.go delete mode 100644 e2e/interchaintestv8/types/besu_fixtures_test.go diff --git a/.github/workflows/e2e-attestor.yml b/.github/workflows/e2e-attestor.yml index 7e9ad1bef..34655d294 100644 --- a/.github/workflows/e2e-attestor.yml +++ b/.github/workflows/e2e-attestor.yml @@ -160,7 +160,7 @@ jobs: - name: Run Go package tests run: | cd e2e/interchaintestv8 - go test ./e2esuite ./types + go test ./e2esuite - name: Run Besu to Besu test suite run: | cd e2e/interchaintestv8 diff --git a/e2e/interchaintestv8/besu_to_besu_test.go b/e2e/interchaintestv8/besu_to_besu_test.go index abe5528ab..e4c766598 100644 --- a/e2e/interchaintestv8/besu_to_besu_test.go +++ b/e2e/interchaintestv8/besu_to_besu_test.go @@ -38,7 +38,6 @@ import ( ) const ( - besuToBesuChainAID = 1337 besuToBesuChainBID = 1338 besuToBesuClientOnA = "besu-chain-b" @@ -47,10 +46,7 @@ const ( besuToBesuConsensusTypeQBFT = "qbft" ) -var ( - besuToBesuChainAIPs = [4]string{"10.42.0.2", "10.42.0.3", "10.42.0.4", "10.42.0.5"} - besuToBesuChainBIPs = [4]string{"10.43.0.2", "10.43.0.3", "10.43.0.4", "10.43.0.5"} -) +var besuToBesuChainBIPs = [4]string{"10.43.0.2", "10.43.0.3", "10.43.0.4", "10.43.0.5"} type besuToBesuChainState struct { network chainconfig.BesuQBFTChain @@ -116,12 +112,7 @@ func (s *BesuToBesuTestSuite) SetupSuite() { s.Require().NoError(err) s.Require().NoError(os.Chdir("../..")) - s.chainA = s.spinUpChain(ctx, chainconfig.BesuQBFTParams{ - ChainID: besuToBesuChainAID, - Subnet: "10.42.0.0/16", - Gateway: "10.42.0.1", - ValidatorIPs: besuToBesuChainAIPs, - }) + s.chainA = s.spinUpChain(ctx, chainconfig.DefaultBesuQBFTParams()) s.chainB = s.spinUpChain(ctx, chainconfig.BesuQBFTParams{ ChainID: besuToBesuChainBID, @@ -147,20 +138,49 @@ func (s *BesuToBesuTestSuite) SetupSuite() { } func (s *BesuToBesuTestSuite) Test_Deploy() { - transferOnA, err := s.chainA.ics26.GetIBCApp(nil, transfertypes.PortID) - s.Require().NoError(err) - s.Require().Equal(strings.ToLower(s.chainA.contractAddresses.Ics20Transfer), strings.ToLower(transferOnA.Hex())) - - transferOnB, err := s.chainB.ics26.GetIBCApp(nil, transfertypes.PortID) - s.Require().NoError(err) - s.Require().Equal(strings.ToLower(s.chainB.contractAddresses.Ics20Transfer), strings.ToLower(transferOnB.Hex())) - - clientOnA, err := s.chainA.ics26.GetClient(nil, besuToBesuClientOnA) - s.Require().NoError(err) - s.Require().Equal(s.chainA.clientAddress, clientOnA) - clientOnB, err := s.chainB.ics26.GetClient(nil, besuToBesuClientOnB) - s.Require().NoError(err) - s.Require().Equal(s.chainB.clientAddress, clientOnB) + s.Require().True(s.Run("Verify ICS26 on Chain A", func() { + transferOnA, err := s.chainA.ics26.GetIBCApp(nil, transfertypes.PortID) + s.Require().NoError(err) + s.Require().Equal(strings.ToLower(s.chainA.contractAddresses.Ics20Transfer), strings.ToLower(transferOnA.Hex())) + })) + + s.Require().True(s.Run("Verify ICS26 on Chain B", func() { + transferOnB, err := s.chainB.ics26.GetIBCApp(nil, transfertypes.PortID) + s.Require().NoError(err) + s.Require().Equal(strings.ToLower(s.chainB.contractAddresses.Ics20Transfer), strings.ToLower(transferOnB.Hex())) + })) + + s.Require().True(s.Run("Verify Besu client on Chain A", func() { + clientOnA, err := s.chainA.ics26.GetClient(nil, besuToBesuClientOnA) + s.Require().NoError(err) + s.Require().Equal(s.chainA.clientAddress, clientOnA) + + counterparty, err := s.chainA.ics26.GetCounterparty(nil, besuToBesuClientOnA) + s.Require().NoError(err) + s.Require().Equal(besuToBesuClientOnB, counterparty.ClientId) + })) + + s.Require().True(s.Run("Verify Besu client on Chain B", func() { + clientOnB, err := s.chainB.ics26.GetClient(nil, besuToBesuClientOnB) + s.Require().NoError(err) + s.Require().Equal(s.chainB.clientAddress, clientOnB) + + counterparty, err := s.chainB.ics26.GetCounterparty(nil, besuToBesuClientOnB) + s.Require().NoError(err) + s.Require().Equal(besuToBesuClientOnA, counterparty.ClientId) + })) + + s.Require().True(s.Run("Verify Proof API Info A->B", func() { + info := s.waitForRelayerInfo(s.chainA.eth.ChainID.String(), s.chainB.eth.ChainID.String()) + s.Require().Equal(s.chainA.eth.ChainID.String(), info.SourceChain.ChainId) + s.Require().Equal(s.chainB.eth.ChainID.String(), info.TargetChain.ChainId) + })) + + s.Require().True(s.Run("Verify Proof API Info B->A", func() { + info := s.waitForRelayerInfo(s.chainB.eth.ChainID.String(), s.chainA.eth.ChainID.String()) + s.Require().Equal(s.chainB.eth.ChainID.String(), info.SourceChain.ChainId) + s.Require().Equal(s.chainA.eth.ChainID.String(), info.TargetChain.ChainId) + })) } func (s *BesuToBesuTestSuite) Test_ICS20TransferERC20FromChainAToChainB() { @@ -173,112 +193,157 @@ func (s *BesuToBesuTestSuite) Test_ICS20TransferERC20FromChainAToChainB() { ics26AddressB := ethcommon.HexToAddress(s.chainB.contractAddresses.Ics26Router) erc20AddressA := ethcommon.HexToAddress(s.chainA.contractAddresses.Erc20) - fundTx, err := s.chainA.erc20.Transfer(s.mustTransactOpts(&s.chainA, s.chainA.eth.Faucet), userAddressA, testvalues.StartingERC20Balance) - s.Require().NoError(err) - fundReceipt, err := s.chainA.eth.GetTxReciept(ctx, fundTx.Hash()) - s.Require().NoError(err) - s.Require().Equal(ethtypes.ReceiptStatusSuccessful, fundReceipt.Status) - - approveTx, err := s.chainA.erc20.Approve(s.mustTransactOpts(&s.chainA, s.chainA.user), ics20AddressA, transferAmount) - s.Require().NoError(err) - approveReceipt, err := s.chainA.eth.GetTxReciept(ctx, approveTx.Hash()) - s.Require().NoError(err) - s.Require().Equal(ethtypes.ReceiptStatusSuccessful, approveReceipt.Status) - - timeout := uint64(time.Now().Add(30 * time.Minute).Unix()) - sendTx, err := s.chainA.ics20.SendTransfer(s.mustTransactOpts(&s.chainA, s.chainA.user), ics20transfer.IICS20TransferMsgsSendTransferMsg{ - Denom: erc20AddressA, - Amount: transferAmount, - Receiver: strings.ToLower(userAddressB.Hex()), - TimeoutTimestamp: timeout, - SourceClient: besuToBesuClientOnA, - DestPort: transfertypes.PortID, - Memo: "", - }) - s.Require().NoError(err) - sendReceipt, err := s.chainA.eth.GetTxReciept(ctx, sendTx.Hash()) - s.Require().NoError(err) - s.Require().Equal(ethtypes.ReceiptStatusSuccessful, sendReceipt.Status) - - sendEvent, err := e2esuite.GetEvmEvent(sendReceipt, s.chainA.ics26.ParseSendPacket) - s.Require().NoError(err) - - escrowAddress, err := s.chainA.ics20.GetEscrow(nil, besuToBesuClientOnA) - s.Require().NoError(err) - escrowBalance, err := s.chainA.erc20.BalanceOf(nil, escrowAddress) - s.Require().NoError(err) - s.Require().Equal(0, transferAmount.Cmp(escrowBalance)) - - userBalanceA, err := s.chainA.erc20.BalanceOf(nil, userAddressA) - s.Require().NoError(err) - expectedBalanceA := new(big.Int).Sub(new(big.Int).Set(testvalues.StartingERC20Balance), transferAmount) - s.Require().Equal(0, expectedBalanceA.Cmp(userBalanceA)) - - relayAB, err := s.relayerClient.RelayByTx(context.Background(), &proofapitypes.RelayByTxRequest{ - SrcChain: s.chainA.eth.ChainID.String(), - DstChain: s.chainB.eth.ChainID.String(), - SourceTxIds: [][]byte{sendTx.Hash().Bytes()}, - SrcClientId: besuToBesuClientOnA, - DstClientId: besuToBesuClientOnB, - }) - s.Require().NoError(err) - s.Require().NotEmpty(relayAB.Tx) - s.Require().Equal(strings.ToLower(s.chainB.contractAddresses.Ics26Router), strings.ToLower(relayAB.Address)) - - recvReceipt, err := s.chainB.eth.BroadcastTx(ctx, s.chainB.relayerSubmitter, 15_000_000, &ics26AddressB, relayAB.Tx) - s.Require().NoError(err) - s.Require().Equal(ethtypes.ReceiptStatusSuccessful, recvReceipt.Status) - - writeAckEvent, err := e2esuite.GetEvmEvent(recvReceipt, s.chainB.ics26.ParseWriteAcknowledgement) - s.Require().NoError(err) - - ibcDenomOnB := fmt.Sprintf( - "%s/%s/%s", - writeAckEvent.Packet.Payloads[0].DestPort, - writeAckEvent.Packet.DestClient, - strings.ToLower(erc20AddressA.Hex()), + var ( + sendTxHash []byte + sendReceipt *ethtypes.Receipt + sendPacket ics26router.IICS26RouterMsgsPacket + recvReceipt *ethtypes.Receipt + ibcERC20OnB *ibcerc20.Contract + ackReceipt *ethtypes.Receipt ) - ibcERC20AddressOnB, err := s.chainB.ics20.IbcERC20Contract(nil, ibcDenomOnB) - s.Require().NoError(err) - ibcERC20OnB, err := ibcerc20.NewContract(ibcERC20AddressOnB, s.chainB.eth.RPCClient) - s.Require().NoError(err) - userBalanceB, err := ibcERC20OnB.BalanceOf(nil, userAddressB) - s.Require().NoError(err) - s.Require().Equal(0, transferAmount.Cmp(userBalanceB)) - - ackRelay, err := s.relayerClient.RelayByTx(context.Background(), &proofapitypes.RelayByTxRequest{ - SrcChain: s.chainB.eth.ChainID.String(), - DstChain: s.chainA.eth.ChainID.String(), - SourceTxIds: [][]byte{recvReceipt.TxHash.Bytes()}, - SrcClientId: besuToBesuClientOnB, - DstClientId: besuToBesuClientOnA, - }) - s.Require().NoError(err) - s.Require().NotEmpty(ackRelay.Tx) - s.Require().Equal(strings.ToLower(s.chainA.contractAddresses.Ics26Router), strings.ToLower(ackRelay.Address)) + s.Require().True(s.Run("Fund user on Chain A", func() { + fundTx, err := s.chainA.erc20.Transfer(s.mustTransactOpts(&s.chainA, s.chainA.eth.Faucet), userAddressA, testvalues.StartingERC20Balance) + s.Require().NoError(err) + + fundReceipt, err := s.chainA.eth.GetTxReciept(ctx, fundTx.Hash()) + s.Require().NoError(err) + s.Require().Equal(ethtypes.ReceiptStatusSuccessful, fundReceipt.Status) + })) + + s.Require().True(s.Run("Approve ICS20 on Chain A", func() { + approveTx, err := s.chainA.erc20.Approve(s.mustTransactOpts(&s.chainA, s.chainA.user), ics20AddressA, transferAmount) + s.Require().NoError(err) + + approveReceipt, err := s.chainA.eth.GetTxReciept(ctx, approveTx.Hash()) + s.Require().NoError(err) + s.Require().Equal(ethtypes.ReceiptStatusSuccessful, approveReceipt.Status) + })) + + s.Require().True(s.Run("Send transfer from Chain A to Chain B", func() { + timeout := uint64(time.Now().Add(30 * time.Minute).Unix()) + sendTx, err := s.chainA.ics20.SendTransfer(s.mustTransactOpts(&s.chainA, s.chainA.user), ics20transfer.IICS20TransferMsgsSendTransferMsg{ + Denom: erc20AddressA, + Amount: transferAmount, + Receiver: strings.ToLower(userAddressB.Hex()), + TimeoutTimestamp: timeout, + SourceClient: besuToBesuClientOnA, + DestPort: transfertypes.PortID, + Memo: "", + }) + s.Require().NoError(err) + + sendReceipt, err = s.chainA.eth.GetTxReciept(ctx, sendTx.Hash()) + s.Require().NoError(err) + s.Require().Equal(ethtypes.ReceiptStatusSuccessful, sendReceipt.Status) + sendTxHash = sendTx.Hash().Bytes() + + sendEvent, err := e2esuite.GetEvmEvent(sendReceipt, s.chainA.ics26.ParseSendPacket) + s.Require().NoError(err) + sendPacket = sendEvent.Packet + })) + + s.Require().True(s.Run("Verify balances on Chain A after send", func() { + escrowAddress, err := s.chainA.ics20.GetEscrow(nil, besuToBesuClientOnA) + s.Require().NoError(err) + + escrowBalance, err := s.chainA.erc20.BalanceOf(nil, escrowAddress) + s.Require().NoError(err) + s.Require().Equal(0, transferAmount.Cmp(escrowBalance)) + + userBalanceA, err := s.chainA.erc20.BalanceOf(nil, userAddressA) + s.Require().NoError(err) + expectedBalanceA := new(big.Int).Sub(new(big.Int).Set(testvalues.StartingERC20Balance), transferAmount) + s.Require().Equal(0, expectedBalanceA.Cmp(userBalanceA)) + })) + + s.Require().True(s.Run("Relay packet to Chain B", func() { + var relayTx []byte + s.Require().True(s.Run("Retrieve relay tx", func() { + relayAB, err := s.relayerClient.RelayByTx(context.Background(), &proofapitypes.RelayByTxRequest{ + SrcChain: s.chainA.eth.ChainID.String(), + DstChain: s.chainB.eth.ChainID.String(), + SourceTxIds: [][]byte{sendTxHash}, + SrcClientId: besuToBesuClientOnA, + DstClientId: besuToBesuClientOnB, + }) + s.Require().NoError(err) + s.Require().NotEmpty(relayAB.Tx) + s.Require().Equal(strings.ToLower(s.chainB.contractAddresses.Ics26Router), strings.ToLower(relayAB.Address)) + relayTx = relayAB.Tx + })) - ackReceipt, err := s.chainA.eth.BroadcastTx(ctx, s.chainA.relayerSubmitter, 15_000_000, &ics26AddressA, ackRelay.Tx) - s.Require().NoError(err) - s.Require().Equal(ethtypes.ReceiptStatusSuccessful, ackReceipt.Status) + s.Require().True(s.Run("Broadcast relay tx on Chain B", func() { + var err error + recvReceipt, err = s.chainB.eth.BroadcastTx(ctx, s.chainB.relayerSubmitter, 15_000_000, &ics26AddressB, relayTx) + s.Require().NoError(err) + s.Require().Equal(ethtypes.ReceiptStatusSuccessful, recvReceipt.Status) + + writeAckEvent, err := e2esuite.GetEvmEvent(recvReceipt, s.chainB.ics26.ParseWriteAcknowledgement) + s.Require().NoError(err) + + ibcDenomOnB := fmt.Sprintf( + "%s/%s/%s", + writeAckEvent.Packet.Payloads[0].DestPort, + writeAckEvent.Packet.DestClient, + strings.ToLower(erc20AddressA.Hex()), + ) + ibcERC20AddressOnB, err := s.chainB.ics20.IbcERC20Contract(nil, ibcDenomOnB) + s.Require().NoError(err) + ibcERC20OnB, err = ibcerc20.NewContract(ibcERC20AddressOnB, s.chainB.eth.RPCClient) + s.Require().NoError(err) + })) + })) + + s.Require().True(s.Run("Verify balances on Chain B after receive", func() { + userBalanceB, err := ibcERC20OnB.BalanceOf(nil, userAddressB) + s.Require().NoError(err) + s.Require().Equal(0, transferAmount.Cmp(userBalanceB)) + })) + + s.Require().True(s.Run("Relay acknowledgement to Chain A", func() { + var relayTx []byte + s.Require().True(s.Run("Retrieve acknowledgement relay tx", func() { + ackRelay, err := s.relayerClient.RelayByTx(context.Background(), &proofapitypes.RelayByTxRequest{ + SrcChain: s.chainB.eth.ChainID.String(), + DstChain: s.chainA.eth.ChainID.String(), + SourceTxIds: [][]byte{recvReceipt.TxHash.Bytes()}, + SrcClientId: besuToBesuClientOnB, + DstClientId: besuToBesuClientOnA, + }) + s.Require().NoError(err) + s.Require().NotEmpty(ackRelay.Tx) + s.Require().Equal(strings.ToLower(s.chainA.contractAddresses.Ics26Router), strings.ToLower(ackRelay.Address)) + relayTx = ackRelay.Tx + })) - _, err = e2esuite.GetEvmEvent(ackReceipt, s.chainA.ics26.ParseAckPacket) - s.Require().NoError(err) + s.Require().True(s.Run("Broadcast acknowledgement relay tx on Chain A", func() { + var err error + ackReceipt, err = s.chainA.eth.BroadcastTx(ctx, s.chainA.relayerSubmitter, 15_000_000, &ics26AddressA, relayTx) + s.Require().NoError(err) + s.Require().Equal(ethtypes.ReceiptStatusSuccessful, ackReceipt.Status) + + _, err = e2esuite.GetEvmEvent(ackReceipt, s.chainA.ics26.ParseAckPacket) + s.Require().NoError(err) + })) + })) if s.besuFixtureGenerator.Enabled { - sendHeight := sendReceipt.BlockNumber.Uint64() - s.Require().Greater(sendHeight, uint64(2)) - s.Require().Greater(ackReceipt.BlockNumber.Uint64(), sendHeight) - s.Require().NoError(s.besuFixtureGenerator.GenerateAndSaveQBFTFixture(ctx, e2etypes.GenerateQBFTFixtureParams{ - SourceChain: &s.chainA.eth, - RouterAddress: ics26AddressA, - Packet: sendEvent.Packet, - InitialTrustedHeight: sendHeight - 2, - AdjacentUpdateHeight: sendHeight - 1, - NonAdjacentUpdateHeight: sendHeight, - SyntheticSourceHeight: ackReceipt.BlockNumber.Uint64(), - TrustingPeriod: uint64(testvalues.DefaultTrustPeriod), - MaxClockDrift: uint64(testvalues.DefaultMaxClockDrift), + s.Require().True(s.Run("Generate QBFT fixture", func() { + sendHeight := sendReceipt.BlockNumber.Uint64() + s.Require().Greater(sendHeight, uint64(2)) + s.Require().Greater(ackReceipt.BlockNumber.Uint64(), sendHeight) + s.Require().NoError(s.besuFixtureGenerator.GenerateAndSaveQBFTFixture(ctx, e2etypes.GenerateQBFTFixtureParams{ + SourceChain: &s.chainA.eth, + RouterAddress: ics26AddressA, + Packet: sendPacket, + InitialTrustedHeight: sendHeight - 2, + AdjacentUpdateHeight: sendHeight - 1, + NonAdjacentUpdateHeight: sendHeight, + SyntheticSourceHeight: ackReceipt.BlockNumber.Uint64(), + TrustingPeriod: uint64(testvalues.DefaultTrustPeriod), + MaxClockDrift: uint64(testvalues.DefaultMaxClockDrift), + })) })) } } diff --git a/e2e/interchaintestv8/chainconfig/besu_qbft.go b/e2e/interchaintestv8/chainconfig/besu_qbft.go index c4c621622..a0990c5ad 100644 --- a/e2e/interchaintestv8/chainconfig/besu_qbft.go +++ b/e2e/interchaintestv8/chainconfig/besu_qbft.go @@ -34,8 +34,9 @@ const ( besuQBFTComposeFile = "docker-compose.yml" besuQBFTProjectName = "besu-qbft" - defaultBesuQBFTSubnet = "10.42.0.0/16" - defaultBesuQBFTGateway = "10.42.0.1" + defaultBesuQBFTChainID uint64 = 1337 + defaultBesuQBFTSubnet = "10.42.0.0/16" + defaultBesuQBFTGateway = "10.42.0.1" besuQBFTTxProbeReceiptTimeout = 30 * time.Second ) @@ -56,6 +57,16 @@ type BesuQBFTParams struct { InterchainNetworkID string } +// DefaultBesuQBFTParams returns the topology from the embedded Besu fixture. +func DefaultBesuQBFTParams() BesuQBFTParams { + return BesuQBFTParams{ + ChainID: defaultBesuQBFTChainID, + Subnet: defaultBesuQBFTSubnet, + Gateway: defaultBesuQBFTGateway, + ValidatorIPs: defaultBesuQBFTValidatorIPs, + } +} + type BesuQBFTChain struct { RPC string DockerRPC string diff --git a/e2e/interchaintestv8/e2esuite/setup_ethereum.go b/e2e/interchaintestv8/e2esuite/setup_ethereum.go index db2587a48..bd1eb8e7d 100644 --- a/e2e/interchaintestv8/e2esuite/setup_ethereum.go +++ b/e2e/interchaintestv8/e2esuite/setup_ethereum.go @@ -86,14 +86,11 @@ func (s *TestSuite) processEthereumPoSResult(ctx context.Context, chain *chainco } func (s *TestSuite) setupEthereumBesuQBFT(ctx context.Context, networkID string) (*chainconfig.BesuQBFTChain, error) { - chain, err := chainconfig.SpinUpBesuQBFT(ctx, chainconfig.BesuQBFTParams{ - ChainID: 1337, - Subnet: "10.42.0.0/16", - Gateway: "10.42.0.1", - ValidatorIPs: [4]string{"10.42.0.2", "10.42.0.3", "10.42.0.4", "10.42.0.5"}, - DockerRPCAlias: "besu-qbft-rpc", - InterchainNetworkID: networkID, - }) + params := chainconfig.DefaultBesuQBFTParams() + params.DockerRPCAlias = "besu-qbft-rpc" + params.InterchainNetworkID = networkID + + chain, err := chainconfig.SpinUpBesuQBFT(ctx, params) if err != nil { return nil, err } diff --git a/e2e/interchaintestv8/ethereum/ethereum_test.go b/e2e/interchaintestv8/ethereum/ethereum_test.go deleted file mode 100644 index cff010431..000000000 --- a/e2e/interchaintestv8/ethereum/ethereum_test.go +++ /dev/null @@ -1,66 +0,0 @@ -// SPDX-License-Identifier: Apache-2.0 - -package ethereum - -import ( - "encoding/hex" - "io" - "os" - "path/filepath" - "testing" - "time" - - "github.com/stretchr/testify/require" - - "github.com/ethereum/go-ethereum/crypto" -) - -func TestForgeScriptFailureDoesNotExposePrivateKey(t *testing.T) { - workingDir, err := os.Getwd() - require.NoError(t, err) - require.NoError(t, os.Chdir(filepath.Join(workingDir, "../../.."))) - t.Cleanup(func() { require.NoError(t, os.Chdir(workingDir)) }) - - deployer, err := crypto.GenerateKey() - require.NoError(t, err) - secret := hex.EncodeToString(crypto.FromECDSA(deployer)) - forgePath := filepath.Join(t.TempDir(), "forge") - t.Setenv("PATH", filepath.Dir(forgePath)+string(os.PathListSeparator)+os.Getenv("PATH")) - chain := Ethereum{RPC: "http://localhost:8545", Faucet: deployer} - - tests := []struct { - name string - script string - timeout time.Duration - wantErr string - }{ - {name: "failure", script: "#!/bin/sh\nexit 17\n", timeout: 10 * time.Second, wantErr: "exit status 17"}, - {name: "timeout", script: "#!/bin/sh\nexec /bin/sleep 10\n", timeout: 10 * time.Millisecond, wantErr: "timed out after 10ms"}, - } - - for _, test := range tests { - t.Run(test.name, func(t *testing.T) { - require.NoError(t, os.WriteFile(forgePath, []byte(test.script), 0o600)) - require.NoError(t, os.Chmod(forgePath, 0o700)) - - readOutput, writeOutput, err := os.Pipe() - require.NoError(t, err) - originalStdout := os.Stdout - os.Stdout = writeOutput - - stdout, runErr := chain.forgeScript(test.timeout, deployer, "script/Test.s.sol") - - os.Stdout = originalStdout - require.NoError(t, writeOutput.Close()) - consoleOutput, err := io.ReadAll(readOutput) - require.NoError(t, err) - require.NoError(t, readOutput.Close()) - - require.Nil(t, stdout) - require.ErrorContains(t, runErr, "script/Test.s.sol") - require.ErrorContains(t, runErr, test.wantErr) - require.NotContains(t, runErr.Error(), secret) - require.NotContains(t, string(consoleOutput), secret) - }) - } -} diff --git a/e2e/interchaintestv8/types/besu_fixtures_test.go b/e2e/interchaintestv8/types/besu_fixtures_test.go deleted file mode 100644 index dad6dbc9f..000000000 --- a/e2e/interchaintestv8/types/besu_fixtures_test.go +++ /dev/null @@ -1,147 +0,0 @@ -// SPDX-License-Identifier: Apache-2.0 - -package types - -import ( - "encoding/hex" - "encoding/json" - "os" - "testing" - - ethcommon "github.com/ethereum/go-ethereum/common" - - transfertypes "github.com/cosmos/ibc-go/v11/modules/apps/transfer/types" - - "github.com/cosmos/solidity-ibc-eureka/packages/go-abigen/ics26router" - - "github.com/srdtrk/solidity-ibc-eureka/e2e/v8/ethereum" -) - -func TestGenerateQBFTFixtureRequiresAdjacentHeight(t *testing.T) { - _, err := generateQBFTFixture(t.Context(), GenerateQBFTFixtureParams{ - SourceChain: ðereum.Ethereum{}, - InitialTrustedHeight: 10, - AdjacentUpdateHeight: 12, - }) - if err == nil || err.Error() != "adjacent update height must equal initial trusted height plus one" { - t.Fatalf("unexpected error: %v", err) - } -} - -func TestBuildLowOverlapFixtureNeedsNoAccountProof(t *testing.T) { - t.Chdir("../../..") - - fixtureJSON, err := os.ReadFile("ibc-solidity/test/besu-bft/fixtures/qbft.json") - if err != nil { - t.Fatal(err) - } - var fixture besuFixture - if err := json.Unmarshal(fixtureJSON, &fixture); err != nil { - t.Fatal(err) - } - validatorKeys, err := loadQBFTValidatorKeys() - if err != nil { - t.Fatal(err) - } - - update, err := buildLowOverlapFixture( - fixture.InitialTrustedHeight, - fixture.NonAdjacentUpdate.Height+1, - liveHeader{HeaderRLP: ethcommon.FromHex(fixture.NonAdjacentUpdate.HeaderRlp)}, - validatorKeys, - ) - if err != nil { - t.Fatal(err) - } - if update.AccountProof != "0x" { - t.Fatalf("account proof: got %q, want empty hex bytes", update.AccountProof) - } - - encoded, err := json.Marshal(update) - if err != nil { - t.Fatal(err) - } - var fields map[string]json.RawMessage - if err := json.Unmarshal(encoded, &fields); err != nil { - t.Fatal(err) - } - for _, field := range []string{"expectedTimestamp", "expectedStorageRoot", "expectedValidators"} { - if _, ok := fields[field]; ok { - t.Fatalf("unexpected success field %q", field) - } - } -} - -func TestRejectionFixturesOnlyContainUpdateInputs(t *testing.T) { - t.Chdir("../../..") - - fixtureJSON, err := os.ReadFile("ibc-solidity/test/besu-bft/fixtures/qbft.json") - if err != nil { - t.Fatal(err) - } - var fixture besuFixture - if err := json.Unmarshal(fixtureJSON, &fixture); err != nil { - t.Fatal(err) - } - - lowQuorum, err := buildLowQuorumFixture( - fixture.NonAdjacentUpdate, - liveHeader{HeaderRLP: ethcommon.FromHex(fixture.NonAdjacentUpdate.HeaderRlp)}, - ) - if err != nil { - t.Fatal(err) - } - if lowQuorum.AccountProof != "0x" { - t.Fatalf("low quorum account proof: got %q, want empty hex bytes", lowQuorum.AccountProof) - } - if fixture.ConflictingUpdate.AccountProof == "" || fixture.ConflictingUpdate.AccountProof == "0x" { - t.Fatal("conflicting update must retain its account proof") - } - - for name, update := range map[string]besuRejectionUpdateFixture{ - "low quorum": lowQuorum, - "conflicting": fixture.ConflictingUpdate, - } { - encoded, err := json.Marshal(update) - if err != nil { - t.Fatal(err) - } - var fields map[string]json.RawMessage - if err := json.Unmarshal(encoded, &fields); err != nil { - t.Fatal(err) - } - for _, field := range []string{"expectedTimestamp", "expectedStorageRoot", "expectedValidators"} { - if _, ok := fields[field]; ok { - t.Errorf("%s: unexpected success field %q", name, field) - } - } - } -} - -func TestPacketCommitmentMatchesICS24Host(t *testing.T) { - packetData := transfertypes.NewFungibleTokenPacketData("uatom", "1000000", "sender", "receiver", "memo") - value, err := transfertypes.EncodeABIFungibleTokenPacketData(&packetData) - if err != nil { - t.Fatal(err) - } - - packet := ics26router.IICS26RouterMsgsPacket{ - Sequence: 1, - SourceClient: "channel-0", - DestClient: "channel-1", - TimeoutTimestamp: 100, - Payloads: []ics26router.IICS26RouterMsgsPayload{{ - SourcePort: transfertypes.PortID, - DestPort: transfertypes.PortID, - Version: transfertypes.V1, - Encoding: transfertypes.EncodingABI, - Value: value, - }}, - } - - // Golden vector shared with ibc-solidity/test/solidity-ibc/ICS24HostTest.t.sol. - const expected = "b691a1950f6fb0bbbcf4bdb16fe2c4d0aa7ef783eb7803073f475cb8164d9b7a" - if actual := hex.EncodeToString(packetCommitment(packet)); actual != expected { - t.Fatalf("packet commitment: got %s, want %s", actual, expected) - } -} From bb13755a52caf05e775b6b9a809c52f980968490 Mon Sep 17 00:00:00 2001 From: Gjermund Garaba Date: Tue, 25 Aug 2026 14:45:32 +0200 Subject: [PATCH 16/22] refactor: remove unused EVM dummy runtime Signed-off-by: Gjermund Garaba --- Cargo.lock | 15 - Cargo.toml | 2 - README.md | 1 - ibc-solidity/abi/DummyLightClient.json | 173 ------------ .../abi/bytecode/DummyLightClient.json | 1 - ibc-solidity/contracts/README.md | 1 - .../light-clients/dummy/DummyLightClient.sol | 141 ---------- .../contracts/light-clients/dummy/README.md | 11 - .../dummy/msgs/IDummyLightClientMsgs.sol | 34 --- ibc-solidity/solidity.just | 2 - .../test/dummy-lc/DummyLightClientTest.t.sol | 145 ---------- .../modules/evmdummy-to-evmdummy/Cargo.toml | 16 -- .../modules/evmdummy-to-evmdummy/src/lib.rs | 204 -------------- .../evmdummy-to-evmdummy/src/tx_builder.rs | 266 ------------------ packages/solidity/src/dummy.rs | 33 --- packages/solidity/src/lib.rs | 1 - programs/proof-api/Cargo.toml | 1 - programs/proof-api/README.md | 8 - programs/proof-api/config.example.json | 12 - programs/proof-api/src/bin/proof-api.rs | 2 - 20 files changed, 1069 deletions(-) delete mode 100644 ibc-solidity/abi/DummyLightClient.json delete mode 100644 ibc-solidity/abi/bytecode/DummyLightClient.json delete mode 100644 ibc-solidity/contracts/light-clients/dummy/DummyLightClient.sol delete mode 100644 ibc-solidity/contracts/light-clients/dummy/README.md delete mode 100644 ibc-solidity/contracts/light-clients/dummy/msgs/IDummyLightClientMsgs.sol delete mode 100644 ibc-solidity/test/dummy-lc/DummyLightClientTest.t.sol delete mode 100644 packages/proof-api/modules/evmdummy-to-evmdummy/Cargo.toml delete mode 100644 packages/proof-api/modules/evmdummy-to-evmdummy/src/lib.rs delete mode 100644 packages/proof-api/modules/evmdummy-to-evmdummy/src/tx_builder.rs delete mode 100644 packages/solidity/src/dummy.rs diff --git a/Cargo.lock b/Cargo.lock index e1c0450aa..bfb655697 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -8500,7 +8500,6 @@ dependencies = [ "proof-api-eth-to-cosmos-compat", "proof-api-eth-to-eth", "proof-api-eth-to-solana", - "proof-api-evmdummy-to-evmdummy", "proof-api-solana-to-cosmos", "proof-api-solana-to-eth", "serde_json", @@ -8728,20 +8727,6 @@ dependencies = [ "tracing", ] -[[package]] -name = "proof-api-evmdummy-to-evmdummy" -version = "0.1.0" -dependencies = [ - "alloy 2.0.4", - "anyhow", - "ibc-eureka-solidity-types 0.1.0", - "proof-api-core", - "proof-api-lib", - "serde", - "serde_json", - "tonic 0.13.1", -] - [[package]] name = "proof-api-lib" version = "0.1.0" diff --git a/Cargo.toml b/Cargo.toml index 59332094d..05e6c5123 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -20,7 +20,6 @@ members = [ "packages/proof-api/modules/eth-to-cosmos-compat", "packages/proof-api/modules/cosmos-to-eth", "packages/proof-api/modules/eth-to-eth", - "packages/proof-api/modules/evmdummy-to-evmdummy", "packages/proof-api/modules/besu-to-besu", "packages/proof-api/modules/cosmos-to-cosmos", "packages/proof-api/modules/solana-to-cosmos", @@ -62,7 +61,6 @@ proof-api-eth-to-cosmos = { path = "packages/proof-api/modules/eth-to-cos proof-api-eth-to-cosmos-compat = { path = "packages/proof-api/modules/eth-to-cosmos-compat", default-features = false } proof-api-cosmos-to-eth = { path = "packages/proof-api/modules/cosmos-to-eth", default-features = false } proof-api-eth-to-eth = { path = "packages/proof-api/modules/eth-to-eth", default-features = false } -proof-api-evmdummy-to-evmdummy = { path = "packages/proof-api/modules/evmdummy-to-evmdummy", default-features = false } proof-api-besu-to-besu = { path = "packages/proof-api/modules/besu-to-besu", default-features = false } proof-api-cosmos-to-cosmos = { path = "packages/proof-api/modules/cosmos-to-cosmos", default-features = false } proof-api-solana-to-cosmos = { path = "packages/proof-api/modules/solana-to-cosmos", default-features = false } diff --git a/README.md b/README.md index 921d5ac54..fcada31d8 100644 --- a/README.md +++ b/README.md @@ -82,7 +82,6 @@ This project is structured with the following directories: | `SP1ICS07Tendermint.sol` | Tendermint light client powered by SP1. The entry point for SP1 proofs. | ✅ | | `BesuIBFT2LightClient.sol` | Besu IBFT 2.0 light client for header-validator mode with weak-subjectivity updates and EVM proof verification, following the YUI + prover sealing-header verification model. | ✅ | | `BesuQBFTLightClient.sol` | Besu QBFT light client for header-validator mode with weak-subjectivity updates and EVM proof verification, following the YUI + prover sealing-header verification model. | ✅ | -| `DummyLightClient.sol` | Insecure dummy light client for local/dev/testing use. Accepts arbitrary updates and answers membership/non-membership from supplied state without proof verification. | 🧪 | | `ICS27GMP.sol` | IBC General Message Passing via Interchain Accounts. | ✅ | | `AttestationLightClient.sol` | The multisig contract implementing IBC Light Client specs. | ✅ | | `utils/IFTBaseUpgradeable.sol` | Interchain Fungible Token standard. Mint and burn alternative to ICS-20. | ⏳ | diff --git a/ibc-solidity/abi/DummyLightClient.json b/ibc-solidity/abi/DummyLightClient.json deleted file mode 100644 index 610620c90..000000000 --- a/ibc-solidity/abi/DummyLightClient.json +++ /dev/null @@ -1,173 +0,0 @@ -[ - { - "type": "function", - "name": "getClientState", - "inputs": [], - "outputs": [ - { - "name": "", - "type": "bytes", - "internalType": "bytes" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "misbehaviour", - "inputs": [ - { - "name": "", - "type": "bytes", - "internalType": "bytes" - } - ], - "outputs": [], - "stateMutability": "nonpayable" - }, - { - "type": "function", - "name": "updateClient", - "inputs": [ - { - "name": "updateMsg", - "type": "bytes", - "internalType": "bytes" - } - ], - "outputs": [ - { - "name": "", - "type": "uint8", - "internalType": "enum ILightClientMsgs.UpdateResult" - } - ], - "stateMutability": "nonpayable" - }, - { - "type": "function", - "name": "verifyMembership", - "inputs": [ - { - "name": "msg_", - "type": "tuple", - "internalType": "struct ILightClientMsgs.MsgVerifyMembership", - "components": [ - { - "name": "proof", - "type": "bytes", - "internalType": "bytes" - }, - { - "name": "proofHeight", - "type": "tuple", - "internalType": "struct IICS02ClientMsgs.Height", - "components": [ - { - "name": "revisionNumber", - "type": "uint64", - "internalType": "uint64" - }, - { - "name": "revisionHeight", - "type": "uint64", - "internalType": "uint64" - } - ] - }, - { - "name": "path", - "type": "bytes[]", - "internalType": "bytes[]" - }, - { - "name": "value", - "type": "bytes", - "internalType": "bytes" - } - ] - } - ], - "outputs": [ - { - "name": "", - "type": "uint256", - "internalType": "uint256" - } - ], - "stateMutability": "nonpayable" - }, - { - "type": "function", - "name": "verifyNonMembership", - "inputs": [ - { - "name": "msg_", - "type": "tuple", - "internalType": "struct ILightClientMsgs.MsgVerifyNonMembership", - "components": [ - { - "name": "proof", - "type": "bytes", - "internalType": "bytes" - }, - { - "name": "proofHeight", - "type": "tuple", - "internalType": "struct IICS02ClientMsgs.Height", - "components": [ - { - "name": "revisionNumber", - "type": "uint64", - "internalType": "uint64" - }, - { - "name": "revisionHeight", - "type": "uint64", - "internalType": "uint64" - } - ] - }, - { - "name": "path", - "type": "bytes[]", - "internalType": "bytes[]" - } - ] - } - ], - "outputs": [ - { - "name": "", - "type": "uint256", - "internalType": "uint256" - } - ], - "stateMutability": "nonpayable" - }, - { - "type": "error", - "name": "MembershipExists", - "inputs": [] - }, - { - "type": "error", - "name": "MissingMembership", - "inputs": [] - }, - { - "type": "error", - "name": "UnknownHeight", - "inputs": [] - }, - { - "type": "error", - "name": "ValueMismatch", - "inputs": [] - }, - { - "type": "error", - "name": "ZeroTimestamp", - "inputs": [] - } -] diff --git a/ibc-solidity/abi/bytecode/DummyLightClient.json b/ibc-solidity/abi/bytecode/DummyLightClient.json deleted file mode 100644 index 6ea4810e3..000000000 --- a/ibc-solidity/abi/bytecode/DummyLightClient.json +++ /dev/null @@ -1 +0,0 @@ -{"abi":[{"type":"function","name":"getClientState","inputs":[],"outputs":[{"name":"","type":"bytes","internalType":"bytes"}],"stateMutability":"view"},{"type":"function","name":"misbehaviour","inputs":[{"name":"","type":"bytes","internalType":"bytes"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"updateClient","inputs":[{"name":"updateMsg","type":"bytes","internalType":"bytes"}],"outputs":[{"name":"","type":"uint8","internalType":"enum ILightClientMsgs.UpdateResult"}],"stateMutability":"nonpayable"},{"type":"function","name":"verifyMembership","inputs":[{"name":"msg_","type":"tuple","internalType":"struct ILightClientMsgs.MsgVerifyMembership","components":[{"name":"proof","type":"bytes","internalType":"bytes"},{"name":"proofHeight","type":"tuple","internalType":"struct IICS02ClientMsgs.Height","components":[{"name":"revisionNumber","type":"uint64","internalType":"uint64"},{"name":"revisionHeight","type":"uint64","internalType":"uint64"}]},{"name":"path","type":"bytes[]","internalType":"bytes[]"},{"name":"value","type":"bytes","internalType":"bytes"}]}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"nonpayable"},{"type":"function","name":"verifyNonMembership","inputs":[{"name":"msg_","type":"tuple","internalType":"struct ILightClientMsgs.MsgVerifyNonMembership","components":[{"name":"proof","type":"bytes","internalType":"bytes"},{"name":"proofHeight","type":"tuple","internalType":"struct IICS02ClientMsgs.Height","components":[{"name":"revisionNumber","type":"uint64","internalType":"uint64"},{"name":"revisionHeight","type":"uint64","internalType":"uint64"}]},{"name":"path","type":"bytes[]","internalType":"bytes[]"}]}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"nonpayable"},{"type":"error","name":"MembershipExists","inputs":[]},{"type":"error","name":"MissingMembership","inputs":[]},{"type":"error","name":"UnknownHeight","inputs":[]},{"type":"error","name":"ValueMismatch","inputs":[]},{"type":"error","name":"ZeroTimestamp","inputs":[]}],"bytecode":{"object":"0x60808060405234601557610ab7908161001a8239f35b5f80fdfe6080806040526004361015610012575f80fd5b5f3560e01c9081630bece356146102ac575080634d6d9ffb1461020d578063682ed5f0146100d2578063ddba6537146100c25763ef913a4b14610053575f80fd5b346100be575f6003193601126100be576100ba60405167ffffffffffffffff5f54818116602084015260401c16604082015267ffffffffffffffff600154166060820152606081526100a66080826107a9565b604051918291602083526020830190610768565b0390f35b5f80fd5b346100be576100d036610717565b005b346100be5760206003193601126100be5760043567ffffffffffffffff81116100be578036039060a06003198301126100be57602481019161012d61011684610929565b93610127606485018560040161085d565b9161098f565b5f52600360205260405f20549182156101e5577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdd608482013592018212156100be570160048101359067ffffffffffffffff82116100be5760240181360381136100be5761019c9136916107f9565b60208151910120036101bd5760209067ffffffffffffffff60405191168152f35b7fdd8e4af7000000000000000000000000000000000000000000000000000000005f5260045ffd5b7ff6b593a3000000000000000000000000000000000000000000000000000000005f5260045ffd5b346100be5760206003193601126100be5760043567ffffffffffffffff81116100be57608060031982360301126100be5761025f6024820161012761025182610929565b93606481019060040161085d565b5f52600360205260405f20546102845760209067ffffffffffffffff60405191168152f35b7f679fc91d000000000000000000000000000000000000000000000000000000005f5260045ffd5b346100be576102ba36610717565b8101906020818303126100be5780359067ffffffffffffffff82116100be570191828203608081126100be57606082019082821067ffffffffffffffff8311176106ea576040918252126100be576040516103148161078d565b61031d846107cc565b815261032b602085016107cc565b6020820152815261033e604084016107cc565b926020820193845260608101359067ffffffffffffffff82116100be57019180601f840112156100be57823592610374846107e1565b9361038260405195866107a9565b80855260208086019160051b830101918383116100be5760208101915b8383106105ef578787876040810191825267ffffffffffffffff835116156105c757519167ffffffffffffffff80845116916103e3602086019383855116906108b1565b82825116905f52600260205260405f20907fffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000825416179055511680602060405161042c8161078d565b868152015267ffffffffffffffff8451167fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000005f5416175f5581517fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff6fffffffffffffffff00000000000000005f549260401b169116175f557fffffffffffffffffffffffffffffffffffffffffffffffff000000000000000060015416176001555f5b825180518210156105bd576020908260051b010151805160405160208101916040820160208452815180915260608301602060608360051b8601019301915f5b81811061057657505050506001949392826105386020946105599403601f1981018352826107a9565b51902067ffffffffffffffff89511667ffffffffffffffff885116906108e3565b91015160208151910120905f52600360205260405f2055016104cf565b909192936020806105b1837fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa08a600196030188528851610768565b9601940192910161050f565b60206040515f8152f35b7fda16d767000000000000000000000000000000000000000000000000000000005f5260045ffd5b823567ffffffffffffffff81116100be578201906040601f1983880301126100be576040519061061e8261078d565b602083013567ffffffffffffffff81116100be5760209084010187601f820112156100be57803561064e816107e1565b9161065c60405193846107a9565b81835260208084019260051b820101918a83116100be5760208201905b8382106106bc5750505050825260408301359167ffffffffffffffff83116100be576106ad8860208096958196010161083f565b8382015281520192019161039f565b813567ffffffffffffffff81116100be576020916106df8e84809488010161083f565b815201910190610679565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b9060206003198301126100be5760043567ffffffffffffffff81116100be57826023820112156100be5780600401359267ffffffffffffffff84116100be57602484830101116100be576024019190565b90601f19601f602080948051918291828752018686015e5f8582860101520116010190565b6040810190811067ffffffffffffffff8211176106ea57604052565b90601f601f19910116810190811067ffffffffffffffff8211176106ea57604052565b359067ffffffffffffffff821682036100be57565b67ffffffffffffffff81116106ea5760051b60200190565b92919267ffffffffffffffff82116106ea57604051916108236020601f19601f84011601846107a9565b8294818452818301116100be578281602093845f960137010152565b9080601f830112156100be5781602061085a933591016107f9565b90565b9035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1813603018212156100be570180359067ffffffffffffffff82116100be57602001918160051b360383136100be57565b9067ffffffffffffffff60405191816020840194168452166040820152604081526108dd6060826107a9565b51902090565b9167ffffffffffffffff604051928160208501951685521660408301526060820152606081526108dd6080826107a9565b3567ffffffffffffffff811681036100be5790565b61094890610942602061093b83610914565b9201610914565b906108b1565b5f52600260205267ffffffffffffffff60405f20541680156109675790565b7f8da291bd000000000000000000000000000000000000000000000000000000005f5260045ffd5b909291926109a860206109a184610914565b9301610914565b90604051946020860191816040880160208552526060870160608360051b89010192825f907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1813603015b838310610a215750505050505094610a188161085a969703601f1981018352826107a9565b519020916108e3565b9091929394957fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa08c82030186528635828112156100be578301906020823592019167ffffffffffffffff81116100be5780360383136100be57602082601f19601f8480600198869897879852868601375f848201860152011601019801960194930191906109f356fea164736f6c634300081c000a"}} diff --git a/ibc-solidity/contracts/README.md b/ibc-solidity/contracts/README.md index e0b8d897e..21900cb09 100644 --- a/ibc-solidity/contracts/README.md +++ b/ibc-solidity/contracts/README.md @@ -24,7 +24,6 @@ This directory implements the IBC v2 protocol stack in Solidity. Most entrypoint - `attestation/AttestationLightClient.sol` – m-of-n attestor-set light client using ECDSA signatures with role-gated proof submission. - `besu/BesuIBFT2LightClient.sol` – Besu IBFT 2.0 light client for header-validator mode. Uses weak-subjectivity / trusting-period updates, verifies Besu commit seals under the existing YUI + prover sealing-header model plus EVM account/storage proofs, and proves Eureka commitments against the tracked counterparty `ICS26Router` storage. - `besu/BesuQBFTLightClient.sol` – Besu QBFT light client for header-validator mode with the same proof model and storage verification surface as the IBFT2 wrapper, but QBFT-specific seal-digest rules within that same YUI + prover sealing-header model. -- `dummy/DummyLightClient.sol` – Insecure development/testing light client. Updates directly populate trusted timestamps and path/value records; proofs are ignored. - `ics02-wrapper/ICS02PrecompileWrapper.sol` – Thin adapter that exposes the `ILightClient` interface over the Cosmos EVM ICS02 precompile at a fixed address. - `sp1-ics07/SP1ICS07Tendermint.sol` – Tendermint light client verified via SP1 programs and verifier contract; supports update, (non)membership proofs, and misbehaviour handling. diff --git a/ibc-solidity/contracts/light-clients/dummy/DummyLightClient.sol b/ibc-solidity/contracts/light-clients/dummy/DummyLightClient.sol deleted file mode 100644 index 217045354..000000000 --- a/ibc-solidity/contracts/light-clients/dummy/DummyLightClient.sol +++ /dev/null @@ -1,141 +0,0 @@ -// SPDX-License-Identifier: Apache-2.0 -pragma solidity ^0.8.28; - -import { ILightClient } from "../../interfaces/ILightClient.sol"; -import { ILightClientMsgs } from "../../msgs/ILightClientMsgs.sol"; -import { IICS02ClientMsgs } from "../../msgs/IICS02ClientMsgs.sol"; -import { IDummyLightClientMsgs } from "./msgs/IDummyLightClientMsgs.sol"; - -/// @title Dummy Light Client -/// @notice Insecure light client for local development and testing; proofs are ignored. -contract DummyLightClient is ILightClient, IDummyLightClientMsgs { - /// @notice A membership record exists for the queried height and path. - error MembershipExists(); - /// @notice No membership record exists for the queried height and path. - error MissingMembership(); - /// @notice No timestamp has been registered for the queried height. - error UnknownHeight(); - /// @notice The queried value does not match the stored value hash. - error ValueMismatch(); - /// @notice Consensus timestamps must be non-zero. - error ZeroTimestamp(); - - /// @notice Latest dummy client state. - ClientState private _clientState; - - /// @notice Consensus timestamps by encoded height key. - mapping(bytes32 heightKey => uint64 timestamp) private _timestamps; - /// @notice Membership value hashes by encoded height and path key. - mapping(bytes32 membershipKey => bytes32 valueHash) private _membershipValueHashes; - - /// @inheritdoc ILightClient - function updateClient(bytes calldata updateMsg) external returns (ILightClientMsgs.UpdateResult) { - MsgUpdateClient memory msg_ = abi.decode(updateMsg, (MsgUpdateClient)); - if (msg_.timestamp == 0) { - revert ZeroTimestamp(); - } - - IICS02ClientMsgs.Height memory height = msg_.height; - bytes32 heightKey = _heightKey(height.revisionNumber, height.revisionHeight); - _timestamps[heightKey] = msg_.timestamp; - _clientState = ClientState({ latestHeight: height, latestTimestamp: msg_.timestamp }); - - for (uint256 i = 0; i < msg_.memberships.length; ++i) { - Membership memory membership = msg_.memberships[i]; - - bytes32 pathHash = keccak256(abi.encode(membership.path)); - bytes32 membershipKey = _membershipKey(height.revisionNumber, height.revisionHeight, pathHash); - _membershipValueHashes[membershipKey] = keccak256(membership.value); - } - - return ILightClientMsgs.UpdateResult.Update; - } - - /// @inheritdoc ILightClient - function verifyMembership(ILightClientMsgs.MsgVerifyMembership calldata msg_) external returns (uint256) { - uint64 timestamp = _timestamp(msg_.proofHeight); - - bytes32 valueHash = _membershipValueHashes[_membershipKey(msg_.proofHeight, msg_.path)]; - if (valueHash == bytes32(0)) { - revert MissingMembership(); - } - if (valueHash != keccak256(msg_.value)) { - revert ValueMismatch(); - } - - return timestamp; - } - - /// @inheritdoc ILightClient - function verifyNonMembership(ILightClientMsgs.MsgVerifyNonMembership calldata msg_) external returns (uint256) { - uint64 timestamp = _timestamp(msg_.proofHeight); - - bytes32 valueHash = _membershipValueHashes[_membershipKey(msg_.proofHeight, msg_.path)]; - if (valueHash != bytes32(0)) { - revert MembershipExists(); - } - - return timestamp; - } - - /// @inheritdoc ILightClient - function misbehaviour(bytes calldata) external { - return; - } - - /// @inheritdoc ILightClient - function getClientState() external view returns (bytes memory) { - return abi.encode(_clientState); - } - - /// @notice Returns the registered timestamp for a height. - /// @param height Height to query. - /// @return Registered consensus timestamp. - function _timestamp(IICS02ClientMsgs.Height calldata height) private view returns (uint64) { - uint64 timestamp = _timestamps[_heightKey(height.revisionNumber, height.revisionHeight)]; - if (timestamp == 0) { - revert UnknownHeight(); - } - return timestamp; - } - - /// @notice Builds a membership storage key. - /// @param height Height for the record. - /// @param path Path for the record. - /// @return Membership storage key. - function _membershipKey( - IICS02ClientMsgs.Height calldata height, - bytes[] calldata path - ) - private - pure - returns (bytes32) - { - return _membershipKey(height.revisionNumber, height.revisionHeight, keccak256(abi.encode(path))); - } - - /// @notice Builds a height storage key. - /// @param revisionNumber Revision number of the height. - /// @param revisionHeight Revision height. - /// @return Height storage key. - function _heightKey(uint64 revisionNumber, uint64 revisionHeight) private pure returns (bytes32) { - return keccak256(abi.encode(revisionNumber, revisionHeight)); - } - - /// @notice Builds a membership storage key from height fields and path hash. - /// @param revisionNumber Revision number of the height. - /// @param revisionHeight Revision height. - /// @param pathHash Hash of the path. - /// @return Membership storage key. - function _membershipKey( - uint64 revisionNumber, - uint64 revisionHeight, - bytes32 pathHash - ) - private - pure - returns (bytes32) - { - return keccak256(abi.encode(revisionNumber, revisionHeight, pathHash)); - } -} diff --git a/ibc-solidity/contracts/light-clients/dummy/README.md b/ibc-solidity/contracts/light-clients/dummy/README.md deleted file mode 100644 index dfe600063..000000000 --- a/ibc-solidity/contracts/light-clients/dummy/README.md +++ /dev/null @@ -1,11 +0,0 @@ -# DummyLightClient - -`DummyLightClient` is an insecure `ILightClient` implementation for local development and tests only. It accepts arbitrary updates and does not verify cryptographic proofs. - -- `updateClient(bytes)` expects ABI encoding of `IDummyLightClientMsgs.MsgUpdateClient`. -- Updates populate known consensus timestamps and explicit `(height, path) -> value hash` membership records. -- Membership succeeds when the queried `(height, path, value)` matches a stored record. -- Non-membership succeeds when no record exists for `(height, path)` at a known height. -- Proof bytes are ignored. - -Do not use this client for production trust assumptions. diff --git a/ibc-solidity/contracts/light-clients/dummy/msgs/IDummyLightClientMsgs.sol b/ibc-solidity/contracts/light-clients/dummy/msgs/IDummyLightClientMsgs.sol deleted file mode 100644 index eb726e3b6..000000000 --- a/ibc-solidity/contracts/light-clients/dummy/msgs/IDummyLightClientMsgs.sol +++ /dev/null @@ -1,34 +0,0 @@ -// SPDX-License-Identifier: Apache-2.0 -pragma solidity ^0.8.28; - -import { IICS02ClientMsgs } from "../../../msgs/IICS02ClientMsgs.sol"; - -/// @title Dummy Light Client Messages -/// @notice Defines message and state types for the dummy light client. -interface IDummyLightClientMsgs { - /// @notice Dummy client state returned by `getClientState`. - /// @param latestHeight Latest updated height. - /// @param latestTimestamp Timestamp for the latest updated height. - struct ClientState { - IICS02ClientMsgs.Height latestHeight; - uint64 latestTimestamp; - } - - /// @notice Membership record supplied in an update. - /// @param path Merkle path for the record. - /// @param value Value for the record. - struct Membership { - bytes[] path; - bytes value; - } - - /// @notice Update message accepted by the dummy client. - /// @param height Height whose timestamp and membership records are being set. - /// @param timestamp Consensus timestamp for the height. - /// @param memberships Membership records for the height. - struct MsgUpdateClient { - IICS02ClientMsgs.Height height; - uint64 timestamp; - Membership[] memberships; - } -} diff --git a/ibc-solidity/solidity.just b/ibc-solidity/solidity.just index eac18981c..ad04cdf7d 100644 --- a/ibc-solidity/solidity.just +++ b/ibc-solidity/solidity.just @@ -57,7 +57,6 @@ generate-abi: build-contracts jq -r '.bytecode.object' out/AttestationLightClient.sol/AttestationLightClient.json > tmp/abigen/AttestationLightClient.bin jq '.abi' out/BesuIBFT2LightClient.sol/BesuIBFT2LightClient.json > abi/BesuIBFT2LightClient.json jq '.abi' out/BesuQBFTLightClient.sol/BesuQBFTLightClient.json > abi/BesuQBFTLightClient.json - jq '.abi' out/DummyLightClient.sol/DummyLightClient.json > abi/DummyLightClient.json jq '.abi' out/IFTOwnable.sol/IFTOwnable.json > abi/IFTOwnable.json jq -r '.bytecode.object' out/IFTOwnable.sol/IFTOwnable.json > tmp/abigen/IFTOwnable.bin jq '.abi' out/ERC1967Proxy.sol/ERC1967Proxy.json > abi/ERC1967Proxy.json @@ -82,7 +81,6 @@ generate-abi: build-contracts jq -c '{abi, bytecode: {object: .bytecode.object}}' out/AttestationLightClient.sol/AttestationLightClient.json > abi/bytecode/AttestationLightClient.json jq -c '{abi, bytecode: {object: .bytecode.object}}' out/BesuIBFT2LightClient.sol/BesuIBFT2LightClient.json > abi/bytecode/BesuIBFT2LightClient.json jq -c '{abi, bytecode: {object: .bytecode.object}}' out/BesuQBFTLightClient.sol/BesuQBFTLightClient.json > abi/bytecode/BesuQBFTLightClient.json - jq -c '{abi, bytecode: {object: .bytecode.object}}' out/DummyLightClient.sol/DummyLightClient.json > abi/bytecode/DummyLightClient.json rm -rf tmp/abigen # Clean up the foundry cache and out directories diff --git a/ibc-solidity/test/dummy-lc/DummyLightClientTest.t.sol b/ibc-solidity/test/dummy-lc/DummyLightClientTest.t.sol deleted file mode 100644 index defe3eb43..000000000 --- a/ibc-solidity/test/dummy-lc/DummyLightClientTest.t.sol +++ /dev/null @@ -1,145 +0,0 @@ -// SPDX-License-Identifier: Apache-2.0 -pragma solidity ^0.8.28; - -import { Test } from "forge-std/Test.sol"; - -import { DummyLightClient } from "../../contracts/light-clients/dummy/DummyLightClient.sol"; -import { IDummyLightClientMsgs } from "../../contracts/light-clients/dummy/msgs/IDummyLightClientMsgs.sol"; -import { ILightClientMsgs } from "../../contracts/msgs/ILightClientMsgs.sol"; -import { IICS02ClientMsgs } from "../../contracts/msgs/IICS02ClientMsgs.sol"; - -contract DummyLightClientTest is Test { - DummyLightClient internal client; - - IICS02ClientMsgs.Height internal height = IICS02ClientMsgs.Height({ revisionNumber: 1, revisionHeight: 100 }); - uint64 internal constant TIMESTAMP = 1_700_000_000; - bytes[] internal path; - bytes internal value = bytes("value"); - - function setUp() public { - client = new DummyLightClient(); - path.push(bytes("ibc")); - path.push(bytes("commitments")); - } - - function test_updateClient_stores_state() public { - client.updateClient(_updateMsg(height, TIMESTAMP, path, value)); - - IDummyLightClientMsgs.ClientState memory clientState = - abi.decode(client.getClientState(), (IDummyLightClientMsgs.ClientState)); - assertEq(clientState.latestHeight.revisionNumber, height.revisionNumber); - assertEq(clientState.latestHeight.revisionHeight, height.revisionHeight); - assertEq(clientState.latestTimestamp, TIMESTAMP); - } - - function test_verifyMembership_succeeds() public { - client.updateClient(_updateMsg(height, TIMESTAMP, path, value)); - - uint256 timestamp = client.verifyMembership(_membershipMsg(height, path, value)); - - assertEq(timestamp, TIMESTAMP); - } - - function test_verifyMembership_succeeds_for_empty_value() public { - bytes memory emptyValue = bytes(""); - client.updateClient(_updateMsg(height, TIMESTAMP, path, emptyValue)); - - uint256 timestamp = client.verifyMembership(_membershipMsg(height, path, emptyValue)); - - assertEq(timestamp, TIMESTAMP); - } - - function test_verifyMembership_reverts_for_wrong_value() public { - client.updateClient(_updateMsg(height, TIMESTAMP, path, value)); - - vm.expectRevert(DummyLightClient.ValueMismatch.selector); - client.verifyMembership(_membershipMsg(height, path, bytes("wrong"))); - } - - function test_verifyMembership_reverts_for_absent_path() public { - client.updateClient(_updateMsg(height, TIMESTAMP, path, value)); - - vm.expectRevert(DummyLightClient.MissingMembership.selector); - client.verifyMembership(_membershipMsg(height, _otherPath(), value)); - } - - function test_verifyMembership_reverts_for_unknown_height() public { - vm.expectRevert(DummyLightClient.UnknownHeight.selector); - client.verifyMembership(_membershipMsg(height, path, value)); - } - - function test_verifyNonMembership_succeeds() public { - client.updateClient(_updateMsg(height, TIMESTAMP, path, value)); - - uint256 timestamp = client.verifyNonMembership(_nonMembershipMsg(height, _otherPath())); - - assertEq(timestamp, TIMESTAMP); - } - - function test_verifyNonMembership_reverts_for_present_path() public { - client.updateClient(_updateMsg(height, TIMESTAMP, path, value)); - - vm.expectRevert(DummyLightClient.MembershipExists.selector); - client.verifyNonMembership(_nonMembershipMsg(height, path)); - } - - function test_updateClient_overwrites_same_height_path() public { - bytes memory newValue = bytes("new value"); - client.updateClient(_updateMsg(height, TIMESTAMP, path, value)); - client.updateClient(_updateMsg(height, TIMESTAMP + 1, path, newValue)); - - vm.expectRevert(DummyLightClient.ValueMismatch.selector); - client.verifyMembership(_membershipMsg(height, path, value)); - - assertEq(client.verifyMembership(_membershipMsg(height, path, newValue)), TIMESTAMP + 1); - } - - function _updateMsg( - IICS02ClientMsgs.Height memory height_, - uint64 timestamp, - bytes[] memory path_, - bytes memory value_ - ) - internal - pure - returns (bytes memory) - { - IDummyLightClientMsgs.Membership[] memory memberships = new IDummyLightClientMsgs.Membership[](1); - memberships[0] = IDummyLightClientMsgs.Membership({ path: path_, value: value_ }); - return abi.encode( - IDummyLightClientMsgs.MsgUpdateClient({ height: height_, timestamp: timestamp, memberships: memberships }) - ); - } - - function _membershipMsg( - IICS02ClientMsgs.Height memory height_, - bytes[] memory path_, - bytes memory value_ - ) - internal - pure - returns (ILightClientMsgs.MsgVerifyMembership memory) - { - return ILightClientMsgs.MsgVerifyMembership({ - proof: bytes("ignored"), proofHeight: height_, path: path_, value: value_ - }); - } - - function _nonMembershipMsg( - IICS02ClientMsgs.Height memory height_, - bytes[] memory path_ - ) - internal - pure - returns (ILightClientMsgs.MsgVerifyNonMembership memory) - { - return ILightClientMsgs.MsgVerifyNonMembership({ proof: bytes("ignored"), proofHeight: height_, path: path_ }); - } - - function _otherPath() internal pure returns (bytes[] memory) { - bytes[] memory other = new bytes[](2); - other[0] = bytes("ibc"); - other[1] = bytes("other"); - return other; - } -} diff --git a/packages/proof-api/modules/evmdummy-to-evmdummy/Cargo.toml b/packages/proof-api/modules/evmdummy-to-evmdummy/Cargo.toml deleted file mode 100644 index 2605fd682..000000000 --- a/packages/proof-api/modules/evmdummy-to-evmdummy/Cargo.toml +++ /dev/null @@ -1,16 +0,0 @@ -[package] -name = "proof-api-evmdummy-to-evmdummy" -version.workspace = true -edition.workspace = true -repository.workspace = true -license.workspace = true - -[dependencies] -alloy = { workspace = true, features = ["full"] } -anyhow = { workspace = true, features = ["std"] } -proof-api-core = { workspace = true, default-features = false } -proof-api-lib = { workspace = true, default-features = false } -ibc-eureka-solidity-types = { workspace = true, features = ["rpc"] } -serde = { workspace = true, features = ["derive"] } -serde_json = { workspace = true } -tonic = { workspace = true, default-features = true } diff --git a/packages/proof-api/modules/evmdummy-to-evmdummy/src/lib.rs b/packages/proof-api/modules/evmdummy-to-evmdummy/src/lib.rs deleted file mode 100644 index 9bd1735a6..000000000 --- a/packages/proof-api/modules/evmdummy-to-evmdummy/src/lib.rs +++ /dev/null @@ -1,204 +0,0 @@ -// SPDX-License-Identifier: Apache-2.0 - -//! Local/dev/testing-only one-sided proof API module from EVM dummy to EVM dummy. - -#![deny(clippy::nursery, clippy::pedantic, warnings, unused_crate_dependencies)] -#![allow(missing_docs)] - -mod tx_builder; - -use std::collections::HashMap; - -use alloy::{ - primitives::{Address, TxHash}, - providers::{Provider, RootProvider}, -}; -use proof_api_core::{ - api::{self, proof_api_service_server::ProofApiService}, - modules::ProofApiModule, -}; -use proof_api_lib::{ - listener::{eth_eureka, ChainListenerService}, - service_utils::{parse_eth_tx_hashes, to_tonic_status}, - utils::RelayEventsParams, -}; -use tonic::{Request, Response}; -use tx_builder::TxBuilder; - -#[derive(Clone, Debug, serde::Deserialize, serde::Serialize)] -pub struct EvmDummyToEvmDummyConfig { - pub src_rpc_url: String, - pub src_ics26_address: Address, - pub dst_rpc_url: String, - pub dst_ics26_address: Address, -} - -#[derive(Clone, Copy, Debug)] -pub struct EvmDummyToEvmDummyProofApiModule; - -struct EvmDummyToEvmDummyProofApiModuleService { - src_ics26_address: Address, - src_listener: eth_eureka::ChainListener, - dst_listener: eth_eureka::ChainListener, - tx_builder: TxBuilder, -} - -impl EvmDummyToEvmDummyProofApiModuleService { - async fn new(config: EvmDummyToEvmDummyConfig) -> anyhow::Result { - let src_provider = RootProvider::builder() - .connect(&config.src_rpc_url) - .await - .map_err(|e| anyhow::anyhow!("failed to create source provider: {e}"))?; - let dst_provider = RootProvider::builder() - .connect(&config.dst_rpc_url) - .await - .map_err(|e| anyhow::anyhow!("failed to create destination provider: {e}"))?; - - let src_listener = - eth_eureka::ChainListener::new(config.src_ics26_address, src_provider.clone()); - let dst_listener = - eth_eureka::ChainListener::new(config.dst_ics26_address, dst_provider.clone()); - let tx_builder = TxBuilder::new(src_provider, dst_provider, config.dst_ics26_address); - - Ok(Self { - src_ics26_address: config.src_ics26_address, - src_listener, - dst_listener, - tx_builder, - }) - } -} - -#[tonic::async_trait] -impl ProofApiService for EvmDummyToEvmDummyProofApiModuleService { - async fn info( - &self, - request: Request, - ) -> Result, tonic::Status> { - let src_chain = request.into_inner().src_chain; - Ok(Response::new(api::InfoResponse { - target_chain: Some(api::Chain { - chain_id: self - .dst_listener - .chain_id() - .await - .map_err(to_tonic_status)?, - ibc_version: "2".to_string(), - ibc_contract: self.tx_builder.ics26_router_address().to_string(), - }), - source_chain: Some(api::Chain { - chain_id: src_chain, - ibc_version: "2".to_string(), - ibc_contract: self.src_ics26_address.to_string(), - }), - metadata: HashMap::default(), - })) - } - - async fn create_client( - &self, - _request: Request, - ) -> Result, tonic::Status> { - Ok(Response::new(api::CreateClientResponse { - tx: self.tx_builder.create_client(), - address: String::new(), - })) - } - - async fn update_client( - &self, - request: Request, - ) -> Result, tonic::Status> { - let inner = request.into_inner(); - let tx = self - .tx_builder - .update_client(&inner.dst_client_id) - .await - .map_err(to_tonic_status)?; - Ok(Response::new(api::UpdateClientResponse { - tx, - address: self.tx_builder.ics26_router_address().to_string(), - })) - } - - async fn relay_by_tx( - &self, - request: Request, - ) -> Result, tonic::Status> { - let inner = request.into_inner(); - let src_txs = parse_eth_tx_hashes(inner.source_tx_ids)? - .into_iter() - .map(TxHash::from) - .collect(); - let timeout_txs = parse_eth_tx_hashes(inner.timeout_tx_ids)? - .into_iter() - .map(TxHash::from) - .collect(); - let src_events = self - .src_listener - .fetch_tx_events(src_txs) - .await - .map_err(to_tonic_status)?; - let target_events = self - .dst_listener - .fetch_tx_events(timeout_txs) - .await - .map_err(to_tonic_status)?; - let tx = self - .tx_builder - .relay_events(RelayEventsParams { - src_events, - target_events, - timeout_relay_height: None, - src_client_id: inner.src_client_id, - dst_client_id: inner.dst_client_id, - src_packet_seqs: inner.src_packet_sequences, - dst_packet_seqs: inner.dst_packet_sequences, - }) - .await - .map_err(to_tonic_status)?; - Ok(Response::new(api::RelayByTxResponse { - tx, - address: self.tx_builder.ics26_router_address().to_string(), - })) - } -} - -#[tonic::async_trait] -impl ProofApiModule for EvmDummyToEvmDummyProofApiModule { - fn name(&self) -> &'static str { - "evmdummy_to_evmdummy" - } - - async fn create_service( - &self, - config: serde_json::Value, - ) -> anyhow::Result> { - let config: EvmDummyToEvmDummyConfig = serde_json::from_value(config)?; - Ok(Box::new( - EvmDummyToEvmDummyProofApiModuleService::new(config).await?, - )) - } -} - -#[cfg(test)] -mod tests { - use super::EvmDummyToEvmDummyConfig; - - #[test] - fn obsolete_src_chain_id_is_ignored() { - let config: EvmDummyToEvmDummyConfig = serde_json::from_value(serde_json::json!({ - "src_chain_id": "legacy", - "src_rpc_url": "http://localhost:8545", - "src_ics26_address": "0x0000000000000000000000000000000000000001", - "dst_rpc_url": "http://localhost:9545", - "dst_ics26_address": "0x0000000000000000000000000000000000000002" - })) - .unwrap(); - - assert!( - serde_json::to_value(config).unwrap()["src_chain_id"].is_null(), - "obsolete field must be accepted but not emitted" - ); - } -} diff --git a/packages/proof-api/modules/evmdummy-to-evmdummy/src/tx_builder.rs b/packages/proof-api/modules/evmdummy-to-evmdummy/src/tx_builder.rs deleted file mode 100644 index aed47f440..000000000 --- a/packages/proof-api/modules/evmdummy-to-evmdummy/src/tx_builder.rs +++ /dev/null @@ -1,266 +0,0 @@ -// SPDX-License-Identifier: Apache-2.0 - -use alloy::{ - network::Ethereum, - primitives::{Address, Bytes}, - providers::{Provider, RootProvider}, - sol_types::{SolCall, SolValue}, -}; -use anyhow::{bail, Context, Result}; -use ibc_eureka_solidity_types::{ - dummy::{ - dummy_light_client, - IDummyLightClientMsgs::{Membership, MsgUpdateClient}, - }, - ics26::{ - acknowledgement_commitment, - router::{multicallCall, routerCalls, routerInstance, updateClientCall}, - IICS02ClientMsgs::Height, - NoAcknowledgements, - }, - msgs::IICS02ClientMsgs::Height as DummyHeight, -}; -use proof_api_lib::utils::{ - eth_eureka::{src_events_to_recv_and_ack_msgs, target_events_to_timeout_msgs}, - RelayEventsParams, -}; - -pub struct TxBuilder { - src_provider: RootProvider, - dst_provider: RootProvider, - dst_ics26_router: routerInstance, -} - -impl TxBuilder { - pub fn new( - src_provider: RootProvider, - dst_provider: RootProvider, - dst_ics26_address: Address, - ) -> Self { - Self { - src_provider, - dst_provider: dst_provider.clone(), - dst_ics26_router: routerInstance::new(dst_ics26_address, dst_provider), - } - } - - pub const fn ics26_router_address(&self) -> &Address { - self.dst_ics26_router.address() - } - - pub fn create_client(&self) -> Vec { - dummy_light_client::DummyLightClient::deploy_builder(self.dst_provider.clone()) - .calldata() - .to_vec() - } - - pub async fn update_client(&self, dst_client_id: &str) -> Result> { - let (latest_source_height, latest_source_timestamp) = - self.latest_source_consensus_state().await?; - Ok(update_client_call( - dst_client_id, - &dummy_update_msg(latest_source_height, latest_source_timestamp, Vec::new()), - ) - .abi_encode()) - } - - pub async fn relay_events(&self, params: RelayEventsParams) -> Result> { - let (latest_source_height, latest_source_timestamp) = - self.latest_source_consensus_state().await?; - let counterparty = self - .dst_ics26_router - .getCounterparty(params.dst_client_id.clone()) - .call() - .await?; - let proof_height = Height { - revisionNumber: 0, - revisionHeight: latest_source_height, - }; - - let recv_and_ack_msgs = src_events_to_recv_and_ack_msgs( - params.src_events, - ¶ms.src_client_id, - ¶ms.dst_client_id, - ¶ms.src_packet_seqs, - ¶ms.dst_packet_seqs, - &proof_height, - latest_source_timestamp, - )?; - let timeout_msgs = target_events_to_timeout_msgs( - params.target_events, - ¶ms.src_client_id, - ¶ms.dst_client_id, - ¶ms.dst_packet_seqs, - &proof_height, - latest_source_timestamp, - ); - let packet_calls: Vec<_> = recv_and_ack_msgs.into_iter().chain(timeout_msgs).collect(); - if packet_calls.is_empty() { - bail!("no packets collected"); - } - - let memberships = memberships_for_calls(&packet_calls, &counterparty.merklePrefix)?; - let update_call = update_client_call( - ¶ms.dst_client_id, - &dummy_update_msg(latest_source_height, latest_source_timestamp, memberships), - ) - .abi_encode(); - let packet_calls = packet_calls.into_iter().map(|msg| match msg { - routerCalls::timeoutPacket(call) => call.abi_encode(), - routerCalls::recvPacket(call) => call.abi_encode(), - routerCalls::ackPacket(call) => call.abi_encode(), - _ => unreachable!(), - }); - Ok(multicallCall { - data: std::iter::once(update_call.into()) - .chain(packet_calls.map(Into::into)) - .collect(), - } - .abi_encode()) - } - - async fn latest_source_consensus_state(&self) -> Result<(u64, u64)> { - let block = self - .src_provider - .get_block(alloy::eips::BlockId::latest()) - .hashes() - .await - .context("failed to fetch latest source block")? - .context("latest source block not found")?; - - Ok((block.header.number, block.header.timestamp)) - } -} - -fn update_client_call(dst_client_id: &str, msg: &MsgUpdateClient) -> updateClientCall { - updateClientCall { - clientId: dst_client_id.to_string(), - updateMsg: msg.abi_encode().into(), - } -} - -const fn dummy_update_msg( - revision_height: u64, - timestamp: u64, - memberships: Vec, -) -> MsgUpdateClient { - MsgUpdateClient { - height: DummyHeight { - revisionNumber: 0, - revisionHeight: revision_height, - }, - timestamp, - memberships, - } -} - -fn memberships_for_calls( - calls: &[routerCalls], - merkle_prefix: &[Bytes], -) -> std::result::Result, NoAcknowledgements> { - calls - .iter() - .filter_map(|call| match call { - routerCalls::recvPacket(call) => Some(Ok(Membership { - path: prefixed_path(merkle_prefix, &call.msg_.packet.commitment_path()), - value: call.msg_.packet.commitment().into(), - })), - routerCalls::ackPacket(call) => Some( - acknowledgement_commitment(std::slice::from_ref(&call.msg_.acknowledgement)).map( - |value| Membership { - path: prefixed_path(merkle_prefix, &call.msg_.packet.ack_commitment_path()), - value: value.into(), - }, - ), - ), - routerCalls::timeoutPacket(_) => None, - _ => unreachable!(), - }) - .collect() -} - -fn prefixed_path(merkle_prefix: &[Bytes], path: &[u8]) -> Vec { - let (last, prefix) = merkle_prefix - .split_last() - .expect("merkle prefix must be non-empty"); - let mut last = last.to_vec(); - last.extend_from_slice(path); - let mut merkle_prefix = prefix.to_vec(); - merkle_prefix.push(last.into()); - merkle_prefix -} - -#[cfg(test)] -mod tests { - use super::*; - use alloy::primitives::Bytes; - use ibc_eureka_solidity_types::ics26::{ - router::{ackPacketCall, recvPacketCall, timeoutPacketCall}, - IICS26RouterMsgs::{MsgAckPacket, MsgRecvPacket, MsgTimeoutPacket, Packet}, - }; - - fn packet() -> Packet { - Packet { - sequence: 7, - sourceClient: "src".to_string(), - destClient: "dst".to_string(), - timeoutTimestamp: u64::MAX, - payloads: Vec::new(), - } - } - - #[test] - fn prefixed_path_appends_to_last_prefix_element() { - let path = packet().commitment_path(); - let got = prefixed_path(&[Bytes::from_static(b"ibc")], &path); - let mut expected = b"ibc".to_vec(); - expected.extend_from_slice(&path); - assert_eq!(got, vec![Bytes::from(expected)]); - } - - #[test] - fn membership_generation_matches_packet_calls() { - let pkt = packet(); - let ack = Bytes::from_static(b"ack"); - let calls = vec![ - routerCalls::recvPacket(recvPacketCall { - msg_: MsgRecvPacket { - packet: pkt.clone(), - proofHeight: Height { - revisionNumber: 0, - revisionHeight: 1, - }, - proofCommitment: Bytes::new(), - }, - }), - routerCalls::ackPacket(ackPacketCall { - msg_: MsgAckPacket { - packet: pkt.clone(), - acknowledgement: ack.clone(), - proofHeight: Height { - revisionNumber: 0, - revisionHeight: 1, - }, - proofAcked: Bytes::new(), - }, - }), - routerCalls::timeoutPacket(timeoutPacketCall { - msg_: MsgTimeoutPacket { - packet: pkt.clone(), - proofHeight: Height { - revisionNumber: 0, - revisionHeight: 1, - }, - proofTimeout: Bytes::new(), - }, - }), - ]; - let memberships = memberships_for_calls(&calls, &[Bytes::from_static(b"ibc")]).unwrap(); - assert_eq!(memberships.len(), 2); - assert_eq!(memberships[0].value, Bytes::from(pkt.commitment())); - assert_eq!( - memberships[1].value, - Bytes::from(acknowledgement_commitment(&[ack]).unwrap()) - ); - } -} diff --git a/packages/solidity/src/dummy.rs b/packages/solidity/src/dummy.rs deleted file mode 100644 index 92a333d7f..000000000 --- a/packages/solidity/src/dummy.rs +++ /dev/null @@ -1,33 +0,0 @@ -// SPDX-License-Identifier: Apache-2.0 - -//! Solidity types for dummy light client. - -use crate::msgs::IICS02ClientMsgs; - -pub mod dummy_light_client { - #[cfg(feature = "rpc")] - alloy_sol_types::sol!( - #[sol(rpc)] - #[allow(clippy::nursery, clippy::too_many_arguments)] - DummyLightClient, - "../../ibc-solidity/abi/bytecode/DummyLightClient.json" - ); - - #[cfg(not(feature = "rpc"))] - alloy_sol_types::sol!( - DummyLightClient, - "../../ibc-solidity/abi/DummyLightClient.json" - ); -} - -alloy_sol_types::sol!( - "../../ibc-solidity/contracts/light-clients/dummy/msgs/IDummyLightClientMsgs.sol" -); - -pub mod dummy_light_client_msgs { - #[allow(non_snake_case)] - pub mod DummyLightClientMsgs { - pub use super::super::IDummyLightClientMsgs::{Membership, MsgUpdateClient}; - pub use crate::msgs::IICS02ClientMsgs::Height; - } -} diff --git a/packages/solidity/src/lib.rs b/packages/solidity/src/lib.rs index bdec1c4e6..aea6d3f49 100644 --- a/packages/solidity/src/lib.rs +++ b/packages/solidity/src/lib.rs @@ -6,7 +6,6 @@ pub mod attestation; pub mod besu; -pub mod dummy; pub mod ics26; pub mod msgs; pub mod sp1_ics07; diff --git a/programs/proof-api/Cargo.toml b/programs/proof-api/Cargo.toml index 506fc92cd..54fd4541a 100644 --- a/programs/proof-api/Cargo.toml +++ b/programs/proof-api/Cargo.toml @@ -11,7 +11,6 @@ proof-api-eth-to-cosmos = { workspace = true, default-features = false } proof-api-eth-to-cosmos-compat = { workspace = true, default-features = false } proof-api-cosmos-to-eth = { workspace = true, default-features = false } proof-api-eth-to-eth = { workspace = true, default-features = false } -proof-api-evmdummy-to-evmdummy = { workspace = true, default-features = false } proof-api-besu-to-besu = { workspace = true, default-features = false } proof-api-cosmos-to-cosmos = { workspace = true, default-features = false } proof-api-solana-to-cosmos = { workspace = true, default-features = false } diff --git a/programs/proof-api/README.md b/programs/proof-api/README.md index 280b01041..f85e7c91f 100644 --- a/programs/proof-api/README.md +++ b/programs/proof-api/README.md @@ -23,7 +23,6 @@ Each module runs in one direction and specializes in how it builds proofs and tr | `cosmos_to_eth` | Cosmos SDK | EVM | Parse Cosmos events, build EVM IBC txs | `sp1` — ZK proofs via SP1
`attested` — multisig attestations | | `eth_to_cosmos` | EVM | Cosmos SDK | Parse EVM events, build Cosmos IBC txs | `real` — ethereum mainnet beacon API proofs
`mock` — dev/test mode
`attested` — multisig attestations | | `eth_to_eth` | EVM | EVM | Parse EVM events, build attested txs | `attested` — multisig attestations | -| `evmdummy_to_evmdummy` | EVM | EVM | Parse EVM events, build local dummy txs | insecure local/dev/testing only; dummy membership records, not real proofs | | `besu_to_besu` | Besu BFT EVM | Besu BFT EVM | Parse EVM events, build Besu real-proof txs | direct Besu light-client updates + Besu account/storage proofs | | `cosmos_to_cosmos` | Cosmos SDK | Cosmos SDK | Parse Cosmos events, build Cosmos IBC txs | ICS-07 light client proofs only (validator signatures and merkle proofs) | | `cosmos_to_solana` | Cosmos SDK | Solana | Parse Cosmos events, build Solana IBC txs | ICS-07 light client proofs only (validator signatures and merkle proofs) | @@ -126,13 +125,6 @@ Module configuration varies by module type: - `mode.cache`: Optional cache config. - `mode.cache.state_cache_max_entries`. (default: 10000) - `mode.cache.packet_cache_max_entries`. (default: 10000) -- `evmdummy_to_evmdummy`: - - `src_rpc_url`: Source EVM RPC endpoint. - - `src_ics26_address`: Source IBC router contract address. - - `dst_rpc_url`: Destination EVM RPC endpoint. - - `dst_ics26_address`: Destination IBC router contract address. - - Create-client returns only `DummyLightClient` deployment calldata; the caller must deploy it and register it with `ICS26Router.addClient(...)`. - - Insecure, local/dev/testing only. Relay uses dummy membership records, not real proofs. - `besu_to_besu`: - `src_rpc_url`: Source Besu RPC endpoint. - `src_ics26_address`: Source IBC router contract address. diff --git a/programs/proof-api/config.example.json b/programs/proof-api/config.example.json index 5099c0dd7..b6ebc1a68 100644 --- a/programs/proof-api/config.example.json +++ b/programs/proof-api/config.example.json @@ -133,18 +133,6 @@ } } }, - { - "name": "evmdummy_to_evmdummy", - "src_chain": "evm-local-a", - "dst_chain": "evm-local-b", - "enabled": false, - "config": { - "src_rpc_url": "http://127.0.0.1:8545", - "src_ics26_address": "0x4242424242424242424242424242424242424242", - "dst_rpc_url": "http://127.0.0.1:9545", - "dst_ics26_address": "0x4242424242424242424242424242424242424242" - } - }, { "name": "eth_to_cosmos_compat", "src_chain": "0x1", diff --git a/programs/proof-api/src/bin/proof-api.rs b/programs/proof-api/src/bin/proof-api.rs index 56b590391..b9afa02a6 100644 --- a/programs/proof-api/src/bin/proof-api.rs +++ b/programs/proof-api/src/bin/proof-api.rs @@ -14,7 +14,6 @@ use proof_api_eth_to_cosmos::EthToCosmosProofApiModule; use proof_api_eth_to_cosmos_compat::EthToCosmosCompatProofApiModule; use proof_api_eth_to_eth::EthToEthProofApiModule; use proof_api_eth_to_solana::EthToSolanaProofApiModule; -use proof_api_evmdummy_to_evmdummy::EvmDummyToEvmDummyProofApiModule; use proof_api_solana_to_cosmos::SolanaToCosmosProofApiModule; use proof_api_solana_to_eth::SolanaToEthProofApiModule; @@ -49,7 +48,6 @@ async fn main() -> anyhow::Result<()> { proof_api_builder.add_module(EthToCosmosProofApiModule); proof_api_builder.add_module(EthToCosmosCompatProofApiModule); proof_api_builder.add_module(EthToEthProofApiModule); - proof_api_builder.add_module(EvmDummyToEvmDummyProofApiModule); proof_api_builder.add_module(BesuToBesuProofApiModule); proof_api_builder.add_module(SolanaToCosmosProofApiModule); proof_api_builder.add_module(CosmosToSolanaProofApiModule); From 506a73c131a6b1ad4ef646b38374ecb57bc7ac52 Mon Sep 17 00:00:00 2001 From: Gjermund Garaba Date: Tue, 25 Aug 2026 15:32:40 +0200 Subject: [PATCH 17/22] fix(e2e): configure Besu private-network sync peers Signed-off-by: Gjermund Garaba --- e2e/interchaintestv8/chainconfig/testdata/besu/qbft/config.toml | 1 + 1 file changed, 1 insertion(+) diff --git a/e2e/interchaintestv8/chainconfig/testdata/besu/qbft/config.toml b/e2e/interchaintestv8/chainconfig/testdata/besu/qbft/config.toml index b8b111636..3c5b75f9a 100644 --- a/e2e/interchaintestv8/chainconfig/testdata/besu/qbft/config.toml +++ b/e2e/interchaintestv8/chainconfig/testdata/besu/qbft/config.toml @@ -9,4 +9,5 @@ rpc-http-api=["ETH","NET","QBFT","WEB3","DEBUG"] host-allowlist=["*"] rpc-http-cors-origins=["all"] min-gas-price=0 +sync-min-peers=1 tx-pool="legacy" From d01a969f80353159b3c5cde4e2e82f857a6ff4d1 Mon Sep 17 00:00:00 2001 From: Gjermund Garaba Date: Tue, 25 Aug 2026 16:46:08 +0200 Subject: [PATCH 18/22] refactor(besu): deduplicate fixture client deployment Signed-off-by: Gjermund Garaba --- .../test/besu-bft/BesuIBFT2LightClient.t.sol | 32 ++----------------- .../BesuLightClientFixtureTestBase.sol | 28 ++++++++++++++++ .../test/besu-bft/BesuQBFTLightClient.t.sol | 32 ++----------------- 3 files changed, 32 insertions(+), 60 deletions(-) diff --git a/ibc-solidity/test/besu-bft/BesuIBFT2LightClient.t.sol b/ibc-solidity/test/besu-bft/BesuIBFT2LightClient.t.sol index d9fc39a03..6376c62c9 100644 --- a/ibc-solidity/test/besu-bft/BesuIBFT2LightClient.t.sol +++ b/ibc-solidity/test/besu-bft/BesuIBFT2LightClient.t.sol @@ -1,8 +1,6 @@ // SPDX-License-Identifier: Apache-2.0 pragma solidity ^0.8.28; -import { BesuIBFT2LightClient } from "../../contracts/light-clients/besu/BesuIBFT2LightClient.sol"; -import { BesuQBFTLightClient } from "../../contracts/light-clients/besu/BesuQBFTLightClient.sol"; import { IBesuLightClient } from "../../contracts/light-clients/besu/interfaces/IBesuLightClient.sol"; import { BesuLightClientFixtureTestBase } from "./BesuLightClientFixtureTestBase.sol"; @@ -12,36 +10,10 @@ contract BesuIBFT2LightClientTest is BesuLightClientFixtureTestBase { } function _deployPrimaryClient() internal override returns (IBesuLightClient) { - return IBesuLightClient( - address( - new BesuIBFT2LightClient( - fixture.routerAddress, - fixture.initialTrustedHeight, - fixture.initialTrustedTimestamp, - fixture.initialTrustedStorageRoot, - fixture.initialTrustedValidators, - fixture.trustingPeriod, - fixture.maxClockDrift, - address(0) - ) - ) - ); + return _deployIBFT2(); } function _deployWrongWrapper() internal override returns (IBesuLightClient) { - return IBesuLightClient( - address( - new BesuQBFTLightClient( - fixture.routerAddress, - fixture.initialTrustedHeight, - fixture.initialTrustedTimestamp, - fixture.initialTrustedStorageRoot, - fixture.initialTrustedValidators, - fixture.trustingPeriod, - fixture.maxClockDrift, - address(0) - ) - ) - ); + return _deployQBFT(); } } diff --git a/ibc-solidity/test/besu-bft/BesuLightClientFixtureTestBase.sol b/ibc-solidity/test/besu-bft/BesuLightClientFixtureTestBase.sol index 8a2f1d3c7..f452840ae 100644 --- a/ibc-solidity/test/besu-bft/BesuLightClientFixtureTestBase.sol +++ b/ibc-solidity/test/besu-bft/BesuLightClientFixtureTestBase.sol @@ -8,6 +8,8 @@ import { stdJson } from "forge-std/StdJson.sol"; import { ILightClientMsgs } from "../../contracts/msgs/ILightClientMsgs.sol"; import { IICS02ClientMsgs } from "../../contracts/msgs/IICS02ClientMsgs.sol"; +import { BesuIBFT2LightClient } from "../../contracts/light-clients/besu/BesuIBFT2LightClient.sol"; +import { BesuQBFTLightClient } from "../../contracts/light-clients/besu/BesuQBFTLightClient.sol"; import { IBesuLightClient } from "../../contracts/light-clients/besu/interfaces/IBesuLightClient.sol"; import { IBesuLightClientMsgs } from "../../contracts/light-clients/besu/msgs/IBesuLightClientMsgs.sol"; import { IBesuLightClientErrors } from "../../contracts/light-clients/besu/errors/IBesuLightClientErrors.sol"; @@ -403,6 +405,32 @@ abstract contract BesuLightClientFixtureTestBase is Test { }); } + function _deployIBFT2() internal returns (IBesuLightClient) { + return new BesuIBFT2LightClient( + fixture.routerAddress, + fixture.initialTrustedHeight, + fixture.initialTrustedTimestamp, + fixture.initialTrustedStorageRoot, + fixture.initialTrustedValidators, + fixture.trustingPeriod, + fixture.maxClockDrift, + address(0) + ); + } + + function _deployQBFT() internal returns (IBesuLightClient) { + return new BesuQBFTLightClient( + fixture.routerAddress, + fixture.initialTrustedHeight, + fixture.initialTrustedTimestamp, + fixture.initialTrustedStorageRoot, + fixture.initialTrustedValidators, + fixture.trustingPeriod, + fixture.maxClockDrift, + address(0) + ); + } + function _fixtureFile() internal pure virtual returns (string memory); function _deployPrimaryClient() internal virtual returns (IBesuLightClient); function _deployWrongWrapper() internal virtual returns (IBesuLightClient); diff --git a/ibc-solidity/test/besu-bft/BesuQBFTLightClient.t.sol b/ibc-solidity/test/besu-bft/BesuQBFTLightClient.t.sol index e7e8bf3cc..1b67f785b 100644 --- a/ibc-solidity/test/besu-bft/BesuQBFTLightClient.t.sol +++ b/ibc-solidity/test/besu-bft/BesuQBFTLightClient.t.sol @@ -1,8 +1,6 @@ // SPDX-License-Identifier: Apache-2.0 pragma solidity ^0.8.28; -import { BesuIBFT2LightClient } from "../../contracts/light-clients/besu/BesuIBFT2LightClient.sol"; -import { BesuQBFTLightClient } from "../../contracts/light-clients/besu/BesuQBFTLightClient.sol"; import { IBesuLightClient } from "../../contracts/light-clients/besu/interfaces/IBesuLightClient.sol"; import { BesuLightClientFixtureTestBase } from "./BesuLightClientFixtureTestBase.sol"; @@ -12,36 +10,10 @@ contract BesuQBFTLightClientTest is BesuLightClientFixtureTestBase { } function _deployPrimaryClient() internal override returns (IBesuLightClient) { - return IBesuLightClient( - address( - new BesuQBFTLightClient( - fixture.routerAddress, - fixture.initialTrustedHeight, - fixture.initialTrustedTimestamp, - fixture.initialTrustedStorageRoot, - fixture.initialTrustedValidators, - fixture.trustingPeriod, - fixture.maxClockDrift, - address(0) - ) - ) - ); + return _deployQBFT(); } function _deployWrongWrapper() internal override returns (IBesuLightClient) { - return IBesuLightClient( - address( - new BesuIBFT2LightClient( - fixture.routerAddress, - fixture.initialTrustedHeight, - fixture.initialTrustedTimestamp, - fixture.initialTrustedStorageRoot, - fixture.initialTrustedValidators, - fixture.trustingPeriod, - fixture.maxClockDrift, - address(0) - ) - ) - ); + return _deployIBFT2(); } } From 97f9cb65305f827fce6c0148124fdba54080cc2c Mon Sep 17 00:00:00 2001 From: Gjermund Garaba Date: Wed, 26 Aug 2026 14:00:03 +0200 Subject: [PATCH 19/22] test(besu): table-drive valid fixture updates Signed-off-by: Gjermund Garaba --- .../BesuLightClientFixtureTestBase.sol | 53 ++++++------------- 1 file changed, 16 insertions(+), 37 deletions(-) diff --git a/ibc-solidity/test/besu-bft/BesuLightClientFixtureTestBase.sol b/ibc-solidity/test/besu-bft/BesuLightClientFixtureTestBase.sol index f452840ae..68692c3aa 100644 --- a/ibc-solidity/test/besu-bft/BesuLightClientFixtureTestBase.sol +++ b/ibc-solidity/test/besu-bft/BesuLightClientFixtureTestBase.sol @@ -78,30 +78,19 @@ abstract contract BesuLightClientFixtureTestBase is Test { wrongWrapper = _deployWrongWrapper(); } - function test_updateClient_validAdjacentUpdate() public { - vm.warp(fixture.initialTrustedTimestamp + 1); - - ILightClientMsgs.UpdateResult result = client.updateClient(_encodeUpdate(fixture.adjacentUpdate)); - - assertEq(uint8(result), uint8(ILightClientMsgs.UpdateResult.Update)); - _assertClientState( - fixture.adjacentUpdate.expectedTimestamp, - fixture.adjacentUpdate.expectedStorageRoot, - fixture.adjacentUpdate.height - ); + function fixtureUpdate() public view returns (BesuUpdateFixture[] memory updates) { + updates = new BesuUpdateFixture[](2); + updates[0] = fixture.adjacentUpdate; + updates[1] = fixture.nonAdjacentUpdate; } - function test_updateClient_validNonAdjacentUpdate() public { + function tableUpdateClientValid(BesuUpdateFixture memory update) public { vm.warp(fixture.initialTrustedTimestamp + 1); - ILightClientMsgs.UpdateResult result = client.updateClient(_encodeUpdate(fixture.nonAdjacentUpdate)); + ILightClientMsgs.UpdateResult result = client.updateClient(_encodeUpdate(update)); assertEq(uint8(result), uint8(ILightClientMsgs.UpdateResult.Update)); - _assertClientState( - fixture.nonAdjacentUpdate.expectedTimestamp, - fixture.nonAdjacentUpdate.expectedStorageRoot, - fixture.nonAdjacentUpdate.height - ); + _assertClientState(update); } function test_updateClient_revertZeroTimestampWithoutStateChange() public { @@ -287,33 +276,23 @@ abstract contract BesuLightClientFixtureTestBase is Test { wrongWrapper.updateClient(_encodeUpdate(fixture.nonAdjacentUpdate)); } - function _assertClientState( - uint64 expectedTimestamp, - bytes32 expectedStorageRoot, - uint64 expectedLatestHeight - ) - internal - view - { + function _assertClientState(BesuUpdateFixture memory update) internal view { (address ibcRouter, IICS02ClientMsgs.Height memory latestHeight, uint64 trustingPeriod, uint64 maxClockDrift) = abi.decode(client.getClientState(), (address, IICS02ClientMsgs.Height, uint64, uint64)); assertEq(ibcRouter, fixture.routerAddress); assertEq(latestHeight.revisionNumber, 0); - assertEq(latestHeight.revisionHeight, expectedLatestHeight); + assertEq(latestHeight.revisionHeight, update.height); assertEq(trustingPeriod, fixture.trustingPeriod); assertEq(maxClockDrift, fixture.maxClockDrift); (uint64 timestamp, bytes32 storageRoot, address[] memory validators) = - abi.decode(client.getConsensusState(expectedLatestHeight), (uint64, bytes32, address[])); - assertEq(timestamp, expectedTimestamp); - assertEq(storageRoot, expectedStorageRoot); - - address[] memory expectedValidators = expectedLatestHeight == fixture.adjacentUpdate.height - ? fixture.adjacentUpdate.expectedValidators - : fixture.nonAdjacentUpdate.expectedValidators; - assertEq(validators.length, expectedValidators.length); - for (uint256 i = 0; i < expectedValidators.length; ++i) { - assertEq(validators[i], expectedValidators[i]); + abi.decode(client.getConsensusState(update.height), (uint64, bytes32, address[])); + assertEq(timestamp, update.expectedTimestamp); + assertEq(storageRoot, update.expectedStorageRoot); + + assertEq(validators.length, update.expectedValidators.length); + for (uint256 i = 0; i < update.expectedValidators.length; ++i) { + assertEq(validators[i], update.expectedValidators[i]); } } From 6abf71c9941df9828295da5c14199e8211fbc4a8 Mon Sep 17 00:00:00 2001 From: Gjermund Garaba Date: Wed, 26 Aug 2026 16:47:22 +0200 Subject: [PATCH 20/22] refactor(besu): address proof API review feedback Signed-off-by: Gjermund Garaba --- Cargo.lock | 4 +- Cargo.toml | 4 +- e2e/interchaintestv8/README.md | 2 +- e2e/interchaintestv8/besu_to_besu_test.go | 4 +- e2e/interchaintestv8/proofapi/builder.go | 14 +- e2e/interchaintestv8/proofapi/builder_test.go | 4 +- e2e/interchaintestv8/proofapi/config.go | 6 +- .../abi/bytecode/BesuIBFT2LightClient.json | 2 +- .../abi/bytecode/BesuQBFTLightClient.json | 2 +- .../besu/BesuLightClientBase.sol | 10 +- .../{besu-to-besu => besu-to-eth}/Cargo.toml | 2 +- .../{besu-to-besu => besu-to-eth}/src/lib.rs | 26 +-- .../src/tx_builder.rs | 211 ++++++------------ packages/solidity/src/ics26.rs | 44 ---- programs/proof-api/Cargo.toml | 2 +- programs/proof-api/README.md | 10 +- programs/proof-api/config.example.json | 2 +- programs/proof-api/src/bin/proof-api.rs | 4 +- 18 files changed, 119 insertions(+), 234 deletions(-) rename packages/proof-api/modules/{besu-to-besu => besu-to-eth}/Cargo.toml (95%) rename packages/proof-api/modules/{besu-to-besu => besu-to-eth}/src/lib.rs (91%) rename packages/proof-api/modules/{besu-to-besu => besu-to-eth}/src/tx_builder.rs (75%) diff --git a/Cargo.lock b/Cargo.lock index bfb655697..32b9fb6b5 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -8491,7 +8491,7 @@ dependencies = [ "opentelemetry-otlp", "opentelemetry_sdk", "prometheus", - "proof-api-besu-to-besu", + "proof-api-besu-to-eth", "proof-api-core", "proof-api-cosmos-to-cosmos", "proof-api-cosmos-to-eth", @@ -8513,7 +8513,7 @@ dependencies = [ ] [[package]] -name = "proof-api-besu-to-besu" +name = "proof-api-besu-to-eth" version = "0.1.0" dependencies = [ "alloy 2.0.4", diff --git a/Cargo.toml b/Cargo.toml index 05e6c5123..092b37d8c 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -20,7 +20,7 @@ members = [ "packages/proof-api/modules/eth-to-cosmos-compat", "packages/proof-api/modules/cosmos-to-eth", "packages/proof-api/modules/eth-to-eth", - "packages/proof-api/modules/besu-to-besu", + "packages/proof-api/modules/besu-to-eth", "packages/proof-api/modules/cosmos-to-cosmos", "packages/proof-api/modules/solana-to-cosmos", "packages/proof-api/modules/cosmos-to-solana", @@ -61,7 +61,7 @@ proof-api-eth-to-cosmos = { path = "packages/proof-api/modules/eth-to-cos proof-api-eth-to-cosmos-compat = { path = "packages/proof-api/modules/eth-to-cosmos-compat", default-features = false } proof-api-cosmos-to-eth = { path = "packages/proof-api/modules/cosmos-to-eth", default-features = false } proof-api-eth-to-eth = { path = "packages/proof-api/modules/eth-to-eth", default-features = false } -proof-api-besu-to-besu = { path = "packages/proof-api/modules/besu-to-besu", default-features = false } +proof-api-besu-to-eth = { path = "packages/proof-api/modules/besu-to-eth", default-features = false } proof-api-cosmos-to-cosmos = { path = "packages/proof-api/modules/cosmos-to-cosmos", default-features = false } proof-api-solana-to-cosmos = { path = "packages/proof-api/modules/solana-to-cosmos", default-features = false } proof-api-cosmos-to-solana = { path = "packages/proof-api/modules/cosmos-to-solana", default-features = false } diff --git a/e2e/interchaintestv8/README.md b/e2e/interchaintestv8/README.md index cc04a8fbd..e68e017dd 100644 --- a/e2e/interchaintestv8/README.md +++ b/e2e/interchaintestv8/README.md @@ -72,7 +72,7 @@ just test-e2e TestWithIbcEurekaTestSuite/Test_ICS20TransferERC20TokenfromEthereu ## Focused Besu ↔ Besu e2e -This focused suite starts two independent Besu QBFT networks, deploys Eureka contracts on both, starts the Rust relayer with `besu_to_besu` in both directions, deploys and registers Besu light clients on both chains, and verifies a one-way A → B ICS20 transfer plus the B → A acknowledgement relay using real Besu proofs. +This focused suite starts two independent Besu QBFT networks, deploys Eureka contracts on both, starts the Rust relayer with `besu_to_eth` in both directions, deploys and registers Besu light clients on both chains, and verifies a one-way A → B ICS20 transfer plus the B → A acknowledgement relay using real Besu proofs. ### Focused local test commands diff --git a/e2e/interchaintestv8/besu_to_besu_test.go b/e2e/interchaintestv8/besu_to_besu_test.go index e4c766598..624fc140e 100644 --- a/e2e/interchaintestv8/besu_to_besu_test.go +++ b/e2e/interchaintestv8/besu_to_besu_test.go @@ -390,7 +390,7 @@ func (s *BesuToBesuTestSuite) deployContracts(chain *besuToBesuChainState) { func (s *BesuToBesuTestSuite) startRelayer() { config := proofapi.NewConfigBuilder(). - BesuToBesu(proofapi.BesuToBesuParams{ + BesuToEth(proofapi.BesuToEthParams{ SrcChainID: s.chainA.eth.ChainID.String(), DstChainID: s.chainB.eth.ChainID.String(), SrcRPC: s.chainA.eth.RPC, @@ -399,7 +399,7 @@ func (s *BesuToBesuTestSuite) startRelayer() { DstICS26: s.chainB.contractAddresses.Ics26Router, ConsensusType: besuToBesuConsensusTypeQBFT, }). - BesuToBesu(proofapi.BesuToBesuParams{ + BesuToEth(proofapi.BesuToEthParams{ SrcChainID: s.chainB.eth.ChainID.String(), DstChainID: s.chainA.eth.ChainID.String(), SrcRPC: s.chainB.eth.RPC, diff --git a/e2e/interchaintestv8/proofapi/builder.go b/e2e/interchaintestv8/proofapi/builder.go index 59850e958..5a4c2fbcb 100644 --- a/e2e/interchaintestv8/proofapi/builder.go +++ b/e2e/interchaintestv8/proofapi/builder.go @@ -239,11 +239,11 @@ func (b *ConfigBuilder) EthToEthAttested(p EthToEthAttestedParams) *ConfigBuilde } // ============================================================================= -// Besu → Besu +// Besu → EVM // ============================================================================= -// BesuToBesuParams contains parameters for besu_to_besu module. -type BesuToBesuParams struct { +// BesuToEthParams contains parameters for besu_to_eth module. +type BesuToEthParams struct { SrcChainID string DstChainID string SrcRPC string @@ -253,13 +253,13 @@ type BesuToBesuParams struct { ConsensusType string } -// BesuToBesu adds a Besu→Besu module. -func (b *ConfigBuilder) BesuToBesu(p BesuToBesuParams) *ConfigBuilder { +// BesuToEth adds a Besu→EVM module. +func (b *ConfigBuilder) BesuToEth(p BesuToEthParams) *ConfigBuilder { module := ModuleConfig{ - Name: ModuleBesuToBesu, + Name: ModuleBesuToEth, SrcChain: p.SrcChainID, DstChain: p.DstChainID, - Config: BesuToBesuModuleConfig{ + Config: BesuToEthModuleConfig{ SrcRPCURL: p.SrcRPC, SrcICS26Address: p.SrcICS26, DstRPCURL: p.DstRPC, diff --git a/e2e/interchaintestv8/proofapi/builder_test.go b/e2e/interchaintestv8/proofapi/builder_test.go index c849072e6..a2ddaeda9 100644 --- a/e2e/interchaintestv8/proofapi/builder_test.go +++ b/e2e/interchaintestv8/proofapi/builder_test.go @@ -10,8 +10,8 @@ import ( func TestEVMToEVMBuildersEmitSourceChainOnlyAtRoutingLevel(t *testing.T) { b := NewConfigBuilder(). EthToEthAttested(EthToEthAttestedParams{SrcChainID: "eth-a", DstChainID: "eth-b"}). - BesuToBesu(BesuToBesuParams{SrcChainID: "besu-a", DstChainID: "besu-b"}) - wantSource := map[string]string{ModuleEthToEth: "eth-a", ModuleBesuToBesu: "besu-a"} + BesuToEth(BesuToEthParams{SrcChainID: "besu-a", DstChainID: "besu-b"}) + wantSource := map[string]string{ModuleEthToEth: "eth-a", ModuleBesuToEth: "besu-a"} for _, module := range b.modules { config, err := json.Marshal(module.Config) diff --git a/e2e/interchaintestv8/proofapi/config.go b/e2e/interchaintestv8/proofapi/config.go index 5098a313b..28dceeca5 100644 --- a/e2e/interchaintestv8/proofapi/config.go +++ b/e2e/interchaintestv8/proofapi/config.go @@ -20,7 +20,7 @@ const ( ModuleEthToCosmos = "eth_to_cosmos" ModuleEthToCosmosCompat = "eth_to_cosmos_compat" ModuleEthToEth = "eth_to_eth" - ModuleBesuToBesu = "besu_to_besu" + ModuleBesuToEth = "besu_to_eth" ModuleSolanaToCosmos = "solana_to_cosmos" ModuleCosmosToSolana = "cosmos_to_solana" ModuleEthToSolana = "eth_to_solana" @@ -230,8 +230,8 @@ type EthToEthModuleConfig struct { Mode TxBuilderMode `json:"mode"` } -// BesuToBesuModuleConfig represents the configuration for besu_to_besu module. -type BesuToBesuModuleConfig struct { +// BesuToEthModuleConfig represents the configuration for besu_to_eth module. +type BesuToEthModuleConfig struct { SrcRPCURL string `json:"src_rpc_url"` SrcICS26Address string `json:"src_ics26_address"` DstRPCURL string `json:"dst_rpc_url"` diff --git a/ibc-solidity/abi/bytecode/BesuIBFT2LightClient.json b/ibc-solidity/abi/bytecode/BesuIBFT2LightClient.json index ff0dd0f69..c8cbdaa4e 100644 --- a/ibc-solidity/abi/bytecode/BesuIBFT2LightClient.json +++ b/ibc-solidity/abi/bytecode/BesuIBFT2LightClient.json @@ -1 +1 @@ -{"abi":[{"type":"constructor","inputs":[{"name":"ibcRouter","type":"address","internalType":"address"},{"name":"initialTrustedHeight","type":"uint64","internalType":"uint64"},{"name":"initialTrustedTimestamp","type":"uint64","internalType":"uint64"},{"name":"initialTrustedStorageRoot","type":"bytes32","internalType":"bytes32"},{"name":"initialTrustedValidators","type":"address[]","internalType":"address[]"},{"name":"trustingPeriod","type":"uint64","internalType":"uint64"},{"name":"maxClockDrift","type":"uint64","internalType":"uint64"},{"name":"roleManager","type":"address","internalType":"address"}],"stateMutability":"nonpayable"},{"type":"function","name":"DEFAULT_ADMIN_ROLE","inputs":[],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"type":"function","name":"PROOF_SUBMITTER_ROLE","inputs":[],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"type":"function","name":"getClientState","inputs":[],"outputs":[{"name":"","type":"bytes","internalType":"bytes"}],"stateMutability":"view"},{"type":"function","name":"getConsensusState","inputs":[{"name":"revisionHeight","type":"uint64","internalType":"uint64"}],"outputs":[{"name":"","type":"bytes","internalType":"bytes"}],"stateMutability":"view"},{"type":"function","name":"getRoleAdmin","inputs":[{"name":"role","type":"bytes32","internalType":"bytes32"}],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"type":"function","name":"grantRole","inputs":[{"name":"role","type":"bytes32","internalType":"bytes32"},{"name":"account","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"hasRole","inputs":[{"name":"role","type":"bytes32","internalType":"bytes32"},{"name":"account","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"misbehaviour","inputs":[{"name":"","type":"bytes","internalType":"bytes"}],"outputs":[],"stateMutability":"view"},{"type":"function","name":"renounceRole","inputs":[{"name":"role","type":"bytes32","internalType":"bytes32"},{"name":"callerConfirmation","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"revokeRole","inputs":[{"name":"role","type":"bytes32","internalType":"bytes32"},{"name":"account","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"supportsInterface","inputs":[{"name":"interfaceId","type":"bytes4","internalType":"bytes4"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"updateClient","inputs":[{"name":"updateMsg","type":"bytes","internalType":"bytes"}],"outputs":[{"name":"","type":"uint8","internalType":"enum ILightClientMsgs.UpdateResult"}],"stateMutability":"nonpayable"},{"type":"function","name":"verifyMembership","inputs":[{"name":"msg_","type":"tuple","internalType":"struct ILightClientMsgs.MsgVerifyMembership","components":[{"name":"proof","type":"bytes","internalType":"bytes"},{"name":"proofHeight","type":"tuple","internalType":"struct IICS02ClientMsgs.Height","components":[{"name":"revisionNumber","type":"uint64","internalType":"uint64"},{"name":"revisionHeight","type":"uint64","internalType":"uint64"}]},{"name":"path","type":"bytes[]","internalType":"bytes[]"},{"name":"value","type":"bytes","internalType":"bytes"}]}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"verifyNonMembership","inputs":[{"name":"msg_","type":"tuple","internalType":"struct ILightClientMsgs.MsgVerifyNonMembership","components":[{"name":"proof","type":"bytes","internalType":"bytes"},{"name":"proofHeight","type":"tuple","internalType":"struct IICS02ClientMsgs.Height","components":[{"name":"revisionNumber","type":"uint64","internalType":"uint64"},{"name":"revisionHeight","type":"uint64","internalType":"uint64"}]},{"name":"path","type":"bytes[]","internalType":"bytes[]"}]}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"event","name":"RoleAdminChanged","inputs":[{"name":"role","type":"bytes32","indexed":true,"internalType":"bytes32"},{"name":"previousAdminRole","type":"bytes32","indexed":true,"internalType":"bytes32"},{"name":"newAdminRole","type":"bytes32","indexed":true,"internalType":"bytes32"}],"anonymous":false},{"type":"event","name":"RoleGranted","inputs":[{"name":"role","type":"bytes32","indexed":true,"internalType":"bytes32"},{"name":"account","type":"address","indexed":true,"internalType":"address"},{"name":"sender","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"type":"event","name":"RoleRevoked","inputs":[{"name":"role","type":"bytes32","indexed":true,"internalType":"bytes32"},{"name":"account","type":"address","indexed":true,"internalType":"address"},{"name":"sender","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"type":"error","name":"AccessControlBadConfirmation","inputs":[]},{"type":"error","name":"AccessControlUnauthorizedAccount","inputs":[{"name":"account","type":"address","internalType":"address"},{"name":"neededRole","type":"bytes32","internalType":"bytes32"}]},{"type":"error","name":"ConflictingConsensusState","inputs":[{"name":"revisionHeight","type":"uint64","internalType":"uint64"}]},{"type":"error","name":"ConsensusStateExpired","inputs":[{"name":"trustedTimestamp","type":"uint64","internalType":"uint64"},{"name":"currentTimestamp","type":"uint256","internalType":"uint256"},{"name":"trustingPeriod","type":"uint64","internalType":"uint64"}]},{"type":"error","name":"ConsensusStateNotFound","inputs":[{"name":"revisionHeight","type":"uint64","internalType":"uint64"}]},{"type":"error","name":"DuplicateCommitSealSigner","inputs":[{"name":"signer","type":"address","internalType":"address"}]},{"type":"error","name":"DuplicateValidator","inputs":[{"name":"validator","type":"address","internalType":"address"}]},{"type":"error","name":"EmptyValidatorSet","inputs":[]},{"type":"error","name":"HeaderFromFuture","inputs":[{"name":"currentTimestamp","type":"uint256","internalType":"uint256"},{"name":"headerTimestamp","type":"uint256","internalType":"uint256"},{"name":"maxClockDrift","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"InsufficientTrustedValidatorOverlap","inputs":[{"name":"actual","type":"uint256","internalType":"uint256"},{"name":"required","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"InsufficientValidatorQuorum","inputs":[{"name":"actual","type":"uint256","internalType":"uint256"},{"name":"required","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"InvalidCommitSeal","inputs":[]},{"type":"error","name":"InvalidCommitmentValue","inputs":[{"name":"expectedValue","type":"bytes32","internalType":"bytes32"},{"name":"actualValue","type":"bytes32","internalType":"bytes32"}]},{"type":"error","name":"InvalidDifficulty","inputs":[{"name":"actualDifficulty","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"InvalidECDSASignatureLength","inputs":[{"name":"length","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"InvalidExtraDataFormat","inputs":[{"name":"itemsLength","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"InvalidHeaderFormat","inputs":[{"name":"itemsLength","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"InvalidHeaderHeight","inputs":[]},{"type":"error","name":"InvalidHeaderTimestamp","inputs":[]},{"type":"error","name":"InvalidMixHash","inputs":[{"name":"actualMixHash","type":"bytes32","internalType":"bytes32"}]},{"type":"error","name":"InvalidNonce","inputs":[{"name":"actualNonce","type":"bytes","internalType":"bytes"}]},{"type":"error","name":"InvalidOmmersHash","inputs":[{"name":"actualOmmersHash","type":"bytes32","internalType":"bytes32"}]},{"type":"error","name":"InvalidPathLength","inputs":[{"name":"expectedLength","type":"uint256","internalType":"uint256"},{"name":"actualLength","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"InvalidRevisionNumber","inputs":[{"name":"providedRevisionNumber","type":"uint64","internalType":"uint64"}]},{"type":"error","name":"InvalidValidatorAddress","inputs":[{"name":"validator","type":"address","internalType":"address"}]},{"type":"error","name":"InvalidValidatorAddressLength","inputs":[{"name":"length","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"InvalidValueLength","inputs":[{"name":"expectedLength","type":"uint256","internalType":"uint256"},{"name":"actualLength","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"UnsupportedMisbehaviour","inputs":[]},{"type":"error","name":"ValueExists","inputs":[{"name":"actualValue","type":"bytes32","internalType":"bytes32"}]}],"bytecode":{"object":"0x6080604052346103d85761390380380380610019816103dc565b928339810190610100818303126103d85761003381610401565b9061004060208201610415565b9061004d60408201610415565b92606082015191608081015160018060401b0381116103d85781019286601f850112156103d8578351966001600160401b03881161037f578760051b9460206100978188016103dc565b809a81520190602082978201019283116103d857602001905b8282106103c0575050506100c660a08301610415565b956100df60e06100d860c08601610415565b9401610401565b956001600160401b03169081156103b1576001600160401b03169283156103a257885115610393575f5b89518110156101bf576001600160a01b03610124828c610429565b511615610198575f5b81811061013d5750600101610109565b6001600160a01b0361014f828d610429565b51166001600160a01b03610163848e610429565b5116146101725760010161012d565b6001600160a01b03610184838d610429565b511663107f863360e21b5f5260045260245ffd5b6001600160a01b03906101ab908b610429565b51166359bff38760e01b5f5260045260245ffd5b5060408051979896978a979181016001600160401b0381118282101761037f576040525f81526020810190848252604051926080840198848a1060018060401b038b111761037f576040998a526001600160a01b031680855260208086018490526001600160401b03928316868c01819052878416606090970196909652600180546001600160a01b031916909217825592516002805495516fffffffffffffffff0000000000000000908d1b81169285166001600160801b03199788161792909217815560038054988d1b90921697909516909517959095179093555f948552600490529590922080546001600160401b031916949094178455830191909155925193910191831161037f5768010000000000000000831161037f578154838355808410610359575b50905f5260205f205f5b83811061033c57846001600160a01b0381166103235750610312610547565b505b60405161329990816105ca8239f35b8061033061033692610451565b506104c7565b50610314565b82516001600160a01b0316818301556020909201916001016102f3565b825f528360205f2091820191015b81811061037457506102e9565b5f8155600101610367565b634e487b7160e01b5f52604160045260245ffd5b63339e1ffb60e01b5f5260045ffd5b63574f4e6160e01b5f5260045ffd5b6359d119e360e01b5f5260045ffd5b602080916103cd84610401565b8152019101906100b0565b5f80fd5b6040519190601f01601f191682016001600160401b0381118382101761037f57604052565b51906001600160a01b03821682036103d857565b51906001600160401b03821682036103d857565b805182101561043d5760209160051b010190565b634e487b7160e01b5f52603260045260245ffd5b6001600160a01b0381165f9081525f5160206138e35f395f51905f52602052604090205460ff166104c2576001600160a01b03165f8181525f5160206138e35f395f51905f5260205260408120805460ff191660011790553391905f5160206138635f395f51905f528180a4600190565b505f90565b6001600160a01b0381165f9081525f5160206138835f395f51905f52602052604090205460ff166104c2576001600160a01b03165f8181525f5160206138835f395f51905f5260205260408120805460ff191660011790553391905f5160206138c35f395f51905f52905f5160206138635f395f51905f529080a4600190565b5f80525f5160206138835f395f51905f526020525f5160206138a35f395f51905f525460ff166105c5575f8080525f5160206138835f395f51905f526020525f5160206138a35f395f51905f52805460ff1916600117905533905f5160206138c35f395f51905f525f5160206138635f395f51905f528280a4600190565b5f9056fe60806040526004361015610011575f80fd5b5f3560e01c806301ffc9a7146100f45780630bece356146100ef578063248a9ca3146100ea5780632f2ff15d146100e557806336568abe146100e05780634d6d9ffb146100db5780635972185a146100d6578063682ed5f0146100d157806391d14854146100cc578063a217fddf146100c7578063d547741f146100c2578063ddba6537146100bd578063edce8bdc146100b85763ef913a4b146100b3575f80fd5b610a16565b61095e565b61088b565b61085c565b610842565b6107f4565b6105e6565b6105ac565b6103ac565b610350565b61031a565b6102b5565b610217565b34610195576020600319360112610195576004357fffffffff00000000000000000000000000000000000000000000000000000000811680910361019557807f7965db0b000000000000000000000000000000000000000000000000000000006020921490811561016b575b506040519015158152f35b7f01ffc9a7000000000000000000000000000000000000000000000000000000009150145f610160565b5f80fd5b9060206003198301126101955760043567ffffffffffffffff811161019557826023820112156101955780600401359267ffffffffffffffff84116101955760248483010111610195576024019190565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b346101955761028161022836610199565b5f80527f4c48d1d2b0f4f7485fc28e3db22341d96a20aa29e6efa8149da9751603abd4e06020527f6e0c24a6e293ff9b755263dbaa15ba3796b0b8d3fe17cfb4ddf8143b268eac475490919060ff161561029957610d65565b6040516003821015610294576020918152f35b6101ea565b6102a1611276565b610d65565b90816020910312610195573590565b346101955760206003193601126101955760206102df6004355f525f602052600160405f20015490565b604051908152f35b6003196040910112610195576004359060243573ffffffffffffffffffffffffffffffffffffffff811681036101955790565b346101955761034e61032b366102e7565b90610349610344825f525f602052600160405f20015490565b6112fe565b6121a1565b005b346101955761035e366102e7565b3373ffffffffffffffffffffffffffffffffffffffff8216036103845761034e91612278565b7f6697b232000000000000000000000000000000000000000000000000000000005f5260045ffd5b346101955760206003193601126101955760043567ffffffffffffffff8111610195578060040160806003198336030112610195575f80527f4c48d1d2b0f4f7485fc28e3db22341d96a20aa29e6efa8149da9751603abd4e060205260ff7f6e0c24a6e293ff9b755263dbaa15ba3796b0b8d3fe17cfb4ddf8143b268eac4754161561059f575b61044761044260248401611181565b61136b565b60648201916001610458848461118b565b90500361056157906104a96104966104a261049d61049661049061048961048460446104e09a01611181565b611b10565b988761118b565b9061125d565b3691610b4d565b61234d565b928061120c565b906001840154906040516104d7816104c960208201948560209181520190565b03601f198101835282610afd565b519020916123db565b805161051f5761051b61050b6104fe845467ffffffffffffffff1690565b67ffffffffffffffff1690565b6040519081529081906020820190565b0390f35b61053361052e61055e92612520565b61254d565b7fd039601e000000000000000000000000000000000000000000000000000000005f52600452602490565b5ffd5b61055e61056e848461118b565b7f88b3170e000000000000000000000000000000000000000000000000000000005f52600160045260245250604490565b6105a7611276565b610433565b34610195575f6003193601126101955760206040517fbd893629a699470e4ec82a5715bb4981fdaacc5d0a728bf5f55b801d8f4ef10b8152f35b346101955760206003193601126101955760043567ffffffffffffffff8111610195578060040160a06003198336030112610195575f80527f4c48d1d2b0f4f7485fc28e3db22341d96a20aa29e6efa8149da9751603abd4e060205260ff7f6e0c24a6e293ff9b755263dbaa15ba3796b0b8d3fe17cfb4ddf8143b268eac475416156107e7575b61067c61044260248401611181565b6064820191600161068d848461118b565b90500361056157608481019060206106a5838561120c565b9050036107a957906106f46104966106ed6106e56106de61049d6104966104906106d761048460446107149c01611181565b9b8b61118b565b948761120c565b8101906102a6565b948061120c565b906001850154906040516104d7816104c960208201948560209181520190565b8051156107755761052e61072791612520565b908082036107475761051b61050b6104fe855467ffffffffffffffff1690565b7f56ed1b63000000000000000000000000000000000000000000000000000000005f5260045260245260445ffd5b61055e827f56ed1b63000000000000000000000000000000000000000000000000000000005f52906044916004525f602452565b61055e6107b6838561120c565b7f24fadac8000000000000000000000000000000000000000000000000000000005f52602060045260245250604490565b6107ef611276565b61066d565b3461019557602060ff610836610809366102e7565b905f525f845260405f209073ffffffffffffffffffffffffffffffffffffffff165f5260205260405f2090565b54166040519015158152f35b34610195575f6003193601126101955760206040515f8152f35b346101955761034e61086d366102e7565b90610886610344825f525f602052600160405f20015490565b612278565b346101955761089936610199565b50505f80527f4c48d1d2b0f4f7485fc28e3db22341d96a20aa29e6efa8149da9751603abd4e06020527f6e0c24a6e293ff9b755263dbaa15ba3796b0b8d3fe17cfb4ddf8143b268eac475460ff1615610915575b7f2c1ed462000000000000000000000000000000000000000000000000000000005f5260045ffd5b61091d611276565b6108ed565b67ffffffffffffffff81160361019557565b601f19601f602060409481855280519182918282880152018686015e5f8582860101520116010190565b346101955760206003193601126101955761097e60043561048481610922565b67ffffffffffffffff8154166002600183015492019060405192608084019160208501526040840152606080840152815480915260a08301915f5260205f20905f5b8181106109ea5761051b856109de818703601f198101835282610afd565b60405191829182610934565b825473ffffffffffffffffffffffffffffffffffffffff168452602090930192600192830192016109c0565b34610195575f6003193601126101955761051b60405173ffffffffffffffffffffffffffffffffffffffff60015416602082015267ffffffffffffffff600254818116604084015260401c16606082015267ffffffffffffffff600354818116608084015260401c1660a082015260a081526109de60c082610afd565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b6060810190811067ffffffffffffffff821117610adc57604052565b610a93565b6040810190811067ffffffffffffffff821117610adc57604052565b90601f601f19910116810190811067ffffffffffffffff821117610adc57604052565b60405190610b2f604083610afd565b565b67ffffffffffffffff8111610adc57601f01601f191660200190565b929192610b5982610b31565b91610b676040519384610afd565b829481845281830111610195578281602093845f960137010152565b9080601f8301121561019557816020610b9e93359101610b4d565b90565b6020818303126101955780359067ffffffffffffffff8211610195570180820391608083126101955760405192610bd784610ac0565b823567ffffffffffffffff811161019557604091610bfa84601f19938701610b83565b8652011261019557604051610c0e81610ae1565b6020830135610c1c81610922565b81526040830135610c2c81610922565b60208201526020840152606082013567ffffffffffffffff811161019557610c549201610b83565b604082015290565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b9060018201809211610c9757565b610c5c565b91908201809211610c9757565b908160011b9180830460021490151715610c9757565b81519167ffffffffffffffff8311610adc57680100000000000000008311610adc578154838355808410610d3f575b506020610d009101915f5260205f2090565b5f5b838110610d0f5750505050565b6001906020610d32855173ffffffffffffffffffffffffffffffffffffffff1690565b9401938184015501610d02565b825f528360205f2091820191015b818110610d5a5750610cee565b5f8155600101610d4d565b610d7191810190610ba1565b906020820191610d8d61044284515167ffffffffffffffff1690565b610d9781516115fc565b92604084019367ffffffffffffffff610db8865167ffffffffffffffff1690565b1615611159576080810192610dd86104fe855167ffffffffffffffff1690565b15611131576003549267ffffffffffffffff604085901c16610dfa8142610c9c565b865167ffffffffffffffff169081116110f25750505160200151610e3990610e2b9067ffffffffffffffff16611b10565b9367ffffffffffffffff1690565b67ffffffffffffffff811680151590816110c9575b50611074575090610ebc91610e7d6002610e75610e6a85611b67565b60c086015190611c7c565b950185611e95565b610e8d60a0830194855190611fba565b60406060610eb060015473ffffffffffffffffffffffffffffffffffffffff1690565b9301519101519161205d565b610ee9610ed1865167ffffffffffffffff1690565b67ffffffffffffffff165f52600460205260405f2090565b610efe6104fe825467ffffffffffffffff1690565b6110025750916002610f7c928694610f6f610f3a610f2b610ed1610f8a9a9b5167ffffffffffffffff1690565b955167ffffffffffffffff1690565b859067ffffffffffffffff167fffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000825416179055565b6001840155519101610cbf565b5167ffffffffffffffff1690565b600254610fa39060401c67ffffffffffffffff166104fe565b67ffffffffffffffff821611610fb857505f90565b610ffe907fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff6fffffffffffffffff00000000000000006002549260401b16911617600255565b5f90565b91611018611020945167ffffffffffffffff1690565b9051926120d3565b61106e5761055e611039835167ffffffffffffffff1690565b7fc1aea5f7000000000000000000000000000000000000000000000000000000005f5267ffffffffffffffff16600452602490565b60029150565b61055e9061108a855467ffffffffffffffff1690565b7feae35725000000000000000000000000000000000000000000000000000000005f5267ffffffffffffffff9081166004524260245216604452606490565b90506110ea42916110e56104fe885467ffffffffffffffff1690565b610c9c565b11155f610e4e565b7f9b772277000000000000000000000000000000000000000000000000000000005f524260045267ffffffffffffffff9081166024521660445260645ffd5b7f574f4e61000000000000000000000000000000000000000000000000000000005f5260045ffd5b7f59d119e3000000000000000000000000000000000000000000000000000000005f5260045ffd5b35610b9e81610922565b9035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe181360301821215610195570180359067ffffffffffffffff821161019557602001918160051b3603831361019557565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b9035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe181360301821215610195570180359067ffffffffffffffff82116101955760200191813603831361019557565b9015611271578061126d9161120c565b9091565b6111df565b335f9081527f4c48d1d2b0f4f7485fc28e3db22341d96a20aa29e6efa8149da9751603abd4e0602052604090205460ff16156112ae57565b7fe2517d3f000000000000000000000000000000000000000000000000000000005f52336004527fbd893629a699470e4ec82a5715bb4981fdaacc5d0a728bf5f55b801d8f4ef10b60245260445ffd5b805f525f60205260ff6113323360405f209073ffffffffffffffffffffffffffffffffffffffff165f5260205260405f2090565b54161561133c5750565b7fe2517d3f000000000000000000000000000000000000000000000000000000005f523360045260245260445ffd5b67ffffffffffffffff168061137d5750565b7f3ce598a9000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b6040519060e0820182811067ffffffffffffffff821117610adc57604052606060c0838281528260208201525f60408201525f838201525f60808201528260a08201520152565b8051600110156112715760400190565b805160071015611271576101000190565b8051600d1015611271576101c00190565b8051600e1015611271576101e00190565b805160081015611271576101200190565b8051600310156112715760800190565b8051600b1015611271576101800190565b8051600c1015611271576101a00190565b8051600410156112715760a00190565b8051156112715760200190565b8051600210156112715760600190565b805160101015611271576102200190565b80518210156112715760209160051b010190565b67ffffffffffffffff8111610adc5760051b60200190565b906114e9826114c7565b6114f66040519182610afd565b828152601f1961150682946114c7565b0190602036910137565b90602082519201517fffffffffffffffffffffffffffffffffffffffff00000000000000000000000081169260148110611548575050565b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000929350829060140360031b1b161690565b60405160a0919061158b8382610afd565b6004815291601f1901825f5b8281106115a357505050565b806060602080938501015201611597565b906115be826114c7565b6115cb6040519182610afd565b828152601f196115db82946114c7565b01905f5b8281106115eb57505050565b8060606020809385010152016115df565b61161561161061160a6113a8565b92612520565b61258f565b80825251600f8110611ae557507f1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d4934761165661165083516113ef565b5161265a565b03611aaa57600161167061166a83516113ff565b5161254d565b03611a6f577f63746963616c2062797a616e74696e65206661756c7420746f6c6572616e63656116a36116508351611410565b03611a34576116bb6116b58251611421565b51612676565b80516008811490811591611a04575b506119ca57506116f46116e36104fe61166a8451611432565b67ffffffffffffffff166040830152565b6117016116508251611443565b606082015261172a6117196104fe61166a8451611453565b67ffffffffffffffff166080830152565b61174261161061173d6116b58451611464565b612520565b906020810191808352516005810361199f575061176861176283516113ef565b5161258f565b908151156119775761177a82516114df565b9360a082019485525f5b83518110156119135761179a6116b582866114b3565b8051601481036118e857506117b16117b791611510565b60601c90565b73ffffffffffffffffffffffffffffffffffffffff811680156118a6575f5b8381106118125750509061180c6001926117f1838a516114b3565b9073ffffffffffffffffffffffffffffffffffffffff169052565b01611784565b8161185761183e611824848d516114b3565b5173ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff1690565b14611864576001016117d6565b7f41fe18cc000000000000000000000000000000000000000000000000000000005f5273ffffffffffffffffffffffffffffffffffffffff831660045260245ffd5b7f59bff387000000000000000000000000000000000000000000000000000000005f5273ffffffffffffffffffffffffffffffffffffffff821660045260245ffd5b7f83e46ad2000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b5092611762919450611926925051611475565b61193081516115b4565b9260c081019384525f5b8251811015611971578061196a816119576116b5600195886114b3565b88519061196483836114b3565b526114b3565b500161193a565b50925050565b7f339e1ffb000000000000000000000000000000000000000000000000000000005f5260045ffd5b7f30c6792a000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b611a00906040519182917fd5edd2a500000000000000000000000000000000000000000000000000000000835260048301610934565b0390fd5b7f011b4d03dd8c01f1049143cf9c4c817e4b167f1d1b83e5c6f0f10d89ba1e7bce9150602083012014155f6116ca565b611a4461165061055e9251611410565b7fa19e609c000000000000000000000000000000000000000000000000000000005f52600452602490565b611a7f61166a61055e92516113ff565b7ff71b722f000000000000000000000000000000000000000000000000000000005f52600452602490565b611aba61165061055e92516113ef565b7fb8120dca000000000000000000000000000000000000000000000000000000005f52600452602490565b7fbc277732000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b67ffffffffffffffff1690815f52600460205260405f209167ffffffffffffffff83541615611b3c5750565b7ff761631b000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b611c04611b7261157a565b611beb611b8960208501611b8f611b898251611485565b51612f60565b611b9885611485565b52611ba284611485565b50611bb0611b8982516113ef565b611bb9856113ef565b52611bc3846113ef565b50611bd1611b898251611492565b611bda85611492565b52611be484611492565b5051611443565b611bf482611443565b52611bfe81611443565b506126a0565b611c0f8251516115b4565b905f5b83518051821015611c65579080600192600c82145f14611c53575050611c3783612738565b611c4182866114b3565b52611c4c81856114b3565b5001611c12565b611c6091611b89916114b3565b611c37565b505050611c7291506126a0565b6020815191012090565b919091611c8983516114df565b925f5b8151811015611e8257611c9f81836114b3565b51805160418103611e57575080601b60ff611cee611ce8611cc2611cfb96612717565b517fff000000000000000000000000000000000000000000000000000000000000001690565b60f81c90565b1610611e04575b8461304c565b90611d0581612866565b1590811591611dfa575b508015611ddc575b611db45773ffffffffffffffffffffffffffffffffffffffff81165f5b838110611d5457505090611d4e6001926117f183896114b3565b01611c8c565b81611d6561183e611824848c6114b3565b14611d7257600101611d34565b7f33af0d5f000000000000000000000000000000000000000000000000000000005f5273ffffffffffffffffffffffffffffffffffffffff831660045260245ffd5b7f09cb44e6000000000000000000000000000000000000000000000000000000005f5260045ffd5b5073ffffffffffffffffffffffffffffffffffffffff811615611d17565b905015155f611d0f565b611e46611e1e611e19611ce8611cc285612717565b612854565b60f81b7fff000000000000000000000000000000000000000000000000000000000000001690565b5f1a611e5182612717565b53611cf5565b7ff2db9ce1000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b505050565b5f198114610c975760010190565b905f915f5b8151811015611eee57611ecd73ffffffffffffffffffffffffffffffffffffffff611ec583856114b3565b511684612870565b611eda575b600101611e9a565b92611ee6600191611e87565b939050611ed2565b50506003611efd915404610c89565b90818110611f09575050565b7fe2dcb1b9000000000000000000000000000000000000000000000000000000005f5260045260245260445ffd5b905f198201918211610c9757565b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff408201918211610c9757565b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff808201918211610c9757565b6020039060208211610c9757565b91908203918211610c9757565b905f915f5b815181101561201357611ff273ffffffffffffffffffffffffffffffffffffffff611fea83856114b3565b5116846128c7565b611fff575b600101611fbf565b9261200b600191611e87565b939050611ff7565b50505190600382048203918211610c975781811061202f575050565b7f7818f4e4000000000000000000000000000000000000000000000000000000005f5260045260245260445ffd5b6120a7926116109261173d926040517fffffffffffffffffffffffffffffffffffffffff000000000000000000000000602082019260601b168252601481526104d7603482610afd565b805160021015611271576060610b9e91015161265a565b8054821015611271575f5260205f2001905f90565b919067ffffffffffffffff806120f1855467ffffffffffffffff1690565b921691161490811591612192575b5061218c5760020190815481510361218c575f5b81518110156121845761214961212982856120be565b905473ffffffffffffffffffffffffffffffffffffffff9160031b1c1690565b73ffffffffffffffffffffffffffffffffffffffff61216e61183e61182485876114b3565b91160361217d57600101612113565b5050505f90565b505050600190565b50505f90565b9050600182015414155f6120ff565b805f525f60205260ff6121d58360405f209073ffffffffffffffffffffffffffffffffffffffff165f5260205260405f2090565b541661218c57805f525f60205261220d8260405f209073ffffffffffffffffffffffffffffffffffffffff165f5260205260405f2090565b60017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0082541617905573ffffffffffffffffffffffffffffffffffffffff339216907f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d5f80a4600190565b805f525f60205260ff6122ac8360405f209073ffffffffffffffffffffffffffffffffffffffff165f5260205260405f2090565b54161561218c57805f525f6020526122e58260405f209073ffffffffffffffffffffffffffffffffffffffff165f5260205260405f2090565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00815416905573ffffffffffffffffffffffffffffffffffffffff339216907ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b5f80a4600190565b60208151910120604051602081019182527f1260944489272988d9df285149b5aa1b0f48f2136d6f416159f840a3e0747600604082015260408152612393606082610afd565b51902090565b604051906123a8602083610afd565b5f808352366020840137565b906123be82610b31565b6123cb6040519182610afd565b828152601f196115068294610b31565b61161061241d919493946123ef6020610b31565b956123fd6040519788610afd565b6020875261240b6020610b31565b601f1960208901910136823752612520565b906124288451610ca9565b918451151580612500575b61243c90612546565b61244e6124495f85611fad565b6123b4565b925f19015f5b818110612468575050610b9e939450612a3b565b806124ea600f6124ad6124e4611ce8611cc28d61248760029960011c90565b908d6124de8a6124d68a6124ad6124a4611ce8611cc28a8a612727565b60041c600f1690565b1660f81b7fff000000000000000000000000000000000000000000000000000000000000001690565b5f1a92612727565b53612727565b60ff1690565b5f1a6124f96001830188612727565b5301612454565b506001612433565b6040519061251582610ae1565b5f6020838281520152565b612528612508565b5060208151916040519261253b84610ae1565b835201602082015290565b1561019557565b80518015159081612583575b50156101955761256890612d11565b90519060208110612577575090565b6020036101000a900490565b6021915011155f612559565b61259881612d3d565b15610195576125a681612d5d565b6125af816114c7565b916125bd6040519384610afd565b818352601f196125cc836114c7565b015f5b81811061264357505060206125ef9101516125e981612dbe565b90610c9c565b5f905b8282106125ff5750505090565b61263b8161260e600193612e24565b90612617610b20565b82815281602082015261262a86896114b3565b5261263585886114b3565b50610c9c565b9101906125f2565b60209061264e612508565b828288010152016125cf565b6021815103610195576020015160018101809111610c97575190565b80511561019557612689610b9e91612d11565b612695819392936123b4565b928360200190612eed565b5f9190825b81518410156126ce576126b884836114b3565b51518101809111610c97576001909301926126a5565b6126d99193506123b4565b5f9060205b8451831015612709576001906126f484876114b3565b518051602082018386015e51019201916126de565b509050610b9e919250612f8c565b8051604010156112715760600190565b908151811015611271570160200190565b805160018114908161283c575b501561277857610b9e602080926040519381859251918291018484015e81015f838201520301601f198101835282610afd565b8051603781116127a857806021916020604051946001830186526080830182870153018385015e82010160405290565b906021906128056128008460ff6fffffffffffffffffffffffffffffffff821160071b67ffffffffffffffff83821c1160061b1763ffffffff83821c1160051b1761ffff83821c1160041b17918260031c921c111790565b610c89565b92604051938360208284019460018601885260b7840182890153848460031b610100031b8389015201918601015e82010160405290565b905015611271576080602082015160f81c105f612745565b60ff601b9116019060ff8211610c9757565b6004111561029457565b905f5b825481101561217d5773ffffffffffffffffffffffffffffffffffffffff61289b82856120be565b90549060031b1c1673ffffffffffffffffffffffffffffffffffffffff83161461218457600101612873565b905f5b825181101561217d5773ffffffffffffffffffffffffffffffffffffffff6128f282856114b3565b511673ffffffffffffffffffffffffffffffffffffffff831614612184576001016128ca565b91906129248351610ca9565b908351151580612a31575b61293890612546565b6129456124498284611fad565b9381926001808416146129cf575b5f19869101935b848110612968575050505050565b836129c660016129bc600f6124ad6124e4611ce8611cc28b60029b6129b56129a8886124ad8f611ce8611cc26129a16124a49360011c90565b8099612727565b9b8d03809c5f1a92612727565b538c612727565b5f1a920189612727565b5301859061295a565b92507f0f00000000000000000000000000000000000000000000000000000000000000612a0e6124e4611ce8611cc2612a088760011c90565b86612727565b60f81b165f1a612a1d86611485565b535f19612a2983611e87565b939050612953565b508181111561292f565b915f915f612a47612508565b50845115612cd85790935f915b81518310156101955782158080612cc2575b61019557159081612ca5575b5061019557612a8461176283836114b3565b948551600281145f14612b815750612aa6612aa16116b588611485565b6130e1565b95612abc612ab588888461314e565b8092610c9c565b965111612b635715612af35750612ad39051611f37565b11610195575111612aea576116b5610b9e916113ef565b50610b9e612399565b919094612b008651611f37565b82146101955780612b22612b1e612b186001946113ef565b51612d3d565b1590565b15612b4457612b33612b39916113ef565b516130d3565b915b01919490612a54565b612b50612b5d916113ef565b5160208101519051902090565b91612b3b565b505091509250612b74915051611f37565b1161019557610b9e612399565b929491939192601103612c465781518314612c2857612bb2612bac6124e4611ce8611cc28787612727565b93610c89565b92601081101561019557612bcf612bc982896114b3565b516130bd565b15612bf15750505050612be491925051611f37565b0361019557610b9e612399565b86612c09612b1e612b1884600196989a97999b6114b3565b15612c1b57612b5d91612b33916114b3565b612b5d91612b50916114b3565b505050612c359051611f37565b03610195576116b5610b9e916114a2565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f696e76616c6964206e6f6465206c656e677468000000000000000000000000006044820152606490fd5b9050612cba612cb484846114b3565b51613086565b14155f612a72565b50612cd0612b5085856114b3565b871415612a66565b509050612d0992507f56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421915014612546565b610b9e612399565b906020820191612d218351612dbe565b925190838201809211610c975751928303928311610c97579190565b805115612d5857602060c0910151515f1a10610ffe57600190565b505f90565b805115612d58575f9060208101908151612d7681612dbe565b8101809111610c9757915190518101809111610c975791905b828110612d9c5750905090565b612da581612e24565b8101809111610c9757612db89091611e87565b90612d8f565b515f1a6080811015612dcf57505f90565b60b881108015612e0e575b15612de55750600190565b60c0811015612dff57610b9e906128009060b75b90611fad565b610b9e906128009060f7612df9565b5060c08110158015612dda575060f88110612dda565b80515f1a906080821015612e39575050600190565b60b8821015612e4f5750612800610b9e91611f72565b60c0821015612e905760010151602082900360b7016101000a9004017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff4a0190565b60f8821015612ea65750612800610b9e91611f45565b60010151602082900360f7016101000a9004017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0a0190565b601f8111610c97576101000a90565b90918015611e82575b6020811015612f305780612f0957505050565b612f1d612f18612f2292611f9f565b612ede565b611f37565b905182518216911916179052565b91908051825260208101809111610c97579060208101809111610c975791601f19810190811115612ef657610c5c565b612f6a81516123b4565b90815115612f8857806020610b9e9201519051908360200190612eed565b5090565b805190919060378111612fbe578060219160206040519560018301875260c0830182880153018386015e830101604052565b916021906130166128008560ff6fffffffffffffffffffffffffffffffff821160071b67ffffffffffffffff83821c1160061b1763ffffffff83821c1160051b1761ffff83821c1160041b17918260031c921c111790565b93604051948360208284019460018601895260f78401828a0153848460031b610100031b838a015201918701015e830101604052565b815191906041830361307c576130759250602082015190606060408401519301515f1a906131f2565b9192909190565b50505f9160029190565b8051602081101561309e575060208101519051902090565b9060200151206040516020810191825260208152612393604082610afd565b6001815103612d585760200151515f1a60801490565b6130dc90612d11565b902090565b9081511561019557600f6130fd6124a4611ce8611cc286611485565b16806131105750610b9e60025f93612918565b600181036131255750610b9e60015f93612918565b6002810361313b5750610b9e6002600193612918565b60030361019557610b9e60018093612918565b91905f5b838101808211610c975782518110806131e8575b156131e0576131967fff000000000000000000000000000000000000000000000000000000000000009184612727565b51167fff000000000000000000000000000000000000000000000000000000000000006131c38386612727565b511690036131d9576131d490611e87565b613152565b9250505090565b509250505090565b5083518210613166565b91907f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08411613281579160209360809260ff5f9560405194855216868401526040830152606082015282805260015afa15613276575f5173ffffffffffffffffffffffffffffffffffffffff81161561326c57905f905f90565b505f906001905f90565b6040513d5f823e3d90fd5b5050505f916003919056fea164736f6c634300081c000a2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d4c48d1d2b0f4f7485fc28e3db22341d96a20aa29e6efa8149da9751603abd4e06e0c24a6e293ff9b755263dbaa15ba3796b0b8d3fe17cfb4ddf8143b268eac47bd893629a699470e4ec82a5715bb4981fdaacc5d0a728bf5f55b801d8f4ef10bad3228b676f7d3cd4284a5443f17f1962b36e491b30a40b2405849e597ba5fb5"}} +{"abi":[{"type":"constructor","inputs":[{"name":"ibcRouter","type":"address","internalType":"address"},{"name":"initialTrustedHeight","type":"uint64","internalType":"uint64"},{"name":"initialTrustedTimestamp","type":"uint64","internalType":"uint64"},{"name":"initialTrustedStorageRoot","type":"bytes32","internalType":"bytes32"},{"name":"initialTrustedValidators","type":"address[]","internalType":"address[]"},{"name":"trustingPeriod","type":"uint64","internalType":"uint64"},{"name":"maxClockDrift","type":"uint64","internalType":"uint64"},{"name":"roleManager","type":"address","internalType":"address"}],"stateMutability":"nonpayable"},{"type":"function","name":"DEFAULT_ADMIN_ROLE","inputs":[],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"type":"function","name":"PROOF_SUBMITTER_ROLE","inputs":[],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"type":"function","name":"getClientState","inputs":[],"outputs":[{"name":"","type":"bytes","internalType":"bytes"}],"stateMutability":"view"},{"type":"function","name":"getConsensusState","inputs":[{"name":"revisionHeight","type":"uint64","internalType":"uint64"}],"outputs":[{"name":"","type":"bytes","internalType":"bytes"}],"stateMutability":"view"},{"type":"function","name":"getRoleAdmin","inputs":[{"name":"role","type":"bytes32","internalType":"bytes32"}],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"type":"function","name":"grantRole","inputs":[{"name":"role","type":"bytes32","internalType":"bytes32"},{"name":"account","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"hasRole","inputs":[{"name":"role","type":"bytes32","internalType":"bytes32"},{"name":"account","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"misbehaviour","inputs":[{"name":"","type":"bytes","internalType":"bytes"}],"outputs":[],"stateMutability":"view"},{"type":"function","name":"renounceRole","inputs":[{"name":"role","type":"bytes32","internalType":"bytes32"},{"name":"callerConfirmation","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"revokeRole","inputs":[{"name":"role","type":"bytes32","internalType":"bytes32"},{"name":"account","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"supportsInterface","inputs":[{"name":"interfaceId","type":"bytes4","internalType":"bytes4"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"updateClient","inputs":[{"name":"updateMsg","type":"bytes","internalType":"bytes"}],"outputs":[{"name":"","type":"uint8","internalType":"enum ILightClientMsgs.UpdateResult"}],"stateMutability":"nonpayable"},{"type":"function","name":"verifyMembership","inputs":[{"name":"msg_","type":"tuple","internalType":"struct ILightClientMsgs.MsgVerifyMembership","components":[{"name":"proof","type":"bytes","internalType":"bytes"},{"name":"proofHeight","type":"tuple","internalType":"struct IICS02ClientMsgs.Height","components":[{"name":"revisionNumber","type":"uint64","internalType":"uint64"},{"name":"revisionHeight","type":"uint64","internalType":"uint64"}]},{"name":"path","type":"bytes[]","internalType":"bytes[]"},{"name":"value","type":"bytes","internalType":"bytes"}]}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"verifyNonMembership","inputs":[{"name":"msg_","type":"tuple","internalType":"struct ILightClientMsgs.MsgVerifyNonMembership","components":[{"name":"proof","type":"bytes","internalType":"bytes"},{"name":"proofHeight","type":"tuple","internalType":"struct IICS02ClientMsgs.Height","components":[{"name":"revisionNumber","type":"uint64","internalType":"uint64"},{"name":"revisionHeight","type":"uint64","internalType":"uint64"}]},{"name":"path","type":"bytes[]","internalType":"bytes[]"}]}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"event","name":"RoleAdminChanged","inputs":[{"name":"role","type":"bytes32","indexed":true,"internalType":"bytes32"},{"name":"previousAdminRole","type":"bytes32","indexed":true,"internalType":"bytes32"},{"name":"newAdminRole","type":"bytes32","indexed":true,"internalType":"bytes32"}],"anonymous":false},{"type":"event","name":"RoleGranted","inputs":[{"name":"role","type":"bytes32","indexed":true,"internalType":"bytes32"},{"name":"account","type":"address","indexed":true,"internalType":"address"},{"name":"sender","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"type":"event","name":"RoleRevoked","inputs":[{"name":"role","type":"bytes32","indexed":true,"internalType":"bytes32"},{"name":"account","type":"address","indexed":true,"internalType":"address"},{"name":"sender","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"type":"error","name":"AccessControlBadConfirmation","inputs":[]},{"type":"error","name":"AccessControlUnauthorizedAccount","inputs":[{"name":"account","type":"address","internalType":"address"},{"name":"neededRole","type":"bytes32","internalType":"bytes32"}]},{"type":"error","name":"ConflictingConsensusState","inputs":[{"name":"revisionHeight","type":"uint64","internalType":"uint64"}]},{"type":"error","name":"ConsensusStateExpired","inputs":[{"name":"trustedTimestamp","type":"uint64","internalType":"uint64"},{"name":"currentTimestamp","type":"uint256","internalType":"uint256"},{"name":"trustingPeriod","type":"uint64","internalType":"uint64"}]},{"type":"error","name":"ConsensusStateNotFound","inputs":[{"name":"revisionHeight","type":"uint64","internalType":"uint64"}]},{"type":"error","name":"DuplicateCommitSealSigner","inputs":[{"name":"signer","type":"address","internalType":"address"}]},{"type":"error","name":"DuplicateValidator","inputs":[{"name":"validator","type":"address","internalType":"address"}]},{"type":"error","name":"EmptyValidatorSet","inputs":[]},{"type":"error","name":"HeaderFromFuture","inputs":[{"name":"currentTimestamp","type":"uint256","internalType":"uint256"},{"name":"headerTimestamp","type":"uint256","internalType":"uint256"},{"name":"maxClockDrift","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"InsufficientTrustedValidatorOverlap","inputs":[{"name":"actual","type":"uint256","internalType":"uint256"},{"name":"required","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"InsufficientValidatorQuorum","inputs":[{"name":"actual","type":"uint256","internalType":"uint256"},{"name":"required","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"InvalidCommitSeal","inputs":[]},{"type":"error","name":"InvalidCommitmentValue","inputs":[{"name":"expectedValue","type":"bytes32","internalType":"bytes32"},{"name":"actualValue","type":"bytes32","internalType":"bytes32"}]},{"type":"error","name":"InvalidDifficulty","inputs":[{"name":"actualDifficulty","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"InvalidECDSASignatureLength","inputs":[{"name":"length","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"InvalidExtraDataFormat","inputs":[{"name":"itemsLength","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"InvalidHeaderFormat","inputs":[{"name":"itemsLength","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"InvalidHeaderHeight","inputs":[]},{"type":"error","name":"InvalidHeaderTimestamp","inputs":[]},{"type":"error","name":"InvalidMixHash","inputs":[{"name":"actualMixHash","type":"bytes32","internalType":"bytes32"}]},{"type":"error","name":"InvalidNonce","inputs":[{"name":"actualNonce","type":"bytes","internalType":"bytes"}]},{"type":"error","name":"InvalidOmmersHash","inputs":[{"name":"actualOmmersHash","type":"bytes32","internalType":"bytes32"}]},{"type":"error","name":"InvalidPathLength","inputs":[{"name":"expectedLength","type":"uint256","internalType":"uint256"},{"name":"actualLength","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"InvalidRevisionNumber","inputs":[{"name":"providedRevisionNumber","type":"uint64","internalType":"uint64"}]},{"type":"error","name":"InvalidValidatorAddress","inputs":[{"name":"validator","type":"address","internalType":"address"}]},{"type":"error","name":"InvalidValidatorAddressLength","inputs":[{"name":"length","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"InvalidValueLength","inputs":[{"name":"expectedLength","type":"uint256","internalType":"uint256"},{"name":"actualLength","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"UnsupportedMisbehaviour","inputs":[]},{"type":"error","name":"ValueExists","inputs":[{"name":"actualValue","type":"bytes32","internalType":"bytes32"}]}],"bytecode":{"object":"0x6080604052346103d8576138eb80380380610019816103dc565b928339810190610100818303126103d85761003381610401565b9061004060208201610415565b9061004d60408201610415565b92606082015191608081015160018060401b0381116103d85781019286601f850112156103d8578351966001600160401b03881161037f578760051b9460206100978188016103dc565b809a81520190602082978201019283116103d857602001905b8282106103c0575050506100c660a08301610415565b956100df60e06100d860c08601610415565b9401610401565b956001600160401b03169081156103b1576001600160401b03169283156103a257885115610393575f5b89518110156101bf576001600160a01b03610124828c610429565b511615610198575f5b81811061013d5750600101610109565b6001600160a01b0361014f828d610429565b51166001600160a01b03610163848e610429565b5116146101725760010161012d565b6001600160a01b03610184838d610429565b511663107f863360e21b5f5260045260245ffd5b6001600160a01b03906101ab908b610429565b51166359bff38760e01b5f5260045260245ffd5b5060408051979896978a979181016001600160401b0381118282101761037f576040525f81526020810190848252604051926080840198848a1060018060401b038b111761037f576040998a526001600160a01b031680855260208086018490526001600160401b03928316868c01819052878416606090970196909652600180546001600160a01b031916909217825592516002805495516fffffffffffffffff0000000000000000908d1b81169285166001600160801b03199788161792909217815560038054988d1b90921697909516909517959095179093555f948552600490529590922080546001600160401b031916949094178455830191909155925193910191831161037f5768010000000000000000831161037f578154838355808410610359575b50905f5260205f205f5b83811061033c57846001600160a01b0381166103235750610312610547565b505b60405161328190816105ca8239f35b8061033061033692610451565b506104c7565b50610314565b82516001600160a01b0316818301556020909201916001016102f3565b825f528360205f2091820191015b81811061037457506102e9565b5f8155600101610367565b634e487b7160e01b5f52604160045260245ffd5b63339e1ffb60e01b5f5260045ffd5b63574f4e6160e01b5f5260045ffd5b6359d119e360e01b5f5260045ffd5b602080916103cd84610401565b8152019101906100b0565b5f80fd5b6040519190601f01601f191682016001600160401b0381118382101761037f57604052565b51906001600160a01b03821682036103d857565b51906001600160401b03821682036103d857565b805182101561043d5760209160051b010190565b634e487b7160e01b5f52603260045260245ffd5b6001600160a01b0381165f9081525f5160206138cb5f395f51905f52602052604090205460ff166104c2576001600160a01b03165f8181525f5160206138cb5f395f51905f5260205260408120805460ff191660011790553391905f51602061384b5f395f51905f528180a4600190565b505f90565b6001600160a01b0381165f9081525f51602061386b5f395f51905f52602052604090205460ff166104c2576001600160a01b03165f8181525f51602061386b5f395f51905f5260205260408120805460ff191660011790553391905f5160206138ab5f395f51905f52905f51602061384b5f395f51905f529080a4600190565b5f80525f51602061386b5f395f51905f526020525f51602061388b5f395f51905f525460ff166105c5575f8080525f51602061386b5f395f51905f526020525f51602061388b5f395f51905f52805460ff1916600117905533905f5160206138ab5f395f51905f525f51602061384b5f395f51905f528280a4600190565b5f9056fe60806040526004361015610011575f80fd5b5f3560e01c806301ffc9a7146100f45780630bece356146100ef578063248a9ca3146100ea5780632f2ff15d146100e557806336568abe146100e05780634d6d9ffb146100db5780635972185a146100d6578063682ed5f0146100d157806391d14854146100cc578063a217fddf146100c7578063d547741f146100c2578063ddba6537146100bd578063edce8bdc146100b85763ef913a4b146100b3575f80fd5b6109c8565b61095e565b61088b565b61085c565b610842565b6107f4565b6105e6565b6105ac565b6103ac565b610350565b61031a565b6102b5565b610217565b34610195576020600319360112610195576004357fffffffff00000000000000000000000000000000000000000000000000000000811680910361019557807f7965db0b000000000000000000000000000000000000000000000000000000006020921490811561016b575b506040519015158152f35b7f01ffc9a7000000000000000000000000000000000000000000000000000000009150145f610160565b5f80fd5b9060206003198301126101955760043567ffffffffffffffff811161019557826023820112156101955780600401359267ffffffffffffffff84116101955760248483010111610195576024019190565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b346101955761028161022836610199565b5f80527f4c48d1d2b0f4f7485fc28e3db22341d96a20aa29e6efa8149da9751603abd4e06020527f6e0c24a6e293ff9b755263dbaa15ba3796b0b8d3fe17cfb4ddf8143b268eac475490919060ff161561029957610d17565b6040516003821015610294576020918152f35b6101ea565b6102a1611275565b610d17565b90816020910312610195573590565b346101955760206003193601126101955760206102df6004355f525f602052600160405f20015490565b604051908152f35b6003196040910112610195576004359060243573ffffffffffffffffffffffffffffffffffffffff811681036101955790565b346101955761034e61032b366102e7565b90610349610344825f525f602052600160405f20015490565b6112fd565b612181565b005b346101955761035e366102e7565b3373ffffffffffffffffffffffffffffffffffffffff8216036103845761034e91612258565b7f6697b232000000000000000000000000000000000000000000000000000000005f5260045ffd5b346101955760206003193601126101955760043567ffffffffffffffff8111610195578060040160806003198336030112610195575f80527f4c48d1d2b0f4f7485fc28e3db22341d96a20aa29e6efa8149da9751603abd4e060205260ff7f6e0c24a6e293ff9b755263dbaa15ba3796b0b8d3fe17cfb4ddf8143b268eac4754161561059f575b61044761044260248401611133565b61136a565b60648201916001610458848461113d565b90500361056157906104a96104966104a261049d61049661049061048961048460446104e09a01611133565b611b0f565b988761113d565b9061120f565b3691610aff565b61232d565b92806111be565b906001840154906040516104d7816104c960208201948560209181520190565b03601f198101835282610aaf565b519020916123bb565b805161051f5761051b61050b6104fe845467ffffffffffffffff1690565b67ffffffffffffffff1690565b6040519081529081906020820190565b0390f35b61053361052e61055e92612500565b61252d565b7fd039601e000000000000000000000000000000000000000000000000000000005f52600452602490565b5ffd5b61055e61056e848461113d565b7f88b3170e000000000000000000000000000000000000000000000000000000005f52600160045260245250604490565b6105a7611275565b610433565b34610195575f6003193601126101955760206040517fbd893629a699470e4ec82a5715bb4981fdaacc5d0a728bf5f55b801d8f4ef10b8152f35b346101955760206003193601126101955760043567ffffffffffffffff8111610195578060040160a06003198336030112610195575f80527f4c48d1d2b0f4f7485fc28e3db22341d96a20aa29e6efa8149da9751603abd4e060205260ff7f6e0c24a6e293ff9b755263dbaa15ba3796b0b8d3fe17cfb4ddf8143b268eac475416156107e7575b61067c61044260248401611133565b6064820191600161068d848461113d565b90500361056157608481019060206106a583856111be565b9050036107a957906106f46104966106ed6106e56106de61049d6104966104906106d761048460446107149c01611133565b9b8b61113d565b94876111be565b8101906102a6565b94806111be565b906001850154906040516104d7816104c960208201948560209181520190565b8051156107755761052e61072791612500565b908082036107475761051b61050b6104fe855467ffffffffffffffff1690565b7f56ed1b63000000000000000000000000000000000000000000000000000000005f5260045260245260445ffd5b61055e827f56ed1b63000000000000000000000000000000000000000000000000000000005f52906044916004525f602452565b61055e6107b683856111be565b7f24fadac8000000000000000000000000000000000000000000000000000000005f52602060045260245250604490565b6107ef611275565b61066d565b3461019557602060ff610836610809366102e7565b905f525f845260405f209073ffffffffffffffffffffffffffffffffffffffff165f5260205260405f2090565b54166040519015158152f35b34610195575f6003193601126101955760206040515f8152f35b346101955761034e61086d366102e7565b90610886610344825f525f602052600160405f20015490565b612258565b346101955761089936610199565b50505f80527f4c48d1d2b0f4f7485fc28e3db22341d96a20aa29e6efa8149da9751603abd4e06020527f6e0c24a6e293ff9b755263dbaa15ba3796b0b8d3fe17cfb4ddf8143b268eac475460ff1615610915575b7f2c1ed462000000000000000000000000000000000000000000000000000000005f5260045ffd5b61091d611275565b6108ed565b67ffffffffffffffff81160361019557565b601f19601f602060409481855280519182918282880152018686015e5f8582860101520116010190565b346101955760206003193601126101955761051b61098160043561048481610922565b6109bc67ffffffffffffffff8254166104c9600184015493604051948593602085015260408401526060808401526002608084019101611228565b60405191829182610934565b34610195575f6003193601126101955761051b60405173ffffffffffffffffffffffffffffffffffffffff60015416602082015267ffffffffffffffff600254818116604084015260401c16606082015267ffffffffffffffff600354818116608084015260401c1660a082015260a081526109bc60c082610aaf565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b6060810190811067ffffffffffffffff821117610a8e57604052565b610a45565b6040810190811067ffffffffffffffff821117610a8e57604052565b90601f601f19910116810190811067ffffffffffffffff821117610a8e57604052565b60405190610ae1604083610aaf565b565b67ffffffffffffffff8111610a8e57601f01601f191660200190565b929192610b0b82610ae3565b91610b196040519384610aaf565b829481845281830111610195578281602093845f960137010152565b9080601f8301121561019557816020610b5093359101610aff565b90565b6020818303126101955780359067ffffffffffffffff8211610195570180820391608083126101955760405192610b8984610a72565b823567ffffffffffffffff811161019557604091610bac84601f19938701610b35565b8652011261019557604051610bc081610a93565b6020830135610bce81610922565b81526040830135610bde81610922565b60208201526020840152606082013567ffffffffffffffff811161019557610c069201610b35565b604082015290565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b9060018201809211610c4957565b610c0e565b91908201809211610c4957565b908160011b9180830460021490151715610c4957565b81519167ffffffffffffffff8311610a8e57680100000000000000008311610a8e578154838355808410610cf1575b506020610cb29101915f5260205f2090565b5f5b838110610cc15750505050565b6001906020610ce4855173ffffffffffffffffffffffffffffffffffffffff1690565b9401938184015501610cb4565b825f528360205f2091820191015b818110610d0c5750610ca0565b5f8155600101610cff565b610d2391810190610b53565b906020820191610d3f61044284515167ffffffffffffffff1690565b610d4981516115fb565b92604084019367ffffffffffffffff610d6a865167ffffffffffffffff1690565b161561110b576080810192610d8a6104fe855167ffffffffffffffff1690565b156110e3576003549267ffffffffffffffff604085901c16610dac8142610c4e565b865167ffffffffffffffff169081116110a45750505160200151610deb90610ddd9067ffffffffffffffff16611b0f565b9367ffffffffffffffff1690565b67ffffffffffffffff8116801515908161107b575b50611026575090610e6e91610e2f6002610e27610e1c85611b66565b60c086015190611c7b565b950185611e94565b610e3f60a0830194855190611fb9565b60406060610e6260015473ffffffffffffffffffffffffffffffffffffffff1690565b9301519101519161205c565b610e9b610e83865167ffffffffffffffff1690565b67ffffffffffffffff165f52600460205260405f2090565b610eb06104fe825467ffffffffffffffff1690565b610fb45750916002610f2e928694610f21610eec610edd610e83610f3c9a9b5167ffffffffffffffff1690565b955167ffffffffffffffff1690565b859067ffffffffffffffff167fffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000825416179055565b6001840155519101610c71565b5167ffffffffffffffff1690565b600254610f559060401c67ffffffffffffffff166104fe565b67ffffffffffffffff821611610f6a57505f90565b610fb0907fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff6fffffffffffffffff00000000000000006002549260401b16911617600255565b5f90565b91610fca610fd2945167ffffffffffffffff1690565b90519261210c565b6110205761055e610feb835167ffffffffffffffff1690565b7fc1aea5f7000000000000000000000000000000000000000000000000000000005f5267ffffffffffffffff16600452602490565b60029150565b61055e9061103c855467ffffffffffffffff1690565b7feae35725000000000000000000000000000000000000000000000000000000005f5267ffffffffffffffff9081166004524260245216604452606490565b905061109c42916110976104fe885467ffffffffffffffff1690565b610c4e565b11155f610e00565b7f9b772277000000000000000000000000000000000000000000000000000000005f524260045267ffffffffffffffff9081166024521660445260645ffd5b7f574f4e61000000000000000000000000000000000000000000000000000000005f5260045ffd5b7f59d119e3000000000000000000000000000000000000000000000000000000005f5260045ffd5b35610b5081610922565b9035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe181360301821215610195570180359067ffffffffffffffff821161019557602001918160051b3603831361019557565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b9035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe181360301821215610195570180359067ffffffffffffffff82116101955760200191813603831361019557565b9015611223578061121f916111be565b9091565b611191565b90602082549182815201915f5260205f20905f5b8181106112495750505090565b825473ffffffffffffffffffffffffffffffffffffffff1684526020909301926001928301920161123c565b335f9081527f4c48d1d2b0f4f7485fc28e3db22341d96a20aa29e6efa8149da9751603abd4e0602052604090205460ff16156112ad57565b7fe2517d3f000000000000000000000000000000000000000000000000000000005f52336004527fbd893629a699470e4ec82a5715bb4981fdaacc5d0a728bf5f55b801d8f4ef10b60245260445ffd5b805f525f60205260ff6113313360405f209073ffffffffffffffffffffffffffffffffffffffff165f5260205260405f2090565b54161561133b5750565b7fe2517d3f000000000000000000000000000000000000000000000000000000005f523360045260245260445ffd5b67ffffffffffffffff168061137c5750565b7f3ce598a9000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b6040519060e0820182811067ffffffffffffffff821117610a8e57604052606060c0838281528260208201525f60408201525f838201525f60808201528260a08201520152565b8051600110156112235760400190565b805160071015611223576101000190565b8051600d1015611223576101c00190565b8051600e1015611223576101e00190565b805160081015611223576101200190565b8051600310156112235760800190565b8051600b1015611223576101800190565b8051600c1015611223576101a00190565b8051600410156112235760a00190565b8051156112235760200190565b8051600210156112235760600190565b805160101015611223576102200190565b80518210156112235760209160051b010190565b67ffffffffffffffff8111610a8e5760051b60200190565b906114e8826114c6565b6114f56040519182610aaf565b828152601f1961150582946114c6565b0190602036910137565b90602082519201517fffffffffffffffffffffffffffffffffffffffff00000000000000000000000081169260148110611547575050565b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000929350829060140360031b1b161690565b60405160a0919061158a8382610aaf565b6004815291601f1901825f5b8281106115a257505050565b806060602080938501015201611596565b906115bd826114c6565b6115ca6040519182610aaf565b828152601f196115da82946114c6565b01905f5b8281106115ea57505050565b8060606020809385010152016115de565b61161461160f6116096113a7565b92612500565b61256f565b80825251600f8110611ae457507f1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d4934761165561164f83516113ee565b5161263a565b03611aa957600161166f61166983516113fe565b5161252d565b03611a6e577f63746963616c2062797a616e74696e65206661756c7420746f6c6572616e63656116a261164f835161140f565b03611a33576116ba6116b48251611420565b51612656565b80516008811490811591611a03575b506119c957506116f36116e26104fe6116698451611431565b67ffffffffffffffff166040830152565b61170061164f8251611442565b60608201526117296117186104fe6116698451611452565b67ffffffffffffffff166080830152565b61174161160f61173c6116b48451611463565b612500565b906020810191808352516005810361199e575061176761176183516113ee565b5161256f565b908151156119765761177982516114de565b9360a082019485525f5b8351811015611912576117996116b482866114b2565b8051601481036118e757506117b06117b69161150f565b60601c90565b73ffffffffffffffffffffffffffffffffffffffff811680156118a5575f5b8381106118115750509061180b6001926117f0838a516114b2565b9073ffffffffffffffffffffffffffffffffffffffff169052565b01611783565b8161185661183d611823848d516114b2565b5173ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff1690565b14611863576001016117d5565b7f41fe18cc000000000000000000000000000000000000000000000000000000005f5273ffffffffffffffffffffffffffffffffffffffff831660045260245ffd5b7f59bff387000000000000000000000000000000000000000000000000000000005f5273ffffffffffffffffffffffffffffffffffffffff821660045260245ffd5b7f83e46ad2000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b5092611761919450611925925051611474565b61192f81516115b3565b9260c081019384525f5b82518110156119705780611969816119566116b4600195886114b2565b88519061196383836114b2565b526114b2565b5001611939565b50925050565b7f339e1ffb000000000000000000000000000000000000000000000000000000005f5260045ffd5b7f30c6792a000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b6119ff906040519182917fd5edd2a500000000000000000000000000000000000000000000000000000000835260048301610934565b0390fd5b7f011b4d03dd8c01f1049143cf9c4c817e4b167f1d1b83e5c6f0f10d89ba1e7bce9150602083012014155f6116c9565b611a4361164f61055e925161140f565b7fa19e609c000000000000000000000000000000000000000000000000000000005f52600452602490565b611a7e61166961055e92516113fe565b7ff71b722f000000000000000000000000000000000000000000000000000000005f52600452602490565b611ab961164f61055e92516113ee565b7fb8120dca000000000000000000000000000000000000000000000000000000005f52600452602490565b7fbc277732000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b67ffffffffffffffff1690815f52600460205260405f209167ffffffffffffffff83541615611b3b5750565b7ff761631b000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b611c03611b71611579565b611bea611b8860208501611b8e611b888251611484565b51612f48565b611b9785611484565b52611ba184611484565b50611baf611b8882516113ee565b611bb8856113ee565b52611bc2846113ee565b50611bd0611b888251611491565b611bd985611491565b52611be384611491565b5051611442565b611bf382611442565b52611bfd81611442565b50612680565b611c0e8251516115b3565b905f5b83518051821015611c64579080600192600c82145f14611c52575050611c3683612718565b611c4082866114b2565b52611c4b81856114b2565b5001611c11565b611c5f91611b88916114b2565b611c36565b505050611c719150612680565b6020815191012090565b919091611c8883516114de565b925f5b8151811015611e8157611c9e81836114b2565b51805160418103611e56575080601b60ff611ced611ce7611cc1611cfa966126f7565b517fff000000000000000000000000000000000000000000000000000000000000001690565b60f81c90565b1610611e03575b84613034565b90611d0481612846565b1590811591611df9575b508015611ddb575b611db35773ffffffffffffffffffffffffffffffffffffffff81165f5b838110611d5357505090611d4d6001926117f083896114b2565b01611c8b565b81611d6461183d611823848c6114b2565b14611d7157600101611d33565b7f33af0d5f000000000000000000000000000000000000000000000000000000005f5273ffffffffffffffffffffffffffffffffffffffff831660045260245ffd5b7f09cb44e6000000000000000000000000000000000000000000000000000000005f5260045ffd5b5073ffffffffffffffffffffffffffffffffffffffff811615611d16565b905015155f611d0e565b611e45611e1d611e18611ce7611cc1856126f7565b612834565b60f81b7fff000000000000000000000000000000000000000000000000000000000000001690565b5f1a611e50826126f7565b53611cf4565b7ff2db9ce1000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b505050565b5f198114610c495760010190565b905f915f5b8151811015611eed57611ecc73ffffffffffffffffffffffffffffffffffffffff611ec483856114b2565b511684612850565b611ed9575b600101611e99565b92611ee5600191611e86565b939050611ed1565b50506003611efc915404610c3b565b90818110611f08575050565b7fe2dcb1b9000000000000000000000000000000000000000000000000000000005f5260045260245260445ffd5b905f198201918211610c4957565b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff408201918211610c4957565b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff808201918211610c4957565b6020039060208211610c4957565b91908203918211610c4957565b905f915f5b815181101561201257611ff173ffffffffffffffffffffffffffffffffffffffff611fe983856114b2565b5116846128af565b611ffe575b600101611fbe565b9261200a600191611e86565b939050611ff6565b50505190600382048203918211610c495781811061202e575050565b7f7818f4e4000000000000000000000000000000000000000000000000000000005f5260045260245260445ffd5b6120a69261160f9261173c926040517fffffffffffffffffffffffffffffffffffffffff000000000000000000000000602082019260601b168252601481526104d7603482610aaf565b805160021015611223576060610b5091015161263a565b60206040818301928281528451809452019201905f5b8181106120e05750505090565b825173ffffffffffffffffffffffffffffffffffffffff168452602093840193909201916001016120d3565b919067ffffffffffffffff8084541691161490811591612172575b5061216c5760405161214c816104c96020820194602086526002604084019101611228565b51902090604051612165816104c96020820194856120bd565b5190201490565b50505f90565b9050600182015414155f612127565b805f525f60205260ff6121b58360405f209073ffffffffffffffffffffffffffffffffffffffff165f5260205260405f2090565b541661216c57805f525f6020526121ed8260405f209073ffffffffffffffffffffffffffffffffffffffff165f5260205260405f2090565b60017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0082541617905573ffffffffffffffffffffffffffffffffffffffff339216907f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d5f80a4600190565b805f525f60205260ff61228c8360405f209073ffffffffffffffffffffffffffffffffffffffff165f5260205260405f2090565b54161561216c57805f525f6020526122c58260405f209073ffffffffffffffffffffffffffffffffffffffff165f5260205260405f2090565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00815416905573ffffffffffffffffffffffffffffffffffffffff339216907ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b5f80a4600190565b60208151910120604051602081019182527f1260944489272988d9df285149b5aa1b0f48f2136d6f416159f840a3e0747600604082015260408152612373606082610aaf565b51902090565b60405190612388602083610aaf565b5f808352366020840137565b9061239e82610ae3565b6123ab6040519182610aaf565b828152601f196115058294610ae3565b61160f6123fd919493946123cf6020610ae3565b956123dd6040519788610aaf565b602087526123eb6020610ae3565b601f1960208901910136823752612500565b906124088451610c5b565b9184511515806124e0575b61241c90612526565b61242e6124295f85611fac565b612394565b925f19015f5b818110612448575050610b50939450612a23565b806124ca600f61248d6124c4611ce7611cc18d61246760029960011c90565b908d6124be8a6124b68a61248d612484611ce7611cc18a8a612707565b60041c600f1690565b1660f81b7fff000000000000000000000000000000000000000000000000000000000000001690565b5f1a92612707565b53612707565b60ff1690565b5f1a6124d96001830188612707565b5301612434565b506001612413565b604051906124f582610a93565b5f6020838281520152565b6125086124e8565b5060208151916040519261251b84610a93565b835201602082015290565b1561019557565b80518015159081612563575b50156101955761254890612cf9565b90519060208110612557575090565b6020036101000a900490565b6021915011155f612539565b61257881612d25565b156101955761258681612d45565b61258f816114c6565b9161259d6040519384610aaf565b818352601f196125ac836114c6565b015f5b81811061262357505060206125cf9101516125c981612da6565b90610c4e565b5f905b8282106125df5750505090565b61261b816125ee600193612e0c565b906125f7610ad2565b82815281602082015261260a86896114b2565b5261261585886114b2565b50610c4e565b9101906125d2565b60209061262e6124e8565b828288010152016125af565b6021815103610195576020015160018101809111610c49575190565b80511561019557612669610b5091612cf9565b61267581939293612394565b928360200190612ed5565b5f9190825b81518410156126ae5761269884836114b2565b51518101809111610c4957600190930192612685565b6126b9919350612394565b5f9060205b84518310156126e9576001906126d484876114b2565b518051602082018386015e51019201916126be565b509050610b50919250612f74565b8051604010156112235760600190565b908151811015611223570160200190565b805160018114908161281c575b501561275857610b50602080926040519381859251918291018484015e81015f838201520301601f198101835282610aaf565b80516037811161278857806021916020604051946001830186526080830182870153018385015e82010160405290565b906021906127e56127e08460ff6fffffffffffffffffffffffffffffffff821160071b67ffffffffffffffff83821c1160061b1763ffffffff83821c1160051b1761ffff83821c1160041b17918260031c921c111790565b610c3b565b92604051938360208284019460018601885260b7840182890153848460031b610100031b8389015201918601015e82010160405290565b905015611223576080602082015160f81c105f612725565b60ff601b9116019060ff8211610c4957565b6004111561029457565b905f5b82548110156128a857825f5273ffffffffffffffffffffffffffffffffffffffff8160205f2001541673ffffffffffffffffffffffffffffffffffffffff8316146128a057600101612853565b505050600190565b5050505f90565b905f5b82518110156128a85773ffffffffffffffffffffffffffffffffffffffff6128da82856114b2565b511673ffffffffffffffffffffffffffffffffffffffff8316146128a0576001016128b2565b919061290c8351610c5b565b908351151580612a19575b61292090612526565b61292d6124298284611fac565b9381926001808416146129b7575b5f19869101935b848110612950575050505050565b836129ae60016129a4600f61248d6124c4611ce7611cc18b60029b61299d6129908861248d8f611ce7611cc16129896124849360011c90565b8099612707565b9b8d03809c5f1a92612707565b538c612707565b5f1a920189612707565b53018590612942565b92507f0f000000000000000000000000000000000000000000000000000000000000006129f66124c4611ce7611cc16129f08760011c90565b86612707565b60f81b165f1a612a0586611484565b535f19612a1183611e86565b93905061293b565b5081811115612917565b915f915f612a2f6124e8565b50845115612cc05790935f915b81518310156101955782158080612caa575b61019557159081612c8d575b5061019557612a6c61176183836114b2565b948551600281145f14612b695750612a8e612a896116b488611484565b6130c9565b95612aa4612a9d888884613136565b8092610c4e565b965111612b4b5715612adb5750612abb9051611f36565b11610195575111612ad2576116b4610b50916113ee565b50610b50612379565b919094612ae88651611f36565b82146101955780612b0a612b06612b006001946113ee565b51612d25565b1590565b15612b2c57612b1b612b21916113ee565b516130bb565b915b01919490612a3c565b612b38612b45916113ee565b5160208101519051902090565b91612b23565b505091509250612b5c915051611f36565b1161019557610b50612379565b929491939192601103612c2e5781518314612c1057612b9a612b946124c4611ce7611cc18787612707565b93610c3b565b92601081101561019557612bb7612bb182896114b2565b516130a5565b15612bd95750505050612bcc91925051611f36565b0361019557610b50612379565b86612bf1612b06612b0084600196989a97999b6114b2565b15612c0357612b4591612b1b916114b2565b612b4591612b38916114b2565b505050612c1d9051611f36565b03610195576116b4610b50916114a1565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f696e76616c6964206e6f6465206c656e677468000000000000000000000000006044820152606490fd5b9050612ca2612c9c84846114b2565b5161306e565b14155f612a5a565b50612cb8612b3885856114b2565b871415612a4e565b509050612cf192507f56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421915014612526565b610b50612379565b906020820191612d098351612da6565b925190838201809211610c495751928303928311610c49579190565b805115612d4057602060c0910151515f1a10610fb057600190565b505f90565b805115612d40575f9060208101908151612d5e81612da6565b8101809111610c4957915190518101809111610c495791905b828110612d845750905090565b612d8d81612e0c565b8101809111610c4957612da09091611e86565b90612d77565b515f1a6080811015612db757505f90565b60b881108015612df6575b15612dcd5750600190565b60c0811015612de757610b50906127e09060b75b90611fac565b610b50906127e09060f7612de1565b5060c08110158015612dc2575060f88110612dc2565b80515f1a906080821015612e21575050600190565b60b8821015612e3757506127e0610b5091611f71565b60c0821015612e785760010151602082900360b7016101000a9004017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff4a0190565b60f8821015612e8e57506127e0610b5091611f44565b60010151602082900360f7016101000a9004017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0a0190565b601f8111610c49576101000a90565b90918015611e81575b6020811015612f185780612ef157505050565b612f05612f00612f0a92611f9e565b612ec6565b611f36565b905182518216911916179052565b91908051825260208101809111610c49579060208101809111610c495791601f19810190811115612ede57610c0e565b612f528151612394565b90815115612f7057806020610b509201519051908360200190612ed5565b5090565b805190919060378111612fa6578060219160206040519560018301875260c0830182880153018386015e830101604052565b91602190612ffe6127e08560ff6fffffffffffffffffffffffffffffffff821160071b67ffffffffffffffff83821c1160061b1763ffffffff83821c1160051b1761ffff83821c1160041b17918260031c921c111790565b93604051948360208284019460018601895260f78401828a0153848460031b610100031b838a015201918701015e830101604052565b81519190604183036130645761305d9250602082015190606060408401519301515f1a906131da565b9192909190565b50505f9160029190565b80516020811015613086575060208101519051902090565b9060200151206040516020810191825260208152612373604082610aaf565b6001815103612d405760200151515f1a60801490565b6130c490612cf9565b902090565b9081511561019557600f6130e5612484611ce7611cc186611484565b16806130f85750610b5060025f93612900565b6001810361310d5750610b5060015f93612900565b600281036131235750610b506002600193612900565b60030361019557610b5060018093612900565b91905f5b838101808211610c495782518110806131d0575b156131c85761317e7fff000000000000000000000000000000000000000000000000000000000000009184612707565b51167fff000000000000000000000000000000000000000000000000000000000000006131ab8386612707565b511690036131c1576131bc90611e86565b61313a565b9250505090565b509250505090565b508351821061314e565b91907f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08411613269579160209360809260ff5f9560405194855216868401526040830152606082015282805260015afa1561325e575f5173ffffffffffffffffffffffffffffffffffffffff81161561325457905f905f90565b505f906001905f90565b6040513d5f823e3d90fd5b5050505f916003919056fea164736f6c634300081c000a2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d4c48d1d2b0f4f7485fc28e3db22341d96a20aa29e6efa8149da9751603abd4e06e0c24a6e293ff9b755263dbaa15ba3796b0b8d3fe17cfb4ddf8143b268eac47bd893629a699470e4ec82a5715bb4981fdaacc5d0a728bf5f55b801d8f4ef10bad3228b676f7d3cd4284a5443f17f1962b36e491b30a40b2405849e597ba5fb5"}} diff --git a/ibc-solidity/abi/bytecode/BesuQBFTLightClient.json b/ibc-solidity/abi/bytecode/BesuQBFTLightClient.json index 7f1556ff9..3b9952f83 100644 --- a/ibc-solidity/abi/bytecode/BesuQBFTLightClient.json +++ b/ibc-solidity/abi/bytecode/BesuQBFTLightClient.json @@ -1 +1 @@ -{"abi":[{"type":"constructor","inputs":[{"name":"ibcRouter","type":"address","internalType":"address"},{"name":"initialTrustedHeight","type":"uint64","internalType":"uint64"},{"name":"initialTrustedTimestamp","type":"uint64","internalType":"uint64"},{"name":"initialTrustedStorageRoot","type":"bytes32","internalType":"bytes32"},{"name":"initialTrustedValidators","type":"address[]","internalType":"address[]"},{"name":"trustingPeriod","type":"uint64","internalType":"uint64"},{"name":"maxClockDrift","type":"uint64","internalType":"uint64"},{"name":"roleManager","type":"address","internalType":"address"}],"stateMutability":"nonpayable"},{"type":"function","name":"DEFAULT_ADMIN_ROLE","inputs":[],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"type":"function","name":"PROOF_SUBMITTER_ROLE","inputs":[],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"type":"function","name":"getClientState","inputs":[],"outputs":[{"name":"","type":"bytes","internalType":"bytes"}],"stateMutability":"view"},{"type":"function","name":"getConsensusState","inputs":[{"name":"revisionHeight","type":"uint64","internalType":"uint64"}],"outputs":[{"name":"","type":"bytes","internalType":"bytes"}],"stateMutability":"view"},{"type":"function","name":"getRoleAdmin","inputs":[{"name":"role","type":"bytes32","internalType":"bytes32"}],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"type":"function","name":"grantRole","inputs":[{"name":"role","type":"bytes32","internalType":"bytes32"},{"name":"account","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"hasRole","inputs":[{"name":"role","type":"bytes32","internalType":"bytes32"},{"name":"account","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"misbehaviour","inputs":[{"name":"","type":"bytes","internalType":"bytes"}],"outputs":[],"stateMutability":"view"},{"type":"function","name":"renounceRole","inputs":[{"name":"role","type":"bytes32","internalType":"bytes32"},{"name":"callerConfirmation","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"revokeRole","inputs":[{"name":"role","type":"bytes32","internalType":"bytes32"},{"name":"account","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"supportsInterface","inputs":[{"name":"interfaceId","type":"bytes4","internalType":"bytes4"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"updateClient","inputs":[{"name":"updateMsg","type":"bytes","internalType":"bytes"}],"outputs":[{"name":"","type":"uint8","internalType":"enum ILightClientMsgs.UpdateResult"}],"stateMutability":"nonpayable"},{"type":"function","name":"verifyMembership","inputs":[{"name":"msg_","type":"tuple","internalType":"struct ILightClientMsgs.MsgVerifyMembership","components":[{"name":"proof","type":"bytes","internalType":"bytes"},{"name":"proofHeight","type":"tuple","internalType":"struct IICS02ClientMsgs.Height","components":[{"name":"revisionNumber","type":"uint64","internalType":"uint64"},{"name":"revisionHeight","type":"uint64","internalType":"uint64"}]},{"name":"path","type":"bytes[]","internalType":"bytes[]"},{"name":"value","type":"bytes","internalType":"bytes"}]}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"verifyNonMembership","inputs":[{"name":"msg_","type":"tuple","internalType":"struct ILightClientMsgs.MsgVerifyNonMembership","components":[{"name":"proof","type":"bytes","internalType":"bytes"},{"name":"proofHeight","type":"tuple","internalType":"struct IICS02ClientMsgs.Height","components":[{"name":"revisionNumber","type":"uint64","internalType":"uint64"},{"name":"revisionHeight","type":"uint64","internalType":"uint64"}]},{"name":"path","type":"bytes[]","internalType":"bytes[]"}]}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"event","name":"RoleAdminChanged","inputs":[{"name":"role","type":"bytes32","indexed":true,"internalType":"bytes32"},{"name":"previousAdminRole","type":"bytes32","indexed":true,"internalType":"bytes32"},{"name":"newAdminRole","type":"bytes32","indexed":true,"internalType":"bytes32"}],"anonymous":false},{"type":"event","name":"RoleGranted","inputs":[{"name":"role","type":"bytes32","indexed":true,"internalType":"bytes32"},{"name":"account","type":"address","indexed":true,"internalType":"address"},{"name":"sender","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"type":"event","name":"RoleRevoked","inputs":[{"name":"role","type":"bytes32","indexed":true,"internalType":"bytes32"},{"name":"account","type":"address","indexed":true,"internalType":"address"},{"name":"sender","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"type":"error","name":"AccessControlBadConfirmation","inputs":[]},{"type":"error","name":"AccessControlUnauthorizedAccount","inputs":[{"name":"account","type":"address","internalType":"address"},{"name":"neededRole","type":"bytes32","internalType":"bytes32"}]},{"type":"error","name":"ConflictingConsensusState","inputs":[{"name":"revisionHeight","type":"uint64","internalType":"uint64"}]},{"type":"error","name":"ConsensusStateExpired","inputs":[{"name":"trustedTimestamp","type":"uint64","internalType":"uint64"},{"name":"currentTimestamp","type":"uint256","internalType":"uint256"},{"name":"trustingPeriod","type":"uint64","internalType":"uint64"}]},{"type":"error","name":"ConsensusStateNotFound","inputs":[{"name":"revisionHeight","type":"uint64","internalType":"uint64"}]},{"type":"error","name":"DuplicateCommitSealSigner","inputs":[{"name":"signer","type":"address","internalType":"address"}]},{"type":"error","name":"DuplicateValidator","inputs":[{"name":"validator","type":"address","internalType":"address"}]},{"type":"error","name":"EmptyValidatorSet","inputs":[]},{"type":"error","name":"HeaderFromFuture","inputs":[{"name":"currentTimestamp","type":"uint256","internalType":"uint256"},{"name":"headerTimestamp","type":"uint256","internalType":"uint256"},{"name":"maxClockDrift","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"InsufficientTrustedValidatorOverlap","inputs":[{"name":"actual","type":"uint256","internalType":"uint256"},{"name":"required","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"InsufficientValidatorQuorum","inputs":[{"name":"actual","type":"uint256","internalType":"uint256"},{"name":"required","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"InvalidCommitSeal","inputs":[]},{"type":"error","name":"InvalidCommitmentValue","inputs":[{"name":"expectedValue","type":"bytes32","internalType":"bytes32"},{"name":"actualValue","type":"bytes32","internalType":"bytes32"}]},{"type":"error","name":"InvalidDifficulty","inputs":[{"name":"actualDifficulty","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"InvalidECDSASignatureLength","inputs":[{"name":"length","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"InvalidExtraDataFormat","inputs":[{"name":"itemsLength","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"InvalidHeaderFormat","inputs":[{"name":"itemsLength","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"InvalidHeaderHeight","inputs":[]},{"type":"error","name":"InvalidHeaderTimestamp","inputs":[]},{"type":"error","name":"InvalidMixHash","inputs":[{"name":"actualMixHash","type":"bytes32","internalType":"bytes32"}]},{"type":"error","name":"InvalidNonce","inputs":[{"name":"actualNonce","type":"bytes","internalType":"bytes"}]},{"type":"error","name":"InvalidOmmersHash","inputs":[{"name":"actualOmmersHash","type":"bytes32","internalType":"bytes32"}]},{"type":"error","name":"InvalidPathLength","inputs":[{"name":"expectedLength","type":"uint256","internalType":"uint256"},{"name":"actualLength","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"InvalidRevisionNumber","inputs":[{"name":"providedRevisionNumber","type":"uint64","internalType":"uint64"}]},{"type":"error","name":"InvalidValidatorAddress","inputs":[{"name":"validator","type":"address","internalType":"address"}]},{"type":"error","name":"InvalidValidatorAddressLength","inputs":[{"name":"length","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"InvalidValueLength","inputs":[{"name":"expectedLength","type":"uint256","internalType":"uint256"},{"name":"actualLength","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"UnsupportedMisbehaviour","inputs":[]},{"type":"error","name":"ValueExists","inputs":[{"name":"actualValue","type":"bytes32","internalType":"bytes32"}]}],"bytecode":{"object":"0x6080604052346103d85761395a80380380610019816103dc565b928339810190610100818303126103d85761003381610401565b9061004060208201610415565b9061004d60408201610415565b92606082015191608081015160018060401b0381116103d85781019286601f850112156103d8578351966001600160401b03881161037f578760051b9460206100978188016103dc565b809a81520190602082978201019283116103d857602001905b8282106103c0575050506100c660a08301610415565b956100df60e06100d860c08601610415565b9401610401565b956001600160401b03169081156103b1576001600160401b03169283156103a257885115610393575f5b89518110156101bf576001600160a01b03610124828c610429565b511615610198575f5b81811061013d5750600101610109565b6001600160a01b0361014f828d610429565b51166001600160a01b03610163848e610429565b5116146101725760010161012d565b6001600160a01b03610184838d610429565b511663107f863360e21b5f5260045260245ffd5b6001600160a01b03906101ab908b610429565b51166359bff38760e01b5f5260045260245ffd5b5060408051979896978a979181016001600160401b0381118282101761037f576040525f81526020810190848252604051926080840198848a1060018060401b038b111761037f576040998a526001600160a01b031680855260208086018490526001600160401b03928316868c01819052878416606090970196909652600180546001600160a01b031916909217825592516002805495516fffffffffffffffff0000000000000000908d1b81169285166001600160801b03199788161792909217815560038054988d1b90921697909516909517959095179093555f948552600490529590922080546001600160401b031916949094178455830191909155925193910191831161037f5768010000000000000000831161037f578154838355808410610359575b50905f5260205f205f5b83811061033c57846001600160a01b0381166103235750610312610547565b505b6040516132f090816105ca8239f35b8061033061033692610451565b506104c7565b50610314565b82516001600160a01b0316818301556020909201916001016102f3565b825f528360205f2091820191015b81811061037457506102e9565b5f8155600101610367565b634e487b7160e01b5f52604160045260245ffd5b63339e1ffb60e01b5f5260045ffd5b63574f4e6160e01b5f5260045ffd5b6359d119e360e01b5f5260045ffd5b602080916103cd84610401565b8152019101906100b0565b5f80fd5b6040519190601f01601f191682016001600160401b0381118382101761037f57604052565b51906001600160a01b03821682036103d857565b51906001600160401b03821682036103d857565b805182101561043d5760209160051b010190565b634e487b7160e01b5f52603260045260245ffd5b6001600160a01b0381165f9081525f51602061393a5f395f51905f52602052604090205460ff166104c2576001600160a01b03165f8181525f51602061393a5f395f51905f5260205260408120805460ff191660011790553391905f5160206138ba5f395f51905f528180a4600190565b505f90565b6001600160a01b0381165f9081525f5160206138da5f395f51905f52602052604090205460ff166104c2576001600160a01b03165f8181525f5160206138da5f395f51905f5260205260408120805460ff191660011790553391905f51602061391a5f395f51905f52905f5160206138ba5f395f51905f529080a4600190565b5f80525f5160206138da5f395f51905f526020525f5160206138fa5f395f51905f525460ff166105c5575f8080525f5160206138da5f395f51905f526020525f5160206138fa5f395f51905f52805460ff1916600117905533905f51602061391a5f395f51905f525f5160206138ba5f395f51905f528280a4600190565b5f9056fe60806040526004361015610011575f80fd5b5f3560e01c806301ffc9a7146100f45780630bece356146100ef578063248a9ca3146100ea5780632f2ff15d146100e557806336568abe146100e05780634d6d9ffb146100db5780635972185a146100d6578063682ed5f0146100d157806391d14854146100cc578063a217fddf146100c7578063d547741f146100c2578063ddba6537146100bd578063edce8bdc146100b85763ef913a4b146100b3575f80fd5b610a16565b61095e565b61088b565b61085c565b610842565b6107f4565b6105e6565b6105ac565b6103ac565b610350565b61031a565b6102b5565b610217565b34610195576020600319360112610195576004357fffffffff00000000000000000000000000000000000000000000000000000000811680910361019557807f7965db0b000000000000000000000000000000000000000000000000000000006020921490811561016b575b506040519015158152f35b7f01ffc9a7000000000000000000000000000000000000000000000000000000009150145f610160565b5f80fd5b9060206003198301126101955760043567ffffffffffffffff811161019557826023820112156101955780600401359267ffffffffffffffff84116101955760248483010111610195576024019190565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b346101955761028161022836610199565b5f80527f4c48d1d2b0f4f7485fc28e3db22341d96a20aa29e6efa8149da9751603abd4e06020527f6e0c24a6e293ff9b755263dbaa15ba3796b0b8d3fe17cfb4ddf8143b268eac475490919060ff161561029957610d65565b6040516003821015610294576020918152f35b6101ea565b6102a1611276565b610d65565b90816020910312610195573590565b346101955760206003193601126101955760206102df6004355f525f602052600160405f20015490565b604051908152f35b6003196040910112610195576004359060243573ffffffffffffffffffffffffffffffffffffffff811681036101955790565b346101955761034e61032b366102e7565b90610349610344825f525f602052600160405f20015490565b6112fe565b6121f8565b005b346101955761035e366102e7565b3373ffffffffffffffffffffffffffffffffffffffff8216036103845761034e916122cf565b7f6697b232000000000000000000000000000000000000000000000000000000005f5260045ffd5b346101955760206003193601126101955760043567ffffffffffffffff8111610195578060040160806003198336030112610195575f80527f4c48d1d2b0f4f7485fc28e3db22341d96a20aa29e6efa8149da9751603abd4e060205260ff7f6e0c24a6e293ff9b755263dbaa15ba3796b0b8d3fe17cfb4ddf8143b268eac4754161561059f575b61044761044260248401611181565b61136b565b60648201916001610458848461118b565b90500361056157906104a96104966104a261049d61049661049061048961048460446104e09a01611181565b611b10565b988761118b565b9061125d565b3691610b4d565b6123a4565b928061120c565b906001840154906040516104d7816104c960208201948560209181520190565b03601f198101835282610afd565b51902091612432565b805161051f5761051b61050b6104fe845467ffffffffffffffff1690565b67ffffffffffffffff1690565b6040519081529081906020820190565b0390f35b61053361052e61055e92612577565b6125a4565b7fd039601e000000000000000000000000000000000000000000000000000000005f52600452602490565b5ffd5b61055e61056e848461118b565b7f88b3170e000000000000000000000000000000000000000000000000000000005f52600160045260245250604490565b6105a7611276565b610433565b34610195575f6003193601126101955760206040517fbd893629a699470e4ec82a5715bb4981fdaacc5d0a728bf5f55b801d8f4ef10b8152f35b346101955760206003193601126101955760043567ffffffffffffffff8111610195578060040160a06003198336030112610195575f80527f4c48d1d2b0f4f7485fc28e3db22341d96a20aa29e6efa8149da9751603abd4e060205260ff7f6e0c24a6e293ff9b755263dbaa15ba3796b0b8d3fe17cfb4ddf8143b268eac475416156107e7575b61067c61044260248401611181565b6064820191600161068d848461118b565b90500361056157608481019060206106a5838561120c565b9050036107a957906106f46104966106ed6106e56106de61049d6104966104906106d761048460446107149c01611181565b9b8b61118b565b948761120c565b8101906102a6565b948061120c565b906001850154906040516104d7816104c960208201948560209181520190565b8051156107755761052e61072791612577565b908082036107475761051b61050b6104fe855467ffffffffffffffff1690565b7f56ed1b63000000000000000000000000000000000000000000000000000000005f5260045260245260445ffd5b61055e827f56ed1b63000000000000000000000000000000000000000000000000000000005f52906044916004525f602452565b61055e6107b6838561120c565b7f24fadac8000000000000000000000000000000000000000000000000000000005f52602060045260245250604490565b6107ef611276565b61066d565b3461019557602060ff610836610809366102e7565b905f525f845260405f209073ffffffffffffffffffffffffffffffffffffffff165f5260205260405f2090565b54166040519015158152f35b34610195575f6003193601126101955760206040515f8152f35b346101955761034e61086d366102e7565b90610886610344825f525f602052600160405f20015490565b6122cf565b346101955761089936610199565b50505f80527f4c48d1d2b0f4f7485fc28e3db22341d96a20aa29e6efa8149da9751603abd4e06020527f6e0c24a6e293ff9b755263dbaa15ba3796b0b8d3fe17cfb4ddf8143b268eac475460ff1615610915575b7f2c1ed462000000000000000000000000000000000000000000000000000000005f5260045ffd5b61091d611276565b6108ed565b67ffffffffffffffff81160361019557565b601f19601f602060409481855280519182918282880152018686015e5f8582860101520116010190565b346101955760206003193601126101955761097e60043561048481610922565b67ffffffffffffffff8154166002600183015492019060405192608084019160208501526040840152606080840152815480915260a08301915f5260205f20905f5b8181106109ea5761051b856109de818703601f198101835282610afd565b60405191829182610934565b825473ffffffffffffffffffffffffffffffffffffffff168452602090930192600192830192016109c0565b34610195575f6003193601126101955761051b60405173ffffffffffffffffffffffffffffffffffffffff60015416602082015267ffffffffffffffff600254818116604084015260401c16606082015267ffffffffffffffff600354818116608084015260401c1660a082015260a081526109de60c082610afd565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b6060810190811067ffffffffffffffff821117610adc57604052565b610a93565b6040810190811067ffffffffffffffff821117610adc57604052565b90601f601f19910116810190811067ffffffffffffffff821117610adc57604052565b60405190610b2f604083610afd565b565b67ffffffffffffffff8111610adc57601f01601f191660200190565b929192610b5982610b31565b91610b676040519384610afd565b829481845281830111610195578281602093845f960137010152565b9080601f8301121561019557816020610b9e93359101610b4d565b90565b6020818303126101955780359067ffffffffffffffff8211610195570180820391608083126101955760405192610bd784610ac0565b823567ffffffffffffffff811161019557604091610bfa84601f19938701610b83565b8652011261019557604051610c0e81610ae1565b6020830135610c1c81610922565b81526040830135610c2c81610922565b60208201526020840152606082013567ffffffffffffffff811161019557610c549201610b83565b604082015290565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b9060018201809211610c9757565b610c5c565b91908201809211610c9757565b908160011b9180830460021490151715610c9757565b81519167ffffffffffffffff8311610adc57680100000000000000008311610adc578154838355808410610d3f575b506020610d009101915f5260205f2090565b5f5b838110610d0f5750505050565b6001906020610d32855173ffffffffffffffffffffffffffffffffffffffff1690565b9401938184015501610d02565b825f528360205f2091820191015b818110610d5a5750610cee565b5f8155600101610d4d565b610d7191810190610ba1565b906020820191610d8d61044284515167ffffffffffffffff1690565b610d9781516115fc565b92604084019367ffffffffffffffff610db8865167ffffffffffffffff1690565b1615611159576080810192610dd86104fe855167ffffffffffffffff1690565b15611131576003549267ffffffffffffffff604085901c16610dfa8142610c9c565b865167ffffffffffffffff169081116110f25750505160200151610e3990610e2b9067ffffffffffffffff16611b10565b9367ffffffffffffffff1690565b67ffffffffffffffff811680151590816110c9575b50611074575090610ebc91610e7d6002610e75610e6a85611ba2565b60c086015190611cd3565b950185611eec565b610e8d60a0830194855190612011565b60406060610eb060015473ffffffffffffffffffffffffffffffffffffffff1690565b930151910151916120b4565b610ee9610ed1865167ffffffffffffffff1690565b67ffffffffffffffff165f52600460205260405f2090565b610efe6104fe825467ffffffffffffffff1690565b6110025750916002610f7c928694610f6f610f3a610f2b610ed1610f8a9a9b5167ffffffffffffffff1690565b955167ffffffffffffffff1690565b859067ffffffffffffffff167fffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000825416179055565b6001840155519101610cbf565b5167ffffffffffffffff1690565b600254610fa39060401c67ffffffffffffffff166104fe565b67ffffffffffffffff821611610fb857505f90565b610ffe907fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff6fffffffffffffffff00000000000000006002549260401b16911617600255565b5f90565b91611018611020945167ffffffffffffffff1690565b90519261212a565b61106e5761055e611039835167ffffffffffffffff1690565b7fc1aea5f7000000000000000000000000000000000000000000000000000000005f5267ffffffffffffffff16600452602490565b60029150565b61055e9061108a855467ffffffffffffffff1690565b7feae35725000000000000000000000000000000000000000000000000000000005f5267ffffffffffffffff9081166004524260245216604452606490565b90506110ea42916110e56104fe885467ffffffffffffffff1690565b610c9c565b11155f610e4e565b7f9b772277000000000000000000000000000000000000000000000000000000005f524260045267ffffffffffffffff9081166024521660445260645ffd5b7f574f4e61000000000000000000000000000000000000000000000000000000005f5260045ffd5b7f59d119e3000000000000000000000000000000000000000000000000000000005f5260045ffd5b35610b9e81610922565b9035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe181360301821215610195570180359067ffffffffffffffff821161019557602001918160051b3603831361019557565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b9035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe181360301821215610195570180359067ffffffffffffffff82116101955760200191813603831361019557565b9015611271578061126d9161120c565b9091565b6111df565b335f9081527f4c48d1d2b0f4f7485fc28e3db22341d96a20aa29e6efa8149da9751603abd4e0602052604090205460ff16156112ae57565b7fe2517d3f000000000000000000000000000000000000000000000000000000005f52336004527fbd893629a699470e4ec82a5715bb4981fdaacc5d0a728bf5f55b801d8f4ef10b60245260445ffd5b805f525f60205260ff6113323360405f209073ffffffffffffffffffffffffffffffffffffffff165f5260205260405f2090565b54161561133c5750565b7fe2517d3f000000000000000000000000000000000000000000000000000000005f523360045260245260445ffd5b67ffffffffffffffff168061137d5750565b7f3ce598a9000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b6040519060e0820182811067ffffffffffffffff821117610adc57604052606060c0838281528260208201525f60408201525f838201525f60808201528260a08201520152565b8051600110156112715760400190565b805160071015611271576101000190565b8051600d1015611271576101c00190565b8051600e1015611271576101e00190565b805160081015611271576101200190565b8051600310156112715760800190565b8051600b1015611271576101800190565b8051600c1015611271576101a00190565b8051600410156112715760a00190565b8051156112715760200190565b8051600210156112715760600190565b805160101015611271576102200190565b80518210156112715760209160051b010190565b67ffffffffffffffff8111610adc5760051b60200190565b906114e9826114c7565b6114f66040519182610afd565b828152601f1961150682946114c7565b0190602036910137565b90602082519201517fffffffffffffffffffffffffffffffffffffffff00000000000000000000000081169260148110611548575050565b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000929350829060140360031b1b161690565b60405160c0919061158b8382610afd565b6005815291601f1901825f5b8281106115a357505050565b806060602080938501015201611597565b906115be826114c7565b6115cb6040519182610afd565b828152601f196115db82946114c7565b01905f5b8281106115eb57505050565b8060606020809385010152016115df565b61161561161061160a6113a8565b92612577565b6125e6565b80825251600f8110611ae557507f1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d4934761165661165083516113ef565b516126b1565b03611aaa57600161167061166a83516113ff565b516125a4565b03611a6f577f63746963616c2062797a616e74696e65206661756c7420746f6c6572616e63656116a36116508351611410565b03611a34576116bb6116b58251611421565b516126cd565b80516008811490811591611a04575b506119ca57506116f46116e36104fe61166a8451611432565b67ffffffffffffffff166040830152565b6117016116508251611443565b606082015261172a6117196104fe61166a8451611453565b67ffffffffffffffff166080830152565b61174261161061173d6116b58451611464565b612577565b906020810191808352516005810361199f575061176861176283516113ef565b516125e6565b908151156119775761177a82516114df565b9360a082019485525f5b83518110156119135761179a6116b582866114b3565b8051601481036118e857506117b16117b791611510565b60601c90565b73ffffffffffffffffffffffffffffffffffffffff811680156118a6575f5b8381106118125750509061180c6001926117f1838a516114b3565b9073ffffffffffffffffffffffffffffffffffffffff169052565b01611784565b8161185761183e611824848d516114b3565b5173ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff1690565b14611864576001016117d6565b7f41fe18cc000000000000000000000000000000000000000000000000000000005f5273ffffffffffffffffffffffffffffffffffffffff831660045260245ffd5b7f59bff387000000000000000000000000000000000000000000000000000000005f5273ffffffffffffffffffffffffffffffffffffffff821660045260245ffd5b7f83e46ad2000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b5092611762919450611926925051611475565b61193081516115b4565b9260c081019384525f5b8251811015611971578061196a816119576116b5600195886114b3565b88519061196483836114b3565b526114b3565b500161193a565b50925050565b7f339e1ffb000000000000000000000000000000000000000000000000000000005f5260045ffd5b7f30c6792a000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b611a00906040519182917fd5edd2a500000000000000000000000000000000000000000000000000000000835260048301610934565b0390fd5b7f011b4d03dd8c01f1049143cf9c4c817e4b167f1d1b83e5c6f0f10d89ba1e7bce9150602083012014155f6116ca565b611a4461165061055e9251611410565b7fa19e609c000000000000000000000000000000000000000000000000000000005f52600452602490565b611a7f61166a61055e92516113ff565b7ff71b722f000000000000000000000000000000000000000000000000000000005f52600452602490565b611aba61165061055e92516113ef565b7fb8120dca000000000000000000000000000000000000000000000000000000005f52600452602490565b7fbc277732000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b67ffffffffffffffff1690815f52600460205260405f209167ffffffffffffffff83541615611b3c5750565b7ff761631b000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b60405190611b76604083610afd565b600182527fc0000000000000000000000000000000000000000000000000000000000000006020830152565b611c5b611bad61157a565b611c26611bc460208501611bca611bc48251611485565b51612fb7565b611bd385611485565b52611bdd84611485565b50611beb611bc482516113ef565b611bf4856113ef565b52611bfe846113ef565b50611c0c611bc48251611492565b611c1585611492565b52611c1f84611492565b5051611443565b611c2f82611443565b52611c3981611443565b50611c42611b67565b611c4b82611475565b52611c5581611475565b506126f7565b611c668251516115b4565b905f5b83518051821015611cbc579080600192600c82145f14611caa575050611c8e8361278f565b611c9882866114b3565b52611ca381856114b3565b5001611c69565b611cb791611bc4916114b3565b611c8e565b505050611cc991506126f7565b6020815191012090565b919091611ce083516114df565b925f5b8151811015611ed957611cf681836114b3565b51805160418103611eae575080601b60ff611d45611d3f611d19611d529661276e565b517fff000000000000000000000000000000000000000000000000000000000000001690565b60f81c90565b1610611e5b575b846130a3565b90611d5c816128bd565b1590811591611e51575b508015611e33575b611e0b5773ffffffffffffffffffffffffffffffffffffffff81165f5b838110611dab57505090611da56001926117f183896114b3565b01611ce3565b81611dbc61183e611824848c6114b3565b14611dc957600101611d8b565b7f33af0d5f000000000000000000000000000000000000000000000000000000005f5273ffffffffffffffffffffffffffffffffffffffff831660045260245ffd5b7f09cb44e6000000000000000000000000000000000000000000000000000000005f5260045ffd5b5073ffffffffffffffffffffffffffffffffffffffff811615611d6e565b905015155f611d66565b611e9d611e75611e70611d3f611d198561276e565b6128ab565b60f81b7fff000000000000000000000000000000000000000000000000000000000000001690565b5f1a611ea88261276e565b53611d4c565b7ff2db9ce1000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b505050565b5f198114610c975760010190565b905f915f5b8151811015611f4557611f2473ffffffffffffffffffffffffffffffffffffffff611f1c83856114b3565b5116846128c7565b611f31575b600101611ef1565b92611f3d600191611ede565b939050611f29565b50506003611f54915404610c89565b90818110611f60575050565b7fe2dcb1b9000000000000000000000000000000000000000000000000000000005f5260045260245260445ffd5b905f198201918211610c9757565b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff408201918211610c9757565b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff808201918211610c9757565b6020039060208211610c9757565b91908203918211610c9757565b905f915f5b815181101561206a5761204973ffffffffffffffffffffffffffffffffffffffff61204183856114b3565b51168461291e565b612056575b600101612016565b92612062600191611ede565b93905061204e565b50505190600382048203918211610c9757818110612086575050565b7f7818f4e4000000000000000000000000000000000000000000000000000000005f5260045260245260445ffd5b6120fe926116109261173d926040517fffffffffffffffffffffffffffffffffffffffff000000000000000000000000602082019260601b168252601481526104d7603482610afd565b805160021015611271576060610b9e9101516126b1565b8054821015611271575f5260205f2001905f90565b919067ffffffffffffffff80612148855467ffffffffffffffff1690565b9216911614908115916121e9575b506121e3576002019081548151036121e3575f5b81518110156121db576121a06121808285612115565b905473ffffffffffffffffffffffffffffffffffffffff9160031b1c1690565b73ffffffffffffffffffffffffffffffffffffffff6121c561183e61182485876114b3565b9116036121d45760010161216a565b5050505f90565b505050600190565b50505f90565b9050600182015414155f612156565b805f525f60205260ff61222c8360405f209073ffffffffffffffffffffffffffffffffffffffff165f5260205260405f2090565b54166121e357805f525f6020526122648260405f209073ffffffffffffffffffffffffffffffffffffffff165f5260205260405f2090565b60017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0082541617905573ffffffffffffffffffffffffffffffffffffffff339216907f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d5f80a4600190565b805f525f60205260ff6123038360405f209073ffffffffffffffffffffffffffffffffffffffff165f5260205260405f2090565b5416156121e357805f525f60205261233c8260405f209073ffffffffffffffffffffffffffffffffffffffff165f5260205260405f2090565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00815416905573ffffffffffffffffffffffffffffffffffffffff339216907ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b5f80a4600190565b60208151910120604051602081019182527f1260944489272988d9df285149b5aa1b0f48f2136d6f416159f840a3e07476006040820152604081526123ea606082610afd565b51902090565b604051906123ff602083610afd565b5f808352366020840137565b9061241582610b31565b6124226040519182610afd565b828152601f196115068294610b31565b611610612474919493946124466020610b31565b956124546040519788610afd565b602087526124626020610b31565b601f1960208901910136823752612577565b9061247f8451610ca9565b918451151580612557575b6124939061259d565b6124a56124a05f85612004565b61240b565b925f19015f5b8181106124bf575050610b9e939450612a92565b80612541600f61250461253b611d3f611d198d6124de60029960011c90565b908d6125358a61252d8a6125046124fb611d3f611d198a8a61277e565b60041c600f1690565b1660f81b7fff000000000000000000000000000000000000000000000000000000000000001690565b5f1a9261277e565b5361277e565b60ff1690565b5f1a612550600183018861277e565b53016124ab565b50600161248a565b6040519061256c82610ae1565b5f6020838281520152565b61257f61255f565b5060208151916040519261259284610ae1565b835201602082015290565b1561019557565b805180151590816125da575b5015610195576125bf90612d68565b905190602081106125ce575090565b6020036101000a900490565b6021915011155f6125b0565b6125ef81612d94565b15610195576125fd81612db4565b612606816114c7565b916126146040519384610afd565b818352601f19612623836114c7565b015f5b81811061269a575050602061264691015161264081612e15565b90610c9c565b5f905b8282106126565750505090565b61269281612665600193612e7b565b9061266e610b20565b82815281602082015261268186896114b3565b5261268c85886114b3565b50610c9c565b910190612649565b6020906126a561255f565b82828801015201612626565b6021815103610195576020015160018101809111610c97575190565b805115610195576126e0610b9e91612d68565b6126ec8193929361240b565b928360200190612f44565b5f9190825b81518410156127255761270f84836114b3565b51518101809111610c97576001909301926126fc565b61273091935061240b565b5f9060205b84518310156127605760019061274b84876114b3565b518051602082018386015e5101920191612735565b509050610b9e919250612fe3565b8051604010156112715760600190565b908151811015611271570160200190565b8051600181149081612893575b50156127cf57610b9e602080926040519381859251918291018484015e81015f838201520301601f198101835282610afd565b8051603781116127ff57806021916020604051946001830186526080830182870153018385015e82010160405290565b9060219061285c6128578460ff6fffffffffffffffffffffffffffffffff821160071b67ffffffffffffffff83821c1160061b1763ffffffff83821c1160051b1761ffff83821c1160041b17918260031c921c111790565b610c89565b92604051938360208284019460018601885260b7840182890153848460031b610100031b8389015201918601015e82010160405290565b905015611271576080602082015160f81c105f61279c565b60ff601b9116019060ff8211610c9757565b6004111561029457565b905f5b82548110156121d45773ffffffffffffffffffffffffffffffffffffffff6128f28285612115565b90549060031b1c1673ffffffffffffffffffffffffffffffffffffffff8316146121db576001016128ca565b905f5b82518110156121d45773ffffffffffffffffffffffffffffffffffffffff61294982856114b3565b511673ffffffffffffffffffffffffffffffffffffffff8316146121db57600101612921565b919061297b8351610ca9565b908351151580612a88575b61298f9061259d565b61299c6124a08284612004565b938192600180841614612a26575b5f19869101935b8481106129bf575050505050565b83612a1d6001612a13600f61250461253b611d3f611d198b60029b612a0c6129ff886125048f611d3f611d196129f86124fb9360011c90565b809961277e565b9b8d03809c5f1a9261277e565b538c61277e565b5f1a92018961277e565b530185906129b1565b92507f0f00000000000000000000000000000000000000000000000000000000000000612a6561253b611d3f611d19612a5f8760011c90565b8661277e565b60f81b165f1a612a7486611485565b535f19612a8083611ede565b9390506129aa565b5081811115612986565b915f915f612a9e61255f565b50845115612d2f5790935f915b81518310156101955782158080612d19575b61019557159081612cfc575b5061019557612adb61176283836114b3565b948551600281145f14612bd85750612afd612af86116b588611485565b613138565b95612b13612b0c8888846131a5565b8092610c9c565b965111612bba5715612b4a5750612b2a9051611f8e565b11610195575111612b41576116b5610b9e916113ef565b50610b9e6123f0565b919094612b578651611f8e565b82146101955780612b79612b75612b6f6001946113ef565b51612d94565b1590565b15612b9b57612b8a612b90916113ef565b5161312a565b915b01919490612aab565b612ba7612bb4916113ef565b5160208101519051902090565b91612b92565b505091509250612bcb915051611f8e565b1161019557610b9e6123f0565b929491939192601103612c9d5781518314612c7f57612c09612c0361253b611d3f611d19878761277e565b93610c89565b92601081101561019557612c26612c2082896114b3565b51613114565b15612c485750505050612c3b91925051611f8e565b0361019557610b9e6123f0565b86612c60612b75612b6f84600196989a97999b6114b3565b15612c7257612bb491612b8a916114b3565b612bb491612ba7916114b3565b505050612c8c9051611f8e565b03610195576116b5610b9e916114a2565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f696e76616c6964206e6f6465206c656e677468000000000000000000000000006044820152606490fd5b9050612d11612d0b84846114b3565b516130dd565b14155f612ac9565b50612d27612ba785856114b3565b871415612abd565b509050612d6092507f56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b42191501461259d565b610b9e6123f0565b906020820191612d788351612e15565b925190838201809211610c975751928303928311610c97579190565b805115612daf57602060c0910151515f1a10610ffe57600190565b505f90565b805115612daf575f9060208101908151612dcd81612e15565b8101809111610c9757915190518101809111610c975791905b828110612df35750905090565b612dfc81612e7b565b8101809111610c9757612e0f9091611ede565b90612de6565b515f1a6080811015612e2657505f90565b60b881108015612e65575b15612e3c5750600190565b60c0811015612e5657610b9e906128579060b75b90612004565b610b9e906128579060f7612e50565b5060c08110158015612e31575060f88110612e31565b80515f1a906080821015612e90575050600190565b60b8821015612ea65750612857610b9e91611fc9565b60c0821015612ee75760010151602082900360b7016101000a9004017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff4a0190565b60f8821015612efd5750612857610b9e91611f9c565b60010151602082900360f7016101000a9004017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0a0190565b601f8111610c97576101000a90565b90918015611ed9575b6020811015612f875780612f6057505050565b612f74612f6f612f7992611ff6565b612f35565b611f8e565b905182518216911916179052565b91908051825260208101809111610c97579060208101809111610c975791601f19810190811115612f4d57610c5c565b612fc1815161240b565b90815115612fdf57806020610b9e9201519051908360200190612f44565b5090565b805190919060378111613015578060219160206040519560018301875260c0830182880153018386015e830101604052565b9160219061306d6128578560ff6fffffffffffffffffffffffffffffffff821160071b67ffffffffffffffff83821c1160061b1763ffffffff83821c1160051b1761ffff83821c1160041b17918260031c921c111790565b93604051948360208284019460018601895260f78401828a0153848460031b610100031b838a015201918701015e830101604052565b81519190604183036130d3576130cc9250602082015190606060408401519301515f1a90613249565b9192909190565b50505f9160029190565b805160208110156130f5575060208101519051902090565b90602001512060405160208101918252602081526123ea604082610afd565b6001815103612daf5760200151515f1a60801490565b61313390612d68565b902090565b9081511561019557600f6131546124fb611d3f611d1986611485565b16806131675750610b9e60025f9361296f565b6001810361317c5750610b9e60015f9361296f565b600281036131925750610b9e600260019361296f565b60030361019557610b9e6001809361296f565b91905f5b838101808211610c9757825181108061323f575b15613237576131ed7fff00000000000000000000000000000000000000000000000000000000000000918461277e565b51167fff0000000000000000000000000000000000000000000000000000000000000061321a838661277e565b511690036132305761322b90611ede565b6131a9565b9250505090565b509250505090565b50835182106131bd565b91907f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a084116132d8579160209360809260ff5f9560405194855216868401526040830152606082015282805260015afa156132cd575f5173ffffffffffffffffffffffffffffffffffffffff8116156132c357905f905f90565b505f906001905f90565b6040513d5f823e3d90fd5b5050505f916003919056fea164736f6c634300081c000a2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d4c48d1d2b0f4f7485fc28e3db22341d96a20aa29e6efa8149da9751603abd4e06e0c24a6e293ff9b755263dbaa15ba3796b0b8d3fe17cfb4ddf8143b268eac47bd893629a699470e4ec82a5715bb4981fdaacc5d0a728bf5f55b801d8f4ef10bad3228b676f7d3cd4284a5443f17f1962b36e491b30a40b2405849e597ba5fb5"}} +{"abi":[{"type":"constructor","inputs":[{"name":"ibcRouter","type":"address","internalType":"address"},{"name":"initialTrustedHeight","type":"uint64","internalType":"uint64"},{"name":"initialTrustedTimestamp","type":"uint64","internalType":"uint64"},{"name":"initialTrustedStorageRoot","type":"bytes32","internalType":"bytes32"},{"name":"initialTrustedValidators","type":"address[]","internalType":"address[]"},{"name":"trustingPeriod","type":"uint64","internalType":"uint64"},{"name":"maxClockDrift","type":"uint64","internalType":"uint64"},{"name":"roleManager","type":"address","internalType":"address"}],"stateMutability":"nonpayable"},{"type":"function","name":"DEFAULT_ADMIN_ROLE","inputs":[],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"type":"function","name":"PROOF_SUBMITTER_ROLE","inputs":[],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"type":"function","name":"getClientState","inputs":[],"outputs":[{"name":"","type":"bytes","internalType":"bytes"}],"stateMutability":"view"},{"type":"function","name":"getConsensusState","inputs":[{"name":"revisionHeight","type":"uint64","internalType":"uint64"}],"outputs":[{"name":"","type":"bytes","internalType":"bytes"}],"stateMutability":"view"},{"type":"function","name":"getRoleAdmin","inputs":[{"name":"role","type":"bytes32","internalType":"bytes32"}],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"type":"function","name":"grantRole","inputs":[{"name":"role","type":"bytes32","internalType":"bytes32"},{"name":"account","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"hasRole","inputs":[{"name":"role","type":"bytes32","internalType":"bytes32"},{"name":"account","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"misbehaviour","inputs":[{"name":"","type":"bytes","internalType":"bytes"}],"outputs":[],"stateMutability":"view"},{"type":"function","name":"renounceRole","inputs":[{"name":"role","type":"bytes32","internalType":"bytes32"},{"name":"callerConfirmation","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"revokeRole","inputs":[{"name":"role","type":"bytes32","internalType":"bytes32"},{"name":"account","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"supportsInterface","inputs":[{"name":"interfaceId","type":"bytes4","internalType":"bytes4"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"updateClient","inputs":[{"name":"updateMsg","type":"bytes","internalType":"bytes"}],"outputs":[{"name":"","type":"uint8","internalType":"enum ILightClientMsgs.UpdateResult"}],"stateMutability":"nonpayable"},{"type":"function","name":"verifyMembership","inputs":[{"name":"msg_","type":"tuple","internalType":"struct ILightClientMsgs.MsgVerifyMembership","components":[{"name":"proof","type":"bytes","internalType":"bytes"},{"name":"proofHeight","type":"tuple","internalType":"struct IICS02ClientMsgs.Height","components":[{"name":"revisionNumber","type":"uint64","internalType":"uint64"},{"name":"revisionHeight","type":"uint64","internalType":"uint64"}]},{"name":"path","type":"bytes[]","internalType":"bytes[]"},{"name":"value","type":"bytes","internalType":"bytes"}]}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"verifyNonMembership","inputs":[{"name":"msg_","type":"tuple","internalType":"struct ILightClientMsgs.MsgVerifyNonMembership","components":[{"name":"proof","type":"bytes","internalType":"bytes"},{"name":"proofHeight","type":"tuple","internalType":"struct IICS02ClientMsgs.Height","components":[{"name":"revisionNumber","type":"uint64","internalType":"uint64"},{"name":"revisionHeight","type":"uint64","internalType":"uint64"}]},{"name":"path","type":"bytes[]","internalType":"bytes[]"}]}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"event","name":"RoleAdminChanged","inputs":[{"name":"role","type":"bytes32","indexed":true,"internalType":"bytes32"},{"name":"previousAdminRole","type":"bytes32","indexed":true,"internalType":"bytes32"},{"name":"newAdminRole","type":"bytes32","indexed":true,"internalType":"bytes32"}],"anonymous":false},{"type":"event","name":"RoleGranted","inputs":[{"name":"role","type":"bytes32","indexed":true,"internalType":"bytes32"},{"name":"account","type":"address","indexed":true,"internalType":"address"},{"name":"sender","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"type":"event","name":"RoleRevoked","inputs":[{"name":"role","type":"bytes32","indexed":true,"internalType":"bytes32"},{"name":"account","type":"address","indexed":true,"internalType":"address"},{"name":"sender","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"type":"error","name":"AccessControlBadConfirmation","inputs":[]},{"type":"error","name":"AccessControlUnauthorizedAccount","inputs":[{"name":"account","type":"address","internalType":"address"},{"name":"neededRole","type":"bytes32","internalType":"bytes32"}]},{"type":"error","name":"ConflictingConsensusState","inputs":[{"name":"revisionHeight","type":"uint64","internalType":"uint64"}]},{"type":"error","name":"ConsensusStateExpired","inputs":[{"name":"trustedTimestamp","type":"uint64","internalType":"uint64"},{"name":"currentTimestamp","type":"uint256","internalType":"uint256"},{"name":"trustingPeriod","type":"uint64","internalType":"uint64"}]},{"type":"error","name":"ConsensusStateNotFound","inputs":[{"name":"revisionHeight","type":"uint64","internalType":"uint64"}]},{"type":"error","name":"DuplicateCommitSealSigner","inputs":[{"name":"signer","type":"address","internalType":"address"}]},{"type":"error","name":"DuplicateValidator","inputs":[{"name":"validator","type":"address","internalType":"address"}]},{"type":"error","name":"EmptyValidatorSet","inputs":[]},{"type":"error","name":"HeaderFromFuture","inputs":[{"name":"currentTimestamp","type":"uint256","internalType":"uint256"},{"name":"headerTimestamp","type":"uint256","internalType":"uint256"},{"name":"maxClockDrift","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"InsufficientTrustedValidatorOverlap","inputs":[{"name":"actual","type":"uint256","internalType":"uint256"},{"name":"required","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"InsufficientValidatorQuorum","inputs":[{"name":"actual","type":"uint256","internalType":"uint256"},{"name":"required","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"InvalidCommitSeal","inputs":[]},{"type":"error","name":"InvalidCommitmentValue","inputs":[{"name":"expectedValue","type":"bytes32","internalType":"bytes32"},{"name":"actualValue","type":"bytes32","internalType":"bytes32"}]},{"type":"error","name":"InvalidDifficulty","inputs":[{"name":"actualDifficulty","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"InvalidECDSASignatureLength","inputs":[{"name":"length","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"InvalidExtraDataFormat","inputs":[{"name":"itemsLength","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"InvalidHeaderFormat","inputs":[{"name":"itemsLength","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"InvalidHeaderHeight","inputs":[]},{"type":"error","name":"InvalidHeaderTimestamp","inputs":[]},{"type":"error","name":"InvalidMixHash","inputs":[{"name":"actualMixHash","type":"bytes32","internalType":"bytes32"}]},{"type":"error","name":"InvalidNonce","inputs":[{"name":"actualNonce","type":"bytes","internalType":"bytes"}]},{"type":"error","name":"InvalidOmmersHash","inputs":[{"name":"actualOmmersHash","type":"bytes32","internalType":"bytes32"}]},{"type":"error","name":"InvalidPathLength","inputs":[{"name":"expectedLength","type":"uint256","internalType":"uint256"},{"name":"actualLength","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"InvalidRevisionNumber","inputs":[{"name":"providedRevisionNumber","type":"uint64","internalType":"uint64"}]},{"type":"error","name":"InvalidValidatorAddress","inputs":[{"name":"validator","type":"address","internalType":"address"}]},{"type":"error","name":"InvalidValidatorAddressLength","inputs":[{"name":"length","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"InvalidValueLength","inputs":[{"name":"expectedLength","type":"uint256","internalType":"uint256"},{"name":"actualLength","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"UnsupportedMisbehaviour","inputs":[]},{"type":"error","name":"ValueExists","inputs":[{"name":"actualValue","type":"bytes32","internalType":"bytes32"}]}],"bytecode":{"object":"0x6080604052346103d85761394280380380610019816103dc565b928339810190610100818303126103d85761003381610401565b9061004060208201610415565b9061004d60408201610415565b92606082015191608081015160018060401b0381116103d85781019286601f850112156103d8578351966001600160401b03881161037f578760051b9460206100978188016103dc565b809a81520190602082978201019283116103d857602001905b8282106103c0575050506100c660a08301610415565b956100df60e06100d860c08601610415565b9401610401565b956001600160401b03169081156103b1576001600160401b03169283156103a257885115610393575f5b89518110156101bf576001600160a01b03610124828c610429565b511615610198575f5b81811061013d5750600101610109565b6001600160a01b0361014f828d610429565b51166001600160a01b03610163848e610429565b5116146101725760010161012d565b6001600160a01b03610184838d610429565b511663107f863360e21b5f5260045260245ffd5b6001600160a01b03906101ab908b610429565b51166359bff38760e01b5f5260045260245ffd5b5060408051979896978a979181016001600160401b0381118282101761037f576040525f81526020810190848252604051926080840198848a1060018060401b038b111761037f576040998a526001600160a01b031680855260208086018490526001600160401b03928316868c01819052878416606090970196909652600180546001600160a01b031916909217825592516002805495516fffffffffffffffff0000000000000000908d1b81169285166001600160801b03199788161792909217815560038054988d1b90921697909516909517959095179093555f948552600490529590922080546001600160401b031916949094178455830191909155925193910191831161037f5768010000000000000000831161037f578154838355808410610359575b50905f5260205f205f5b83811061033c57846001600160a01b0381166103235750610312610547565b505b6040516132d890816105ca8239f35b8061033061033692610451565b506104c7565b50610314565b82516001600160a01b0316818301556020909201916001016102f3565b825f528360205f2091820191015b81811061037457506102e9565b5f8155600101610367565b634e487b7160e01b5f52604160045260245ffd5b63339e1ffb60e01b5f5260045ffd5b63574f4e6160e01b5f5260045ffd5b6359d119e360e01b5f5260045ffd5b602080916103cd84610401565b8152019101906100b0565b5f80fd5b6040519190601f01601f191682016001600160401b0381118382101761037f57604052565b51906001600160a01b03821682036103d857565b51906001600160401b03821682036103d857565b805182101561043d5760209160051b010190565b634e487b7160e01b5f52603260045260245ffd5b6001600160a01b0381165f9081525f5160206139225f395f51905f52602052604090205460ff166104c2576001600160a01b03165f8181525f5160206139225f395f51905f5260205260408120805460ff191660011790553391905f5160206138a25f395f51905f528180a4600190565b505f90565b6001600160a01b0381165f9081525f5160206138c25f395f51905f52602052604090205460ff166104c2576001600160a01b03165f8181525f5160206138c25f395f51905f5260205260408120805460ff191660011790553391905f5160206139025f395f51905f52905f5160206138a25f395f51905f529080a4600190565b5f80525f5160206138c25f395f51905f526020525f5160206138e25f395f51905f525460ff166105c5575f8080525f5160206138c25f395f51905f526020525f5160206138e25f395f51905f52805460ff1916600117905533905f5160206139025f395f51905f525f5160206138a25f395f51905f528280a4600190565b5f9056fe60806040526004361015610011575f80fd5b5f3560e01c806301ffc9a7146100f45780630bece356146100ef578063248a9ca3146100ea5780632f2ff15d146100e557806336568abe146100e05780634d6d9ffb146100db5780635972185a146100d6578063682ed5f0146100d157806391d14854146100cc578063a217fddf146100c7578063d547741f146100c2578063ddba6537146100bd578063edce8bdc146100b85763ef913a4b146100b3575f80fd5b6109c8565b61095e565b61088b565b61085c565b610842565b6107f4565b6105e6565b6105ac565b6103ac565b610350565b61031a565b6102b5565b610217565b34610195576020600319360112610195576004357fffffffff00000000000000000000000000000000000000000000000000000000811680910361019557807f7965db0b000000000000000000000000000000000000000000000000000000006020921490811561016b575b506040519015158152f35b7f01ffc9a7000000000000000000000000000000000000000000000000000000009150145f610160565b5f80fd5b9060206003198301126101955760043567ffffffffffffffff811161019557826023820112156101955780600401359267ffffffffffffffff84116101955760248483010111610195576024019190565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b346101955761028161022836610199565b5f80527f4c48d1d2b0f4f7485fc28e3db22341d96a20aa29e6efa8149da9751603abd4e06020527f6e0c24a6e293ff9b755263dbaa15ba3796b0b8d3fe17cfb4ddf8143b268eac475490919060ff161561029957610d17565b6040516003821015610294576020918152f35b6101ea565b6102a1611275565b610d17565b90816020910312610195573590565b346101955760206003193601126101955760206102df6004355f525f602052600160405f20015490565b604051908152f35b6003196040910112610195576004359060243573ffffffffffffffffffffffffffffffffffffffff811681036101955790565b346101955761034e61032b366102e7565b90610349610344825f525f602052600160405f20015490565b6112fd565b6121d8565b005b346101955761035e366102e7565b3373ffffffffffffffffffffffffffffffffffffffff8216036103845761034e916122af565b7f6697b232000000000000000000000000000000000000000000000000000000005f5260045ffd5b346101955760206003193601126101955760043567ffffffffffffffff8111610195578060040160806003198336030112610195575f80527f4c48d1d2b0f4f7485fc28e3db22341d96a20aa29e6efa8149da9751603abd4e060205260ff7f6e0c24a6e293ff9b755263dbaa15ba3796b0b8d3fe17cfb4ddf8143b268eac4754161561059f575b61044761044260248401611133565b61136a565b60648201916001610458848461113d565b90500361056157906104a96104966104a261049d61049661049061048961048460446104e09a01611133565b611b0f565b988761113d565b9061120f565b3691610aff565b612384565b92806111be565b906001840154906040516104d7816104c960208201948560209181520190565b03601f198101835282610aaf565b51902091612412565b805161051f5761051b61050b6104fe845467ffffffffffffffff1690565b67ffffffffffffffff1690565b6040519081529081906020820190565b0390f35b61053361052e61055e92612557565b612584565b7fd039601e000000000000000000000000000000000000000000000000000000005f52600452602490565b5ffd5b61055e61056e848461113d565b7f88b3170e000000000000000000000000000000000000000000000000000000005f52600160045260245250604490565b6105a7611275565b610433565b34610195575f6003193601126101955760206040517fbd893629a699470e4ec82a5715bb4981fdaacc5d0a728bf5f55b801d8f4ef10b8152f35b346101955760206003193601126101955760043567ffffffffffffffff8111610195578060040160a06003198336030112610195575f80527f4c48d1d2b0f4f7485fc28e3db22341d96a20aa29e6efa8149da9751603abd4e060205260ff7f6e0c24a6e293ff9b755263dbaa15ba3796b0b8d3fe17cfb4ddf8143b268eac475416156107e7575b61067c61044260248401611133565b6064820191600161068d848461113d565b90500361056157608481019060206106a583856111be565b9050036107a957906106f46104966106ed6106e56106de61049d6104966104906106d761048460446107149c01611133565b9b8b61113d565b94876111be565b8101906102a6565b94806111be565b906001850154906040516104d7816104c960208201948560209181520190565b8051156107755761052e61072791612557565b908082036107475761051b61050b6104fe855467ffffffffffffffff1690565b7f56ed1b63000000000000000000000000000000000000000000000000000000005f5260045260245260445ffd5b61055e827f56ed1b63000000000000000000000000000000000000000000000000000000005f52906044916004525f602452565b61055e6107b683856111be565b7f24fadac8000000000000000000000000000000000000000000000000000000005f52602060045260245250604490565b6107ef611275565b61066d565b3461019557602060ff610836610809366102e7565b905f525f845260405f209073ffffffffffffffffffffffffffffffffffffffff165f5260205260405f2090565b54166040519015158152f35b34610195575f6003193601126101955760206040515f8152f35b346101955761034e61086d366102e7565b90610886610344825f525f602052600160405f20015490565b6122af565b346101955761089936610199565b50505f80527f4c48d1d2b0f4f7485fc28e3db22341d96a20aa29e6efa8149da9751603abd4e06020527f6e0c24a6e293ff9b755263dbaa15ba3796b0b8d3fe17cfb4ddf8143b268eac475460ff1615610915575b7f2c1ed462000000000000000000000000000000000000000000000000000000005f5260045ffd5b61091d611275565b6108ed565b67ffffffffffffffff81160361019557565b601f19601f602060409481855280519182918282880152018686015e5f8582860101520116010190565b346101955760206003193601126101955761051b61098160043561048481610922565b6109bc67ffffffffffffffff8254166104c9600184015493604051948593602085015260408401526060808401526002608084019101611228565b60405191829182610934565b34610195575f6003193601126101955761051b60405173ffffffffffffffffffffffffffffffffffffffff60015416602082015267ffffffffffffffff600254818116604084015260401c16606082015267ffffffffffffffff600354818116608084015260401c1660a082015260a081526109bc60c082610aaf565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b6060810190811067ffffffffffffffff821117610a8e57604052565b610a45565b6040810190811067ffffffffffffffff821117610a8e57604052565b90601f601f19910116810190811067ffffffffffffffff821117610a8e57604052565b60405190610ae1604083610aaf565b565b67ffffffffffffffff8111610a8e57601f01601f191660200190565b929192610b0b82610ae3565b91610b196040519384610aaf565b829481845281830111610195578281602093845f960137010152565b9080601f8301121561019557816020610b5093359101610aff565b90565b6020818303126101955780359067ffffffffffffffff8211610195570180820391608083126101955760405192610b8984610a72565b823567ffffffffffffffff811161019557604091610bac84601f19938701610b35565b8652011261019557604051610bc081610a93565b6020830135610bce81610922565b81526040830135610bde81610922565b60208201526020840152606082013567ffffffffffffffff811161019557610c069201610b35565b604082015290565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b9060018201809211610c4957565b610c0e565b91908201809211610c4957565b908160011b9180830460021490151715610c4957565b81519167ffffffffffffffff8311610a8e57680100000000000000008311610a8e578154838355808410610cf1575b506020610cb29101915f5260205f2090565b5f5b838110610cc15750505050565b6001906020610ce4855173ffffffffffffffffffffffffffffffffffffffff1690565b9401938184015501610cb4565b825f528360205f2091820191015b818110610d0c5750610ca0565b5f8155600101610cff565b610d2391810190610b53565b906020820191610d3f61044284515167ffffffffffffffff1690565b610d4981516115fb565b92604084019367ffffffffffffffff610d6a865167ffffffffffffffff1690565b161561110b576080810192610d8a6104fe855167ffffffffffffffff1690565b156110e3576003549267ffffffffffffffff604085901c16610dac8142610c4e565b865167ffffffffffffffff169081116110a45750505160200151610deb90610ddd9067ffffffffffffffff16611b0f565b9367ffffffffffffffff1690565b67ffffffffffffffff8116801515908161107b575b50611026575090610e6e91610e2f6002610e27610e1c85611ba1565b60c086015190611cd2565b950185611eeb565b610e3f60a0830194855190612010565b60406060610e6260015473ffffffffffffffffffffffffffffffffffffffff1690565b930151910151916120b3565b610e9b610e83865167ffffffffffffffff1690565b67ffffffffffffffff165f52600460205260405f2090565b610eb06104fe825467ffffffffffffffff1690565b610fb45750916002610f2e928694610f21610eec610edd610e83610f3c9a9b5167ffffffffffffffff1690565b955167ffffffffffffffff1690565b859067ffffffffffffffff167fffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000825416179055565b6001840155519101610c71565b5167ffffffffffffffff1690565b600254610f559060401c67ffffffffffffffff166104fe565b67ffffffffffffffff821611610f6a57505f90565b610fb0907fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff6fffffffffffffffff00000000000000006002549260401b16911617600255565b5f90565b91610fca610fd2945167ffffffffffffffff1690565b905192612163565b6110205761055e610feb835167ffffffffffffffff1690565b7fc1aea5f7000000000000000000000000000000000000000000000000000000005f5267ffffffffffffffff16600452602490565b60029150565b61055e9061103c855467ffffffffffffffff1690565b7feae35725000000000000000000000000000000000000000000000000000000005f5267ffffffffffffffff9081166004524260245216604452606490565b905061109c42916110976104fe885467ffffffffffffffff1690565b610c4e565b11155f610e00565b7f9b772277000000000000000000000000000000000000000000000000000000005f524260045267ffffffffffffffff9081166024521660445260645ffd5b7f574f4e61000000000000000000000000000000000000000000000000000000005f5260045ffd5b7f59d119e3000000000000000000000000000000000000000000000000000000005f5260045ffd5b35610b5081610922565b9035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe181360301821215610195570180359067ffffffffffffffff821161019557602001918160051b3603831361019557565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b9035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe181360301821215610195570180359067ffffffffffffffff82116101955760200191813603831361019557565b9015611223578061121f916111be565b9091565b611191565b90602082549182815201915f5260205f20905f5b8181106112495750505090565b825473ffffffffffffffffffffffffffffffffffffffff1684526020909301926001928301920161123c565b335f9081527f4c48d1d2b0f4f7485fc28e3db22341d96a20aa29e6efa8149da9751603abd4e0602052604090205460ff16156112ad57565b7fe2517d3f000000000000000000000000000000000000000000000000000000005f52336004527fbd893629a699470e4ec82a5715bb4981fdaacc5d0a728bf5f55b801d8f4ef10b60245260445ffd5b805f525f60205260ff6113313360405f209073ffffffffffffffffffffffffffffffffffffffff165f5260205260405f2090565b54161561133b5750565b7fe2517d3f000000000000000000000000000000000000000000000000000000005f523360045260245260445ffd5b67ffffffffffffffff168061137c5750565b7f3ce598a9000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b6040519060e0820182811067ffffffffffffffff821117610a8e57604052606060c0838281528260208201525f60408201525f838201525f60808201528260a08201520152565b8051600110156112235760400190565b805160071015611223576101000190565b8051600d1015611223576101c00190565b8051600e1015611223576101e00190565b805160081015611223576101200190565b8051600310156112235760800190565b8051600b1015611223576101800190565b8051600c1015611223576101a00190565b8051600410156112235760a00190565b8051156112235760200190565b8051600210156112235760600190565b805160101015611223576102200190565b80518210156112235760209160051b010190565b67ffffffffffffffff8111610a8e5760051b60200190565b906114e8826114c6565b6114f56040519182610aaf565b828152601f1961150582946114c6565b0190602036910137565b90602082519201517fffffffffffffffffffffffffffffffffffffffff00000000000000000000000081169260148110611547575050565b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000929350829060140360031b1b161690565b60405160c0919061158a8382610aaf565b6005815291601f1901825f5b8281106115a257505050565b806060602080938501015201611596565b906115bd826114c6565b6115ca6040519182610aaf565b828152601f196115da82946114c6565b01905f5b8281106115ea57505050565b8060606020809385010152016115de565b61161461160f6116096113a7565b92612557565b6125c6565b80825251600f8110611ae457507f1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d4934761165561164f83516113ee565b51612691565b03611aa957600161166f61166983516113fe565b51612584565b03611a6e577f63746963616c2062797a616e74696e65206661756c7420746f6c6572616e63656116a261164f835161140f565b03611a33576116ba6116b48251611420565b516126ad565b80516008811490811591611a03575b506119c957506116f36116e26104fe6116698451611431565b67ffffffffffffffff166040830152565b61170061164f8251611442565b60608201526117296117186104fe6116698451611452565b67ffffffffffffffff166080830152565b61174161160f61173c6116b48451611463565b612557565b906020810191808352516005810361199e575061176761176183516113ee565b516125c6565b908151156119765761177982516114de565b9360a082019485525f5b8351811015611912576117996116b482866114b2565b8051601481036118e757506117b06117b69161150f565b60601c90565b73ffffffffffffffffffffffffffffffffffffffff811680156118a5575f5b8381106118115750509061180b6001926117f0838a516114b2565b9073ffffffffffffffffffffffffffffffffffffffff169052565b01611783565b8161185661183d611823848d516114b2565b5173ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff1690565b14611863576001016117d5565b7f41fe18cc000000000000000000000000000000000000000000000000000000005f5273ffffffffffffffffffffffffffffffffffffffff831660045260245ffd5b7f59bff387000000000000000000000000000000000000000000000000000000005f5273ffffffffffffffffffffffffffffffffffffffff821660045260245ffd5b7f83e46ad2000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b5092611761919450611925925051611474565b61192f81516115b3565b9260c081019384525f5b82518110156119705780611969816119566116b4600195886114b2565b88519061196383836114b2565b526114b2565b5001611939565b50925050565b7f339e1ffb000000000000000000000000000000000000000000000000000000005f5260045ffd5b7f30c6792a000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b6119ff906040519182917fd5edd2a500000000000000000000000000000000000000000000000000000000835260048301610934565b0390fd5b7f011b4d03dd8c01f1049143cf9c4c817e4b167f1d1b83e5c6f0f10d89ba1e7bce9150602083012014155f6116c9565b611a4361164f61055e925161140f565b7fa19e609c000000000000000000000000000000000000000000000000000000005f52600452602490565b611a7e61166961055e92516113fe565b7ff71b722f000000000000000000000000000000000000000000000000000000005f52600452602490565b611ab961164f61055e92516113ee565b7fb8120dca000000000000000000000000000000000000000000000000000000005f52600452602490565b7fbc277732000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b67ffffffffffffffff1690815f52600460205260405f209167ffffffffffffffff83541615611b3b5750565b7ff761631b000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b60405190611b75604083610aaf565b600182527fc0000000000000000000000000000000000000000000000000000000000000006020830152565b611c5a611bac611579565b611c25611bc360208501611bc9611bc38251611484565b51612f9f565b611bd285611484565b52611bdc84611484565b50611bea611bc382516113ee565b611bf3856113ee565b52611bfd846113ee565b50611c0b611bc38251611491565b611c1485611491565b52611c1e84611491565b5051611442565b611c2e82611442565b52611c3881611442565b50611c41611b66565b611c4a82611474565b52611c5481611474565b506126d7565b611c658251516115b3565b905f5b83518051821015611cbb579080600192600c82145f14611ca9575050611c8d8361276f565b611c9782866114b2565b52611ca281856114b2565b5001611c68565b611cb691611bc3916114b2565b611c8d565b505050611cc891506126d7565b6020815191012090565b919091611cdf83516114de565b925f5b8151811015611ed857611cf581836114b2565b51805160418103611ead575080601b60ff611d44611d3e611d18611d519661274e565b517fff000000000000000000000000000000000000000000000000000000000000001690565b60f81c90565b1610611e5a575b8461308b565b90611d5b8161289d565b1590811591611e50575b508015611e32575b611e0a5773ffffffffffffffffffffffffffffffffffffffff81165f5b838110611daa57505090611da46001926117f083896114b2565b01611ce2565b81611dbb61183d611823848c6114b2565b14611dc857600101611d8a565b7f33af0d5f000000000000000000000000000000000000000000000000000000005f5273ffffffffffffffffffffffffffffffffffffffff831660045260245ffd5b7f09cb44e6000000000000000000000000000000000000000000000000000000005f5260045ffd5b5073ffffffffffffffffffffffffffffffffffffffff811615611d6d565b905015155f611d65565b611e9c611e74611e6f611d3e611d188561274e565b61288b565b60f81b7fff000000000000000000000000000000000000000000000000000000000000001690565b5f1a611ea78261274e565b53611d4b565b7ff2db9ce1000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b505050565b5f198114610c495760010190565b905f915f5b8151811015611f4457611f2373ffffffffffffffffffffffffffffffffffffffff611f1b83856114b2565b5116846128a7565b611f30575b600101611ef0565b92611f3c600191611edd565b939050611f28565b50506003611f53915404610c3b565b90818110611f5f575050565b7fe2dcb1b9000000000000000000000000000000000000000000000000000000005f5260045260245260445ffd5b905f198201918211610c4957565b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff408201918211610c4957565b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff808201918211610c4957565b6020039060208211610c4957565b91908203918211610c4957565b905f915f5b81518110156120695761204873ffffffffffffffffffffffffffffffffffffffff61204083856114b2565b511684612906565b612055575b600101612015565b92612061600191611edd565b93905061204d565b50505190600382048203918211610c4957818110612085575050565b7f7818f4e4000000000000000000000000000000000000000000000000000000005f5260045260245260445ffd5b6120fd9261160f9261173c926040517fffffffffffffffffffffffffffffffffffffffff000000000000000000000000602082019260601b168252601481526104d7603482610aaf565b805160021015611223576060610b50910151612691565b60206040818301928281528451809452019201905f5b8181106121375750505090565b825173ffffffffffffffffffffffffffffffffffffffff1684526020938401939092019160010161212a565b919067ffffffffffffffff80845416911614908115916121c9575b506121c3576040516121a3816104c96020820194602086526002604084019101611228565b519020906040516121bc816104c9602082019485612114565b5190201490565b50505f90565b9050600182015414155f61217e565b805f525f60205260ff61220c8360405f209073ffffffffffffffffffffffffffffffffffffffff165f5260205260405f2090565b54166121c357805f525f6020526122448260405f209073ffffffffffffffffffffffffffffffffffffffff165f5260205260405f2090565b60017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0082541617905573ffffffffffffffffffffffffffffffffffffffff339216907f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d5f80a4600190565b805f525f60205260ff6122e38360405f209073ffffffffffffffffffffffffffffffffffffffff165f5260205260405f2090565b5416156121c357805f525f60205261231c8260405f209073ffffffffffffffffffffffffffffffffffffffff165f5260205260405f2090565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00815416905573ffffffffffffffffffffffffffffffffffffffff339216907ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b5f80a4600190565b60208151910120604051602081019182527f1260944489272988d9df285149b5aa1b0f48f2136d6f416159f840a3e07476006040820152604081526123ca606082610aaf565b51902090565b604051906123df602083610aaf565b5f808352366020840137565b906123f582610ae3565b6124026040519182610aaf565b828152601f196115058294610ae3565b61160f612454919493946124266020610ae3565b956124346040519788610aaf565b602087526124426020610ae3565b601f1960208901910136823752612557565b9061245f8451610c5b565b918451151580612537575b6124739061257d565b6124856124805f85612003565b6123eb565b925f19015f5b81811061249f575050610b50939450612a7a565b80612521600f6124e461251b611d3e611d188d6124be60029960011c90565b908d6125158a61250d8a6124e46124db611d3e611d188a8a61275e565b60041c600f1690565b1660f81b7fff000000000000000000000000000000000000000000000000000000000000001690565b5f1a9261275e565b5361275e565b60ff1690565b5f1a612530600183018861275e565b530161248b565b50600161246a565b6040519061254c82610a93565b5f6020838281520152565b61255f61253f565b5060208151916040519261257284610a93565b835201602082015290565b1561019557565b805180151590816125ba575b50156101955761259f90612d50565b905190602081106125ae575090565b6020036101000a900490565b6021915011155f612590565b6125cf81612d7c565b15610195576125dd81612d9c565b6125e6816114c6565b916125f46040519384610aaf565b818352601f19612603836114c6565b015f5b81811061267a575050602061262691015161262081612dfd565b90610c4e565b5f905b8282106126365750505090565b61267281612645600193612e63565b9061264e610ad2565b82815281602082015261266186896114b2565b5261266c85886114b2565b50610c4e565b910190612629565b60209061268561253f565b82828801015201612606565b6021815103610195576020015160018101809111610c49575190565b805115610195576126c0610b5091612d50565b6126cc819392936123eb565b928360200190612f2c565b5f9190825b8151841015612705576126ef84836114b2565b51518101809111610c49576001909301926126dc565b6127109193506123eb565b5f9060205b84518310156127405760019061272b84876114b2565b518051602082018386015e5101920191612715565b509050610b50919250612fcb565b8051604010156112235760600190565b908151811015611223570160200190565b8051600181149081612873575b50156127af57610b50602080926040519381859251918291018484015e81015f838201520301601f198101835282610aaf565b8051603781116127df57806021916020604051946001830186526080830182870153018385015e82010160405290565b9060219061283c6128378460ff6fffffffffffffffffffffffffffffffff821160071b67ffffffffffffffff83821c1160061b1763ffffffff83821c1160051b1761ffff83821c1160041b17918260031c921c111790565b610c3b565b92604051938360208284019460018601885260b7840182890153848460031b610100031b8389015201918601015e82010160405290565b905015611223576080602082015160f81c105f61277c565b60ff601b9116019060ff8211610c4957565b6004111561029457565b905f5b82548110156128ff57825f5273ffffffffffffffffffffffffffffffffffffffff8160205f2001541673ffffffffffffffffffffffffffffffffffffffff8316146128f7576001016128aa565b505050600190565b5050505f90565b905f5b82518110156128ff5773ffffffffffffffffffffffffffffffffffffffff61293182856114b2565b511673ffffffffffffffffffffffffffffffffffffffff8316146128f757600101612909565b91906129638351610c5b565b908351151580612a70575b6129779061257d565b6129846124808284612003565b938192600180841614612a0e575b5f19869101935b8481106129a7575050505050565b83612a0560016129fb600f6124e461251b611d3e611d188b60029b6129f46129e7886124e48f611d3e611d186129e06124db9360011c90565b809961275e565b9b8d03809c5f1a9261275e565b538c61275e565b5f1a92018961275e565b53018590612999565b92507f0f00000000000000000000000000000000000000000000000000000000000000612a4d61251b611d3e611d18612a478760011c90565b8661275e565b60f81b165f1a612a5c86611484565b535f19612a6883611edd565b939050612992565b508181111561296e565b915f915f612a8661253f565b50845115612d175790935f915b81518310156101955782158080612d01575b61019557159081612ce4575b5061019557612ac361176183836114b2565b948551600281145f14612bc05750612ae5612ae06116b488611484565b613120565b95612afb612af488888461318d565b8092610c4e565b965111612ba25715612b325750612b129051611f8d565b11610195575111612b29576116b4610b50916113ee565b50610b506123d0565b919094612b3f8651611f8d565b82146101955780612b61612b5d612b576001946113ee565b51612d7c565b1590565b15612b8357612b72612b78916113ee565b51613112565b915b01919490612a93565b612b8f612b9c916113ee565b5160208101519051902090565b91612b7a565b505091509250612bb3915051611f8d565b1161019557610b506123d0565b929491939192601103612c855781518314612c6757612bf1612beb61251b611d3e611d18878761275e565b93610c3b565b92601081101561019557612c0e612c0882896114b2565b516130fc565b15612c305750505050612c2391925051611f8d565b0361019557610b506123d0565b86612c48612b5d612b5784600196989a97999b6114b2565b15612c5a57612b9c91612b72916114b2565b612b9c91612b8f916114b2565b505050612c749051611f8d565b03610195576116b4610b50916114a1565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f696e76616c6964206e6f6465206c656e677468000000000000000000000000006044820152606490fd5b9050612cf9612cf384846114b2565b516130c5565b14155f612ab1565b50612d0f612b8f85856114b2565b871415612aa5565b509050612d4892507f56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b42191501461257d565b610b506123d0565b906020820191612d608351612dfd565b925190838201809211610c495751928303928311610c49579190565b805115612d9757602060c0910151515f1a10610fb057600190565b505f90565b805115612d97575f9060208101908151612db581612dfd565b8101809111610c4957915190518101809111610c495791905b828110612ddb5750905090565b612de481612e63565b8101809111610c4957612df79091611edd565b90612dce565b515f1a6080811015612e0e57505f90565b60b881108015612e4d575b15612e245750600190565b60c0811015612e3e57610b50906128379060b75b90612003565b610b50906128379060f7612e38565b5060c08110158015612e19575060f88110612e19565b80515f1a906080821015612e78575050600190565b60b8821015612e8e5750612837610b5091611fc8565b60c0821015612ecf5760010151602082900360b7016101000a9004017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff4a0190565b60f8821015612ee55750612837610b5091611f9b565b60010151602082900360f7016101000a9004017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0a0190565b601f8111610c49576101000a90565b90918015611ed8575b6020811015612f6f5780612f4857505050565b612f5c612f57612f6192611ff5565b612f1d565b611f8d565b905182518216911916179052565b91908051825260208101809111610c49579060208101809111610c495791601f19810190811115612f3557610c0e565b612fa981516123eb565b90815115612fc757806020610b509201519051908360200190612f2c565b5090565b805190919060378111612ffd578060219160206040519560018301875260c0830182880153018386015e830101604052565b916021906130556128378560ff6fffffffffffffffffffffffffffffffff821160071b67ffffffffffffffff83821c1160061b1763ffffffff83821c1160051b1761ffff83821c1160041b17918260031c921c111790565b93604051948360208284019460018601895260f78401828a0153848460031b610100031b838a015201918701015e830101604052565b81519190604183036130bb576130b49250602082015190606060408401519301515f1a90613231565b9192909190565b50505f9160029190565b805160208110156130dd575060208101519051902090565b90602001512060405160208101918252602081526123ca604082610aaf565b6001815103612d975760200151515f1a60801490565b61311b90612d50565b902090565b9081511561019557600f61313c6124db611d3e611d1886611484565b168061314f5750610b5060025f93612957565b600181036131645750610b5060015f93612957565b6002810361317a5750610b506002600193612957565b60030361019557610b5060018093612957565b91905f5b838101808211610c49578251811080613227575b1561321f576131d57fff00000000000000000000000000000000000000000000000000000000000000918461275e565b51167fff00000000000000000000000000000000000000000000000000000000000000613202838661275e565b511690036132185761321390611edd565b613191565b9250505090565b509250505090565b50835182106131a5565b91907f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a084116132c0579160209360809260ff5f9560405194855216868401526040830152606082015282805260015afa156132b5575f5173ffffffffffffffffffffffffffffffffffffffff8116156132ab57905f905f90565b505f906001905f90565b6040513d5f823e3d90fd5b5050505f916003919056fea164736f6c634300081c000a2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d4c48d1d2b0f4f7485fc28e3db22341d96a20aa29e6efa8149da9751603abd4e06e0c24a6e293ff9b755263dbaa15ba3796b0b8d3fe17cfb4ddf8143b268eac47bd893629a699470e4ec82a5715bb4981fdaacc5d0a728bf5f55b801d8f4ef10bad3228b676f7d3cd4284a5443f17f1962b36e491b30a40b2405849e597ba5fb5"}} diff --git a/ibc-solidity/contracts/light-clients/besu/BesuLightClientBase.sol b/ibc-solidity/contracts/light-clients/besu/BesuLightClientBase.sol index 3ba07394c..1db886a1a 100644 --- a/ibc-solidity/contracts/light-clients/besu/BesuLightClientBase.sol +++ b/ibc-solidity/contracts/light-clients/besu/BesuLightClientBase.sol @@ -437,15 +437,7 @@ abstract contract BesuLightClientBase is IBesuLightClient, IBesuLightClientError if (consensusState.timestamp != timestamp || consensusState.storageRoot != storageRoot) { return false; } - if (consensusState.validators.length != validators.length) { - return false; - } - for (uint256 i = 0; i < validators.length; ++i) { - if (consensusState.validators[i] != validators[i]) { - return false; - } - } - return true; + return keccak256(abi.encode(consensusState.validators)) == keccak256(abi.encode(validators)); } /// @notice Returns a stored consensus state or reverts if it is missing. diff --git a/packages/proof-api/modules/besu-to-besu/Cargo.toml b/packages/proof-api/modules/besu-to-eth/Cargo.toml similarity index 95% rename from packages/proof-api/modules/besu-to-besu/Cargo.toml rename to packages/proof-api/modules/besu-to-eth/Cargo.toml index e609f4583..674b94e83 100644 --- a/packages/proof-api/modules/besu-to-besu/Cargo.toml +++ b/packages/proof-api/modules/besu-to-eth/Cargo.toml @@ -1,5 +1,5 @@ [package] -name = "proof-api-besu-to-besu" +name = "proof-api-besu-to-eth" version.workspace = true edition.workspace = true repository.workspace = true diff --git a/packages/proof-api/modules/besu-to-besu/src/lib.rs b/packages/proof-api/modules/besu-to-eth/src/lib.rs similarity index 91% rename from packages/proof-api/modules/besu-to-besu/src/lib.rs rename to packages/proof-api/modules/besu-to-eth/src/lib.rs index 0359896c2..c5c5882de 100644 --- a/packages/proof-api/modules/besu-to-besu/src/lib.rs +++ b/packages/proof-api/modules/besu-to-eth/src/lib.rs @@ -1,6 +1,6 @@ // SPDX-License-Identifier: Apache-2.0 -//! One-sided Besu-to-Besu proof API module. +//! One-sided Besu-to-Ethereum proof API module. #![deny(clippy::nursery, clippy::pedantic, warnings, unused_crate_dependencies)] #![allow(missing_docs)] @@ -27,9 +27,9 @@ use tracing as _; use tx_builder::TxBuilder; #[derive(Clone, Copy, Debug)] -pub struct BesuToBesuProofApiModule; +pub struct BesuToEthProofApiModule; -struct BesuToBesuProofApiModuleService { +struct BesuToEthProofApiModuleService { src_ics26_address: Address, src_listener: eth_eureka::ChainListener, dst_listener: eth_eureka::ChainListener, @@ -44,7 +44,7 @@ pub enum BesuConsensusType { } #[derive(Clone, Debug, serde::Deserialize, serde::Serialize)] -pub struct BesuToBesuConfig { +pub struct BesuToEthConfig { pub src_rpc_url: String, pub src_ics26_address: Address, pub dst_rpc_url: String, @@ -52,8 +52,8 @@ pub struct BesuToBesuConfig { pub consensus_type: BesuConsensusType, } -impl BesuToBesuProofApiModuleService { - async fn new(config: BesuToBesuConfig) -> anyhow::Result { +impl BesuToEthProofApiModuleService { + async fn new(config: BesuToEthConfig) -> anyhow::Result { let src_provider = RootProvider::builder() .connect(&config.src_rpc_url) .await @@ -85,7 +85,7 @@ impl BesuToBesuProofApiModuleService { } #[tonic::async_trait] -impl ProofApiService for BesuToBesuProofApiModuleService { +impl ProofApiService for BesuToEthProofApiModuleService { async fn info( &self, request: Request, @@ -203,28 +203,28 @@ impl ProofApiService for BesuToBesuProofApiModuleService { } #[tonic::async_trait] -impl ProofApiModule for BesuToBesuProofApiModule { +impl ProofApiModule for BesuToEthProofApiModule { fn name(&self) -> &'static str { - "besu_to_besu" + "besu_to_eth" } async fn create_service( &self, config: serde_json::Value, ) -> anyhow::Result> { - let config: BesuToBesuConfig = serde_json::from_value(config)?; - let service = BesuToBesuProofApiModuleService::new(config).await?; + let config: BesuToEthConfig = serde_json::from_value(config)?; + let service = BesuToEthProofApiModuleService::new(config).await?; Ok(Box::new(service)) } } #[cfg(test)] mod tests { - use super::BesuToBesuConfig; + use super::BesuToEthConfig; #[test] fn obsolete_src_chain_id_is_ignored() { - let config: BesuToBesuConfig = serde_json::from_value(serde_json::json!({ + let config: BesuToEthConfig = serde_json::from_value(serde_json::json!({ "src_chain_id": "legacy", "src_rpc_url": "http://localhost:8545", "src_ics26_address": "0x0000000000000000000000000000000000000001", diff --git a/packages/proof-api/modules/besu-to-besu/src/tx_builder.rs b/packages/proof-api/modules/besu-to-eth/src/tx_builder.rs similarity index 75% rename from packages/proof-api/modules/besu-to-besu/src/tx_builder.rs rename to packages/proof-api/modules/besu-to-eth/src/tx_builder.rs index 11a80d44c..e100bb891 100644 --- a/packages/proof-api/modules/besu-to-besu/src/tx_builder.rs +++ b/packages/proof-api/modules/besu-to-eth/src/tx_builder.rs @@ -7,10 +7,11 @@ use std::{ }; use alloy::{ + consensus::Header, network::Ethereum, primitives::{hex, Address, Bytes, B256, U256}, providers::{Provider, RootProvider}, - rpc::types::EIP1186StorageProof, + rpc::types::{EIP1186AccountProofResponse, EIP1186StorageProof}, sol_types::{SolCall, SolValue}, }; use alloy_rlp::Header as RlpHeader; @@ -26,12 +27,9 @@ use ibc_eureka_solidity_types::{ }, msgs::{IBesuLightClientMsgs, IICS02ClientMsgs::Height as MsgHeight}, }; -use proof_api_lib::{ - events::EurekaEventWithHeight, - utils::{ - eth_eureka::{src_events_to_recv_and_ack_msgs, target_events_to_timeout_msgs}, - RelayEventsParams, - }, +use proof_api_lib::utils::{ + eth_eureka::{src_events_to_recv_and_ack_msgs, target_events_to_timeout_msgs}, + RelayEventsParams, }; use rlp::Rlp; @@ -52,6 +50,11 @@ struct CreateClientParams { role_manager: Address, } +const TRUSTING_PERIOD: &str = "trusting_period"; +const MAX_CLOCK_DRIFT: &str = "max_clock_drift"; +const TRUSTED_HEIGHT: &str = "trusted_height"; +const ROLE_MANAGER: &str = "role_manager"; + impl TxBuilder { pub fn new( src_provider: RootProvider, @@ -84,18 +87,16 @@ impl TxBuilder { .context("failed to fetch latest source block number")?, }; - let block = EthApiClient::new(self.src_provider.clone()) - .get_block(trusted_height) + let header = self + .fetch_source_header(trusted_height) .await .with_context(|| format!("failed to fetch source block at height {trusted_height}"))?; - let header = block.into_consensus_header(); - let header_rlp = alloy_rlp::encode(&header); let validators = - extract_validators_from_header_extra_data(&header_rlp).with_context(|| { + extract_validators_from_extra_data(&header.extra_data).with_context(|| { format!("failed to extract validators from source block {trusted_height}") })?; - let (storage_root, _) = self - .fetch_source_account_proof(trusted_height) + let proof = self + .fetch_source_proofs(trusted_height, &[]) .await .with_context(|| { format!( @@ -109,7 +110,7 @@ impl TxBuilder { *self.src_ics26_router.address(), trusted_height, header.timestamp, - storage_root, + proof.storage_hash, validators, params.trusting_period, params.max_clock_drift, @@ -123,7 +124,7 @@ impl TxBuilder { *self.src_ics26_router.address(), trusted_height, header.timestamp, - storage_root, + proof.storage_hash, validators, params.trusting_period, params.max_clock_drift, @@ -150,12 +151,12 @@ impl TxBuilder { .get_block_number() .await .context("failed to fetch latest source block number")?; - let header_rlp = self - .fetch_source_header_rlp(target_height) + let header = self + .fetch_source_header(target_height) .await .with_context(|| format!("failed to fetch source block at height {target_height}"))?; - let (_, account_proof) = self - .fetch_source_account_proof(target_height) + let proof = self + .fetch_source_proofs(target_height, &[]) .await .with_context(|| { format!("failed to fetch account proof for source router at height {target_height}") @@ -164,19 +165,24 @@ impl TxBuilder { Ok(Self::build_update_client_calldata( dst_client_id, trusted_height, - header_rlp, - account_proof, + header, + encode_rlp_node_list(&proof.account_proof), )) } pub async fn relay_events(&self, params: RelayEventsParams) -> Result> { - let proof_height = select_proof_height(¶ms.src_events, params.timeout_relay_height)?; - let proof_block = EthApiClient::new(self.src_provider.clone()) - .get_block(proof_height) + let proof_height = params + .src_events + .iter() + .map(|event| event.height) + .chain(params.timeout_relay_height) + .max() + .ok_or_else(|| anyhow!("no packets collected"))?; + let header = self + .fetch_source_header(proof_height) .await .with_context(|| format!("failed to fetch source block at height {proof_height}"))?; - let proof_timestamp = proof_block.header.timestamp; - let header_rlp = alloy_rlp::encode(proof_block.into_consensus_header()); + let proof_timestamp = header.timestamp; let now = std::time::SystemTime::now() .duration_since(UNIX_EPOCH) .context("failed to read system time")? @@ -224,7 +230,7 @@ impl TxBuilder { .collect::>(); storage_keys.sort_unstable(); storage_keys.dedup(); - let (_, account_proof, storage_proofs) = self + let proof = self .fetch_source_proofs(proof_height, &storage_keys) .await .with_context(|| { @@ -232,10 +238,12 @@ impl TxBuilder { "failed to fetch account and storage proofs for source router at height {proof_height}" ) })?; + let account_proof = encode_rlp_node_list(&proof.account_proof); + let storage_proofs = map_storage_proofs(&storage_keys, proof.storage_proof)?; let update_call = Self::build_update_client_calldata( ¶ms.dst_client_id, client_state.latestHeight.revisionHeight, - header_rlp, + header, account_proof, ); @@ -256,11 +264,11 @@ impl TxBuilder { fn build_update_client_calldata( dst_client_id: &str, trusted_height: u64, - header_rlp: Vec, + header: Header, account_proof: Vec, ) -> Vec { let update_msg = IBesuLightClientMsgs::MsgUpdateClient { - headerRlp: header_rlp.into(), + headerRlp: alloy_rlp::encode(header).into(), trustedHeight: MsgHeight { revisionNumber: 0, revisionHeight: trusted_height, @@ -275,25 +283,20 @@ impl TxBuilder { .abi_encode() } - async fn fetch_source_header_rlp(&self, block_height: u64) -> Result> { + async fn fetch_source_header(&self, block_height: u64) -> Result
{ let block = EthApiClient::new(self.src_provider.clone()) .get_block(block_height) .await .with_context(|| format!("failed to fetch source block at height {block_height}"))?; - Ok(alloy_rlp::encode(block.into_consensus_header())) - } - - async fn fetch_source_account_proof(&self, block_height: u64) -> Result<(B256, Vec)> { - let (storage_hash, account_proof, _) = self.fetch_source_proofs(block_height, &[]).await?; - Ok((storage_hash, account_proof)) + Ok(block.into_consensus_header()) } async fn fetch_source_proofs( &self, block_height: u64, storage_keys: &[B256], - ) -> Result<(B256, Vec, HashMap>)> { - let proof = EthApiClient::new(self.src_provider.clone()) + ) -> Result { + Ok(EthApiClient::new(self.src_provider.clone()) .get_proof( &self.src_ics26_router.address().to_string(), storage_keys @@ -302,14 +305,7 @@ impl TxBuilder { .collect(), format!("0x{block_height:x}"), ) - .await?; - let storage_proofs = map_storage_proofs(storage_keys, proof.storage_proof)?; - - Ok(( - proof.storage_hash, - encode_rlp_node_list(&proof.account_proof), - storage_proofs, - )) + .await?) } async fn fetch_destination_client_state( @@ -397,40 +393,42 @@ fn map_storage_proofs( } fn parse_create_client_params(parameters: &HashMap) -> Result { - for key in parameters.keys() { - if !matches!( - key.as_str(), - "trusting_period" | "max_clock_drift" | "trusted_height" | "role_manager" - ) { - bail!( - "unexpected parameter `{key}`, only `trusting_period`, `max_clock_drift`, `trusted_height`, and `role_manager` are allowed" - ); - } - } + parameters + .keys() + .find(|key| { + ![TRUSTING_PERIOD, MAX_CLOCK_DRIFT, TRUSTED_HEIGHT, ROLE_MANAGER] + .contains(&key.as_str()) + }) + .map_or(Ok(()), |key| { + Err(anyhow!( + "unexpected parameter `{key}`, only `{TRUSTING_PERIOD}`, `{MAX_CLOCK_DRIFT}`, `{TRUSTED_HEIGHT}`, and `{ROLE_MANAGER}` are allowed" + )) + })?; Ok(CreateClientParams { trusting_period: parameters - .get("trusting_period") - .ok_or_else(|| anyhow!("missing `trusting_period` parameter"))? + .get(TRUSTING_PERIOD) + .ok_or_else(|| anyhow!("missing `{TRUSTING_PERIOD}` parameter"))? .parse() - .context("failed to parse `trusting_period` as decimal seconds")?, + .with_context(|| format!("failed to parse `{TRUSTING_PERIOD}` as decimal seconds"))?, max_clock_drift: parameters - .get("max_clock_drift") - .ok_or_else(|| anyhow!("missing `max_clock_drift` parameter"))? + .get(MAX_CLOCK_DRIFT) + .ok_or_else(|| anyhow!("missing `{MAX_CLOCK_DRIFT}` parameter"))? .parse() - .context("failed to parse `max_clock_drift` as decimal seconds")?, + .with_context(|| format!("failed to parse `{MAX_CLOCK_DRIFT}` as decimal seconds"))?, trusted_height: parameters - .get("trusted_height") + .get(TRUSTED_HEIGHT) .map(|value| { - value - .parse() - .context("failed to parse `trusted_height` as decimal block height") + value.parse().with_context(|| { + format!("failed to parse `{TRUSTED_HEIGHT}` as decimal block height") + }) }) .transpose()?, role_manager: parameters - .get("role_manager") + .get(ROLE_MANAGER) .map_or(Ok(Address::ZERO), |value| { - Address::from_str(value).context("failed to parse `role_manager` as hex address") + Address::from_str(value) + .with_context(|| format!("failed to parse `{ROLE_MANAGER}` as hex address")) })?, }) } @@ -449,13 +447,7 @@ fn encode_rlp_node_list(nodes: &[Bytes]) -> Vec { encoded } -fn extract_validators_from_header_extra_data(header_rlp: &[u8]) -> Result> { - let header = Rlp::new(header_rlp); - let extra_data = header - .at(12) - .context("failed to read header extraData field")? - .data() - .context("failed to decode header extraData bytes")?; +fn extract_validators_from_extra_data(extra_data: &[u8]) -> Result> { let extra_data = Rlp::new(extra_data); let validators = extra_data .at(1) @@ -478,33 +470,15 @@ fn extract_validators_from_header_extra_data(header_rlp: &[u8]) -> Result, -) -> Result { - match ( - src_events.iter().map(|event| event.height).max(), - timeout_relay_height, - ) { - (Some(src_height), Some(timeout_height)) => Ok(src_height.max(timeout_height)), - (Some(src_height), None) => Ok(src_height), - (None, Some(timeout_height)) => Ok(timeout_height), - (None, None) => bail!("no packets collected"), - } -} - #[cfg(test)] mod tests { - use super::{ - encode_rlp_node_list, extract_validators_from_header_extra_data, map_storage_proofs, - select_proof_height, - }; + use super::{encode_rlp_node_list, extract_validators_from_extra_data, map_storage_proofs}; use alloy::{ + consensus::Header, primitives::{hex, Address, Bytes, B256, U256}, rpc::types::EIP1186StorageProof, }; - use ibc_eureka_solidity_types::ics26::IICS26RouterMsgs::{Packet, Payload}; - use proof_api_lib::events::{EurekaEvent, EurekaEventWithHeight}; + use alloy_rlp::Decodable; use serde::Deserialize; use std::str::FromStr; @@ -550,27 +524,12 @@ mod tests { .collect() } - fn packet(sequence: u64) -> Packet { - Packet { - sequence, - sourceClient: "src-client".to_string(), - destClient: "dst-client".to_string(), - timeoutTimestamp: u64::MAX, - payloads: vec![Payload { - sourcePort: "transfer".to_string(), - destPort: "transfer".to_string(), - version: "ics20-1".to_string(), - encoding: "abi".to_string(), - value: Bytes::default(), - }], - } - } - #[test] fn extracts_validators_from_fixture_header() { let fixture = load_fixture(); let header_rlp = decode_hex_bytes(&fixture.non_adjacent_update.header_rlp); - let validators = extract_validators_from_header_extra_data(&header_rlp).unwrap(); + let header = Header::decode(&mut header_rlp.as_slice()).unwrap(); + let validators = extract_validators_from_extra_data(&header.extra_data).unwrap(); let expected = fixture .non_adjacent_update .expected_validators @@ -651,26 +610,4 @@ mod tests { .contains("unexpected storage proof") ); } - - #[test] - fn selects_max_proof_height() { - let src_events = vec![ - EurekaEventWithHeight { - event: EurekaEvent::SendPacket(packet(3)), - height: 10, - }, - EurekaEventWithHeight { - event: EurekaEvent::WriteAcknowledgement( - packet(4), - vec![Bytes::from(vec![b'a', b'c', b'k'])], - ), - height: 12, - }, - ]; - - assert_eq!(select_proof_height(&src_events, None).unwrap(), 12); - assert_eq!(select_proof_height(&[], Some(15)).unwrap(), 15); - assert_eq!(select_proof_height(&src_events, Some(11)).unwrap(), 12); - assert_eq!(select_proof_height(&src_events, Some(14)).unwrap(), 14); - } } diff --git a/packages/solidity/src/ics26.rs b/packages/solidity/src/ics26.rs index b203fb438..2d6dbd46d 100644 --- a/packages/solidity/src/ics26.rs +++ b/packages/solidity/src/ics26.rs @@ -89,29 +89,6 @@ impl IICS26RouterMsgs::Packet { } } -/// Returns the acknowledgement commitment for one or more acknowledgements. -/// -/// # Errors -/// Returns [`NoAcknowledgements`] when `acks` is empty. -pub fn acknowledgement_commitment( - acks: &[alloy_primitives::Bytes], -) -> Result<[u8; 32], NoAcknowledgements> { - if acks.is_empty() { - return Err(NoAcknowledgements); - } - - let mut buf = vec![2_u8]; - for ack in acks { - buf.extend_from_slice(&Sha256::digest(ack)); - } - Ok(Sha256::digest(&buf).into()) -} - -/// Acknowledgement commitments require at least one acknowledgement. -#[derive(Debug, PartialEq, Eq, thiserror::Error)] -#[error("no acknowledgements provided")] -pub struct NoAcknowledgements; - impl From for IICS26RouterMsgs::Packet { fn from(packet: Packet) -> Self { Self { @@ -191,24 +168,3 @@ impl IICS26RouterMsgs::Payload { final_hash.to_vec() } } - -#[cfg(test)] -mod tests { - use super::*; - - #[test] - fn acknowledgement_commitment_rejects_empty_acknowledgements() { - assert_eq!(acknowledgement_commitment(&[]), Err(NoAcknowledgements)); - } - - #[test] - fn acknowledgement_commitment_matches_ics24_vector() { - let commitment = - acknowledgement_commitment(&[alloy_primitives::Bytes::from_static(b"some bytes")]) - .unwrap(); - assert_eq!( - alloy_primitives::hex::encode(commitment), - "f03b4667413e56aaf086663267913e525c442b56fa1af4fa3f3dab9f37044c5b" - ); - } -} diff --git a/programs/proof-api/Cargo.toml b/programs/proof-api/Cargo.toml index 54fd4541a..4263d9d31 100644 --- a/programs/proof-api/Cargo.toml +++ b/programs/proof-api/Cargo.toml @@ -11,7 +11,7 @@ proof-api-eth-to-cosmos = { workspace = true, default-features = false } proof-api-eth-to-cosmos-compat = { workspace = true, default-features = false } proof-api-cosmos-to-eth = { workspace = true, default-features = false } proof-api-eth-to-eth = { workspace = true, default-features = false } -proof-api-besu-to-besu = { workspace = true, default-features = false } +proof-api-besu-to-eth = { workspace = true, default-features = false } proof-api-cosmos-to-cosmos = { workspace = true, default-features = false } proof-api-solana-to-cosmos = { workspace = true, default-features = false } proof-api-cosmos-to-solana = { workspace = true, default-features = false } diff --git a/programs/proof-api/README.md b/programs/proof-api/README.md index f85e7c91f..81072bccd 100644 --- a/programs/proof-api/README.md +++ b/programs/proof-api/README.md @@ -23,7 +23,7 @@ Each module runs in one direction and specializes in how it builds proofs and tr | `cosmos_to_eth` | Cosmos SDK | EVM | Parse Cosmos events, build EVM IBC txs | `sp1` — ZK proofs via SP1
`attested` — multisig attestations | | `eth_to_cosmos` | EVM | Cosmos SDK | Parse EVM events, build Cosmos IBC txs | `real` — ethereum mainnet beacon API proofs
`mock` — dev/test mode
`attested` — multisig attestations | | `eth_to_eth` | EVM | EVM | Parse EVM events, build attested txs | `attested` — multisig attestations | -| `besu_to_besu` | Besu BFT EVM | Besu BFT EVM | Parse EVM events, build Besu real-proof txs | direct Besu light-client updates + Besu account/storage proofs | +| `besu_to_eth` | Besu BFT EVM | EVM | Parse EVM events, build EVM real-proof txs | direct Besu light-client updates + Besu account/storage proofs | | `cosmos_to_cosmos` | Cosmos SDK | Cosmos SDK | Parse Cosmos events, build Cosmos IBC txs | ICS-07 light client proofs only (validator signatures and merkle proofs) | | `cosmos_to_solana` | Cosmos SDK | Solana | Parse Cosmos events, build Solana IBC txs | ICS-07 light client proofs only (validator signatures and merkle proofs) | | `solana_to_cosmos` | Solana | Cosmos SDK | Parse Solana events, build Cosmos IBC txs | multisig attestations only | @@ -125,10 +125,10 @@ Module configuration varies by module type: - `mode.cache`: Optional cache config. - `mode.cache.state_cache_max_entries`. (default: 10000) - `mode.cache.packet_cache_max_entries`. (default: 10000) -- `besu_to_besu`: +- `besu_to_eth`: - `src_rpc_url`: Source Besu RPC endpoint. - `src_ics26_address`: Source IBC router contract address. - - `dst_rpc_url`: Destination Besu RPC endpoint. + - `dst_rpc_url`: Destination EVM RPC endpoint. - `dst_ics26_address`: Destination IBC router contract address. - `consensus_type`: Source Besu consensus type, `qbft` or `ibft2`. - `cosmos_to_cosmos`: @@ -149,9 +149,9 @@ Module configuration varies by module type: - `signer_address`: Cosmos address used for message construction metadata. - `solana_ics26_program_id`: Solana ICS26 router program ID. -## `besu_to_besu` create-client parameters +## `besu_to_eth` create-client parameters -`besu_to_besu` `CreateClient` returns only deployment calldata for `BesuQBFTLightClient` or `BesuIBFT2LightClient`. It does not call `ICS26Router.addClient(...)`. +`besu_to_eth` `CreateClient` returns only deployment calldata for `BesuQBFTLightClient` or `BesuIBFT2LightClient`. It does not call `ICS26Router.addClient(...)`. Required parameters: - `trusting_period`: Decimal seconds for the weak-subjectivity window. diff --git a/programs/proof-api/config.example.json b/programs/proof-api/config.example.json index b6ebc1a68..883a02bf9 100644 --- a/programs/proof-api/config.example.json +++ b/programs/proof-api/config.example.json @@ -147,7 +147,7 @@ } }, { - "name": "besu_to_besu", + "name": "besu_to_eth", "src_chain": "besu-a", "dst_chain": "besu-b", "enabled": false, diff --git a/programs/proof-api/src/bin/proof-api.rs b/programs/proof-api/src/bin/proof-api.rs index b9afa02a6..d9c151efe 100644 --- a/programs/proof-api/src/bin/proof-api.rs +++ b/programs/proof-api/src/bin/proof-api.rs @@ -5,7 +5,7 @@ use std::{net::SocketAddr, path::PathBuf}; use clap::Parser; use proof_api::cli::{Commands, ProofApiCli}; use proof_api::observability::init_observability; -use proof_api_besu_to_besu::BesuToBesuProofApiModule; +use proof_api_besu_to_eth::BesuToEthProofApiModule; use proof_api_core::{builder::ProofApiBuilder, config::ProofApiConfig}; use proof_api_cosmos_to_cosmos::CosmosToCosmosProofApiModule; use proof_api_cosmos_to_eth::CosmosToEthProofApiModule; @@ -48,7 +48,7 @@ async fn main() -> anyhow::Result<()> { proof_api_builder.add_module(EthToCosmosProofApiModule); proof_api_builder.add_module(EthToCosmosCompatProofApiModule); proof_api_builder.add_module(EthToEthProofApiModule); - proof_api_builder.add_module(BesuToBesuProofApiModule); + proof_api_builder.add_module(BesuToEthProofApiModule); proof_api_builder.add_module(SolanaToCosmosProofApiModule); proof_api_builder.add_module(CosmosToSolanaProofApiModule); proof_api_builder.add_module(EthToSolanaProofApiModule); From 577dc1f045d17337140189e3b46d582352de7f29 Mon Sep 17 00:00:00 2001 From: Gjermund Garaba Date: Thu, 20 Aug 2026 13:47:42 +0200 Subject: [PATCH 21/22] rework MPT proof verification, fold RLPReader into MPTProof Signed-off-by: Gjermund Garaba --- ibc-solidity/abi/BesuIBFT2LightClient.json | 46 +- ibc-solidity/abi/BesuQBFTLightClient.json | 46 +- .../abi/bytecode/BesuIBFT2LightClient.json | 2 +- .../abi/bytecode/BesuQBFTLightClient.json | 2 +- .../besu/BesuLightClientBase.sol | 114 ++-- .../contracts/light-clients/besu/MPTProof.sol | 520 ++++++++++-------- .../contracts/light-clients/besu/README.md | 40 +- .../light-clients/besu/RLPReader.sol | 300 ---------- .../besu/errors/IBesuLightClientErrors.sol | 13 +- .../BesuLightClientFixtureTestBase.sol | 123 ++++- .../test/besu-bft/BesuLightClientQuorum.t.sol | 2 +- ibc-solidity/test/besu-bft/MPTProof.t.sol | 125 +++++ 12 files changed, 739 insertions(+), 594 deletions(-) delete mode 100644 ibc-solidity/contracts/light-clients/besu/RLPReader.sol create mode 100644 ibc-solidity/test/besu-bft/MPTProof.t.sol diff --git a/ibc-solidity/abi/BesuIBFT2LightClient.json b/ibc-solidity/abi/BesuIBFT2LightClient.json index b3b7b9852..76318a273 100644 --- a/ibc-solidity/abi/BesuIBFT2LightClient.json +++ b/ibc-solidity/abi/BesuIBFT2LightClient.json @@ -448,6 +448,17 @@ } ] }, + { + "type": "error", + "name": "AccountNotFound", + "inputs": [ + { + "name": "account", + "type": "address", + "internalType": "address" + } + ] + }, { "type": "error", "name": "ConflictingConsensusState", @@ -644,7 +655,13 @@ { "type": "error", "name": "InvalidHeaderTimestamp", - "inputs": [] + "inputs": [ + { + "name": "actualTimestamp", + "type": "uint256", + "internalType": "uint256" + } + ] }, { "type": "error", @@ -744,6 +761,33 @@ } ] }, + { + "type": "error", + "name": "InvalidVanityDataLength", + "inputs": [ + { + "name": "length", + "type": "uint256", + "internalType": "uint256" + } + ] + }, + { + "type": "error", + "name": "RLPInvalidEncoding", + "inputs": [] + }, + { + "type": "error", + "name": "TrieProofTraversalError", + "inputs": [ + { + "name": "err", + "type": "uint8", + "internalType": "enum MPTProof.ProofError" + } + ] + }, { "type": "error", "name": "UnsupportedMisbehaviour", diff --git a/ibc-solidity/abi/BesuQBFTLightClient.json b/ibc-solidity/abi/BesuQBFTLightClient.json index b3b7b9852..76318a273 100644 --- a/ibc-solidity/abi/BesuQBFTLightClient.json +++ b/ibc-solidity/abi/BesuQBFTLightClient.json @@ -448,6 +448,17 @@ } ] }, + { + "type": "error", + "name": "AccountNotFound", + "inputs": [ + { + "name": "account", + "type": "address", + "internalType": "address" + } + ] + }, { "type": "error", "name": "ConflictingConsensusState", @@ -644,7 +655,13 @@ { "type": "error", "name": "InvalidHeaderTimestamp", - "inputs": [] + "inputs": [ + { + "name": "actualTimestamp", + "type": "uint256", + "internalType": "uint256" + } + ] }, { "type": "error", @@ -744,6 +761,33 @@ } ] }, + { + "type": "error", + "name": "InvalidVanityDataLength", + "inputs": [ + { + "name": "length", + "type": "uint256", + "internalType": "uint256" + } + ] + }, + { + "type": "error", + "name": "RLPInvalidEncoding", + "inputs": [] + }, + { + "type": "error", + "name": "TrieProofTraversalError", + "inputs": [ + { + "name": "err", + "type": "uint8", + "internalType": "enum MPTProof.ProofError" + } + ] + }, { "type": "error", "name": "UnsupportedMisbehaviour", diff --git a/ibc-solidity/abi/bytecode/BesuIBFT2LightClient.json b/ibc-solidity/abi/bytecode/BesuIBFT2LightClient.json index c8cbdaa4e..8af2af480 100644 --- a/ibc-solidity/abi/bytecode/BesuIBFT2LightClient.json +++ b/ibc-solidity/abi/bytecode/BesuIBFT2LightClient.json @@ -1 +1 @@ -{"abi":[{"type":"constructor","inputs":[{"name":"ibcRouter","type":"address","internalType":"address"},{"name":"initialTrustedHeight","type":"uint64","internalType":"uint64"},{"name":"initialTrustedTimestamp","type":"uint64","internalType":"uint64"},{"name":"initialTrustedStorageRoot","type":"bytes32","internalType":"bytes32"},{"name":"initialTrustedValidators","type":"address[]","internalType":"address[]"},{"name":"trustingPeriod","type":"uint64","internalType":"uint64"},{"name":"maxClockDrift","type":"uint64","internalType":"uint64"},{"name":"roleManager","type":"address","internalType":"address"}],"stateMutability":"nonpayable"},{"type":"function","name":"DEFAULT_ADMIN_ROLE","inputs":[],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"type":"function","name":"PROOF_SUBMITTER_ROLE","inputs":[],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"type":"function","name":"getClientState","inputs":[],"outputs":[{"name":"","type":"bytes","internalType":"bytes"}],"stateMutability":"view"},{"type":"function","name":"getConsensusState","inputs":[{"name":"revisionHeight","type":"uint64","internalType":"uint64"}],"outputs":[{"name":"","type":"bytes","internalType":"bytes"}],"stateMutability":"view"},{"type":"function","name":"getRoleAdmin","inputs":[{"name":"role","type":"bytes32","internalType":"bytes32"}],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"type":"function","name":"grantRole","inputs":[{"name":"role","type":"bytes32","internalType":"bytes32"},{"name":"account","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"hasRole","inputs":[{"name":"role","type":"bytes32","internalType":"bytes32"},{"name":"account","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"misbehaviour","inputs":[{"name":"","type":"bytes","internalType":"bytes"}],"outputs":[],"stateMutability":"view"},{"type":"function","name":"renounceRole","inputs":[{"name":"role","type":"bytes32","internalType":"bytes32"},{"name":"callerConfirmation","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"revokeRole","inputs":[{"name":"role","type":"bytes32","internalType":"bytes32"},{"name":"account","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"supportsInterface","inputs":[{"name":"interfaceId","type":"bytes4","internalType":"bytes4"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"updateClient","inputs":[{"name":"updateMsg","type":"bytes","internalType":"bytes"}],"outputs":[{"name":"","type":"uint8","internalType":"enum ILightClientMsgs.UpdateResult"}],"stateMutability":"nonpayable"},{"type":"function","name":"verifyMembership","inputs":[{"name":"msg_","type":"tuple","internalType":"struct ILightClientMsgs.MsgVerifyMembership","components":[{"name":"proof","type":"bytes","internalType":"bytes"},{"name":"proofHeight","type":"tuple","internalType":"struct IICS02ClientMsgs.Height","components":[{"name":"revisionNumber","type":"uint64","internalType":"uint64"},{"name":"revisionHeight","type":"uint64","internalType":"uint64"}]},{"name":"path","type":"bytes[]","internalType":"bytes[]"},{"name":"value","type":"bytes","internalType":"bytes"}]}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"verifyNonMembership","inputs":[{"name":"msg_","type":"tuple","internalType":"struct ILightClientMsgs.MsgVerifyNonMembership","components":[{"name":"proof","type":"bytes","internalType":"bytes"},{"name":"proofHeight","type":"tuple","internalType":"struct IICS02ClientMsgs.Height","components":[{"name":"revisionNumber","type":"uint64","internalType":"uint64"},{"name":"revisionHeight","type":"uint64","internalType":"uint64"}]},{"name":"path","type":"bytes[]","internalType":"bytes[]"}]}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"event","name":"RoleAdminChanged","inputs":[{"name":"role","type":"bytes32","indexed":true,"internalType":"bytes32"},{"name":"previousAdminRole","type":"bytes32","indexed":true,"internalType":"bytes32"},{"name":"newAdminRole","type":"bytes32","indexed":true,"internalType":"bytes32"}],"anonymous":false},{"type":"event","name":"RoleGranted","inputs":[{"name":"role","type":"bytes32","indexed":true,"internalType":"bytes32"},{"name":"account","type":"address","indexed":true,"internalType":"address"},{"name":"sender","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"type":"event","name":"RoleRevoked","inputs":[{"name":"role","type":"bytes32","indexed":true,"internalType":"bytes32"},{"name":"account","type":"address","indexed":true,"internalType":"address"},{"name":"sender","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"type":"error","name":"AccessControlBadConfirmation","inputs":[]},{"type":"error","name":"AccessControlUnauthorizedAccount","inputs":[{"name":"account","type":"address","internalType":"address"},{"name":"neededRole","type":"bytes32","internalType":"bytes32"}]},{"type":"error","name":"ConflictingConsensusState","inputs":[{"name":"revisionHeight","type":"uint64","internalType":"uint64"}]},{"type":"error","name":"ConsensusStateExpired","inputs":[{"name":"trustedTimestamp","type":"uint64","internalType":"uint64"},{"name":"currentTimestamp","type":"uint256","internalType":"uint256"},{"name":"trustingPeriod","type":"uint64","internalType":"uint64"}]},{"type":"error","name":"ConsensusStateNotFound","inputs":[{"name":"revisionHeight","type":"uint64","internalType":"uint64"}]},{"type":"error","name":"DuplicateCommitSealSigner","inputs":[{"name":"signer","type":"address","internalType":"address"}]},{"type":"error","name":"DuplicateValidator","inputs":[{"name":"validator","type":"address","internalType":"address"}]},{"type":"error","name":"EmptyValidatorSet","inputs":[]},{"type":"error","name":"HeaderFromFuture","inputs":[{"name":"currentTimestamp","type":"uint256","internalType":"uint256"},{"name":"headerTimestamp","type":"uint256","internalType":"uint256"},{"name":"maxClockDrift","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"InsufficientTrustedValidatorOverlap","inputs":[{"name":"actual","type":"uint256","internalType":"uint256"},{"name":"required","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"InsufficientValidatorQuorum","inputs":[{"name":"actual","type":"uint256","internalType":"uint256"},{"name":"required","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"InvalidCommitSeal","inputs":[]},{"type":"error","name":"InvalidCommitmentValue","inputs":[{"name":"expectedValue","type":"bytes32","internalType":"bytes32"},{"name":"actualValue","type":"bytes32","internalType":"bytes32"}]},{"type":"error","name":"InvalidDifficulty","inputs":[{"name":"actualDifficulty","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"InvalidECDSASignatureLength","inputs":[{"name":"length","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"InvalidExtraDataFormat","inputs":[{"name":"itemsLength","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"InvalidHeaderFormat","inputs":[{"name":"itemsLength","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"InvalidHeaderHeight","inputs":[]},{"type":"error","name":"InvalidHeaderTimestamp","inputs":[]},{"type":"error","name":"InvalidMixHash","inputs":[{"name":"actualMixHash","type":"bytes32","internalType":"bytes32"}]},{"type":"error","name":"InvalidNonce","inputs":[{"name":"actualNonce","type":"bytes","internalType":"bytes"}]},{"type":"error","name":"InvalidOmmersHash","inputs":[{"name":"actualOmmersHash","type":"bytes32","internalType":"bytes32"}]},{"type":"error","name":"InvalidPathLength","inputs":[{"name":"expectedLength","type":"uint256","internalType":"uint256"},{"name":"actualLength","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"InvalidRevisionNumber","inputs":[{"name":"providedRevisionNumber","type":"uint64","internalType":"uint64"}]},{"type":"error","name":"InvalidValidatorAddress","inputs":[{"name":"validator","type":"address","internalType":"address"}]},{"type":"error","name":"InvalidValidatorAddressLength","inputs":[{"name":"length","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"InvalidValueLength","inputs":[{"name":"expectedLength","type":"uint256","internalType":"uint256"},{"name":"actualLength","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"UnsupportedMisbehaviour","inputs":[]},{"type":"error","name":"ValueExists","inputs":[{"name":"actualValue","type":"bytes32","internalType":"bytes32"}]}],"bytecode":{"object":"0x6080604052346103d8576138eb80380380610019816103dc565b928339810190610100818303126103d85761003381610401565b9061004060208201610415565b9061004d60408201610415565b92606082015191608081015160018060401b0381116103d85781019286601f850112156103d8578351966001600160401b03881161037f578760051b9460206100978188016103dc565b809a81520190602082978201019283116103d857602001905b8282106103c0575050506100c660a08301610415565b956100df60e06100d860c08601610415565b9401610401565b956001600160401b03169081156103b1576001600160401b03169283156103a257885115610393575f5b89518110156101bf576001600160a01b03610124828c610429565b511615610198575f5b81811061013d5750600101610109565b6001600160a01b0361014f828d610429565b51166001600160a01b03610163848e610429565b5116146101725760010161012d565b6001600160a01b03610184838d610429565b511663107f863360e21b5f5260045260245ffd5b6001600160a01b03906101ab908b610429565b51166359bff38760e01b5f5260045260245ffd5b5060408051979896978a979181016001600160401b0381118282101761037f576040525f81526020810190848252604051926080840198848a1060018060401b038b111761037f576040998a526001600160a01b031680855260208086018490526001600160401b03928316868c01819052878416606090970196909652600180546001600160a01b031916909217825592516002805495516fffffffffffffffff0000000000000000908d1b81169285166001600160801b03199788161792909217815560038054988d1b90921697909516909517959095179093555f948552600490529590922080546001600160401b031916949094178455830191909155925193910191831161037f5768010000000000000000831161037f578154838355808410610359575b50905f5260205f205f5b83811061033c57846001600160a01b0381166103235750610312610547565b505b60405161328190816105ca8239f35b8061033061033692610451565b506104c7565b50610314565b82516001600160a01b0316818301556020909201916001016102f3565b825f528360205f2091820191015b81811061037457506102e9565b5f8155600101610367565b634e487b7160e01b5f52604160045260245ffd5b63339e1ffb60e01b5f5260045ffd5b63574f4e6160e01b5f5260045ffd5b6359d119e360e01b5f5260045ffd5b602080916103cd84610401565b8152019101906100b0565b5f80fd5b6040519190601f01601f191682016001600160401b0381118382101761037f57604052565b51906001600160a01b03821682036103d857565b51906001600160401b03821682036103d857565b805182101561043d5760209160051b010190565b634e487b7160e01b5f52603260045260245ffd5b6001600160a01b0381165f9081525f5160206138cb5f395f51905f52602052604090205460ff166104c2576001600160a01b03165f8181525f5160206138cb5f395f51905f5260205260408120805460ff191660011790553391905f51602061384b5f395f51905f528180a4600190565b505f90565b6001600160a01b0381165f9081525f51602061386b5f395f51905f52602052604090205460ff166104c2576001600160a01b03165f8181525f51602061386b5f395f51905f5260205260408120805460ff191660011790553391905f5160206138ab5f395f51905f52905f51602061384b5f395f51905f529080a4600190565b5f80525f51602061386b5f395f51905f526020525f51602061388b5f395f51905f525460ff166105c5575f8080525f51602061386b5f395f51905f526020525f51602061388b5f395f51905f52805460ff1916600117905533905f5160206138ab5f395f51905f525f51602061384b5f395f51905f528280a4600190565b5f9056fe60806040526004361015610011575f80fd5b5f3560e01c806301ffc9a7146100f45780630bece356146100ef578063248a9ca3146100ea5780632f2ff15d146100e557806336568abe146100e05780634d6d9ffb146100db5780635972185a146100d6578063682ed5f0146100d157806391d14854146100cc578063a217fddf146100c7578063d547741f146100c2578063ddba6537146100bd578063edce8bdc146100b85763ef913a4b146100b3575f80fd5b6109c8565b61095e565b61088b565b61085c565b610842565b6107f4565b6105e6565b6105ac565b6103ac565b610350565b61031a565b6102b5565b610217565b34610195576020600319360112610195576004357fffffffff00000000000000000000000000000000000000000000000000000000811680910361019557807f7965db0b000000000000000000000000000000000000000000000000000000006020921490811561016b575b506040519015158152f35b7f01ffc9a7000000000000000000000000000000000000000000000000000000009150145f610160565b5f80fd5b9060206003198301126101955760043567ffffffffffffffff811161019557826023820112156101955780600401359267ffffffffffffffff84116101955760248483010111610195576024019190565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b346101955761028161022836610199565b5f80527f4c48d1d2b0f4f7485fc28e3db22341d96a20aa29e6efa8149da9751603abd4e06020527f6e0c24a6e293ff9b755263dbaa15ba3796b0b8d3fe17cfb4ddf8143b268eac475490919060ff161561029957610d17565b6040516003821015610294576020918152f35b6101ea565b6102a1611275565b610d17565b90816020910312610195573590565b346101955760206003193601126101955760206102df6004355f525f602052600160405f20015490565b604051908152f35b6003196040910112610195576004359060243573ffffffffffffffffffffffffffffffffffffffff811681036101955790565b346101955761034e61032b366102e7565b90610349610344825f525f602052600160405f20015490565b6112fd565b612181565b005b346101955761035e366102e7565b3373ffffffffffffffffffffffffffffffffffffffff8216036103845761034e91612258565b7f6697b232000000000000000000000000000000000000000000000000000000005f5260045ffd5b346101955760206003193601126101955760043567ffffffffffffffff8111610195578060040160806003198336030112610195575f80527f4c48d1d2b0f4f7485fc28e3db22341d96a20aa29e6efa8149da9751603abd4e060205260ff7f6e0c24a6e293ff9b755263dbaa15ba3796b0b8d3fe17cfb4ddf8143b268eac4754161561059f575b61044761044260248401611133565b61136a565b60648201916001610458848461113d565b90500361056157906104a96104966104a261049d61049661049061048961048460446104e09a01611133565b611b0f565b988761113d565b9061120f565b3691610aff565b61232d565b92806111be565b906001840154906040516104d7816104c960208201948560209181520190565b03601f198101835282610aaf565b519020916123bb565b805161051f5761051b61050b6104fe845467ffffffffffffffff1690565b67ffffffffffffffff1690565b6040519081529081906020820190565b0390f35b61053361052e61055e92612500565b61252d565b7fd039601e000000000000000000000000000000000000000000000000000000005f52600452602490565b5ffd5b61055e61056e848461113d565b7f88b3170e000000000000000000000000000000000000000000000000000000005f52600160045260245250604490565b6105a7611275565b610433565b34610195575f6003193601126101955760206040517fbd893629a699470e4ec82a5715bb4981fdaacc5d0a728bf5f55b801d8f4ef10b8152f35b346101955760206003193601126101955760043567ffffffffffffffff8111610195578060040160a06003198336030112610195575f80527f4c48d1d2b0f4f7485fc28e3db22341d96a20aa29e6efa8149da9751603abd4e060205260ff7f6e0c24a6e293ff9b755263dbaa15ba3796b0b8d3fe17cfb4ddf8143b268eac475416156107e7575b61067c61044260248401611133565b6064820191600161068d848461113d565b90500361056157608481019060206106a583856111be565b9050036107a957906106f46104966106ed6106e56106de61049d6104966104906106d761048460446107149c01611133565b9b8b61113d565b94876111be565b8101906102a6565b94806111be565b906001850154906040516104d7816104c960208201948560209181520190565b8051156107755761052e61072791612500565b908082036107475761051b61050b6104fe855467ffffffffffffffff1690565b7f56ed1b63000000000000000000000000000000000000000000000000000000005f5260045260245260445ffd5b61055e827f56ed1b63000000000000000000000000000000000000000000000000000000005f52906044916004525f602452565b61055e6107b683856111be565b7f24fadac8000000000000000000000000000000000000000000000000000000005f52602060045260245250604490565b6107ef611275565b61066d565b3461019557602060ff610836610809366102e7565b905f525f845260405f209073ffffffffffffffffffffffffffffffffffffffff165f5260205260405f2090565b54166040519015158152f35b34610195575f6003193601126101955760206040515f8152f35b346101955761034e61086d366102e7565b90610886610344825f525f602052600160405f20015490565b612258565b346101955761089936610199565b50505f80527f4c48d1d2b0f4f7485fc28e3db22341d96a20aa29e6efa8149da9751603abd4e06020527f6e0c24a6e293ff9b755263dbaa15ba3796b0b8d3fe17cfb4ddf8143b268eac475460ff1615610915575b7f2c1ed462000000000000000000000000000000000000000000000000000000005f5260045ffd5b61091d611275565b6108ed565b67ffffffffffffffff81160361019557565b601f19601f602060409481855280519182918282880152018686015e5f8582860101520116010190565b346101955760206003193601126101955761051b61098160043561048481610922565b6109bc67ffffffffffffffff8254166104c9600184015493604051948593602085015260408401526060808401526002608084019101611228565b60405191829182610934565b34610195575f6003193601126101955761051b60405173ffffffffffffffffffffffffffffffffffffffff60015416602082015267ffffffffffffffff600254818116604084015260401c16606082015267ffffffffffffffff600354818116608084015260401c1660a082015260a081526109bc60c082610aaf565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b6060810190811067ffffffffffffffff821117610a8e57604052565b610a45565b6040810190811067ffffffffffffffff821117610a8e57604052565b90601f601f19910116810190811067ffffffffffffffff821117610a8e57604052565b60405190610ae1604083610aaf565b565b67ffffffffffffffff8111610a8e57601f01601f191660200190565b929192610b0b82610ae3565b91610b196040519384610aaf565b829481845281830111610195578281602093845f960137010152565b9080601f8301121561019557816020610b5093359101610aff565b90565b6020818303126101955780359067ffffffffffffffff8211610195570180820391608083126101955760405192610b8984610a72565b823567ffffffffffffffff811161019557604091610bac84601f19938701610b35565b8652011261019557604051610bc081610a93565b6020830135610bce81610922565b81526040830135610bde81610922565b60208201526020840152606082013567ffffffffffffffff811161019557610c069201610b35565b604082015290565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b9060018201809211610c4957565b610c0e565b91908201809211610c4957565b908160011b9180830460021490151715610c4957565b81519167ffffffffffffffff8311610a8e57680100000000000000008311610a8e578154838355808410610cf1575b506020610cb29101915f5260205f2090565b5f5b838110610cc15750505050565b6001906020610ce4855173ffffffffffffffffffffffffffffffffffffffff1690565b9401938184015501610cb4565b825f528360205f2091820191015b818110610d0c5750610ca0565b5f8155600101610cff565b610d2391810190610b53565b906020820191610d3f61044284515167ffffffffffffffff1690565b610d4981516115fb565b92604084019367ffffffffffffffff610d6a865167ffffffffffffffff1690565b161561110b576080810192610d8a6104fe855167ffffffffffffffff1690565b156110e3576003549267ffffffffffffffff604085901c16610dac8142610c4e565b865167ffffffffffffffff169081116110a45750505160200151610deb90610ddd9067ffffffffffffffff16611b0f565b9367ffffffffffffffff1690565b67ffffffffffffffff8116801515908161107b575b50611026575090610e6e91610e2f6002610e27610e1c85611b66565b60c086015190611c7b565b950185611e94565b610e3f60a0830194855190611fb9565b60406060610e6260015473ffffffffffffffffffffffffffffffffffffffff1690565b9301519101519161205c565b610e9b610e83865167ffffffffffffffff1690565b67ffffffffffffffff165f52600460205260405f2090565b610eb06104fe825467ffffffffffffffff1690565b610fb45750916002610f2e928694610f21610eec610edd610e83610f3c9a9b5167ffffffffffffffff1690565b955167ffffffffffffffff1690565b859067ffffffffffffffff167fffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000825416179055565b6001840155519101610c71565b5167ffffffffffffffff1690565b600254610f559060401c67ffffffffffffffff166104fe565b67ffffffffffffffff821611610f6a57505f90565b610fb0907fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff6fffffffffffffffff00000000000000006002549260401b16911617600255565b5f90565b91610fca610fd2945167ffffffffffffffff1690565b90519261210c565b6110205761055e610feb835167ffffffffffffffff1690565b7fc1aea5f7000000000000000000000000000000000000000000000000000000005f5267ffffffffffffffff16600452602490565b60029150565b61055e9061103c855467ffffffffffffffff1690565b7feae35725000000000000000000000000000000000000000000000000000000005f5267ffffffffffffffff9081166004524260245216604452606490565b905061109c42916110976104fe885467ffffffffffffffff1690565b610c4e565b11155f610e00565b7f9b772277000000000000000000000000000000000000000000000000000000005f524260045267ffffffffffffffff9081166024521660445260645ffd5b7f574f4e61000000000000000000000000000000000000000000000000000000005f5260045ffd5b7f59d119e3000000000000000000000000000000000000000000000000000000005f5260045ffd5b35610b5081610922565b9035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe181360301821215610195570180359067ffffffffffffffff821161019557602001918160051b3603831361019557565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b9035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe181360301821215610195570180359067ffffffffffffffff82116101955760200191813603831361019557565b9015611223578061121f916111be565b9091565b611191565b90602082549182815201915f5260205f20905f5b8181106112495750505090565b825473ffffffffffffffffffffffffffffffffffffffff1684526020909301926001928301920161123c565b335f9081527f4c48d1d2b0f4f7485fc28e3db22341d96a20aa29e6efa8149da9751603abd4e0602052604090205460ff16156112ad57565b7fe2517d3f000000000000000000000000000000000000000000000000000000005f52336004527fbd893629a699470e4ec82a5715bb4981fdaacc5d0a728bf5f55b801d8f4ef10b60245260445ffd5b805f525f60205260ff6113313360405f209073ffffffffffffffffffffffffffffffffffffffff165f5260205260405f2090565b54161561133b5750565b7fe2517d3f000000000000000000000000000000000000000000000000000000005f523360045260245260445ffd5b67ffffffffffffffff168061137c5750565b7f3ce598a9000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b6040519060e0820182811067ffffffffffffffff821117610a8e57604052606060c0838281528260208201525f60408201525f838201525f60808201528260a08201520152565b8051600110156112235760400190565b805160071015611223576101000190565b8051600d1015611223576101c00190565b8051600e1015611223576101e00190565b805160081015611223576101200190565b8051600310156112235760800190565b8051600b1015611223576101800190565b8051600c1015611223576101a00190565b8051600410156112235760a00190565b8051156112235760200190565b8051600210156112235760600190565b805160101015611223576102200190565b80518210156112235760209160051b010190565b67ffffffffffffffff8111610a8e5760051b60200190565b906114e8826114c6565b6114f56040519182610aaf565b828152601f1961150582946114c6565b0190602036910137565b90602082519201517fffffffffffffffffffffffffffffffffffffffff00000000000000000000000081169260148110611547575050565b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000929350829060140360031b1b161690565b60405160a0919061158a8382610aaf565b6004815291601f1901825f5b8281106115a257505050565b806060602080938501015201611596565b906115bd826114c6565b6115ca6040519182610aaf565b828152601f196115da82946114c6565b01905f5b8281106115ea57505050565b8060606020809385010152016115de565b61161461160f6116096113a7565b92612500565b61256f565b80825251600f8110611ae457507f1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d4934761165561164f83516113ee565b5161263a565b03611aa957600161166f61166983516113fe565b5161252d565b03611a6e577f63746963616c2062797a616e74696e65206661756c7420746f6c6572616e63656116a261164f835161140f565b03611a33576116ba6116b48251611420565b51612656565b80516008811490811591611a03575b506119c957506116f36116e26104fe6116698451611431565b67ffffffffffffffff166040830152565b61170061164f8251611442565b60608201526117296117186104fe6116698451611452565b67ffffffffffffffff166080830152565b61174161160f61173c6116b48451611463565b612500565b906020810191808352516005810361199e575061176761176183516113ee565b5161256f565b908151156119765761177982516114de565b9360a082019485525f5b8351811015611912576117996116b482866114b2565b8051601481036118e757506117b06117b69161150f565b60601c90565b73ffffffffffffffffffffffffffffffffffffffff811680156118a5575f5b8381106118115750509061180b6001926117f0838a516114b2565b9073ffffffffffffffffffffffffffffffffffffffff169052565b01611783565b8161185661183d611823848d516114b2565b5173ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff1690565b14611863576001016117d5565b7f41fe18cc000000000000000000000000000000000000000000000000000000005f5273ffffffffffffffffffffffffffffffffffffffff831660045260245ffd5b7f59bff387000000000000000000000000000000000000000000000000000000005f5273ffffffffffffffffffffffffffffffffffffffff821660045260245ffd5b7f83e46ad2000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b5092611761919450611925925051611474565b61192f81516115b3565b9260c081019384525f5b82518110156119705780611969816119566116b4600195886114b2565b88519061196383836114b2565b526114b2565b5001611939565b50925050565b7f339e1ffb000000000000000000000000000000000000000000000000000000005f5260045ffd5b7f30c6792a000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b6119ff906040519182917fd5edd2a500000000000000000000000000000000000000000000000000000000835260048301610934565b0390fd5b7f011b4d03dd8c01f1049143cf9c4c817e4b167f1d1b83e5c6f0f10d89ba1e7bce9150602083012014155f6116c9565b611a4361164f61055e925161140f565b7fa19e609c000000000000000000000000000000000000000000000000000000005f52600452602490565b611a7e61166961055e92516113fe565b7ff71b722f000000000000000000000000000000000000000000000000000000005f52600452602490565b611ab961164f61055e92516113ee565b7fb8120dca000000000000000000000000000000000000000000000000000000005f52600452602490565b7fbc277732000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b67ffffffffffffffff1690815f52600460205260405f209167ffffffffffffffff83541615611b3b5750565b7ff761631b000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b611c03611b71611579565b611bea611b8860208501611b8e611b888251611484565b51612f48565b611b9785611484565b52611ba184611484565b50611baf611b8882516113ee565b611bb8856113ee565b52611bc2846113ee565b50611bd0611b888251611491565b611bd985611491565b52611be384611491565b5051611442565b611bf382611442565b52611bfd81611442565b50612680565b611c0e8251516115b3565b905f5b83518051821015611c64579080600192600c82145f14611c52575050611c3683612718565b611c4082866114b2565b52611c4b81856114b2565b5001611c11565b611c5f91611b88916114b2565b611c36565b505050611c719150612680565b6020815191012090565b919091611c8883516114de565b925f5b8151811015611e8157611c9e81836114b2565b51805160418103611e56575080601b60ff611ced611ce7611cc1611cfa966126f7565b517fff000000000000000000000000000000000000000000000000000000000000001690565b60f81c90565b1610611e03575b84613034565b90611d0481612846565b1590811591611df9575b508015611ddb575b611db35773ffffffffffffffffffffffffffffffffffffffff81165f5b838110611d5357505090611d4d6001926117f083896114b2565b01611c8b565b81611d6461183d611823848c6114b2565b14611d7157600101611d33565b7f33af0d5f000000000000000000000000000000000000000000000000000000005f5273ffffffffffffffffffffffffffffffffffffffff831660045260245ffd5b7f09cb44e6000000000000000000000000000000000000000000000000000000005f5260045ffd5b5073ffffffffffffffffffffffffffffffffffffffff811615611d16565b905015155f611d0e565b611e45611e1d611e18611ce7611cc1856126f7565b612834565b60f81b7fff000000000000000000000000000000000000000000000000000000000000001690565b5f1a611e50826126f7565b53611cf4565b7ff2db9ce1000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b505050565b5f198114610c495760010190565b905f915f5b8151811015611eed57611ecc73ffffffffffffffffffffffffffffffffffffffff611ec483856114b2565b511684612850565b611ed9575b600101611e99565b92611ee5600191611e86565b939050611ed1565b50506003611efc915404610c3b565b90818110611f08575050565b7fe2dcb1b9000000000000000000000000000000000000000000000000000000005f5260045260245260445ffd5b905f198201918211610c4957565b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff408201918211610c4957565b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff808201918211610c4957565b6020039060208211610c4957565b91908203918211610c4957565b905f915f5b815181101561201257611ff173ffffffffffffffffffffffffffffffffffffffff611fe983856114b2565b5116846128af565b611ffe575b600101611fbe565b9261200a600191611e86565b939050611ff6565b50505190600382048203918211610c495781811061202e575050565b7f7818f4e4000000000000000000000000000000000000000000000000000000005f5260045260245260445ffd5b6120a69261160f9261173c926040517fffffffffffffffffffffffffffffffffffffffff000000000000000000000000602082019260601b168252601481526104d7603482610aaf565b805160021015611223576060610b5091015161263a565b60206040818301928281528451809452019201905f5b8181106120e05750505090565b825173ffffffffffffffffffffffffffffffffffffffff168452602093840193909201916001016120d3565b919067ffffffffffffffff8084541691161490811591612172575b5061216c5760405161214c816104c96020820194602086526002604084019101611228565b51902090604051612165816104c96020820194856120bd565b5190201490565b50505f90565b9050600182015414155f612127565b805f525f60205260ff6121b58360405f209073ffffffffffffffffffffffffffffffffffffffff165f5260205260405f2090565b541661216c57805f525f6020526121ed8260405f209073ffffffffffffffffffffffffffffffffffffffff165f5260205260405f2090565b60017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0082541617905573ffffffffffffffffffffffffffffffffffffffff339216907f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d5f80a4600190565b805f525f60205260ff61228c8360405f209073ffffffffffffffffffffffffffffffffffffffff165f5260205260405f2090565b54161561216c57805f525f6020526122c58260405f209073ffffffffffffffffffffffffffffffffffffffff165f5260205260405f2090565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00815416905573ffffffffffffffffffffffffffffffffffffffff339216907ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b5f80a4600190565b60208151910120604051602081019182527f1260944489272988d9df285149b5aa1b0f48f2136d6f416159f840a3e0747600604082015260408152612373606082610aaf565b51902090565b60405190612388602083610aaf565b5f808352366020840137565b9061239e82610ae3565b6123ab6040519182610aaf565b828152601f196115058294610ae3565b61160f6123fd919493946123cf6020610ae3565b956123dd6040519788610aaf565b602087526123eb6020610ae3565b601f1960208901910136823752612500565b906124088451610c5b565b9184511515806124e0575b61241c90612526565b61242e6124295f85611fac565b612394565b925f19015f5b818110612448575050610b50939450612a23565b806124ca600f61248d6124c4611ce7611cc18d61246760029960011c90565b908d6124be8a6124b68a61248d612484611ce7611cc18a8a612707565b60041c600f1690565b1660f81b7fff000000000000000000000000000000000000000000000000000000000000001690565b5f1a92612707565b53612707565b60ff1690565b5f1a6124d96001830188612707565b5301612434565b506001612413565b604051906124f582610a93565b5f6020838281520152565b6125086124e8565b5060208151916040519261251b84610a93565b835201602082015290565b1561019557565b80518015159081612563575b50156101955761254890612cf9565b90519060208110612557575090565b6020036101000a900490565b6021915011155f612539565b61257881612d25565b156101955761258681612d45565b61258f816114c6565b9161259d6040519384610aaf565b818352601f196125ac836114c6565b015f5b81811061262357505060206125cf9101516125c981612da6565b90610c4e565b5f905b8282106125df5750505090565b61261b816125ee600193612e0c565b906125f7610ad2565b82815281602082015261260a86896114b2565b5261261585886114b2565b50610c4e565b9101906125d2565b60209061262e6124e8565b828288010152016125af565b6021815103610195576020015160018101809111610c49575190565b80511561019557612669610b5091612cf9565b61267581939293612394565b928360200190612ed5565b5f9190825b81518410156126ae5761269884836114b2565b51518101809111610c4957600190930192612685565b6126b9919350612394565b5f9060205b84518310156126e9576001906126d484876114b2565b518051602082018386015e51019201916126be565b509050610b50919250612f74565b8051604010156112235760600190565b908151811015611223570160200190565b805160018114908161281c575b501561275857610b50602080926040519381859251918291018484015e81015f838201520301601f198101835282610aaf565b80516037811161278857806021916020604051946001830186526080830182870153018385015e82010160405290565b906021906127e56127e08460ff6fffffffffffffffffffffffffffffffff821160071b67ffffffffffffffff83821c1160061b1763ffffffff83821c1160051b1761ffff83821c1160041b17918260031c921c111790565b610c3b565b92604051938360208284019460018601885260b7840182890153848460031b610100031b8389015201918601015e82010160405290565b905015611223576080602082015160f81c105f612725565b60ff601b9116019060ff8211610c4957565b6004111561029457565b905f5b82548110156128a857825f5273ffffffffffffffffffffffffffffffffffffffff8160205f2001541673ffffffffffffffffffffffffffffffffffffffff8316146128a057600101612853565b505050600190565b5050505f90565b905f5b82518110156128a85773ffffffffffffffffffffffffffffffffffffffff6128da82856114b2565b511673ffffffffffffffffffffffffffffffffffffffff8316146128a0576001016128b2565b919061290c8351610c5b565b908351151580612a19575b61292090612526565b61292d6124298284611fac565b9381926001808416146129b7575b5f19869101935b848110612950575050505050565b836129ae60016129a4600f61248d6124c4611ce7611cc18b60029b61299d6129908861248d8f611ce7611cc16129896124849360011c90565b8099612707565b9b8d03809c5f1a92612707565b538c612707565b5f1a920189612707565b53018590612942565b92507f0f000000000000000000000000000000000000000000000000000000000000006129f66124c4611ce7611cc16129f08760011c90565b86612707565b60f81b165f1a612a0586611484565b535f19612a1183611e86565b93905061293b565b5081811115612917565b915f915f612a2f6124e8565b50845115612cc05790935f915b81518310156101955782158080612caa575b61019557159081612c8d575b5061019557612a6c61176183836114b2565b948551600281145f14612b695750612a8e612a896116b488611484565b6130c9565b95612aa4612a9d888884613136565b8092610c4e565b965111612b4b5715612adb5750612abb9051611f36565b11610195575111612ad2576116b4610b50916113ee565b50610b50612379565b919094612ae88651611f36565b82146101955780612b0a612b06612b006001946113ee565b51612d25565b1590565b15612b2c57612b1b612b21916113ee565b516130bb565b915b01919490612a3c565b612b38612b45916113ee565b5160208101519051902090565b91612b23565b505091509250612b5c915051611f36565b1161019557610b50612379565b929491939192601103612c2e5781518314612c1057612b9a612b946124c4611ce7611cc18787612707565b93610c3b565b92601081101561019557612bb7612bb182896114b2565b516130a5565b15612bd95750505050612bcc91925051611f36565b0361019557610b50612379565b86612bf1612b06612b0084600196989a97999b6114b2565b15612c0357612b4591612b1b916114b2565b612b4591612b38916114b2565b505050612c1d9051611f36565b03610195576116b4610b50916114a1565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f696e76616c6964206e6f6465206c656e677468000000000000000000000000006044820152606490fd5b9050612ca2612c9c84846114b2565b5161306e565b14155f612a5a565b50612cb8612b3885856114b2565b871415612a4e565b509050612cf192507f56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421915014612526565b610b50612379565b906020820191612d098351612da6565b925190838201809211610c495751928303928311610c49579190565b805115612d4057602060c0910151515f1a10610fb057600190565b505f90565b805115612d40575f9060208101908151612d5e81612da6565b8101809111610c4957915190518101809111610c495791905b828110612d845750905090565b612d8d81612e0c565b8101809111610c4957612da09091611e86565b90612d77565b515f1a6080811015612db757505f90565b60b881108015612df6575b15612dcd5750600190565b60c0811015612de757610b50906127e09060b75b90611fac565b610b50906127e09060f7612de1565b5060c08110158015612dc2575060f88110612dc2565b80515f1a906080821015612e21575050600190565b60b8821015612e3757506127e0610b5091611f71565b60c0821015612e785760010151602082900360b7016101000a9004017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff4a0190565b60f8821015612e8e57506127e0610b5091611f44565b60010151602082900360f7016101000a9004017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0a0190565b601f8111610c49576101000a90565b90918015611e81575b6020811015612f185780612ef157505050565b612f05612f00612f0a92611f9e565b612ec6565b611f36565b905182518216911916179052565b91908051825260208101809111610c49579060208101809111610c495791601f19810190811115612ede57610c0e565b612f528151612394565b90815115612f7057806020610b509201519051908360200190612ed5565b5090565b805190919060378111612fa6578060219160206040519560018301875260c0830182880153018386015e830101604052565b91602190612ffe6127e08560ff6fffffffffffffffffffffffffffffffff821160071b67ffffffffffffffff83821c1160061b1763ffffffff83821c1160051b1761ffff83821c1160041b17918260031c921c111790565b93604051948360208284019460018601895260f78401828a0153848460031b610100031b838a015201918701015e830101604052565b81519190604183036130645761305d9250602082015190606060408401519301515f1a906131da565b9192909190565b50505f9160029190565b80516020811015613086575060208101519051902090565b9060200151206040516020810191825260208152612373604082610aaf565b6001815103612d405760200151515f1a60801490565b6130c490612cf9565b902090565b9081511561019557600f6130e5612484611ce7611cc186611484565b16806130f85750610b5060025f93612900565b6001810361310d5750610b5060015f93612900565b600281036131235750610b506002600193612900565b60030361019557610b5060018093612900565b91905f5b838101808211610c495782518110806131d0575b156131c85761317e7fff000000000000000000000000000000000000000000000000000000000000009184612707565b51167fff000000000000000000000000000000000000000000000000000000000000006131ab8386612707565b511690036131c1576131bc90611e86565b61313a565b9250505090565b509250505090565b508351821061314e565b91907f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08411613269579160209360809260ff5f9560405194855216868401526040830152606082015282805260015afa1561325e575f5173ffffffffffffffffffffffffffffffffffffffff81161561325457905f905f90565b505f906001905f90565b6040513d5f823e3d90fd5b5050505f916003919056fea164736f6c634300081c000a2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d4c48d1d2b0f4f7485fc28e3db22341d96a20aa29e6efa8149da9751603abd4e06e0c24a6e293ff9b755263dbaa15ba3796b0b8d3fe17cfb4ddf8143b268eac47bd893629a699470e4ec82a5715bb4981fdaacc5d0a728bf5f55b801d8f4ef10bad3228b676f7d3cd4284a5443f17f1962b36e491b30a40b2405849e597ba5fb5"}} +{"abi":[{"type":"constructor","inputs":[{"name":"ibcRouter","type":"address","internalType":"address"},{"name":"initialTrustedHeight","type":"uint64","internalType":"uint64"},{"name":"initialTrustedTimestamp","type":"uint64","internalType":"uint64"},{"name":"initialTrustedStorageRoot","type":"bytes32","internalType":"bytes32"},{"name":"initialTrustedValidators","type":"address[]","internalType":"address[]"},{"name":"trustingPeriod","type":"uint64","internalType":"uint64"},{"name":"maxClockDrift","type":"uint64","internalType":"uint64"},{"name":"roleManager","type":"address","internalType":"address"}],"stateMutability":"nonpayable"},{"type":"function","name":"DEFAULT_ADMIN_ROLE","inputs":[],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"type":"function","name":"PROOF_SUBMITTER_ROLE","inputs":[],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"type":"function","name":"getClientState","inputs":[],"outputs":[{"name":"","type":"bytes","internalType":"bytes"}],"stateMutability":"view"},{"type":"function","name":"getConsensusState","inputs":[{"name":"revisionHeight","type":"uint64","internalType":"uint64"}],"outputs":[{"name":"","type":"bytes","internalType":"bytes"}],"stateMutability":"view"},{"type":"function","name":"getRoleAdmin","inputs":[{"name":"role","type":"bytes32","internalType":"bytes32"}],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"type":"function","name":"grantRole","inputs":[{"name":"role","type":"bytes32","internalType":"bytes32"},{"name":"account","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"hasRole","inputs":[{"name":"role","type":"bytes32","internalType":"bytes32"},{"name":"account","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"misbehaviour","inputs":[{"name":"","type":"bytes","internalType":"bytes"}],"outputs":[],"stateMutability":"view"},{"type":"function","name":"renounceRole","inputs":[{"name":"role","type":"bytes32","internalType":"bytes32"},{"name":"callerConfirmation","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"revokeRole","inputs":[{"name":"role","type":"bytes32","internalType":"bytes32"},{"name":"account","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"supportsInterface","inputs":[{"name":"interfaceId","type":"bytes4","internalType":"bytes4"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"updateClient","inputs":[{"name":"updateMsg","type":"bytes","internalType":"bytes"}],"outputs":[{"name":"","type":"uint8","internalType":"enum ILightClientMsgs.UpdateResult"}],"stateMutability":"nonpayable"},{"type":"function","name":"verifyMembership","inputs":[{"name":"msg_","type":"tuple","internalType":"struct ILightClientMsgs.MsgVerifyMembership","components":[{"name":"proof","type":"bytes","internalType":"bytes"},{"name":"proofHeight","type":"tuple","internalType":"struct IICS02ClientMsgs.Height","components":[{"name":"revisionNumber","type":"uint64","internalType":"uint64"},{"name":"revisionHeight","type":"uint64","internalType":"uint64"}]},{"name":"path","type":"bytes[]","internalType":"bytes[]"},{"name":"value","type":"bytes","internalType":"bytes"}]}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"verifyNonMembership","inputs":[{"name":"msg_","type":"tuple","internalType":"struct ILightClientMsgs.MsgVerifyNonMembership","components":[{"name":"proof","type":"bytes","internalType":"bytes"},{"name":"proofHeight","type":"tuple","internalType":"struct IICS02ClientMsgs.Height","components":[{"name":"revisionNumber","type":"uint64","internalType":"uint64"},{"name":"revisionHeight","type":"uint64","internalType":"uint64"}]},{"name":"path","type":"bytes[]","internalType":"bytes[]"}]}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"event","name":"RoleAdminChanged","inputs":[{"name":"role","type":"bytes32","indexed":true,"internalType":"bytes32"},{"name":"previousAdminRole","type":"bytes32","indexed":true,"internalType":"bytes32"},{"name":"newAdminRole","type":"bytes32","indexed":true,"internalType":"bytes32"}],"anonymous":false},{"type":"event","name":"RoleGranted","inputs":[{"name":"role","type":"bytes32","indexed":true,"internalType":"bytes32"},{"name":"account","type":"address","indexed":true,"internalType":"address"},{"name":"sender","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"type":"event","name":"RoleRevoked","inputs":[{"name":"role","type":"bytes32","indexed":true,"internalType":"bytes32"},{"name":"account","type":"address","indexed":true,"internalType":"address"},{"name":"sender","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"type":"error","name":"AccessControlBadConfirmation","inputs":[]},{"type":"error","name":"AccessControlUnauthorizedAccount","inputs":[{"name":"account","type":"address","internalType":"address"},{"name":"neededRole","type":"bytes32","internalType":"bytes32"}]},{"type":"error","name":"AccountNotFound","inputs":[{"name":"account","type":"address","internalType":"address"}]},{"type":"error","name":"ConflictingConsensusState","inputs":[{"name":"revisionHeight","type":"uint64","internalType":"uint64"}]},{"type":"error","name":"ConsensusStateExpired","inputs":[{"name":"trustedTimestamp","type":"uint64","internalType":"uint64"},{"name":"currentTimestamp","type":"uint256","internalType":"uint256"},{"name":"trustingPeriod","type":"uint64","internalType":"uint64"}]},{"type":"error","name":"ConsensusStateNotFound","inputs":[{"name":"revisionHeight","type":"uint64","internalType":"uint64"}]},{"type":"error","name":"DuplicateCommitSealSigner","inputs":[{"name":"signer","type":"address","internalType":"address"}]},{"type":"error","name":"DuplicateValidator","inputs":[{"name":"validator","type":"address","internalType":"address"}]},{"type":"error","name":"EmptyValidatorSet","inputs":[]},{"type":"error","name":"HeaderFromFuture","inputs":[{"name":"currentTimestamp","type":"uint256","internalType":"uint256"},{"name":"headerTimestamp","type":"uint256","internalType":"uint256"},{"name":"maxClockDrift","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"InsufficientTrustedValidatorOverlap","inputs":[{"name":"actual","type":"uint256","internalType":"uint256"},{"name":"required","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"InsufficientValidatorQuorum","inputs":[{"name":"actual","type":"uint256","internalType":"uint256"},{"name":"required","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"InvalidCommitSeal","inputs":[]},{"type":"error","name":"InvalidCommitmentValue","inputs":[{"name":"expectedValue","type":"bytes32","internalType":"bytes32"},{"name":"actualValue","type":"bytes32","internalType":"bytes32"}]},{"type":"error","name":"InvalidDifficulty","inputs":[{"name":"actualDifficulty","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"InvalidECDSASignatureLength","inputs":[{"name":"length","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"InvalidExtraDataFormat","inputs":[{"name":"itemsLength","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"InvalidHeaderFormat","inputs":[{"name":"itemsLength","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"InvalidHeaderHeight","inputs":[]},{"type":"error","name":"InvalidHeaderTimestamp","inputs":[{"name":"actualTimestamp","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"InvalidMixHash","inputs":[{"name":"actualMixHash","type":"bytes32","internalType":"bytes32"}]},{"type":"error","name":"InvalidNonce","inputs":[{"name":"actualNonce","type":"bytes","internalType":"bytes"}]},{"type":"error","name":"InvalidOmmersHash","inputs":[{"name":"actualOmmersHash","type":"bytes32","internalType":"bytes32"}]},{"type":"error","name":"InvalidPathLength","inputs":[{"name":"expectedLength","type":"uint256","internalType":"uint256"},{"name":"actualLength","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"InvalidRevisionNumber","inputs":[{"name":"providedRevisionNumber","type":"uint64","internalType":"uint64"}]},{"type":"error","name":"InvalidValidatorAddress","inputs":[{"name":"validator","type":"address","internalType":"address"}]},{"type":"error","name":"InvalidValidatorAddressLength","inputs":[{"name":"length","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"InvalidValueLength","inputs":[{"name":"expectedLength","type":"uint256","internalType":"uint256"},{"name":"actualLength","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"InvalidVanityDataLength","inputs":[{"name":"length","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"RLPInvalidEncoding","inputs":[]},{"type":"error","name":"TrieProofTraversalError","inputs":[{"name":"err","type":"uint8","internalType":"enum MPTProof.ProofError"}]},{"type":"error","name":"UnsupportedMisbehaviour","inputs":[]},{"type":"error","name":"ValueExists","inputs":[{"name":"actualValue","type":"bytes32","internalType":"bytes32"}]}],"bytecode":{"object":"0x6080604052346103dc576139cc80380380610019816103e0565b928339810190610100818303126103dc5761003381610405565b9061004060208201610419565b9061004d60408201610419565b92606082015191608081015160018060401b0381116103dc5781019286601f850112156103dc578351966001600160401b03881161037f578760051b9460206100978188016103e0565b809a81520190602082978201019283116103dc57602001905b8282106103c4575050506100c660a08301610419565b956100df60e06100d860c08601610419565b9401610405565b956001600160401b03169081156103b5576001600160401b03169283156103a257885115610393575f5b89518110156101bf576001600160a01b03610124828c61042d565b511615610198575f5b81811061013d5750600101610109565b6001600160a01b0361014f828d61042d565b51166001600160a01b03610163848e61042d565b5116146101725760010161012d565b6001600160a01b03610184838d61042d565b511663107f863360e21b5f5260045260245ffd5b6001600160a01b03906101ab908b61042d565b51166359bff38760e01b5f5260045260245ffd5b5060408051979896978a979181016001600160401b0381118282101761037f576040525f81526020810190848252604051926080840198848a1060018060401b038b111761037f576040998a526001600160a01b031680855260208086018490526001600160401b03928316868c01819052878416606090970196909652600180546001600160a01b031916909217825592516002805495516fffffffffffffffff0000000000000000908d1b81169285166001600160801b03199788161792909217815560038054988d1b90921697909516909517959095179093555f948552600490529590922080546001600160401b031916949094178455830191909155925193910191831161037f5768010000000000000000831161037f578154838355808410610359575b50905f5260205f205f5b83811061033c57846001600160a01b038116610323575061031261054b565b505b60405161335e90816105ce8239f35b8061033061033692610455565b506104cb565b50610314565b82516001600160a01b0316818301556020909201916001016102f3565b825f528360205f2091820191015b81811061037457506102e9565b5f8155600101610367565b634e487b7160e01b5f52604160045260245ffd5b63339e1ffb60e01b5f5260045ffd5b83638c0b052760e01b5f5260045260245ffd5b6359d119e360e01b5f5260045ffd5b602080916103d184610405565b8152019101906100b0565b5f80fd5b6040519190601f01601f191682016001600160401b0381118382101761037f57604052565b51906001600160a01b03821682036103dc57565b51906001600160401b03821682036103dc57565b80518210156104415760209160051b010190565b634e487b7160e01b5f52603260045260245ffd5b6001600160a01b0381165f9081525f5160206139ac5f395f51905f52602052604090205460ff166104c6576001600160a01b03165f8181525f5160206139ac5f395f51905f5260205260408120805460ff191660011790553391905f51602061392c5f395f51905f528180a4600190565b505f90565b6001600160a01b0381165f9081525f51602061394c5f395f51905f52602052604090205460ff166104c6576001600160a01b03165f8181525f51602061394c5f395f51905f5260205260408120805460ff191660011790553391905f51602061398c5f395f51905f52905f51602061392c5f395f51905f529080a4600190565b5f80525f51602061394c5f395f51905f526020525f51602061396c5f395f51905f525460ff166105c9575f8080525f51602061394c5f395f51905f526020525f51602061396c5f395f51905f52805460ff1916600117905533905f51602061398c5f395f51905f525f51602061392c5f395f51905f528280a4600190565b5f9056fe6080806040526004361015610012575f80fd5b5f3560e01c90816301ffc9a7146108ea575080630bece35614610833578063248a9ca3146108015780632f2ff15d146107d257806336568abe146107765780634d6d9ffb146106015780635972185a146105c7578063682ed5f0146102f157806391d14854146102a8578063a217fddf1461028e578063d547741f14610258578063ddba6537146101c1578063edce8bdc146101475763ef913a4b146100b6575f80fd5b34610143575f6003193601126101435761013f60405173ffffffffffffffffffffffffffffffffffffffff60015416602082015267ffffffffffffffff600254818116604084015260401c16606082015267ffffffffffffffff600354818116608084015260401c1660a082015260a0815261013360c082610a4b565b60405191829182610a21565b0390f35b5f80fd5b346101435760206003193601126101435760043567ffffffffffffffff811681036101435761017861013f91611ee4565b61013367ffffffffffffffff8254166101b3600184015493604051948593602085015260408401526060808401526002608084019101611c68565b03601f198101835282610a4b565b34610143576101cf36610988565b50505f80527f4c48d1d2b0f4f7485fc28e3db22341d96a20aa29e6efa8149da9751603abd4e06020527f6e0c24a6e293ff9b755263dbaa15ba3796b0b8d3fe17cfb4ddf8143b268eac475460ff161561024b575b7f2c1ed462000000000000000000000000000000000000000000000000000000005f5260045ffd5b610253611cb5565b610223565b346101435761028c610269366109d9565b90610287610282825f525f602052600160405f20015490565b611d3d565b6120e9565b005b34610143575f6003193601126101435760206040515f8152f35b34610143576102b6366109d9565b905f525f60205273ffffffffffffffffffffffffffffffffffffffff60405f2091165f52602052602060ff60405f2054166040519015158152f35b346101435760206003193601126101435760043567ffffffffffffffff8111610143578060040160a06003198336030112610143575f80527f4c48d1d2b0f4f7485fc28e3db22341d96a20aa29e6efa8149da9751603abd4e06020527f6e0c24a6e293ff9b755263dbaa15ba3796b0b8d3fe17cfb4ddf8143b268eac475460ff16156105ba575b61038c61038760248401611bae565b611da3565b6064820191600161039d8484611bc3565b90500361057e57608481019060206103b58385611c17565b905003610542576103d36103ce60446103da9301611bae565b611ee4565b9383611bc3565b91909115610515576104396104326103fe6103f785602096611c17565b3691610ab7565b602081519101205f527f1260944489272988d9df285149b5aa1b0f48f2136d6f416159f840a3e074760060205260405f2090565b9184611c17565b9080939181010312610143576104576103f761048093359480611c17565b906001850154906040516020810191825260208152610477604082610a4b565b519020916121b1565b90156104e5578060206104999201905160801b1761229e565b908082036104b757602067ffffffffffffffff845416604051908152f35b7f56ed1b63000000000000000000000000000000000000000000000000000000005f5260045260245260445ffd5b507f56ed1b63000000000000000000000000000000000000000000000000000000005f526004525f60245260445ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5061054c91611c17565b90507f24fadac8000000000000000000000000000000000000000000000000000000005f52602060045260245260445ffd5b6105888383611bc3565b90507f88b3170e000000000000000000000000000000000000000000000000000000005f52600160045260245260445ffd5b6105c2611cb5565b610378565b34610143575f6003193601126101435760206040517fbd893629a699470e4ec82a5715bb4981fdaacc5d0a728bf5f55b801d8f4ef10b8152f35b346101435760206003193601126101435760043567ffffffffffffffff8111610143578060040160806003198336030112610143575f80527f4c48d1d2b0f4f7485fc28e3db22341d96a20aa29e6efa8149da9751603abd4e06020527f6e0c24a6e293ff9b755263dbaa15ba3796b0b8d3fe17cfb4ddf8143b268eac475460ff1615610769575b61069761038760248401611bae565b606482019160016106a88484611bc3565b90500361057e576106c16103ce60446106c89301611bae565b9282611bc3565b91909115610515576106f06103f76106e96103fe6103f78661071097611c17565b9280611c17565b906001840154906040516020810191825260208152610477604082610a4b565b9061072b57602067ffffffffffffffff835416604051908152f35b80602061073e9201905160801b1761229e565b7fd039601e000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b610771611cb5565b610688565b3461014357610784366109d9565b3373ffffffffffffffffffffffffffffffffffffffff8216036107aa5761028c916120e9565b7f6697b232000000000000000000000000000000000000000000000000000000005f5260045ffd5b346101435761028c6107e3366109d9565b906107fc610282825f525f602052600160405f20015490565b61201d565b3461014357602060031936011261014357602061082b6004355f525f602052600160405f20015490565b604051908152f35b346101435761089d61084436610988565b5f80527f4c48d1d2b0f4f7485fc28e3db22341d96a20aa29e6efa8149da9751603abd4e06020527f6e0c24a6e293ff9b755263dbaa15ba3796b0b8d3fe17cfb4ddf8143b268eac475490919060ff16156108dd57610b45565b60405160038210156108b0576020918152f35b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b6108e5611cb5565b610b45565b3461014357602060031936011261014357600435907fffffffff00000000000000000000000000000000000000000000000000000000821680920361014357817f7965db0b000000000000000000000000000000000000000000000000000000006020931490811561095e575b5015158152f35b7f01ffc9a70000000000000000000000000000000000000000000000000000000091501483610957565b9060206003198301126101435760043567ffffffffffffffff811161014357826023820112156101435780600401359267ffffffffffffffff84116101435760248483010111610143576024019190565b6003196040910112610143576004359060243573ffffffffffffffffffffffffffffffffffffffff811681036101435790565b359067ffffffffffffffff8216820361014357565b601f19601f602060409481855280519182918282880152018686015e5f8582860101520116010190565b90601f601f19910116810190811067ffffffffffffffff821117610a6e57604052565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b67ffffffffffffffff8111610a6e57601f01601f191660200190565b929192610ac382610a9b565b91610ad16040519384610a4b565b829481845281830111610143578281602093845f960137010152565b9080601f8301121561014357816020610b0893359101610ab7565b90565b91908201809211610b1857565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b908101906020818303126101435780359067ffffffffffffffff8211610143570190818103916080831261014357604051926060840184811067ffffffffffffffff821117610a6e57604052813567ffffffffffffffff811161014357604091610bb485601f19938601610aed565b8652011261014357604051916040830183811067ffffffffffffffff821117610a6e57604052610be660208301610a0c565b8352610bf460408301610a0c565b602084015260208401928352606082013567ffffffffffffffff811161014357610c1e9201610aed565b9160408101928352610c3b67ffffffffffffffff83515116611da3565b51926040519360e0850185811067ffffffffffffffff821117610a6e5760405260608552602085019060608252604086015f815260608701965f885260808101915f835260a082019860608a52610ca360c08401956060875260208101905160801b17612388565b80845251600f8110611b8357507f1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347610ce4610cde8551611de0565b51612262565b03611b4b576001610cfe610cf88551611df0565b5161229e565b03611b13577f63746963616c2062797a616e74696e65206661756c7420746f6c6572616e6365610d31610cde8551611e01565b03611adb5782518051600e1015610515576101e0610d5091015161235d565b80516008811490811591611aab575b50611a715750825180516008101561051557610120610d7f91015161229e565b80158015611a60575b61194c5767ffffffffffffffff168252610da5610cde8451611e12565b815282518051600b101561051557610180610dc191015161229e565b80158015611a4f575b611a245767ffffffffffffffff16845282518051600c101561051557610df76101a0610e0692015161235d565b60208101905160801b17612388565b80875251600581036119f95750610e26610e208751611e22565b5161235d565b51602081036119ce5750610e43610e3d8751611de0565b51612388565b978851156119a657610e558951611e6b565b8b525f5b8951811015610fc757610e6f610e20828c611e3f565b805160148103610f9c5750602081519101517fffffffffffffffffffffffffffffffffffffffff00000000000000000000000081169160148110610f67575b505060601c8015610f3c57908c915f5b828110610eda5750610ed38260019451611e3f565b5201610e59565b9073ffffffffffffffffffffffffffffffffffffffff610efd8383959651611e3f565b511614610f10578d929190600101610ebe565b507f41fe18cc000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b7f59bff387000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000009250829060140360031b1b16165f80610eae565b7f83e46ad2000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b509194975092959891949788518051600410156105155760a0610feb910151612388565b99610ff68b51611e9c565b89525f5b8b51811015611032578061102b816110188f600195610e2091611e3f565b8d51906110258383611e3f565b52611e3f565b5001610ffa565b509194979396995091949760035467ffffffffffffffff8160401c166110588142610b0b565b67ffffffffffffffff8d511680911061197457505061108567ffffffffffffffff60208851015116611ee4565b9567ffffffffffffffff6020818c51169251015116101561194c5767ffffffffffffffff168015158061192e575b6118f057506040519060a06110c88184610a4b565b60048352601f19015f5b8181106118df575050906111556110f3836110f96110f361116e9651611e22565b51612fcc565b61110285611e22565b5261110c84611e22565b5061111a6110f38251611de0565b61112385611de0565b5261112d84611de0565b5061113b6110f38251611e2f565b61114485611e2f565b5261114e84611e2f565b5051611e12565b61115e82611e12565b5261116881611e12565b50612442565b9861117a895151611e9c565b975f5b8a5180518210156112f057600c82036112db57508b80516001811490816112c1575b50156111f1579060206111d5816001946040519381859251918291018484015e81015f838201520301601f198101835282610a4b565b6111df828d611e3f565b526111ea818c611e3f565b500161117d565b508b51908c603783116112275760218360019460206040519487830186526080830182870153018385015e8201016040526111d5565b506fffffffffffffffffffffffffffffffff821160071b67ffffffffffffffff83821c1160061b1763ffffffff83821c1160051b1761ffff83821c1160041b1760ff83821c119060031c17916001830190818411610b185760018f92602192829660226020604051978484810196600288018b5260b88601848c015360031b610100031b888a015201918701015e830101016040526111d5565b91505015610515578b6080602082015160f81c105f61119f565b906112eb6110f382600194611e3f565b6111d5565b505093979094985061130791959950959195612442565b6020815191012095519461131b8651611e6b565b985f5b87518110156114ed576113318189611e3f565b518051604181036114c25750805160401015610515576060810190601b825160f81c1061146b575b61136491508a61302b565b9060048110156108b0571590811591611461575b508015611443575b61141b578b919073ffffffffffffffffffffffffffffffffffffffff165f5b8281106113ba57506113b382600194611e3f565b520161131e565b9073ffffffffffffffffffffffffffffffffffffffff6113dc83839596611e3f565b5116146113ef578c92919060010161139f565b507f33af0d5f000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b7f09cb44e6000000000000000000000000000000000000000000000000000000005f5260045ffd5b5073ffffffffffffffffffffffffffffffffffffffff811615611380565b905015155f611378565b80516040101561051557601b825160f81c019160ff8311610b1857815160401015610515577fff000000000000000000000000000000000000000000000000000000000000006113649360f81b165f1a9053611359565b7ff2db9ce1000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b5092965092966002919498955001965f955f5b86518110156115545761153373ffffffffffffffffffffffffffffffffffffffff61152b838a611e3f565b51168b612595565b611540575b600101611500565b9661154c600191611f3b565b979050611538565b509296919590939760039054049060018201809211610b18578181106118b15750508451945f975f5b86518110156115d1576115b073ffffffffffffffffffffffffffffffffffffffff6115a8838a611e3f565b5116896125f4565b6115bd575b60010161157d565b986115c9600191611f3b565b9990506115b5565b50939791956115ea919550969296516003810490611f49565b9081811061188357505061163f90600154925190519060405160208101907fffffffffffffffffffffffffffffffffffffffff0000000000000000000000008660601b16825260148152610477603482610a4b565b9190156118415750610cde6116608260206116659401905160801b17612388565b611e2f565b67ffffffffffffffff8451165f52600460205260405f2067ffffffffffffffff8154166117e857509060029167ffffffffffffffff8551165f52600460205267ffffffffffffffff60405f209451167fffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000855416178455600184015551910181519167ffffffffffffffff8311610a6e57680100000000000000008311610a6e5781548383558084106117c2575b50602001905f5260205f205f5b8381106117985750505050516002549067ffffffffffffffff8260401c1667ffffffffffffffff821611611754575b50505f90565b6fffffffffffffffff00000000000000007fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff9160401b169116176002555f8061174e565b600190602073ffffffffffffffffffffffffffffffffffffffff855116940193818401550161171f565b825f528360205f2091820191015b8181106117dd5750611712565b5f81556001016117d0565b9167ffffffffffffffff611800945116905192611f56565b61183b5767ffffffffffffffff9051167fc1aea5f7000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b50600290565b73ffffffffffffffffffffffffffffffffffffffff907fa700fc32000000000000000000000000000000000000000000000000000000005f521660045260245ffd5b7f7818f4e4000000000000000000000000000000000000000000000000000000005f5260045260245260445ffd5b7fe2dcb1b9000000000000000000000000000000000000000000000000000000005f5260045260245260445ffd5b8060606020809387010152016110d2565b67ffffffffffffffff8654167feae35725000000000000000000000000000000000000000000000000000000005f526004524260245260445260645ffd5b50426119458267ffffffffffffffff895416610b0b565b11156110b3565b7f59d119e3000000000000000000000000000000000000000000000000000000005f5260045ffd5b7f9b772277000000000000000000000000000000000000000000000000000000005f524260045260245260445260645ffd5b7f339e1ffb000000000000000000000000000000000000000000000000000000005f5260045ffd5b7fe7719a54000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b7f30c6792a000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b7f8c0b0527000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b5067ffffffffffffffff8111610dca565b5067ffffffffffffffff8111610d88565b611aa7906040519182917fd5edd2a500000000000000000000000000000000000000000000000000000000835260048301610a21565b0390fd5b7f011b4d03dd8c01f1049143cf9c4c817e4b167f1d1b83e5c6f0f10d89ba1e7bce9150602083012014155f610d5f565b611ae8610cde8451611e01565b7fa19e609c000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b611b20610cf88451611df0565b7ff71b722f000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b611b58610cde8451611de0565b7fb8120dca000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b7fbc277732000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b3567ffffffffffffffff811681036101435790565b9035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe181360301821215610143570180359067ffffffffffffffff821161014357602001918160051b3603831361014357565b9035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe181360301821215610143570180359067ffffffffffffffff82116101435760200191813603831361014357565b90602082549182815201915f5260205f20905f5b818110611c895750505090565b825473ffffffffffffffffffffffffffffffffffffffff16845260209093019260019283019201611c7c565b335f9081527f4c48d1d2b0f4f7485fc28e3db22341d96a20aa29e6efa8149da9751603abd4e0602052604090205460ff1615611ced57565b7fe2517d3f000000000000000000000000000000000000000000000000000000005f52336004527fbd893629a699470e4ec82a5715bb4981fdaacc5d0a728bf5f55b801d8f4ef10b60245260445ffd5b805f525f60205260405f2073ffffffffffffffffffffffffffffffffffffffff33165f5260205260ff60405f20541615611d745750565b7fe2517d3f000000000000000000000000000000000000000000000000000000005f523360045260245260445ffd5b67ffffffffffffffff1680611db55750565b7f3ce598a9000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b8051600110156105155760400190565b805160071015610515576101000190565b8051600d1015610515576101c00190565b8051600310156105155760800190565b8051156105155760200190565b8051600210156105155760600190565b80518210156105155760209160051b010190565b67ffffffffffffffff8111610a6e5760051b60200190565b90611e7582611e53565b611e826040519182610a4b565b828152601f19611e928294611e53565b0190602036910137565b90611ea682611e53565b611eb36040519182610a4b565b828152601f19611ec38294611e53565b01905f5b828110611ed357505050565b806060602080938501015201611ec7565b67ffffffffffffffff1690815f52600460205260405f209167ffffffffffffffff83541615611f105750565b7ff761631b000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b5f198114610b185760010190565b91908203918211610b1857565b919067ffffffffffffffff808454169116149081159161200e575b5061174e57604051611f96816101b36020820194602086526002604084019101611c68565b5190209060405160208101918160408101916020855280518093526020606083019101925f5b818110611fdf575050611fd8925003601f198101835282610a4b565b5190201490565b845173ffffffffffffffffffffffffffffffffffffffff16835260209485019486945090920191600101611fbc565b9050600182015414155f611f71565b805f525f60205260405f2073ffffffffffffffffffffffffffffffffffffffff83165f5260205260ff60405f205416155f1461174e57805f525f60205260405f2073ffffffffffffffffffffffffffffffffffffffff83165f5260205260405f2060017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0082541617905573ffffffffffffffffffffffffffffffffffffffff339216907f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d5f80a4600190565b805f525f60205260405f2073ffffffffffffffffffffffffffffffffffffffff83165f5260205260ff60405f2054165f1461174e57805f525f60205260405f2073ffffffffffffffffffffffffffffffffffffffff83165f5260205260405f207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00815416905573ffffffffffffffffffffffffffffffffffffffff339216907ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b5f80a4600190565b6121d09092919260405192602084015260208352610df7604084610a4b565b926121db8451611e9c565b915f5b855181101561221357806121f76110f360019389611e3f565b6122018287611e3f565b5261220c8186611e3f565b50016121de565b50909350612220926126d8565b8190600e8110156108b05780612237575051151591565b7f1121c9d0000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b60218160801c0361227657610b089061229e565b7ff3dd7004000000000000000000000000000000000000000000000000000000005f5260045ffd5b8060801c9060218211612276576122b481612cda565b60028195929510156108b05761227657836122d157505050505f90565b816020019081602011610b185782036020019081111502601f811161234b575f196fffffffffffffffffffffffffffffffff9160031b1b9216015116907f1fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81168103610b185760031b610100036101008111610b18571c90565b634e487b715f5260326020526024601cfd5b61236681612cda565b60028194939410156108b05761227657610b089261238392612f95565b612fcc565b908160801c9161239781612cda565b60028194939410156108b057600114908161242f575b501561227657926040519360208501925b8281106123d957505050601f198382030160051c8352604052565b92612419846123f56123f085969761241396612ff9565b612cda565b5061240d6124068383989498610b0b565b8489612f95565b95610b0b565b90610b0b565b91815260208101809111610b18579291906123be565b61243a915083610b0b565b84145f6123ad565b905f805b835182101561246f5761246760019161245f8487611e3f565b515190610b0b565b910190612446565b91905061249461247e83610a9b565b9261248c6040519485610a4b565b808452610a9b565b91601f196020820193013684375f9160205b85518410156124d1576001906124bc8588611e3f565b518051602082018387015e51019301926124a6565b50905190935090506037811161250557806021916040519360018201855260c0820160208601538385015e82010160405290565b6fffffffffffffffffffffffffffffffff811160071b67ffffffffffffffff82821c1160061b1763ffffffff82821c1160051b1761ffff82821c1160041b1760ff82821c119060031c179160018301808411610b18576021926001926022604051968381810195600287018a5260f8830160208b015360031b610100031b878901528701015e8301010160405290565b905f5b82548110156125ed57825f5273ffffffffffffffffffffffffffffffffffffffff8160205f2001541673ffffffffffffffffffffffffffffffffffffffff8316146125e557600101612598565b505050600190565b5050505f90565b905f5b82518110156125ed5773ffffffffffffffffffffffffffffffffffffffff61261f8285611e3f565b511673ffffffffffffffffffffffffffffffffffffffff8316146125e5576001016125f7565b60ff7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff409116019060ff8211610b1857565b60ff7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc99116019060ff8211610b1857565b60ff7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff809116019060ff8211610b1857565b9092916060935f94815115612ccf5750815115612c93576126fb90949294613065565b6040515f9391908480805b8651881015612c81576127198888611e3f565b519183612bda575050888151602083012003612bc95761274790989392919860208101905160801b17612388565b975b885160110361291157825181036127ac575050505084516010101561277f575061022061277b939401519051906131e8565b9091565b807f4e487b7100000000000000000000000000000000000000000000000000000000602492526032600452fd5b9091929783518210156128e4576127cd906020838601015160f81c90611e3f565b5160018160801c1480612891575b612880576127e88161321f565b928391906001810180911161285357936020148015612837575b61281b57505061281190612388565b975b929190612749565b929394999150966001905b856040520196989392919098612706565b5060018901808a116128535761284e90898561324d565b612802565b6024887f4e487b710000000000000000000000000000000000000000000000000000000081526011600452fd5b505050505061277b9293505161318a565b507f80000000000000000000000000000000000000000000000000000000000000007fff000000000000000000000000000000000000000000000000000000000000006128dd83612f25565b16146127db565b6024857f4e487b710000000000000000000000000000000000000000000000000000000081526032600452fd5b9091929760028151145f14612bb85761293461292f610e2083611e22565b613065565b90815115612ba65760208201805160f81c9060038211612b92576129618560208901895160801b17612ff9565b935160801b176001821660020360ff8111612b65579060ff612984921690612ff9565b908160801c938060801c92838611918215612ab1575b5050612a9d57600110612a2f57508115612a1d57906129bc6129d49392611de0565b519160206129c98461321f565b959093869493610b0b565b94148015612a01575b6129f25750506129ec90612388565b97612813565b92939499915096600190612826565b5060018901808a1161285357612a1890898561324d565b6129dd565b50505050505050509050606090600790565b94509850915050145f14612a545750612a4b61277b9394611de0565b519051906131aa565b935090612a61915161318a565b92600e841015612a7057509190565b807f4e487b7100000000000000000000000000000000000000000000000000000000602492526021600452fd5b505050505050505061277b9293505161318a565b91909980612b38575061234b576fffffffffffffffffffffffffffffffff612b309116985f997fffffffffffffffffffffffffffffffff000000000000000000000000000000008216176fffffffffffffffffffffffffffffffff8160801c911620906fffffffffffffffffffffffffffffffff8160801c9116201490565b155f8061299a565b807f4e487b7100000000000000000000000000000000000000000000000000000000602492526011600452fd5b6024897f4e487b710000000000000000000000000000000000000000000000000000000081526011600452fd5b505050505050505050509050606090600b90565b50505050505050509050606090600590565b505050505050509050606090600c90565b505050505050509050606090600290565b82519160208310908382612c2c57506020148015939150612c1c575b5050612c0b57612747905b9893929198610df7565b505050505050509050606090600390565b6020840120141590505f80612bf6565b1492831593612c57575b505050612c465761274790612c01565b505050505050509050606090600490565b602085015192935090612c70575b5014155f8080612c36565b5f199060200360031b1b165f612c65565b50505050505050509050606090600d90565b50507f56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421919250145f14612cc7576060905f90565b606090600d90565b945060019392505050565b908160801c91821561227657612cef81612f25565b60f81c60c0811015612e54576080811015612d1057505f9250600191839150565b60b78111612da657612d2360ff916126a7565b168093119081612d3c575b501561227657600191905f90565b6001841480159250612d50575b505f612d2e565b7f80000000000000000000000000000000000000000000000000000000000000009150612d9d7fff0000000000000000000000000000000000000000000000000000000000000091612f5b565b1610155f612d49565b612db2612db7916126a7565b612676565b612dc460ff821692612f5b565b9082851180612e29575b156122765760ff81168303610b18576107f89060031b16610100036101008111610b18571c92603784119081612e16575b50156122765760018101809111610b185791905f90565b9050612e228483610b0b565b105f612dff565b507fff0000000000000000000000000000000000000000000000000000000000000082161515612dce565b9060f78211612e7a5750612e6960ff91612645565b168092111561227657600191908290565b90612db2612e8791612645565b612e9460ff821692612f5b565b9082851180612efa575b156122765760ff81168303610b18576107f89060031b16610100036101008111610b18571c92603784119081612ee7575b50156122765760018101809111610b18579190600190565b9050612ef38483610b0b565b105f612ecf565b507fff0000000000000000000000000000000000000000000000000000000000000082161515612e9e565b60208160801c5f0301602081111502601f811161234b575f196fffffffffffffffffffffffffffffffff9160031b1b9116511690565b60208160801c60010301602181111502601f811161234b576fffffffffffffffffffffffffffffffff5f1960019260031b1b921601511690565b90612fa08382610b0b565b8260801c1061234b576fffffffffffffffffffffffffffffffff612fc49216610b0b565b9060801b1790565b9060208260801c806fffffffffffffffffffffffffffffffff60405195828752168386015e830101604052565b908160801c9081811161234b576fffffffffffffffffffffffffffffffff61302482612fc494611f49565b9316610b0b565b815191906041830361305b576130549250602082015190606060408401519301515f1a906132b7565b9192909190565b50505f9160029190565b908151604051928160011b60208186010160405284525f5b82811061308957505050565b806020601092840101518060801c9060401c73ffffffff0000000000000000000000000000000073ffffffff000000000000000000000000ffffffff7bffffffff000000000000000000000000ffffffff00000000000000008477ffffffffffffffffffffffffffffffff000000000000000085161760201b1693169116171780831b177cff000000ff000000ff000000ff000000ff000000ff000000ff000000ff7eff000000ff000000ff000000ff000000ff000000ff000000ff000000ff00008260081b169116178060041b177f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f1660208260011b880101520161307d565b905f198201918211610b1857036131a2576060905f90565b606090600890565b909291925f935f198201918211610b1857036131de576131c99061235d565b8051156131d4579190565b5060609150600990565b5060609150600890565b915f198201918211610b185703613216576132029061235d565b80511561320e57905f90565b506060905f90565b50606090600890565b908160801c91602183105f1461323c5761323890612f25565b9190565b61324791925061229e565b90602090565b9091825181109283613260575b50505090565b6132af93509061326f91611e3f565b5160208101905160801b176fffffffffffffffffffffffffffffffff8160801c911620906fffffffffffffffffffffffffffffffff8160801c9116201490565b5f808061325a565b91907f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08411613346579160209360809260ff5f9560405194855216868401526040830152606082015282805260015afa1561333b575f5173ffffffffffffffffffffffffffffffffffffffff81161561333157905f905f90565b505f906001905f90565b6040513d5f823e3d90fd5b5050505f916003919056fea164736f6c634300081c000a2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d4c48d1d2b0f4f7485fc28e3db22341d96a20aa29e6efa8149da9751603abd4e06e0c24a6e293ff9b755263dbaa15ba3796b0b8d3fe17cfb4ddf8143b268eac47bd893629a699470e4ec82a5715bb4981fdaacc5d0a728bf5f55b801d8f4ef10bad3228b676f7d3cd4284a5443f17f1962b36e491b30a40b2405849e597ba5fb5"}} diff --git a/ibc-solidity/abi/bytecode/BesuQBFTLightClient.json b/ibc-solidity/abi/bytecode/BesuQBFTLightClient.json index 3b9952f83..b180fd124 100644 --- a/ibc-solidity/abi/bytecode/BesuQBFTLightClient.json +++ b/ibc-solidity/abi/bytecode/BesuQBFTLightClient.json @@ -1 +1 @@ -{"abi":[{"type":"constructor","inputs":[{"name":"ibcRouter","type":"address","internalType":"address"},{"name":"initialTrustedHeight","type":"uint64","internalType":"uint64"},{"name":"initialTrustedTimestamp","type":"uint64","internalType":"uint64"},{"name":"initialTrustedStorageRoot","type":"bytes32","internalType":"bytes32"},{"name":"initialTrustedValidators","type":"address[]","internalType":"address[]"},{"name":"trustingPeriod","type":"uint64","internalType":"uint64"},{"name":"maxClockDrift","type":"uint64","internalType":"uint64"},{"name":"roleManager","type":"address","internalType":"address"}],"stateMutability":"nonpayable"},{"type":"function","name":"DEFAULT_ADMIN_ROLE","inputs":[],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"type":"function","name":"PROOF_SUBMITTER_ROLE","inputs":[],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"type":"function","name":"getClientState","inputs":[],"outputs":[{"name":"","type":"bytes","internalType":"bytes"}],"stateMutability":"view"},{"type":"function","name":"getConsensusState","inputs":[{"name":"revisionHeight","type":"uint64","internalType":"uint64"}],"outputs":[{"name":"","type":"bytes","internalType":"bytes"}],"stateMutability":"view"},{"type":"function","name":"getRoleAdmin","inputs":[{"name":"role","type":"bytes32","internalType":"bytes32"}],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"type":"function","name":"grantRole","inputs":[{"name":"role","type":"bytes32","internalType":"bytes32"},{"name":"account","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"hasRole","inputs":[{"name":"role","type":"bytes32","internalType":"bytes32"},{"name":"account","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"misbehaviour","inputs":[{"name":"","type":"bytes","internalType":"bytes"}],"outputs":[],"stateMutability":"view"},{"type":"function","name":"renounceRole","inputs":[{"name":"role","type":"bytes32","internalType":"bytes32"},{"name":"callerConfirmation","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"revokeRole","inputs":[{"name":"role","type":"bytes32","internalType":"bytes32"},{"name":"account","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"supportsInterface","inputs":[{"name":"interfaceId","type":"bytes4","internalType":"bytes4"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"updateClient","inputs":[{"name":"updateMsg","type":"bytes","internalType":"bytes"}],"outputs":[{"name":"","type":"uint8","internalType":"enum ILightClientMsgs.UpdateResult"}],"stateMutability":"nonpayable"},{"type":"function","name":"verifyMembership","inputs":[{"name":"msg_","type":"tuple","internalType":"struct ILightClientMsgs.MsgVerifyMembership","components":[{"name":"proof","type":"bytes","internalType":"bytes"},{"name":"proofHeight","type":"tuple","internalType":"struct IICS02ClientMsgs.Height","components":[{"name":"revisionNumber","type":"uint64","internalType":"uint64"},{"name":"revisionHeight","type":"uint64","internalType":"uint64"}]},{"name":"path","type":"bytes[]","internalType":"bytes[]"},{"name":"value","type":"bytes","internalType":"bytes"}]}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"verifyNonMembership","inputs":[{"name":"msg_","type":"tuple","internalType":"struct ILightClientMsgs.MsgVerifyNonMembership","components":[{"name":"proof","type":"bytes","internalType":"bytes"},{"name":"proofHeight","type":"tuple","internalType":"struct IICS02ClientMsgs.Height","components":[{"name":"revisionNumber","type":"uint64","internalType":"uint64"},{"name":"revisionHeight","type":"uint64","internalType":"uint64"}]},{"name":"path","type":"bytes[]","internalType":"bytes[]"}]}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"event","name":"RoleAdminChanged","inputs":[{"name":"role","type":"bytes32","indexed":true,"internalType":"bytes32"},{"name":"previousAdminRole","type":"bytes32","indexed":true,"internalType":"bytes32"},{"name":"newAdminRole","type":"bytes32","indexed":true,"internalType":"bytes32"}],"anonymous":false},{"type":"event","name":"RoleGranted","inputs":[{"name":"role","type":"bytes32","indexed":true,"internalType":"bytes32"},{"name":"account","type":"address","indexed":true,"internalType":"address"},{"name":"sender","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"type":"event","name":"RoleRevoked","inputs":[{"name":"role","type":"bytes32","indexed":true,"internalType":"bytes32"},{"name":"account","type":"address","indexed":true,"internalType":"address"},{"name":"sender","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"type":"error","name":"AccessControlBadConfirmation","inputs":[]},{"type":"error","name":"AccessControlUnauthorizedAccount","inputs":[{"name":"account","type":"address","internalType":"address"},{"name":"neededRole","type":"bytes32","internalType":"bytes32"}]},{"type":"error","name":"ConflictingConsensusState","inputs":[{"name":"revisionHeight","type":"uint64","internalType":"uint64"}]},{"type":"error","name":"ConsensusStateExpired","inputs":[{"name":"trustedTimestamp","type":"uint64","internalType":"uint64"},{"name":"currentTimestamp","type":"uint256","internalType":"uint256"},{"name":"trustingPeriod","type":"uint64","internalType":"uint64"}]},{"type":"error","name":"ConsensusStateNotFound","inputs":[{"name":"revisionHeight","type":"uint64","internalType":"uint64"}]},{"type":"error","name":"DuplicateCommitSealSigner","inputs":[{"name":"signer","type":"address","internalType":"address"}]},{"type":"error","name":"DuplicateValidator","inputs":[{"name":"validator","type":"address","internalType":"address"}]},{"type":"error","name":"EmptyValidatorSet","inputs":[]},{"type":"error","name":"HeaderFromFuture","inputs":[{"name":"currentTimestamp","type":"uint256","internalType":"uint256"},{"name":"headerTimestamp","type":"uint256","internalType":"uint256"},{"name":"maxClockDrift","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"InsufficientTrustedValidatorOverlap","inputs":[{"name":"actual","type":"uint256","internalType":"uint256"},{"name":"required","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"InsufficientValidatorQuorum","inputs":[{"name":"actual","type":"uint256","internalType":"uint256"},{"name":"required","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"InvalidCommitSeal","inputs":[]},{"type":"error","name":"InvalidCommitmentValue","inputs":[{"name":"expectedValue","type":"bytes32","internalType":"bytes32"},{"name":"actualValue","type":"bytes32","internalType":"bytes32"}]},{"type":"error","name":"InvalidDifficulty","inputs":[{"name":"actualDifficulty","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"InvalidECDSASignatureLength","inputs":[{"name":"length","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"InvalidExtraDataFormat","inputs":[{"name":"itemsLength","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"InvalidHeaderFormat","inputs":[{"name":"itemsLength","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"InvalidHeaderHeight","inputs":[]},{"type":"error","name":"InvalidHeaderTimestamp","inputs":[]},{"type":"error","name":"InvalidMixHash","inputs":[{"name":"actualMixHash","type":"bytes32","internalType":"bytes32"}]},{"type":"error","name":"InvalidNonce","inputs":[{"name":"actualNonce","type":"bytes","internalType":"bytes"}]},{"type":"error","name":"InvalidOmmersHash","inputs":[{"name":"actualOmmersHash","type":"bytes32","internalType":"bytes32"}]},{"type":"error","name":"InvalidPathLength","inputs":[{"name":"expectedLength","type":"uint256","internalType":"uint256"},{"name":"actualLength","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"InvalidRevisionNumber","inputs":[{"name":"providedRevisionNumber","type":"uint64","internalType":"uint64"}]},{"type":"error","name":"InvalidValidatorAddress","inputs":[{"name":"validator","type":"address","internalType":"address"}]},{"type":"error","name":"InvalidValidatorAddressLength","inputs":[{"name":"length","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"InvalidValueLength","inputs":[{"name":"expectedLength","type":"uint256","internalType":"uint256"},{"name":"actualLength","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"UnsupportedMisbehaviour","inputs":[]},{"type":"error","name":"ValueExists","inputs":[{"name":"actualValue","type":"bytes32","internalType":"bytes32"}]}],"bytecode":{"object":"0x6080604052346103d85761394280380380610019816103dc565b928339810190610100818303126103d85761003381610401565b9061004060208201610415565b9061004d60408201610415565b92606082015191608081015160018060401b0381116103d85781019286601f850112156103d8578351966001600160401b03881161037f578760051b9460206100978188016103dc565b809a81520190602082978201019283116103d857602001905b8282106103c0575050506100c660a08301610415565b956100df60e06100d860c08601610415565b9401610401565b956001600160401b03169081156103b1576001600160401b03169283156103a257885115610393575f5b89518110156101bf576001600160a01b03610124828c610429565b511615610198575f5b81811061013d5750600101610109565b6001600160a01b0361014f828d610429565b51166001600160a01b03610163848e610429565b5116146101725760010161012d565b6001600160a01b03610184838d610429565b511663107f863360e21b5f5260045260245ffd5b6001600160a01b03906101ab908b610429565b51166359bff38760e01b5f5260045260245ffd5b5060408051979896978a979181016001600160401b0381118282101761037f576040525f81526020810190848252604051926080840198848a1060018060401b038b111761037f576040998a526001600160a01b031680855260208086018490526001600160401b03928316868c01819052878416606090970196909652600180546001600160a01b031916909217825592516002805495516fffffffffffffffff0000000000000000908d1b81169285166001600160801b03199788161792909217815560038054988d1b90921697909516909517959095179093555f948552600490529590922080546001600160401b031916949094178455830191909155925193910191831161037f5768010000000000000000831161037f578154838355808410610359575b50905f5260205f205f5b83811061033c57846001600160a01b0381166103235750610312610547565b505b6040516132d890816105ca8239f35b8061033061033692610451565b506104c7565b50610314565b82516001600160a01b0316818301556020909201916001016102f3565b825f528360205f2091820191015b81811061037457506102e9565b5f8155600101610367565b634e487b7160e01b5f52604160045260245ffd5b63339e1ffb60e01b5f5260045ffd5b63574f4e6160e01b5f5260045ffd5b6359d119e360e01b5f5260045ffd5b602080916103cd84610401565b8152019101906100b0565b5f80fd5b6040519190601f01601f191682016001600160401b0381118382101761037f57604052565b51906001600160a01b03821682036103d857565b51906001600160401b03821682036103d857565b805182101561043d5760209160051b010190565b634e487b7160e01b5f52603260045260245ffd5b6001600160a01b0381165f9081525f5160206139225f395f51905f52602052604090205460ff166104c2576001600160a01b03165f8181525f5160206139225f395f51905f5260205260408120805460ff191660011790553391905f5160206138a25f395f51905f528180a4600190565b505f90565b6001600160a01b0381165f9081525f5160206138c25f395f51905f52602052604090205460ff166104c2576001600160a01b03165f8181525f5160206138c25f395f51905f5260205260408120805460ff191660011790553391905f5160206139025f395f51905f52905f5160206138a25f395f51905f529080a4600190565b5f80525f5160206138c25f395f51905f526020525f5160206138e25f395f51905f525460ff166105c5575f8080525f5160206138c25f395f51905f526020525f5160206138e25f395f51905f52805460ff1916600117905533905f5160206139025f395f51905f525f5160206138a25f395f51905f528280a4600190565b5f9056fe60806040526004361015610011575f80fd5b5f3560e01c806301ffc9a7146100f45780630bece356146100ef578063248a9ca3146100ea5780632f2ff15d146100e557806336568abe146100e05780634d6d9ffb146100db5780635972185a146100d6578063682ed5f0146100d157806391d14854146100cc578063a217fddf146100c7578063d547741f146100c2578063ddba6537146100bd578063edce8bdc146100b85763ef913a4b146100b3575f80fd5b6109c8565b61095e565b61088b565b61085c565b610842565b6107f4565b6105e6565b6105ac565b6103ac565b610350565b61031a565b6102b5565b610217565b34610195576020600319360112610195576004357fffffffff00000000000000000000000000000000000000000000000000000000811680910361019557807f7965db0b000000000000000000000000000000000000000000000000000000006020921490811561016b575b506040519015158152f35b7f01ffc9a7000000000000000000000000000000000000000000000000000000009150145f610160565b5f80fd5b9060206003198301126101955760043567ffffffffffffffff811161019557826023820112156101955780600401359267ffffffffffffffff84116101955760248483010111610195576024019190565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b346101955761028161022836610199565b5f80527f4c48d1d2b0f4f7485fc28e3db22341d96a20aa29e6efa8149da9751603abd4e06020527f6e0c24a6e293ff9b755263dbaa15ba3796b0b8d3fe17cfb4ddf8143b268eac475490919060ff161561029957610d17565b6040516003821015610294576020918152f35b6101ea565b6102a1611275565b610d17565b90816020910312610195573590565b346101955760206003193601126101955760206102df6004355f525f602052600160405f20015490565b604051908152f35b6003196040910112610195576004359060243573ffffffffffffffffffffffffffffffffffffffff811681036101955790565b346101955761034e61032b366102e7565b90610349610344825f525f602052600160405f20015490565b6112fd565b6121d8565b005b346101955761035e366102e7565b3373ffffffffffffffffffffffffffffffffffffffff8216036103845761034e916122af565b7f6697b232000000000000000000000000000000000000000000000000000000005f5260045ffd5b346101955760206003193601126101955760043567ffffffffffffffff8111610195578060040160806003198336030112610195575f80527f4c48d1d2b0f4f7485fc28e3db22341d96a20aa29e6efa8149da9751603abd4e060205260ff7f6e0c24a6e293ff9b755263dbaa15ba3796b0b8d3fe17cfb4ddf8143b268eac4754161561059f575b61044761044260248401611133565b61136a565b60648201916001610458848461113d565b90500361056157906104a96104966104a261049d61049661049061048961048460446104e09a01611133565b611b0f565b988761113d565b9061120f565b3691610aff565b612384565b92806111be565b906001840154906040516104d7816104c960208201948560209181520190565b03601f198101835282610aaf565b51902091612412565b805161051f5761051b61050b6104fe845467ffffffffffffffff1690565b67ffffffffffffffff1690565b6040519081529081906020820190565b0390f35b61053361052e61055e92612557565b612584565b7fd039601e000000000000000000000000000000000000000000000000000000005f52600452602490565b5ffd5b61055e61056e848461113d565b7f88b3170e000000000000000000000000000000000000000000000000000000005f52600160045260245250604490565b6105a7611275565b610433565b34610195575f6003193601126101955760206040517fbd893629a699470e4ec82a5715bb4981fdaacc5d0a728bf5f55b801d8f4ef10b8152f35b346101955760206003193601126101955760043567ffffffffffffffff8111610195578060040160a06003198336030112610195575f80527f4c48d1d2b0f4f7485fc28e3db22341d96a20aa29e6efa8149da9751603abd4e060205260ff7f6e0c24a6e293ff9b755263dbaa15ba3796b0b8d3fe17cfb4ddf8143b268eac475416156107e7575b61067c61044260248401611133565b6064820191600161068d848461113d565b90500361056157608481019060206106a583856111be565b9050036107a957906106f46104966106ed6106e56106de61049d6104966104906106d761048460446107149c01611133565b9b8b61113d565b94876111be565b8101906102a6565b94806111be565b906001850154906040516104d7816104c960208201948560209181520190565b8051156107755761052e61072791612557565b908082036107475761051b61050b6104fe855467ffffffffffffffff1690565b7f56ed1b63000000000000000000000000000000000000000000000000000000005f5260045260245260445ffd5b61055e827f56ed1b63000000000000000000000000000000000000000000000000000000005f52906044916004525f602452565b61055e6107b683856111be565b7f24fadac8000000000000000000000000000000000000000000000000000000005f52602060045260245250604490565b6107ef611275565b61066d565b3461019557602060ff610836610809366102e7565b905f525f845260405f209073ffffffffffffffffffffffffffffffffffffffff165f5260205260405f2090565b54166040519015158152f35b34610195575f6003193601126101955760206040515f8152f35b346101955761034e61086d366102e7565b90610886610344825f525f602052600160405f20015490565b6122af565b346101955761089936610199565b50505f80527f4c48d1d2b0f4f7485fc28e3db22341d96a20aa29e6efa8149da9751603abd4e06020527f6e0c24a6e293ff9b755263dbaa15ba3796b0b8d3fe17cfb4ddf8143b268eac475460ff1615610915575b7f2c1ed462000000000000000000000000000000000000000000000000000000005f5260045ffd5b61091d611275565b6108ed565b67ffffffffffffffff81160361019557565b601f19601f602060409481855280519182918282880152018686015e5f8582860101520116010190565b346101955760206003193601126101955761051b61098160043561048481610922565b6109bc67ffffffffffffffff8254166104c9600184015493604051948593602085015260408401526060808401526002608084019101611228565b60405191829182610934565b34610195575f6003193601126101955761051b60405173ffffffffffffffffffffffffffffffffffffffff60015416602082015267ffffffffffffffff600254818116604084015260401c16606082015267ffffffffffffffff600354818116608084015260401c1660a082015260a081526109bc60c082610aaf565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b6060810190811067ffffffffffffffff821117610a8e57604052565b610a45565b6040810190811067ffffffffffffffff821117610a8e57604052565b90601f601f19910116810190811067ffffffffffffffff821117610a8e57604052565b60405190610ae1604083610aaf565b565b67ffffffffffffffff8111610a8e57601f01601f191660200190565b929192610b0b82610ae3565b91610b196040519384610aaf565b829481845281830111610195578281602093845f960137010152565b9080601f8301121561019557816020610b5093359101610aff565b90565b6020818303126101955780359067ffffffffffffffff8211610195570180820391608083126101955760405192610b8984610a72565b823567ffffffffffffffff811161019557604091610bac84601f19938701610b35565b8652011261019557604051610bc081610a93565b6020830135610bce81610922565b81526040830135610bde81610922565b60208201526020840152606082013567ffffffffffffffff811161019557610c069201610b35565b604082015290565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b9060018201809211610c4957565b610c0e565b91908201809211610c4957565b908160011b9180830460021490151715610c4957565b81519167ffffffffffffffff8311610a8e57680100000000000000008311610a8e578154838355808410610cf1575b506020610cb29101915f5260205f2090565b5f5b838110610cc15750505050565b6001906020610ce4855173ffffffffffffffffffffffffffffffffffffffff1690565b9401938184015501610cb4565b825f528360205f2091820191015b818110610d0c5750610ca0565b5f8155600101610cff565b610d2391810190610b53565b906020820191610d3f61044284515167ffffffffffffffff1690565b610d4981516115fb565b92604084019367ffffffffffffffff610d6a865167ffffffffffffffff1690565b161561110b576080810192610d8a6104fe855167ffffffffffffffff1690565b156110e3576003549267ffffffffffffffff604085901c16610dac8142610c4e565b865167ffffffffffffffff169081116110a45750505160200151610deb90610ddd9067ffffffffffffffff16611b0f565b9367ffffffffffffffff1690565b67ffffffffffffffff8116801515908161107b575b50611026575090610e6e91610e2f6002610e27610e1c85611ba1565b60c086015190611cd2565b950185611eeb565b610e3f60a0830194855190612010565b60406060610e6260015473ffffffffffffffffffffffffffffffffffffffff1690565b930151910151916120b3565b610e9b610e83865167ffffffffffffffff1690565b67ffffffffffffffff165f52600460205260405f2090565b610eb06104fe825467ffffffffffffffff1690565b610fb45750916002610f2e928694610f21610eec610edd610e83610f3c9a9b5167ffffffffffffffff1690565b955167ffffffffffffffff1690565b859067ffffffffffffffff167fffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000825416179055565b6001840155519101610c71565b5167ffffffffffffffff1690565b600254610f559060401c67ffffffffffffffff166104fe565b67ffffffffffffffff821611610f6a57505f90565b610fb0907fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff6fffffffffffffffff00000000000000006002549260401b16911617600255565b5f90565b91610fca610fd2945167ffffffffffffffff1690565b905192612163565b6110205761055e610feb835167ffffffffffffffff1690565b7fc1aea5f7000000000000000000000000000000000000000000000000000000005f5267ffffffffffffffff16600452602490565b60029150565b61055e9061103c855467ffffffffffffffff1690565b7feae35725000000000000000000000000000000000000000000000000000000005f5267ffffffffffffffff9081166004524260245216604452606490565b905061109c42916110976104fe885467ffffffffffffffff1690565b610c4e565b11155f610e00565b7f9b772277000000000000000000000000000000000000000000000000000000005f524260045267ffffffffffffffff9081166024521660445260645ffd5b7f574f4e61000000000000000000000000000000000000000000000000000000005f5260045ffd5b7f59d119e3000000000000000000000000000000000000000000000000000000005f5260045ffd5b35610b5081610922565b9035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe181360301821215610195570180359067ffffffffffffffff821161019557602001918160051b3603831361019557565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b9035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe181360301821215610195570180359067ffffffffffffffff82116101955760200191813603831361019557565b9015611223578061121f916111be565b9091565b611191565b90602082549182815201915f5260205f20905f5b8181106112495750505090565b825473ffffffffffffffffffffffffffffffffffffffff1684526020909301926001928301920161123c565b335f9081527f4c48d1d2b0f4f7485fc28e3db22341d96a20aa29e6efa8149da9751603abd4e0602052604090205460ff16156112ad57565b7fe2517d3f000000000000000000000000000000000000000000000000000000005f52336004527fbd893629a699470e4ec82a5715bb4981fdaacc5d0a728bf5f55b801d8f4ef10b60245260445ffd5b805f525f60205260ff6113313360405f209073ffffffffffffffffffffffffffffffffffffffff165f5260205260405f2090565b54161561133b5750565b7fe2517d3f000000000000000000000000000000000000000000000000000000005f523360045260245260445ffd5b67ffffffffffffffff168061137c5750565b7f3ce598a9000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b6040519060e0820182811067ffffffffffffffff821117610a8e57604052606060c0838281528260208201525f60408201525f838201525f60808201528260a08201520152565b8051600110156112235760400190565b805160071015611223576101000190565b8051600d1015611223576101c00190565b8051600e1015611223576101e00190565b805160081015611223576101200190565b8051600310156112235760800190565b8051600b1015611223576101800190565b8051600c1015611223576101a00190565b8051600410156112235760a00190565b8051156112235760200190565b8051600210156112235760600190565b805160101015611223576102200190565b80518210156112235760209160051b010190565b67ffffffffffffffff8111610a8e5760051b60200190565b906114e8826114c6565b6114f56040519182610aaf565b828152601f1961150582946114c6565b0190602036910137565b90602082519201517fffffffffffffffffffffffffffffffffffffffff00000000000000000000000081169260148110611547575050565b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000929350829060140360031b1b161690565b60405160c0919061158a8382610aaf565b6005815291601f1901825f5b8281106115a257505050565b806060602080938501015201611596565b906115bd826114c6565b6115ca6040519182610aaf565b828152601f196115da82946114c6565b01905f5b8281106115ea57505050565b8060606020809385010152016115de565b61161461160f6116096113a7565b92612557565b6125c6565b80825251600f8110611ae457507f1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d4934761165561164f83516113ee565b51612691565b03611aa957600161166f61166983516113fe565b51612584565b03611a6e577f63746963616c2062797a616e74696e65206661756c7420746f6c6572616e63656116a261164f835161140f565b03611a33576116ba6116b48251611420565b516126ad565b80516008811490811591611a03575b506119c957506116f36116e26104fe6116698451611431565b67ffffffffffffffff166040830152565b61170061164f8251611442565b60608201526117296117186104fe6116698451611452565b67ffffffffffffffff166080830152565b61174161160f61173c6116b48451611463565b612557565b906020810191808352516005810361199e575061176761176183516113ee565b516125c6565b908151156119765761177982516114de565b9360a082019485525f5b8351811015611912576117996116b482866114b2565b8051601481036118e757506117b06117b69161150f565b60601c90565b73ffffffffffffffffffffffffffffffffffffffff811680156118a5575f5b8381106118115750509061180b6001926117f0838a516114b2565b9073ffffffffffffffffffffffffffffffffffffffff169052565b01611783565b8161185661183d611823848d516114b2565b5173ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff1690565b14611863576001016117d5565b7f41fe18cc000000000000000000000000000000000000000000000000000000005f5273ffffffffffffffffffffffffffffffffffffffff831660045260245ffd5b7f59bff387000000000000000000000000000000000000000000000000000000005f5273ffffffffffffffffffffffffffffffffffffffff821660045260245ffd5b7f83e46ad2000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b5092611761919450611925925051611474565b61192f81516115b3565b9260c081019384525f5b82518110156119705780611969816119566116b4600195886114b2565b88519061196383836114b2565b526114b2565b5001611939565b50925050565b7f339e1ffb000000000000000000000000000000000000000000000000000000005f5260045ffd5b7f30c6792a000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b6119ff906040519182917fd5edd2a500000000000000000000000000000000000000000000000000000000835260048301610934565b0390fd5b7f011b4d03dd8c01f1049143cf9c4c817e4b167f1d1b83e5c6f0f10d89ba1e7bce9150602083012014155f6116c9565b611a4361164f61055e925161140f565b7fa19e609c000000000000000000000000000000000000000000000000000000005f52600452602490565b611a7e61166961055e92516113fe565b7ff71b722f000000000000000000000000000000000000000000000000000000005f52600452602490565b611ab961164f61055e92516113ee565b7fb8120dca000000000000000000000000000000000000000000000000000000005f52600452602490565b7fbc277732000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b67ffffffffffffffff1690815f52600460205260405f209167ffffffffffffffff83541615611b3b5750565b7ff761631b000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b60405190611b75604083610aaf565b600182527fc0000000000000000000000000000000000000000000000000000000000000006020830152565b611c5a611bac611579565b611c25611bc360208501611bc9611bc38251611484565b51612f9f565b611bd285611484565b52611bdc84611484565b50611bea611bc382516113ee565b611bf3856113ee565b52611bfd846113ee565b50611c0b611bc38251611491565b611c1485611491565b52611c1e84611491565b5051611442565b611c2e82611442565b52611c3881611442565b50611c41611b66565b611c4a82611474565b52611c5481611474565b506126d7565b611c658251516115b3565b905f5b83518051821015611cbb579080600192600c82145f14611ca9575050611c8d8361276f565b611c9782866114b2565b52611ca281856114b2565b5001611c68565b611cb691611bc3916114b2565b611c8d565b505050611cc891506126d7565b6020815191012090565b919091611cdf83516114de565b925f5b8151811015611ed857611cf581836114b2565b51805160418103611ead575080601b60ff611d44611d3e611d18611d519661274e565b517fff000000000000000000000000000000000000000000000000000000000000001690565b60f81c90565b1610611e5a575b8461308b565b90611d5b8161289d565b1590811591611e50575b508015611e32575b611e0a5773ffffffffffffffffffffffffffffffffffffffff81165f5b838110611daa57505090611da46001926117f083896114b2565b01611ce2565b81611dbb61183d611823848c6114b2565b14611dc857600101611d8a565b7f33af0d5f000000000000000000000000000000000000000000000000000000005f5273ffffffffffffffffffffffffffffffffffffffff831660045260245ffd5b7f09cb44e6000000000000000000000000000000000000000000000000000000005f5260045ffd5b5073ffffffffffffffffffffffffffffffffffffffff811615611d6d565b905015155f611d65565b611e9c611e74611e6f611d3e611d188561274e565b61288b565b60f81b7fff000000000000000000000000000000000000000000000000000000000000001690565b5f1a611ea78261274e565b53611d4b565b7ff2db9ce1000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b505050565b5f198114610c495760010190565b905f915f5b8151811015611f4457611f2373ffffffffffffffffffffffffffffffffffffffff611f1b83856114b2565b5116846128a7565b611f30575b600101611ef0565b92611f3c600191611edd565b939050611f28565b50506003611f53915404610c3b565b90818110611f5f575050565b7fe2dcb1b9000000000000000000000000000000000000000000000000000000005f5260045260245260445ffd5b905f198201918211610c4957565b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff408201918211610c4957565b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff808201918211610c4957565b6020039060208211610c4957565b91908203918211610c4957565b905f915f5b81518110156120695761204873ffffffffffffffffffffffffffffffffffffffff61204083856114b2565b511684612906565b612055575b600101612015565b92612061600191611edd565b93905061204d565b50505190600382048203918211610c4957818110612085575050565b7f7818f4e4000000000000000000000000000000000000000000000000000000005f5260045260245260445ffd5b6120fd9261160f9261173c926040517fffffffffffffffffffffffffffffffffffffffff000000000000000000000000602082019260601b168252601481526104d7603482610aaf565b805160021015611223576060610b50910151612691565b60206040818301928281528451809452019201905f5b8181106121375750505090565b825173ffffffffffffffffffffffffffffffffffffffff1684526020938401939092019160010161212a565b919067ffffffffffffffff80845416911614908115916121c9575b506121c3576040516121a3816104c96020820194602086526002604084019101611228565b519020906040516121bc816104c9602082019485612114565b5190201490565b50505f90565b9050600182015414155f61217e565b805f525f60205260ff61220c8360405f209073ffffffffffffffffffffffffffffffffffffffff165f5260205260405f2090565b54166121c357805f525f6020526122448260405f209073ffffffffffffffffffffffffffffffffffffffff165f5260205260405f2090565b60017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0082541617905573ffffffffffffffffffffffffffffffffffffffff339216907f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d5f80a4600190565b805f525f60205260ff6122e38360405f209073ffffffffffffffffffffffffffffffffffffffff165f5260205260405f2090565b5416156121c357805f525f60205261231c8260405f209073ffffffffffffffffffffffffffffffffffffffff165f5260205260405f2090565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00815416905573ffffffffffffffffffffffffffffffffffffffff339216907ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b5f80a4600190565b60208151910120604051602081019182527f1260944489272988d9df285149b5aa1b0f48f2136d6f416159f840a3e07476006040820152604081526123ca606082610aaf565b51902090565b604051906123df602083610aaf565b5f808352366020840137565b906123f582610ae3565b6124026040519182610aaf565b828152601f196115058294610ae3565b61160f612454919493946124266020610ae3565b956124346040519788610aaf565b602087526124426020610ae3565b601f1960208901910136823752612557565b9061245f8451610c5b565b918451151580612537575b6124739061257d565b6124856124805f85612003565b6123eb565b925f19015f5b81811061249f575050610b50939450612a7a565b80612521600f6124e461251b611d3e611d188d6124be60029960011c90565b908d6125158a61250d8a6124e46124db611d3e611d188a8a61275e565b60041c600f1690565b1660f81b7fff000000000000000000000000000000000000000000000000000000000000001690565b5f1a9261275e565b5361275e565b60ff1690565b5f1a612530600183018861275e565b530161248b565b50600161246a565b6040519061254c82610a93565b5f6020838281520152565b61255f61253f565b5060208151916040519261257284610a93565b835201602082015290565b1561019557565b805180151590816125ba575b50156101955761259f90612d50565b905190602081106125ae575090565b6020036101000a900490565b6021915011155f612590565b6125cf81612d7c565b15610195576125dd81612d9c565b6125e6816114c6565b916125f46040519384610aaf565b818352601f19612603836114c6565b015f5b81811061267a575050602061262691015161262081612dfd565b90610c4e565b5f905b8282106126365750505090565b61267281612645600193612e63565b9061264e610ad2565b82815281602082015261266186896114b2565b5261266c85886114b2565b50610c4e565b910190612629565b60209061268561253f565b82828801015201612606565b6021815103610195576020015160018101809111610c49575190565b805115610195576126c0610b5091612d50565b6126cc819392936123eb565b928360200190612f2c565b5f9190825b8151841015612705576126ef84836114b2565b51518101809111610c49576001909301926126dc565b6127109193506123eb565b5f9060205b84518310156127405760019061272b84876114b2565b518051602082018386015e5101920191612715565b509050610b50919250612fcb565b8051604010156112235760600190565b908151811015611223570160200190565b8051600181149081612873575b50156127af57610b50602080926040519381859251918291018484015e81015f838201520301601f198101835282610aaf565b8051603781116127df57806021916020604051946001830186526080830182870153018385015e82010160405290565b9060219061283c6128378460ff6fffffffffffffffffffffffffffffffff821160071b67ffffffffffffffff83821c1160061b1763ffffffff83821c1160051b1761ffff83821c1160041b17918260031c921c111790565b610c3b565b92604051938360208284019460018601885260b7840182890153848460031b610100031b8389015201918601015e82010160405290565b905015611223576080602082015160f81c105f61277c565b60ff601b9116019060ff8211610c4957565b6004111561029457565b905f5b82548110156128ff57825f5273ffffffffffffffffffffffffffffffffffffffff8160205f2001541673ffffffffffffffffffffffffffffffffffffffff8316146128f7576001016128aa565b505050600190565b5050505f90565b905f5b82518110156128ff5773ffffffffffffffffffffffffffffffffffffffff61293182856114b2565b511673ffffffffffffffffffffffffffffffffffffffff8316146128f757600101612909565b91906129638351610c5b565b908351151580612a70575b6129779061257d565b6129846124808284612003565b938192600180841614612a0e575b5f19869101935b8481106129a7575050505050565b83612a0560016129fb600f6124e461251b611d3e611d188b60029b6129f46129e7886124e48f611d3e611d186129e06124db9360011c90565b809961275e565b9b8d03809c5f1a9261275e565b538c61275e565b5f1a92018961275e565b53018590612999565b92507f0f00000000000000000000000000000000000000000000000000000000000000612a4d61251b611d3e611d18612a478760011c90565b8661275e565b60f81b165f1a612a5c86611484565b535f19612a6883611edd565b939050612992565b508181111561296e565b915f915f612a8661253f565b50845115612d175790935f915b81518310156101955782158080612d01575b61019557159081612ce4575b5061019557612ac361176183836114b2565b948551600281145f14612bc05750612ae5612ae06116b488611484565b613120565b95612afb612af488888461318d565b8092610c4e565b965111612ba25715612b325750612b129051611f8d565b11610195575111612b29576116b4610b50916113ee565b50610b506123d0565b919094612b3f8651611f8d565b82146101955780612b61612b5d612b576001946113ee565b51612d7c565b1590565b15612b8357612b72612b78916113ee565b51613112565b915b01919490612a93565b612b8f612b9c916113ee565b5160208101519051902090565b91612b7a565b505091509250612bb3915051611f8d565b1161019557610b506123d0565b929491939192601103612c855781518314612c6757612bf1612beb61251b611d3e611d18878761275e565b93610c3b565b92601081101561019557612c0e612c0882896114b2565b516130fc565b15612c305750505050612c2391925051611f8d565b0361019557610b506123d0565b86612c48612b5d612b5784600196989a97999b6114b2565b15612c5a57612b9c91612b72916114b2565b612b9c91612b8f916114b2565b505050612c749051611f8d565b03610195576116b4610b50916114a1565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f696e76616c6964206e6f6465206c656e677468000000000000000000000000006044820152606490fd5b9050612cf9612cf384846114b2565b516130c5565b14155f612ab1565b50612d0f612b8f85856114b2565b871415612aa5565b509050612d4892507f56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b42191501461257d565b610b506123d0565b906020820191612d608351612dfd565b925190838201809211610c495751928303928311610c49579190565b805115612d9757602060c0910151515f1a10610fb057600190565b505f90565b805115612d97575f9060208101908151612db581612dfd565b8101809111610c4957915190518101809111610c495791905b828110612ddb5750905090565b612de481612e63565b8101809111610c4957612df79091611edd565b90612dce565b515f1a6080811015612e0e57505f90565b60b881108015612e4d575b15612e245750600190565b60c0811015612e3e57610b50906128379060b75b90612003565b610b50906128379060f7612e38565b5060c08110158015612e19575060f88110612e19565b80515f1a906080821015612e78575050600190565b60b8821015612e8e5750612837610b5091611fc8565b60c0821015612ecf5760010151602082900360b7016101000a9004017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff4a0190565b60f8821015612ee55750612837610b5091611f9b565b60010151602082900360f7016101000a9004017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0a0190565b601f8111610c49576101000a90565b90918015611ed8575b6020811015612f6f5780612f4857505050565b612f5c612f57612f6192611ff5565b612f1d565b611f8d565b905182518216911916179052565b91908051825260208101809111610c49579060208101809111610c495791601f19810190811115612f3557610c0e565b612fa981516123eb565b90815115612fc757806020610b509201519051908360200190612f2c565b5090565b805190919060378111612ffd578060219160206040519560018301875260c0830182880153018386015e830101604052565b916021906130556128378560ff6fffffffffffffffffffffffffffffffff821160071b67ffffffffffffffff83821c1160061b1763ffffffff83821c1160051b1761ffff83821c1160041b17918260031c921c111790565b93604051948360208284019460018601895260f78401828a0153848460031b610100031b838a015201918701015e830101604052565b81519190604183036130bb576130b49250602082015190606060408401519301515f1a90613231565b9192909190565b50505f9160029190565b805160208110156130dd575060208101519051902090565b90602001512060405160208101918252602081526123ca604082610aaf565b6001815103612d975760200151515f1a60801490565b61311b90612d50565b902090565b9081511561019557600f61313c6124db611d3e611d1886611484565b168061314f5750610b5060025f93612957565b600181036131645750610b5060015f93612957565b6002810361317a5750610b506002600193612957565b60030361019557610b5060018093612957565b91905f5b838101808211610c49578251811080613227575b1561321f576131d57fff00000000000000000000000000000000000000000000000000000000000000918461275e565b51167fff00000000000000000000000000000000000000000000000000000000000000613202838661275e565b511690036132185761321390611edd565b613191565b9250505090565b509250505090565b50835182106131a5565b91907f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a084116132c0579160209360809260ff5f9560405194855216868401526040830152606082015282805260015afa156132b5575f5173ffffffffffffffffffffffffffffffffffffffff8116156132ab57905f905f90565b505f906001905f90565b6040513d5f823e3d90fd5b5050505f916003919056fea164736f6c634300081c000a2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d4c48d1d2b0f4f7485fc28e3db22341d96a20aa29e6efa8149da9751603abd4e06e0c24a6e293ff9b755263dbaa15ba3796b0b8d3fe17cfb4ddf8143b268eac47bd893629a699470e4ec82a5715bb4981fdaacc5d0a728bf5f55b801d8f4ef10bad3228b676f7d3cd4284a5443f17f1962b36e491b30a40b2405849e597ba5fb5"}} +{"abi":[{"type":"constructor","inputs":[{"name":"ibcRouter","type":"address","internalType":"address"},{"name":"initialTrustedHeight","type":"uint64","internalType":"uint64"},{"name":"initialTrustedTimestamp","type":"uint64","internalType":"uint64"},{"name":"initialTrustedStorageRoot","type":"bytes32","internalType":"bytes32"},{"name":"initialTrustedValidators","type":"address[]","internalType":"address[]"},{"name":"trustingPeriod","type":"uint64","internalType":"uint64"},{"name":"maxClockDrift","type":"uint64","internalType":"uint64"},{"name":"roleManager","type":"address","internalType":"address"}],"stateMutability":"nonpayable"},{"type":"function","name":"DEFAULT_ADMIN_ROLE","inputs":[],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"type":"function","name":"PROOF_SUBMITTER_ROLE","inputs":[],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"type":"function","name":"getClientState","inputs":[],"outputs":[{"name":"","type":"bytes","internalType":"bytes"}],"stateMutability":"view"},{"type":"function","name":"getConsensusState","inputs":[{"name":"revisionHeight","type":"uint64","internalType":"uint64"}],"outputs":[{"name":"","type":"bytes","internalType":"bytes"}],"stateMutability":"view"},{"type":"function","name":"getRoleAdmin","inputs":[{"name":"role","type":"bytes32","internalType":"bytes32"}],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"type":"function","name":"grantRole","inputs":[{"name":"role","type":"bytes32","internalType":"bytes32"},{"name":"account","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"hasRole","inputs":[{"name":"role","type":"bytes32","internalType":"bytes32"},{"name":"account","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"misbehaviour","inputs":[{"name":"","type":"bytes","internalType":"bytes"}],"outputs":[],"stateMutability":"view"},{"type":"function","name":"renounceRole","inputs":[{"name":"role","type":"bytes32","internalType":"bytes32"},{"name":"callerConfirmation","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"revokeRole","inputs":[{"name":"role","type":"bytes32","internalType":"bytes32"},{"name":"account","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"supportsInterface","inputs":[{"name":"interfaceId","type":"bytes4","internalType":"bytes4"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"updateClient","inputs":[{"name":"updateMsg","type":"bytes","internalType":"bytes"}],"outputs":[{"name":"","type":"uint8","internalType":"enum ILightClientMsgs.UpdateResult"}],"stateMutability":"nonpayable"},{"type":"function","name":"verifyMembership","inputs":[{"name":"msg_","type":"tuple","internalType":"struct ILightClientMsgs.MsgVerifyMembership","components":[{"name":"proof","type":"bytes","internalType":"bytes"},{"name":"proofHeight","type":"tuple","internalType":"struct IICS02ClientMsgs.Height","components":[{"name":"revisionNumber","type":"uint64","internalType":"uint64"},{"name":"revisionHeight","type":"uint64","internalType":"uint64"}]},{"name":"path","type":"bytes[]","internalType":"bytes[]"},{"name":"value","type":"bytes","internalType":"bytes"}]}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"verifyNonMembership","inputs":[{"name":"msg_","type":"tuple","internalType":"struct ILightClientMsgs.MsgVerifyNonMembership","components":[{"name":"proof","type":"bytes","internalType":"bytes"},{"name":"proofHeight","type":"tuple","internalType":"struct IICS02ClientMsgs.Height","components":[{"name":"revisionNumber","type":"uint64","internalType":"uint64"},{"name":"revisionHeight","type":"uint64","internalType":"uint64"}]},{"name":"path","type":"bytes[]","internalType":"bytes[]"}]}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"event","name":"RoleAdminChanged","inputs":[{"name":"role","type":"bytes32","indexed":true,"internalType":"bytes32"},{"name":"previousAdminRole","type":"bytes32","indexed":true,"internalType":"bytes32"},{"name":"newAdminRole","type":"bytes32","indexed":true,"internalType":"bytes32"}],"anonymous":false},{"type":"event","name":"RoleGranted","inputs":[{"name":"role","type":"bytes32","indexed":true,"internalType":"bytes32"},{"name":"account","type":"address","indexed":true,"internalType":"address"},{"name":"sender","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"type":"event","name":"RoleRevoked","inputs":[{"name":"role","type":"bytes32","indexed":true,"internalType":"bytes32"},{"name":"account","type":"address","indexed":true,"internalType":"address"},{"name":"sender","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"type":"error","name":"AccessControlBadConfirmation","inputs":[]},{"type":"error","name":"AccessControlUnauthorizedAccount","inputs":[{"name":"account","type":"address","internalType":"address"},{"name":"neededRole","type":"bytes32","internalType":"bytes32"}]},{"type":"error","name":"AccountNotFound","inputs":[{"name":"account","type":"address","internalType":"address"}]},{"type":"error","name":"ConflictingConsensusState","inputs":[{"name":"revisionHeight","type":"uint64","internalType":"uint64"}]},{"type":"error","name":"ConsensusStateExpired","inputs":[{"name":"trustedTimestamp","type":"uint64","internalType":"uint64"},{"name":"currentTimestamp","type":"uint256","internalType":"uint256"},{"name":"trustingPeriod","type":"uint64","internalType":"uint64"}]},{"type":"error","name":"ConsensusStateNotFound","inputs":[{"name":"revisionHeight","type":"uint64","internalType":"uint64"}]},{"type":"error","name":"DuplicateCommitSealSigner","inputs":[{"name":"signer","type":"address","internalType":"address"}]},{"type":"error","name":"DuplicateValidator","inputs":[{"name":"validator","type":"address","internalType":"address"}]},{"type":"error","name":"EmptyValidatorSet","inputs":[]},{"type":"error","name":"HeaderFromFuture","inputs":[{"name":"currentTimestamp","type":"uint256","internalType":"uint256"},{"name":"headerTimestamp","type":"uint256","internalType":"uint256"},{"name":"maxClockDrift","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"InsufficientTrustedValidatorOverlap","inputs":[{"name":"actual","type":"uint256","internalType":"uint256"},{"name":"required","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"InsufficientValidatorQuorum","inputs":[{"name":"actual","type":"uint256","internalType":"uint256"},{"name":"required","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"InvalidCommitSeal","inputs":[]},{"type":"error","name":"InvalidCommitmentValue","inputs":[{"name":"expectedValue","type":"bytes32","internalType":"bytes32"},{"name":"actualValue","type":"bytes32","internalType":"bytes32"}]},{"type":"error","name":"InvalidDifficulty","inputs":[{"name":"actualDifficulty","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"InvalidECDSASignatureLength","inputs":[{"name":"length","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"InvalidExtraDataFormat","inputs":[{"name":"itemsLength","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"InvalidHeaderFormat","inputs":[{"name":"itemsLength","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"InvalidHeaderHeight","inputs":[]},{"type":"error","name":"InvalidHeaderTimestamp","inputs":[{"name":"actualTimestamp","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"InvalidMixHash","inputs":[{"name":"actualMixHash","type":"bytes32","internalType":"bytes32"}]},{"type":"error","name":"InvalidNonce","inputs":[{"name":"actualNonce","type":"bytes","internalType":"bytes"}]},{"type":"error","name":"InvalidOmmersHash","inputs":[{"name":"actualOmmersHash","type":"bytes32","internalType":"bytes32"}]},{"type":"error","name":"InvalidPathLength","inputs":[{"name":"expectedLength","type":"uint256","internalType":"uint256"},{"name":"actualLength","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"InvalidRevisionNumber","inputs":[{"name":"providedRevisionNumber","type":"uint64","internalType":"uint64"}]},{"type":"error","name":"InvalidValidatorAddress","inputs":[{"name":"validator","type":"address","internalType":"address"}]},{"type":"error","name":"InvalidValidatorAddressLength","inputs":[{"name":"length","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"InvalidValueLength","inputs":[{"name":"expectedLength","type":"uint256","internalType":"uint256"},{"name":"actualLength","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"InvalidVanityDataLength","inputs":[{"name":"length","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"RLPInvalidEncoding","inputs":[]},{"type":"error","name":"TrieProofTraversalError","inputs":[{"name":"err","type":"uint8","internalType":"enum MPTProof.ProofError"}]},{"type":"error","name":"UnsupportedMisbehaviour","inputs":[]},{"type":"error","name":"ValueExists","inputs":[{"name":"actualValue","type":"bytes32","internalType":"bytes32"}]}],"bytecode":{"object":"0x6080604052346103dc57613a3180380380610019816103e0565b928339810190610100818303126103dc5761003381610405565b9061004060208201610419565b9061004d60408201610419565b92606082015191608081015160018060401b0381116103dc5781019286601f850112156103dc578351966001600160401b03881161037f578760051b9460206100978188016103e0565b809a81520190602082978201019283116103dc57602001905b8282106103c4575050506100c660a08301610419565b956100df60e06100d860c08601610419565b9401610405565b956001600160401b03169081156103b5576001600160401b03169283156103a257885115610393575f5b89518110156101bf576001600160a01b03610124828c61042d565b511615610198575f5b81811061013d5750600101610109565b6001600160a01b0361014f828d61042d565b51166001600160a01b03610163848e61042d565b5116146101725760010161012d565b6001600160a01b03610184838d61042d565b511663107f863360e21b5f5260045260245ffd5b6001600160a01b03906101ab908b61042d565b51166359bff38760e01b5f5260045260245ffd5b5060408051979896978a979181016001600160401b0381118282101761037f576040525f81526020810190848252604051926080840198848a1060018060401b038b111761037f576040998a526001600160a01b031680855260208086018490526001600160401b03928316868c01819052878416606090970196909652600180546001600160a01b031916909217825592516002805495516fffffffffffffffff0000000000000000908d1b81169285166001600160801b03199788161792909217815560038054988d1b90921697909516909517959095179093555f948552600490529590922080546001600160401b031916949094178455830191909155925193910191831161037f5768010000000000000000831161037f578154838355808410610359575b50905f5260205f205f5b83811061033c57846001600160a01b038116610323575061031261054b565b505b6040516133c390816105ce8239f35b8061033061033692610455565b506104cb565b50610314565b82516001600160a01b0316818301556020909201916001016102f3565b825f528360205f2091820191015b81811061037457506102e9565b5f8155600101610367565b634e487b7160e01b5f52604160045260245ffd5b63339e1ffb60e01b5f5260045ffd5b83638c0b052760e01b5f5260045260245ffd5b6359d119e360e01b5f5260045ffd5b602080916103d184610405565b8152019101906100b0565b5f80fd5b6040519190601f01601f191682016001600160401b0381118382101761037f57604052565b51906001600160a01b03821682036103dc57565b51906001600160401b03821682036103dc57565b80518210156104415760209160051b010190565b634e487b7160e01b5f52603260045260245ffd5b6001600160a01b0381165f9081525f516020613a115f395f51905f52602052604090205460ff166104c6576001600160a01b03165f8181525f516020613a115f395f51905f5260205260408120805460ff191660011790553391905f5160206139915f395f51905f528180a4600190565b505f90565b6001600160a01b0381165f9081525f5160206139b15f395f51905f52602052604090205460ff166104c6576001600160a01b03165f8181525f5160206139b15f395f51905f5260205260408120805460ff191660011790553391905f5160206139f15f395f51905f52905f5160206139915f395f51905f529080a4600190565b5f80525f5160206139b15f395f51905f526020525f5160206139d15f395f51905f525460ff166105c9575f8080525f5160206139b15f395f51905f526020525f5160206139d15f395f51905f52805460ff1916600117905533905f5160206139f15f395f51905f525f5160206139915f395f51905f528280a4600190565b5f9056fe6080806040526004361015610012575f80fd5b5f3560e01c90816301ffc9a7146108ea575080630bece35614610833578063248a9ca3146108015780632f2ff15d146107d257806336568abe146107765780634d6d9ffb146106015780635972185a146105c7578063682ed5f0146102f157806391d14854146102a8578063a217fddf1461028e578063d547741f14610258578063ddba6537146101c1578063edce8bdc146101475763ef913a4b146100b6575f80fd5b34610143575f6003193601126101435761013f60405173ffffffffffffffffffffffffffffffffffffffff60015416602082015267ffffffffffffffff600254818116604084015260401c16606082015267ffffffffffffffff600354818116608084015260401c1660a082015260a0815261013360c082610a4b565b60405191829182610a21565b0390f35b5f80fd5b346101435760206003193601126101435760043567ffffffffffffffff811681036101435761017861013f91611f4a565b61013367ffffffffffffffff8254166101b3600184015493604051948593602085015260408401526060808401526002608084019101611cbe565b03601f198101835282610a4b565b34610143576101cf36610988565b50505f80527f4c48d1d2b0f4f7485fc28e3db22341d96a20aa29e6efa8149da9751603abd4e06020527f6e0c24a6e293ff9b755263dbaa15ba3796b0b8d3fe17cfb4ddf8143b268eac475460ff161561024b575b7f2c1ed462000000000000000000000000000000000000000000000000000000005f5260045ffd5b610253611d0b565b610223565b346101435761028c610269366109d9565b90610287610282825f525f602052600160405f20015490565b611d93565b612155565b005b34610143575f6003193601126101435760206040515f8152f35b34610143576102b6366109d9565b905f525f60205273ffffffffffffffffffffffffffffffffffffffff60405f2091165f52602052602060ff60405f2054166040519015158152f35b346101435760206003193601126101435760043567ffffffffffffffff8111610143578060040160a06003198336030112610143575f80527f4c48d1d2b0f4f7485fc28e3db22341d96a20aa29e6efa8149da9751603abd4e06020527f6e0c24a6e293ff9b755263dbaa15ba3796b0b8d3fe17cfb4ddf8143b268eac475460ff16156105ba575b61038c61038760248401611c04565b611df9565b6064820191600161039d8484611c19565b90500361057e57608481019060206103b58385611c6d565b905003610542576103d36103ce60446103da9301611c04565b611f4a565b9383611c19565b91909115610515576104396104326103fe6103f785602096611c6d565b3691610ab7565b602081519101205f527f1260944489272988d9df285149b5aa1b0f48f2136d6f416159f840a3e074760060205260405f2090565b9184611c6d565b9080939181010312610143576104576103f761048093359480611c6d565b906001850154906040516020810191825260208152610477604082610a4b565b5190209161221d565b90156104e5578060206104999201905160801b1761230a565b908082036104b757602067ffffffffffffffff845416604051908152f35b7f56ed1b63000000000000000000000000000000000000000000000000000000005f5260045260245260445ffd5b507f56ed1b63000000000000000000000000000000000000000000000000000000005f526004525f60245260445ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5061054c91611c6d565b90507f24fadac8000000000000000000000000000000000000000000000000000000005f52602060045260245260445ffd5b6105888383611c19565b90507f88b3170e000000000000000000000000000000000000000000000000000000005f52600160045260245260445ffd5b6105c2611d0b565b610378565b34610143575f6003193601126101435760206040517fbd893629a699470e4ec82a5715bb4981fdaacc5d0a728bf5f55b801d8f4ef10b8152f35b346101435760206003193601126101435760043567ffffffffffffffff8111610143578060040160806003198336030112610143575f80527f4c48d1d2b0f4f7485fc28e3db22341d96a20aa29e6efa8149da9751603abd4e06020527f6e0c24a6e293ff9b755263dbaa15ba3796b0b8d3fe17cfb4ddf8143b268eac475460ff1615610769575b61069761038760248401611c04565b606482019160016106a88484611c19565b90500361057e576106c16103ce60446106c89301611c04565b9282611c19565b91909115610515576106f06103f76106e96103fe6103f78661071097611c6d565b9280611c6d565b906001840154906040516020810191825260208152610477604082610a4b565b9061072b57602067ffffffffffffffff835416604051908152f35b80602061073e9201905160801b1761230a565b7fd039601e000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b610771611d0b565b610688565b3461014357610784366109d9565b3373ffffffffffffffffffffffffffffffffffffffff8216036107aa5761028c91612155565b7f6697b232000000000000000000000000000000000000000000000000000000005f5260045ffd5b346101435761028c6107e3366109d9565b906107fc610282825f525f602052600160405f20015490565b612089565b3461014357602060031936011261014357602061082b6004355f525f602052600160405f20015490565b604051908152f35b346101435761089d61084436610988565b5f80527f4c48d1d2b0f4f7485fc28e3db22341d96a20aa29e6efa8149da9751603abd4e06020527f6e0c24a6e293ff9b755263dbaa15ba3796b0b8d3fe17cfb4ddf8143b268eac475490919060ff16156108dd57610b45565b60405160038210156108b0576020918152f35b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b6108e5611d0b565b610b45565b3461014357602060031936011261014357600435907fffffffff00000000000000000000000000000000000000000000000000000000821680920361014357817f7965db0b000000000000000000000000000000000000000000000000000000006020931490811561095e575b5015158152f35b7f01ffc9a70000000000000000000000000000000000000000000000000000000091501483610957565b9060206003198301126101435760043567ffffffffffffffff811161014357826023820112156101435780600401359267ffffffffffffffff84116101435760248483010111610143576024019190565b6003196040910112610143576004359060243573ffffffffffffffffffffffffffffffffffffffff811681036101435790565b359067ffffffffffffffff8216820361014357565b601f19601f602060409481855280519182918282880152018686015e5f8582860101520116010190565b90601f601f19910116810190811067ffffffffffffffff821117610a6e57604052565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b67ffffffffffffffff8111610a6e57601f01601f191660200190565b929192610ac382610a9b565b91610ad16040519384610a4b565b829481845281830111610143578281602093845f960137010152565b9080601f8301121561014357816020610b0893359101610ab7565b90565b91908201809211610b1857565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b908101906020818303126101435780359067ffffffffffffffff8211610143570191828203926080841261014357604051936060850185811067ffffffffffffffff821117610a6e57604052813567ffffffffffffffff811161014357604091610bb486601f19938601610aed565b8752011261014357604051926040840184811067ffffffffffffffff821117610a6e57604052610be660208301610a0c565b8452610bf460408301610a0c565b602085015260208501938452606082013567ffffffffffffffff811161014357610c1e9201610aed565b9260408101938452610c3b67ffffffffffffffff84515116611df9565b5160405160e0810181811067ffffffffffffffff821117610a6e576040526060815260208101906060825260408101905f825260608101915f835260808201935f855260a083019860608a52610ca260c08501976060895260208101905160801b176123f4565b80855251600f8110611bd957507f1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347610ce3610cdd8651611e36565b516122ce565b03611ba1576001610cfd610cf78651611e46565b5161230a565b03611b69577f63746963616c2062797a616e74696e65206661756c7420746f6c6572616e6365610d30610cdd8651611e57565b03611b315783518051600e1015610515576101e0610d4f9101516123c9565b80516008811490811591611b01575b50611ac75750835180516008101561051557610120610d7e91015161230a565b80158015611ab6575b6119a25767ffffffffffffffff168352610da4610cdd8551611e68565b855283518051600b101561051557610180610dc091015161230a565b80158015611aa5575b611a7a5767ffffffffffffffff16865283518051600c101561051557610df66101a0610e059201516123c9565b60208101905160801b176123f4565b8083525160058103611a4f5750610e25610e1f8351611e78565b516123c9565b5160208103611a245750610e42610e3c8351611e36565b516123f4565b978851156119fc57610e548951611ed1565b8b525f5b8951811015610fc657610e6e610e1f828c611ea5565b805160148103610f9b5750602081519101517fffffffffffffffffffffffffffffffffffffffff00000000000000000000000081169160148110610f66575b505060601c8015610f3b57908c915f5b828110610ed95750610ed28260019451611ea5565b5201610e58565b9073ffffffffffffffffffffffffffffffffffffffff610efc8383959651611ea5565b511614610f0f578d929190600101610ebd565b507f41fe18cc000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b7f59bff387000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000009250829060140360031b1b16165f80610ead565b7f83e46ad2000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b50919395989092949750989598610fe0610e3c8551611e85565b97610feb8951611f02565b8b525f5b89518110156110285780611021818e61100e610e1f8f96600197611ea5565b90519061101b8383611ea5565b52611ea5565b5001610fef565b509194975092959891949760035467ffffffffffffffff8160401c1661104e8142610b0b565b67ffffffffffffffff8451168091106119ca57505061107b67ffffffffffffffff60208751015116611f4a565b9467ffffffffffffffff6020818c5116925101511610156119a25767ffffffffffffffff1680151580611984575b61194657506040519660c06110be818a610a4b565b60058952601f19015f5b8181106119355750506110e5816110eb6110e56111479451611e78565b51613031565b6110f48b611e78565b526110fe8a611e78565b5061110c6110e58251611e36565b6111158b611e36565b5261111f8a611e36565b5061112d6110e58251611e95565b6111368b611e95565b526111408a611e95565b5051611e68565b61115088611e68565b5261115a87611e68565b506111b0604097885161116d8a82610a4b565b600181527fc00000000000000000000000000000000000000000000000000000000000000060208201526111a082611e85565b526111aa81611e85565b506124ae565b976111bc8a5151611f02565b9a5f5b8b518051821015611345578d90600c830361132b57508b8b815160018114908161130d575b501561122f57928092602061121e8161122895600198519381859251918291018484015e81015f838201520301601f198101835282610a4b565b61101b8383611ea5565b50016111bf565b50508b519190508d8c8c6037851161126f579183918360218760019860206112289851958b830187526080830182880153018386015e830101905261121e565b5050506fffffffffffffffffffffffffffffffff821160071b67ffffffffffffffff83821c1160061b1763ffffffff83821c1160051b1761ffff83821c1160041b1760ff83821c119060031c1760018101808211610b18578f8e8e602160018795819961122898602260208751988484810196600288018c5260b88601848d015360031b610100031b888b015201918801015e84010101905261121e565b935050505015610515578c8b8b6080602083015160f81c105f6111e4565b8280926113406110e560019661122895611ea5565b61121e565b505093979850939850939861135c909591956124ae565b602081519101209551946113708651611ed1565b995f5b875181101561153f576113868189611ea5565b51805160418103611514575080518b1015610515576060810190601b825160f81c106114bf575b6113b891508a613090565b9060048110156108b05715908115916114b5575b508015611497575b61146f578c919073ffffffffffffffffffffffffffffffffffffffff165f5b82811061140e575061140782600194611ea5565b5201611373565b9073ffffffffffffffffffffffffffffffffffffffff61143083839596611ea5565b511614611443578d9291906001016113f3565b507f33af0d5f000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b7f09cb44e6000000000000000000000000000000000000000000000000000000005f5260045ffd5b5073ffffffffffffffffffffffffffffffffffffffff8116156113d4565b905015155f6113cc565b80518c101561051557601b825160f81c019160ff8311610b185781518d1015610515577fff000000000000000000000000000000000000000000000000000000000000006113b89360f81b165f1a90536113ad565b7ff2db9ce1000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b5092955092969895509296600201975f965f5b87518110156115a65761158573ffffffffffffffffffffffffffffffffffffffff61157d838b611ea5565b51168c612601565b611592575b600101611552565b9761159e600191611fa1565b98905061158a565b50929690939791949860039054049060018201809211610b18578181106119075750508751975f965f5b87518110156116245761160373ffffffffffffffffffffffffffffffffffffffff6115fb838b611ea5565b51168c612659565b611610575b6001016115d0565b9761161c600191611fa1565b989050611608565b5093979296919550939761163d90516003810490611faf565b908181106118d9575050611691906001549251905190875160208101907fffffffffffffffffffffffffffffffffffffffff0000000000000000000000008660601b16825260148152610477603482610a4b565b9190156118975750610cdd6116b28260206116b79401905160801b176123f4565b611e95565b67ffffffffffffffff8451165f526004602052845f2067ffffffffffffffff81541661183857509060029167ffffffffffffffff8551165f52600460205267ffffffffffffffff865f209451167fffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000855416178455600184015551910181519167ffffffffffffffff8311610a6e57680100000000000000008311610a6e578154838355808410611812575b50602001905f5260205f205f5b8381106117e85750505050516002549167ffffffffffffffff83821c1667ffffffffffffffff8316116117a4575b5050505f90565b7fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff916fffffffffffffffff0000000000000000911b169116176002555f808061179d565b600190602073ffffffffffffffffffffffffffffffffffffffff855116940193818401550161176f565b825f528360205f2091820191015b81811061182d5750611762565b5f8155600101611820565b9261185694955067ffffffffffffffff909291925116905192611fbc565b6118915767ffffffffffffffff9051167fc1aea5f7000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b50600290565b73ffffffffffffffffffffffffffffffffffffffff907fa700fc32000000000000000000000000000000000000000000000000000000005f521660045260245ffd5b7f7818f4e4000000000000000000000000000000000000000000000000000000005f5260045260245260445ffd5b7fe2dcb1b9000000000000000000000000000000000000000000000000000000005f5260045260245260445ffd5b806060602080938d010152016110c8565b67ffffffffffffffff8554167feae35725000000000000000000000000000000000000000000000000000000005f526004524260245260445260645ffd5b504261199b8267ffffffffffffffff885416610b0b565b11156110a9565b7f59d119e3000000000000000000000000000000000000000000000000000000005f5260045ffd5b7f9b772277000000000000000000000000000000000000000000000000000000005f524260045260245260445260645ffd5b7f339e1ffb000000000000000000000000000000000000000000000000000000005f5260045ffd5b7fe7719a54000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b7f30c6792a000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b7f8c0b0527000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b5067ffffffffffffffff8111610dc9565b5067ffffffffffffffff8111610d87565b611afd906040519182917fd5edd2a500000000000000000000000000000000000000000000000000000000835260048301610a21565b0390fd5b7f011b4d03dd8c01f1049143cf9c4c817e4b167f1d1b83e5c6f0f10d89ba1e7bce9150602083012014155f610d5e565b611b3e610cdd8551611e57565b7fa19e609c000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b611b76610cf78551611e46565b7ff71b722f000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b611bae610cdd8551611e36565b7fb8120dca000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b7fbc277732000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b3567ffffffffffffffff811681036101435790565b9035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe181360301821215610143570180359067ffffffffffffffff821161014357602001918160051b3603831361014357565b9035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe181360301821215610143570180359067ffffffffffffffff82116101435760200191813603831361014357565b90602082549182815201915f5260205f20905f5b818110611cdf5750505090565b825473ffffffffffffffffffffffffffffffffffffffff16845260209093019260019283019201611cd2565b335f9081527f4c48d1d2b0f4f7485fc28e3db22341d96a20aa29e6efa8149da9751603abd4e0602052604090205460ff1615611d4357565b7fe2517d3f000000000000000000000000000000000000000000000000000000005f52336004527fbd893629a699470e4ec82a5715bb4981fdaacc5d0a728bf5f55b801d8f4ef10b60245260445ffd5b805f525f60205260405f2073ffffffffffffffffffffffffffffffffffffffff33165f5260205260ff60405f20541615611dca5750565b7fe2517d3f000000000000000000000000000000000000000000000000000000005f523360045260245260445ffd5b67ffffffffffffffff1680611e0b5750565b7f3ce598a9000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b8051600110156105155760400190565b805160071015610515576101000190565b8051600d1015610515576101c00190565b8051600310156105155760800190565b8051156105155760200190565b8051600410156105155760a00190565b8051600210156105155760600190565b80518210156105155760209160051b010190565b67ffffffffffffffff8111610a6e5760051b60200190565b90611edb82611eb9565b611ee86040519182610a4b565b828152601f19611ef88294611eb9565b0190602036910137565b90611f0c82611eb9565b611f196040519182610a4b565b828152601f19611f298294611eb9565b01905f5b828110611f3957505050565b806060602080938501015201611f2d565b67ffffffffffffffff1690815f52600460205260405f209167ffffffffffffffff83541615611f765750565b7ff761631b000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b5f198114610b185760010190565b91908203918211610b1857565b919067ffffffffffffffff808454169116149081159161207a575b5061207457604051611ffc816101b36020820194602086526002604084019101611cbe565b5190209060405160208101918160408101916020855280518093526020606083019101925f5b81811061204557505061203e925003601f198101835282610a4b565b5190201490565b845173ffffffffffffffffffffffffffffffffffffffff16835260209485019486945090920191600101612022565b50505f90565b9050600182015414155f611fd7565b805f525f60205260405f2073ffffffffffffffffffffffffffffffffffffffff83165f5260205260ff60405f205416155f1461207457805f525f60205260405f2073ffffffffffffffffffffffffffffffffffffffff83165f5260205260405f2060017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0082541617905573ffffffffffffffffffffffffffffffffffffffff339216907f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d5f80a4600190565b805f525f60205260405f2073ffffffffffffffffffffffffffffffffffffffff83165f5260205260ff60405f2054165f1461207457805f525f60205260405f2073ffffffffffffffffffffffffffffffffffffffff83165f5260205260405f207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00815416905573ffffffffffffffffffffffffffffffffffffffff339216907ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b5f80a4600190565b61223c9092919260405192602084015260208352610df6604084610a4b565b926122478451611f02565b915f5b855181101561227f57806122636110e560019389611ea5565b61226d8287611ea5565b526122788186611ea5565b500161224a565b5090935061228c9261273d565b8190600e8110156108b057806122a3575051151591565b7f1121c9d0000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b60218160801c036122e257610b089061230a565b7ff3dd7004000000000000000000000000000000000000000000000000000000005f5260045ffd5b8060801c90602182116122e25761232081612d3f565b60028195929510156108b0576122e2578361233d57505050505f90565b816020019081602011610b185782036020019081111502601f81116123b7575f196fffffffffffffffffffffffffffffffff9160031b1b9216015116907f1fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81168103610b185760031b610100036101008111610b18571c90565b634e487b715f5260326020526024601cfd5b6123d281612d3f565b60028194939410156108b0576122e257610b08926123ef92612ffa565b613031565b908160801c9161240381612d3f565b60028194939410156108b057600114908161249b575b50156122e257926040519360208501925b82811061244557505050601f198382030160051c8352604052565b926124858461246161245c85969761247f9661305e565b612d3f565b506124796124728383989498610b0b565b8489612ffa565b95610b0b565b90610b0b565b91815260208101809111610b185792919061242a565b6124a6915083610b0b565b84145f612419565b905f805b83518210156124db576124d36001916124cb8487611ea5565b515190610b0b565b9101906124b2565b9190506125006124ea83610a9b565b926124f86040519485610a4b565b808452610a9b565b91601f196020820193013684375f9160205b855184101561253d576001906125288588611ea5565b518051602082018387015e5101930192612512565b50905190935090506037811161257157806021916040519360018201855260c0820160208601538385015e82010160405290565b6fffffffffffffffffffffffffffffffff811160071b67ffffffffffffffff82821c1160061b1763ffffffff82821c1160051b1761ffff82821c1160041b1760ff82821c119060031c179160018301808411610b18576021926001926022604051968381810195600287018a5260f8830160208b015360031b610100031b878901528701015e8301010160405290565b905f5b825481101561179d57825f5273ffffffffffffffffffffffffffffffffffffffff8160205f2001541673ffffffffffffffffffffffffffffffffffffffff83161461265157600101612604565b505050600190565b905f5b825181101561179d5773ffffffffffffffffffffffffffffffffffffffff6126848285611ea5565b511673ffffffffffffffffffffffffffffffffffffffff8316146126515760010161265c565b60ff7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff409116019060ff8211610b1857565b60ff7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc99116019060ff8211610b1857565b60ff7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff809116019060ff8211610b1857565b9092916060935f94815115612d345750815115612cf857612760909492946130ca565b6040515f9391908480805b8651881015612ce65761277e8888611ea5565b519183612c3f575050888151602083012003612c2e576127ac90989392919860208101905160801b176123f4565b975b8851601103612976578251810361281157505050508451601010156127e457506102206127e09394015190519061324d565b9091565b807f4e487b7100000000000000000000000000000000000000000000000000000000602492526032600452fd5b90919297835182101561294957612832906020838601015160f81c90611ea5565b5160018160801c14806128f6575b6128e55761284d81613284565b92839190600181018091116128b85793602014801561289c575b612880575050612876906123f4565b975b9291906127ae565b929394999150966001905b85604052019698939291909861276b565b5060018901808a116128b8576128b39089856132b2565b612867565b6024887f4e487b710000000000000000000000000000000000000000000000000000000081526011600452fd5b50505050506127e0929350516131ef565b507f80000000000000000000000000000000000000000000000000000000000000007fff0000000000000000000000000000000000000000000000000000000000000061294283612f8a565b1614612840565b6024857f4e487b710000000000000000000000000000000000000000000000000000000081526032600452fd5b9091929760028151145f14612c1d57612999612994610e1f83611e78565b6130ca565b90815115612c0b5760208201805160f81c9060038211612bf7576129c68560208901895160801b1761305e565b935160801b176001821660020360ff8111612bca579060ff6129e992169061305e565b908160801c938060801c92838611918215612b16575b5050612b0257600110612a9457508115612a825790612a21612a399392611e36565b51916020612a2e84613284565b959093869493610b0b565b94148015612a66575b612a57575050612a51906123f4565b97612878565b9293949991509660019061288b565b5060018901808a116128b857612a7d9089856132b2565b612a42565b50505050505050509050606090600790565b94509850915050145f14612ab95750612ab06127e09394611e36565b5190519061320f565b935090612ac691516131ef565b92600e841015612ad557509190565b807f4e487b7100000000000000000000000000000000000000000000000000000000602492526021600452fd5b50505050505050506127e0929350516131ef565b91909980612b9d57506123b7576fffffffffffffffffffffffffffffffff612b959116985f997fffffffffffffffffffffffffffffffff000000000000000000000000000000008216176fffffffffffffffffffffffffffffffff8160801c911620906fffffffffffffffffffffffffffffffff8160801c9116201490565b155f806129ff565b807f4e487b7100000000000000000000000000000000000000000000000000000000602492526011600452fd5b6024897f4e487b710000000000000000000000000000000000000000000000000000000081526011600452fd5b505050505050505050509050606090600b90565b50505050505050509050606090600590565b505050505050509050606090600c90565b505050505050509050606090600290565b82519160208310908382612c9157506020148015939150612c81575b5050612c70576127ac905b9893929198610df6565b505050505050509050606090600390565b6020840120141590505f80612c5b565b1492831593612cbc575b505050612cab576127ac90612c66565b505050505050509050606090600490565b602085015192935090612cd5575b5014155f8080612c9b565b5f199060200360031b1b165f612cca565b50505050505050509050606090600d90565b50507f56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421919250145f14612d2c576060905f90565b606090600d90565b945060019392505050565b908160801c9182156122e257612d5481612f8a565b60f81c60c0811015612eb9576080811015612d7557505f9250600191839150565b60b78111612e0b57612d8860ff9161270c565b168093119081612da1575b50156122e257600191905f90565b6001841480159250612db5575b505f612d93565b7f80000000000000000000000000000000000000000000000000000000000000009150612e027fff0000000000000000000000000000000000000000000000000000000000000091612fc0565b1610155f612dae565b612e17612e1c9161270c565b6126db565b612e2960ff821692612fc0565b9082851180612e8e575b156122e25760ff81168303610b18576107f89060031b16610100036101008111610b18571c92603784119081612e7b575b50156122e25760018101809111610b185791905f90565b9050612e878483610b0b565b105f612e64565b507fff0000000000000000000000000000000000000000000000000000000000000082161515612e33565b9060f78211612edf5750612ece60ff916126aa565b16809211156122e257600191908290565b90612e17612eec916126aa565b612ef960ff821692612fc0565b9082851180612f5f575b156122e25760ff81168303610b18576107f89060031b16610100036101008111610b18571c92603784119081612f4c575b50156122e25760018101809111610b18579190600190565b9050612f588483610b0b565b105f612f34565b507fff0000000000000000000000000000000000000000000000000000000000000082161515612f03565b60208160801c5f0301602081111502601f81116123b7575f196fffffffffffffffffffffffffffffffff9160031b1b9116511690565b60208160801c60010301602181111502601f81116123b7576fffffffffffffffffffffffffffffffff5f1960019260031b1b921601511690565b906130058382610b0b565b8260801c106123b7576fffffffffffffffffffffffffffffffff6130299216610b0b565b9060801b1790565b9060208260801c806fffffffffffffffffffffffffffffffff60405195828752168386015e830101604052565b908160801c908181116123b7576fffffffffffffffffffffffffffffffff6130898261302994611faf565b9316610b0b565b81519190604183036130c0576130b99250602082015190606060408401519301515f1a9061331c565b9192909190565b50505f9160029190565b908151604051928160011b60208186010160405284525f5b8281106130ee57505050565b806020601092840101518060801c9060401c73ffffffff0000000000000000000000000000000073ffffffff000000000000000000000000ffffffff7bffffffff000000000000000000000000ffffffff00000000000000008477ffffffffffffffffffffffffffffffff000000000000000085161760201b1693169116171780831b177cff000000ff000000ff000000ff000000ff000000ff000000ff000000ff7eff000000ff000000ff000000ff000000ff000000ff000000ff000000ff00008260081b169116178060041b177f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f1660208260011b88010152016130e2565b905f198201918211610b185703613207576060905f90565b606090600890565b909291925f935f198201918211610b1857036132435761322e906123c9565b805115613239579190565b5060609150600990565b5060609150600890565b915f198201918211610b18570361327b57613267906123c9565b80511561327357905f90565b506060905f90565b50606090600890565b908160801c91602183105f146132a15761329d90612f8a565b9190565b6132ac91925061230a565b90602090565b90918251811092836132c5575b50505090565b6133149350906132d491611ea5565b5160208101905160801b176fffffffffffffffffffffffffffffffff8160801c911620906fffffffffffffffffffffffffffffffff8160801c9116201490565b5f80806132bf565b91907f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a084116133ab579160209360809260ff5f9560405194855216868401526040830152606082015282805260015afa156133a0575f5173ffffffffffffffffffffffffffffffffffffffff81161561339657905f905f90565b505f906001905f90565b6040513d5f823e3d90fd5b5050505f916003919056fea164736f6c634300081c000a2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d4c48d1d2b0f4f7485fc28e3db22341d96a20aa29e6efa8149da9751603abd4e06e0c24a6e293ff9b755263dbaa15ba3796b0b8d3fe17cfb4ddf8143b268eac47bd893629a699470e4ec82a5715bb4981fdaacc5d0a728bf5f55b801d8f4ef10bad3228b676f7d3cd4284a5443f17f1962b36e491b30a40b2405849e597ba5fb5"}} diff --git a/ibc-solidity/contracts/light-clients/besu/BesuLightClientBase.sol b/ibc-solidity/contracts/light-clients/besu/BesuLightClientBase.sol index 1db886a1a..dc3e40f27 100644 --- a/ibc-solidity/contracts/light-clients/besu/BesuLightClientBase.sol +++ b/ibc-solidity/contracts/light-clients/besu/BesuLightClientBase.sol @@ -4,6 +4,9 @@ pragma solidity ^0.8.28; // solhint-disable gas-struct-packing, named-parameters-mapping, gas-strict-inequalities, code-complexity import { AccessControl } from "@openzeppelin-contracts/access/AccessControl.sol"; +import { Memory } from "@openzeppelin-contracts/utils/Memory.sol"; +import { RLP } from "@openzeppelin-contracts/utils/RLP.sol"; +import { SlotDerivation } from "@openzeppelin-contracts/utils/SlotDerivation.sol"; import { ECDSA } from "@openzeppelin-contracts/utils/cryptography/ECDSA.sol"; import { ILightClient } from "../../interfaces/ILightClient.sol"; @@ -12,15 +15,16 @@ import { IICS02ClientMsgs } from "../../msgs/IICS02ClientMsgs.sol"; import { IBesuLightClientMsgs } from "./msgs/IBesuLightClientMsgs.sol"; import { IBesuLightClientErrors } from "./errors/IBesuLightClientErrors.sol"; import { IBesuLightClient } from "./interfaces/IBesuLightClient.sol"; -import { RLPReader } from "./RLPReader.sol"; import { MPTProof } from "./MPTProof.sol"; /// @title Besu Light Client Base /// @notice Shared implementation for Besu BFT light clients that verify headers and EVM storage proofs. abstract contract BesuLightClientBase is IBesuLightClient, IBesuLightClientErrors, IBesuLightClientMsgs, AccessControl { using MPTProof for bytes; - using RLPReader for RLPReader.RLPItem; - using RLPReader for bytes; + using Memory for Memory.Slice; + using RLP for Memory.Slice; + using RLP for bytes; + using SlotDerivation for bytes32; /// @notice Decoded fields from a submitted Besu header. /// @param headerItems Top-level RLP header fields. @@ -31,8 +35,8 @@ abstract contract BesuLightClientBase is IBesuLightClient, IBesuLightClientError /// @param validators Validator set from `extraData`. /// @param commitSeals Commit seals from `extraData`. struct ParsedHeader { - RLPReader.RLPItem[] headerItems; - RLPReader.RLPItem[] extraDataItems; + Memory.Slice[] headerItems; + Memory.Slice[] extraDataItems; uint64 height; bytes32 stateRoot; uint64 timestamp; @@ -80,7 +84,7 @@ abstract contract BesuLightClientBase is IBesuLightClient, IBesuLightClientError revert InvalidHeaderHeight(); } if (initialTrustedTimestamp == 0) { - revert InvalidHeaderTimestamp(); + revert InvalidHeaderTimestamp(initialTrustedTimestamp); } _validateValidators(initialTrustedValidators); @@ -126,17 +130,14 @@ abstract contract BesuLightClientBase is IBesuLightClient, IBesuLightClientError _requireZeroRevision(msg_.trustedHeight.revisionNumber); ParsedHeader memory header = _parseHeader(msg_.headerRlp); - if (header.height == 0) { - revert InvalidHeaderHeight(); - } - if (header.timestamp == 0) { - revert InvalidHeaderTimestamp(); - } if (block.timestamp + clientState.maxClockDrift < header.timestamp) { revert HeaderFromFuture(block.timestamp, header.timestamp, clientState.maxClockDrift); } ConsensusState storage trustedConsensusState = _getConsensusState(msg_.trustedHeight.revisionHeight); + if (header.height <= msg_.trustedHeight.revisionHeight) { + revert InvalidHeaderHeight(); + } if ( clientState.trustingPeriod != 0 && uint256(trustedConsensusState.timestamp) + clientState.trustingPeriod <= block.timestamp @@ -188,13 +189,13 @@ abstract contract BesuLightClientBase is IBesuLightClient, IBesuLightClientError ConsensusState storage consensusState = _getConsensusState(msg_.proofHeight.revisionHeight); bytes32 storageSlot = _commitmentStorageSlot(msg_.path[0]); bytes32 expectedValue = abi.decode(msg_.value, (bytes32)); - bytes memory valueRlp = + (bool exists, bytes memory valueRlp) = msg_.proof.verifyRLPProof(consensusState.storageRoot, keccak256(abi.encodePacked(storageSlot))); - if (valueRlp.length == 0) { + if (!exists) { revert InvalidCommitmentValue(expectedValue, bytes32(0)); } - bytes32 actualValue = bytes32(valueRlp.toRlpItem().toUint()); + bytes32 actualValue = bytes32(valueRlp.decodeUint256()); if (actualValue != expectedValue) { revert InvalidCommitmentValue(expectedValue, actualValue); } @@ -215,10 +216,10 @@ abstract contract BesuLightClientBase is IBesuLightClient, IBesuLightClientError ConsensusState storage consensusState = _getConsensusState(msg_.proofHeight.revisionHeight); bytes32 storageSlot = _commitmentStorageSlot(msg_.path[0]); - bytes memory valueRlp = + (bool exists, bytes memory valueRlp) = msg_.proof.verifyRLPProof(consensusState.storageRoot, keccak256(abi.encodePacked(storageSlot))); - if (valueRlp.length != 0) { - revert ValueExists(bytes32(valueRlp.toRlpItem().toUint())); + if (exists) { + revert ValueExists(bytes32(valueRlp.decodeUint256())); } return consensusState.timestamp; } @@ -237,44 +238,50 @@ abstract contract BesuLightClientBase is IBesuLightClient, IBesuLightClientError /// @param headerRlp RLP-encoded Besu block header. /// @return header The parsed header fields used by update and proof verification. function _parseHeader(bytes memory headerRlp) internal pure returns (ParsedHeader memory header) { - header.headerItems = headerRlp.toRlpItem().toList(); + header.headerItems = headerRlp.decodeList(); if (header.headerItems.length < 15) { revert InvalidHeaderFormat(header.headerItems.length); } - if (bytes32(header.headerItems[1].toUintStrict()) != EMPTY_OMMERS_HASH) { - revert InvalidOmmersHash(bytes32(header.headerItems[1].toUintStrict())); + if (_readBytes32Strict(header.headerItems[1]) != EMPTY_OMMERS_HASH) { + revert InvalidOmmersHash(_readBytes32Strict(header.headerItems[1])); } - if (header.headerItems[7].toUint() != 1) { - revert InvalidDifficulty(header.headerItems[7].toUint()); + if (header.headerItems[7].readUint256() != 1) { + revert InvalidDifficulty(header.headerItems[7].readUint256()); } - if (bytes32(header.headerItems[13].toUintStrict()) != BESU_BFT_MIX_HASH) { - revert InvalidMixHash(bytes32(header.headerItems[13].toUintStrict())); + if (_readBytes32Strict(header.headerItems[13]) != BESU_BFT_MIX_HASH) { + revert InvalidMixHash(_readBytes32Strict(header.headerItems[13])); } - bytes memory nonce = header.headerItems[14].toBytes(); + bytes memory nonce = header.headerItems[14].readBytes(); if (nonce.length != 8 || keccak256(nonce) != keccak256(hex"0000000000000000")) { revert InvalidNonce(nonce); } - header.height = uint64(header.headerItems[8].toUint()); - header.stateRoot = bytes32(header.headerItems[3].toUintStrict()); - header.timestamp = uint64(header.headerItems[11].toUint()); + uint256 height = header.headerItems[8].readUint256(); + if (height == 0 || height > type(uint64).max) revert InvalidHeaderHeight(); + header.height = uint64(height); + header.stateRoot = _readBytes32Strict(header.headerItems[3]); + uint256 timestamp = header.headerItems[11].readUint256(); + if (timestamp == 0 || timestamp > type(uint64).max) revert InvalidHeaderTimestamp(timestamp); + header.timestamp = uint64(timestamp); - bytes memory extraData = header.headerItems[12].toBytes(); - header.extraDataItems = extraData.toRlpItem().toList(); + bytes memory extraData = header.headerItems[12].readBytes(); + header.extraDataItems = extraData.decodeList(); if (header.extraDataItems.length != 5) { revert InvalidExtraDataFormat(header.extraDataItems.length); } + uint256 vanityDataLength = header.extraDataItems[0].readBytes().length; + if (vanityDataLength != 32) revert InvalidVanityDataLength(vanityDataLength); - RLPReader.RLPItem[] memory validatorItems = header.extraDataItems[1].toList(); + Memory.Slice[] memory validatorItems = header.extraDataItems[1].readList(); if (validatorItems.length == 0) { revert EmptyValidatorSet(); } header.validators = new address[](validatorItems.length); for (uint256 i = 0; i < validatorItems.length; ++i) { - bytes memory validatorBytes = validatorItems[i].toBytes(); + bytes memory validatorBytes = validatorItems[i].readBytes(); if (validatorBytes.length != 20) { revert InvalidValidatorAddressLength(validatorBytes.length); } @@ -291,10 +298,10 @@ abstract contract BesuLightClientBase is IBesuLightClient, IBesuLightClientError header.validators[i] = validator; } - RLPReader.RLPItem[] memory sealItems = header.extraDataItems[4].toList(); + Memory.Slice[] memory sealItems = header.extraDataItems[4].readList(); header.commitSeals = new bytes[](sealItems.length); for (uint256 i = 0; i < sealItems.length; ++i) { - header.commitSeals[i] = sealItems[i].toBytes(); + header.commitSeals[i] = sealItems[i].readBytes(); } } @@ -312,16 +319,19 @@ abstract contract BesuLightClientBase is IBesuLightClient, IBesuLightClientError pure returns (bytes32) { - bytes memory accountRlp = accountProof.verifyRLPProof(stateRoot, keccak256(abi.encodePacked(account))); - RLPReader.RLPItem[] memory accountItems = accountRlp.toRlpItem().toList(); - return bytes32(accountItems[2].toUintStrict()); + (bool exists, bytes memory accountRlp) = + accountProof.verifyRLPProof(stateRoot, keccak256(abi.encodePacked(account))); + if (!exists) revert AccountNotFound(account); + + Memory.Slice[] memory accountItems = accountRlp.decodeList(); + return _readBytes32Strict(accountItems[2]); } /// @notice Computes the storage slot used for an IBC commitment path. /// @param rawPath Raw commitment path bytes. /// @return The storage slot for the commitment. function _commitmentStorageSlot(bytes memory rawPath) internal pure returns (bytes32) { - return keccak256(abi.encode(keccak256(rawPath), IBCSTORE_STORAGE_SLOT)); + return IBCSTORE_STORAGE_SLOT.deriveMapping(keccak256(rawPath)); } /// @notice Recovers unique commit seal signers for a digest. @@ -487,8 +497,30 @@ abstract contract BesuLightClientBase is IBesuLightClient, IBesuLightClientError /// @notice Returns the full RLP bytes for an item. /// @param item The RLP item. /// @return The RLP-encoded bytes. - function _rlpItemBytes(RLPReader.RLPItem memory item) internal pure returns (bytes memory) { - return item.toRlpBytes(); + function _rlpItemBytes(Memory.Slice item) internal pure returns (bytes memory) { + return item.toBytes(); + } + + /// @notice Encodes raw bytes as an RLP string. + /// @param raw Raw bytes to encode. + /// @return The RLP-encoded string. + function _encodeRlpBytes(bytes memory raw) internal pure returns (bytes memory) { + return RLP.encode(raw); + } + + /// @notice Encodes pre-encoded RLP items as an RLP list. + /// @param items RLP-encoded list items. + /// @return The RLP-encoded list. + function _encodeRlpList(bytes[] memory items) internal pure returns (bytes memory) { + return RLP.encode(items); + } + + /// @notice Decodes a fixed-width 32-byte RLP data item. + /// @param item The encoded RLP item. + /// @return The decoded 32-byte value. + function _readBytes32Strict(Memory.Slice item) private pure returns (bytes32) { + if (item.length() != 33) revert RLP.RLPInvalidEncoding(); + return item.readBytes32(); } /// @notice Restricts access to proof submitters unless submission is open to anyone. diff --git a/ibc-solidity/contracts/light-clients/besu/MPTProof.sol b/ibc-solidity/contracts/light-clients/besu/MPTProof.sol index a90e87184..0261de81d 100644 --- a/ibc-solidity/contracts/light-clients/besu/MPTProof.sol +++ b/ibc-solidity/contracts/light-clients/besu/MPTProof.sol @@ -1,282 +1,344 @@ // SPDX-License-Identifier: Apache-2.0 -// This file is copied from solidity-mpt library. -// https://github.com/ibc-solidity/solidity-mpt/blob/d157b5fd0aafb0b1c23bc3a3eb5f5bc04b3fd0a3/src/MPTProof.sol +// OpenZeppelin Contracts (last updated v5.6.0) (utils/cryptography/TrieProof.sol) +// Derived from OpenZeppelin Contracts v5.6.1 TrieProof.sol: +// https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v5.6.1/contracts/utils/cryptography/TrieProof.sol pragma solidity ^0.8.28; -/* solhint-disable no-inline-assembly, function-max-lines, code-complexity, reason-string, gas-custom-errors, -gas-increment-by-one, gas-strict-inequalities */ +// Keep the upstream traversal structure easy to diff when upgrading OpenZeppelin. +// solhint-disable code-complexity, function-max-lines, gas-increment-by-one, gas-strict-inequalities, +// solhint-disable no-inline-assembly -import { RLPReader } from "./RLPReader.sol"; +import { Bytes } from "@openzeppelin-contracts/utils/Bytes.sol"; +import { Memory } from "@openzeppelin-contracts/utils/Memory.sol"; +import { RLP } from "@openzeppelin-contracts/utils/RLP.sol"; -/// @title Merkle Patricia Trie Proof -/// @notice Verifies Ethereum Merkle Patricia Trie inclusion and exclusion proofs. +/** + * @title Ethereum Merkle-Patricia trie proof verification + * @notice Library for verifying Ethereum Merkle-Patricia trie inclusion and exclusion proofs. + * + * This is a narrow fork of OpenZeppelin's `TrieProof` library. OpenZeppelin v5.6.1 only accepts + * inclusion proofs, while IBC non-membership verification also requires authenticated exclusion. + * The traversal therefore returns an explicit `exists` flag and accepts these exclusion terminals: + * + * * an empty trie, + * * an empty branch child or branch value, and + * * a compact leaf or extension path that diverges from the requested key. + * + * Exclusion is accepted only at the final supplied proof element. The proof wire format remains + * this light client's existing RLP-encoded list of RLP nodes. + */ library MPTProof { - using RLPReader for RLPReader.RLPItem; - using RLPReader for bytes; - - /// @notice Verifies an RLP-encoded Merkle Patricia Trie proof. - /// @dev If the proof proves inclusion, the value is returned; for exclusion, an empty byte array is returned. - /// @param rlpProof is the stack of MPT nodes (starting with the root) that - /// need to be traversed during verification. It's encoded with RLP. - /// @param rootHash is the Keccak-256 hash of the root node of the MPT. - /// @param mptKey is a trie key of the node whose - /// inclusion/exclusion we are proving. - /// @return value whose inclusion is proved or an empty byte array for - /// a proof of exclusion + using Bytes for *; + using RLP for *; + using Memory for *; + + /// @notice Hex-prefix encodings for extension and leaf paths. + enum Prefix { + EXTENSION_EVEN, // 0 - Extension node with even length path + EXTENSION_ODD, // 1 - Extension node with odd length path + LEAF_EVEN, // 2 - Leaf node with even length path + LEAF_ODD // 3 - Leaf node with odd length path + } + + /// @notice Errors that can occur while traversing a trie proof. + enum ProofError { + NO_ERROR, // No error occurred during proof traversal + EMPTY_KEY, // The provided key is empty + INVALID_ROOT, // The validation of the root node failed + INVALID_LARGE_NODE, // The validation of a large node failed + INVALID_SHORT_NODE, // The validation of a short node failed + EMPTY_PATH, // The path in a leaf or extension node is empty + INVALID_PATH_REMAINDER, // The path remainder in a leaf or extension node is invalid + EMPTY_EXTENSION_PATH_REMAINDER, // The path remainder in an extension node is empty + INVALID_EXTRA_PROOF_ELEMENT, // A leaf value should be the last proof element + EMPTY_VALUE, // The leaf value is empty + MISMATCH_LEAF_PATH_KEY_REMAINDER, // The path remainder in a leaf node doesn't match the key remainder + UNKNOWN_NODE_PREFIX, // The node prefix is unknown + UNPARSEABLE_NODE, // The node cannot be parsed from RLP encoding + INVALID_PROOF // General failure during proof traversal + } + + /// @notice Indicates that trie proof traversal failed. + /// @param err The traversal error. + error TrieProofTraversalError(ProofError err); + + /// @notice The radix of the Ethereum trie. + uint256 internal constant EVM_TREE_RADIX = 16; + + /// @notice Number of items in a branch node (16 children and one value). + uint256 internal constant BRANCH_NODE_LENGTH = EVM_TREE_RADIX + 1; + + /// @notice Number of items in leaf or extension nodes. + uint256 internal constant LEAF_OR_EXTENSION_NODE_LENGTH = 2; + + /// @notice Root hash of the empty Ethereum Merkle-Patricia trie. + bytes32 internal constant EMPTY_TRIE_ROOT = 0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421; + + /// @notice Verifies an RLP-encoded proof and returns whether `key` exists and its value. + /// @dev Reverts with {TrieProofTraversalError} if the proof is malformed or not linked to `root`. + /// @param rlpProof An RLP list containing the encoded trie nodes. + /// @param root The expected trie root. + /// @param key The trie key to verify. + /// @return exists Whether the key is present in the trie. + /// @return value The value associated with the key, or empty bytes when it is absent. function verifyRLPProof( bytes memory rlpProof, - bytes32 rootHash, - bytes32 mptKey + bytes32 root, + bytes32 key ) internal pure - returns (bytes memory value) + returns (bool exists, bytes memory value) { - bytes memory key = new bytes(32); - assembly { - mstore(add(key, 0x20), mptKey) - } - return verify(rlpProof.toRlpItem().toList(), rootHash, decodeNibbles(key, 0)); + ProofError err; + (value, err) = _tryTraverse(root, abi.encodePacked(key), _decodeProof(rlpProof)); + require(err == ProofError.NO_ERROR, TrieProofTraversalError(err)); + exists = value.length != 0; } - /// @notice Verifies a decoded Merkle Patricia Trie proof. - /// @dev If the proof proves inclusion, the value is returned; for exclusion, an empty byte array is returned. - /// @param proof is the stack of MPT nodes (starting with the root) that - /// need to be traversed during verification. - /// @param rootHash is the Keccak-256 hash of the root node of the MPT. - /// @param mptKeyNibbles is the key (consisting of nibbles) of the node whose - /// inclusion/exclusion we are proving. - /// @return value whose inclusion is proved or an empty byte array for - /// a proof of exclusion - function verify( - RLPReader.RLPItem[] memory proof, - bytes32 rootHash, - bytes memory mptKeyNibbles + /// @notice Traverses a proof and reports its value and error without reverting on traversal errors. + /// @dev This function may still revert if malformed input leads to RLP decoding errors. + /// @param root The expected trie root. + /// @param key The trie key to verify. + /// @param proof The encoded trie nodes, ordered from root to terminal node. + /// @return value The value associated with the key, or empty bytes when it is absent. + /// @return err The traversal error, or `NO_ERROR` for a valid inclusion or exclusion proof. + function _tryTraverse( + bytes32 root, + bytes memory key, + bytes[] memory proof ) - internal + private pure - returns (bytes memory value) + returns (bytes memory, ProofError) { - uint256 mptKeyOffset = 0; - bytes32 nodeHashHash = bytes32(0); - RLPReader.RLPItem[] memory node; - RLPReader.RLPItem memory rlpValue; - + if (key.length == 0) return (_emptyBytesMemory(), ProofError.EMPTY_KEY); if (proof.length == 0) { - // Root hash of empty Merkle-Patricia-Trie - require(rootHash == 0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421); - return new bytes(0); + return root == EMPTY_TRIE_ROOT + ? (_emptyBytesMemory(), ProofError.NO_ERROR) + : (_emptyBytesMemory(), ProofError.INVALID_PROOF); } - // Traverse stack of nodes starting at root. - for (uint256 i = 0; i < proof.length; i++) { - // The root node is hashed with Keccak-256 ... - if (i == 0 && rootHash != proof[i].rlpBytesKeccak256()) { - revert(); - } - // ... whereas all other nodes are hashed with the MPT - // hash function. - if (i != 0 && nodeHashHash != mptHashHash(proof[i])) { - revert(); - } - // We verified that proof[i] has the correct hash, so we - // may safely decode it. - node = proof[i].toList(); - - if (node.length == 2) { - // Extension or Leaf node - - bool isLeaf; - bytes memory nodeKey; - (isLeaf, nodeKey) = merklePatriciaCompactDecode(node[0].toBytes()); - - uint256 prefixLength = sharedPrefixLength(mptKeyOffset, mptKeyNibbles, nodeKey); - mptKeyOffset += prefixLength; - - if (prefixLength < nodeKey.length) { - // Proof claims divergent extension or leaf. (Only - // relevant for proofs of exclusion.) - // An Extension/Leaf node is divergent iff it "skips" over - // the point at which a Branch node should have been had the - // excluded key been included in the trie. - // Example: Imagine a proof of exclusion for path [1, 4], - // where the current node is a Leaf node with - // path [1, 3, 3, 7]. For [1, 4] to be included, there - // should have been a Branch node at [1] with a child - // at 3 and a child at 4. - - // Sanity check - if (i < proof.length - 1) { - // divergent node must come last in proof - revert(); - } + // Expand the key + bytes memory keyExpanded = key.toNibbles(); + + // These are assigned before use whenever traversal advances beyond the root. + // slither-disable-next-line uninitialized-local + bytes32 currentNodeId; + // slither-disable-next-line uninitialized-local + uint256 currentNodeIdLength; + + // Free memory pointer cache + Memory.Pointer fmp = Memory.getFreeMemoryPointer(); - return new bytes(0); + // Traverse proof + uint256 keyIndex = 0; + for (uint256 i = 0; i < proof.length; ++i) { + // validates the encoded node matches the expected node id + bytes memory encoded = proof[i]; + if (keyIndex == 0) { + // Root node must match root hash + if (keccak256(encoded) != root) { + return (_emptyBytesMemory(), ProofError.INVALID_ROOT); + } + } else if (encoded.length >= 32) { + // Large nodes are stored as hashes + if (currentNodeIdLength != 32 || keccak256(encoded) != currentNodeId) { + return (_emptyBytesMemory(), ProofError.INVALID_LARGE_NODE); + } + } else { + // Short nodes must match directly + if (currentNodeIdLength != encoded.length || bytes32(encoded) != currentNodeId) { + return (_emptyBytesMemory(), ProofError.INVALID_SHORT_NODE); } + } - if (isLeaf) { - // Sanity check - if (i < proof.length - 1) { - // leaf node must come last in proof - revert(); - } + // decode the current node as an RLP list, and process it + for (Memory.Slice[] memory decoded = encoded.decodeList();;) { + if (decoded.length == BRANCH_NODE_LENGTH) { + // If we've consumed the entire key, the value must be in the last slot + // Otherwise, continue down the branch specified by the next nibble in the key + if (keyIndex == keyExpanded.length) { + return _validateLastItem(decoded[EVM_TREE_RADIX], proof.length, i, true); + } else { + bytes1 branchKey = keyExpanded[keyIndex]; + Memory.Slice childNode = decoded[uint8(branchKey)]; + if (_isEmpty(childNode)) { + return _validateExclusion(proof.length, i); + } - if (mptKeyOffset < mptKeyNibbles.length) { - return new bytes(0); - } + (currentNodeId, currentNodeIdLength) = _getNodeId(childNode); + keyIndex += 1; - rlpValue = node[1]; - return rlpValue.toBytes(); - } else { - // extension - // Sanity check - if (i == proof.length - 1) { - // shouldn't be at last level - revert(); + if (currentNodeIdLength == 32 || _match(childNode, proof, i + 1)) { + break; + } + decoded = childNode.readList(); } + } else if (decoded.length == LEAF_OR_EXTENSION_NODE_LENGTH) { + bytes[] memory proof_ = proof; - if (!node[1].isList()) { - // rlp(child) was at least 32 bytes. node[1] contains - // Keccak256(rlp(child)). - nodeHashHash = node[1].payloadKeccak256(); - } else { - // rlp(child) was at less than 32 bytes. node[1] contains - // rlp(child). - nodeHashHash = node[1].rlpBytesKeccak256(); + bytes memory path = decoded[0].readBytes().toNibbles(); // expanded path + // The following is equivalent to path.length < 2 because toNibbles can't return odd-length buffers + if (path.length == 0) { + return (_emptyBytesMemory(), ProofError.EMPTY_PATH); } - } - } else if (node.length == 17) { - // Branch node - - if (mptKeyOffset != mptKeyNibbles.length) { - // we haven't consumed the entire path, so we need to look at a child - uint256 nibble = uint256(uint8(mptKeyNibbles[mptKeyOffset])); - mptKeyOffset += 1; - if (nibble >= 16) { - // each element of the path has to be a nibble - revert(); + uint8 prefix = uint8(path[0]); // path encoding nibble (node type + parity), see {Prefix} + if (prefix > uint8(Prefix.LEAF_ODD)) { + return (_emptyBytesMemory(), ProofError.UNKNOWN_NODE_PREFIX); } - if (isEmptyBytesequence(node[nibble])) { - // Sanity - if (i != proof.length - 1) { - // leaf node should be at last level - revert(); - } + Memory.Slice keyRemainder = keyExpanded.asSlice().slice(keyIndex); // Remaining key to match + Memory.Slice pathRemainder = path.asSlice().slice(2 - (prefix % 2)); // Path after the prefix + uint256 pathRemainderLength = pathRemainder.length(); - return new bytes(0); - } else if (!node[nibble].isList()) { - nodeHashHash = node[nibble].payloadKeccak256(); - } else { - nodeHashHash = node[nibble].rlpBytesKeccak256(); + // pathRemainder must not be longer than keyRemainder and must match the start of keyRemainder + if ( + pathRemainderLength > keyRemainder.length() + || !pathRemainder.equal(keyRemainder.slice(0, pathRemainderLength)) + ) { + return _validateExclusion(proof_.length, i); } - } else { - // we have consumed the entire mptKey, so we need to look at what's contained in this node. - // Sanity - if (i != proof.length - 1) { - // should be at last level - revert(); - } + if (prefix <= uint8(Prefix.EXTENSION_ODD)) { + // Eq to: prefix == EXTENSION_EVEN || prefix == EXTENSION_ODD + if (pathRemainderLength == 0) { + return (_emptyBytesMemory(), ProofError.EMPTY_EXTENSION_PATH_REMAINDER); + } + // Increment keyIndex by the number of nibbles consumed and continue traversal + Memory.Slice childNode = decoded[1]; + (currentNodeId, currentNodeIdLength) = _getNodeId(childNode); + keyIndex += pathRemainderLength; - return node[16].toBytes(); + if (currentNodeIdLength == 32 || _match(childNode, proof_, i + 1)) { + break; + } + decoded = childNode.readList(); + } else if (prefix <= uint8(Prefix.LEAF_ODD)) { + // Eq to: prefix == LEAF_EVEN || prefix == LEAF_ODD + // + // Leaf node (terminal) - return its value if key matches completely + // we already know that pathRemainder is a prefix of keyRemainder, so checking the length + // sufficient + return pathRemainderLength == keyRemainder.length() + ? _validateLastItem(decoded[1], proof_.length, i, false) + : _validateExclusion(proof_.length, i); + } + } else { + return (_emptyBytesMemory(), ProofError.UNPARSEABLE_NODE); } - } else { - revert("invalid node length"); } + // Reset memory before next iteration. Deallocates `decoded` and `path`. + Memory.unsafeSetFreeMemoryPointer(fmp); } - // unreachable here - revert(); + + // If we've gone through all proof elements without finding a value, the proof is invalid + return (_emptyBytesMemory(), ProofError.INVALID_PROOF); } - /// @notice Checks whether an RLP item is the empty byte sequence. - /// @param item The RLP item to check. - /// @return True if the item encodes an empty byte sequence. - function isEmptyBytesequence(RLPReader.RLPItem memory item) internal pure returns (bool) { - if (item.len != 1) { - return false; - } - uint8 b; - uint256 memPtr = item.memPtr; - assembly { - b := byte(0, mload(memPtr)) - } - return b == 0x80; /* empty byte string */ + /// @notice Validates that an exclusion terminal is the final proof element. + /// @param trieProofLength The total number of proof elements. + /// @param i The index of the current proof element. + /// @return value Always empty bytes because the key is absent. + /// @return err The validation error, or `NO_ERROR` for a valid exclusion terminal. + function _validateExclusion( + uint256 trieProofLength, + uint256 i + ) + private + pure + returns (bytes memory value, ProofError err) + { + return i == trieProofLength - 1 + ? (_emptyBytesMemory(), ProofError.NO_ERROR) + : (_emptyBytesMemory(), ProofError.INVALID_EXTRA_PROOF_ELEMENT); } - /// @notice Expands bytes into nibbles starting at an offset. - /// @param bz The bytes to expand. - /// @param offset The nibble offset. - /// @return nibbles The expanded nibbles. - function decodeNibbles(bytes memory bz, uint256 offset) internal pure returns (bytes memory nibbles) { - uint256 length = bz.length * 2; - require(bz.length > 0 && offset <= length); - - nibbles = new bytes(length - offset); - uint256 i = offset; - if (offset & 1 == 1) { - nibbles[0] = bytes1((uint8(bz[offset / 2]) >> 0) & 0xF); - i++; + /// @notice Validates a terminal trie item and ensures it is the final proof element. + /// @dev Branch values may be empty to prove exclusion; leaf values may not be empty. + /// @param item The terminal branch or leaf item. + /// @param trieProofLength The total number of proof elements. + /// @param i The index of the current proof element. + /// @param emptyMeansAbsent Whether an empty item is a valid exclusion proof. + /// @return value The terminal value, or empty bytes when the key is absent. + /// @return err The validation error, or `NO_ERROR` for a valid terminal item. + function _validateLastItem( + Memory.Slice item, + uint256 trieProofLength, + uint256 i, + bool emptyMeansAbsent + ) + private + pure + returns (bytes memory, ProofError) + { + if (i != trieProofLength - 1) { + return (_emptyBytesMemory(), ProofError.INVALID_EXTRA_PROOF_ELEMENT); } - unchecked { - for (; i < length - 1; i += 2) { - nibbles[i - offset] = bytes1((uint8(bz[i / 2]) >> 4) & 0xF); - nibbles[i - offset + 1] = bytes1((uint8(bz[i / 2]) >> 0) & 0xF); - } + bytes memory value = item.readBytes(); + if (value.length == 0) { + return emptyMeansAbsent + ? (_emptyBytesMemory(), ProofError.NO_ERROR) + : (_emptyBytesMemory(), ProofError.EMPTY_VALUE); } + return (value, ProofError.NO_ERROR); } - /// @notice Decodes compact Merkle Patricia Trie path encoding. - /// @param bz The compact encoded path bytes. - /// @return isLeaf True if the compact path marks a leaf node. - /// @return nibbles The decoded path nibbles. - function merklePatriciaCompactDecode(bytes memory bz) internal pure returns (bool isLeaf, bytes memory nibbles) { - require(bz.length > 0); - uint256 firstNibble = uint8(bz[0]) >> 4 & 0xF; - uint256 offset = 0; - if (firstNibble == 0) { - offset = 2; - isLeaf = false; - } else if (firstNibble == 1) { - offset = 1; - isLeaf = false; - } else if (firstNibble == 2) { - offset = 2; - isLeaf = true; - } else if (firstNibble == 3) { - offset = 1; - isLeaf = true; - } else { - // Not supposed to happen! - revert(); - } - return (isLeaf, decodeNibbles(bz, offset)); + /** + * @notice Extracts the node ID as a hash or raw data based on its size. + * @param node The encoded trie node. + * @return nodeId The hashed or inline node identifier. + * @return nodeIdLength The length of the inline identifier, or 32 for a hashed node. + * + * For short nodes (encoded length < 32 bytes) the node ID is the node content itself, + * For larger nodes, the node ID is the hash of the encoded node data. + * + * [NOTE] + * ==== + * If a 32-byte input is provided (can occur with inline child references), it is used directly (like short nodes). + * When `nodeIdLength == 32`, inline processing is skipped. The next traversal step then checks whether the next + * node is large and its hash matches those raw bytes. If that is not the case, it returns {INVALID_LARGE_NODE}. + * + * Empty branch children are handled as exclusion terminals before this function is called. + * ==== + */ + function _getNodeId(Memory.Slice node) private pure returns (bytes32 nodeId, uint256 nodeIdLength) { + uint256 nodeLength = node.length(); + return nodeLength < 33 ? (node.load(0), nodeLength) : (node.readBytes32(), 32); } - /// @notice Computes the shared prefix length between two nibble arrays. - /// @param xsOffset Offset into `xs` where comparison starts. - /// @param xs The first nibble array. - /// @param ys The second nibble array. - /// @return The number of matching nibbles. - function sharedPrefixLength(uint256 xsOffset, bytes memory xs, bytes memory ys) internal pure returns (uint256) { - uint256 i = 0; - for (; i + xsOffset < xs.length && i < ys.length; i++) { - if (xs[i + xsOffset] != ys[i]) { - return i; - } + /// @notice Decodes the light client's RLP list of already RLP-encoded proof nodes. + /// @param rlpProof The RLP-encoded list of proof nodes. + /// @return proof The individual encoded proof nodes. + function _decodeProof(bytes memory rlpProof) private pure returns (bytes[] memory proof) { + Memory.Slice[] memory items = rlpProof.decodeList(); + proof = new bytes[](items.length); + for (uint256 i = 0; i < items.length; ++i) { + proof[i] = items[i].toBytes(); } - return i; } - /// @notice Computes the keccak256 hash of the Merkle Patricia Trie hash of an item. - /// @dev MPT hashes are variable length: short inputs are inlined, long inputs are keccak256-hashed. - /// @param input The byte sequence to be hashed. - /// @return Keccak-256(MPT-hash(input)) - function mptHashHash(RLPReader.RLPItem memory input) internal pure returns (bytes32) { - if (input.len < 32) { - return input.rlpBytesKeccak256(); - } else { - return keccak256(abi.encodePacked(input.rlpBytesKeccak256())); + /// @notice Returns whether an RLP item is the canonical empty byte string. + /// @param item The RLP item to inspect. + /// @return Whether the item is the canonical empty byte string. + function _isEmpty(Memory.Slice item) private pure returns (bool) { + return item.length() == 1 && bytes1(item.load(0)) == 0x80; + } + + /// @notice Returns an empty byte array without allocating memory. + /// @return result The empty byte array. + function _emptyBytesMemory() private pure returns (bytes memory result) { + assembly ("memory-safe") { + result := 0x60 // mload(0x60) is always 0 } } + + /// @notice Returns whether a slice matches the array item at `index`. + /// @param slice The memory slice to compare. + /// @param array The byte-array collection containing the candidate item. + /// @param index The candidate item index. + /// @return Whether the index exists and the values match. + function _match(Memory.Slice slice, bytes[] memory array, uint256 index) private pure returns (bool) { + return index < array.length && slice.equal(array[index].asSlice()); + } } diff --git a/ibc-solidity/contracts/light-clients/besu/README.md b/ibc-solidity/contracts/light-clients/besu/README.md index 88099b401..65e7458e2 100644 --- a/ibc-solidity/contracts/light-clients/besu/README.md +++ b/ibc-solidity/contracts/light-clients/besu/README.md @@ -51,7 +51,8 @@ constructor( - `initialTrustedTimestamp`: trusted header timestamp in seconds. - `initialTrustedStorageRoot`: storage root of the tracked `ICS26Router` account at `initialTrustedHeight`. - `initialTrustedValidators`: validator set trusted at `initialTrustedHeight`. -- `trustingPeriod`: weak-subjectivity window in seconds. `0` means no expiry. +- `trustingPeriod`: weak-subjectivity window in seconds. `0` disables expiry + and is unsuitable for production non-adjacent verification. - `maxClockDrift`: allowed future drift for submitted headers in seconds. - `roleManager`: if non-zero, receives admin and `PROOF_SUBMITTER_ROLE`; if zero, proof submission is open to anyone through the zero-address sentinel. @@ -68,17 +69,31 @@ struct MsgUpdateClient { ``` - `headerRlp`: full raw Besu block header RLP, including `extraData` and commit seals. -- `trustedHeight`: must use `revisionNumber == 0`. +- `trustedHeight`: must use `revisionNumber == 0` and be lower than the submitted header height. - `accountProof`: raw RLP-encoded Ethereum account proof for the tracked `ICS26Router` account against the submitted header's `stateRoot`. On update, the contract: -1. parses and validates the Besu header, +1. parses the full signed header and validates the fields required by this non-adjacent verification model, 2. reconstructs the protocol-specific commit-seal digest following the YUI + prover sealing-header model, 3. checks trusted-validator overlap and new-validator quorum, 4. verifies the tracked router account proof, 5. stores the router account `storageRoot` plus the new validator set. +Non-adjacent updates are supported by design. The submitted height must be +strictly after the selected trusted height. If validator turnover prevents the +required overlap, the relayer must first submit one or more intermediate +headers; they do not need to be adjacent. + +The contract authenticates the complete header through its commit seals and +validates the fields used by this verifier. It does not re-execute source-chain +transactions; those semantics remain covered by the honest-validator +assumption of the trusting-period model. + +The parser accepts the standard 15 Ethereum header fields plus signed +fork-extension fields. Deployments must confirm that the configured Besu fork +keeps the standard fields at their expected indices. + ## Membership / non-membership proofs `verifyMembership` and `verifyNonMembership` expect the standard `ILightClientMsgs` payloads used by Eureka. @@ -120,6 +135,25 @@ where `IBCSTORE_STORAGE_SLOT` is the ERC-7201 namespace constant used by `IBCSto - The proof must show that the slot is absent. - The return value is the trusted consensus timestamp in seconds for `msg_.proofHeight`. +### Trie proof implementation + +`MPTProof.sol` is a narrow fork of OpenZeppelin Contracts v5.6.1 +[`TrieProof.sol`](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v5.6.1/contracts/utils/cryptography/TrieProof.sol). +The upstream library verifies inclusion only and its private traversal helpers +cannot be wrapped or inherited to add exclusion. + +The fork keeps OpenZeppelin's node-link validation, compact-path traversal, and +inline-node handling. Its local changes are limited to: + +1. decoding this client's existing RLP-encoded proof-list wire format, +2. returning an explicit `exists` flag, +3. accepting authenticated exclusion at an empty trie, empty branch child or + value, or divergent compact leaf/extension path, and +4. rejecting proof nodes supplied after any inclusion or exclusion terminal. + +When updating OpenZeppelin, diff `MPTProof.sol` against the pinned upstream file +above and run `forge test --match-path "test/besu-bft/*.sol"`. + ## Test fixtures The Foundry fixtures under `test/besu-bft/fixtures/` can be regenerated from the focused Besu↔Besu e2e flow: diff --git a/ibc-solidity/contracts/light-clients/besu/RLPReader.sol b/ibc-solidity/contracts/light-clients/besu/RLPReader.sol deleted file mode 100644 index 173b50a96..000000000 --- a/ibc-solidity/contracts/light-clients/besu/RLPReader.sol +++ /dev/null @@ -1,300 +0,0 @@ -// SPDX-License-Identifier: Apache-2.0 - -/* - * @author Hamdi Allam hamdi.allam97@gmail.com - * Please reach out with any questions or concerns - */ -// This file is adapted from the solidity-rlp library. -// https://github.com/hamdiallam/Solidity-RLP/blob/0212f8e754471da67fc5387df7855f47f944f925/contracts/RLPReader.sol -pragma solidity ^0.8.28; - -/* solhint-disable state-visibility, no-inline-assembly, reason-string, gas-custom-errors, gas-increment-by-one, -gas-strict-inequalities */ - -/// @title RLP Reader -/// @notice Library for reading Recursive Length Prefix encoded values. -library RLPReader { - /// @notice First byte for short RLP strings. - uint8 constant STRING_SHORT_START = 0x80; - /// @notice First byte for long RLP strings. - uint8 constant STRING_LONG_START = 0xb8; - /// @notice First byte for short RLP lists. - uint8 constant LIST_SHORT_START = 0xc0; - /// @notice First byte for long RLP lists. - uint8 constant LIST_LONG_START = 0xf8; - /// @notice EVM word size in bytes. - uint8 constant WORD_SIZE = 32; - - /// @notice RLP item memory view. - /// @param len Length of the encoded item. - /// @param memPtr Memory pointer to the encoded item. - struct RLPItem { - uint256 len; - uint256 memPtr; - } - - /// @notice Wraps RLP-encoded bytes as an RLP item. - /// @param item RLP-encoded bytes. - /// @return The RLP item memory view. - function toRlpItem(bytes memory item) internal pure returns (RLPItem memory) { - uint256 memPtr; - assembly { - memPtr := add(item, 0x20) - } - - return RLPItem(item.length, memPtr); - } - - /// @notice Returns the payload memory location for an RLP item. - /// @param item The RLP item. - /// @return The payload memory pointer. - /// @return The payload length. - function payloadLocation(RLPItem memory item) internal pure returns (uint256, uint256) { - uint256 offset = _payloadOffset(item.memPtr); - uint256 memPtr = item.memPtr + offset; - uint256 len = item.len - offset; // data length - return (memPtr, len); - } - - /// @notice Decodes an RLP list into item views. - /// @param item The RLP list item. - /// @return The list item views. - function toList(RLPItem memory item) internal pure returns (RLPItem[] memory) { - require(isList(item)); - - uint256 items = numItems(item); - RLPItem[] memory result = new RLPItem[](items); - - uint256 memPtr = item.memPtr + _payloadOffset(item.memPtr); - uint256 dataLen; - for (uint256 i = 0; i < items; i++) { - dataLen = _itemLength(memPtr); - result[i] = RLPItem(dataLen, memPtr); - memPtr = memPtr + dataLen; - } - - return result; - } - - /// @notice Checks whether an RLP item is a list. - /// @param item The RLP item. - /// @return True if the encoded payload is a list. - function isList(RLPItem memory item) internal pure returns (bool) { - if (item.len == 0) return false; - - uint8 byte0; - uint256 memPtr = item.memPtr; - assembly { - byte0 := byte(0, mload(memPtr)) - } - - if (byte0 < LIST_SHORT_START) return false; - return true; - } - - /// @notice Computes the keccak256 hash of the full RLP encoding without copying. - /// @param item The RLP item. - /// @return The keccak256 hash of the encoded item. - function rlpBytesKeccak256(RLPItem memory item) internal pure returns (bytes32) { - uint256 ptr = item.memPtr; - uint256 len = item.len; - bytes32 result; - assembly { - result := keccak256(ptr, len) - } - return result; - } - - /// @notice Computes the keccak256 hash of an RLP payload without copying. - /// @param item The RLP item. - /// @return The keccak256 hash of the item payload. - function payloadKeccak256(RLPItem memory item) internal pure returns (bytes32) { - (uint256 memPtr, uint256 len) = payloadLocation(item); - bytes32 result; - assembly { - result := keccak256(memPtr, len) - } - return result; - } - - /* - * RLPItem conversions into data types. - */ - - /// @notice Copies the full RLP encoding into a bytes array. - /// @param item The RLP item. - /// @return The RLP-encoded bytes. - function toRlpBytes(RLPItem memory item) internal pure returns (bytes memory) { - bytes memory result = new bytes(item.len); - if (result.length == 0) return result; - - uint256 ptr; - assembly { - ptr := add(0x20, result) - } - - copy(item.memPtr, ptr, item.len); - return result; - } - - /// @notice Converts an RLP item to an unsigned integer. - /// @param item The RLP item. - /// @return The decoded unsigned integer. - function toUint(RLPItem memory item) internal pure returns (uint256) { - require(item.len > 0 && item.len <= 33); - - (uint256 memPtr, uint256 len) = payloadLocation(item); - - uint256 result; - assembly { - result := mload(memPtr) - - // shift to the correct location if neccesary - if lt(len, 32) { result := div(result, exp(256, sub(32, len))) } - } - - return result; - } - - /// @notice Converts an RLP item to an unsigned integer and requires a 32-byte payload. - /// @param item The RLP item. - /// @return The decoded unsigned integer. - function toUintStrict(RLPItem memory item) internal pure returns (uint256) { - // one byte prefix - require(item.len == 33); - - uint256 result; - uint256 memPtr = item.memPtr + 1; - assembly { - result := mload(memPtr) - } - - return result; - } - - /// @notice Copies an RLP item payload into a bytes array. - /// @param item The RLP item. - /// @return The decoded payload bytes. - function toBytes(RLPItem memory item) internal pure returns (bytes memory) { - require(item.len > 0); - - (uint256 memPtr, uint256 len) = payloadLocation(item); - bytes memory result = new bytes(len); - - uint256 destPtr; - assembly { - destPtr := add(0x20, result) - } - - copy(memPtr, destPtr, len); - return result; - } - - /* - * Private Helpers - */ - - /// @notice Counts the payload items inside an encoded list. - /// @param item The RLP list item. - /// @return The number of items in the list. - function numItems(RLPItem memory item) private pure returns (uint256) { - if (item.len == 0) return 0; - - uint256 count = 0; - uint256 currPtr = item.memPtr + _payloadOffset(item.memPtr); - uint256 endPtr = item.memPtr + item.len; - while (currPtr < endPtr) { - currPtr = currPtr + _itemLength(currPtr); // skip over an item - count++; - } - - return count; - } - - /// @notice Computes the full encoded byte length of an RLP item at a memory pointer. - /// @param memPtr Memory pointer to the item. - /// @return The encoded item length. - function _itemLength(uint256 memPtr) private pure returns (uint256) { - uint256 itemLen; - uint256 byte0; - assembly { - byte0 := byte(0, mload(memPtr)) - } - - if (byte0 < STRING_SHORT_START) { - itemLen = 1; - } else if (byte0 < STRING_LONG_START) { - itemLen = byte0 - STRING_SHORT_START + 1; - } else if (byte0 < LIST_SHORT_START) { - assembly { - let byteLen := sub(byte0, 0xb7) // # of bytes the actual length is - memPtr := add(memPtr, 1) // skip over the first byte - - /* 32 byte word size */ - let dataLen := div(mload(memPtr), exp(256, sub(32, byteLen))) // right shifting to get the len - itemLen := add(dataLen, add(byteLen, 1)) - } - } else if (byte0 < LIST_LONG_START) { - itemLen = byte0 - LIST_SHORT_START + 1; - } else { - assembly { - let byteLen := sub(byte0, 0xf7) - memPtr := add(memPtr, 1) - - let dataLen := div(mload(memPtr), exp(256, sub(32, byteLen))) // right shifting to the correct length - itemLen := add(dataLen, add(byteLen, 1)) - } - } - - return itemLen; - } - - /// @notice Computes the offset from an RLP item prefix to its payload. - /// @param memPtr Memory pointer to the item. - /// @return The payload offset in bytes. - function _payloadOffset(uint256 memPtr) private pure returns (uint256) { - uint256 byte0; - assembly { - byte0 := byte(0, mload(memPtr)) - } - - if (byte0 < STRING_SHORT_START) { - return 0; - } else if (byte0 < STRING_LONG_START || (byte0 >= LIST_SHORT_START && byte0 < LIST_LONG_START)) { - return 1; - } else if (byte0 < LIST_SHORT_START) { - // being explicit - return byte0 - (STRING_LONG_START - 1) + 1; - } else { - return byte0 - (LIST_LONG_START - 1) + 1; - } - } - - /// @notice Copies memory from one pointer to another. - /// @param src Pointer to the source memory. - /// @param dest Pointer to the destination memory. - /// @param len Number of bytes to copy. - function copy(uint256 src, uint256 dest, uint256 len) private pure { - if (len == 0) return; - - // copy as many word sizes as possible - for (; len >= WORD_SIZE; len -= WORD_SIZE) { - assembly { - mstore(dest, mload(src)) - } - - src += WORD_SIZE; - dest += WORD_SIZE; - } - - if (len > 0) { - // left over bytes. Mask is used to remove unwanted bytes from the word - uint256 mask = 256 ** (WORD_SIZE - len) - 1; - assembly { - let srcpart := and(mload(src), not(mask)) // zero out src - let destpart := and(mload(dest), mask) // retrieve the bytes - mstore(dest, or(destpart, srcpart)) - } - } - } -} diff --git a/ibc-solidity/contracts/light-clients/besu/errors/IBesuLightClientErrors.sol b/ibc-solidity/contracts/light-clients/besu/errors/IBesuLightClientErrors.sol index ff87b4b26..3806449a1 100644 --- a/ibc-solidity/contracts/light-clients/besu/errors/IBesuLightClientErrors.sol +++ b/ibc-solidity/contracts/light-clients/besu/errors/IBesuLightClientErrors.sol @@ -13,10 +13,11 @@ interface IBesuLightClientErrors { /// @notice The submitted `extraData` field has an invalid RLP item count. /// @param itemsLength The decoded `extraData` item count. error InvalidExtraDataFormat(uint256 itemsLength); - /// @notice The submitted header height is zero. + /// @notice The submitted header height is zero, too large, or not after the selected trusted height. error InvalidHeaderHeight(); - /// @notice The submitted header timestamp is zero. - error InvalidHeaderTimestamp(); + /// @notice The trusted or submitted header timestamp is zero or does not fit the consensus-state representation. + /// @param actualTimestamp The decoded timestamp. + error InvalidHeaderTimestamp(uint256 actualTimestamp); /// @notice The submitted header timestamp is too far in the future. /// @param currentTimestamp The current block timestamp. /// @param headerTimestamp The submitted header timestamp. @@ -42,6 +43,12 @@ interface IBesuLightClientErrors { /// @notice The ommers hash is invalid. /// @param actualOmmersHash The ommers hash found in the header. error InvalidOmmersHash(bytes32 actualOmmersHash); + /// @notice The tracked account does not exist in the submitted state trie. + /// @param account The missing tracked account. + error AccountNotFound(address account); + /// @notice The BFT vanity data must be exactly 32 bytes. + /// @param length The decoded vanity-data length. + error InvalidVanityDataLength(uint256 length); /// @notice The validator set is empty. error EmptyValidatorSet(); /// @notice A validator address has an invalid byte length. diff --git a/ibc-solidity/test/besu-bft/BesuLightClientFixtureTestBase.sol b/ibc-solidity/test/besu-bft/BesuLightClientFixtureTestBase.sol index 68692c3aa..fa9a870fb 100644 --- a/ibc-solidity/test/besu-bft/BesuLightClientFixtureTestBase.sol +++ b/ibc-solidity/test/besu-bft/BesuLightClientFixtureTestBase.sol @@ -11,9 +11,9 @@ import { IICS02ClientMsgs } from "../../contracts/msgs/IICS02ClientMsgs.sol"; import { BesuIBFT2LightClient } from "../../contracts/light-clients/besu/BesuIBFT2LightClient.sol"; import { BesuQBFTLightClient } from "../../contracts/light-clients/besu/BesuQBFTLightClient.sol"; import { IBesuLightClient } from "../../contracts/light-clients/besu/interfaces/IBesuLightClient.sol"; +import { BesuQBFTLightClient } from "../../contracts/light-clients/besu/BesuQBFTLightClient.sol"; import { IBesuLightClientMsgs } from "../../contracts/light-clients/besu/msgs/IBesuLightClientMsgs.sol"; import { IBesuLightClientErrors } from "../../contracts/light-clients/besu/errors/IBesuLightClientErrors.sol"; -import { RLPReader } from "../../contracts/light-clients/besu/RLPReader.sol"; /// @dev Successful update input and expected consensus state. struct BesuUpdateFixture { @@ -61,21 +61,70 @@ struct BesuFixture { BesuProofFixture nonMembership; } +contract BesuHeaderTestHarness is BesuQBFTLightClient { + constructor(address[] memory validators) + BesuQBFTLightClient(address(1), 1, 1, bytes32(0), validators, 1, 1, address(0)) + { } + + function validateHeader(bytes calldata headerRlp) external pure { + _parseHeader(headerRlp); + } + + function replaceHeaderBytes( + bytes calldata headerRlp, + uint256 index, + bytes calldata rawValue + ) + external + pure + returns (bytes memory) + { + ParsedHeader memory header = _parseHeader(headerRlp); + bytes[] memory items = new bytes[](header.headerItems.length); + for (uint256 i = 0; i < items.length; ++i) { + items[i] = i == index ? _encodeRlpBytes(rawValue) : _rlpItemBytes(header.headerItems[i]); + } + return _encodeRlpList(items); + } + + function replaceExtraDataBytes( + bytes calldata headerRlp, + uint256 index, + bytes calldata rawValue + ) + external + pure + returns (bytes memory) + { + ParsedHeader memory header = _parseHeader(headerRlp); + bytes[] memory extraItems = new bytes[](header.extraDataItems.length); + for (uint256 i = 0; i < extraItems.length; ++i) { + extraItems[i] = i == index ? _encodeRlpBytes(rawValue) : _rlpItemBytes(header.extraDataItems[i]); + } + + bytes[] memory headerItems = new bytes[](header.headerItems.length); + for (uint256 i = 0; i < headerItems.length; ++i) { + headerItems[i] = + i == 12 ? _encodeRlpBytes(_encodeRlpList(extraItems)) : _rlpItemBytes(header.headerItems[i]); + } + return _encodeRlpList(headerItems); + } +} + abstract contract BesuLightClientFixtureTestBase is Test { using stdJson for string; - using RLPReader for bytes; - using RLPReader for RLPReader.RLPItem; - string internal constant FIXTURE_DIR = "/test/besu-bft/fixtures/"; BesuFixture internal fixture; IBesuLightClient internal client; IBesuLightClient internal wrongWrapper; + BesuHeaderTestHarness internal headerHarness; function setUp() public virtual { fixture = _loadFixture(_fixtureFile()); client = _deployPrimaryClient(); wrongWrapper = _deployWrongWrapper(); + headerHarness = new BesuHeaderTestHarness(fixture.initialTrustedValidators); } function fixtureUpdate() public view returns (BesuUpdateFixture[] memory updates) { @@ -94,24 +143,72 @@ abstract contract BesuLightClientFixtureTestBase is Test { } function test_updateClient_revertZeroTimestampWithoutStateChange() public { - BesuUpdateFixture memory update = fixture.nonAdjacentUpdate; - RLPReader.RLPItem memory headerItem = update.headerRlp.toRlpItem(); - RLPReader.RLPItem[] memory headerItems = headerItem.toList(); - (uint256 timestampPtr, uint256 timestampLen) = headerItems[11].payloadLocation(); - for (uint256 i = 0; i < timestampLen; ++i) { - update.headerRlp[timestampPtr - headerItem.memPtr + i] = 0; - } + IBesuLightClientMsgs.MsgUpdateClient memory update = + abi.decode(_encodeUpdate(fixture.nonAdjacentUpdate), (IBesuLightClientMsgs.MsgUpdateClient)); + update.headerRlp = headerHarness.replaceHeaderBytes(update.headerRlp, 11, hex"00"); bytes memory clientStateBefore = client.getClientState(); bytes memory consensusStateBefore = client.getConsensusState(fixture.initialTrustedHeight); - vm.expectRevert(IBesuLightClientErrors.InvalidHeaderTimestamp.selector); - client.updateClient(_encodeUpdate(update)); + vm.expectRevert(abi.encodeWithSelector(IBesuLightClientErrors.InvalidHeaderTimestamp.selector, 0)); + client.updateClient(abi.encode(update)); assertEq(client.getClientState(), clientStateBefore); assertEq(client.getConsensusState(fixture.initialTrustedHeight), consensusStateBefore); } + function test_updateClient_revertSubmittedHeightBeforeTrustedHeight() public { + vm.warp(fixture.initialTrustedTimestamp + 1); + client.updateClient(_encodeUpdate(fixture.nonAdjacentUpdate)); + + IBesuLightClientMsgs.MsgUpdateClient memory update = + abi.decode(_encodeUpdate(fixture.adjacentUpdate), (IBesuLightClientMsgs.MsgUpdateClient)); + update.trustedHeight.revisionHeight = fixture.nonAdjacentUpdate.height; + + vm.expectRevert(IBesuLightClientErrors.InvalidHeaderHeight.selector); + client.updateClient(abi.encode(update)); + } + + function test_updateClient_revertSubmittedHeightEqualsTrustedHeight() public { + vm.warp(fixture.initialTrustedTimestamp + 1); + client.updateClient(_encodeUpdate(fixture.nonAdjacentUpdate)); + + IBesuLightClientMsgs.MsgUpdateClient memory update = + abi.decode(_encodeUpdate(fixture.nonAdjacentUpdate), (IBesuLightClientMsgs.MsgUpdateClient)); + update.trustedHeight.revisionHeight = fixture.nonAdjacentUpdate.height; + + vm.expectRevert(IBesuLightClientErrors.InvalidHeaderHeight.selector); + client.updateClient(abi.encode(update)); + } + + function test_parseHeader_revertHeightOverflow() public { + bytes memory headerRlp = + headerHarness.replaceHeaderBytes(fixture.nonAdjacentUpdate.headerRlp, 8, hex"010000000000000000"); + + vm.expectRevert(IBesuLightClientErrors.InvalidHeaderHeight.selector); + headerHarness.validateHeader(headerRlp); + } + + function test_parseHeader_revertTimestampOverflow() public { + bytes memory headerRlp = + headerHarness.replaceHeaderBytes(fixture.nonAdjacentUpdate.headerRlp, 11, hex"010000000000000000"); + + vm.expectRevert( + abi.encodeWithSelector( + IBesuLightClientErrors.InvalidHeaderTimestamp.selector, uint256(type(uint64).max) + 1 + ) + ); + headerHarness.validateHeader(headerRlp); + } + + function test_parseHeader_revertInvalidVanityDataLength() public { + bytes memory headerRlp = + headerHarness.replaceExtraDataBytes(fixture.nonAdjacentUpdate.headerRlp, 0, new bytes(31)); + + vm.expectRevert(abi.encodeWithSelector(IBesuLightClientErrors.InvalidVanityDataLength.selector, 31)); + headerHarness.validateHeader(headerRlp); + } + function test_verifyMembership_returnsStoredTimestamp() public { vm.warp(fixture.initialTrustedTimestamp + 1); client.updateClient(_encodeUpdate(fixture.nonAdjacentUpdate)); diff --git a/ibc-solidity/test/besu-bft/BesuLightClientQuorum.t.sol b/ibc-solidity/test/besu-bft/BesuLightClientQuorum.t.sol index 9a949da2b..6bc8b0298 100644 --- a/ibc-solidity/test/besu-bft/BesuLightClientQuorum.t.sol +++ b/ibc-solidity/test/besu-bft/BesuLightClientQuorum.t.sol @@ -31,7 +31,7 @@ contract BesuLightClientQuorumTest is Test { } function test_constructor_rejectsZeroTrustedTimestamp() public { - vm.expectRevert(IBesuLightClientErrors.InvalidHeaderTimestamp.selector); + vm.expectRevert(abi.encodeWithSelector(IBesuLightClientErrors.InvalidHeaderTimestamp.selector, 0)); new BesuLightClientQuorumHarness(0, _addresses(1)); } diff --git a/ibc-solidity/test/besu-bft/MPTProof.t.sol b/ibc-solidity/test/besu-bft/MPTProof.t.sol new file mode 100644 index 000000000..7ada41e84 --- /dev/null +++ b/ibc-solidity/test/besu-bft/MPTProof.t.sol @@ -0,0 +1,125 @@ +// SPDX-License-Identifier: Apache-2.0 +pragma solidity ^0.8.28; + +import { Test } from "forge-std/Test.sol"; + +import { RLP } from "@openzeppelin-contracts/utils/RLP.sol"; + +import { MPTProof } from "../../contracts/light-clients/besu/MPTProof.sol"; + +contract MPTProofHarness { + function verify(bytes calldata proof, bytes32 root, bytes32 key) external pure returns (bool, bytes memory) { + return MPTProof.verifyRLPProof(proof, root, key); + } +} + +contract MPTProofTest is Test { + bytes32 private constant EMPTY_TRIE_ROOT = 0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421; + + MPTProofHarness private harness; + + function setUp() public { + harness = new MPTProofHarness(); + } + + function test_inclusion() public view { + bytes32 key = bytes32(uint256(1)); + bytes memory value = hex"05"; + bytes memory leaf = _leaf(key, value); + + (bool exists, bytes memory actualValue) = harness.verify(_proof(leaf), keccak256(leaf), key); + + assertTrue(exists); + assertEq(actualValue, value); + } + + function test_exclusionEmptyTrie() public view { + (bool exists, bytes memory value) = harness.verify(RLP.encode(new bytes[](0)), EMPTY_TRIE_ROOT, bytes32(0)); + + assertFalse(exists); + assertEq(value, bytes("")); + } + + function test_exclusionEmptyBranchChild() public view { + bytes memory branch = _emptyBranch(); + + (bool exists, bytes memory value) = harness.verify(_proof(branch), keccak256(branch), bytes32(0)); + + assertFalse(exists); + assertEq(value, bytes("")); + } + + function test_exclusionEmptyBranchValue() public view { + bytes32 key = bytes32(uint256(1)); + bytes memory branch = _emptyBranch(); + bytes memory extension = _extension(key, branch); + + (bool exists, bytes memory value) = harness.verify(_proof(extension), keccak256(extension), key); + + assertFalse(exists); + assertEq(value, bytes("")); + } + + function test_exclusionDivergentLeaf() public view { + bytes32 targetKey; + bytes memory leaf = _leaf(bytes32(uint256(1) << 252), hex"05"); + + (bool exists, bytes memory value) = harness.verify(_proof(leaf), keccak256(leaf), targetKey); + + assertFalse(exists); + assertEq(value, bytes("")); + } + + function test_exclusionDivergentExtension() public view { + bytes32 targetKey; + bytes memory extension = _extension(bytes32(uint256(1) << 252), _emptyBranch()); + + (bool exists, bytes memory value) = harness.verify(_proof(extension), keccak256(extension), targetKey); + + assertFalse(exists); + assertEq(value, bytes("")); + } + + function test_revertExtraNodeAfterExclusion() public { + bytes memory branch = _emptyBranch(); + bytes[] memory nodes = new bytes[](2); + nodes[0] = branch; + nodes[1] = branch; + + vm.expectRevert( + abi.encodeWithSelector( + MPTProof.TrieProofTraversalError.selector, MPTProof.ProofError.INVALID_EXTRA_PROOF_ELEMENT + ) + ); + harness.verify(RLP.encode(nodes), keccak256(branch), bytes32(0)); + } + + function _leaf(bytes32 key, bytes memory value) private pure returns (bytes memory) { + bytes[] memory items = new bytes[](2); + items[0] = RLP.encode(abi.encodePacked(bytes1(0x20), key)); + items[1] = RLP.encode(value); + return RLP.encode(items); + } + + function _extension(bytes32 key, bytes memory child) private pure returns (bytes memory) { + bytes[] memory items = new bytes[](2); + items[0] = RLP.encode(abi.encodePacked(bytes1(0), key)); + items[1] = child; + return RLP.encode(items); + } + + function _emptyBranch() private pure returns (bytes memory) { + bytes[] memory items = new bytes[](17); + bytes memory empty = RLP.encode(bytes("")); + for (uint256 i = 0; i < items.length; ++i) { + items[i] = empty; + } + return RLP.encode(items); + } + + function _proof(bytes memory node) private pure returns (bytes memory) { + bytes[] memory nodes = new bytes[](1); + nodes[0] = node; + return RLP.encode(nodes); + } +} From 73f7de1c0eaef29203e635f1e67ee3c417355ad9 Mon Sep 17 00:00:00 2001 From: Gjermund Garaba Date: Tue, 25 Aug 2026 17:25:32 +0200 Subject: [PATCH 22/22] fix(besu): remove duplicate fixture import Signed-off-by: Gjermund Garaba --- ibc-solidity/test/besu-bft/BesuLightClientFixtureTestBase.sol | 1 - 1 file changed, 1 deletion(-) diff --git a/ibc-solidity/test/besu-bft/BesuLightClientFixtureTestBase.sol b/ibc-solidity/test/besu-bft/BesuLightClientFixtureTestBase.sol index fa9a870fb..ee36e30ac 100644 --- a/ibc-solidity/test/besu-bft/BesuLightClientFixtureTestBase.sol +++ b/ibc-solidity/test/besu-bft/BesuLightClientFixtureTestBase.sol @@ -11,7 +11,6 @@ import { IICS02ClientMsgs } from "../../contracts/msgs/IICS02ClientMsgs.sol"; import { BesuIBFT2LightClient } from "../../contracts/light-clients/besu/BesuIBFT2LightClient.sol"; import { BesuQBFTLightClient } from "../../contracts/light-clients/besu/BesuQBFTLightClient.sol"; import { IBesuLightClient } from "../../contracts/light-clients/besu/interfaces/IBesuLightClient.sol"; -import { BesuQBFTLightClient } from "../../contracts/light-clients/besu/BesuQBFTLightClient.sol"; import { IBesuLightClientMsgs } from "../../contracts/light-clients/besu/msgs/IBesuLightClientMsgs.sol"; import { IBesuLightClientErrors } from "../../contracts/light-clients/besu/errors/IBesuLightClientErrors.sol";