diff --git a/Makefile b/Makefile index d2600f51a5..929c138861 100644 --- a/Makefile +++ b/Makefile @@ -359,7 +359,7 @@ ifdef UPGRADE_TEST_FROM_SOURCE zetanode-upgrade: e2e-images @echo "Building zetanode-upgrade from source" $(DOCKER) build -t zetanode:old -f Dockerfile-localnet --target old-runtime-source \ - --build-arg OLD_VERSION='release/v35' \ + --build-arg OLD_VERSION='release/v36' \ --build-arg NODE_VERSION=$(NODE_VERSION) \ --build-arg NODE_COMMIT=$(NODE_COMMIT) \ . @@ -367,7 +367,7 @@ else zetanode-upgrade: e2e-images @echo "Building zetanode-upgrade from binaries" $(DOCKER) build -t zetanode:old -f Dockerfile-localnet --target old-runtime \ - --build-arg OLD_VERSION='https://github.com/zeta-chain/node/releases/download/v35.0.0' \ + --build-arg OLD_VERSION='https://github.com/zeta-chain/node/releases/download/v36.0.1' \ --build-arg NODE_VERSION=$(NODE_VERSION) \ --build-arg NODE_COMMIT=$(NODE_COMMIT) \ . @@ -379,6 +379,7 @@ start-upgrade-test: zetanode-upgrade solana @echo "--> Starting upgrade test" export LOCALNET_MODE=upgrade && \ export UPGRADE_HEIGHT=240 && \ + export USE_ZETAE2E_ANTE=true && \ export E2E_ARGS="--test-solana --test-sui" && \ cd contrib/localnet/ && $(DOCKER_COMPOSE) --profile upgrade --profile solana --profile sui -f docker-compose-upgrade.yml up -d @@ -386,6 +387,7 @@ start-upgrade-test-light: zetanode-upgrade @echo "--> Starting light upgrade test (no ZetaChain state populating before upgrade)" export LOCALNET_MODE=upgrade && \ export UPGRADE_HEIGHT=60 && \ + export USE_ZETAE2E_ANTE=true && \ cd contrib/localnet/ && $(DOCKER_COMPOSE) --profile upgrade -f docker-compose-upgrade.yml up -d start-upgrade-test-admin: zetanode-upgrade diff --git a/changelog.md b/changelog.md index d373b0064d..d7f2d3eb18 100644 --- a/changelog.md +++ b/changelog.md @@ -7,9 +7,20 @@ * EVM inbounds support multiple calls inside same tx. EVM Gateway contracts must be upgraded before node upgrade, and an additional action fee should be set, by calling `updateAdditionalActionFee` admin function. +### Zetaclient Config + +* Feature flags are introduced, this section should be added to Zetaclient Config after EVM Gateway contracts are upgraded, to enable multiple EVM calls in Zetaclient: + +``` +"FeatureFlags": { + "EnableMultipleCalls": true +} +``` + ### Features * [4274](https://github.com/zeta-chain/node/pull/4274) - multiple evm calls in single tx +* [4288](https://github.com/zeta-chain/node/pull/4288) - zetaclient config feature flag for multiple evm calls ## v36.0.0 diff --git a/cmd/zetaclientd/initconfig.go b/cmd/zetaclientd/initconfig.go index c8a989bacf..d2838f5515 100644 --- a/cmd/zetaclientd/initconfig.go +++ b/cmd/zetaclientd/initconfig.go @@ -98,6 +98,7 @@ func InitializeConfig(_ *cobra.Command, _ []string) error { configData.KeyringBackend = config.KeyringBackend(initializeConfigOpts.KeyringBackend) configData.RelayerKeyPath = opts.RelayerKeyPath configData.ComplianceConfig = sample.ComplianceConfig() + configData.FeatureFlags = sample.FeatureFlags() // Save config file return config.Save(&configData, globalOpts.ZetacoreHome) diff --git a/cmd/zetae2e/local/local.go b/cmd/zetae2e/local/local.go index 11e9ff8a3c..a695827b59 100644 --- a/cmd/zetae2e/local/local.go +++ b/cmd/zetae2e/local/local.go @@ -307,18 +307,11 @@ func localE2ETest(cmd *cobra.Command, _ []string) { logger.Print("โœ… setup completed in %s", time.Since(startTime)) } - deployerRunner.AddPostUpgradeHandler(previousVersion, func() { - deployerRunner.Logger.Print(fmt.Sprintf("Running post-upgrade setup for %s", previousVersion)) + deployerRunner.AddPostUpgradeHandler(runner.V36Version, func() { + deployerRunner.Logger.Print("Running post-upgrade setup for %s", runner.V36Version) err = OverwriteAccountData(cmd, &conf) require.NoError(deployerRunner, err, "Failed to override account data from the config file") deployerRunner.RunSetup(testLegacy || testAdmin) - if !testSui || deployerRunner.IsRunningTssMigration() { - return - } - - balance, err := deployerRunner.SUIZRC20.BalanceOf(&bind.CallOpts{}, fungibletypes.GasStabilityPoolAddressEVM()) - require.NoError(deployerRunner, err, "Failed to get SUI ZRC20 balance") - require.True(deployerRunner, balance.Cmp(big.NewInt(0)) == 0, "SUI ZRC20 balance should be zero") }) // if a config output is specified, write the config diff --git a/contrib/localnet/scripts/start-zetaclientd.sh b/contrib/localnet/scripts/start-zetaclientd.sh index 1ac2d636af..5c58938d7f 100755 --- a/contrib/localnet/scripts/start-zetaclientd.sh +++ b/contrib/localnet/scripts/start-zetaclientd.sh @@ -14,6 +14,12 @@ set_sepolia_endpoint() { jq '.EVMChainConfigs."11155111".Endpoint = "http://eth2:8545"' /root/.zetacored/config/zetaclient_config.json > tmp.json && mv tmp.json /root/.zetacored/config/zetaclient_config.json } +enable_multiple_calls() { + jq '.FeatureFlags = {"EnableMultipleCalls": true}' \ + /root/.zetacored/config/zetaclient_config.json > tmp.json && \ + mv tmp.json /root/.zetacored/config/zetaclient_config.json +} + # import a relayer private key (e.g. Solana relayer key) import_relayer_key() { local num="$1" @@ -86,6 +92,8 @@ if [[ $HOSTNAME == "zetaclient0" && ! -f ~/.zetacored/config/zetaclient_config.j # import relayer private key for zetaclient0 import_relayer_key 0 + # add feature flags to existing config + enable_multiple_calls # if eth2 is enabled, set the endpoint in the zetaclient_config.json # in this case, the additional evm is represented with the sepolia chain, we set manually the eth2 endpoint to the sepolia chain (11155111 -> http://eth2:8545) @@ -108,6 +116,8 @@ if [[ $HOSTNAME != "zetaclient0" && ! -f ~/.zetacored/config/zetaclient_config.j # import relayer private key for zetaclient{$num} import_relayer_key "${num}" + # add feature flags to existing config + enable_multiple_calls # check if the option is additional-evm # in this case, the additional evm is represented with the sepolia chain, we set manually the eth2 endpoint to the sepolia chain (11155111 -> http://eth2:8545) diff --git a/e2e/contracts/testdappv2/TestDAppV2.bin b/e2e/contracts/testdappv2/TestDAppV2.bin index 9c5b47ef0f..cf08f7d533 100644 --- a/e2e/contracts/testdappv2/TestDAppV2.bin +++ b/e2e/contracts/testdappv2/TestDAppV2.bin @@ -1 +1 @@ -60c060405234801561001057600080fd5b50604051613a2a380380613a2a83398181016040528101906100329190610114565b8115156080811515815250508073ffffffffffffffffffffffffffffffffffffffff1660a08173ffffffffffffffffffffffffffffffffffffffff16815250505050610154565b600080fd5b60008115159050919050565b6100938161007e565b811461009e57600080fd5b50565b6000815190506100b08161008a565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006100e1826100b6565b9050919050565b6100f1816100d6565b81146100fc57600080fd5b50565b60008151905061010e816100e8565b92915050565b6000806040838503121561012b5761012a610079565b5b6000610139858286016100a1565b925050602061014a858286016100ff565b9150509250929050565b60805160a0516138256102056000396000818161057a015281816105f301528181610a5301528181610b0201528181610b8501528181610c8801528181610e0601528181610f5301528181611002015281816111100152818161122d01528181611a1c01528181611b1c0152611c570152600081816105c801528181610a2601528181610ddb01528181610f26015281816114de015281816119bd015281816119e10152611c2c01526138256000f3fe60806040526004361061014f5760003560e01c8063ad23b28b116100b6578063deb3b1e41161006f578063deb3b1e41461044c578063e2842ed714610468578063ebf9b2aa146104a5578063ef800367146104c1578063f592cbfb146104fe578063f936ae851461053b57610156565b8063ad23b28b1461034b578063c7a339a914610388578063c85f8434146103b1578063c9028a36146103dc578063c91f356714610405578063d2b48ff21461043057610156565b8063740e2f6311610108578063740e2f63146102615780638cc1a2e81461029e5780639291fe26146102ba5780639ca016ed146102f7578063a799911f14610313578063a93abe6c1461032f57610156565b8063116191b61461015b57806336e980a01461018657806341a3cd4a146101af5780634297a263146101d85780635bcfd61614610215578063676cc0541461023157610156565b3661015657005b600080fd5b34801561016757600080fd5b50610170610578565b60405161017d919061226a565b60405180910390f35b34801561019257600080fd5b506101ad60048036038101906101a891906123df565b61059c565b005b3480156101bb57600080fd5b506101d660048036038101906101d191906124b4565b6105c6565b005b3480156101e457600080fd5b506101ff60048036038101906101fa919061254a565b6106ed565b60405161020c9190612590565b60405180910390f35b61022f600480360381019061022a91906125fb565b610705565b005b61024b600480360381019061024691906126be565b610847565b604051610258919061279d565b60405180910390f35b34801561026d57600080fd5b50610288600480360381019061028391906123df565b610959565b604051610295919061279d565b60405180910390f35b6102b860048036038101906102b391906127bf565b610a24565b005b3480156102c657600080fd5b506102e160048036038101906102dc91906123df565b610d96565b6040516102ee9190612590565b60405180910390f35b610311600480360381019061030c9190612847565b610dd9565b005b61032d600480360381019061032891906123df565b610efb565b005b610349600480360381019061034491906124b4565b610f24565b005b34801561035757600080fd5b50610372600480360381019061036d9190612847565b61132a565b60405161037f91906128c9565b60405180910390f35b34801561039457600080fd5b506103af60048036038101906103aa9190612929565b61138a565b005b3480156103bd57600080fd5b506103c661143e565b6040516103d391906128c9565b60405180910390f35b3480156103e857600080fd5b5061040360048036038101906103fe91906129b7565b611477565b005b34801561041157600080fd5b5061041a6119bb565b6040516104279190612a1b565b60405180910390f35b61044a60048036038101906104459190612a36565b6119df565b005b610466600480360381019061046191906124b4565b611c2a565b005b34801561047457600080fd5b5061048f600480360381019061048a919061254a565b611d52565b60405161049c9190612a1b565b60405180910390f35b6104bf60048036038101906104ba9190612a76565b611d72565b005b3480156104cd57600080fd5b506104e860048036038101906104e3919061254a565b611eb2565b6040516104f5919061279d565b60405180910390f35b34801561050a57600080fd5b50610525600480360381019061052091906123df565b611f52565b6040516105329190612a1b565b60405180910390f35b34801561054757600080fd5b50610562600480360381019061055d9190612b93565b611fa2565b60405161056f919061226a565b60405180910390f35b7f000000000000000000000000000000000000000000000000000000000000000081565b6105a581611feb565b156105af57600080fd5b6105b881612041565b6105c3816000612095565b50565b7f0000000000000000000000000000000000000000000000000000000000000000156105f157600080fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16631becceb48484846040518060a001604052803373ffffffffffffffffffffffffffffffffffffffff168152602001600015158152602001600073ffffffffffffffffffffffffffffffffffffffff16815260200160405180602001604052806000815250815260200160008152506040518563ffffffff1660e01b81526004016106b69493929190612cf6565b600060405180830381600087803b1580156106d057600080fd5b505af11580156106e4573d6000803e3d6000fd5b50505050505050565b60026020528060005260406000206000915090505481565b61075282828080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050611feb565b1561075c57600080fd5b60008083839050146107b25782828080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050506107ce565b6107cd8660200160208101906107c89190612847565b61132a565b5b90506107d981612041565b6107e38185612095565b61083f818780600001906107f79190612d4c565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050506120d7565b505050505050565b6060600080848490501461089f5783838080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050506108bb565b6108ba8560000160208101906108b59190612847565b61132a565b5b90506108c681612041565b6108d08134612095565b8460000160208101906108e39190612847565b6004826040516108f39190612deb565b908152602001604051809103902060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550604051806020016040528060008152509150509392505050565b606060036000836040516020016109709190612e3e565b604051602081830303815290604052805190602001208152602001908152602001600020805461099f90612e84565b80601f01602080910402602001604051908101604052809291908181526020018280546109cb90612e84565b8015610a185780601f106109ed57610100808354040283529160200191610a18565b820191906000526020600020905b8154815290600101906020018083116109fb57829003601f168201915b50505050509050919050565b7f000000000000000000000000000000000000000000000000000000000000000015610a4f57600080fd5b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663b01072146040518163ffffffff1660e01b81526004016020604051808303816000875af1158015610abe573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ae29190612eca565b90508473ffffffffffffffffffffffffffffffffffffffff1663095ea7b37f0000000000000000000000000000000000000000000000000000000000000000866040518363ffffffff1660e01b8152600401610b3f929190612ef7565b6020604051808303816000875af1158015610b5e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b829190612f4c565b507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663102614b087600287610bcd9190612fd7565b886040518060a001604052803373ffffffffffffffffffffffffffffffffffffffff168152602001600015158152602001600073ffffffffffffffffffffffffffffffffffffffff16815260200160405180602001604052806000815250815260200160008152506040518563ffffffff1660e01b8152600401610c549493929190613008565b600060405180830381600087803b158015610c6e57600080fd5b505af1158015610c82573d6000803e3d6000fd5b505050507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663d09e3b788288600288610cd19190612fd7565b8988886040518060a001604052803373ffffffffffffffffffffffffffffffffffffffff168152602001600015158152602001600073ffffffffffffffffffffffffffffffffffffffff16815260200160405180602001604052806000815250815260200160008152506040518863ffffffff1660e01b8152600401610d5c96959493929190613054565b6000604051808303818588803b158015610d7557600080fd5b505af1158015610d89573d6000803e3d6000fd5b5050505050505050505050565b60006002600083604051602001610dad9190612e3e565b604051602081830303815290604052805190602001208152602001908152602001600020549050919050565b7f000000000000000000000000000000000000000000000000000000000000000015610e0457600080fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663726ac97c34836040518060a001604052803373ffffffffffffffffffffffffffffffffffffffff168152602001600015158152602001600073ffffffffffffffffffffffffffffffffffffffff16815260200160405180602001604052806000815250815260200160008152506040518463ffffffff1660e01b8152600401610ec69291906130b7565b6000604051808303818588803b158015610edf57600080fd5b505af1158015610ef3573d6000803e3d6000fd5b505050505050565b610f0481611feb565b15610f0e57600080fd5b610f1781612041565b610f218134612095565b50565b7f000000000000000000000000000000000000000000000000000000000000000015610f4f57600080fd5b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663b01072146040518163ffffffff1660e01b81526004016020604051808303816000875af1158015610fbe573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fe29190612eca565b90506000600282610ff391906130e7565b34610ffe9190613129565b90507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663282906ed6002836110499190612fd7565b876002856110579190612fd7565b6040518060a001604052803373ffffffffffffffffffffffffffffffffffffffff168152602001600015158152602001600073ffffffffffffffffffffffffffffffffffffffff16815260200160405180602001604052806000815250815260200160008152506040518563ffffffff1660e01b81526004016110dc9392919061315d565b6000604051808303818588803b1580156110f557600080fd5b505af1158015611109573d6000803e3d6000fd5b50505050507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663397e375c836002846111589190612fd7565b611162919061319b565b876002856111709190612fd7565b88886040518060a001604052803373ffffffffffffffffffffffffffffffffffffffff168152602001600015158152602001600073ffffffffffffffffffffffffffffffffffffffff16815260200160405180602001604052806000815250815260200160008152506040518763ffffffff1660e01b81526004016111f99594939291906131cf565b6000604051808303818588803b15801561121257600080fd5b505af1158015611226573d6000803e3d6000fd5b50505050507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16631becceb4838787876040518060a001604052803373ffffffffffffffffffffffffffffffffffffffff168152602001600015158152602001600073ffffffffffffffffffffffffffffffffffffffff16815260200160405180602001604052806000815250815260200160008152506040518663ffffffff1660e01b81526004016112f19493929190612cf6565b6000604051808303818588803b15801561130a57600080fd5b505af115801561131e573d6000803e3d6000fd5b50505050505050505050565b60606040518060400160405280601681526020017f63616c6c65642077697468206e6f206d657373616765000000000000000000008152508260405160200161137492919061326c565b6040516020818303038152906040529050919050565b61139381611feb565b1561139d57600080fd5b8273ffffffffffffffffffffffffffffffffffffffff166323b872dd3330856040518463ffffffff1660e01b81526004016113da93929190613294565b6020604051808303816000875af11580156113f9573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061141d9190612f4c565b61142657600080fd5b61142f81612041565b6114398183612095565b505050565b6040518060400160405280601681526020017f63616c6c65642077697468206e6f206d6573736167650000000000000000000081525081565b6114d281806060019061148a9190612d4c565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050611feb565b156114dc57600080fd5b7f0000000000000000000000000000000000000000000000000000000000000000156118815761150a612122565b61156581806060019061151d9190612d4c565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050612195565b15611880576000808260200160208101906115809190612847565b73ffffffffffffffffffffffffffffffffffffffff1663d9eeebed6040518163ffffffff1660e01b81526004016040805180830381865afa1580156115c9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115ed91906132e0565b915091508260200160208101906116049190612847565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614611671576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116689061336c565b60405180910390fd5b82604001358111156116b8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116af906133fe565b60405180910390fd5b60008184604001356116ca9190613129565b90508360200160208101906116df9190612847565b73ffffffffffffffffffffffffffffffffffffffff1663095ea7b33386604001356040518363ffffffff1660e01b815260040161171d929190612ef7565b6020604051808303816000875af115801561173c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117609190612f4c565b503373ffffffffffffffffffffffffffffffffffffffff16637c0dcb5f8560000160208101906117909190612847565b6040516020016117a0919061226a565b604051602081830303815290604052838760200160208101906117c39190612847565b6040518060a00160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600015158152602001600073ffffffffffffffffffffffffffffffffffffffff16815260200160405180602001604052806000815250815260200160008152506040518563ffffffff1660e01b815260040161184a949392919061341e565b600060405180830381600087803b15801561186457600080fd5b505af1158015611878573d6000803e3d6000fd5b505050505050505b5b6118dc8180606001906118949190612d4c565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050612041565b6119398180606001906118ef9190612d4c565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050506000612095565b80600001602081019061194c9190612847565b600482806060019061195e9190612d4c565b60405161196c929190613496565b908152602001604051809103902060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b7f000000000000000000000000000000000000000000000000000000000000000081565b7f000000000000000000000000000000000000000000000000000000000000000015611a0a57600080fd5b60008134611a189190613129565b90507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663726ac97c600283611a639190612fd7565b856040518060a001604052803373ffffffffffffffffffffffffffffffffffffffff168152602001600015158152602001600073ffffffffffffffffffffffffffffffffffffffff16815260200160405180602001604052806000815250815260200160008152506040518463ffffffff1660e01b8152600401611ae89291906130b7565b6000604051808303818588803b158015611b0157600080fd5b505af1158015611b15573d6000803e3d6000fd5b50505050507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663726ac97c83600284611b649190612fd7565b611b6e919061319b565b856040518060a001604052803373ffffffffffffffffffffffffffffffffffffffff168152602001600015158152602001600073ffffffffffffffffffffffffffffffffffffffff16815260200160405180602001604052806000815250815260200160008152506040518463ffffffff1660e01b8152600401611bf39291906130b7565b6000604051808303818588803b158015611c0c57600080fd5b505af1158015611c20573d6000803e3d6000fd5b5050505050505050565b7f000000000000000000000000000000000000000000000000000000000000000015611c5557600080fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663744b9b8b348585856040518060a001604052803373ffffffffffffffffffffffffffffffffffffffff168152602001600015158152602001600073ffffffffffffffffffffffffffffffffffffffff16815260200160405180602001604052806000815250815260200160008152506040518663ffffffff1660e01b8152600401611d1b9493929190612cf6565b6000604051808303818588803b158015611d3457600080fd5b505af1158015611d48573d6000803e3d6000fd5b5050505050505050565b60016020528060005260406000206000915054906101000a900460ff1681565b611dbf82828080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050611feb565b15611dc957600080fd5b6000808383905014611e1f5782828080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050611e3b565b611e3a846020016020810190611e359190612847565b61132a565b5b9050611e4681612041565b611e508134612095565b611eac81858060000190611e649190612d4c565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050506120d7565b50505050565b60036020528060005260406000206000915090508054611ed190612e84565b80601f0160208091040260200160405190810160405280929190818152602001828054611efd90612e84565b8015611f4a5780601f10611f1f57610100808354040283529160200191611f4a565b820191906000526020600020905b815481529060010190602001808311611f2d57829003601f168201915b505050505081565b60006001600083604051602001611f699190612e3e565b60405160208183030381529060405280519060200120815260200190815260200160002060009054906101000a900460ff169050919050565b6004818051602081018201805184825260208301602085012081835280955050505050506000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000604051602001611ffc906134fb565b60405160208183030381529060405280519060200120826040516020016120239190612e3e565b60405160208183030381529060405280519060200120149050919050565b6001806000836040516020016120579190612e3e565b60405160208183030381529060405280519060200120815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b8060026000846040516020016120ab9190612e3e565b604051602081830303815290604052805190602001208152602001908152602001600020819055505050565b8060036000846040516020016120ed9190612e3e565b604051602081830303815290604052805190602001208152602001908152602001600020908161211d91906136bc565b505050565b60006207a12090506000614e2090506000818361213f9190612fd7565b905060005b818110156121825760008190806001815401808255809150506001900390600052602060002001600090919091909150558080600101915050612144565b5060008061219091906121eb565b505050565b60006040516020016121a6906137da565b60405160208183030381529060405280519060200120826040516020016121cd9190612e3e565b60405160208183030381529060405280519060200120149050919050565b5080546000825590600052602060002090810190612209919061220c565b50565b5b8082111561222557600081600090555060010161220d565b5090565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061225482612229565b9050919050565b61226481612249565b82525050565b600060208201905061227f600083018461225b565b92915050565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6122ec826122a3565b810181811067ffffffffffffffff8211171561230b5761230a6122b4565b5b80604052505050565b600061231e612285565b905061232a82826122e3565b919050565b600067ffffffffffffffff82111561234a576123496122b4565b5b612353826122a3565b9050602081019050919050565b82818337600083830152505050565b600061238261237d8461232f565b612314565b90508281526020810184848401111561239e5761239d61229e565b5b6123a9848285612360565b509392505050565b600082601f8301126123c6576123c5612299565b5b81356123d684826020860161236f565b91505092915050565b6000602082840312156123f5576123f461228f565b5b600082013567ffffffffffffffff81111561241357612412612294565b5b61241f848285016123b1565b91505092915050565b61243181612249565b811461243c57600080fd5b50565b60008135905061244e81612428565b92915050565b600080fd5b600080fd5b60008083601f84011261247457612473612299565b5b8235905067ffffffffffffffff81111561249157612490612454565b5b6020830191508360018202830111156124ad576124ac612459565b5b9250929050565b6000806000604084860312156124cd576124cc61228f565b5b60006124db8682870161243f565b935050602084013567ffffffffffffffff8111156124fc576124fb612294565b5b6125088682870161245e565b92509250509250925092565b6000819050919050565b61252781612514565b811461253257600080fd5b50565b6000813590506125448161251e565b92915050565b6000602082840312156125605761255f61228f565b5b600061256e84828501612535565b91505092915050565b6000819050919050565b61258a81612577565b82525050565b60006020820190506125a56000830184612581565b92915050565b600080fd5b6000606082840312156125c6576125c56125ab565b5b81905092915050565b6125d881612577565b81146125e357600080fd5b50565b6000813590506125f5816125cf565b92915050565b6000806000806000608086880312156126175761261661228f565b5b600086013567ffffffffffffffff81111561263557612634612294565b5b612641888289016125b0565b95505060206126528882890161243f565b9450506040612663888289016125e6565b935050606086013567ffffffffffffffff81111561268457612683612294565b5b6126908882890161245e565b92509250509295509295909350565b6000602082840312156126b5576126b46125ab565b5b81905092915050565b6000806000604084860312156126d7576126d661228f565b5b60006126e58682870161269f565b935050602084013567ffffffffffffffff81111561270657612705612294565b5b6127128682870161245e565b92509250509250925092565b600081519050919050565b600082825260208201905092915050565b60005b8381101561275857808201518184015260208101905061273d565b60008484015250505050565b600061276f8261271e565b6127798185612729565b935061278981856020860161273a565b612792816122a3565b840191505092915050565b600060208201905081810360008301526127b78184612764565b905092915050565b6000806000806000608086880312156127db576127da61228f565b5b60006127e98882890161243f565b95505060206127fa8882890161243f565b945050604061280b888289016125e6565b935050606086013567ffffffffffffffff81111561282c5761282b612294565b5b6128388882890161245e565b92509250509295509295909350565b60006020828403121561285d5761285c61228f565b5b600061286b8482850161243f565b91505092915050565b600081519050919050565b600082825260208201905092915050565b600061289b82612874565b6128a5818561287f565b93506128b581856020860161273a565b6128be816122a3565b840191505092915050565b600060208201905081810360008301526128e38184612890565b905092915050565b60006128f682612249565b9050919050565b612906816128eb565b811461291157600080fd5b50565b600081359050612923816128fd565b92915050565b6000806000606084860312156129425761294161228f565b5b600061295086828701612914565b9350506020612961868287016125e6565b925050604084013567ffffffffffffffff81111561298257612981612294565b5b61298e868287016123b1565b9150509250925092565b6000608082840312156129ae576129ad6125ab565b5b81905092915050565b6000602082840312156129cd576129cc61228f565b5b600082013567ffffffffffffffff8111156129eb576129ea612294565b5b6129f784828501612998565b91505092915050565b60008115159050919050565b612a1581612a00565b82525050565b6000602082019050612a306000830184612a0c565b92915050565b60008060408385031215612a4d57612a4c61228f565b5b6000612a5b8582860161243f565b9250506020612a6c858286016125e6565b9150509250929050565b600080600060408486031215612a8f57612a8e61228f565b5b600084013567ffffffffffffffff811115612aad57612aac612294565b5b612ab9868287016125b0565b935050602084013567ffffffffffffffff811115612ada57612ad9612294565b5b612ae68682870161245e565b92509250509250925092565b600067ffffffffffffffff821115612b0d57612b0c6122b4565b5b612b16826122a3565b9050602081019050919050565b6000612b36612b3184612af2565b612314565b905082815260208101848484011115612b5257612b5161229e565b5b612b5d848285612360565b509392505050565b600082601f830112612b7a57612b79612299565b5b8135612b8a848260208601612b23565b91505092915050565b600060208284031215612ba957612ba861228f565b5b600082013567ffffffffffffffff811115612bc757612bc6612294565b5b612bd384828501612b65565b91505092915050565b6000612be88385612729565b9350612bf5838584612360565b612bfe836122a3565b840190509392505050565b612c1281612249565b82525050565b612c2181612a00565b82525050565b600082825260208201905092915050565b6000612c438261271e565b612c4d8185612c27565b9350612c5d81856020860161273a565b612c66816122a3565b840191505092915050565b612c7a81612577565b82525050565b600060a083016000830151612c986000860182612c09565b506020830151612cab6020860182612c18565b506040830151612cbe6040860182612c09565b5060608301518482036060860152612cd68282612c38565b9150506080830151612ceb6080860182612c71565b508091505092915050565b6000606082019050612d0b600083018761225b565b8181036020830152612d1e818587612bdc565b90508181036040830152612d328184612c80565b905095945050505050565b600080fd5b600080fd5b600080fd5b60008083356001602003843603038112612d6957612d68612d3d565b5b80840192508235915067ffffffffffffffff821115612d8b57612d8a612d42565b5b602083019250600182023603831315612da757612da6612d47565b5b509250929050565b600081905092915050565b6000612dc58261271e565b612dcf8185612daf565b9350612ddf81856020860161273a565b80840191505092915050565b6000612df78284612dba565b915081905092915050565b600081905092915050565b6000612e1882612874565b612e228185612e02565b9350612e3281856020860161273a565b80840191505092915050565b6000612e4a8284612e0d565b915081905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680612e9c57607f821691505b602082108103612eaf57612eae612e55565b5b50919050565b600081519050612ec4816125cf565b92915050565b600060208284031215612ee057612edf61228f565b5b6000612eee84828501612eb5565b91505092915050565b6000604082019050612f0c600083018561225b565b612f196020830184612581565b9392505050565b612f2981612a00565b8114612f3457600080fd5b50565b600081519050612f4681612f20565b92915050565b600060208284031215612f6257612f6161228f565b5b6000612f7084828501612f37565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000612fe282612577565b9150612fed83612577565b925082612ffd57612ffc612f79565b5b828204905092915050565b600060808201905061301d600083018761225b565b61302a6020830186612581565b613037604083018561225b565b81810360608301526130498184612c80565b905095945050505050565b600060a082019050613069600083018961225b565b6130766020830188612581565b613083604083018761225b565b8181036060830152613096818587612bdc565b905081810360808301526130aa8184612c80565b9050979650505050505050565b60006040820190506130cc600083018561225b565b81810360208301526130de8184612c80565b90509392505050565b60006130f282612577565b91506130fd83612577565b925082820261310b81612577565b9150828204841483151761312257613121612fa8565b5b5092915050565b600061313482612577565b915061313f83612577565b925082820390508181111561315757613156612fa8565b5b92915050565b6000606082019050613172600083018661225b565b61317f6020830185612581565b81810360408301526131918184612c80565b9050949350505050565b60006131a682612577565b91506131b183612577565b92508282019050808211156131c9576131c8612fa8565b5b92915050565b60006080820190506131e4600083018861225b565b6131f16020830187612581565b8181036040830152613204818587612bdc565b905081810360608301526132188184612c80565b90509695505050505050565b60008160601b9050919050565b600061323c82613224565b9050919050565b600061324e82613231565b9050919050565b61326661326182612249565b613243565b82525050565b60006132788285612e0d565b91506132848284613255565b6014820191508190509392505050565b60006060820190506132a9600083018661225b565b6132b6602083018561225b565b6132c36040830184612581565b949350505050565b6000815190506132da81612428565b92915050565b600080604083850312156132f7576132f661228f565b5b6000613305858286016132cb565b925050602061331685828601612eb5565b9150509250929050565b7f7a72633230206973206e6f742067617320746f6b656e00000000000000000000600082015250565b600061335660168361287f565b915061336182613320565b602082019050919050565b6000602082019050818103600083015261338581613349565b9050919050565b7f66656520616d6f756e7420697320686967686572207468616e2074686520616d60008201527f6f756e7400000000000000000000000000000000000000000000000000000000602082015250565b60006133e860248361287f565b91506133f38261338c565b604082019050919050565b60006020820190508181036000830152613417816133db565b9050919050565b600060808201905081810360008301526134388187612764565b90506134476020830186612581565b613454604083018561225b565b81810360608301526134668184612c80565b905095945050505050565b600061347d8385612daf565b935061348a838584612360565b82840190509392505050565b60006134a3828486613471565b91508190509392505050565b7f7265766572740000000000000000000000000000000000000000000000000000600082015250565b60006134e5600683612e02565b91506134f0826134af565b600682019050919050565b6000613506826134d8565b9150819050919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026135727fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82613535565b61357c8683613535565b95508019841693508086168417925050509392505050565b6000819050919050565b60006135b96135b46135af84612577565b613594565b612577565b9050919050565b6000819050919050565b6135d38361359e565b6135e76135df826135c0565b848454613542565b825550505050565b600090565b6135fc6135ef565b6136078184846135ca565b505050565b5b8181101561362b576136206000826135f4565b60018101905061360d565b5050565b601f8211156136705761364181613510565b61364a84613525565b81016020851015613659578190505b61366d61366585613525565b83018261360c565b50505b505050565b600082821c905092915050565b600061369360001984600802613675565b1980831691505092915050565b60006136ac8383613682565b9150826002028217905092915050565b6136c58261271e565b67ffffffffffffffff8111156136de576136dd6122b4565b5b6136e88254612e84565b6136f382828561362f565b600060209050601f8311600181146137265760008415613714578287015190505b61371e85826136a0565b865550613786565b601f19841661373486613510565b60005b8281101561375c57848901518255600182019150602085019450602081019050613737565b868310156137795784890151613775601f891682613682565b8355505b6001600288020188555050505b505050505050565b7f7769746864726177000000000000000000000000000000000000000000000000600082015250565b60006137c4600883612e02565b91506137cf8261378e565b600882019050919050565b60006137e5826137b7565b915081905091905056fea264697066735822122002ae685f66be5174e96940fdc7c5741116b962da5e3b6e4d59d5f429edc8ecf464736f6c634300081a0033 +60c060405234801561001057600080fd5b50604051613f87380380613f8783398181016040528101906100329190610114565b8115156080811515815250508073ffffffffffffffffffffffffffffffffffffffff1660a08173ffffffffffffffffffffffffffffffffffffffff16815250505050610154565b600080fd5b60008115159050919050565b6100938161007e565b811461009e57600080fd5b50565b6000815190506100b08161008a565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006100e1826100b6565b9050919050565b6100f1816100d6565b81146100fc57600080fd5b50565b60008151905061010e816100e8565b92915050565b6000806040838503121561012b5761012a610079565b5b6000610139858286016100a1565b925050602061014a858286016100ff565b9150509250929050565b60805160a051613d5f6102286000396000818161057a015281816105f301528181610a5301528181610b0201528181610b8501528181610c8801528181610d8c01528181610e94015281816110120152818161115f0152818161120e0152818161131c01528181611435015281816115520152818161166f0152818161176701528181611f560152818161205601526121910152600081816105c801528181610a2601528181610fe70152818161113201528181611a1801528181611ef701528181611f1b01526121660152613d5f6000f3fe60806040526004361061014f5760003560e01c8063ad23b28b116100b6578063deb3b1e41161006f578063deb3b1e41461044c578063e2842ed714610468578063ebf9b2aa146104a5578063ef800367146104c1578063f592cbfb146104fe578063f936ae851461053b57610156565b8063ad23b28b1461034b578063c7a339a914610388578063c85f8434146103b1578063c9028a36146103dc578063c91f356714610405578063d2b48ff21461043057610156565b8063740e2f6311610108578063740e2f63146102615780638cc1a2e81461029e5780639291fe26146102ba5780639ca016ed146102f7578063a799911f14610313578063a93abe6c1461032f57610156565b8063116191b61461015b57806336e980a01461018657806341a3cd4a146101af5780634297a263146101d85780635bcfd61614610215578063676cc0541461023157610156565b3661015657005b600080fd5b34801561016757600080fd5b50610170610578565b60405161017d91906127a4565b60405180910390f35b34801561019257600080fd5b506101ad60048036038101906101a89190612919565b61059c565b005b3480156101bb57600080fd5b506101d660048036038101906101d191906129ee565b6105c6565b005b3480156101e457600080fd5b506101ff60048036038101906101fa9190612a84565b6106ed565b60405161020c9190612aca565b60405180910390f35b61022f600480360381019061022a9190612b35565b610705565b005b61024b60048036038101906102469190612bf8565b610847565b6040516102589190612cd7565b60405180910390f35b34801561026d57600080fd5b5061028860048036038101906102839190612919565b610959565b6040516102959190612cd7565b60405180910390f35b6102b860048036038101906102b39190612cf9565b610a24565b005b3480156102c657600080fd5b506102e160048036038101906102dc9190612919565b610fa2565b6040516102ee9190612aca565b60405180910390f35b610311600480360381019061030c9190612d81565b610fe5565b005b61032d60048036038101906103289190612919565b611107565b005b610349600480360381019061034491906129ee565b611130565b005b34801561035757600080fd5b50610372600480360381019061036d9190612d81565b611864565b60405161037f9190612e03565b60405180910390f35b34801561039457600080fd5b506103af60048036038101906103aa9190612e63565b6118c4565b005b3480156103bd57600080fd5b506103c6611978565b6040516103d39190612e03565b60405180910390f35b3480156103e857600080fd5b5061040360048036038101906103fe9190612ef1565b6119b1565b005b34801561041157600080fd5b5061041a611ef5565b6040516104279190612f55565b60405180910390f35b61044a60048036038101906104459190612f70565b611f19565b005b610466600480360381019061046191906129ee565b612164565b005b34801561047457600080fd5b5061048f600480360381019061048a9190612a84565b61228c565b60405161049c9190612f55565b60405180910390f35b6104bf60048036038101906104ba9190612fb0565b6122ac565b005b3480156104cd57600080fd5b506104e860048036038101906104e39190612a84565b6123ec565b6040516104f59190612cd7565b60405180910390f35b34801561050a57600080fd5b5061052560048036038101906105209190612919565b61248c565b6040516105329190612f55565b60405180910390f35b34801561054757600080fd5b50610562600480360381019061055d91906130cd565b6124dc565b60405161056f91906127a4565b60405180910390f35b7f000000000000000000000000000000000000000000000000000000000000000081565b6105a581612525565b156105af57600080fd5b6105b88161257b565b6105c38160006125cf565b50565b7f0000000000000000000000000000000000000000000000000000000000000000156105f157600080fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16631becceb48484846040518060a001604052803373ffffffffffffffffffffffffffffffffffffffff168152602001600015158152602001600073ffffffffffffffffffffffffffffffffffffffff16815260200160405180602001604052806000815250815260200160008152506040518563ffffffff1660e01b81526004016106b69493929190613230565b600060405180830381600087803b1580156106d057600080fd5b505af11580156106e4573d6000803e3d6000fd5b50505050505050565b60026020528060005260406000206000915090505481565b61075282828080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050612525565b1561075c57600080fd5b60008083839050146107b25782828080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050506107ce565b6107cd8660200160208101906107c89190612d81565b611864565b5b90506107d98161257b565b6107e381856125cf565b61083f818780600001906107f79190613286565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050612611565b505050505050565b6060600080848490501461089f5783838080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050506108bb565b6108ba8560000160208101906108b59190612d81565b611864565b5b90506108c68161257b565b6108d081346125cf565b8460000160208101906108e39190612d81565b6004826040516108f39190613325565b908152602001604051809103902060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550604051806020016040528060008152509150509392505050565b606060036000836040516020016109709190613378565b604051602081830303815290604052805190602001208152602001908152602001600020805461099f906133be565b80601f01602080910402602001604051908101604052809291908181526020018280546109cb906133be565b8015610a185780601f106109ed57610100808354040283529160200191610a18565b820191906000526020600020905b8154815290600101906020018083116109fb57829003601f168201915b50505050509050919050565b7f000000000000000000000000000000000000000000000000000000000000000015610a4f57600080fd5b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663b01072146040518163ffffffff1660e01b81526004016020604051808303816000875af1158015610abe573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ae29190613404565b90508473ffffffffffffffffffffffffffffffffffffffff1663095ea7b37f0000000000000000000000000000000000000000000000000000000000000000866040518363ffffffff1660e01b8152600401610b3f929190613431565b6020604051808303816000875af1158015610b5e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b829190613486565b507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663102614b087600487610bcd9190613511565b886040518060a001604052803373ffffffffffffffffffffffffffffffffffffffff168152602001600015158152602001600073ffffffffffffffffffffffffffffffffffffffff16815260200160405180602001604052806000815250815260200160008152506040518563ffffffff1660e01b8152600401610c549493929190613542565b600060405180830381600087803b158015610c6e57600080fd5b505af1158015610c82573d6000803e3d6000fd5b505050507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663102614b08288600488610cd19190613511565b896040518060a001604052803373ffffffffffffffffffffffffffffffffffffffff168152602001600015158152602001600073ffffffffffffffffffffffffffffffffffffffff16815260200160405180602001604052806000815250815260200160008152506040518663ffffffff1660e01b8152600401610d589493929190613542565b6000604051808303818588803b158015610d7157600080fd5b505af1158015610d85573d6000803e3d6000fd5b50505050507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663d09e3b788288600488610dd59190613511565b8988886040518060a001604052803373ffffffffffffffffffffffffffffffffffffffff168152602001600015158152602001600073ffffffffffffffffffffffffffffffffffffffff16815260200160405180602001604052806000815250815260200160008152506040518863ffffffff1660e01b8152600401610e609695949392919061358e565b6000604051808303818588803b158015610e7957600080fd5b505af1158015610e8d573d6000803e3d6000fd5b50505050507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663d09e3b788288600488610edd9190613511565b8988886040518060a001604052803373ffffffffffffffffffffffffffffffffffffffff168152602001600015158152602001600073ffffffffffffffffffffffffffffffffffffffff16815260200160405180602001604052806000815250815260200160008152506040518863ffffffff1660e01b8152600401610f689695949392919061358e565b6000604051808303818588803b158015610f8157600080fd5b505af1158015610f95573d6000803e3d6000fd5b5050505050505050505050565b60006002600083604051602001610fb99190613378565b604051602081830303815290604052805190602001208152602001908152602001600020549050919050565b7f00000000000000000000000000000000000000000000000000000000000000001561101057600080fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663726ac97c34836040518060a001604052803373ffffffffffffffffffffffffffffffffffffffff168152602001600015158152602001600073ffffffffffffffffffffffffffffffffffffffff16815260200160405180602001604052806000815250815260200160008152506040518463ffffffff1660e01b81526004016110d29291906135f1565b6000604051808303818588803b1580156110eb57600080fd5b505af11580156110ff573d6000803e3d6000fd5b505050505050565b61111081612525565b1561111a57600080fd5b6111238161257b565b61112d81346125cf565b50565b7f00000000000000000000000000000000000000000000000000000000000000001561115b57600080fd5b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663b01072146040518163ffffffff1660e01b81526004016020604051808303816000875af11580156111ca573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111ee9190613404565b905060006005826111ff9190613621565b3461120a9190613663565b90507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663282906ed6004836112559190613511565b876004856112639190613511565b6040518060a001604052803373ffffffffffffffffffffffffffffffffffffffff168152602001600015158152602001600073ffffffffffffffffffffffffffffffffffffffff16815260200160405180602001604052806000815250815260200160008152506040518563ffffffff1660e01b81526004016112e893929190613697565b6000604051808303818588803b15801561130157600080fd5b505af1158015611315573d6000803e3d6000fd5b50505050507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663282906ed836004846113649190613511565b61136e91906136d5565b8760048561137c9190613511565b6040518060a001604052803373ffffffffffffffffffffffffffffffffffffffff168152602001600015158152602001600073ffffffffffffffffffffffffffffffffffffffff16815260200160405180602001604052806000815250815260200160008152506040518563ffffffff1660e01b815260040161140193929190613697565b6000604051808303818588803b15801561141a57600080fd5b505af115801561142e573d6000803e3d6000fd5b50505050507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663397e375c8360048461147d9190613511565b61148791906136d5565b876004856114959190613511565b88886040518060a001604052803373ffffffffffffffffffffffffffffffffffffffff168152602001600015158152602001600073ffffffffffffffffffffffffffffffffffffffff16815260200160405180602001604052806000815250815260200160008152506040518763ffffffff1660e01b815260040161151e959493929190613709565b6000604051808303818588803b15801561153757600080fd5b505af115801561154b573d6000803e3d6000fd5b50505050507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663397e375c8360048461159a9190613511565b6115a491906136d5565b876004856115b29190613511565b88886040518060a001604052803373ffffffffffffffffffffffffffffffffffffffff168152602001600015158152602001600073ffffffffffffffffffffffffffffffffffffffff16815260200160405180602001604052806000815250815260200160008152506040518763ffffffff1660e01b815260040161163b959493929190613709565b6000604051808303818588803b15801561165457600080fd5b505af1158015611668573d6000803e3d6000fd5b50505050507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16631becceb4838787876040518060a001604052803373ffffffffffffffffffffffffffffffffffffffff168152602001600015158152602001600073ffffffffffffffffffffffffffffffffffffffff16815260200160405180602001604052806000815250815260200160008152506040518663ffffffff1660e01b81526004016117339493929190613230565b6000604051808303818588803b15801561174c57600080fd5b505af1158015611760573d6000803e3d6000fd5b50505050507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16631becceb4838787876040518060a001604052803373ffffffffffffffffffffffffffffffffffffffff168152602001600015158152602001600073ffffffffffffffffffffffffffffffffffffffff16815260200160405180602001604052806000815250815260200160008152506040518663ffffffff1660e01b815260040161182b9493929190613230565b6000604051808303818588803b15801561184457600080fd5b505af1158015611858573d6000803e3d6000fd5b50505050505050505050565b60606040518060400160405280601681526020017f63616c6c65642077697468206e6f206d65737361676500000000000000000000815250826040516020016118ae9291906137a6565b6040516020818303038152906040529050919050565b6118cd81612525565b156118d757600080fd5b8273ffffffffffffffffffffffffffffffffffffffff166323b872dd3330856040518463ffffffff1660e01b8152600401611914939291906137ce565b6020604051808303816000875af1158015611933573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119579190613486565b61196057600080fd5b6119698161257b565b61197381836125cf565b505050565b6040518060400160405280601681526020017f63616c6c65642077697468206e6f206d6573736167650000000000000000000081525081565b611a0c8180606001906119c49190613286565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050612525565b15611a1657600080fd5b7f000000000000000000000000000000000000000000000000000000000000000015611dbb57611a4461265c565b611a9f818060600190611a579190613286565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050506126cf565b15611dba57600080826020016020810190611aba9190612d81565b73ffffffffffffffffffffffffffffffffffffffff1663d9eeebed6040518163ffffffff1660e01b81526004016040805180830381865afa158015611b03573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b27919061381a565b91509150826020016020810190611b3e9190612d81565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614611bab576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ba2906138a6565b60405180910390fd5b8260400135811115611bf2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611be990613938565b60405180910390fd5b6000818460400135611c049190613663565b9050836020016020810190611c199190612d81565b73ffffffffffffffffffffffffffffffffffffffff1663095ea7b33386604001356040518363ffffffff1660e01b8152600401611c57929190613431565b6020604051808303816000875af1158015611c76573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c9a9190613486565b503373ffffffffffffffffffffffffffffffffffffffff16637c0dcb5f856000016020810190611cca9190612d81565b604051602001611cda91906127a4565b60405160208183030381529060405283876020016020810190611cfd9190612d81565b6040518060a00160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600015158152602001600073ffffffffffffffffffffffffffffffffffffffff16815260200160405180602001604052806000815250815260200160008152506040518563ffffffff1660e01b8152600401611d849493929190613958565b600060405180830381600087803b158015611d9e57600080fd5b505af1158015611db2573d6000803e3d6000fd5b505050505050505b5b611e16818060600190611dce9190613286565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505061257b565b611e73818060600190611e299190613286565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505060006125cf565b806000016020810190611e869190612d81565b6004828060600190611e989190613286565b604051611ea69291906139d0565b908152602001604051809103902060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b7f000000000000000000000000000000000000000000000000000000000000000081565b7f000000000000000000000000000000000000000000000000000000000000000015611f4457600080fd5b60008134611f529190613663565b90507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663726ac97c600283611f9d9190613511565b856040518060a001604052803373ffffffffffffffffffffffffffffffffffffffff168152602001600015158152602001600073ffffffffffffffffffffffffffffffffffffffff16815260200160405180602001604052806000815250815260200160008152506040518463ffffffff1660e01b81526004016120229291906135f1565b6000604051808303818588803b15801561203b57600080fd5b505af115801561204f573d6000803e3d6000fd5b50505050507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663726ac97c8360028461209e9190613511565b6120a891906136d5565b856040518060a001604052803373ffffffffffffffffffffffffffffffffffffffff168152602001600015158152602001600073ffffffffffffffffffffffffffffffffffffffff16815260200160405180602001604052806000815250815260200160008152506040518463ffffffff1660e01b815260040161212d9291906135f1565b6000604051808303818588803b15801561214657600080fd5b505af115801561215a573d6000803e3d6000fd5b5050505050505050565b7f00000000000000000000000000000000000000000000000000000000000000001561218f57600080fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663744b9b8b348585856040518060a001604052803373ffffffffffffffffffffffffffffffffffffffff168152602001600015158152602001600073ffffffffffffffffffffffffffffffffffffffff16815260200160405180602001604052806000815250815260200160008152506040518663ffffffff1660e01b81526004016122559493929190613230565b6000604051808303818588803b15801561226e57600080fd5b505af1158015612282573d6000803e3d6000fd5b5050505050505050565b60016020528060005260406000206000915054906101000a900460ff1681565b6122f982828080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050612525565b1561230357600080fd5b60008083839050146123595782828080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050612375565b61237484602001602081019061236f9190612d81565b611864565b5b90506123808161257b565b61238a81346125cf565b6123e68185806000019061239e9190613286565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050612611565b50505050565b6003602052806000526040600020600091509050805461240b906133be565b80601f0160208091040260200160405190810160405280929190818152602001828054612437906133be565b80156124845780601f1061245957610100808354040283529160200191612484565b820191906000526020600020905b81548152906001019060200180831161246757829003601f168201915b505050505081565b600060016000836040516020016124a39190613378565b60405160208183030381529060405280519060200120815260200190815260200160002060009054906101000a900460ff169050919050565b6004818051602081018201805184825260208301602085012081835280955050505050506000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600060405160200161253690613a35565b604051602081830303815290604052805190602001208260405160200161255d9190613378565b60405160208183030381529060405280519060200120149050919050565b6001806000836040516020016125919190613378565b60405160208183030381529060405280519060200120815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b8060026000846040516020016125e59190613378565b604051602081830303815290604052805190602001208152602001908152602001600020819055505050565b8060036000846040516020016126279190613378565b60405160208183030381529060405280519060200120815260200190815260200160002090816126579190613bf6565b505050565b60006207a12090506000614e209050600081836126799190613511565b905060005b818110156126bc576000819080600181540180825580915050600190039060005260206000200160009091909190915055808060010191505061267e565b506000806126ca9190612725565b505050565b60006040516020016126e090613d14565b60405160208183030381529060405280519060200120826040516020016127079190613378565b60405160208183030381529060405280519060200120149050919050565b50805460008255906000526020600020908101906127439190612746565b50565b5b8082111561275f576000816000905550600101612747565b5090565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061278e82612763565b9050919050565b61279e81612783565b82525050565b60006020820190506127b96000830184612795565b92915050565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b612826826127dd565b810181811067ffffffffffffffff82111715612845576128446127ee565b5b80604052505050565b60006128586127bf565b9050612864828261281d565b919050565b600067ffffffffffffffff821115612884576128836127ee565b5b61288d826127dd565b9050602081019050919050565b82818337600083830152505050565b60006128bc6128b784612869565b61284e565b9050828152602081018484840111156128d8576128d76127d8565b5b6128e384828561289a565b509392505050565b600082601f830112612900576128ff6127d3565b5b81356129108482602086016128a9565b91505092915050565b60006020828403121561292f5761292e6127c9565b5b600082013567ffffffffffffffff81111561294d5761294c6127ce565b5b612959848285016128eb565b91505092915050565b61296b81612783565b811461297657600080fd5b50565b60008135905061298881612962565b92915050565b600080fd5b600080fd5b60008083601f8401126129ae576129ad6127d3565b5b8235905067ffffffffffffffff8111156129cb576129ca61298e565b5b6020830191508360018202830111156129e7576129e6612993565b5b9250929050565b600080600060408486031215612a0757612a066127c9565b5b6000612a1586828701612979565b935050602084013567ffffffffffffffff811115612a3657612a356127ce565b5b612a4286828701612998565b92509250509250925092565b6000819050919050565b612a6181612a4e565b8114612a6c57600080fd5b50565b600081359050612a7e81612a58565b92915050565b600060208284031215612a9a57612a996127c9565b5b6000612aa884828501612a6f565b91505092915050565b6000819050919050565b612ac481612ab1565b82525050565b6000602082019050612adf6000830184612abb565b92915050565b600080fd5b600060608284031215612b0057612aff612ae5565b5b81905092915050565b612b1281612ab1565b8114612b1d57600080fd5b50565b600081359050612b2f81612b09565b92915050565b600080600080600060808688031215612b5157612b506127c9565b5b600086013567ffffffffffffffff811115612b6f57612b6e6127ce565b5b612b7b88828901612aea565b9550506020612b8c88828901612979565b9450506040612b9d88828901612b20565b935050606086013567ffffffffffffffff811115612bbe57612bbd6127ce565b5b612bca88828901612998565b92509250509295509295909350565b600060208284031215612bef57612bee612ae5565b5b81905092915050565b600080600060408486031215612c1157612c106127c9565b5b6000612c1f86828701612bd9565b935050602084013567ffffffffffffffff811115612c4057612c3f6127ce565b5b612c4c86828701612998565b92509250509250925092565b600081519050919050565b600082825260208201905092915050565b60005b83811015612c92578082015181840152602081019050612c77565b60008484015250505050565b6000612ca982612c58565b612cb38185612c63565b9350612cc3818560208601612c74565b612ccc816127dd565b840191505092915050565b60006020820190508181036000830152612cf18184612c9e565b905092915050565b600080600080600060808688031215612d1557612d146127c9565b5b6000612d2388828901612979565b9550506020612d3488828901612979565b9450506040612d4588828901612b20565b935050606086013567ffffffffffffffff811115612d6657612d656127ce565b5b612d7288828901612998565b92509250509295509295909350565b600060208284031215612d9757612d966127c9565b5b6000612da584828501612979565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000612dd582612dae565b612ddf8185612db9565b9350612def818560208601612c74565b612df8816127dd565b840191505092915050565b60006020820190508181036000830152612e1d8184612dca565b905092915050565b6000612e3082612783565b9050919050565b612e4081612e25565b8114612e4b57600080fd5b50565b600081359050612e5d81612e37565b92915050565b600080600060608486031215612e7c57612e7b6127c9565b5b6000612e8a86828701612e4e565b9350506020612e9b86828701612b20565b925050604084013567ffffffffffffffff811115612ebc57612ebb6127ce565b5b612ec8868287016128eb565b9150509250925092565b600060808284031215612ee857612ee7612ae5565b5b81905092915050565b600060208284031215612f0757612f066127c9565b5b600082013567ffffffffffffffff811115612f2557612f246127ce565b5b612f3184828501612ed2565b91505092915050565b60008115159050919050565b612f4f81612f3a565b82525050565b6000602082019050612f6a6000830184612f46565b92915050565b60008060408385031215612f8757612f866127c9565b5b6000612f9585828601612979565b9250506020612fa685828601612b20565b9150509250929050565b600080600060408486031215612fc957612fc86127c9565b5b600084013567ffffffffffffffff811115612fe757612fe66127ce565b5b612ff386828701612aea565b935050602084013567ffffffffffffffff811115613014576130136127ce565b5b61302086828701612998565b92509250509250925092565b600067ffffffffffffffff821115613047576130466127ee565b5b613050826127dd565b9050602081019050919050565b600061307061306b8461302c565b61284e565b90508281526020810184848401111561308c5761308b6127d8565b5b61309784828561289a565b509392505050565b600082601f8301126130b4576130b36127d3565b5b81356130c484826020860161305d565b91505092915050565b6000602082840312156130e3576130e26127c9565b5b600082013567ffffffffffffffff811115613101576131006127ce565b5b61310d8482850161309f565b91505092915050565b60006131228385612c63565b935061312f83858461289a565b613138836127dd565b840190509392505050565b61314c81612783565b82525050565b61315b81612f3a565b82525050565b600082825260208201905092915050565b600061317d82612c58565b6131878185613161565b9350613197818560208601612c74565b6131a0816127dd565b840191505092915050565b6131b481612ab1565b82525050565b600060a0830160008301516131d26000860182613143565b5060208301516131e56020860182613152565b5060408301516131f86040860182613143565b50606083015184820360608601526132108282613172565b915050608083015161322560808601826131ab565b508091505092915050565b60006060820190506132456000830187612795565b8181036020830152613258818587613116565b9050818103604083015261326c81846131ba565b905095945050505050565b600080fd5b600080fd5b600080fd5b600080833560016020038436030381126132a3576132a2613277565b5b80840192508235915067ffffffffffffffff8211156132c5576132c461327c565b5b6020830192506001820236038313156132e1576132e0613281565b5b509250929050565b600081905092915050565b60006132ff82612c58565b61330981856132e9565b9350613319818560208601612c74565b80840191505092915050565b600061333182846132f4565b915081905092915050565b600081905092915050565b600061335282612dae565b61335c818561333c565b935061336c818560208601612c74565b80840191505092915050565b60006133848284613347565b915081905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806133d657607f821691505b6020821081036133e9576133e861338f565b5b50919050565b6000815190506133fe81612b09565b92915050565b60006020828403121561341a576134196127c9565b5b6000613428848285016133ef565b91505092915050565b60006040820190506134466000830185612795565b6134536020830184612abb565b9392505050565b61346381612f3a565b811461346e57600080fd5b50565b6000815190506134808161345a565b92915050565b60006020828403121561349c5761349b6127c9565b5b60006134aa84828501613471565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061351c82612ab1565b915061352783612ab1565b925082613537576135366134b3565b5b828204905092915050565b60006080820190506135576000830187612795565b6135646020830186612abb565b6135716040830185612795565b818103606083015261358381846131ba565b905095945050505050565b600060a0820190506135a36000830189612795565b6135b06020830188612abb565b6135bd6040830187612795565b81810360608301526135d0818587613116565b905081810360808301526135e481846131ba565b9050979650505050505050565b60006040820190506136066000830185612795565b818103602083015261361881846131ba565b90509392505050565b600061362c82612ab1565b915061363783612ab1565b925082820261364581612ab1565b9150828204841483151761365c5761365b6134e2565b5b5092915050565b600061366e82612ab1565b915061367983612ab1565b9250828203905081811115613691576136906134e2565b5b92915050565b60006060820190506136ac6000830186612795565b6136b96020830185612abb565b81810360408301526136cb81846131ba565b9050949350505050565b60006136e082612ab1565b91506136eb83612ab1565b9250828201905080821115613703576137026134e2565b5b92915050565b600060808201905061371e6000830188612795565b61372b6020830187612abb565b818103604083015261373e818587613116565b9050818103606083015261375281846131ba565b90509695505050505050565b60008160601b9050919050565b60006137768261375e565b9050919050565b60006137888261376b565b9050919050565b6137a061379b82612783565b61377d565b82525050565b60006137b28285613347565b91506137be828461378f565b6014820191508190509392505050565b60006060820190506137e36000830186612795565b6137f06020830185612795565b6137fd6040830184612abb565b949350505050565b60008151905061381481612962565b92915050565b60008060408385031215613831576138306127c9565b5b600061383f85828601613805565b9250506020613850858286016133ef565b9150509250929050565b7f7a72633230206973206e6f742067617320746f6b656e00000000000000000000600082015250565b6000613890601683612db9565b915061389b8261385a565b602082019050919050565b600060208201905081810360008301526138bf81613883565b9050919050565b7f66656520616d6f756e7420697320686967686572207468616e2074686520616d60008201527f6f756e7400000000000000000000000000000000000000000000000000000000602082015250565b6000613922602483612db9565b915061392d826138c6565b604082019050919050565b6000602082019050818103600083015261395181613915565b9050919050565b600060808201905081810360008301526139728187612c9e565b90506139816020830186612abb565b61398e6040830185612795565b81810360608301526139a081846131ba565b905095945050505050565b60006139b783856132e9565b93506139c483858461289a565b82840190509392505050565b60006139dd8284866139ab565b91508190509392505050565b7f7265766572740000000000000000000000000000000000000000000000000000600082015250565b6000613a1f60068361333c565b9150613a2a826139e9565b600682019050919050565b6000613a4082613a12565b9150819050919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302613aac7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82613a6f565b613ab68683613a6f565b95508019841693508086168417925050509392505050565b6000819050919050565b6000613af3613aee613ae984612ab1565b613ace565b612ab1565b9050919050565b6000819050919050565b613b0d83613ad8565b613b21613b1982613afa565b848454613a7c565b825550505050565b600090565b613b36613b29565b613b41818484613b04565b505050565b5b81811015613b6557613b5a600082613b2e565b600181019050613b47565b5050565b601f821115613baa57613b7b81613a4a565b613b8484613a5f565b81016020851015613b93578190505b613ba7613b9f85613a5f565b830182613b46565b50505b505050565b600082821c905092915050565b6000613bcd60001984600802613baf565b1980831691505092915050565b6000613be68383613bbc565b9150826002028217905092915050565b613bff82612c58565b67ffffffffffffffff811115613c1857613c176127ee565b5b613c2282546133be565b613c2d828285613b69565b600060209050601f831160018114613c605760008415613c4e578287015190505b613c588582613bda565b865550613cc0565b601f198416613c6e86613a4a565b60005b82811015613c9657848901518255600182019150602085019450602081019050613c71565b86831015613cb35784890151613caf601f891682613bbc565b8355505b6001600288020188555050505b505050505050565b7f7769746864726177000000000000000000000000000000000000000000000000600082015250565b6000613cfe60088361333c565b9150613d0982613cc8565b600882019050919050565b6000613d1f82613cf1565b915081905091905056fea264697066735822122029b5fc4000ab75b22ee672153db2ff3d63b2c1bdd895e864bec6a5fcfa58327864736f6c634300081a0033 diff --git a/e2e/contracts/testdappv2/TestDAppV2.go b/e2e/contracts/testdappv2/TestDAppV2.go index 81779a3cfd..f7c5a9296b 100644 --- a/e2e/contracts/testdappv2/TestDAppV2.go +++ b/e2e/contracts/testdappv2/TestDAppV2.go @@ -52,7 +52,7 @@ type TestDAppV2zContext struct { // TestDAppV2MetaData contains all meta data concerning the TestDAppV2 contract. var TestDAppV2MetaData = &bind.MetaData{ ABI: "[{\"inputs\":[{\"internalType\":\"bool\",\"name\":\"isZetaChain_\",\"type\":\"bool\"},{\"internalType\":\"address\",\"name\":\"gateway_\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"NO_MESSAGE_CALL\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"name\":\"amountWithMessage\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"name\":\"calledWithMessage\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contractIERC20\",\"name\":\"erc20\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"string\",\"name\":\"message\",\"type\":\"string\"}],\"name\":\"erc20Call\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"message\",\"type\":\"string\"}],\"name\":\"gasCall\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"gateway\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"dst\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"payload\",\"type\":\"bytes\"}],\"name\":\"gatewayCall\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"dst\",\"type\":\"address\"}],\"name\":\"gatewayDeposit\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"dst\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"payload\",\"type\":\"bytes\"}],\"name\":\"gatewayDepositAndCall\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"dst\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"payload\",\"type\":\"bytes\"}],\"name\":\"gatewayMultipleDeposits\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"dst\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"fee\",\"type\":\"uint256\"}],\"name\":\"gatewayMultipleDepositsLegacy\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"dst\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"asset\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"assetAmount\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"payload\",\"type\":\"bytes\"}],\"name\":\"gatewayMultipleERC20Deposits\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"message\",\"type\":\"string\"}],\"name\":\"getAmountWithMessage\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"message\",\"type\":\"string\"}],\"name\":\"getCalledWithMessage\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"getNoMessageIndex\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"message\",\"type\":\"string\"}],\"name\":\"getSenderWithMessage\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"isZetaChain\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"},{\"internalType\":\"address\",\"name\":\"senderEVM\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"chainID\",\"type\":\"uint256\"}],\"internalType\":\"structTestDAppV2.zContext\",\"name\":\"context\",\"type\":\"tuple\"},{\"internalType\":\"address\",\"name\":\"_zrc20\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"message\",\"type\":\"bytes\"}],\"name\":\"onCall\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"internalType\":\"structTestDAppV2.MessageContext\",\"name\":\"messageContext\",\"type\":\"tuple\"},{\"internalType\":\"bytes\",\"name\":\"message\",\"type\":\"bytes\"}],\"name\":\"onCall\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"},{\"internalType\":\"address\",\"name\":\"senderEVM\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"chainID\",\"type\":\"uint256\"}],\"internalType\":\"structTestDAppV2.zContext\",\"name\":\"context\",\"type\":\"tuple\"},{\"internalType\":\"bytes\",\"name\":\"message\",\"type\":\"bytes\"}],\"name\":\"onCall\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"asset\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"revertMessage\",\"type\":\"bytes\"}],\"internalType\":\"structTestDAppV2.RevertContext\",\"name\":\"revertContext\",\"type\":\"tuple\"}],\"name\":\"onRevert\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"name\":\"senderWithMessage\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"name\":\"senderWithMessageZEVM\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"message\",\"type\":\"string\"}],\"name\":\"simpleCall\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"stateMutability\":\"payable\",\"type\":\"receive\"}]", - Bin: "0x60c060405234801561001057600080fd5b50604051613a2a380380613a2a83398181016040528101906100329190610114565b8115156080811515815250508073ffffffffffffffffffffffffffffffffffffffff1660a08173ffffffffffffffffffffffffffffffffffffffff16815250505050610154565b600080fd5b60008115159050919050565b6100938161007e565b811461009e57600080fd5b50565b6000815190506100b08161008a565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006100e1826100b6565b9050919050565b6100f1816100d6565b81146100fc57600080fd5b50565b60008151905061010e816100e8565b92915050565b6000806040838503121561012b5761012a610079565b5b6000610139858286016100a1565b925050602061014a858286016100ff565b9150509250929050565b60805160a0516138256102056000396000818161057a015281816105f301528181610a5301528181610b0201528181610b8501528181610c8801528181610e0601528181610f5301528181611002015281816111100152818161122d01528181611a1c01528181611b1c0152611c570152600081816105c801528181610a2601528181610ddb01528181610f26015281816114de015281816119bd015281816119e10152611c2c01526138256000f3fe60806040526004361061014f5760003560e01c8063ad23b28b116100b6578063deb3b1e41161006f578063deb3b1e41461044c578063e2842ed714610468578063ebf9b2aa146104a5578063ef800367146104c1578063f592cbfb146104fe578063f936ae851461053b57610156565b8063ad23b28b1461034b578063c7a339a914610388578063c85f8434146103b1578063c9028a36146103dc578063c91f356714610405578063d2b48ff21461043057610156565b8063740e2f6311610108578063740e2f63146102615780638cc1a2e81461029e5780639291fe26146102ba5780639ca016ed146102f7578063a799911f14610313578063a93abe6c1461032f57610156565b8063116191b61461015b57806336e980a01461018657806341a3cd4a146101af5780634297a263146101d85780635bcfd61614610215578063676cc0541461023157610156565b3661015657005b600080fd5b34801561016757600080fd5b50610170610578565b60405161017d919061226a565b60405180910390f35b34801561019257600080fd5b506101ad60048036038101906101a891906123df565b61059c565b005b3480156101bb57600080fd5b506101d660048036038101906101d191906124b4565b6105c6565b005b3480156101e457600080fd5b506101ff60048036038101906101fa919061254a565b6106ed565b60405161020c9190612590565b60405180910390f35b61022f600480360381019061022a91906125fb565b610705565b005b61024b600480360381019061024691906126be565b610847565b604051610258919061279d565b60405180910390f35b34801561026d57600080fd5b50610288600480360381019061028391906123df565b610959565b604051610295919061279d565b60405180910390f35b6102b860048036038101906102b391906127bf565b610a24565b005b3480156102c657600080fd5b506102e160048036038101906102dc91906123df565b610d96565b6040516102ee9190612590565b60405180910390f35b610311600480360381019061030c9190612847565b610dd9565b005b61032d600480360381019061032891906123df565b610efb565b005b610349600480360381019061034491906124b4565b610f24565b005b34801561035757600080fd5b50610372600480360381019061036d9190612847565b61132a565b60405161037f91906128c9565b60405180910390f35b34801561039457600080fd5b506103af60048036038101906103aa9190612929565b61138a565b005b3480156103bd57600080fd5b506103c661143e565b6040516103d391906128c9565b60405180910390f35b3480156103e857600080fd5b5061040360048036038101906103fe91906129b7565b611477565b005b34801561041157600080fd5b5061041a6119bb565b6040516104279190612a1b565b60405180910390f35b61044a60048036038101906104459190612a36565b6119df565b005b610466600480360381019061046191906124b4565b611c2a565b005b34801561047457600080fd5b5061048f600480360381019061048a919061254a565b611d52565b60405161049c9190612a1b565b60405180910390f35b6104bf60048036038101906104ba9190612a76565b611d72565b005b3480156104cd57600080fd5b506104e860048036038101906104e3919061254a565b611eb2565b6040516104f5919061279d565b60405180910390f35b34801561050a57600080fd5b50610525600480360381019061052091906123df565b611f52565b6040516105329190612a1b565b60405180910390f35b34801561054757600080fd5b50610562600480360381019061055d9190612b93565b611fa2565b60405161056f919061226a565b60405180910390f35b7f000000000000000000000000000000000000000000000000000000000000000081565b6105a581611feb565b156105af57600080fd5b6105b881612041565b6105c3816000612095565b50565b7f0000000000000000000000000000000000000000000000000000000000000000156105f157600080fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16631becceb48484846040518060a001604052803373ffffffffffffffffffffffffffffffffffffffff168152602001600015158152602001600073ffffffffffffffffffffffffffffffffffffffff16815260200160405180602001604052806000815250815260200160008152506040518563ffffffff1660e01b81526004016106b69493929190612cf6565b600060405180830381600087803b1580156106d057600080fd5b505af11580156106e4573d6000803e3d6000fd5b50505050505050565b60026020528060005260406000206000915090505481565b61075282828080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050611feb565b1561075c57600080fd5b60008083839050146107b25782828080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050506107ce565b6107cd8660200160208101906107c89190612847565b61132a565b5b90506107d981612041565b6107e38185612095565b61083f818780600001906107f79190612d4c565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050506120d7565b505050505050565b6060600080848490501461089f5783838080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050506108bb565b6108ba8560000160208101906108b59190612847565b61132a565b5b90506108c681612041565b6108d08134612095565b8460000160208101906108e39190612847565b6004826040516108f39190612deb565b908152602001604051809103902060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550604051806020016040528060008152509150509392505050565b606060036000836040516020016109709190612e3e565b604051602081830303815290604052805190602001208152602001908152602001600020805461099f90612e84565b80601f01602080910402602001604051908101604052809291908181526020018280546109cb90612e84565b8015610a185780601f106109ed57610100808354040283529160200191610a18565b820191906000526020600020905b8154815290600101906020018083116109fb57829003601f168201915b50505050509050919050565b7f000000000000000000000000000000000000000000000000000000000000000015610a4f57600080fd5b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663b01072146040518163ffffffff1660e01b81526004016020604051808303816000875af1158015610abe573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ae29190612eca565b90508473ffffffffffffffffffffffffffffffffffffffff1663095ea7b37f0000000000000000000000000000000000000000000000000000000000000000866040518363ffffffff1660e01b8152600401610b3f929190612ef7565b6020604051808303816000875af1158015610b5e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b829190612f4c565b507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663102614b087600287610bcd9190612fd7565b886040518060a001604052803373ffffffffffffffffffffffffffffffffffffffff168152602001600015158152602001600073ffffffffffffffffffffffffffffffffffffffff16815260200160405180602001604052806000815250815260200160008152506040518563ffffffff1660e01b8152600401610c549493929190613008565b600060405180830381600087803b158015610c6e57600080fd5b505af1158015610c82573d6000803e3d6000fd5b505050507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663d09e3b788288600288610cd19190612fd7565b8988886040518060a001604052803373ffffffffffffffffffffffffffffffffffffffff168152602001600015158152602001600073ffffffffffffffffffffffffffffffffffffffff16815260200160405180602001604052806000815250815260200160008152506040518863ffffffff1660e01b8152600401610d5c96959493929190613054565b6000604051808303818588803b158015610d7557600080fd5b505af1158015610d89573d6000803e3d6000fd5b5050505050505050505050565b60006002600083604051602001610dad9190612e3e565b604051602081830303815290604052805190602001208152602001908152602001600020549050919050565b7f000000000000000000000000000000000000000000000000000000000000000015610e0457600080fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663726ac97c34836040518060a001604052803373ffffffffffffffffffffffffffffffffffffffff168152602001600015158152602001600073ffffffffffffffffffffffffffffffffffffffff16815260200160405180602001604052806000815250815260200160008152506040518463ffffffff1660e01b8152600401610ec69291906130b7565b6000604051808303818588803b158015610edf57600080fd5b505af1158015610ef3573d6000803e3d6000fd5b505050505050565b610f0481611feb565b15610f0e57600080fd5b610f1781612041565b610f218134612095565b50565b7f000000000000000000000000000000000000000000000000000000000000000015610f4f57600080fd5b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663b01072146040518163ffffffff1660e01b81526004016020604051808303816000875af1158015610fbe573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fe29190612eca565b90506000600282610ff391906130e7565b34610ffe9190613129565b90507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663282906ed6002836110499190612fd7565b876002856110579190612fd7565b6040518060a001604052803373ffffffffffffffffffffffffffffffffffffffff168152602001600015158152602001600073ffffffffffffffffffffffffffffffffffffffff16815260200160405180602001604052806000815250815260200160008152506040518563ffffffff1660e01b81526004016110dc9392919061315d565b6000604051808303818588803b1580156110f557600080fd5b505af1158015611109573d6000803e3d6000fd5b50505050507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663397e375c836002846111589190612fd7565b611162919061319b565b876002856111709190612fd7565b88886040518060a001604052803373ffffffffffffffffffffffffffffffffffffffff168152602001600015158152602001600073ffffffffffffffffffffffffffffffffffffffff16815260200160405180602001604052806000815250815260200160008152506040518763ffffffff1660e01b81526004016111f99594939291906131cf565b6000604051808303818588803b15801561121257600080fd5b505af1158015611226573d6000803e3d6000fd5b50505050507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16631becceb4838787876040518060a001604052803373ffffffffffffffffffffffffffffffffffffffff168152602001600015158152602001600073ffffffffffffffffffffffffffffffffffffffff16815260200160405180602001604052806000815250815260200160008152506040518663ffffffff1660e01b81526004016112f19493929190612cf6565b6000604051808303818588803b15801561130a57600080fd5b505af115801561131e573d6000803e3d6000fd5b50505050505050505050565b60606040518060400160405280601681526020017f63616c6c65642077697468206e6f206d657373616765000000000000000000008152508260405160200161137492919061326c565b6040516020818303038152906040529050919050565b61139381611feb565b1561139d57600080fd5b8273ffffffffffffffffffffffffffffffffffffffff166323b872dd3330856040518463ffffffff1660e01b81526004016113da93929190613294565b6020604051808303816000875af11580156113f9573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061141d9190612f4c565b61142657600080fd5b61142f81612041565b6114398183612095565b505050565b6040518060400160405280601681526020017f63616c6c65642077697468206e6f206d6573736167650000000000000000000081525081565b6114d281806060019061148a9190612d4c565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050611feb565b156114dc57600080fd5b7f0000000000000000000000000000000000000000000000000000000000000000156118815761150a612122565b61156581806060019061151d9190612d4c565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050612195565b15611880576000808260200160208101906115809190612847565b73ffffffffffffffffffffffffffffffffffffffff1663d9eeebed6040518163ffffffff1660e01b81526004016040805180830381865afa1580156115c9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115ed91906132e0565b915091508260200160208101906116049190612847565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614611671576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116689061336c565b60405180910390fd5b82604001358111156116b8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116af906133fe565b60405180910390fd5b60008184604001356116ca9190613129565b90508360200160208101906116df9190612847565b73ffffffffffffffffffffffffffffffffffffffff1663095ea7b33386604001356040518363ffffffff1660e01b815260040161171d929190612ef7565b6020604051808303816000875af115801561173c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117609190612f4c565b503373ffffffffffffffffffffffffffffffffffffffff16637c0dcb5f8560000160208101906117909190612847565b6040516020016117a0919061226a565b604051602081830303815290604052838760200160208101906117c39190612847565b6040518060a00160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600015158152602001600073ffffffffffffffffffffffffffffffffffffffff16815260200160405180602001604052806000815250815260200160008152506040518563ffffffff1660e01b815260040161184a949392919061341e565b600060405180830381600087803b15801561186457600080fd5b505af1158015611878573d6000803e3d6000fd5b505050505050505b5b6118dc8180606001906118949190612d4c565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050612041565b6119398180606001906118ef9190612d4c565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050506000612095565b80600001602081019061194c9190612847565b600482806060019061195e9190612d4c565b60405161196c929190613496565b908152602001604051809103902060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b7f000000000000000000000000000000000000000000000000000000000000000081565b7f000000000000000000000000000000000000000000000000000000000000000015611a0a57600080fd5b60008134611a189190613129565b90507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663726ac97c600283611a639190612fd7565b856040518060a001604052803373ffffffffffffffffffffffffffffffffffffffff168152602001600015158152602001600073ffffffffffffffffffffffffffffffffffffffff16815260200160405180602001604052806000815250815260200160008152506040518463ffffffff1660e01b8152600401611ae89291906130b7565b6000604051808303818588803b158015611b0157600080fd5b505af1158015611b15573d6000803e3d6000fd5b50505050507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663726ac97c83600284611b649190612fd7565b611b6e919061319b565b856040518060a001604052803373ffffffffffffffffffffffffffffffffffffffff168152602001600015158152602001600073ffffffffffffffffffffffffffffffffffffffff16815260200160405180602001604052806000815250815260200160008152506040518463ffffffff1660e01b8152600401611bf39291906130b7565b6000604051808303818588803b158015611c0c57600080fd5b505af1158015611c20573d6000803e3d6000fd5b5050505050505050565b7f000000000000000000000000000000000000000000000000000000000000000015611c5557600080fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663744b9b8b348585856040518060a001604052803373ffffffffffffffffffffffffffffffffffffffff168152602001600015158152602001600073ffffffffffffffffffffffffffffffffffffffff16815260200160405180602001604052806000815250815260200160008152506040518663ffffffff1660e01b8152600401611d1b9493929190612cf6565b6000604051808303818588803b158015611d3457600080fd5b505af1158015611d48573d6000803e3d6000fd5b5050505050505050565b60016020528060005260406000206000915054906101000a900460ff1681565b611dbf82828080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050611feb565b15611dc957600080fd5b6000808383905014611e1f5782828080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050611e3b565b611e3a846020016020810190611e359190612847565b61132a565b5b9050611e4681612041565b611e508134612095565b611eac81858060000190611e649190612d4c565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050506120d7565b50505050565b60036020528060005260406000206000915090508054611ed190612e84565b80601f0160208091040260200160405190810160405280929190818152602001828054611efd90612e84565b8015611f4a5780601f10611f1f57610100808354040283529160200191611f4a565b820191906000526020600020905b815481529060010190602001808311611f2d57829003601f168201915b505050505081565b60006001600083604051602001611f699190612e3e565b60405160208183030381529060405280519060200120815260200190815260200160002060009054906101000a900460ff169050919050565b6004818051602081018201805184825260208301602085012081835280955050505050506000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000604051602001611ffc906134fb565b60405160208183030381529060405280519060200120826040516020016120239190612e3e565b60405160208183030381529060405280519060200120149050919050565b6001806000836040516020016120579190612e3e565b60405160208183030381529060405280519060200120815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b8060026000846040516020016120ab9190612e3e565b604051602081830303815290604052805190602001208152602001908152602001600020819055505050565b8060036000846040516020016120ed9190612e3e565b604051602081830303815290604052805190602001208152602001908152602001600020908161211d91906136bc565b505050565b60006207a12090506000614e2090506000818361213f9190612fd7565b905060005b818110156121825760008190806001815401808255809150506001900390600052602060002001600090919091909150558080600101915050612144565b5060008061219091906121eb565b505050565b60006040516020016121a6906137da565b60405160208183030381529060405280519060200120826040516020016121cd9190612e3e565b60405160208183030381529060405280519060200120149050919050565b5080546000825590600052602060002090810190612209919061220c565b50565b5b8082111561222557600081600090555060010161220d565b5090565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061225482612229565b9050919050565b61226481612249565b82525050565b600060208201905061227f600083018461225b565b92915050565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6122ec826122a3565b810181811067ffffffffffffffff8211171561230b5761230a6122b4565b5b80604052505050565b600061231e612285565b905061232a82826122e3565b919050565b600067ffffffffffffffff82111561234a576123496122b4565b5b612353826122a3565b9050602081019050919050565b82818337600083830152505050565b600061238261237d8461232f565b612314565b90508281526020810184848401111561239e5761239d61229e565b5b6123a9848285612360565b509392505050565b600082601f8301126123c6576123c5612299565b5b81356123d684826020860161236f565b91505092915050565b6000602082840312156123f5576123f461228f565b5b600082013567ffffffffffffffff81111561241357612412612294565b5b61241f848285016123b1565b91505092915050565b61243181612249565b811461243c57600080fd5b50565b60008135905061244e81612428565b92915050565b600080fd5b600080fd5b60008083601f84011261247457612473612299565b5b8235905067ffffffffffffffff81111561249157612490612454565b5b6020830191508360018202830111156124ad576124ac612459565b5b9250929050565b6000806000604084860312156124cd576124cc61228f565b5b60006124db8682870161243f565b935050602084013567ffffffffffffffff8111156124fc576124fb612294565b5b6125088682870161245e565b92509250509250925092565b6000819050919050565b61252781612514565b811461253257600080fd5b50565b6000813590506125448161251e565b92915050565b6000602082840312156125605761255f61228f565b5b600061256e84828501612535565b91505092915050565b6000819050919050565b61258a81612577565b82525050565b60006020820190506125a56000830184612581565b92915050565b600080fd5b6000606082840312156125c6576125c56125ab565b5b81905092915050565b6125d881612577565b81146125e357600080fd5b50565b6000813590506125f5816125cf565b92915050565b6000806000806000608086880312156126175761261661228f565b5b600086013567ffffffffffffffff81111561263557612634612294565b5b612641888289016125b0565b95505060206126528882890161243f565b9450506040612663888289016125e6565b935050606086013567ffffffffffffffff81111561268457612683612294565b5b6126908882890161245e565b92509250509295509295909350565b6000602082840312156126b5576126b46125ab565b5b81905092915050565b6000806000604084860312156126d7576126d661228f565b5b60006126e58682870161269f565b935050602084013567ffffffffffffffff81111561270657612705612294565b5b6127128682870161245e565b92509250509250925092565b600081519050919050565b600082825260208201905092915050565b60005b8381101561275857808201518184015260208101905061273d565b60008484015250505050565b600061276f8261271e565b6127798185612729565b935061278981856020860161273a565b612792816122a3565b840191505092915050565b600060208201905081810360008301526127b78184612764565b905092915050565b6000806000806000608086880312156127db576127da61228f565b5b60006127e98882890161243f565b95505060206127fa8882890161243f565b945050604061280b888289016125e6565b935050606086013567ffffffffffffffff81111561282c5761282b612294565b5b6128388882890161245e565b92509250509295509295909350565b60006020828403121561285d5761285c61228f565b5b600061286b8482850161243f565b91505092915050565b600081519050919050565b600082825260208201905092915050565b600061289b82612874565b6128a5818561287f565b93506128b581856020860161273a565b6128be816122a3565b840191505092915050565b600060208201905081810360008301526128e38184612890565b905092915050565b60006128f682612249565b9050919050565b612906816128eb565b811461291157600080fd5b50565b600081359050612923816128fd565b92915050565b6000806000606084860312156129425761294161228f565b5b600061295086828701612914565b9350506020612961868287016125e6565b925050604084013567ffffffffffffffff81111561298257612981612294565b5b61298e868287016123b1565b9150509250925092565b6000608082840312156129ae576129ad6125ab565b5b81905092915050565b6000602082840312156129cd576129cc61228f565b5b600082013567ffffffffffffffff8111156129eb576129ea612294565b5b6129f784828501612998565b91505092915050565b60008115159050919050565b612a1581612a00565b82525050565b6000602082019050612a306000830184612a0c565b92915050565b60008060408385031215612a4d57612a4c61228f565b5b6000612a5b8582860161243f565b9250506020612a6c858286016125e6565b9150509250929050565b600080600060408486031215612a8f57612a8e61228f565b5b600084013567ffffffffffffffff811115612aad57612aac612294565b5b612ab9868287016125b0565b935050602084013567ffffffffffffffff811115612ada57612ad9612294565b5b612ae68682870161245e565b92509250509250925092565b600067ffffffffffffffff821115612b0d57612b0c6122b4565b5b612b16826122a3565b9050602081019050919050565b6000612b36612b3184612af2565b612314565b905082815260208101848484011115612b5257612b5161229e565b5b612b5d848285612360565b509392505050565b600082601f830112612b7a57612b79612299565b5b8135612b8a848260208601612b23565b91505092915050565b600060208284031215612ba957612ba861228f565b5b600082013567ffffffffffffffff811115612bc757612bc6612294565b5b612bd384828501612b65565b91505092915050565b6000612be88385612729565b9350612bf5838584612360565b612bfe836122a3565b840190509392505050565b612c1281612249565b82525050565b612c2181612a00565b82525050565b600082825260208201905092915050565b6000612c438261271e565b612c4d8185612c27565b9350612c5d81856020860161273a565b612c66816122a3565b840191505092915050565b612c7a81612577565b82525050565b600060a083016000830151612c986000860182612c09565b506020830151612cab6020860182612c18565b506040830151612cbe6040860182612c09565b5060608301518482036060860152612cd68282612c38565b9150506080830151612ceb6080860182612c71565b508091505092915050565b6000606082019050612d0b600083018761225b565b8181036020830152612d1e818587612bdc565b90508181036040830152612d328184612c80565b905095945050505050565b600080fd5b600080fd5b600080fd5b60008083356001602003843603038112612d6957612d68612d3d565b5b80840192508235915067ffffffffffffffff821115612d8b57612d8a612d42565b5b602083019250600182023603831315612da757612da6612d47565b5b509250929050565b600081905092915050565b6000612dc58261271e565b612dcf8185612daf565b9350612ddf81856020860161273a565b80840191505092915050565b6000612df78284612dba565b915081905092915050565b600081905092915050565b6000612e1882612874565b612e228185612e02565b9350612e3281856020860161273a565b80840191505092915050565b6000612e4a8284612e0d565b915081905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680612e9c57607f821691505b602082108103612eaf57612eae612e55565b5b50919050565b600081519050612ec4816125cf565b92915050565b600060208284031215612ee057612edf61228f565b5b6000612eee84828501612eb5565b91505092915050565b6000604082019050612f0c600083018561225b565b612f196020830184612581565b9392505050565b612f2981612a00565b8114612f3457600080fd5b50565b600081519050612f4681612f20565b92915050565b600060208284031215612f6257612f6161228f565b5b6000612f7084828501612f37565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000612fe282612577565b9150612fed83612577565b925082612ffd57612ffc612f79565b5b828204905092915050565b600060808201905061301d600083018761225b565b61302a6020830186612581565b613037604083018561225b565b81810360608301526130498184612c80565b905095945050505050565b600060a082019050613069600083018961225b565b6130766020830188612581565b613083604083018761225b565b8181036060830152613096818587612bdc565b905081810360808301526130aa8184612c80565b9050979650505050505050565b60006040820190506130cc600083018561225b565b81810360208301526130de8184612c80565b90509392505050565b60006130f282612577565b91506130fd83612577565b925082820261310b81612577565b9150828204841483151761312257613121612fa8565b5b5092915050565b600061313482612577565b915061313f83612577565b925082820390508181111561315757613156612fa8565b5b92915050565b6000606082019050613172600083018661225b565b61317f6020830185612581565b81810360408301526131918184612c80565b9050949350505050565b60006131a682612577565b91506131b183612577565b92508282019050808211156131c9576131c8612fa8565b5b92915050565b60006080820190506131e4600083018861225b565b6131f16020830187612581565b8181036040830152613204818587612bdc565b905081810360608301526132188184612c80565b90509695505050505050565b60008160601b9050919050565b600061323c82613224565b9050919050565b600061324e82613231565b9050919050565b61326661326182612249565b613243565b82525050565b60006132788285612e0d565b91506132848284613255565b6014820191508190509392505050565b60006060820190506132a9600083018661225b565b6132b6602083018561225b565b6132c36040830184612581565b949350505050565b6000815190506132da81612428565b92915050565b600080604083850312156132f7576132f661228f565b5b6000613305858286016132cb565b925050602061331685828601612eb5565b9150509250929050565b7f7a72633230206973206e6f742067617320746f6b656e00000000000000000000600082015250565b600061335660168361287f565b915061336182613320565b602082019050919050565b6000602082019050818103600083015261338581613349565b9050919050565b7f66656520616d6f756e7420697320686967686572207468616e2074686520616d60008201527f6f756e7400000000000000000000000000000000000000000000000000000000602082015250565b60006133e860248361287f565b91506133f38261338c565b604082019050919050565b60006020820190508181036000830152613417816133db565b9050919050565b600060808201905081810360008301526134388187612764565b90506134476020830186612581565b613454604083018561225b565b81810360608301526134668184612c80565b905095945050505050565b600061347d8385612daf565b935061348a838584612360565b82840190509392505050565b60006134a3828486613471565b91508190509392505050565b7f7265766572740000000000000000000000000000000000000000000000000000600082015250565b60006134e5600683612e02565b91506134f0826134af565b600682019050919050565b6000613506826134d8565b9150819050919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026135727fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82613535565b61357c8683613535565b95508019841693508086168417925050509392505050565b6000819050919050565b60006135b96135b46135af84612577565b613594565b612577565b9050919050565b6000819050919050565b6135d38361359e565b6135e76135df826135c0565b848454613542565b825550505050565b600090565b6135fc6135ef565b6136078184846135ca565b505050565b5b8181101561362b576136206000826135f4565b60018101905061360d565b5050565b601f8211156136705761364181613510565b61364a84613525565b81016020851015613659578190505b61366d61366585613525565b83018261360c565b50505b505050565b600082821c905092915050565b600061369360001984600802613675565b1980831691505092915050565b60006136ac8383613682565b9150826002028217905092915050565b6136c58261271e565b67ffffffffffffffff8111156136de576136dd6122b4565b5b6136e88254612e84565b6136f382828561362f565b600060209050601f8311600181146137265760008415613714578287015190505b61371e85826136a0565b865550613786565b601f19841661373486613510565b60005b8281101561375c57848901518255600182019150602085019450602081019050613737565b868310156137795784890151613775601f891682613682565b8355505b6001600288020188555050505b505050505050565b7f7769746864726177000000000000000000000000000000000000000000000000600082015250565b60006137c4600883612e02565b91506137cf8261378e565b600882019050919050565b60006137e5826137b7565b915081905091905056fea264697066735822122002ae685f66be5174e96940fdc7c5741116b962da5e3b6e4d59d5f429edc8ecf464736f6c634300081a0033", + Bin: "0x60c060405234801561001057600080fd5b50604051613f87380380613f8783398181016040528101906100329190610114565b8115156080811515815250508073ffffffffffffffffffffffffffffffffffffffff1660a08173ffffffffffffffffffffffffffffffffffffffff16815250505050610154565b600080fd5b60008115159050919050565b6100938161007e565b811461009e57600080fd5b50565b6000815190506100b08161008a565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006100e1826100b6565b9050919050565b6100f1816100d6565b81146100fc57600080fd5b50565b60008151905061010e816100e8565b92915050565b6000806040838503121561012b5761012a610079565b5b6000610139858286016100a1565b925050602061014a858286016100ff565b9150509250929050565b60805160a051613d5f6102286000396000818161057a015281816105f301528181610a5301528181610b0201528181610b8501528181610c8801528181610d8c01528181610e94015281816110120152818161115f0152818161120e0152818161131c01528181611435015281816115520152818161166f0152818161176701528181611f560152818161205601526121910152600081816105c801528181610a2601528181610fe70152818161113201528181611a1801528181611ef701528181611f1b01526121660152613d5f6000f3fe60806040526004361061014f5760003560e01c8063ad23b28b116100b6578063deb3b1e41161006f578063deb3b1e41461044c578063e2842ed714610468578063ebf9b2aa146104a5578063ef800367146104c1578063f592cbfb146104fe578063f936ae851461053b57610156565b8063ad23b28b1461034b578063c7a339a914610388578063c85f8434146103b1578063c9028a36146103dc578063c91f356714610405578063d2b48ff21461043057610156565b8063740e2f6311610108578063740e2f63146102615780638cc1a2e81461029e5780639291fe26146102ba5780639ca016ed146102f7578063a799911f14610313578063a93abe6c1461032f57610156565b8063116191b61461015b57806336e980a01461018657806341a3cd4a146101af5780634297a263146101d85780635bcfd61614610215578063676cc0541461023157610156565b3661015657005b600080fd5b34801561016757600080fd5b50610170610578565b60405161017d91906127a4565b60405180910390f35b34801561019257600080fd5b506101ad60048036038101906101a89190612919565b61059c565b005b3480156101bb57600080fd5b506101d660048036038101906101d191906129ee565b6105c6565b005b3480156101e457600080fd5b506101ff60048036038101906101fa9190612a84565b6106ed565b60405161020c9190612aca565b60405180910390f35b61022f600480360381019061022a9190612b35565b610705565b005b61024b60048036038101906102469190612bf8565b610847565b6040516102589190612cd7565b60405180910390f35b34801561026d57600080fd5b5061028860048036038101906102839190612919565b610959565b6040516102959190612cd7565b60405180910390f35b6102b860048036038101906102b39190612cf9565b610a24565b005b3480156102c657600080fd5b506102e160048036038101906102dc9190612919565b610fa2565b6040516102ee9190612aca565b60405180910390f35b610311600480360381019061030c9190612d81565b610fe5565b005b61032d60048036038101906103289190612919565b611107565b005b610349600480360381019061034491906129ee565b611130565b005b34801561035757600080fd5b50610372600480360381019061036d9190612d81565b611864565b60405161037f9190612e03565b60405180910390f35b34801561039457600080fd5b506103af60048036038101906103aa9190612e63565b6118c4565b005b3480156103bd57600080fd5b506103c6611978565b6040516103d39190612e03565b60405180910390f35b3480156103e857600080fd5b5061040360048036038101906103fe9190612ef1565b6119b1565b005b34801561041157600080fd5b5061041a611ef5565b6040516104279190612f55565b60405180910390f35b61044a60048036038101906104459190612f70565b611f19565b005b610466600480360381019061046191906129ee565b612164565b005b34801561047457600080fd5b5061048f600480360381019061048a9190612a84565b61228c565b60405161049c9190612f55565b60405180910390f35b6104bf60048036038101906104ba9190612fb0565b6122ac565b005b3480156104cd57600080fd5b506104e860048036038101906104e39190612a84565b6123ec565b6040516104f59190612cd7565b60405180910390f35b34801561050a57600080fd5b5061052560048036038101906105209190612919565b61248c565b6040516105329190612f55565b60405180910390f35b34801561054757600080fd5b50610562600480360381019061055d91906130cd565b6124dc565b60405161056f91906127a4565b60405180910390f35b7f000000000000000000000000000000000000000000000000000000000000000081565b6105a581612525565b156105af57600080fd5b6105b88161257b565b6105c38160006125cf565b50565b7f0000000000000000000000000000000000000000000000000000000000000000156105f157600080fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16631becceb48484846040518060a001604052803373ffffffffffffffffffffffffffffffffffffffff168152602001600015158152602001600073ffffffffffffffffffffffffffffffffffffffff16815260200160405180602001604052806000815250815260200160008152506040518563ffffffff1660e01b81526004016106b69493929190613230565b600060405180830381600087803b1580156106d057600080fd5b505af11580156106e4573d6000803e3d6000fd5b50505050505050565b60026020528060005260406000206000915090505481565b61075282828080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050612525565b1561075c57600080fd5b60008083839050146107b25782828080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050506107ce565b6107cd8660200160208101906107c89190612d81565b611864565b5b90506107d98161257b565b6107e381856125cf565b61083f818780600001906107f79190613286565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050612611565b505050505050565b6060600080848490501461089f5783838080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050506108bb565b6108ba8560000160208101906108b59190612d81565b611864565b5b90506108c68161257b565b6108d081346125cf565b8460000160208101906108e39190612d81565b6004826040516108f39190613325565b908152602001604051809103902060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550604051806020016040528060008152509150509392505050565b606060036000836040516020016109709190613378565b604051602081830303815290604052805190602001208152602001908152602001600020805461099f906133be565b80601f01602080910402602001604051908101604052809291908181526020018280546109cb906133be565b8015610a185780601f106109ed57610100808354040283529160200191610a18565b820191906000526020600020905b8154815290600101906020018083116109fb57829003601f168201915b50505050509050919050565b7f000000000000000000000000000000000000000000000000000000000000000015610a4f57600080fd5b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663b01072146040518163ffffffff1660e01b81526004016020604051808303816000875af1158015610abe573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ae29190613404565b90508473ffffffffffffffffffffffffffffffffffffffff1663095ea7b37f0000000000000000000000000000000000000000000000000000000000000000866040518363ffffffff1660e01b8152600401610b3f929190613431565b6020604051808303816000875af1158015610b5e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b829190613486565b507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663102614b087600487610bcd9190613511565b886040518060a001604052803373ffffffffffffffffffffffffffffffffffffffff168152602001600015158152602001600073ffffffffffffffffffffffffffffffffffffffff16815260200160405180602001604052806000815250815260200160008152506040518563ffffffff1660e01b8152600401610c549493929190613542565b600060405180830381600087803b158015610c6e57600080fd5b505af1158015610c82573d6000803e3d6000fd5b505050507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663102614b08288600488610cd19190613511565b896040518060a001604052803373ffffffffffffffffffffffffffffffffffffffff168152602001600015158152602001600073ffffffffffffffffffffffffffffffffffffffff16815260200160405180602001604052806000815250815260200160008152506040518663ffffffff1660e01b8152600401610d589493929190613542565b6000604051808303818588803b158015610d7157600080fd5b505af1158015610d85573d6000803e3d6000fd5b50505050507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663d09e3b788288600488610dd59190613511565b8988886040518060a001604052803373ffffffffffffffffffffffffffffffffffffffff168152602001600015158152602001600073ffffffffffffffffffffffffffffffffffffffff16815260200160405180602001604052806000815250815260200160008152506040518863ffffffff1660e01b8152600401610e609695949392919061358e565b6000604051808303818588803b158015610e7957600080fd5b505af1158015610e8d573d6000803e3d6000fd5b50505050507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663d09e3b788288600488610edd9190613511565b8988886040518060a001604052803373ffffffffffffffffffffffffffffffffffffffff168152602001600015158152602001600073ffffffffffffffffffffffffffffffffffffffff16815260200160405180602001604052806000815250815260200160008152506040518863ffffffff1660e01b8152600401610f689695949392919061358e565b6000604051808303818588803b158015610f8157600080fd5b505af1158015610f95573d6000803e3d6000fd5b5050505050505050505050565b60006002600083604051602001610fb99190613378565b604051602081830303815290604052805190602001208152602001908152602001600020549050919050565b7f00000000000000000000000000000000000000000000000000000000000000001561101057600080fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663726ac97c34836040518060a001604052803373ffffffffffffffffffffffffffffffffffffffff168152602001600015158152602001600073ffffffffffffffffffffffffffffffffffffffff16815260200160405180602001604052806000815250815260200160008152506040518463ffffffff1660e01b81526004016110d29291906135f1565b6000604051808303818588803b1580156110eb57600080fd5b505af11580156110ff573d6000803e3d6000fd5b505050505050565b61111081612525565b1561111a57600080fd5b6111238161257b565b61112d81346125cf565b50565b7f00000000000000000000000000000000000000000000000000000000000000001561115b57600080fd5b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663b01072146040518163ffffffff1660e01b81526004016020604051808303816000875af11580156111ca573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111ee9190613404565b905060006005826111ff9190613621565b3461120a9190613663565b90507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663282906ed6004836112559190613511565b876004856112639190613511565b6040518060a001604052803373ffffffffffffffffffffffffffffffffffffffff168152602001600015158152602001600073ffffffffffffffffffffffffffffffffffffffff16815260200160405180602001604052806000815250815260200160008152506040518563ffffffff1660e01b81526004016112e893929190613697565b6000604051808303818588803b15801561130157600080fd5b505af1158015611315573d6000803e3d6000fd5b50505050507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663282906ed836004846113649190613511565b61136e91906136d5565b8760048561137c9190613511565b6040518060a001604052803373ffffffffffffffffffffffffffffffffffffffff168152602001600015158152602001600073ffffffffffffffffffffffffffffffffffffffff16815260200160405180602001604052806000815250815260200160008152506040518563ffffffff1660e01b815260040161140193929190613697565b6000604051808303818588803b15801561141a57600080fd5b505af115801561142e573d6000803e3d6000fd5b50505050507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663397e375c8360048461147d9190613511565b61148791906136d5565b876004856114959190613511565b88886040518060a001604052803373ffffffffffffffffffffffffffffffffffffffff168152602001600015158152602001600073ffffffffffffffffffffffffffffffffffffffff16815260200160405180602001604052806000815250815260200160008152506040518763ffffffff1660e01b815260040161151e959493929190613709565b6000604051808303818588803b15801561153757600080fd5b505af115801561154b573d6000803e3d6000fd5b50505050507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663397e375c8360048461159a9190613511565b6115a491906136d5565b876004856115b29190613511565b88886040518060a001604052803373ffffffffffffffffffffffffffffffffffffffff168152602001600015158152602001600073ffffffffffffffffffffffffffffffffffffffff16815260200160405180602001604052806000815250815260200160008152506040518763ffffffff1660e01b815260040161163b959493929190613709565b6000604051808303818588803b15801561165457600080fd5b505af1158015611668573d6000803e3d6000fd5b50505050507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16631becceb4838787876040518060a001604052803373ffffffffffffffffffffffffffffffffffffffff168152602001600015158152602001600073ffffffffffffffffffffffffffffffffffffffff16815260200160405180602001604052806000815250815260200160008152506040518663ffffffff1660e01b81526004016117339493929190613230565b6000604051808303818588803b15801561174c57600080fd5b505af1158015611760573d6000803e3d6000fd5b50505050507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16631becceb4838787876040518060a001604052803373ffffffffffffffffffffffffffffffffffffffff168152602001600015158152602001600073ffffffffffffffffffffffffffffffffffffffff16815260200160405180602001604052806000815250815260200160008152506040518663ffffffff1660e01b815260040161182b9493929190613230565b6000604051808303818588803b15801561184457600080fd5b505af1158015611858573d6000803e3d6000fd5b50505050505050505050565b60606040518060400160405280601681526020017f63616c6c65642077697468206e6f206d65737361676500000000000000000000815250826040516020016118ae9291906137a6565b6040516020818303038152906040529050919050565b6118cd81612525565b156118d757600080fd5b8273ffffffffffffffffffffffffffffffffffffffff166323b872dd3330856040518463ffffffff1660e01b8152600401611914939291906137ce565b6020604051808303816000875af1158015611933573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119579190613486565b61196057600080fd5b6119698161257b565b61197381836125cf565b505050565b6040518060400160405280601681526020017f63616c6c65642077697468206e6f206d6573736167650000000000000000000081525081565b611a0c8180606001906119c49190613286565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050612525565b15611a1657600080fd5b7f000000000000000000000000000000000000000000000000000000000000000015611dbb57611a4461265c565b611a9f818060600190611a579190613286565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050506126cf565b15611dba57600080826020016020810190611aba9190612d81565b73ffffffffffffffffffffffffffffffffffffffff1663d9eeebed6040518163ffffffff1660e01b81526004016040805180830381865afa158015611b03573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b27919061381a565b91509150826020016020810190611b3e9190612d81565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614611bab576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ba2906138a6565b60405180910390fd5b8260400135811115611bf2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611be990613938565b60405180910390fd5b6000818460400135611c049190613663565b9050836020016020810190611c199190612d81565b73ffffffffffffffffffffffffffffffffffffffff1663095ea7b33386604001356040518363ffffffff1660e01b8152600401611c57929190613431565b6020604051808303816000875af1158015611c76573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c9a9190613486565b503373ffffffffffffffffffffffffffffffffffffffff16637c0dcb5f856000016020810190611cca9190612d81565b604051602001611cda91906127a4565b60405160208183030381529060405283876020016020810190611cfd9190612d81565b6040518060a00160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600015158152602001600073ffffffffffffffffffffffffffffffffffffffff16815260200160405180602001604052806000815250815260200160008152506040518563ffffffff1660e01b8152600401611d849493929190613958565b600060405180830381600087803b158015611d9e57600080fd5b505af1158015611db2573d6000803e3d6000fd5b505050505050505b5b611e16818060600190611dce9190613286565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505061257b565b611e73818060600190611e299190613286565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505060006125cf565b806000016020810190611e869190612d81565b6004828060600190611e989190613286565b604051611ea69291906139d0565b908152602001604051809103902060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b7f000000000000000000000000000000000000000000000000000000000000000081565b7f000000000000000000000000000000000000000000000000000000000000000015611f4457600080fd5b60008134611f529190613663565b90507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663726ac97c600283611f9d9190613511565b856040518060a001604052803373ffffffffffffffffffffffffffffffffffffffff168152602001600015158152602001600073ffffffffffffffffffffffffffffffffffffffff16815260200160405180602001604052806000815250815260200160008152506040518463ffffffff1660e01b81526004016120229291906135f1565b6000604051808303818588803b15801561203b57600080fd5b505af115801561204f573d6000803e3d6000fd5b50505050507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663726ac97c8360028461209e9190613511565b6120a891906136d5565b856040518060a001604052803373ffffffffffffffffffffffffffffffffffffffff168152602001600015158152602001600073ffffffffffffffffffffffffffffffffffffffff16815260200160405180602001604052806000815250815260200160008152506040518463ffffffff1660e01b815260040161212d9291906135f1565b6000604051808303818588803b15801561214657600080fd5b505af115801561215a573d6000803e3d6000fd5b5050505050505050565b7f00000000000000000000000000000000000000000000000000000000000000001561218f57600080fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663744b9b8b348585856040518060a001604052803373ffffffffffffffffffffffffffffffffffffffff168152602001600015158152602001600073ffffffffffffffffffffffffffffffffffffffff16815260200160405180602001604052806000815250815260200160008152506040518663ffffffff1660e01b81526004016122559493929190613230565b6000604051808303818588803b15801561226e57600080fd5b505af1158015612282573d6000803e3d6000fd5b5050505050505050565b60016020528060005260406000206000915054906101000a900460ff1681565b6122f982828080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050612525565b1561230357600080fd5b60008083839050146123595782828080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050612375565b61237484602001602081019061236f9190612d81565b611864565b5b90506123808161257b565b61238a81346125cf565b6123e68185806000019061239e9190613286565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050612611565b50505050565b6003602052806000526040600020600091509050805461240b906133be565b80601f0160208091040260200160405190810160405280929190818152602001828054612437906133be565b80156124845780601f1061245957610100808354040283529160200191612484565b820191906000526020600020905b81548152906001019060200180831161246757829003601f168201915b505050505081565b600060016000836040516020016124a39190613378565b60405160208183030381529060405280519060200120815260200190815260200160002060009054906101000a900460ff169050919050565b6004818051602081018201805184825260208301602085012081835280955050505050506000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600060405160200161253690613a35565b604051602081830303815290604052805190602001208260405160200161255d9190613378565b60405160208183030381529060405280519060200120149050919050565b6001806000836040516020016125919190613378565b60405160208183030381529060405280519060200120815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b8060026000846040516020016125e59190613378565b604051602081830303815290604052805190602001208152602001908152602001600020819055505050565b8060036000846040516020016126279190613378565b60405160208183030381529060405280519060200120815260200190815260200160002090816126579190613bf6565b505050565b60006207a12090506000614e209050600081836126799190613511565b905060005b818110156126bc576000819080600181540180825580915050600190039060005260206000200160009091909190915055808060010191505061267e565b506000806126ca9190612725565b505050565b60006040516020016126e090613d14565b60405160208183030381529060405280519060200120826040516020016127079190613378565b60405160208183030381529060405280519060200120149050919050565b50805460008255906000526020600020908101906127439190612746565b50565b5b8082111561275f576000816000905550600101612747565b5090565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061278e82612763565b9050919050565b61279e81612783565b82525050565b60006020820190506127b96000830184612795565b92915050565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b612826826127dd565b810181811067ffffffffffffffff82111715612845576128446127ee565b5b80604052505050565b60006128586127bf565b9050612864828261281d565b919050565b600067ffffffffffffffff821115612884576128836127ee565b5b61288d826127dd565b9050602081019050919050565b82818337600083830152505050565b60006128bc6128b784612869565b61284e565b9050828152602081018484840111156128d8576128d76127d8565b5b6128e384828561289a565b509392505050565b600082601f830112612900576128ff6127d3565b5b81356129108482602086016128a9565b91505092915050565b60006020828403121561292f5761292e6127c9565b5b600082013567ffffffffffffffff81111561294d5761294c6127ce565b5b612959848285016128eb565b91505092915050565b61296b81612783565b811461297657600080fd5b50565b60008135905061298881612962565b92915050565b600080fd5b600080fd5b60008083601f8401126129ae576129ad6127d3565b5b8235905067ffffffffffffffff8111156129cb576129ca61298e565b5b6020830191508360018202830111156129e7576129e6612993565b5b9250929050565b600080600060408486031215612a0757612a066127c9565b5b6000612a1586828701612979565b935050602084013567ffffffffffffffff811115612a3657612a356127ce565b5b612a4286828701612998565b92509250509250925092565b6000819050919050565b612a6181612a4e565b8114612a6c57600080fd5b50565b600081359050612a7e81612a58565b92915050565b600060208284031215612a9a57612a996127c9565b5b6000612aa884828501612a6f565b91505092915050565b6000819050919050565b612ac481612ab1565b82525050565b6000602082019050612adf6000830184612abb565b92915050565b600080fd5b600060608284031215612b0057612aff612ae5565b5b81905092915050565b612b1281612ab1565b8114612b1d57600080fd5b50565b600081359050612b2f81612b09565b92915050565b600080600080600060808688031215612b5157612b506127c9565b5b600086013567ffffffffffffffff811115612b6f57612b6e6127ce565b5b612b7b88828901612aea565b9550506020612b8c88828901612979565b9450506040612b9d88828901612b20565b935050606086013567ffffffffffffffff811115612bbe57612bbd6127ce565b5b612bca88828901612998565b92509250509295509295909350565b600060208284031215612bef57612bee612ae5565b5b81905092915050565b600080600060408486031215612c1157612c106127c9565b5b6000612c1f86828701612bd9565b935050602084013567ffffffffffffffff811115612c4057612c3f6127ce565b5b612c4c86828701612998565b92509250509250925092565b600081519050919050565b600082825260208201905092915050565b60005b83811015612c92578082015181840152602081019050612c77565b60008484015250505050565b6000612ca982612c58565b612cb38185612c63565b9350612cc3818560208601612c74565b612ccc816127dd565b840191505092915050565b60006020820190508181036000830152612cf18184612c9e565b905092915050565b600080600080600060808688031215612d1557612d146127c9565b5b6000612d2388828901612979565b9550506020612d3488828901612979565b9450506040612d4588828901612b20565b935050606086013567ffffffffffffffff811115612d6657612d656127ce565b5b612d7288828901612998565b92509250509295509295909350565b600060208284031215612d9757612d966127c9565b5b6000612da584828501612979565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000612dd582612dae565b612ddf8185612db9565b9350612def818560208601612c74565b612df8816127dd565b840191505092915050565b60006020820190508181036000830152612e1d8184612dca565b905092915050565b6000612e3082612783565b9050919050565b612e4081612e25565b8114612e4b57600080fd5b50565b600081359050612e5d81612e37565b92915050565b600080600060608486031215612e7c57612e7b6127c9565b5b6000612e8a86828701612e4e565b9350506020612e9b86828701612b20565b925050604084013567ffffffffffffffff811115612ebc57612ebb6127ce565b5b612ec8868287016128eb565b9150509250925092565b600060808284031215612ee857612ee7612ae5565b5b81905092915050565b600060208284031215612f0757612f066127c9565b5b600082013567ffffffffffffffff811115612f2557612f246127ce565b5b612f3184828501612ed2565b91505092915050565b60008115159050919050565b612f4f81612f3a565b82525050565b6000602082019050612f6a6000830184612f46565b92915050565b60008060408385031215612f8757612f866127c9565b5b6000612f9585828601612979565b9250506020612fa685828601612b20565b9150509250929050565b600080600060408486031215612fc957612fc86127c9565b5b600084013567ffffffffffffffff811115612fe757612fe66127ce565b5b612ff386828701612aea565b935050602084013567ffffffffffffffff811115613014576130136127ce565b5b61302086828701612998565b92509250509250925092565b600067ffffffffffffffff821115613047576130466127ee565b5b613050826127dd565b9050602081019050919050565b600061307061306b8461302c565b61284e565b90508281526020810184848401111561308c5761308b6127d8565b5b61309784828561289a565b509392505050565b600082601f8301126130b4576130b36127d3565b5b81356130c484826020860161305d565b91505092915050565b6000602082840312156130e3576130e26127c9565b5b600082013567ffffffffffffffff811115613101576131006127ce565b5b61310d8482850161309f565b91505092915050565b60006131228385612c63565b935061312f83858461289a565b613138836127dd565b840190509392505050565b61314c81612783565b82525050565b61315b81612f3a565b82525050565b600082825260208201905092915050565b600061317d82612c58565b6131878185613161565b9350613197818560208601612c74565b6131a0816127dd565b840191505092915050565b6131b481612ab1565b82525050565b600060a0830160008301516131d26000860182613143565b5060208301516131e56020860182613152565b5060408301516131f86040860182613143565b50606083015184820360608601526132108282613172565b915050608083015161322560808601826131ab565b508091505092915050565b60006060820190506132456000830187612795565b8181036020830152613258818587613116565b9050818103604083015261326c81846131ba565b905095945050505050565b600080fd5b600080fd5b600080fd5b600080833560016020038436030381126132a3576132a2613277565b5b80840192508235915067ffffffffffffffff8211156132c5576132c461327c565b5b6020830192506001820236038313156132e1576132e0613281565b5b509250929050565b600081905092915050565b60006132ff82612c58565b61330981856132e9565b9350613319818560208601612c74565b80840191505092915050565b600061333182846132f4565b915081905092915050565b600081905092915050565b600061335282612dae565b61335c818561333c565b935061336c818560208601612c74565b80840191505092915050565b60006133848284613347565b915081905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806133d657607f821691505b6020821081036133e9576133e861338f565b5b50919050565b6000815190506133fe81612b09565b92915050565b60006020828403121561341a576134196127c9565b5b6000613428848285016133ef565b91505092915050565b60006040820190506134466000830185612795565b6134536020830184612abb565b9392505050565b61346381612f3a565b811461346e57600080fd5b50565b6000815190506134808161345a565b92915050565b60006020828403121561349c5761349b6127c9565b5b60006134aa84828501613471565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061351c82612ab1565b915061352783612ab1565b925082613537576135366134b3565b5b828204905092915050565b60006080820190506135576000830187612795565b6135646020830186612abb565b6135716040830185612795565b818103606083015261358381846131ba565b905095945050505050565b600060a0820190506135a36000830189612795565b6135b06020830188612abb565b6135bd6040830187612795565b81810360608301526135d0818587613116565b905081810360808301526135e481846131ba565b9050979650505050505050565b60006040820190506136066000830185612795565b818103602083015261361881846131ba565b90509392505050565b600061362c82612ab1565b915061363783612ab1565b925082820261364581612ab1565b9150828204841483151761365c5761365b6134e2565b5b5092915050565b600061366e82612ab1565b915061367983612ab1565b9250828203905081811115613691576136906134e2565b5b92915050565b60006060820190506136ac6000830186612795565b6136b96020830185612abb565b81810360408301526136cb81846131ba565b9050949350505050565b60006136e082612ab1565b91506136eb83612ab1565b9250828201905080821115613703576137026134e2565b5b92915050565b600060808201905061371e6000830188612795565b61372b6020830187612abb565b818103604083015261373e818587613116565b9050818103606083015261375281846131ba565b90509695505050505050565b60008160601b9050919050565b60006137768261375e565b9050919050565b60006137888261376b565b9050919050565b6137a061379b82612783565b61377d565b82525050565b60006137b28285613347565b91506137be828461378f565b6014820191508190509392505050565b60006060820190506137e36000830186612795565b6137f06020830185612795565b6137fd6040830184612abb565b949350505050565b60008151905061381481612962565b92915050565b60008060408385031215613831576138306127c9565b5b600061383f85828601613805565b9250506020613850858286016133ef565b9150509250929050565b7f7a72633230206973206e6f742067617320746f6b656e00000000000000000000600082015250565b6000613890601683612db9565b915061389b8261385a565b602082019050919050565b600060208201905081810360008301526138bf81613883565b9050919050565b7f66656520616d6f756e7420697320686967686572207468616e2074686520616d60008201527f6f756e7400000000000000000000000000000000000000000000000000000000602082015250565b6000613922602483612db9565b915061392d826138c6565b604082019050919050565b6000602082019050818103600083015261395181613915565b9050919050565b600060808201905081810360008301526139728187612c9e565b90506139816020830186612abb565b61398e6040830185612795565b81810360608301526139a081846131ba565b905095945050505050565b60006139b783856132e9565b93506139c483858461289a565b82840190509392505050565b60006139dd8284866139ab565b91508190509392505050565b7f7265766572740000000000000000000000000000000000000000000000000000600082015250565b6000613a1f60068361333c565b9150613a2a826139e9565b600682019050919050565b6000613a4082613a12565b9150819050919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302613aac7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82613a6f565b613ab68683613a6f565b95508019841693508086168417925050509392505050565b6000819050919050565b6000613af3613aee613ae984612ab1565b613ace565b612ab1565b9050919050565b6000819050919050565b613b0d83613ad8565b613b21613b1982613afa565b848454613a7c565b825550505050565b600090565b613b36613b29565b613b41818484613b04565b505050565b5b81811015613b6557613b5a600082613b2e565b600181019050613b47565b5050565b601f821115613baa57613b7b81613a4a565b613b8484613a5f565b81016020851015613b93578190505b613ba7613b9f85613a5f565b830182613b46565b50505b505050565b600082821c905092915050565b6000613bcd60001984600802613baf565b1980831691505092915050565b6000613be68383613bbc565b9150826002028217905092915050565b613bff82612c58565b67ffffffffffffffff811115613c1857613c176127ee565b5b613c2282546133be565b613c2d828285613b69565b600060209050601f831160018114613c605760008415613c4e578287015190505b613c588582613bda565b865550613cc0565b601f198416613c6e86613a4a565b60005b82811015613c9657848901518255600182019150602085019450602081019050613c71565b86831015613cb35784890151613caf601f891682613bbc565b8355505b6001600288020188555050505b505050505050565b7f7769746864726177000000000000000000000000000000000000000000000000600082015250565b6000613cfe60088361333c565b9150613d0982613cc8565b600882019050919050565b6000613d1f82613cf1565b915081905091905056fea264697066735822122029b5fc4000ab75b22ee672153db2ff3d63b2c1bdd895e864bec6a5fcfa58327864736f6c634300081a0033", } // TestDAppV2ABI is the input ABI used to generate the binding from. diff --git a/e2e/contracts/testdappv2/TestDAppV2.json b/e2e/contracts/testdappv2/TestDAppV2.json index f9bf1eb2eb..fc48f53744 100644 --- a/e2e/contracts/testdappv2/TestDAppV2.json +++ b/e2e/contracts/testdappv2/TestDAppV2.json @@ -520,5 +520,5 @@ "type": "receive" } ], - "bin": "60c060405234801561001057600080fd5b50604051613a2a380380613a2a83398181016040528101906100329190610114565b8115156080811515815250508073ffffffffffffffffffffffffffffffffffffffff1660a08173ffffffffffffffffffffffffffffffffffffffff16815250505050610154565b600080fd5b60008115159050919050565b6100938161007e565b811461009e57600080fd5b50565b6000815190506100b08161008a565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006100e1826100b6565b9050919050565b6100f1816100d6565b81146100fc57600080fd5b50565b60008151905061010e816100e8565b92915050565b6000806040838503121561012b5761012a610079565b5b6000610139858286016100a1565b925050602061014a858286016100ff565b9150509250929050565b60805160a0516138256102056000396000818161057a015281816105f301528181610a5301528181610b0201528181610b8501528181610c8801528181610e0601528181610f5301528181611002015281816111100152818161122d01528181611a1c01528181611b1c0152611c570152600081816105c801528181610a2601528181610ddb01528181610f26015281816114de015281816119bd015281816119e10152611c2c01526138256000f3fe60806040526004361061014f5760003560e01c8063ad23b28b116100b6578063deb3b1e41161006f578063deb3b1e41461044c578063e2842ed714610468578063ebf9b2aa146104a5578063ef800367146104c1578063f592cbfb146104fe578063f936ae851461053b57610156565b8063ad23b28b1461034b578063c7a339a914610388578063c85f8434146103b1578063c9028a36146103dc578063c91f356714610405578063d2b48ff21461043057610156565b8063740e2f6311610108578063740e2f63146102615780638cc1a2e81461029e5780639291fe26146102ba5780639ca016ed146102f7578063a799911f14610313578063a93abe6c1461032f57610156565b8063116191b61461015b57806336e980a01461018657806341a3cd4a146101af5780634297a263146101d85780635bcfd61614610215578063676cc0541461023157610156565b3661015657005b600080fd5b34801561016757600080fd5b50610170610578565b60405161017d919061226a565b60405180910390f35b34801561019257600080fd5b506101ad60048036038101906101a891906123df565b61059c565b005b3480156101bb57600080fd5b506101d660048036038101906101d191906124b4565b6105c6565b005b3480156101e457600080fd5b506101ff60048036038101906101fa919061254a565b6106ed565b60405161020c9190612590565b60405180910390f35b61022f600480360381019061022a91906125fb565b610705565b005b61024b600480360381019061024691906126be565b610847565b604051610258919061279d565b60405180910390f35b34801561026d57600080fd5b50610288600480360381019061028391906123df565b610959565b604051610295919061279d565b60405180910390f35b6102b860048036038101906102b391906127bf565b610a24565b005b3480156102c657600080fd5b506102e160048036038101906102dc91906123df565b610d96565b6040516102ee9190612590565b60405180910390f35b610311600480360381019061030c9190612847565b610dd9565b005b61032d600480360381019061032891906123df565b610efb565b005b610349600480360381019061034491906124b4565b610f24565b005b34801561035757600080fd5b50610372600480360381019061036d9190612847565b61132a565b60405161037f91906128c9565b60405180910390f35b34801561039457600080fd5b506103af60048036038101906103aa9190612929565b61138a565b005b3480156103bd57600080fd5b506103c661143e565b6040516103d391906128c9565b60405180910390f35b3480156103e857600080fd5b5061040360048036038101906103fe91906129b7565b611477565b005b34801561041157600080fd5b5061041a6119bb565b6040516104279190612a1b565b60405180910390f35b61044a60048036038101906104459190612a36565b6119df565b005b610466600480360381019061046191906124b4565b611c2a565b005b34801561047457600080fd5b5061048f600480360381019061048a919061254a565b611d52565b60405161049c9190612a1b565b60405180910390f35b6104bf60048036038101906104ba9190612a76565b611d72565b005b3480156104cd57600080fd5b506104e860048036038101906104e3919061254a565b611eb2565b6040516104f5919061279d565b60405180910390f35b34801561050a57600080fd5b50610525600480360381019061052091906123df565b611f52565b6040516105329190612a1b565b60405180910390f35b34801561054757600080fd5b50610562600480360381019061055d9190612b93565b611fa2565b60405161056f919061226a565b60405180910390f35b7f000000000000000000000000000000000000000000000000000000000000000081565b6105a581611feb565b156105af57600080fd5b6105b881612041565b6105c3816000612095565b50565b7f0000000000000000000000000000000000000000000000000000000000000000156105f157600080fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16631becceb48484846040518060a001604052803373ffffffffffffffffffffffffffffffffffffffff168152602001600015158152602001600073ffffffffffffffffffffffffffffffffffffffff16815260200160405180602001604052806000815250815260200160008152506040518563ffffffff1660e01b81526004016106b69493929190612cf6565b600060405180830381600087803b1580156106d057600080fd5b505af11580156106e4573d6000803e3d6000fd5b50505050505050565b60026020528060005260406000206000915090505481565b61075282828080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050611feb565b1561075c57600080fd5b60008083839050146107b25782828080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050506107ce565b6107cd8660200160208101906107c89190612847565b61132a565b5b90506107d981612041565b6107e38185612095565b61083f818780600001906107f79190612d4c565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050506120d7565b505050505050565b6060600080848490501461089f5783838080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050506108bb565b6108ba8560000160208101906108b59190612847565b61132a565b5b90506108c681612041565b6108d08134612095565b8460000160208101906108e39190612847565b6004826040516108f39190612deb565b908152602001604051809103902060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550604051806020016040528060008152509150509392505050565b606060036000836040516020016109709190612e3e565b604051602081830303815290604052805190602001208152602001908152602001600020805461099f90612e84565b80601f01602080910402602001604051908101604052809291908181526020018280546109cb90612e84565b8015610a185780601f106109ed57610100808354040283529160200191610a18565b820191906000526020600020905b8154815290600101906020018083116109fb57829003601f168201915b50505050509050919050565b7f000000000000000000000000000000000000000000000000000000000000000015610a4f57600080fd5b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663b01072146040518163ffffffff1660e01b81526004016020604051808303816000875af1158015610abe573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ae29190612eca565b90508473ffffffffffffffffffffffffffffffffffffffff1663095ea7b37f0000000000000000000000000000000000000000000000000000000000000000866040518363ffffffff1660e01b8152600401610b3f929190612ef7565b6020604051808303816000875af1158015610b5e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b829190612f4c565b507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663102614b087600287610bcd9190612fd7565b886040518060a001604052803373ffffffffffffffffffffffffffffffffffffffff168152602001600015158152602001600073ffffffffffffffffffffffffffffffffffffffff16815260200160405180602001604052806000815250815260200160008152506040518563ffffffff1660e01b8152600401610c549493929190613008565b600060405180830381600087803b158015610c6e57600080fd5b505af1158015610c82573d6000803e3d6000fd5b505050507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663d09e3b788288600288610cd19190612fd7565b8988886040518060a001604052803373ffffffffffffffffffffffffffffffffffffffff168152602001600015158152602001600073ffffffffffffffffffffffffffffffffffffffff16815260200160405180602001604052806000815250815260200160008152506040518863ffffffff1660e01b8152600401610d5c96959493929190613054565b6000604051808303818588803b158015610d7557600080fd5b505af1158015610d89573d6000803e3d6000fd5b5050505050505050505050565b60006002600083604051602001610dad9190612e3e565b604051602081830303815290604052805190602001208152602001908152602001600020549050919050565b7f000000000000000000000000000000000000000000000000000000000000000015610e0457600080fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663726ac97c34836040518060a001604052803373ffffffffffffffffffffffffffffffffffffffff168152602001600015158152602001600073ffffffffffffffffffffffffffffffffffffffff16815260200160405180602001604052806000815250815260200160008152506040518463ffffffff1660e01b8152600401610ec69291906130b7565b6000604051808303818588803b158015610edf57600080fd5b505af1158015610ef3573d6000803e3d6000fd5b505050505050565b610f0481611feb565b15610f0e57600080fd5b610f1781612041565b610f218134612095565b50565b7f000000000000000000000000000000000000000000000000000000000000000015610f4f57600080fd5b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663b01072146040518163ffffffff1660e01b81526004016020604051808303816000875af1158015610fbe573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fe29190612eca565b90506000600282610ff391906130e7565b34610ffe9190613129565b90507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663282906ed6002836110499190612fd7565b876002856110579190612fd7565b6040518060a001604052803373ffffffffffffffffffffffffffffffffffffffff168152602001600015158152602001600073ffffffffffffffffffffffffffffffffffffffff16815260200160405180602001604052806000815250815260200160008152506040518563ffffffff1660e01b81526004016110dc9392919061315d565b6000604051808303818588803b1580156110f557600080fd5b505af1158015611109573d6000803e3d6000fd5b50505050507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663397e375c836002846111589190612fd7565b611162919061319b565b876002856111709190612fd7565b88886040518060a001604052803373ffffffffffffffffffffffffffffffffffffffff168152602001600015158152602001600073ffffffffffffffffffffffffffffffffffffffff16815260200160405180602001604052806000815250815260200160008152506040518763ffffffff1660e01b81526004016111f99594939291906131cf565b6000604051808303818588803b15801561121257600080fd5b505af1158015611226573d6000803e3d6000fd5b50505050507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16631becceb4838787876040518060a001604052803373ffffffffffffffffffffffffffffffffffffffff168152602001600015158152602001600073ffffffffffffffffffffffffffffffffffffffff16815260200160405180602001604052806000815250815260200160008152506040518663ffffffff1660e01b81526004016112f19493929190612cf6565b6000604051808303818588803b15801561130a57600080fd5b505af115801561131e573d6000803e3d6000fd5b50505050505050505050565b60606040518060400160405280601681526020017f63616c6c65642077697468206e6f206d657373616765000000000000000000008152508260405160200161137492919061326c565b6040516020818303038152906040529050919050565b61139381611feb565b1561139d57600080fd5b8273ffffffffffffffffffffffffffffffffffffffff166323b872dd3330856040518463ffffffff1660e01b81526004016113da93929190613294565b6020604051808303816000875af11580156113f9573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061141d9190612f4c565b61142657600080fd5b61142f81612041565b6114398183612095565b505050565b6040518060400160405280601681526020017f63616c6c65642077697468206e6f206d6573736167650000000000000000000081525081565b6114d281806060019061148a9190612d4c565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050611feb565b156114dc57600080fd5b7f0000000000000000000000000000000000000000000000000000000000000000156118815761150a612122565b61156581806060019061151d9190612d4c565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050612195565b15611880576000808260200160208101906115809190612847565b73ffffffffffffffffffffffffffffffffffffffff1663d9eeebed6040518163ffffffff1660e01b81526004016040805180830381865afa1580156115c9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115ed91906132e0565b915091508260200160208101906116049190612847565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614611671576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116689061336c565b60405180910390fd5b82604001358111156116b8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116af906133fe565b60405180910390fd5b60008184604001356116ca9190613129565b90508360200160208101906116df9190612847565b73ffffffffffffffffffffffffffffffffffffffff1663095ea7b33386604001356040518363ffffffff1660e01b815260040161171d929190612ef7565b6020604051808303816000875af115801561173c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117609190612f4c565b503373ffffffffffffffffffffffffffffffffffffffff16637c0dcb5f8560000160208101906117909190612847565b6040516020016117a0919061226a565b604051602081830303815290604052838760200160208101906117c39190612847565b6040518060a00160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600015158152602001600073ffffffffffffffffffffffffffffffffffffffff16815260200160405180602001604052806000815250815260200160008152506040518563ffffffff1660e01b815260040161184a949392919061341e565b600060405180830381600087803b15801561186457600080fd5b505af1158015611878573d6000803e3d6000fd5b505050505050505b5b6118dc8180606001906118949190612d4c565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050612041565b6119398180606001906118ef9190612d4c565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050506000612095565b80600001602081019061194c9190612847565b600482806060019061195e9190612d4c565b60405161196c929190613496565b908152602001604051809103902060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b7f000000000000000000000000000000000000000000000000000000000000000081565b7f000000000000000000000000000000000000000000000000000000000000000015611a0a57600080fd5b60008134611a189190613129565b90507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663726ac97c600283611a639190612fd7565b856040518060a001604052803373ffffffffffffffffffffffffffffffffffffffff168152602001600015158152602001600073ffffffffffffffffffffffffffffffffffffffff16815260200160405180602001604052806000815250815260200160008152506040518463ffffffff1660e01b8152600401611ae89291906130b7565b6000604051808303818588803b158015611b0157600080fd5b505af1158015611b15573d6000803e3d6000fd5b50505050507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663726ac97c83600284611b649190612fd7565b611b6e919061319b565b856040518060a001604052803373ffffffffffffffffffffffffffffffffffffffff168152602001600015158152602001600073ffffffffffffffffffffffffffffffffffffffff16815260200160405180602001604052806000815250815260200160008152506040518463ffffffff1660e01b8152600401611bf39291906130b7565b6000604051808303818588803b158015611c0c57600080fd5b505af1158015611c20573d6000803e3d6000fd5b5050505050505050565b7f000000000000000000000000000000000000000000000000000000000000000015611c5557600080fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663744b9b8b348585856040518060a001604052803373ffffffffffffffffffffffffffffffffffffffff168152602001600015158152602001600073ffffffffffffffffffffffffffffffffffffffff16815260200160405180602001604052806000815250815260200160008152506040518663ffffffff1660e01b8152600401611d1b9493929190612cf6565b6000604051808303818588803b158015611d3457600080fd5b505af1158015611d48573d6000803e3d6000fd5b5050505050505050565b60016020528060005260406000206000915054906101000a900460ff1681565b611dbf82828080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050611feb565b15611dc957600080fd5b6000808383905014611e1f5782828080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050611e3b565b611e3a846020016020810190611e359190612847565b61132a565b5b9050611e4681612041565b611e508134612095565b611eac81858060000190611e649190612d4c565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050506120d7565b50505050565b60036020528060005260406000206000915090508054611ed190612e84565b80601f0160208091040260200160405190810160405280929190818152602001828054611efd90612e84565b8015611f4a5780601f10611f1f57610100808354040283529160200191611f4a565b820191906000526020600020905b815481529060010190602001808311611f2d57829003601f168201915b505050505081565b60006001600083604051602001611f699190612e3e565b60405160208183030381529060405280519060200120815260200190815260200160002060009054906101000a900460ff169050919050565b6004818051602081018201805184825260208301602085012081835280955050505050506000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000604051602001611ffc906134fb565b60405160208183030381529060405280519060200120826040516020016120239190612e3e565b60405160208183030381529060405280519060200120149050919050565b6001806000836040516020016120579190612e3e565b60405160208183030381529060405280519060200120815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b8060026000846040516020016120ab9190612e3e565b604051602081830303815290604052805190602001208152602001908152602001600020819055505050565b8060036000846040516020016120ed9190612e3e565b604051602081830303815290604052805190602001208152602001908152602001600020908161211d91906136bc565b505050565b60006207a12090506000614e2090506000818361213f9190612fd7565b905060005b818110156121825760008190806001815401808255809150506001900390600052602060002001600090919091909150558080600101915050612144565b5060008061219091906121eb565b505050565b60006040516020016121a6906137da565b60405160208183030381529060405280519060200120826040516020016121cd9190612e3e565b60405160208183030381529060405280519060200120149050919050565b5080546000825590600052602060002090810190612209919061220c565b50565b5b8082111561222557600081600090555060010161220d565b5090565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061225482612229565b9050919050565b61226481612249565b82525050565b600060208201905061227f600083018461225b565b92915050565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6122ec826122a3565b810181811067ffffffffffffffff8211171561230b5761230a6122b4565b5b80604052505050565b600061231e612285565b905061232a82826122e3565b919050565b600067ffffffffffffffff82111561234a576123496122b4565b5b612353826122a3565b9050602081019050919050565b82818337600083830152505050565b600061238261237d8461232f565b612314565b90508281526020810184848401111561239e5761239d61229e565b5b6123a9848285612360565b509392505050565b600082601f8301126123c6576123c5612299565b5b81356123d684826020860161236f565b91505092915050565b6000602082840312156123f5576123f461228f565b5b600082013567ffffffffffffffff81111561241357612412612294565b5b61241f848285016123b1565b91505092915050565b61243181612249565b811461243c57600080fd5b50565b60008135905061244e81612428565b92915050565b600080fd5b600080fd5b60008083601f84011261247457612473612299565b5b8235905067ffffffffffffffff81111561249157612490612454565b5b6020830191508360018202830111156124ad576124ac612459565b5b9250929050565b6000806000604084860312156124cd576124cc61228f565b5b60006124db8682870161243f565b935050602084013567ffffffffffffffff8111156124fc576124fb612294565b5b6125088682870161245e565b92509250509250925092565b6000819050919050565b61252781612514565b811461253257600080fd5b50565b6000813590506125448161251e565b92915050565b6000602082840312156125605761255f61228f565b5b600061256e84828501612535565b91505092915050565b6000819050919050565b61258a81612577565b82525050565b60006020820190506125a56000830184612581565b92915050565b600080fd5b6000606082840312156125c6576125c56125ab565b5b81905092915050565b6125d881612577565b81146125e357600080fd5b50565b6000813590506125f5816125cf565b92915050565b6000806000806000608086880312156126175761261661228f565b5b600086013567ffffffffffffffff81111561263557612634612294565b5b612641888289016125b0565b95505060206126528882890161243f565b9450506040612663888289016125e6565b935050606086013567ffffffffffffffff81111561268457612683612294565b5b6126908882890161245e565b92509250509295509295909350565b6000602082840312156126b5576126b46125ab565b5b81905092915050565b6000806000604084860312156126d7576126d661228f565b5b60006126e58682870161269f565b935050602084013567ffffffffffffffff81111561270657612705612294565b5b6127128682870161245e565b92509250509250925092565b600081519050919050565b600082825260208201905092915050565b60005b8381101561275857808201518184015260208101905061273d565b60008484015250505050565b600061276f8261271e565b6127798185612729565b935061278981856020860161273a565b612792816122a3565b840191505092915050565b600060208201905081810360008301526127b78184612764565b905092915050565b6000806000806000608086880312156127db576127da61228f565b5b60006127e98882890161243f565b95505060206127fa8882890161243f565b945050604061280b888289016125e6565b935050606086013567ffffffffffffffff81111561282c5761282b612294565b5b6128388882890161245e565b92509250509295509295909350565b60006020828403121561285d5761285c61228f565b5b600061286b8482850161243f565b91505092915050565b600081519050919050565b600082825260208201905092915050565b600061289b82612874565b6128a5818561287f565b93506128b581856020860161273a565b6128be816122a3565b840191505092915050565b600060208201905081810360008301526128e38184612890565b905092915050565b60006128f682612249565b9050919050565b612906816128eb565b811461291157600080fd5b50565b600081359050612923816128fd565b92915050565b6000806000606084860312156129425761294161228f565b5b600061295086828701612914565b9350506020612961868287016125e6565b925050604084013567ffffffffffffffff81111561298257612981612294565b5b61298e868287016123b1565b9150509250925092565b6000608082840312156129ae576129ad6125ab565b5b81905092915050565b6000602082840312156129cd576129cc61228f565b5b600082013567ffffffffffffffff8111156129eb576129ea612294565b5b6129f784828501612998565b91505092915050565b60008115159050919050565b612a1581612a00565b82525050565b6000602082019050612a306000830184612a0c565b92915050565b60008060408385031215612a4d57612a4c61228f565b5b6000612a5b8582860161243f565b9250506020612a6c858286016125e6565b9150509250929050565b600080600060408486031215612a8f57612a8e61228f565b5b600084013567ffffffffffffffff811115612aad57612aac612294565b5b612ab9868287016125b0565b935050602084013567ffffffffffffffff811115612ada57612ad9612294565b5b612ae68682870161245e565b92509250509250925092565b600067ffffffffffffffff821115612b0d57612b0c6122b4565b5b612b16826122a3565b9050602081019050919050565b6000612b36612b3184612af2565b612314565b905082815260208101848484011115612b5257612b5161229e565b5b612b5d848285612360565b509392505050565b600082601f830112612b7a57612b79612299565b5b8135612b8a848260208601612b23565b91505092915050565b600060208284031215612ba957612ba861228f565b5b600082013567ffffffffffffffff811115612bc757612bc6612294565b5b612bd384828501612b65565b91505092915050565b6000612be88385612729565b9350612bf5838584612360565b612bfe836122a3565b840190509392505050565b612c1281612249565b82525050565b612c2181612a00565b82525050565b600082825260208201905092915050565b6000612c438261271e565b612c4d8185612c27565b9350612c5d81856020860161273a565b612c66816122a3565b840191505092915050565b612c7a81612577565b82525050565b600060a083016000830151612c986000860182612c09565b506020830151612cab6020860182612c18565b506040830151612cbe6040860182612c09565b5060608301518482036060860152612cd68282612c38565b9150506080830151612ceb6080860182612c71565b508091505092915050565b6000606082019050612d0b600083018761225b565b8181036020830152612d1e818587612bdc565b90508181036040830152612d328184612c80565b905095945050505050565b600080fd5b600080fd5b600080fd5b60008083356001602003843603038112612d6957612d68612d3d565b5b80840192508235915067ffffffffffffffff821115612d8b57612d8a612d42565b5b602083019250600182023603831315612da757612da6612d47565b5b509250929050565b600081905092915050565b6000612dc58261271e565b612dcf8185612daf565b9350612ddf81856020860161273a565b80840191505092915050565b6000612df78284612dba565b915081905092915050565b600081905092915050565b6000612e1882612874565b612e228185612e02565b9350612e3281856020860161273a565b80840191505092915050565b6000612e4a8284612e0d565b915081905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680612e9c57607f821691505b602082108103612eaf57612eae612e55565b5b50919050565b600081519050612ec4816125cf565b92915050565b600060208284031215612ee057612edf61228f565b5b6000612eee84828501612eb5565b91505092915050565b6000604082019050612f0c600083018561225b565b612f196020830184612581565b9392505050565b612f2981612a00565b8114612f3457600080fd5b50565b600081519050612f4681612f20565b92915050565b600060208284031215612f6257612f6161228f565b5b6000612f7084828501612f37565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000612fe282612577565b9150612fed83612577565b925082612ffd57612ffc612f79565b5b828204905092915050565b600060808201905061301d600083018761225b565b61302a6020830186612581565b613037604083018561225b565b81810360608301526130498184612c80565b905095945050505050565b600060a082019050613069600083018961225b565b6130766020830188612581565b613083604083018761225b565b8181036060830152613096818587612bdc565b905081810360808301526130aa8184612c80565b9050979650505050505050565b60006040820190506130cc600083018561225b565b81810360208301526130de8184612c80565b90509392505050565b60006130f282612577565b91506130fd83612577565b925082820261310b81612577565b9150828204841483151761312257613121612fa8565b5b5092915050565b600061313482612577565b915061313f83612577565b925082820390508181111561315757613156612fa8565b5b92915050565b6000606082019050613172600083018661225b565b61317f6020830185612581565b81810360408301526131918184612c80565b9050949350505050565b60006131a682612577565b91506131b183612577565b92508282019050808211156131c9576131c8612fa8565b5b92915050565b60006080820190506131e4600083018861225b565b6131f16020830187612581565b8181036040830152613204818587612bdc565b905081810360608301526132188184612c80565b90509695505050505050565b60008160601b9050919050565b600061323c82613224565b9050919050565b600061324e82613231565b9050919050565b61326661326182612249565b613243565b82525050565b60006132788285612e0d565b91506132848284613255565b6014820191508190509392505050565b60006060820190506132a9600083018661225b565b6132b6602083018561225b565b6132c36040830184612581565b949350505050565b6000815190506132da81612428565b92915050565b600080604083850312156132f7576132f661228f565b5b6000613305858286016132cb565b925050602061331685828601612eb5565b9150509250929050565b7f7a72633230206973206e6f742067617320746f6b656e00000000000000000000600082015250565b600061335660168361287f565b915061336182613320565b602082019050919050565b6000602082019050818103600083015261338581613349565b9050919050565b7f66656520616d6f756e7420697320686967686572207468616e2074686520616d60008201527f6f756e7400000000000000000000000000000000000000000000000000000000602082015250565b60006133e860248361287f565b91506133f38261338c565b604082019050919050565b60006020820190508181036000830152613417816133db565b9050919050565b600060808201905081810360008301526134388187612764565b90506134476020830186612581565b613454604083018561225b565b81810360608301526134668184612c80565b905095945050505050565b600061347d8385612daf565b935061348a838584612360565b82840190509392505050565b60006134a3828486613471565b91508190509392505050565b7f7265766572740000000000000000000000000000000000000000000000000000600082015250565b60006134e5600683612e02565b91506134f0826134af565b600682019050919050565b6000613506826134d8565b9150819050919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026135727fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82613535565b61357c8683613535565b95508019841693508086168417925050509392505050565b6000819050919050565b60006135b96135b46135af84612577565b613594565b612577565b9050919050565b6000819050919050565b6135d38361359e565b6135e76135df826135c0565b848454613542565b825550505050565b600090565b6135fc6135ef565b6136078184846135ca565b505050565b5b8181101561362b576136206000826135f4565b60018101905061360d565b5050565b601f8211156136705761364181613510565b61364a84613525565b81016020851015613659578190505b61366d61366585613525565b83018261360c565b50505b505050565b600082821c905092915050565b600061369360001984600802613675565b1980831691505092915050565b60006136ac8383613682565b9150826002028217905092915050565b6136c58261271e565b67ffffffffffffffff8111156136de576136dd6122b4565b5b6136e88254612e84565b6136f382828561362f565b600060209050601f8311600181146137265760008415613714578287015190505b61371e85826136a0565b865550613786565b601f19841661373486613510565b60005b8281101561375c57848901518255600182019150602085019450602081019050613737565b868310156137795784890151613775601f891682613682565b8355505b6001600288020188555050505b505050505050565b7f7769746864726177000000000000000000000000000000000000000000000000600082015250565b60006137c4600883612e02565b91506137cf8261378e565b600882019050919050565b60006137e5826137b7565b915081905091905056fea264697066735822122002ae685f66be5174e96940fdc7c5741116b962da5e3b6e4d59d5f429edc8ecf464736f6c634300081a0033" + "bin": "60c060405234801561001057600080fd5b50604051613f87380380613f8783398181016040528101906100329190610114565b8115156080811515815250508073ffffffffffffffffffffffffffffffffffffffff1660a08173ffffffffffffffffffffffffffffffffffffffff16815250505050610154565b600080fd5b60008115159050919050565b6100938161007e565b811461009e57600080fd5b50565b6000815190506100b08161008a565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006100e1826100b6565b9050919050565b6100f1816100d6565b81146100fc57600080fd5b50565b60008151905061010e816100e8565b92915050565b6000806040838503121561012b5761012a610079565b5b6000610139858286016100a1565b925050602061014a858286016100ff565b9150509250929050565b60805160a051613d5f6102286000396000818161057a015281816105f301528181610a5301528181610b0201528181610b8501528181610c8801528181610d8c01528181610e94015281816110120152818161115f0152818161120e0152818161131c01528181611435015281816115520152818161166f0152818161176701528181611f560152818161205601526121910152600081816105c801528181610a2601528181610fe70152818161113201528181611a1801528181611ef701528181611f1b01526121660152613d5f6000f3fe60806040526004361061014f5760003560e01c8063ad23b28b116100b6578063deb3b1e41161006f578063deb3b1e41461044c578063e2842ed714610468578063ebf9b2aa146104a5578063ef800367146104c1578063f592cbfb146104fe578063f936ae851461053b57610156565b8063ad23b28b1461034b578063c7a339a914610388578063c85f8434146103b1578063c9028a36146103dc578063c91f356714610405578063d2b48ff21461043057610156565b8063740e2f6311610108578063740e2f63146102615780638cc1a2e81461029e5780639291fe26146102ba5780639ca016ed146102f7578063a799911f14610313578063a93abe6c1461032f57610156565b8063116191b61461015b57806336e980a01461018657806341a3cd4a146101af5780634297a263146101d85780635bcfd61614610215578063676cc0541461023157610156565b3661015657005b600080fd5b34801561016757600080fd5b50610170610578565b60405161017d91906127a4565b60405180910390f35b34801561019257600080fd5b506101ad60048036038101906101a89190612919565b61059c565b005b3480156101bb57600080fd5b506101d660048036038101906101d191906129ee565b6105c6565b005b3480156101e457600080fd5b506101ff60048036038101906101fa9190612a84565b6106ed565b60405161020c9190612aca565b60405180910390f35b61022f600480360381019061022a9190612b35565b610705565b005b61024b60048036038101906102469190612bf8565b610847565b6040516102589190612cd7565b60405180910390f35b34801561026d57600080fd5b5061028860048036038101906102839190612919565b610959565b6040516102959190612cd7565b60405180910390f35b6102b860048036038101906102b39190612cf9565b610a24565b005b3480156102c657600080fd5b506102e160048036038101906102dc9190612919565b610fa2565b6040516102ee9190612aca565b60405180910390f35b610311600480360381019061030c9190612d81565b610fe5565b005b61032d60048036038101906103289190612919565b611107565b005b610349600480360381019061034491906129ee565b611130565b005b34801561035757600080fd5b50610372600480360381019061036d9190612d81565b611864565b60405161037f9190612e03565b60405180910390f35b34801561039457600080fd5b506103af60048036038101906103aa9190612e63565b6118c4565b005b3480156103bd57600080fd5b506103c6611978565b6040516103d39190612e03565b60405180910390f35b3480156103e857600080fd5b5061040360048036038101906103fe9190612ef1565b6119b1565b005b34801561041157600080fd5b5061041a611ef5565b6040516104279190612f55565b60405180910390f35b61044a60048036038101906104459190612f70565b611f19565b005b610466600480360381019061046191906129ee565b612164565b005b34801561047457600080fd5b5061048f600480360381019061048a9190612a84565b61228c565b60405161049c9190612f55565b60405180910390f35b6104bf60048036038101906104ba9190612fb0565b6122ac565b005b3480156104cd57600080fd5b506104e860048036038101906104e39190612a84565b6123ec565b6040516104f59190612cd7565b60405180910390f35b34801561050a57600080fd5b5061052560048036038101906105209190612919565b61248c565b6040516105329190612f55565b60405180910390f35b34801561054757600080fd5b50610562600480360381019061055d91906130cd565b6124dc565b60405161056f91906127a4565b60405180910390f35b7f000000000000000000000000000000000000000000000000000000000000000081565b6105a581612525565b156105af57600080fd5b6105b88161257b565b6105c38160006125cf565b50565b7f0000000000000000000000000000000000000000000000000000000000000000156105f157600080fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16631becceb48484846040518060a001604052803373ffffffffffffffffffffffffffffffffffffffff168152602001600015158152602001600073ffffffffffffffffffffffffffffffffffffffff16815260200160405180602001604052806000815250815260200160008152506040518563ffffffff1660e01b81526004016106b69493929190613230565b600060405180830381600087803b1580156106d057600080fd5b505af11580156106e4573d6000803e3d6000fd5b50505050505050565b60026020528060005260406000206000915090505481565b61075282828080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050612525565b1561075c57600080fd5b60008083839050146107b25782828080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050506107ce565b6107cd8660200160208101906107c89190612d81565b611864565b5b90506107d98161257b565b6107e381856125cf565b61083f818780600001906107f79190613286565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050612611565b505050505050565b6060600080848490501461089f5783838080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050506108bb565b6108ba8560000160208101906108b59190612d81565b611864565b5b90506108c68161257b565b6108d081346125cf565b8460000160208101906108e39190612d81565b6004826040516108f39190613325565b908152602001604051809103902060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550604051806020016040528060008152509150509392505050565b606060036000836040516020016109709190613378565b604051602081830303815290604052805190602001208152602001908152602001600020805461099f906133be565b80601f01602080910402602001604051908101604052809291908181526020018280546109cb906133be565b8015610a185780601f106109ed57610100808354040283529160200191610a18565b820191906000526020600020905b8154815290600101906020018083116109fb57829003601f168201915b50505050509050919050565b7f000000000000000000000000000000000000000000000000000000000000000015610a4f57600080fd5b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663b01072146040518163ffffffff1660e01b81526004016020604051808303816000875af1158015610abe573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ae29190613404565b90508473ffffffffffffffffffffffffffffffffffffffff1663095ea7b37f0000000000000000000000000000000000000000000000000000000000000000866040518363ffffffff1660e01b8152600401610b3f929190613431565b6020604051808303816000875af1158015610b5e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b829190613486565b507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663102614b087600487610bcd9190613511565b886040518060a001604052803373ffffffffffffffffffffffffffffffffffffffff168152602001600015158152602001600073ffffffffffffffffffffffffffffffffffffffff16815260200160405180602001604052806000815250815260200160008152506040518563ffffffff1660e01b8152600401610c549493929190613542565b600060405180830381600087803b158015610c6e57600080fd5b505af1158015610c82573d6000803e3d6000fd5b505050507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663102614b08288600488610cd19190613511565b896040518060a001604052803373ffffffffffffffffffffffffffffffffffffffff168152602001600015158152602001600073ffffffffffffffffffffffffffffffffffffffff16815260200160405180602001604052806000815250815260200160008152506040518663ffffffff1660e01b8152600401610d589493929190613542565b6000604051808303818588803b158015610d7157600080fd5b505af1158015610d85573d6000803e3d6000fd5b50505050507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663d09e3b788288600488610dd59190613511565b8988886040518060a001604052803373ffffffffffffffffffffffffffffffffffffffff168152602001600015158152602001600073ffffffffffffffffffffffffffffffffffffffff16815260200160405180602001604052806000815250815260200160008152506040518863ffffffff1660e01b8152600401610e609695949392919061358e565b6000604051808303818588803b158015610e7957600080fd5b505af1158015610e8d573d6000803e3d6000fd5b50505050507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663d09e3b788288600488610edd9190613511565b8988886040518060a001604052803373ffffffffffffffffffffffffffffffffffffffff168152602001600015158152602001600073ffffffffffffffffffffffffffffffffffffffff16815260200160405180602001604052806000815250815260200160008152506040518863ffffffff1660e01b8152600401610f689695949392919061358e565b6000604051808303818588803b158015610f8157600080fd5b505af1158015610f95573d6000803e3d6000fd5b5050505050505050505050565b60006002600083604051602001610fb99190613378565b604051602081830303815290604052805190602001208152602001908152602001600020549050919050565b7f00000000000000000000000000000000000000000000000000000000000000001561101057600080fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663726ac97c34836040518060a001604052803373ffffffffffffffffffffffffffffffffffffffff168152602001600015158152602001600073ffffffffffffffffffffffffffffffffffffffff16815260200160405180602001604052806000815250815260200160008152506040518463ffffffff1660e01b81526004016110d29291906135f1565b6000604051808303818588803b1580156110eb57600080fd5b505af11580156110ff573d6000803e3d6000fd5b505050505050565b61111081612525565b1561111a57600080fd5b6111238161257b565b61112d81346125cf565b50565b7f00000000000000000000000000000000000000000000000000000000000000001561115b57600080fd5b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663b01072146040518163ffffffff1660e01b81526004016020604051808303816000875af11580156111ca573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111ee9190613404565b905060006005826111ff9190613621565b3461120a9190613663565b90507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663282906ed6004836112559190613511565b876004856112639190613511565b6040518060a001604052803373ffffffffffffffffffffffffffffffffffffffff168152602001600015158152602001600073ffffffffffffffffffffffffffffffffffffffff16815260200160405180602001604052806000815250815260200160008152506040518563ffffffff1660e01b81526004016112e893929190613697565b6000604051808303818588803b15801561130157600080fd5b505af1158015611315573d6000803e3d6000fd5b50505050507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663282906ed836004846113649190613511565b61136e91906136d5565b8760048561137c9190613511565b6040518060a001604052803373ffffffffffffffffffffffffffffffffffffffff168152602001600015158152602001600073ffffffffffffffffffffffffffffffffffffffff16815260200160405180602001604052806000815250815260200160008152506040518563ffffffff1660e01b815260040161140193929190613697565b6000604051808303818588803b15801561141a57600080fd5b505af115801561142e573d6000803e3d6000fd5b50505050507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663397e375c8360048461147d9190613511565b61148791906136d5565b876004856114959190613511565b88886040518060a001604052803373ffffffffffffffffffffffffffffffffffffffff168152602001600015158152602001600073ffffffffffffffffffffffffffffffffffffffff16815260200160405180602001604052806000815250815260200160008152506040518763ffffffff1660e01b815260040161151e959493929190613709565b6000604051808303818588803b15801561153757600080fd5b505af115801561154b573d6000803e3d6000fd5b50505050507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663397e375c8360048461159a9190613511565b6115a491906136d5565b876004856115b29190613511565b88886040518060a001604052803373ffffffffffffffffffffffffffffffffffffffff168152602001600015158152602001600073ffffffffffffffffffffffffffffffffffffffff16815260200160405180602001604052806000815250815260200160008152506040518763ffffffff1660e01b815260040161163b959493929190613709565b6000604051808303818588803b15801561165457600080fd5b505af1158015611668573d6000803e3d6000fd5b50505050507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16631becceb4838787876040518060a001604052803373ffffffffffffffffffffffffffffffffffffffff168152602001600015158152602001600073ffffffffffffffffffffffffffffffffffffffff16815260200160405180602001604052806000815250815260200160008152506040518663ffffffff1660e01b81526004016117339493929190613230565b6000604051808303818588803b15801561174c57600080fd5b505af1158015611760573d6000803e3d6000fd5b50505050507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16631becceb4838787876040518060a001604052803373ffffffffffffffffffffffffffffffffffffffff168152602001600015158152602001600073ffffffffffffffffffffffffffffffffffffffff16815260200160405180602001604052806000815250815260200160008152506040518663ffffffff1660e01b815260040161182b9493929190613230565b6000604051808303818588803b15801561184457600080fd5b505af1158015611858573d6000803e3d6000fd5b50505050505050505050565b60606040518060400160405280601681526020017f63616c6c65642077697468206e6f206d65737361676500000000000000000000815250826040516020016118ae9291906137a6565b6040516020818303038152906040529050919050565b6118cd81612525565b156118d757600080fd5b8273ffffffffffffffffffffffffffffffffffffffff166323b872dd3330856040518463ffffffff1660e01b8152600401611914939291906137ce565b6020604051808303816000875af1158015611933573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119579190613486565b61196057600080fd5b6119698161257b565b61197381836125cf565b505050565b6040518060400160405280601681526020017f63616c6c65642077697468206e6f206d6573736167650000000000000000000081525081565b611a0c8180606001906119c49190613286565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050612525565b15611a1657600080fd5b7f000000000000000000000000000000000000000000000000000000000000000015611dbb57611a4461265c565b611a9f818060600190611a579190613286565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050506126cf565b15611dba57600080826020016020810190611aba9190612d81565b73ffffffffffffffffffffffffffffffffffffffff1663d9eeebed6040518163ffffffff1660e01b81526004016040805180830381865afa158015611b03573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b27919061381a565b91509150826020016020810190611b3e9190612d81565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614611bab576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ba2906138a6565b60405180910390fd5b8260400135811115611bf2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611be990613938565b60405180910390fd5b6000818460400135611c049190613663565b9050836020016020810190611c199190612d81565b73ffffffffffffffffffffffffffffffffffffffff1663095ea7b33386604001356040518363ffffffff1660e01b8152600401611c57929190613431565b6020604051808303816000875af1158015611c76573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c9a9190613486565b503373ffffffffffffffffffffffffffffffffffffffff16637c0dcb5f856000016020810190611cca9190612d81565b604051602001611cda91906127a4565b60405160208183030381529060405283876020016020810190611cfd9190612d81565b6040518060a00160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600015158152602001600073ffffffffffffffffffffffffffffffffffffffff16815260200160405180602001604052806000815250815260200160008152506040518563ffffffff1660e01b8152600401611d849493929190613958565b600060405180830381600087803b158015611d9e57600080fd5b505af1158015611db2573d6000803e3d6000fd5b505050505050505b5b611e16818060600190611dce9190613286565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505061257b565b611e73818060600190611e299190613286565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505060006125cf565b806000016020810190611e869190612d81565b6004828060600190611e989190613286565b604051611ea69291906139d0565b908152602001604051809103902060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b7f000000000000000000000000000000000000000000000000000000000000000081565b7f000000000000000000000000000000000000000000000000000000000000000015611f4457600080fd5b60008134611f529190613663565b90507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663726ac97c600283611f9d9190613511565b856040518060a001604052803373ffffffffffffffffffffffffffffffffffffffff168152602001600015158152602001600073ffffffffffffffffffffffffffffffffffffffff16815260200160405180602001604052806000815250815260200160008152506040518463ffffffff1660e01b81526004016120229291906135f1565b6000604051808303818588803b15801561203b57600080fd5b505af115801561204f573d6000803e3d6000fd5b50505050507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663726ac97c8360028461209e9190613511565b6120a891906136d5565b856040518060a001604052803373ffffffffffffffffffffffffffffffffffffffff168152602001600015158152602001600073ffffffffffffffffffffffffffffffffffffffff16815260200160405180602001604052806000815250815260200160008152506040518463ffffffff1660e01b815260040161212d9291906135f1565b6000604051808303818588803b15801561214657600080fd5b505af115801561215a573d6000803e3d6000fd5b5050505050505050565b7f00000000000000000000000000000000000000000000000000000000000000001561218f57600080fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663744b9b8b348585856040518060a001604052803373ffffffffffffffffffffffffffffffffffffffff168152602001600015158152602001600073ffffffffffffffffffffffffffffffffffffffff16815260200160405180602001604052806000815250815260200160008152506040518663ffffffff1660e01b81526004016122559493929190613230565b6000604051808303818588803b15801561226e57600080fd5b505af1158015612282573d6000803e3d6000fd5b5050505050505050565b60016020528060005260406000206000915054906101000a900460ff1681565b6122f982828080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050612525565b1561230357600080fd5b60008083839050146123595782828080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050612375565b61237484602001602081019061236f9190612d81565b611864565b5b90506123808161257b565b61238a81346125cf565b6123e68185806000019061239e9190613286565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050612611565b50505050565b6003602052806000526040600020600091509050805461240b906133be565b80601f0160208091040260200160405190810160405280929190818152602001828054612437906133be565b80156124845780601f1061245957610100808354040283529160200191612484565b820191906000526020600020905b81548152906001019060200180831161246757829003601f168201915b505050505081565b600060016000836040516020016124a39190613378565b60405160208183030381529060405280519060200120815260200190815260200160002060009054906101000a900460ff169050919050565b6004818051602081018201805184825260208301602085012081835280955050505050506000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600060405160200161253690613a35565b604051602081830303815290604052805190602001208260405160200161255d9190613378565b60405160208183030381529060405280519060200120149050919050565b6001806000836040516020016125919190613378565b60405160208183030381529060405280519060200120815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b8060026000846040516020016125e59190613378565b604051602081830303815290604052805190602001208152602001908152602001600020819055505050565b8060036000846040516020016126279190613378565b60405160208183030381529060405280519060200120815260200190815260200160002090816126579190613bf6565b505050565b60006207a12090506000614e209050600081836126799190613511565b905060005b818110156126bc576000819080600181540180825580915050600190039060005260206000200160009091909190915055808060010191505061267e565b506000806126ca9190612725565b505050565b60006040516020016126e090613d14565b60405160208183030381529060405280519060200120826040516020016127079190613378565b60405160208183030381529060405280519060200120149050919050565b50805460008255906000526020600020908101906127439190612746565b50565b5b8082111561275f576000816000905550600101612747565b5090565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061278e82612763565b9050919050565b61279e81612783565b82525050565b60006020820190506127b96000830184612795565b92915050565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b612826826127dd565b810181811067ffffffffffffffff82111715612845576128446127ee565b5b80604052505050565b60006128586127bf565b9050612864828261281d565b919050565b600067ffffffffffffffff821115612884576128836127ee565b5b61288d826127dd565b9050602081019050919050565b82818337600083830152505050565b60006128bc6128b784612869565b61284e565b9050828152602081018484840111156128d8576128d76127d8565b5b6128e384828561289a565b509392505050565b600082601f830112612900576128ff6127d3565b5b81356129108482602086016128a9565b91505092915050565b60006020828403121561292f5761292e6127c9565b5b600082013567ffffffffffffffff81111561294d5761294c6127ce565b5b612959848285016128eb565b91505092915050565b61296b81612783565b811461297657600080fd5b50565b60008135905061298881612962565b92915050565b600080fd5b600080fd5b60008083601f8401126129ae576129ad6127d3565b5b8235905067ffffffffffffffff8111156129cb576129ca61298e565b5b6020830191508360018202830111156129e7576129e6612993565b5b9250929050565b600080600060408486031215612a0757612a066127c9565b5b6000612a1586828701612979565b935050602084013567ffffffffffffffff811115612a3657612a356127ce565b5b612a4286828701612998565b92509250509250925092565b6000819050919050565b612a6181612a4e565b8114612a6c57600080fd5b50565b600081359050612a7e81612a58565b92915050565b600060208284031215612a9a57612a996127c9565b5b6000612aa884828501612a6f565b91505092915050565b6000819050919050565b612ac481612ab1565b82525050565b6000602082019050612adf6000830184612abb565b92915050565b600080fd5b600060608284031215612b0057612aff612ae5565b5b81905092915050565b612b1281612ab1565b8114612b1d57600080fd5b50565b600081359050612b2f81612b09565b92915050565b600080600080600060808688031215612b5157612b506127c9565b5b600086013567ffffffffffffffff811115612b6f57612b6e6127ce565b5b612b7b88828901612aea565b9550506020612b8c88828901612979565b9450506040612b9d88828901612b20565b935050606086013567ffffffffffffffff811115612bbe57612bbd6127ce565b5b612bca88828901612998565b92509250509295509295909350565b600060208284031215612bef57612bee612ae5565b5b81905092915050565b600080600060408486031215612c1157612c106127c9565b5b6000612c1f86828701612bd9565b935050602084013567ffffffffffffffff811115612c4057612c3f6127ce565b5b612c4c86828701612998565b92509250509250925092565b600081519050919050565b600082825260208201905092915050565b60005b83811015612c92578082015181840152602081019050612c77565b60008484015250505050565b6000612ca982612c58565b612cb38185612c63565b9350612cc3818560208601612c74565b612ccc816127dd565b840191505092915050565b60006020820190508181036000830152612cf18184612c9e565b905092915050565b600080600080600060808688031215612d1557612d146127c9565b5b6000612d2388828901612979565b9550506020612d3488828901612979565b9450506040612d4588828901612b20565b935050606086013567ffffffffffffffff811115612d6657612d656127ce565b5b612d7288828901612998565b92509250509295509295909350565b600060208284031215612d9757612d966127c9565b5b6000612da584828501612979565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000612dd582612dae565b612ddf8185612db9565b9350612def818560208601612c74565b612df8816127dd565b840191505092915050565b60006020820190508181036000830152612e1d8184612dca565b905092915050565b6000612e3082612783565b9050919050565b612e4081612e25565b8114612e4b57600080fd5b50565b600081359050612e5d81612e37565b92915050565b600080600060608486031215612e7c57612e7b6127c9565b5b6000612e8a86828701612e4e565b9350506020612e9b86828701612b20565b925050604084013567ffffffffffffffff811115612ebc57612ebb6127ce565b5b612ec8868287016128eb565b9150509250925092565b600060808284031215612ee857612ee7612ae5565b5b81905092915050565b600060208284031215612f0757612f066127c9565b5b600082013567ffffffffffffffff811115612f2557612f246127ce565b5b612f3184828501612ed2565b91505092915050565b60008115159050919050565b612f4f81612f3a565b82525050565b6000602082019050612f6a6000830184612f46565b92915050565b60008060408385031215612f8757612f866127c9565b5b6000612f9585828601612979565b9250506020612fa685828601612b20565b9150509250929050565b600080600060408486031215612fc957612fc86127c9565b5b600084013567ffffffffffffffff811115612fe757612fe66127ce565b5b612ff386828701612aea565b935050602084013567ffffffffffffffff811115613014576130136127ce565b5b61302086828701612998565b92509250509250925092565b600067ffffffffffffffff821115613047576130466127ee565b5b613050826127dd565b9050602081019050919050565b600061307061306b8461302c565b61284e565b90508281526020810184848401111561308c5761308b6127d8565b5b61309784828561289a565b509392505050565b600082601f8301126130b4576130b36127d3565b5b81356130c484826020860161305d565b91505092915050565b6000602082840312156130e3576130e26127c9565b5b600082013567ffffffffffffffff811115613101576131006127ce565b5b61310d8482850161309f565b91505092915050565b60006131228385612c63565b935061312f83858461289a565b613138836127dd565b840190509392505050565b61314c81612783565b82525050565b61315b81612f3a565b82525050565b600082825260208201905092915050565b600061317d82612c58565b6131878185613161565b9350613197818560208601612c74565b6131a0816127dd565b840191505092915050565b6131b481612ab1565b82525050565b600060a0830160008301516131d26000860182613143565b5060208301516131e56020860182613152565b5060408301516131f86040860182613143565b50606083015184820360608601526132108282613172565b915050608083015161322560808601826131ab565b508091505092915050565b60006060820190506132456000830187612795565b8181036020830152613258818587613116565b9050818103604083015261326c81846131ba565b905095945050505050565b600080fd5b600080fd5b600080fd5b600080833560016020038436030381126132a3576132a2613277565b5b80840192508235915067ffffffffffffffff8211156132c5576132c461327c565b5b6020830192506001820236038313156132e1576132e0613281565b5b509250929050565b600081905092915050565b60006132ff82612c58565b61330981856132e9565b9350613319818560208601612c74565b80840191505092915050565b600061333182846132f4565b915081905092915050565b600081905092915050565b600061335282612dae565b61335c818561333c565b935061336c818560208601612c74565b80840191505092915050565b60006133848284613347565b915081905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806133d657607f821691505b6020821081036133e9576133e861338f565b5b50919050565b6000815190506133fe81612b09565b92915050565b60006020828403121561341a576134196127c9565b5b6000613428848285016133ef565b91505092915050565b60006040820190506134466000830185612795565b6134536020830184612abb565b9392505050565b61346381612f3a565b811461346e57600080fd5b50565b6000815190506134808161345a565b92915050565b60006020828403121561349c5761349b6127c9565b5b60006134aa84828501613471565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061351c82612ab1565b915061352783612ab1565b925082613537576135366134b3565b5b828204905092915050565b60006080820190506135576000830187612795565b6135646020830186612abb565b6135716040830185612795565b818103606083015261358381846131ba565b905095945050505050565b600060a0820190506135a36000830189612795565b6135b06020830188612abb565b6135bd6040830187612795565b81810360608301526135d0818587613116565b905081810360808301526135e481846131ba565b9050979650505050505050565b60006040820190506136066000830185612795565b818103602083015261361881846131ba565b90509392505050565b600061362c82612ab1565b915061363783612ab1565b925082820261364581612ab1565b9150828204841483151761365c5761365b6134e2565b5b5092915050565b600061366e82612ab1565b915061367983612ab1565b9250828203905081811115613691576136906134e2565b5b92915050565b60006060820190506136ac6000830186612795565b6136b96020830185612abb565b81810360408301526136cb81846131ba565b9050949350505050565b60006136e082612ab1565b91506136eb83612ab1565b9250828201905080821115613703576137026134e2565b5b92915050565b600060808201905061371e6000830188612795565b61372b6020830187612abb565b818103604083015261373e818587613116565b9050818103606083015261375281846131ba565b90509695505050505050565b60008160601b9050919050565b60006137768261375e565b9050919050565b60006137888261376b565b9050919050565b6137a061379b82612783565b61377d565b82525050565b60006137b28285613347565b91506137be828461378f565b6014820191508190509392505050565b60006060820190506137e36000830186612795565b6137f06020830185612795565b6137fd6040830184612abb565b949350505050565b60008151905061381481612962565b92915050565b60008060408385031215613831576138306127c9565b5b600061383f85828601613805565b9250506020613850858286016133ef565b9150509250929050565b7f7a72633230206973206e6f742067617320746f6b656e00000000000000000000600082015250565b6000613890601683612db9565b915061389b8261385a565b602082019050919050565b600060208201905081810360008301526138bf81613883565b9050919050565b7f66656520616d6f756e7420697320686967686572207468616e2074686520616d60008201527f6f756e7400000000000000000000000000000000000000000000000000000000602082015250565b6000613922602483612db9565b915061392d826138c6565b604082019050919050565b6000602082019050818103600083015261395181613915565b9050919050565b600060808201905081810360008301526139728187612c9e565b90506139816020830186612abb565b61398e6040830185612795565b81810360608301526139a081846131ba565b905095945050505050565b60006139b783856132e9565b93506139c483858461289a565b82840190509392505050565b60006139dd8284866139ab565b91508190509392505050565b7f7265766572740000000000000000000000000000000000000000000000000000600082015250565b6000613a1f60068361333c565b9150613a2a826139e9565b600682019050919050565b6000613a4082613a12565b9150819050919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302613aac7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82613a6f565b613ab68683613a6f565b95508019841693508086168417925050509392505050565b6000819050919050565b6000613af3613aee613ae984612ab1565b613ace565b612ab1565b9050919050565b6000819050919050565b613b0d83613ad8565b613b21613b1982613afa565b848454613a7c565b825550505050565b600090565b613b36613b29565b613b41818484613b04565b505050565b5b81811015613b6557613b5a600082613b2e565b600181019050613b47565b5050565b601f821115613baa57613b7b81613a4a565b613b8484613a5f565b81016020851015613b93578190505b613ba7613b9f85613a5f565b830182613b46565b50505b505050565b600082821c905092915050565b6000613bcd60001984600802613baf565b1980831691505092915050565b6000613be68383613bbc565b9150826002028217905092915050565b613bff82612c58565b67ffffffffffffffff811115613c1857613c176127ee565b5b613c2282546133be565b613c2d828285613b69565b600060209050601f831160018114613c605760008415613c4e578287015190505b613c588582613bda565b865550613cc0565b601f198416613c6e86613a4a565b60005b82811015613c9657848901518255600182019150602085019450602081019050613c71565b86831015613cb35784890151613caf601f891682613bbc565b8355505b6001600288020188555050505b505050505050565b7f7769746864726177000000000000000000000000000000000000000000000000600082015250565b6000613cfe60088361333c565b9150613d0982613cc8565b600882019050919050565b6000613d1f82613cf1565b915081905091905056fea264697066735822122029b5fc4000ab75b22ee672153db2ff3d63b2c1bdd895e864bec6a5fcfa58327864736f6c634300081a0033" } diff --git a/e2e/contracts/testdappv2/TestDAppV2.sol b/e2e/contracts/testdappv2/TestDAppV2.sol index bcf375f39f..60e295a64a 100644 --- a/e2e/contracts/testdappv2/TestDAppV2.sol +++ b/e2e/contracts/testdappv2/TestDAppV2.sol @@ -269,16 +269,21 @@ contract TestDAppV2 { function gatewayMultipleDeposits(address dst, bytes calldata payload) external payable { require(!isZetaChain); uint256 additionalFee = IGatewayEVM(gateway).additionalActionFeeWei(); - // substract 2 fees from msg.value - uint256 amount = msg.value - additionalFee * 2; + // substract 5 fees from msg.value + uint256 amount = msg.value - additionalFee * 5; // initial free deposit - IGatewayEVM(gateway).deposit{value: amount / 2 }(dst, amount / 2, RevertOptions(msg.sender, false, address(0), "", 0)); + IGatewayEVM(gateway).deposit{value: amount / 4 }(dst, amount / 4, RevertOptions(msg.sender, false, address(0), "", 0)); + + // eth deposit with additional fee + IGatewayEVM(gateway).deposit{value: amount / 4 + additionalFee }(dst, amount / 4, RevertOptions(msg.sender, false, address(0), "", 0)); - // eth deposit and call with additional fee - IGatewayEVM(gateway).depositAndCall{value: amount / 2 + additionalFee }(dst, amount / 2, payload, RevertOptions(msg.sender, false, address(0), "", 0)); + // 2 eth deposit and call with additional fee + IGatewayEVM(gateway).depositAndCall{value: amount / 4 + additionalFee }(dst, amount / 4, payload, RevertOptions(msg.sender, false, address(0), "", 0)); + IGatewayEVM(gateway).depositAndCall{value: amount / 4 + additionalFee }(dst, amount / 4, payload, RevertOptions(msg.sender, false, address(0), "", 0)); - // call with additional fee + // 2 calls with additional fee + IGatewayEVM(gateway).call{value: additionalFee}(dst, payload, RevertOptions(msg.sender, false, address(0), "", 0)); IGatewayEVM(gateway).call{value: additionalFee}(dst, payload, RevertOptions(msg.sender, false, address(0), "", 0)); } @@ -288,10 +293,14 @@ contract TestDAppV2 { IZRC20(asset).approve(gateway, assetAmount); // initial free deposit - IGatewayEVM(gateway).deposit(dst, assetAmount / 2, asset, RevertOptions(msg.sender, false, address(0), "", 0)); - - // erc20 deposits with additional fee - IGatewayEVM(gateway).depositAndCall{ value: additionalFee }(dst, assetAmount / 2, asset, payload, RevertOptions(msg.sender, false, address(0), "", 0)); + IGatewayEVM(gateway).deposit(dst, assetAmount / 4, asset, RevertOptions(msg.sender, false, address(0), "", 0)); + + // deposit with additional fee + IGatewayEVM(gateway).deposit{ value: additionalFee }(dst, assetAmount / 4, asset, RevertOptions(msg.sender, false, address(0), "", 0)); + + // 2 erc20 deposits with additional fee + IGatewayEVM(gateway).depositAndCall{ value: additionalFee }(dst, assetAmount / 4, asset, payload, RevertOptions(msg.sender, false, address(0), "", 0)); + IGatewayEVM(gateway).depositAndCall{ value: additionalFee }(dst, assetAmount / 4, asset, payload, RevertOptions(msg.sender, false, address(0), "", 0)); } function gatewayMultipleDepositsLegacy(address dst, uint256 fee) external payable { diff --git a/e2e/e2etests/test_erc20_multiple_deposits.go b/e2e/e2etests/test_erc20_multiple_deposits.go index e6b0339066..918f1153be 100644 --- a/e2e/e2etests/test_erc20_multiple_deposits.go +++ b/e2e/e2etests/test_erc20_multiple_deposits.go @@ -1,6 +1,8 @@ package e2etests import ( + "math/big" + "github.com/ethereum/go-ethereum/accounts/abi/bind" "github.com/stretchr/testify/require" @@ -29,8 +31,8 @@ func TestERC20MultipleDeposits(r *runner.E2ERunner, args []string) { fee, err := r.GatewayEVM.AdditionalActionFeeWei(nil) require.NoError(r, err) - // use 1 fee as amount to pay for 2 inbounds (1st one is free) - r.EVMAuth.Value = fee + // use 3 * fee as amount to pay for 4 inbounds (1st one is free) + r.EVMAuth.Value = new(big.Int).Mul(fee, big.NewInt(3)) defer func() { r.EVMAuth.Value = previousValue }() @@ -47,12 +49,16 @@ func TestERC20MultipleDeposits(r *runner.E2ERunner, args []string) { r.WaitForTxReceiptOnEVM(tx) // wait for the cctxs to be mined - cctxs := utils.WaitCctxsMinedByInboundHash(r.Ctx, tx.Hash().Hex(), r.CctxClient, 2, r.Logger, r.CctxTimeout) + cctxs := utils.WaitCctxsMinedByInboundHash(r.Ctx, tx.Hash().Hex(), r.CctxClient, 4, r.Logger, r.CctxTimeout) r.Logger.CCTX(*cctxs[0], "deposit erc20") - r.Logger.CCTX(*cctxs[1], "deposit erc20 and call") + r.Logger.CCTX(*cctxs[1], "deposit erc20 2") + r.Logger.CCTX(*cctxs[2], "deposit erc20 and call") + r.Logger.CCTX(*cctxs[3], "deposit erc20 and call 2") require.Equal(r, crosschaintypes.CctxStatus_OutboundMined, cctxs[0].CctxStatus.Status) require.Equal(r, crosschaintypes.CctxStatus_OutboundMined, cctxs[1].CctxStatus.Status) + require.Equal(r, crosschaintypes.CctxStatus_OutboundMined, cctxs[2].CctxStatus.Status) + require.Equal(r, crosschaintypes.CctxStatus_OutboundMined, cctxs[3].CctxStatus.Status) // wait for the zrc20 balance to be updated change := utils.NewExactChange(amount) diff --git a/e2e/e2etests/test_eth_multiple_deposits.go b/e2e/e2etests/test_eth_multiple_deposits.go index 1c002efbf2..1b8795c81b 100644 --- a/e2e/e2etests/test_eth_multiple_deposits.go +++ b/e2e/e2etests/test_eth_multiple_deposits.go @@ -25,8 +25,8 @@ func TestETHMultipleDeposits(r *runner.E2ERunner, args []string) { previousValue := r.EVMAuth.Value fee, err := r.GatewayEVM.AdditionalActionFeeWei(nil) require.NoError(r, err) - // add 2 fees to provided amount to pay for 3 inbounds (1st one is free) - r.EVMAuth.Value = new(big.Int).Add(amount, new(big.Int).Mul(fee, big.NewInt(2))) + // add 5 fees to provided amount to pay for 6 inbounds (1st one is free) + r.EVMAuth.Value = new(big.Int).Add(amount, new(big.Int).Mul(fee, big.NewInt(5))) defer func() { r.EVMAuth.Value = previousValue }() @@ -37,14 +37,20 @@ func TestETHMultipleDeposits(r *runner.E2ERunner, args []string) { r.WaitForTxReceiptOnEVM(tx) // wait for the cctxs to be mined - cctxs := utils.WaitCctxsMinedByInboundHash(r.Ctx, tx.Hash().Hex(), r.CctxClient, 3, r.Logger, r.CctxTimeout) + cctxs := utils.WaitCctxsMinedByInboundHash(r.Ctx, tx.Hash().Hex(), r.CctxClient, 6, r.Logger, r.CctxTimeout) r.Logger.CCTX(*cctxs[0], "deposit eth") - r.Logger.CCTX(*cctxs[1], "deposit and call eth") - r.Logger.CCTX(*cctxs[2], "call") + r.Logger.CCTX(*cctxs[1], "deposit eth 2") + r.Logger.CCTX(*cctxs[2], "deposit and call eth") + r.Logger.CCTX(*cctxs[3], "deposit and call eth 2") + r.Logger.CCTX(*cctxs[4], "call") + r.Logger.CCTX(*cctxs[5], "call 2") require.Equal(r, crosschaintypes.CctxStatus_OutboundMined, cctxs[0].CctxStatus.Status) require.Equal(r, crosschaintypes.CctxStatus_OutboundMined, cctxs[1].CctxStatus.Status) require.Equal(r, crosschaintypes.CctxStatus_OutboundMined, cctxs[2].CctxStatus.Status) + require.Equal(r, crosschaintypes.CctxStatus_OutboundMined, cctxs[3].CctxStatus.Status) + require.Equal(r, crosschaintypes.CctxStatus_OutboundMined, cctxs[4].CctxStatus.Status) + require.Equal(r, crosschaintypes.CctxStatus_OutboundMined, cctxs[5].CctxStatus.Status) // wait for the zrc20 balance to be updated change := utils.NewExactChange(amount) diff --git a/e2e/e2etests/test_inbound_trackers.go b/e2e/e2etests/test_inbound_trackers.go index bd2c6ac2a8..4cc568c700 100644 --- a/e2e/e2etests/test_inbound_trackers.go +++ b/e2e/e2etests/test_inbound_trackers.go @@ -122,14 +122,15 @@ func TestInboundTrackers(r *runner.E2ERunner, args []string) { previousValue := r.EVMAuth.Value fee, err := r.GatewayEVM.AdditionalActionFeeWei(nil) require.NoError(r, err) - // add 2 fees to provided amount to pay for 3 inbounds (1st one is free) - r.EVMAuth.Value = new(big.Int).Add(amount, new(big.Int).Mul(fee, big.NewInt(2))) + + // add 5 fees to provided amount to pay for 6 inbounds (1st one is free) + r.EVMAuth.Value = new(big.Int).Add(amount, new(big.Int).Mul(fee, big.NewInt(5))) // send multiple deposit through contract r.Logger.Print("๐Ÿƒtest multiple deposits through contract") tx, err = r.TestDAppV2EVM.GatewayMultipleDeposits(r.EVMAuth, r.TestDAppV2ZEVMAddr, []byte(randomPayload(r))) require.NoError(r, err) - addTrackerAndWaitForCCTXs(coin.CoinType_Gas, tx.Hash().Hex(), 3) + addTrackerAndWaitForCCTXs(coin.CoinType_Gas, tx.Hash().Hex(), 6) r.Logger.Print("๐Ÿพ multiple deposits through contract observed") // reset the value of the payable transactions @@ -140,9 +141,8 @@ func TestInboundTrackers(r *runner.E2ERunner, args []string) { require.NoError(r, err) r.WaitForTxReceiptOnEVM(tx) - // set value of the payable transactions - // use 1 fee as amount to pay for 2 inbounds (1st one is free) - r.EVMAuth.Value = fee + // use 3 * fee as amount to pay for 4 inbounds (1st one is free) + r.EVMAuth.Value = new(big.Int).Mul(fee, big.NewInt(3)) // send multiple deposit through contract r.Logger.Print("๐Ÿƒtest multiple erc20 deposits through contract") @@ -154,6 +154,6 @@ func TestInboundTrackers(r *runner.E2ERunner, args []string) { []byte(randomPayload(r)), ) require.NoError(r, err) - addTrackerAndWaitForCCTXs(coin.CoinType_ERC20, tx.Hash().Hex(), 2) + addTrackerAndWaitForCCTXs(coin.CoinType_ERC20, tx.Hash().Hex(), 4) r.Logger.Print("๐Ÿพ multiple erc20 deposits through contract observed") } diff --git a/e2e/runner/setup_evm.go b/e2e/runner/setup_evm.go index 33b6549395..4fe255bb95 100644 --- a/e2e/runner/setup_evm.go +++ b/e2e/runner/setup_evm.go @@ -213,3 +213,29 @@ func (r *E2ERunner) DeployZetaConnectorNative(ensureTxReceipt func(tx *ethtypes. txZetaConnectorNativeHash.Hash().Hex(), ) } + +// DeployTestDAppV2EVM deploys the test DApp V2 contract for EVM +func (r *E2ERunner) DeployTestDAppV2EVM() { + ensureTxReceipt := func(tx *ethtypes.Transaction, failMessage string) { + receipt := utils.MustWaitForTxReceipt(r.Ctx, r.EVMClient, tx, r.Logger, r.ReceiptTimeout) + r.requireTxSuccessful(receipt, failMessage) + } + + testDAppV2Addr, txTestDAppV2, _, err := testdappv2.DeployTestDAppV2( + r.EVMAuth, + r.EVMClient, + false, + r.GatewayEVMAddr, + ) + require.NoError(r, err) + ensureTxReceipt(txTestDAppV2, "TestDAppV2 deployment failed") + + // Initialize the test dapp contract instance + r.TestDAppV2EVMAddr = testDAppV2Addr + r.TestDAppV2EVM, err = testdappv2.NewTestDAppV2(testDAppV2Addr, r.EVMClient) + require.NoError(r, err) + + isZetaChain, err := r.TestDAppV2EVM.IsZetaChain(&bind.CallOpts{}) + require.NoError(r, err) + require.False(r, isZetaChain) +} diff --git a/e2e/runner/setup_zevm.go b/e2e/runner/setup_zevm.go index 8d46a04cc1..4af0802bcf 100644 --- a/e2e/runner/setup_zevm.go +++ b/e2e/runner/setup_zevm.go @@ -356,3 +356,28 @@ func (r *E2ERunner) UpdateProtocolContractsInChainParams(testLegacy bool) { err = r.ZetaTxServer.UpdateChainParams(chainParams) require.NoError(r, err) } + +// DeployTestDAppV2ZEVM deploys the test DApp V2 contract +func (r *E2ERunner) DeployTestDAppV2ZEVM() { + ensureTxReceipt := func(tx *ethtypes.Transaction, failMessage string) { + receipt := e2eutils.MustWaitForTxReceipt(r.Ctx, r.ZEVMClient, tx, r.Logger, r.ReceiptTimeout) + r.requireTxSuccessful(receipt, failMessage+" tx hash: "+tx.Hash().Hex()) + } + + testDAppV2Addr, txTestDAppV2, _, err := testdappv2.DeployTestDAppV2( + r.ZEVMAuth, + r.ZEVMClient, + true, + r.GatewayEVMAddr, + ) + require.NoError(r, err) + ensureTxReceipt(txTestDAppV2, "TestDAppV2 deployment failed") + + r.TestDAppV2ZEVMAddr = testDAppV2Addr + r.TestDAppV2ZEVM, err = testdappv2.NewTestDAppV2(testDAppV2Addr, r.ZEVMClient) + require.NoError(r, err) + + isZetaChain, err := r.TestDAppV2ZEVM.IsZetaChain(&bind.CallOpts{}) + require.NoError(r, err) + require.True(r, isZetaChain) +} diff --git a/e2e/runner/upgrade_v33.go b/e2e/runner/upgrade_v33.go deleted file mode 100644 index 31338194a4..0000000000 --- a/e2e/runner/upgrade_v33.go +++ /dev/null @@ -1,41 +0,0 @@ -package runner - -import ( - ethtypes "github.com/ethereum/go-ethereum/core/types" - "github.com/stretchr/testify/require" - - "github.com/zeta-chain/node/e2e/utils" -) - -func (r *E2ERunner) RunSetup(testLegacy bool) { - ensureReceiptEVM := func(tx *ethtypes.Transaction, failMessage string) { - receipt := utils.MustWaitForTxReceipt(r.Ctx, r.EVMClient, tx, r.Logger, r.ReceiptTimeout) - msg := "tx %s receipt status is not successful: %s" - require.Equal( - r, - ethtypes.ReceiptStatusSuccessful, - receipt.Status, - msg, - receipt.TxHash.String(), - failMessage, - ) - } - ensureReceiptZEVM := func(tx *ethtypes.Transaction, failMessage string) { - receipt := utils.MustWaitForTxReceipt(r.Ctx, r.ZEVMClient, tx, r.Logger, r.ReceiptTimeout) - msg := "tx %s receipt status is not successful: %s" - require.Equal( - r, - ethtypes.ReceiptStatusSuccessful, - receipt.Status, - msg, - receipt.TxHash.String(), - failMessage, - ) - } - r.UpgradeGatewayEVM() - r.UpgradeGatewayZEVM() - r.DeployZetaConnectorNative(ensureReceiptEVM) - r.UpdateProtocolContractsInChainParams(testLegacy) - r.SetupZEVMTestDappV2(ensureReceiptZEVM) - r.DeployTestDAppV2(ensureReceiptEVM) -} diff --git a/e2e/runner/upgrade_v36.go b/e2e/runner/upgrade_v36.go new file mode 100644 index 0000000000..a560204588 --- /dev/null +++ b/e2e/runner/upgrade_v36.go @@ -0,0 +1,28 @@ +package runner + +import ( + "math/big" + + ethtypes "github.com/ethereum/go-ethereum/core/types" + "github.com/stretchr/testify/require" + + "github.com/zeta-chain/node/e2e/utils" +) + +const V36Version = "v36.0.0" + +func (r *E2ERunner) RunSetup(testLegacy bool) { + ensureTxReceipt := func(tx *ethtypes.Transaction, failMessage string) { + receipt := utils.MustWaitForTxReceipt(r.Ctx, r.EVMClient, tx, r.Logger, r.ReceiptTimeout) + r.requireTxSuccessful(receipt, failMessage) + } + + r.UpgradeGatewayEVM() + updateAdditionalFeeTx, err := r.GatewayEVM.UpdateAdditionalActionFee(r.EVMAuth, big.NewInt(2e5)) + require.NoError(r, err) + ensureTxReceipt(updateAdditionalFeeTx, "Updating additional fee failed") + r.UpgradeGatewayZEVM() + r.UpdateProtocolContractsInChainParams(testLegacy) + r.DeployTestDAppV2ZEVM() + r.DeployTestDAppV2EVM() +} diff --git a/testutil/sample/zetaclient.go b/testutil/sample/zetaclient.go index e883ba9265..44ab60cec4 100644 --- a/testutil/sample/zetaclient.go +++ b/testutil/sample/zetaclient.go @@ -47,3 +47,10 @@ func ComplianceConfig() config.ComplianceConfig { }, } } + +// FeatureFlags returns a sample feature flags +func FeatureFlags() config.FeatureFlags { + return config.FeatureFlags{ + EnableMultipleCalls: true, + } +} diff --git a/zetaclient/chains/evm/observer/v2_inbound.go b/zetaclient/chains/evm/observer/v2_inbound.go index b3c0fa1da4..d22cbf82ab 100644 --- a/zetaclient/chains/evm/observer/v2_inbound.go +++ b/zetaclient/chains/evm/observer/v2_inbound.go @@ -20,6 +20,7 @@ import ( "github.com/zeta-chain/node/zetaclient/chains/evm/common" "github.com/zeta-chain/node/zetaclient/compliance" "github.com/zeta-chain/node/zetaclient/config" + zctx "github.com/zeta-chain/node/zetaclient/context" "github.com/zeta-chain/node/zetaclient/logs" "github.com/zeta-chain/node/zetaclient/zetacore" ) @@ -71,7 +72,7 @@ func (ob *Observer) observeGatewayDeposit( } // parse and validate events - events := ob.parseAndValidateDepositEvents(rawLogs, gatewayAddr, gatewayContract) + events := ob.parseAndValidateDepositEvents(ctx, rawLogs, gatewayAddr, gatewayContract) // post to zetacore lastScanned := uint64(0) @@ -116,6 +117,7 @@ func (ob *Observer) observeGatewayDeposit( // parseAndValidateDepositEvents collects and sorts events by block number, tx index, and log index func (ob *Observer) parseAndValidateDepositEvents( + ctx context.Context, ethlogs []ethtypes.Log, gatewayAddr ethcommon.Address, gatewayContract *gatewayevm.GatewayEVM, @@ -149,7 +151,27 @@ func (ob *Observer) parseAndValidateDepositEvents( return validEvents[i].Raw.BlockNumber < validEvents[j].Raw.BlockNumber }) - return validEvents + // check if multiple calls are enabled + if zctx.EnableMultipleCallsFeatureFlag(ctx) { + return validEvents + } + + // if not, default to previous behavior + filtered := make([]*gatewayevm.GatewayEVMDeposited, 0) + guard := make(map[string]bool) + for _, event := range validEvents { + // guard against multiple events in the same tx + if guard[event.Raw.TxHash.Hex()] { + ob.Logger().Inbound.Info(). + Stringer(logs.FieldTx, event.Raw.TxHash). + Msg("multiple Deposited events in same tx") + continue + } + guard[event.Raw.TxHash.Hex()] = true + filtered = append(filtered, event) + } + + return filtered } // newDepositInboundVote creates a MsgVoteInbound message for a Deposit event @@ -205,7 +227,7 @@ func (ob *Observer) observeGatewayCall( return startBlock - 1, errors.Wrap(err, "can't get gateway contract") } - events := ob.parseAndValidateCallEvents(rawLogs, gatewayAddr, gatewayContract) + events := ob.parseAndValidateCallEvents(ctx, rawLogs, gatewayAddr, gatewayContract) lastScanned := uint64(0) for _, event := range events { if event.Raw.BlockNumber > lastScanned { @@ -236,6 +258,7 @@ func (ob *Observer) observeGatewayCall( // parseAndValidateCallEvents collects and sorts events by block number, tx index, and log index func (ob *Observer) parseAndValidateCallEvents( + ctx context.Context, ethlogs []ethtypes.Log, gatewayAddr ethcommon.Address, gatewayContract *gatewayevm.GatewayEVM, @@ -269,7 +292,29 @@ func (ob *Observer) parseAndValidateCallEvents( return validEvents[i].Raw.BlockNumber < validEvents[j].Raw.BlockNumber }) - return validEvents + // check if multiple calls are enabled + if zctx.EnableMultipleCallsFeatureFlag(ctx) { + return validEvents + } + + // if not, default to previous behavior + filtered := make([]*gatewayevm.GatewayEVMCalled, 0) + guard := make(map[string]bool) + for _, event := range validEvents { + // guard against multiple events in the same tx + if guard[event.Raw.TxHash.Hex()] { + ob.Logger().Inbound.Warn(). + Stringer(logs.FieldTx, event.Raw.TxHash). + Msg("Multiple Call events in same tx") + + continue + } + + guard[event.Raw.TxHash.Hex()] = true + filtered = append(filtered, event) + } + + return filtered } // newCallInboundVote creates a MsgVoteInbound message for a Call event @@ -310,7 +355,7 @@ func (ob *Observer) observeGatewayDepositAndCall( return startBlock - 1, errors.Wrap(err, "can't get gateway contract") } - events := ob.parseAndValidateDepositAndCallEvents(rawLogs, gatewayAddr, gatewayContract) + events := ob.parseAndValidateDepositAndCallEvents(ctx, rawLogs, gatewayAddr, gatewayContract) lastScanned := uint64(0) for _, event := range events { @@ -347,6 +392,7 @@ func (ob *Observer) observeGatewayDepositAndCall( // parseAndValidateDepositAndCallEvents collects and sorts events by block number, tx index, and log index func (ob *Observer) parseAndValidateDepositAndCallEvents( + ctx context.Context, ethlogs []ethtypes.Log, gatewayAddr ethcommon.Address, gatewayContract *gatewayevm.GatewayEVM, @@ -381,7 +427,27 @@ func (ob *Observer) parseAndValidateDepositAndCallEvents( return validEvents[i].Raw.BlockNumber < validEvents[j].Raw.BlockNumber }) - return validEvents + // Check if multiple calls are enabled + if zctx.EnableMultipleCallsFeatureFlag(ctx) { + return validEvents + } + + // if not, default to previous behavior + filtered := make([]*gatewayevm.GatewayEVMDepositedAndCalled, 0) + guard := make(map[string]bool) + for _, event := range validEvents { + // guard against multiple events in the same tx + if guard[event.Raw.TxHash.Hex()] { + ob.Logger().Inbound.Warn(). + Stringer(logs.FieldTx, event.Raw.TxHash). + Msg("multiple DepositedAndCalled events in same tx") + continue + } + guard[event.Raw.TxHash.Hex()] = true + filtered = append(filtered, event) + } + + return filtered } // newDepositAndCallInboundVote creates a MsgVoteInbound message for a Deposit event diff --git a/zetaclient/chains/evm/observer/v2_inbound_tracker.go b/zetaclient/chains/evm/observer/v2_inbound_tracker.go index e276b5daca..9b4254f151 100644 --- a/zetaclient/chains/evm/observer/v2_inbound_tracker.go +++ b/zetaclient/chains/evm/observer/v2_inbound_tracker.go @@ -8,6 +8,7 @@ import ( "github.com/pkg/errors" "github.com/zeta-chain/node/zetaclient/chains/evm/client" + zctx "github.com/zeta-chain/node/zetaclient/context" "github.com/zeta-chain/node/zetaclient/zetacore" ) @@ -41,7 +42,10 @@ func (ob *Observer) ProcessInboundTrackerV2( ) } + // Check if multiple calls are enabled + allowMultipleCalls := zctx.EnableMultipleCallsFeatureFlag(ctx) eventFound := false + for _, log := range receipt.Logs { if log == nil || log.Address != gatewayAddr { continue @@ -63,7 +67,7 @@ func (ob *Observer) ProcessInboundTrackerV2( } msg := ob.newDepositInboundVote(eventDeposit) _, err = ob.PostVoteInbound(ctx, &msg, zetacore.PostVoteInboundExecutionGasLimit) - if err != nil { + if err != nil || !allowMultipleCalls { return err } } @@ -84,7 +88,7 @@ func (ob *Observer) ProcessInboundTrackerV2( } msg := ob.newDepositAndCallInboundVote(eventDepositAndCall) _, err = ob.PostVoteInbound(ctx, &msg, zetacore.PostVoteInboundExecutionGasLimit) - if err != nil { + if err != nil || !allowMultipleCalls { return err } } @@ -105,7 +109,7 @@ func (ob *Observer) ProcessInboundTrackerV2( } msg := ob.newCallInboundVote(eventCall) _, err = ob.PostVoteInbound(ctx, &msg, zetacore.PostVoteInboundExecutionGasLimit) - if err != nil { + if err != nil || !allowMultipleCalls { return err } } diff --git a/zetaclient/config/config_chain.go b/zetaclient/config/config_chain.go index f48bf00c48..fa8d5c9e84 100644 --- a/zetaclient/config/config_chain.go +++ b/zetaclient/config/config_chain.go @@ -16,6 +16,7 @@ func New(setDefaults bool) Config { cfg := Config{ EVMChainConfigs: make(map[int64]EVMConfig), BTCChainConfigs: make(map[int64]BTCConfig), + FeatureFlags: defaultFeatureFlags(), mu: &sync.RWMutex{}, } @@ -78,3 +79,10 @@ func btcChainsConfigs() map[int64]BTCConfig { chains.BitcoinRegtest.ChainId: bitcoinConfigRegnet(), } } + +// defaultFeatureFlags returns default feature flags +func defaultFeatureFlags() FeatureFlags { + return FeatureFlags{ + EnableMultipleCalls: true, + } +} diff --git a/zetaclient/config/types.go b/zetaclient/config/types.go index 57d8a63377..505b5ff1fb 100644 --- a/zetaclient/config/types.go +++ b/zetaclient/config/types.go @@ -73,6 +73,12 @@ type ComplianceConfig struct { RestrictedAddresses []string `json:"RestrictedAddresses" mask:"zero"` } +// FeatureFlags contains feature flags for controlling new and experimental features +type FeatureFlags struct { + // EnableMultipleCalls enables multiple calls from the same transaction + EnableMultipleCalls bool `json:"EnableMultipleCalls"` +} + // Config is the config for ZetaClient // TODO: use snake case for json fields // https://github.com/zeta-chain/node/issues/1020 @@ -107,6 +113,9 @@ type Config struct { // compliance config ComplianceConfig ComplianceConfig `json:"ComplianceConfig"` + // feature flags for controlling new and experimental features + FeatureFlags FeatureFlags `json:"FeatureFlags"` + mu *sync.RWMutex } @@ -225,3 +234,17 @@ func (c EVMConfig) Empty() bool { func (c BTCConfig) Empty() bool { return c.RPCHost == "" } + +// GetFeatureFlags returns the feature flags +func (c Config) GetFeatureFlags() FeatureFlags { + c.mu.RLock() + defer c.mu.RUnlock() + return c.FeatureFlags +} + +// IsEnableMultipleCallsEnabled returns true if multiple calls from same transaction are enabled +func (c Config) IsEnableMultipleCallsEnabled() bool { + c.mu.RLock() + defer c.mu.RUnlock() + return c.FeatureFlags.EnableMultipleCalls +} diff --git a/zetaclient/context/feature_flags.go b/zetaclient/context/feature_flags.go new file mode 100644 index 0000000000..d2dbfc1a5c --- /dev/null +++ b/zetaclient/context/feature_flags.go @@ -0,0 +1,18 @@ +package context + +import ( + "context" +) + +// TODO: https://github.com/zeta-chain/node/issues/4292 +// EnableMultipleCallsFeatureFlag returns true if EnableMultipleCalls feature flag is enabled +func EnableMultipleCallsFeatureFlag(ctx context.Context) bool { + app, err := FromContext(ctx) + if err != nil { + app.logger.Warn().Err(err). + Msg("unable to get feature flag, using default behavior") + return false + } + + return app.Config().FeatureFlags.EnableMultipleCalls +} diff --git a/zetaclient/orchestrator/orchestrator.go b/zetaclient/orchestrator/orchestrator.go index 5c4117d993..8f223b6e1f 100644 --- a/zetaclient/orchestrator/orchestrator.go +++ b/zetaclient/orchestrator/orchestrator.go @@ -19,6 +19,7 @@ import ( "github.com/zeta-chain/node/zetaclient/chains/base" "github.com/zeta-chain/node/zetaclient/chains/interfaces" "github.com/zeta-chain/node/zetaclient/chains/zrepo" + "github.com/zeta-chain/node/zetaclient/config" zctx "github.com/zeta-chain/node/zetaclient/context" "github.com/zeta-chain/node/zetaclient/logs" "github.com/zeta-chain/node/zetaclient/metrics" @@ -99,6 +100,9 @@ func (oc *Orchestrator) Start(ctx context.Context) error { // refresh preflight metrics in a lazy manner preflightTicker := scheduler.Interval(1 * time.Minute) + // check feature flags and log their status + oc.logFeatureFlags(app.Config()) + oc.scheduler.Register(ctx, oc.UpdateContext, opts("update_context", contextInterval)...) oc.scheduler.Register(ctx, oc.SyncChains, opts("sync_chains", syncInterval)...) oc.scheduler.Register(ctx, oc.updateMetrics, opts("update_metrics", blocksTicker)...) @@ -382,3 +386,18 @@ func newLoggers(baseLogger base.Logger) loggers { base: baseLogger, } } + +// logFeatureFlags logs the current status of feature flags +func (oc *Orchestrator) logFeatureFlags(config config.Config) { + flags := config.GetFeatureFlags() + + oc.logger.Info(). + Bool("enable_multiple_calls", flags.EnableMultipleCalls). + Msg("feature flags status") + + if config.IsEnableMultipleCallsEnabled() { + oc.logger.Info().Msg("EnableMultipleCalls is enabled - multiple calls from same tx will be allowed") + } else { + oc.logger.Info().Msg("EnableMultipleCalls is disabled - multiple calls from same tx will be filtered (only first event)") + } +}