diff --git a/src/libraries/RevShareCodeRepo.sol b/src/libraries/RevShareCodeRepo.sol index 5dc5e7a374..a7a14583ca 100644 --- a/src/libraries/RevShareCodeRepo.sol +++ b/src/libraries/RevShareCodeRepo.sol @@ -4,15 +4,15 @@ pragma solidity 0.8.15; /// @notice Library for storing the creation code for the revenue share contracts. library RevShareCodeRepo { /// @notice The creation code for each fee vault, fee splitter, l1 withdrawer, FeesDepositor and sc rev share calculator. - /// Obtained from https://github.com/defi-wonderland/optimism at commit 799f92f298ce4a0b40ec36fdcbcddf8f8fe946d1 + /// Obtained from https://github.com/defi-wonderland/optimism at commit 989afa818dfee3ee1fba715584c2f7e8663268f8 bytes public constant operatorFeeVaultCreationCode = - hex"60e060405234801561001057600080fd5b50604051610f3c380380610f3c83398101604081905261002f91610079565b6001600160a01b03831660a0526080829052828282806001811115610056576100566100cc565b60c081600181111561006a5761006a6100cc565b815250505050505050506100e2565b60008060006060848603121561008e57600080fd5b83516001600160a01b03811681146100a557600080fd5b602085015160408601519194509250600281106100c157600080fd5b809150509250925092565b634e487b7160e01b600052602160045260246000fd5b60805160a05160c051610e176101256000396000818161028401526109e101526000818160e901526109710152600081816102b80152610a350152610e176000f3fe6080604052600436106100cb5760003560e01c806382356d8a1161007457806385b5b14d1161004e57806385b5b14d14610252578063d0e12f9014610272578063d3e5792b146102a657600080fd5b806382356d8a146102055780638312f1491461022757806384411d651461023c57600080fd5b80633ccfd60b116100a55780633ccfd60b1461017757806354fd4d501461019a57806366d003ac146101f057600080fd5b80630d9019e1146100d7578063307f2962146101355780633bbed4a01461015757600080fd5b366100d257005b600080fd5b3480156100e357600080fd5b5061010b7f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b34801561014157600080fd5b50610155610150366004610be5565b6102da565b005b34801561016357600080fd5b50610155610172366004610c2b565b6104a2565b34801561018357600080fd5b5061018c610622565b60405190815260200161012c565b3480156101a657600080fd5b506101e36040518060400160405280600581526020017f312e312e3000000000000000000000000000000000000000000000000000000081525081565b60405161012c9190610c48565b3480156101fc57600080fd5b5061010b61092a565b34801561021157600080fd5b5061021a610993565b60405161012c9190610d25565b34801561023357600080fd5b5061018c610a03565b34801561024857600080fd5b5061018c60005481565b34801561025e57600080fd5b5061015561026d366004610d39565b610a57565b34801561027e57600080fd5b5061021a7f000000000000000000000000000000000000000000000000000000000000000081565b3480156102b257600080fd5b5061018c7f000000000000000000000000000000000000000000000000000000000000000081565b73420000000000000000000000000000000000001873ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610339573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061035d9190610d52565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146103c1576040517f7cd7e09f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600280547401000000000000000000000000000000000000000080820460ff1692849290917fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff9091169083600181111561041d5761041d610cbb565b0217905550600280547fffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffff16770100000000000000000000000000000000000000000000001790556040517ff2ec44eb1c3b3acd547b76333eb2c4b27eee311860c57a9fdb04c95f62398fc8906104969083908590610d6f565b60405180910390a15050565b73420000000000000000000000000000000000001873ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610501573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105259190610d52565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610589576040517f7cd7e09f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600280547fffffffffffffffffffff00ff0000000000000000000000000000000000000000811673ffffffffffffffffffffffffffffffffffffffff84811691821775010000000000000000000000000000000000000000001790935560408051939092168084526020840191909152917f62e69886a5df0ba8ffcacbfc1388754e7abd9bde24b036354c561f1acd4e45939101610496565b600061062c610a03565b4710156106e6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604a60248201527f4665655661756c743a207769746864726177616c20616d6f756e74206d75737460448201527f2062652067726561746572207468616e206d696e696d756d207769746864726160648201527f77616c20616d6f756e7400000000000000000000000000000000000000000000608482015260a4015b60405180910390fd5b479050806000808282546106fa9190610d8a565b909155507fc8a211cc64b6ed1b50595a9fcb1932b6d1e5a6e8ef15b60e5b1f988ea9086bba90508161072a61092a565b6040805192835273ffffffffffffffffffffffffffffffffffffffff9091166020830152339082015260600160405180910390a17f38e04cbeb8c10f8f568618aa75be0f10b6729b8b4237743b4de20cbcde2839ee8161078861092a565b33610791610993565b6040516107a19493929190610dc9565b60405180910390a160016107b3610993565b60018111156107c4576107c4610cbb565b0361086f5760006107dc6107d661092a565b83610bbd565b90508061086b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f4665655661756c743a206661696c656420746f2073656e642045544820746f2060448201527f4c322066656520726563697069656e740000000000000000000000000000000060648201526084016106dd565b5090565b73420000000000000000000000000000000000001663c2b3e5ac8261089261092a565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b16815273ffffffffffffffffffffffffffffffffffffffff909116600482015262061a80602482015260606044820152600060648201526084016000604051808303818588803b15801561090e57600080fd5b505af1158015610922573d6000803e3d6000fd5b505050505090565b6002546000907501000000000000000000000000000000000000000000900460ff161561096e575060025473ffffffffffffffffffffffffffffffffffffffff1690565b507f000000000000000000000000000000000000000000000000000000000000000090565b60025460009077010000000000000000000000000000000000000000000000900460ff16156109de575060025474010000000000000000000000000000000000000000900460ff1690565b507f000000000000000000000000000000000000000000000000000000000000000090565b600254600090760100000000000000000000000000000000000000000000900460ff1615610a32575060015490565b507f000000000000000000000000000000000000000000000000000000000000000090565b73420000000000000000000000000000000000001873ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610ab6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ada9190610d52565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610b3e576040517f7cd7e09f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001805490829055600280547fffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffff1676010000000000000000000000000000000000000000000017905560408051828152602081018490527f895a067c78583e800418fabf3da26a9496aab2ff3429cebdf7fefa642b2e42039101610496565b6000610bca835a84610bd1565b9392505050565b6000806000806000858888f1949350505050565b600060208284031215610bf757600080fd5b813560028110610bca57600080fd5b73ffffffffffffffffffffffffffffffffffffffff81168114610c2857600080fd5b50565b600060208284031215610c3d57600080fd5b8135610bca81610c06565b600060208083528351808285015260005b81811015610c7557858101830151858201604001528201610c59565b81811115610c87576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b60028110610d21577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b9052565b60208101610d338284610cea565b92915050565b600060208284031215610d4b57600080fd5b5035919050565b600060208284031215610d6457600080fd5b8151610bca81610c06565b60408101610d7d8285610cea565b610bca6020830184610cea565b60008219821115610dc4577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b500190565b84815273ffffffffffffffffffffffffffffffffffffffff84811660208301528316604082015260808101610e016060830184610cea565b9594505050505056fea164736f6c634300080f000a"; + hex"6080604052348015600e575f80fd5b5060156019565b60c9565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff161560685760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b039081161460c65780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b610eb9806100d65f395ff3fe6080604052600436106100d1575f3560e01c806382356d8a1161007c57806385b5b14d1161005757806385b5b14d14610276578063b49dc74114610295578063d0e12f90146102b4578063d3e5792b146102e3575f80fd5b806382356d8a1461020f5780638312f1491461024d57806384411d6514610262575f80fd5b80633ccfd60b116100ac5780633ccfd60b1461016c57806354fd4d501461018e57806366d003ac146101e3575f80fd5b80630d9019e1146100dc578063307f29621461012c5780633bbed4a01461014d575f80fd5b366100d857005b5f80fd5b3480156100e7575f80fd5b5060025473ffffffffffffffffffffffffffffffffffffffff165b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b348015610137575f80fd5b5061014b610146366004610c86565b6102f7565b005b348015610158575f80fd5b5061014b610167366004610cc3565b61047a565b348015610177575f80fd5b506101806105de565b604051908152602001610123565b348015610199575f80fd5b506101d66040518060400160405280600581526020017f312e312e3000000000000000000000000000000000000000000000000000000081525081565b6040516101239190610cde565b3480156101ee575f80fd5b506002546101029073ffffffffffffffffffffffffffffffffffffffff1681565b34801561021a575f80fd5b506002546102409074010000000000000000000000000000000000000000900460ff1681565b6040516101239190610d97565b348015610258575f80fd5b5061018060015481565b34801561026d575f80fd5b506101805f5481565b348015610281575f80fd5b5061014b610290366004610dab565b610918565b3480156102a0575f80fd5b5061014b6102af366004610dc2565b610a3b565b3480156102bf575f80fd5b5060025474010000000000000000000000000000000000000000900460ff16610240565b3480156102ee575f80fd5b50600154610180565b73420000000000000000000000000000000000001873ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610354573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906103789190610dfd565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146103dc576040517f7cd7e09f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600280547401000000000000000000000000000000000000000080820460ff1692849290917fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff9091169083600181111561043857610438610d31565b02179055507ff2ec44eb1c3b3acd547b76333eb2c4b27eee311860c57a9fdb04c95f62398fc8818360405161046e929190610e18565b60405180910390a15050565b73420000000000000000000000000000000000001873ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156104d7573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104fb9190610dfd565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461055f576040517f7cd7e09f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff000000000000000000000000000000000000000083168117909355604080519190921680825260208201939093527f62e69886a5df0ba8ffcacbfc1388754e7abd9bde24b036354c561f1acd4e4593910161046e565b5f60015447101561069c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604a60248201527f4665655661756c743a207769746864726177616c20616d6f756e74206d75737460448201527f2062652067726561746572207468616e206d696e696d756d207769746864726160648201527f77616c20616d6f756e7400000000000000000000000000000000000000000000608482015260a4015b60405180910390fd5b479050805f808282546106af9190610e33565b90915550506002546040805183815273ffffffffffffffffffffffffffffffffffffffff90921660208301523382820152517fc8a211cc64b6ed1b50595a9fcb1932b6d1e5a6e8ef15b60e5b1f988ea9086bba9181900360600190a16002546040517f38e04cbeb8c10f8f568618aa75be0f10b6729b8b4237743b4de20cbcde2839ee9161077491849173ffffffffffffffffffffffffffffffffffffffff811691339174010000000000000000000000000000000000000000900460ff1690610e6b565b60405180910390a1600160025474010000000000000000000000000000000000000000900460ff1660018111156107ad576107ad610d31565b0361086a576002545f906107d79073ffffffffffffffffffffffffffffffffffffffff1683610c4f565b905080610866576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f4665655661756c743a206661696c656420746f2073656e642045544820746f2060448201527f4c322066656520726563697069656e74000000000000000000000000000000006064820152608401610693565b5090565b6002546040517fc2b3e5ac00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff909116600482015262061a806024820152606060448201525f60648201527342000000000000000000000000000000000000169063c2b3e5ac9083906084015f604051808303818588803b1580156108fe575f80fd5b505af1158015610910573d5f803e3d5ffd5b505050505090565b73420000000000000000000000000000000000001873ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610975573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109999190610dfd565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146109fd576040517f7cd7e09f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600180549082905560408051828152602081018490527f895a067c78583e800418fabf3da26a9496aab2ff3429cebdf7fefa642b2e4203910161046e565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000810460ff16159067ffffffffffffffff165f81158015610a855750825b90505f8267ffffffffffffffff166001148015610aa15750303b155b905081158015610aaf575080155b15610ae6576040517ff92ee8a900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b84547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001660011785558315610b475784547fffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffff16680100000000000000001785555b6002805473ffffffffffffffffffffffffffffffffffffffff8a167fffffffffffffffffffffffff000000000000000000000000000000000000000082168117835560018a81558993927fffffffffffffffffffffff000000000000000000000000000000000000000000169091179074010000000000000000000000000000000000000000908490811115610bdf57610bdf610d31565b02179055508315610c455784547fffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffff168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b5050505050505050565b5f610c5b835a84610c62565b9392505050565b5f805f805f858888f1949350505050565b803560028110610c81575f80fd5b919050565b5f60208284031215610c96575f80fd5b610c5b82610c73565b73ffffffffffffffffffffffffffffffffffffffff81168114610cc0575f80fd5b50565b5f60208284031215610cd3575f80fd5b8135610c5b81610c9f565b602081525f82518060208401528060208501604085015e5f6040828501015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011684010191505092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b60028110610d93577f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b9052565b60208101610da58284610d5e565b92915050565b5f60208284031215610dbb575f80fd5b5035919050565b5f805f60608486031215610dd4575f80fd5b8335610ddf81610c9f565b925060208401359150610df460408501610c73565b90509250925092565b5f60208284031215610e0d575f80fd5b8151610c5b81610c9f565b60408101610e268285610d5e565b610c5b6020830184610d5e565b80820180821115610da5577f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b84815273ffffffffffffffffffffffffffffffffffffffff84811660208301528316604082015260808101610ea36060830184610d5e565b9594505050505056fea164736f6c6343000819000a"; bytes public constant sequencerFeeVaultCreationCode = - hex"60e060405234801561001057600080fd5b50604051610f6b380380610f6b83398101604081905261002f91610079565b6001600160a01b03831660a0526080829052828282806001811115610056576100566100cc565b60c081600181111561006a5761006a6100cc565b815250505050505050506100e2565b60008060006060848603121561008e57600080fd5b83516001600160a01b03811681146100a557600080fd5b602085015160408601519194509250600281106100c157600080fd5b809150509250925092565b634e487b7160e01b600052602160045260246000fd5b60805160a05160c051610e466101256000396000818161028f0152610a0101526000818160f401526109910152600081816102c30152610a550152610e466000f3fe6080604052600436106100d65760003560e01c806382356d8a1161007f57806385b5b14d1161005957806385b5b14d1461025d578063d0e12f901461027d578063d3e5792b146102b1578063d4ff9218146102e557600080fd5b806382356d8a146102105780638312f1491461023257806384411d651461024757600080fd5b80633ccfd60b116100b05780633ccfd60b1461018257806354fd4d50146101a557806366d003ac146101fb57600080fd5b80630d9019e1146100e2578063307f2962146101405780633bbed4a01461016257600080fd5b366100dd57005b600080fd5b3480156100ee57600080fd5b506101167f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b34801561014c57600080fd5b5061016061015b366004610c14565b6102fa565b005b34801561016e57600080fd5b5061016061017d366004610c5a565b6104c2565b34801561018e57600080fd5b50610197610642565b604051908152602001610137565b3480156101b157600080fd5b506101ee6040518060400160405280600581526020017f312e362e3000000000000000000000000000000000000000000000000000000081525081565b6040516101379190610c77565b34801561020757600080fd5b5061011661094a565b34801561021c57600080fd5b506102256109b3565b6040516101379190610d54565b34801561023e57600080fd5b50610197610a23565b34801561025357600080fd5b5061019760005481565b34801561026957600080fd5b50610160610278366004610d68565b610a77565b34801561028957600080fd5b506102257f000000000000000000000000000000000000000000000000000000000000000081565b3480156102bd57600080fd5b506101977f000000000000000000000000000000000000000000000000000000000000000081565b3480156102f157600080fd5b50610116610bdd565b73420000000000000000000000000000000000001873ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610359573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061037d9190610d81565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146103e1576040517f7cd7e09f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600280547401000000000000000000000000000000000000000080820460ff1692849290917fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff9091169083600181111561043d5761043d610cea565b0217905550600280547fffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffff16770100000000000000000000000000000000000000000000001790556040517ff2ec44eb1c3b3acd547b76333eb2c4b27eee311860c57a9fdb04c95f62398fc8906104b69083908590610d9e565b60405180910390a15050565b73420000000000000000000000000000000000001873ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610521573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105459190610d81565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146105a9576040517f7cd7e09f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600280547fffffffffffffffffffff00ff0000000000000000000000000000000000000000811673ffffffffffffffffffffffffffffffffffffffff84811691821775010000000000000000000000000000000000000000001790935560408051939092168084526020840191909152917f62e69886a5df0ba8ffcacbfc1388754e7abd9bde24b036354c561f1acd4e459391016104b6565b600061064c610a23565b471015610706576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604a60248201527f4665655661756c743a207769746864726177616c20616d6f756e74206d75737460448201527f2062652067726561746572207468616e206d696e696d756d207769746864726160648201527f77616c20616d6f756e7400000000000000000000000000000000000000000000608482015260a4015b60405180910390fd5b4790508060008082825461071a9190610db9565b909155507fc8a211cc64b6ed1b50595a9fcb1932b6d1e5a6e8ef15b60e5b1f988ea9086bba90508161074a61094a565b6040805192835273ffffffffffffffffffffffffffffffffffffffff9091166020830152339082015260600160405180910390a17f38e04cbeb8c10f8f568618aa75be0f10b6729b8b4237743b4de20cbcde2839ee816107a861094a565b336107b16109b3565b6040516107c19493929190610df8565b60405180910390a160016107d36109b3565b60018111156107e4576107e4610cea565b0361088f5760006107fc6107f661094a565b83610bec565b90508061088b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f4665655661756c743a206661696c656420746f2073656e642045544820746f2060448201527f4c322066656520726563697069656e740000000000000000000000000000000060648201526084016106fd565b5090565b73420000000000000000000000000000000000001663c2b3e5ac826108b261094a565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b16815273ffffffffffffffffffffffffffffffffffffffff909116600482015262061a80602482015260606044820152600060648201526084016000604051808303818588803b15801561092e57600080fd5b505af1158015610942573d6000803e3d6000fd5b505050505090565b6002546000907501000000000000000000000000000000000000000000900460ff161561098e575060025473ffffffffffffffffffffffffffffffffffffffff1690565b507f000000000000000000000000000000000000000000000000000000000000000090565b60025460009077010000000000000000000000000000000000000000000000900460ff16156109fe575060025474010000000000000000000000000000000000000000900460ff1690565b507f000000000000000000000000000000000000000000000000000000000000000090565b600254600090760100000000000000000000000000000000000000000000900460ff1615610a52575060015490565b507f000000000000000000000000000000000000000000000000000000000000000090565b73420000000000000000000000000000000000001873ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610ad6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610afa9190610d81565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610b5e576040517f7cd7e09f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001805490829055600280547fffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffff1676010000000000000000000000000000000000000000000017905560408051828152602081018490527f895a067c78583e800418fabf3da26a9496aab2ff3429cebdf7fefa642b2e420391016104b6565b6000610be761094a565b905090565b6000610bf9835a84610c00565b9392505050565b6000806000806000858888f1949350505050565b600060208284031215610c2657600080fd5b813560028110610bf957600080fd5b73ffffffffffffffffffffffffffffffffffffffff81168114610c5757600080fd5b50565b600060208284031215610c6c57600080fd5b8135610bf981610c35565b600060208083528351808285015260005b81811015610ca457858101830151858201604001528201610c88565b81811115610cb6576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b60028110610d50577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b9052565b60208101610d628284610d19565b92915050565b600060208284031215610d7a57600080fd5b5035919050565b600060208284031215610d9357600080fd5b8151610bf981610c35565b60408101610dac8285610d19565b610bf96020830184610d19565b60008219821115610df3577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b500190565b84815273ffffffffffffffffffffffffffffffffffffffff84811660208301528316604082015260808101610e306060830184610d19565b9594505050505056fea164736f6c634300080f000a"; + hex"6080604052348015600e575f80fd5b5060156019565b60c9565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff161560685760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b039081161460c65780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b610ec4806100d65f395ff3fe6080604052600436106100dc575f3560e01c80638312f1491161007c578063b49dc74111610057578063b49dc741146102a0578063d0e12f90146102bf578063d3e5792b146102ee578063d4ff9218146100e7575f80fd5b80638312f1491461025857806384411d651461026d57806385b5b14d14610281575f80fd5b80633ccfd60b116100b75780633ccfd60b1461017757806354fd4d501461019957806366d003ac146101ee57806382356d8a1461021a575f80fd5b80630d9019e1146100e7578063307f2962146101375780633bbed4a014610158575f80fd5b366100e357005b5f80fd5b3480156100f2575f80fd5b5060025473ffffffffffffffffffffffffffffffffffffffff165b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b348015610142575f80fd5b50610156610151366004610c91565b610302565b005b348015610163575f80fd5b50610156610172366004610cce565b610485565b348015610182575f80fd5b5061018b6105e9565b60405190815260200161012e565b3480156101a4575f80fd5b506101e16040518060400160405280600581526020017f312e362e3000000000000000000000000000000000000000000000000000000081525081565b60405161012e9190610ce9565b3480156101f9575f80fd5b5060025461010d9073ffffffffffffffffffffffffffffffffffffffff1681565b348015610225575f80fd5b5060025461024b9074010000000000000000000000000000000000000000900460ff1681565b60405161012e9190610da2565b348015610263575f80fd5b5061018b60015481565b348015610278575f80fd5b5061018b5f5481565b34801561028c575f80fd5b5061015661029b366004610db6565b610923565b3480156102ab575f80fd5b506101566102ba366004610dcd565b610a46565b3480156102ca575f80fd5b5060025474010000000000000000000000000000000000000000900460ff1661024b565b3480156102f9575f80fd5b5060015461018b565b73420000000000000000000000000000000000001873ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561035f573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906103839190610e08565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146103e7576040517f7cd7e09f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600280547401000000000000000000000000000000000000000080820460ff1692849290917fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff9091169083600181111561044357610443610d3c565b02179055507ff2ec44eb1c3b3acd547b76333eb2c4b27eee311860c57a9fdb04c95f62398fc88183604051610479929190610e23565b60405180910390a15050565b73420000000000000000000000000000000000001873ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156104e2573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906105069190610e08565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461056a576040517f7cd7e09f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff000000000000000000000000000000000000000083168117909355604080519190921680825260208201939093527f62e69886a5df0ba8ffcacbfc1388754e7abd9bde24b036354c561f1acd4e45939101610479565b5f6001544710156106a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604a60248201527f4665655661756c743a207769746864726177616c20616d6f756e74206d75737460448201527f2062652067726561746572207468616e206d696e696d756d207769746864726160648201527f77616c20616d6f756e7400000000000000000000000000000000000000000000608482015260a4015b60405180910390fd5b479050805f808282546106ba9190610e3e565b90915550506002546040805183815273ffffffffffffffffffffffffffffffffffffffff90921660208301523382820152517fc8a211cc64b6ed1b50595a9fcb1932b6d1e5a6e8ef15b60e5b1f988ea9086bba9181900360600190a16002546040517f38e04cbeb8c10f8f568618aa75be0f10b6729b8b4237743b4de20cbcde2839ee9161077f91849173ffffffffffffffffffffffffffffffffffffffff811691339174010000000000000000000000000000000000000000900460ff1690610e76565b60405180910390a1600160025474010000000000000000000000000000000000000000900460ff1660018111156107b8576107b8610d3c565b03610875576002545f906107e29073ffffffffffffffffffffffffffffffffffffffff1683610c5a565b905080610871576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f4665655661756c743a206661696c656420746f2073656e642045544820746f2060448201527f4c322066656520726563697069656e7400000000000000000000000000000000606482015260840161069e565b5090565b6002546040517fc2b3e5ac00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff909116600482015262061a806024820152606060448201525f60648201527342000000000000000000000000000000000000169063c2b3e5ac9083906084015f604051808303818588803b158015610909575f80fd5b505af115801561091b573d5f803e3d5ffd5b505050505090565b73420000000000000000000000000000000000001873ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610980573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109a49190610e08565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610a08576040517f7cd7e09f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600180549082905560408051828152602081018490527f895a067c78583e800418fabf3da26a9496aab2ff3429cebdf7fefa642b2e42039101610479565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000810460ff16159067ffffffffffffffff165f81158015610a905750825b90505f8267ffffffffffffffff166001148015610aac5750303b155b905081158015610aba575080155b15610af1576040517ff92ee8a900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b84547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001660011785558315610b525784547fffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffff16680100000000000000001785555b6002805473ffffffffffffffffffffffffffffffffffffffff8a167fffffffffffffffffffffffff000000000000000000000000000000000000000082168117835560018a81558993927fffffffffffffffffffffff000000000000000000000000000000000000000000169091179074010000000000000000000000000000000000000000908490811115610bea57610bea610d3c565b02179055508315610c505784547fffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffff168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b5050505050505050565b5f610c66835a84610c6d565b9392505050565b5f805f805f858888f1949350505050565b803560028110610c8c575f80fd5b919050565b5f60208284031215610ca1575f80fd5b610c6682610c7e565b73ffffffffffffffffffffffffffffffffffffffff81168114610ccb575f80fd5b50565b5f60208284031215610cde575f80fd5b8135610c6681610caa565b602081525f82518060208401528060208501604085015e5f6040828501015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011684010191505092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b60028110610d9e577f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b9052565b60208101610db08284610d69565b92915050565b5f60208284031215610dc6575f80fd5b5035919050565b5f805f60608486031215610ddf575f80fd5b8335610dea81610caa565b925060208401359150610dff60408501610c7e565b90509250925092565b5f60208284031215610e18575f80fd5b8151610c6681610caa565b60408101610e318285610d69565b610c666020830184610d69565b80820180821115610db0577f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b84815273ffffffffffffffffffffffffffffffffffffffff84811660208301528316604082015260808101610eae6060830184610d69565b9594505050505056fea164736f6c6343000819000a"; bytes public constant baseFeeVaultCreationCode = - hex"60e060405234801561001057600080fd5b50604051610f3c380380610f3c83398101604081905261002f91610079565b6001600160a01b03831660a0526080829052828282806001811115610056576100566100cc565b60c081600181111561006a5761006a6100cc565b815250505050505050506100e2565b60008060006060848603121561008e57600080fd5b83516001600160a01b03811681146100a557600080fd5b602085015160408601519194509250600281106100c157600080fd5b809150509250925092565b634e487b7160e01b600052602160045260246000fd5b60805160a05160c051610e176101256000396000818161028401526109e101526000818160e901526109710152600081816102b80152610a350152610e176000f3fe6080604052600436106100cb5760003560e01c806382356d8a1161007457806385b5b14d1161004e57806385b5b14d14610252578063d0e12f9014610272578063d3e5792b146102a657600080fd5b806382356d8a146102055780638312f1491461022757806384411d651461023c57600080fd5b80633ccfd60b116100a55780633ccfd60b1461017757806354fd4d501461019a57806366d003ac146101f057600080fd5b80630d9019e1146100d7578063307f2962146101355780633bbed4a01461015757600080fd5b366100d257005b600080fd5b3480156100e357600080fd5b5061010b7f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b34801561014157600080fd5b50610155610150366004610be5565b6102da565b005b34801561016357600080fd5b50610155610172366004610c2b565b6104a2565b34801561018357600080fd5b5061018c610622565b60405190815260200161012c565b3480156101a657600080fd5b506101e36040518060400160405280600581526020017f312e362e3000000000000000000000000000000000000000000000000000000081525081565b60405161012c9190610c48565b3480156101fc57600080fd5b5061010b61092a565b34801561021157600080fd5b5061021a610993565b60405161012c9190610d25565b34801561023357600080fd5b5061018c610a03565b34801561024857600080fd5b5061018c60005481565b34801561025e57600080fd5b5061015561026d366004610d39565b610a57565b34801561027e57600080fd5b5061021a7f000000000000000000000000000000000000000000000000000000000000000081565b3480156102b257600080fd5b5061018c7f000000000000000000000000000000000000000000000000000000000000000081565b73420000000000000000000000000000000000001873ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610339573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061035d9190610d52565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146103c1576040517f7cd7e09f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600280547401000000000000000000000000000000000000000080820460ff1692849290917fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff9091169083600181111561041d5761041d610cbb565b0217905550600280547fffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffff16770100000000000000000000000000000000000000000000001790556040517ff2ec44eb1c3b3acd547b76333eb2c4b27eee311860c57a9fdb04c95f62398fc8906104969083908590610d6f565b60405180910390a15050565b73420000000000000000000000000000000000001873ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610501573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105259190610d52565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610589576040517f7cd7e09f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600280547fffffffffffffffffffff00ff0000000000000000000000000000000000000000811673ffffffffffffffffffffffffffffffffffffffff84811691821775010000000000000000000000000000000000000000001790935560408051939092168084526020840191909152917f62e69886a5df0ba8ffcacbfc1388754e7abd9bde24b036354c561f1acd4e45939101610496565b600061062c610a03565b4710156106e6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604a60248201527f4665655661756c743a207769746864726177616c20616d6f756e74206d75737460448201527f2062652067726561746572207468616e206d696e696d756d207769746864726160648201527f77616c20616d6f756e7400000000000000000000000000000000000000000000608482015260a4015b60405180910390fd5b479050806000808282546106fa9190610d8a565b909155507fc8a211cc64b6ed1b50595a9fcb1932b6d1e5a6e8ef15b60e5b1f988ea9086bba90508161072a61092a565b6040805192835273ffffffffffffffffffffffffffffffffffffffff9091166020830152339082015260600160405180910390a17f38e04cbeb8c10f8f568618aa75be0f10b6729b8b4237743b4de20cbcde2839ee8161078861092a565b33610791610993565b6040516107a19493929190610dc9565b60405180910390a160016107b3610993565b60018111156107c4576107c4610cbb565b0361086f5760006107dc6107d661092a565b83610bbd565b90508061086b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f4665655661756c743a206661696c656420746f2073656e642045544820746f2060448201527f4c322066656520726563697069656e740000000000000000000000000000000060648201526084016106dd565b5090565b73420000000000000000000000000000000000001663c2b3e5ac8261089261092a565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b16815273ffffffffffffffffffffffffffffffffffffffff909116600482015262061a80602482015260606044820152600060648201526084016000604051808303818588803b15801561090e57600080fd5b505af1158015610922573d6000803e3d6000fd5b505050505090565b6002546000907501000000000000000000000000000000000000000000900460ff161561096e575060025473ffffffffffffffffffffffffffffffffffffffff1690565b507f000000000000000000000000000000000000000000000000000000000000000090565b60025460009077010000000000000000000000000000000000000000000000900460ff16156109de575060025474010000000000000000000000000000000000000000900460ff1690565b507f000000000000000000000000000000000000000000000000000000000000000090565b600254600090760100000000000000000000000000000000000000000000900460ff1615610a32575060015490565b507f000000000000000000000000000000000000000000000000000000000000000090565b73420000000000000000000000000000000000001873ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610ab6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ada9190610d52565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610b3e576040517f7cd7e09f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001805490829055600280547fffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffff1676010000000000000000000000000000000000000000000017905560408051828152602081018490527f895a067c78583e800418fabf3da26a9496aab2ff3429cebdf7fefa642b2e42039101610496565b6000610bca835a84610bd1565b9392505050565b6000806000806000858888f1949350505050565b600060208284031215610bf757600080fd5b813560028110610bca57600080fd5b73ffffffffffffffffffffffffffffffffffffffff81168114610c2857600080fd5b50565b600060208284031215610c3d57600080fd5b8135610bca81610c06565b600060208083528351808285015260005b81811015610c7557858101830151858201604001528201610c59565b81811115610c87576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b60028110610d21577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b9052565b60208101610d338284610cea565b92915050565b600060208284031215610d4b57600080fd5b5035919050565b600060208284031215610d6457600080fd5b8151610bca81610c06565b60408101610d7d8285610cea565b610bca6020830184610cea565b60008219821115610dc4577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b500190565b84815273ffffffffffffffffffffffffffffffffffffffff84811660208301528316604082015260808101610e016060830184610cea565b9594505050505056fea164736f6c634300080f000a"; + hex"6080604052348015600e575f80fd5b5060156019565b60c9565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff161560685760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b039081161460c65780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b610eb9806100d65f395ff3fe6080604052600436106100d1575f3560e01c806382356d8a1161007c57806385b5b14d1161005757806385b5b14d14610276578063b49dc74114610295578063d0e12f90146102b4578063d3e5792b146102e3575f80fd5b806382356d8a1461020f5780638312f1491461024d57806384411d6514610262575f80fd5b80633ccfd60b116100ac5780633ccfd60b1461016c57806354fd4d501461018e57806366d003ac146101e3575f80fd5b80630d9019e1146100dc578063307f29621461012c5780633bbed4a01461014d575f80fd5b366100d857005b5f80fd5b3480156100e7575f80fd5b5060025473ffffffffffffffffffffffffffffffffffffffff165b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b348015610137575f80fd5b5061014b610146366004610c86565b6102f7565b005b348015610158575f80fd5b5061014b610167366004610cc3565b61047a565b348015610177575f80fd5b506101806105de565b604051908152602001610123565b348015610199575f80fd5b506101d66040518060400160405280600581526020017f312e362e3000000000000000000000000000000000000000000000000000000081525081565b6040516101239190610cde565b3480156101ee575f80fd5b506002546101029073ffffffffffffffffffffffffffffffffffffffff1681565b34801561021a575f80fd5b506002546102409074010000000000000000000000000000000000000000900460ff1681565b6040516101239190610d97565b348015610258575f80fd5b5061018060015481565b34801561026d575f80fd5b506101805f5481565b348015610281575f80fd5b5061014b610290366004610dab565b610918565b3480156102a0575f80fd5b5061014b6102af366004610dc2565b610a3b565b3480156102bf575f80fd5b5060025474010000000000000000000000000000000000000000900460ff16610240565b3480156102ee575f80fd5b50600154610180565b73420000000000000000000000000000000000001873ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610354573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906103789190610dfd565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146103dc576040517f7cd7e09f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600280547401000000000000000000000000000000000000000080820460ff1692849290917fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff9091169083600181111561043857610438610d31565b02179055507ff2ec44eb1c3b3acd547b76333eb2c4b27eee311860c57a9fdb04c95f62398fc8818360405161046e929190610e18565b60405180910390a15050565b73420000000000000000000000000000000000001873ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156104d7573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104fb9190610dfd565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461055f576040517f7cd7e09f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff000000000000000000000000000000000000000083168117909355604080519190921680825260208201939093527f62e69886a5df0ba8ffcacbfc1388754e7abd9bde24b036354c561f1acd4e4593910161046e565b5f60015447101561069c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604a60248201527f4665655661756c743a207769746864726177616c20616d6f756e74206d75737460448201527f2062652067726561746572207468616e206d696e696d756d207769746864726160648201527f77616c20616d6f756e7400000000000000000000000000000000000000000000608482015260a4015b60405180910390fd5b479050805f808282546106af9190610e33565b90915550506002546040805183815273ffffffffffffffffffffffffffffffffffffffff90921660208301523382820152517fc8a211cc64b6ed1b50595a9fcb1932b6d1e5a6e8ef15b60e5b1f988ea9086bba9181900360600190a16002546040517f38e04cbeb8c10f8f568618aa75be0f10b6729b8b4237743b4de20cbcde2839ee9161077491849173ffffffffffffffffffffffffffffffffffffffff811691339174010000000000000000000000000000000000000000900460ff1690610e6b565b60405180910390a1600160025474010000000000000000000000000000000000000000900460ff1660018111156107ad576107ad610d31565b0361086a576002545f906107d79073ffffffffffffffffffffffffffffffffffffffff1683610c4f565b905080610866576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f4665655661756c743a206661696c656420746f2073656e642045544820746f2060448201527f4c322066656520726563697069656e74000000000000000000000000000000006064820152608401610693565b5090565b6002546040517fc2b3e5ac00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff909116600482015262061a806024820152606060448201525f60648201527342000000000000000000000000000000000000169063c2b3e5ac9083906084015f604051808303818588803b1580156108fe575f80fd5b505af1158015610910573d5f803e3d5ffd5b505050505090565b73420000000000000000000000000000000000001873ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610975573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109999190610dfd565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146109fd576040517f7cd7e09f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600180549082905560408051828152602081018490527f895a067c78583e800418fabf3da26a9496aab2ff3429cebdf7fefa642b2e4203910161046e565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000810460ff16159067ffffffffffffffff165f81158015610a855750825b90505f8267ffffffffffffffff166001148015610aa15750303b155b905081158015610aaf575080155b15610ae6576040517ff92ee8a900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b84547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001660011785558315610b475784547fffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffff16680100000000000000001785555b6002805473ffffffffffffffffffffffffffffffffffffffff8a167fffffffffffffffffffffffff000000000000000000000000000000000000000082168117835560018a81558993927fffffffffffffffffffffff000000000000000000000000000000000000000000169091179074010000000000000000000000000000000000000000908490811115610bdf57610bdf610d31565b02179055508315610c455784547fffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffff168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b5050505050505050565b5f610c5b835a84610c62565b9392505050565b5f805f805f858888f1949350505050565b803560028110610c81575f80fd5b919050565b5f60208284031215610c96575f80fd5b610c5b82610c73565b73ffffffffffffffffffffffffffffffffffffffff81168114610cc0575f80fd5b50565b5f60208284031215610cd3575f80fd5b8135610c5b81610c9f565b602081525f82518060208401528060208501604085015e5f6040828501015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011684010191505092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b60028110610d93577f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b9052565b60208101610da58284610d5e565b92915050565b5f60208284031215610dbb575f80fd5b5035919050565b5f805f60608486031215610dd4575f80fd5b8335610ddf81610c9f565b925060208401359150610df460408501610c73565b90509250925092565b5f60208284031215610e0d575f80fd5b8151610c5b81610c9f565b60408101610e268285610d5e565b610c5b6020830184610d5e565b80820180821115610da5577f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b84815273ffffffffffffffffffffffffffffffffffffffff84811660208301528316604082015260808101610ea36060830184610d5e565b9594505050505056fea164736f6c6343000819000a"; bytes public constant l1FeeVaultCreationCode = - hex"60e060405234801561001057600080fd5b50604051610f3c380380610f3c83398101604081905261002f91610079565b6001600160a01b03831660a0526080829052828282806001811115610056576100566100cc565b60c081600181111561006a5761006a6100cc565b815250505050505050506100e2565b60008060006060848603121561008e57600080fd5b83516001600160a01b03811681146100a557600080fd5b602085015160408601519194509250600281106100c157600080fd5b809150509250925092565b634e487b7160e01b600052602160045260246000fd5b60805160a05160c051610e176101256000396000818161028401526109e101526000818160e901526109710152600081816102b80152610a350152610e176000f3fe6080604052600436106100cb5760003560e01c806382356d8a1161007457806385b5b14d1161004e57806385b5b14d14610252578063d0e12f9014610272578063d3e5792b146102a657600080fd5b806382356d8a146102055780638312f1491461022757806384411d651461023c57600080fd5b80633ccfd60b116100a55780633ccfd60b1461017757806354fd4d501461019a57806366d003ac146101f057600080fd5b80630d9019e1146100d7578063307f2962146101355780633bbed4a01461015757600080fd5b366100d257005b600080fd5b3480156100e357600080fd5b5061010b7f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b34801561014157600080fd5b50610155610150366004610be5565b6102da565b005b34801561016357600080fd5b50610155610172366004610c2b565b6104a2565b34801561018357600080fd5b5061018c610622565b60405190815260200161012c565b3480156101a657600080fd5b506101e36040518060400160405280600581526020017f312e362e3000000000000000000000000000000000000000000000000000000081525081565b60405161012c9190610c48565b3480156101fc57600080fd5b5061010b61092a565b34801561021157600080fd5b5061021a610993565b60405161012c9190610d25565b34801561023357600080fd5b5061018c610a03565b34801561024857600080fd5b5061018c60005481565b34801561025e57600080fd5b5061015561026d366004610d39565b610a57565b34801561027e57600080fd5b5061021a7f000000000000000000000000000000000000000000000000000000000000000081565b3480156102b257600080fd5b5061018c7f000000000000000000000000000000000000000000000000000000000000000081565b73420000000000000000000000000000000000001873ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610339573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061035d9190610d52565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146103c1576040517f7cd7e09f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600280547401000000000000000000000000000000000000000080820460ff1692849290917fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff9091169083600181111561041d5761041d610cbb565b0217905550600280547fffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffff16770100000000000000000000000000000000000000000000001790556040517ff2ec44eb1c3b3acd547b76333eb2c4b27eee311860c57a9fdb04c95f62398fc8906104969083908590610d6f565b60405180910390a15050565b73420000000000000000000000000000000000001873ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610501573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105259190610d52565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610589576040517f7cd7e09f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600280547fffffffffffffffffffff00ff0000000000000000000000000000000000000000811673ffffffffffffffffffffffffffffffffffffffff84811691821775010000000000000000000000000000000000000000001790935560408051939092168084526020840191909152917f62e69886a5df0ba8ffcacbfc1388754e7abd9bde24b036354c561f1acd4e45939101610496565b600061062c610a03565b4710156106e6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604a60248201527f4665655661756c743a207769746864726177616c20616d6f756e74206d75737460448201527f2062652067726561746572207468616e206d696e696d756d207769746864726160648201527f77616c20616d6f756e7400000000000000000000000000000000000000000000608482015260a4015b60405180910390fd5b479050806000808282546106fa9190610d8a565b909155507fc8a211cc64b6ed1b50595a9fcb1932b6d1e5a6e8ef15b60e5b1f988ea9086bba90508161072a61092a565b6040805192835273ffffffffffffffffffffffffffffffffffffffff9091166020830152339082015260600160405180910390a17f38e04cbeb8c10f8f568618aa75be0f10b6729b8b4237743b4de20cbcde2839ee8161078861092a565b33610791610993565b6040516107a19493929190610dc9565b60405180910390a160016107b3610993565b60018111156107c4576107c4610cbb565b0361086f5760006107dc6107d661092a565b83610bbd565b90508061086b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f4665655661756c743a206661696c656420746f2073656e642045544820746f2060448201527f4c322066656520726563697069656e740000000000000000000000000000000060648201526084016106dd565b5090565b73420000000000000000000000000000000000001663c2b3e5ac8261089261092a565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b16815273ffffffffffffffffffffffffffffffffffffffff909116600482015262061a80602482015260606044820152600060648201526084016000604051808303818588803b15801561090e57600080fd5b505af1158015610922573d6000803e3d6000fd5b505050505090565b6002546000907501000000000000000000000000000000000000000000900460ff161561096e575060025473ffffffffffffffffffffffffffffffffffffffff1690565b507f000000000000000000000000000000000000000000000000000000000000000090565b60025460009077010000000000000000000000000000000000000000000000900460ff16156109de575060025474010000000000000000000000000000000000000000900460ff1690565b507f000000000000000000000000000000000000000000000000000000000000000090565b600254600090760100000000000000000000000000000000000000000000900460ff1615610a32575060015490565b507f000000000000000000000000000000000000000000000000000000000000000090565b73420000000000000000000000000000000000001873ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610ab6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ada9190610d52565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610b3e576040517f7cd7e09f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001805490829055600280547fffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffff1676010000000000000000000000000000000000000000000017905560408051828152602081018490527f895a067c78583e800418fabf3da26a9496aab2ff3429cebdf7fefa642b2e42039101610496565b6000610bca835a84610bd1565b9392505050565b6000806000806000858888f1949350505050565b600060208284031215610bf757600080fd5b813560028110610bca57600080fd5b73ffffffffffffffffffffffffffffffffffffffff81168114610c2857600080fd5b50565b600060208284031215610c3d57600080fd5b8135610bca81610c06565b600060208083528351808285015260005b81811015610c7557858101830151858201604001528201610c59565b81811115610c87576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b60028110610d21577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b9052565b60208101610d338284610cea565b92915050565b600060208284031215610d4b57600080fd5b5035919050565b600060208284031215610d6457600080fd5b8151610bca81610c06565b60408101610d7d8285610cea565b610bca6020830184610cea565b60008219821115610dc4577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b500190565b84815273ffffffffffffffffffffffffffffffffffffffff84811660208301528316604082015260808101610e016060830184610cea565b9594505050505056fea164736f6c634300080f000a"; + hex"6080604052348015600e575f80fd5b5060156019565b60c9565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff161560685760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b039081161460c65780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b610eb9806100d65f395ff3fe6080604052600436106100d1575f3560e01c806382356d8a1161007c57806385b5b14d1161005757806385b5b14d14610276578063b49dc74114610295578063d0e12f90146102b4578063d3e5792b146102e3575f80fd5b806382356d8a1461020f5780638312f1491461024d57806384411d6514610262575f80fd5b80633ccfd60b116100ac5780633ccfd60b1461016c57806354fd4d501461018e57806366d003ac146101e3575f80fd5b80630d9019e1146100dc578063307f29621461012c5780633bbed4a01461014d575f80fd5b366100d857005b5f80fd5b3480156100e7575f80fd5b5060025473ffffffffffffffffffffffffffffffffffffffff165b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b348015610137575f80fd5b5061014b610146366004610c86565b6102f7565b005b348015610158575f80fd5b5061014b610167366004610cc3565b61047a565b348015610177575f80fd5b506101806105de565b604051908152602001610123565b348015610199575f80fd5b506101d66040518060400160405280600581526020017f312e362e3000000000000000000000000000000000000000000000000000000081525081565b6040516101239190610cde565b3480156101ee575f80fd5b506002546101029073ffffffffffffffffffffffffffffffffffffffff1681565b34801561021a575f80fd5b506002546102409074010000000000000000000000000000000000000000900460ff1681565b6040516101239190610d97565b348015610258575f80fd5b5061018060015481565b34801561026d575f80fd5b506101805f5481565b348015610281575f80fd5b5061014b610290366004610dab565b610918565b3480156102a0575f80fd5b5061014b6102af366004610dc2565b610a3b565b3480156102bf575f80fd5b5060025474010000000000000000000000000000000000000000900460ff16610240565b3480156102ee575f80fd5b50600154610180565b73420000000000000000000000000000000000001873ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610354573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906103789190610dfd565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146103dc576040517f7cd7e09f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600280547401000000000000000000000000000000000000000080820460ff1692849290917fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff9091169083600181111561043857610438610d31565b02179055507ff2ec44eb1c3b3acd547b76333eb2c4b27eee311860c57a9fdb04c95f62398fc8818360405161046e929190610e18565b60405180910390a15050565b73420000000000000000000000000000000000001873ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156104d7573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104fb9190610dfd565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461055f576040517f7cd7e09f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff000000000000000000000000000000000000000083168117909355604080519190921680825260208201939093527f62e69886a5df0ba8ffcacbfc1388754e7abd9bde24b036354c561f1acd4e4593910161046e565b5f60015447101561069c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604a60248201527f4665655661756c743a207769746864726177616c20616d6f756e74206d75737460448201527f2062652067726561746572207468616e206d696e696d756d207769746864726160648201527f77616c20616d6f756e7400000000000000000000000000000000000000000000608482015260a4015b60405180910390fd5b479050805f808282546106af9190610e33565b90915550506002546040805183815273ffffffffffffffffffffffffffffffffffffffff90921660208301523382820152517fc8a211cc64b6ed1b50595a9fcb1932b6d1e5a6e8ef15b60e5b1f988ea9086bba9181900360600190a16002546040517f38e04cbeb8c10f8f568618aa75be0f10b6729b8b4237743b4de20cbcde2839ee9161077491849173ffffffffffffffffffffffffffffffffffffffff811691339174010000000000000000000000000000000000000000900460ff1690610e6b565b60405180910390a1600160025474010000000000000000000000000000000000000000900460ff1660018111156107ad576107ad610d31565b0361086a576002545f906107d79073ffffffffffffffffffffffffffffffffffffffff1683610c4f565b905080610866576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f4665655661756c743a206661696c656420746f2073656e642045544820746f2060448201527f4c322066656520726563697069656e74000000000000000000000000000000006064820152608401610693565b5090565b6002546040517fc2b3e5ac00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff909116600482015262061a806024820152606060448201525f60648201527342000000000000000000000000000000000000169063c2b3e5ac9083906084015f604051808303818588803b1580156108fe575f80fd5b505af1158015610910573d5f803e3d5ffd5b505050505090565b73420000000000000000000000000000000000001873ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610975573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109999190610dfd565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146109fd576040517f7cd7e09f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600180549082905560408051828152602081018490527f895a067c78583e800418fabf3da26a9496aab2ff3429cebdf7fefa642b2e4203910161046e565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000810460ff16159067ffffffffffffffff165f81158015610a855750825b90505f8267ffffffffffffffff166001148015610aa15750303b155b905081158015610aaf575080155b15610ae6576040517ff92ee8a900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b84547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001660011785558315610b475784547fffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffff16680100000000000000001785555b6002805473ffffffffffffffffffffffffffffffffffffffff8a167fffffffffffffffffffffffff000000000000000000000000000000000000000082168117835560018a81558993927fffffffffffffffffffffff000000000000000000000000000000000000000000169091179074010000000000000000000000000000000000000000908490811115610bdf57610bdf610d31565b02179055508315610c455784547fffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffff168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b5050505050505050565b5f610c5b835a84610c62565b9392505050565b5f805f805f858888f1949350505050565b803560028110610c81575f80fd5b919050565b5f60208284031215610c96575f80fd5b610c5b82610c73565b73ffffffffffffffffffffffffffffffffffffffff81168114610cc0575f80fd5b50565b5f60208284031215610cd3575f80fd5b8135610c5b81610c9f565b602081525f82518060208401528060208501604085015e5f6040828501015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011684010191505092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b60028110610d93577f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b9052565b60208101610da58284610d5e565b92915050565b5f60208284031215610dbb575f80fd5b5035919050565b5f805f60608486031215610dd4575f80fd5b8335610ddf81610c9f565b925060208401359150610df460408501610c73565b90509250925092565b5f60208284031215610e0d575f80fd5b8151610c5b81610c9f565b60408101610e268285610d5e565b610c5b6020830184610d5e565b80820180821115610da5577f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b84815273ffffffffffffffffffffffffffffffffffffffff84811660208301528316604082015260808101610ea36060830184610d5e565b9594505050505056fea164736f6c6343000819000a"; bytes public constant feeSplitterCreationCode = hex"6080604052348015600e575f80fd5b5060156019565b60d4565b5f54610100900460ff161560835760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b5f5460ff908116101560d2575f805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6112f1806100e15f395ff3fe608060405260043610610096575f3560e01c80637dfbd04911610066578063b87ea8d41161004c578063b87ea8d414610313578063c4d66de814610327578063d61a398b14610346575f80fd5b80637dfbd049146102dd5780637fc81bb7146102f4575f80fd5b80630a7617b3146101dd5780630c0544a3146101fe578063394d27311461026057806354fd4d5014610288575f80fd5b366101d9577fe3007e9730850b5618eacb0537bef0cf0f1600267ae8549e472449d77b731e455c6100f3576040517f17617f6100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b337342000000000000000000000000000000000000111480159061012b57503373420000000000000000000000000000000000001914155b801561014b57503373420000000000000000000000000000000000001a14155b801561016b57503373420000000000000000000000000000000000001b14155b156101a2576040517f9dcde10900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60405134815233907f2ccfc58c2cef4ee590b5f16be0548cc54afc12e1c66a67b362b7d640fd16bb2d9060200160405180910390a2005b5f80fd5b3480156101e8575f80fd5b506101fc6101f7366004610f4b565b61039c565b005b348015610209575f80fd5b5060015461023a9070010000000000000000000000000000000090046fffffffffffffffffffffffffffffffff1681565b6040516fffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b34801561026b575f80fd5b5060015461023a906fffffffffffffffffffffffffffffffff1681565b348015610293575f80fd5b506102d06040518060400160405280600581526020017f312e302e3000000000000000000000000000000000000000000000000000000081525081565b6040516102579190610f66565b3480156102e8575f80fd5b5061023a6301e1338081565b3480156102ff575f80fd5b506101fc61030e366004610fb9565b61055e565b34801561031e575f80fd5b506101fc610706565b348015610332575f80fd5b506101fc610341366004610f4b565b610aea565b348015610351575f80fd5b505f546103779062010000900473ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610257565b73420000000000000000000000000000000000001873ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156103f9573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061041d9190610fe8565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610481576040517f38bac74200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff81166104ce576040517f99c6ec0800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f805473ffffffffffffffffffffffffffffffffffffffff838116620100008181027fffffffffffffffffffff0000000000000000000000000000000000000000ffff85161790945560408051949093049091168084526020840191909152917f16417cc372deec0caee5f52e2ad77a5f07b4591fd56b4ff31b6e20f817d4daeb91015b60405180910390a15050565b73420000000000000000000000000000000000001873ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156105bb573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906105df9190610fe8565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610643576040517f38bac74200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6301e133806fffffffffffffffffffffffffffffffff82161115610693576040517f30b9f35e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600180546fffffffffffffffffffffffffffffffff8381167001000000000000000000000000000000008181028385161790945560408051949093049091168084526020840191909152917f4492086b630ed3846eec0979dd87a71c814ceb1c6dab80ab81e3450b21e4de289101610552565b60015461073b906fffffffffffffffffffffffffffffffff700100000000000000000000000000000000820481169116611030565b6fffffffffffffffffffffffffffffffff16421015610786576040517f1e4a9f3a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600180547fffffffffffffffffffffffffffffffff0000000000000000000000000000000016426fffffffffffffffffffffffffffffffff161781556107cb90610ce0565b5f6107e9734200000000000000000000000000000000000011610d06565b90505f610809734200000000000000000000000000000000000019610d06565b90505f61082973420000000000000000000000000000000000001a610d06565b90505f61084973420000000000000000000000000000000000001b610d06565b90506108545f610ce0565b5f82826108618688611060565b61086b9190611060565b6108759190611060565b9050805f036108b0576040517fc8972e5200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f80546040517f54e7f42d000000000000000000000000000000000000000000000000000000008152600481018890526024810187905260448101859052606481018690526201000090910473ffffffffffffffffffffffffffffffffffffffff16906354e7f42d906084015f60405180830381865afa158015610936573d5f803e3d5ffd5b505050506040513d5f823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016820160405261097b9190810190611118565b905080515f036109b7576040517f763970d600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f805b8251811015610a6e575f8382815181106109d6576109d66111e7565b60200260200101515f015190505f8483815181106109f6576109f66111e7565b6020026020010151602001519050805f03610a12575050610a66565b5f610a1d8383610f03565b905080610a56576040517fd68d1b1800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610a608286611060565b94505050505b6001016109ba565b50828114610aa8576040517f9c01eac000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f73f9a13241a1848ec157967f3a85601709353e616f1f2605d818c0f2d21774df8284604051610ad9929190611214565b60405180910390a150505050505050565b5f54610100900460ff1615808015610b0857505f54600160ff909116105b80610b215750303b158015610b2157505f5460ff166001145b610bb1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a6564000000000000000000000000000000000000606482015260840160405180910390fd5b5f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558015610c0d575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b5f80547fffffffffffffffffffff0000000000000000000000000000000000000000ffff166201000073ffffffffffffffffffffffffffffffffffffffff851602179055600180546fffffffffffffffffffffffffffffffff1672015180000000000000000000000000000000001790558015610cdc575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb384740249890602001610552565b5050565b807fe3007e9730850b5618eacb0537bef0cf0f1600267ae8549e472449d77b731e455d50565b5f60018273ffffffffffffffffffffffffffffffffffffffff166382356d8a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610d52573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610d7691906112af565b6001811115610d8757610d87611282565b14610dbe576040517fb4726cbe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b3073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff166366d003ac6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610e1e573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e429190610fe8565b73ffffffffffffffffffffffffffffffffffffffff1614610e8f576040517fc3380cef00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8173ffffffffffffffffffffffffffffffffffffffff16633ccfd60b6040518163ffffffff1660e01b81526004016020604051808303815f875af1158015610ed9573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610efd91906112cd565b92915050565b5f610f0f835a84610f16565b9392505050565b5f805f805f858888f1949350505050565b73ffffffffffffffffffffffffffffffffffffffff81168114610f48575f80fd5b50565b5f60208284031215610f5b575f80fd5b8135610f0f81610f27565b602081525f82518060208401528060208501604085015e5f6040828501015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011684010191505092915050565b5f60208284031215610fc9575f80fd5b81356fffffffffffffffffffffffffffffffff81168114610f0f575f80fd5b5f60208284031215610ff8575f80fd5b8151610f0f81610f27565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b6fffffffffffffffffffffffffffffffff81811683821601908082111561105957611059611003565b5092915050565b80820180821115610efd57610efd611003565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b6040805190810167ffffffffffffffff811182821017156110c3576110c3611073565b60405290565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff8111828210171561111057611110611073565b604052919050565b5f6020808385031215611129575f80fd5b825167ffffffffffffffff80821115611140575f80fd5b818501915085601f830112611153575f80fd5b81518181111561116557611165611073565b611173848260051b016110c9565b818152848101925060069190911b830184019087821115611192575f80fd5b928401925b818410156111dc57604084890312156111ae575f80fd5b6111b66110a0565b84516111c181610f27565b81528486015186820152835260409093019291840191611197565b979650505050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b604080825283518282018190525f91906020906060850190828801855b8281101561126c578151805173ffffffffffffffffffffffffffffffffffffffff168552850151858501529285019290840190600101611231565b5050508093505050508260208301529392505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b5f602082840312156112bf575f80fd5b815160028110610f0f575f80fd5b5f602082840312156112dd575f80fd5b505191905056fea164736f6c6343000819000a"; bytes public constant scRevShareCalculatorCreationCode = diff --git a/src/template/DeployFeesDepositor.sol b/src/template/DeployFeesDepositor.sol index 4402b78b4f..9c24d15ff3 100644 --- a/src/template/DeployFeesDepositor.sol +++ b/src/template/DeployFeesDepositor.sol @@ -70,7 +70,7 @@ contract DeployFeesDepositor is SimpleTaskBase { /// @notice Sets up the template with implementation configurations from a TOML file. /// State overrides are not applied yet. Keep this in mind when performing various pre-simulation assertions in this function. - function _templateSetup(string memory _taskConfigFilePath, address _rootSafe) internal override { + function _templateSetup(string memory _taskConfigFilePath, address) internal override { string memory tomlContent = vm.readFile(_taskConfigFilePath); salt = tomlContent.readString(".salt"); require(bytes(salt).length > 0, "salt must be set"); @@ -109,8 +109,7 @@ contract DeployFeesDepositor is SimpleTaskBase { /// implicitly because if the calculated address of the Proxy would differ from the one we /// calculated, the task would fail on the check for code to be present, since the changes /// in build function revert and the parent contract validates that accessed accounts have code. - /// @param _rootSafe The address of the root safe (unused in this implementation). - function _build(address _rootSafe) internal override { + function _build(address) internal override { // Deploy the FeesDepositor implementation contract using CREATE2 ICreate2Deployer(CREATE2_DEPLOYER).deploy(0, bytes32(bytes(salt)), RevShareCodeRepo.feesDepositorCreationCode); diff --git a/src/template/LateOptInRevenueShare.sol b/src/template/LateOptInRevenueShare.sol index 8d5c9e3ce6..c41fad67df 100644 --- a/src/template/LateOptInRevenueShare.sol +++ b/src/template/LateOptInRevenueShare.sol @@ -126,7 +126,7 @@ contract LateOptInRevenueShare is SimpleTaskBase { /// @notice Sets up the template with implementation configurations from a TOML file. /// State overrides are not applied yet. Keep this in mind when performing various pre-simulation assertions in this function. - function _templateSetup(string memory _taskConfigFilePath, address _rootSafe) internal override { + function _templateSetup(string memory _taskConfigFilePath, address) internal override { string memory _toml = vm.readFile(_taskConfigFilePath); portal = simpleAddrRegistry.get("OptimismPortal"); diff --git a/src/template/RevenueShareUpgradePath.sol b/src/template/RevenueShareUpgradePath.sol index 5a31fef5bf..e97bbd10ae 100644 --- a/src/template/RevenueShareUpgradePath.sol +++ b/src/template/RevenueShareUpgradePath.sol @@ -27,6 +27,11 @@ interface IFeeSplitter { function initialize(address _sharesCalculator) external; } +/// @notice Interface for the vaults in L2. +interface IFeeVault { + function initialize(address _recipient, uint256 _minWithdrawalAmount, uint8 _withdrawalNetwork) external; +} + /// @notice Interface for ProxyAdmin. interface IProxyAdmin { function upgrade(address payable _proxy, address _implementation) external; @@ -322,12 +327,7 @@ contract RevenueShareV100UpgradePath is SimpleTaskBase { // Calculate addresses and data to deploy vaults // Calculate addresses and data to deploy OperatorFeeVault - bytes memory _operatorFeeVaultInitCode = bytes.concat( - RevShareCodeRepo.operatorFeeVaultCreationCode, - abi.encode( - operatorFeeVaultRecipient, operatorFeeVaultMinWithdrawalAmount, operatorFeeVaultWithdrawalNetwork - ) - ); + bytes memory _operatorFeeVaultInitCode = RevShareCodeRepo.operatorFeeVaultCreationCode; _operatorFeeVaultPrecalculatedAddress = Utils.getCreate2Address(_getSalt(saltSeed, "OperatorFeeVault"), _operatorFeeVaultInitCode, CREATE2_DEPLOYER); @@ -335,7 +335,7 @@ contract RevenueShareV100UpgradePath is SimpleTaskBase { ICreate2Deployer.deploy, (0, _getSalt(saltSeed, "OperatorFeeVault"), _operatorFeeVaultInitCode) ); - // Expected calls for OperatorFeeVault: 2 (deploy + upgrade) + // Expected calls for OperatorFeeVault: 2 (deploy + upgradeAndCall) _incrementCallsToPortal( abi.encodeCall( IOptimismPortal2.depositTransaction, @@ -351,20 +351,26 @@ contract RevenueShareV100UpgradePath is SimpleTaskBase { UPGRADE_GAS_LIMIT, false, abi.encodeCall( - IProxyAdmin.upgrade, - (payable(OPERATOR_FEE_VAULT), address(_operatorFeeVaultPrecalculatedAddress)) + IProxyAdmin.upgradeAndCall, + ( + payable(OPERATOR_FEE_VAULT), + address(_operatorFeeVaultPrecalculatedAddress), + abi.encodeCall( + IFeeVault.initialize, + ( + operatorFeeVaultRecipient, + operatorFeeVaultMinWithdrawalAmount, + operatorFeeVaultWithdrawalNetwork + ) + ) + ) ) ) ) ); // Calculate addresses and data to deploy SequencerFeeVault - bytes memory _sequencerFeeVaultInitCode = bytes.concat( - RevShareCodeRepo.sequencerFeeVaultCreationCode, - abi.encode( - sequencerFeeVaultRecipient, sequencerFeeVaultMinWithdrawalAmount, sequencerFeeVaultWithdrawalNetwork - ) - ); + bytes memory _sequencerFeeVaultInitCode = RevShareCodeRepo.sequencerFeeVaultCreationCode; _sequencerFeeVaultPrecalculatedAddress = Utils.getCreate2Address( _getSalt(saltSeed, "SequencerFeeVault"), _sequencerFeeVaultInitCode, CREATE2_DEPLOYER ); @@ -388,24 +394,32 @@ contract RevenueShareV100UpgradePath is SimpleTaskBase { UPGRADE_GAS_LIMIT, false, abi.encodeCall( - IProxyAdmin.upgrade, - (payable(SEQUENCER_FEE_VAULT), address(_sequencerFeeVaultPrecalculatedAddress)) + IProxyAdmin.upgradeAndCall, + ( + payable(SEQUENCER_FEE_VAULT), + address(_sequencerFeeVaultPrecalculatedAddress), + abi.encodeCall( + IFeeVault.initialize, + ( + sequencerFeeVaultRecipient, + sequencerFeeVaultMinWithdrawalAmount, + sequencerFeeVaultWithdrawalNetwork + ) + ) + ) ) ) ) ); // Calculate addresses and data to deploy BaseFeeVault - bytes memory _baseFeeVaultInitCode = bytes.concat( - RevShareCodeRepo.baseFeeVaultCreationCode, - abi.encode(baseFeeVaultRecipient, baseFeeVaultMinWithdrawalAmount, baseFeeVaultWithdrawalNetwork) - ); + bytes memory _baseFeeVaultInitCode = RevShareCodeRepo.baseFeeVaultCreationCode; _baseFeeVaultPrecalculatedAddress = Utils.getCreate2Address(_getSalt(saltSeed, "BaseFeeVault"), _baseFeeVaultInitCode, CREATE2_DEPLOYER); _baseFeeVaultCalldata = abi.encodeCall(ICreate2Deployer.deploy, (0, _getSalt(saltSeed, "BaseFeeVault"), _baseFeeVaultInitCode)); - // Expected calls for BaseFeeVault: 2 (deploy + upgrade) + // Expected calls for BaseFeeVault: 2 (deploy + upgradeAndCall) _incrementCallsToPortal( abi.encodeCall( IOptimismPortal2.depositTransaction, @@ -421,23 +435,28 @@ contract RevenueShareV100UpgradePath is SimpleTaskBase { UPGRADE_GAS_LIMIT, false, abi.encodeCall( - IProxyAdmin.upgrade, (payable(BASE_FEE_VAULT), address(_baseFeeVaultPrecalculatedAddress)) + IProxyAdmin.upgradeAndCall, + ( + payable(BASE_FEE_VAULT), + address(_baseFeeVaultPrecalculatedAddress), + abi.encodeCall( + IFeeVault.initialize, + (baseFeeVaultRecipient, baseFeeVaultMinWithdrawalAmount, baseFeeVaultWithdrawalNetwork) + ) + ) ) ) ) ); // Calculate addresses and data to deploy L1FeeVault - bytes memory _l1FeeVaultInitCode = bytes.concat( - RevShareCodeRepo.l1FeeVaultCreationCode, - abi.encode(l1FeeVaultRecipient, l1FeeVaultMinWithdrawalAmount, l1FeeVaultWithdrawalNetwork) - ); + bytes memory _l1FeeVaultInitCode = RevShareCodeRepo.l1FeeVaultCreationCode; _l1FeeVaultPrecalculatedAddress = Utils.getCreate2Address(_getSalt(saltSeed, "L1FeeVault"), _l1FeeVaultInitCode, CREATE2_DEPLOYER); _l1FeeVaultCalldata = abi.encodeCall(ICreate2Deployer.deploy, (0, _getSalt(saltSeed, "L1FeeVault"), _l1FeeVaultInitCode)); - // Expected calls for L1FeeVault: 2 (deploy + upgrade) + // Expected calls for L1FeeVault: 2 (deploy + upgradeAndCall) _incrementCallsToPortal( abi.encodeCall( IOptimismPortal2.depositTransaction, @@ -453,7 +472,15 @@ contract RevenueShareV100UpgradePath is SimpleTaskBase { UPGRADE_GAS_LIMIT, false, abi.encodeCall( - IProxyAdmin.upgrade, (payable(L1_FEE_VAULT), address(_l1FeeVaultPrecalculatedAddress)) + IProxyAdmin.upgradeAndCall, + ( + payable(L1_FEE_VAULT), + address(_l1FeeVaultPrecalculatedAddress), + abi.encodeCall( + IFeeVault.initialize, + (l1FeeVaultRecipient, l1FeeVaultMinWithdrawalAmount, l1FeeVaultWithdrawalNetwork) + ) + ) ) ) ) @@ -467,7 +494,7 @@ contract RevenueShareV100UpgradePath is SimpleTaskBase { _getSalt(saltSeed, "FeeSplitter"), RevShareCodeRepo.feeSplitterCreationCode, CREATE2_DEPLOYER ); - // Expected calls for FeeSplitter: 2 (deploy + upgrade) + // Expected calls for FeeSplitter: 2 (deploy + upgradeAndCall) _incrementCallsToPortal( abi.encodeCall( IOptimismPortal2.depositTransaction, @@ -561,7 +588,19 @@ contract RevenueShareV100UpgradePath is SimpleTaskBase { UPGRADE_GAS_LIMIT, false, abi.encodeCall( - IProxyAdmin.upgrade, (payable(OPERATOR_FEE_VAULT), address(_operatorFeeVaultPrecalculatedAddress)) + IProxyAdmin.upgradeAndCall, + ( + payable(OPERATOR_FEE_VAULT), + address(_operatorFeeVaultPrecalculatedAddress), + abi.encodeCall( + IFeeVault.initialize, + ( + operatorFeeVaultRecipient, + operatorFeeVaultMinWithdrawalAmount, + operatorFeeVaultWithdrawalNetwork + ) + ) + ) ) ); @@ -575,7 +614,19 @@ contract RevenueShareV100UpgradePath is SimpleTaskBase { UPGRADE_GAS_LIMIT, false, abi.encodeCall( - IProxyAdmin.upgrade, (payable(SEQUENCER_FEE_VAULT), address(_sequencerFeeVaultPrecalculatedAddress)) + IProxyAdmin.upgradeAndCall, + ( + payable(SEQUENCER_FEE_VAULT), + address(_sequencerFeeVaultPrecalculatedAddress), + abi.encodeCall( + IFeeVault.initialize, + ( + sequencerFeeVaultRecipient, + sequencerFeeVaultMinWithdrawalAmount, + sequencerFeeVaultWithdrawalNetwork + ) + ) + ) ) ); @@ -588,7 +639,17 @@ contract RevenueShareV100UpgradePath is SimpleTaskBase { 0, UPGRADE_GAS_LIMIT, false, - abi.encodeCall(IProxyAdmin.upgrade, (payable(BASE_FEE_VAULT), address(_baseFeeVaultPrecalculatedAddress))) + abi.encodeCall( + IProxyAdmin.upgradeAndCall, + ( + payable(BASE_FEE_VAULT), + address(_baseFeeVaultPrecalculatedAddress), + abi.encodeCall( + IFeeVault.initialize, + (baseFeeVaultRecipient, baseFeeVaultMinWithdrawalAmount, baseFeeVaultWithdrawalNetwork) + ) + ) + ) ); // Deploy the l1 fee vault @@ -600,7 +661,17 @@ contract RevenueShareV100UpgradePath is SimpleTaskBase { 0, UPGRADE_GAS_LIMIT, false, - abi.encodeCall(IProxyAdmin.upgrade, (payable(L1_FEE_VAULT), address(_l1FeeVaultPrecalculatedAddress))) + abi.encodeCall( + IProxyAdmin.upgradeAndCall, + ( + payable(L1_FEE_VAULT), + address(_l1FeeVaultPrecalculatedAddress), + abi.encodeCall( + IFeeVault.initialize, + (l1FeeVaultRecipient, l1FeeVaultMinWithdrawalAmount, l1FeeVaultWithdrawalNetwork) + ) + ) + ) ); } diff --git a/test/integration/IntegrationBase.t.sol b/test/integration/IntegrationBase.t.sol new file mode 100644 index 0000000000..5a478bfb83 --- /dev/null +++ b/test/integration/IntegrationBase.t.sol @@ -0,0 +1,194 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.15; + +import {Test} from "forge-std/Test.sol"; +import {Vm} from "forge-std/Vm.sol"; +import {console2} from "forge-std/console2.sol"; +import {AddressAliasHelper} from "@eth-optimism-bedrock/src/vendor/AddressAliasHelper.sol"; + +/// @title IntegrationBase +/// @notice Base contract for integration tests with L1->L2 deposit transaction replay functionality +abstract contract IntegrationBase is Test { + /// @notice Replay all deposit transactions from L1 to L2 + /// @param _forkId The fork ID to switch to for L2 execution + /// @param _isSimulate If true, only process the second half of logs to avoid duplicates. + /// Task simulations emit events twice: once during the initial dry-run + /// and once during the actual simulation. Taking the second half ensures + /// we only process the final simulation results. + function _relayAllMessages(uint256 _forkId, bool _isSimulate) internal { + vm.selectFork(_forkId); + + console2.log("\n"); + console2.log("================================================================================"); + console2.log("=== Replaying Deposit Transactions on L2 ==="); + console2.log("=== Each transaction includes Tenderly simulation link ==="); + console2.log("=== Network is set to 10 (OP Mainnet) - adjust if testing on different L2 ==="); + console2.log("================================================================================"); + + // Get logs from L1 execution + Vm.Log[] memory _allLogs = vm.getRecordedLogs(); + + // If this is a simulation, only take the second half of logs to avoid processing duplicates + // Simulations emit events twice, so we skip the first half + uint256 _startIndex = _isSimulate ? _allLogs.length / 2 : 0; + uint256 _logsCount = _isSimulate ? _allLogs.length - _startIndex : _allLogs.length; + + Vm.Log[] memory _logs = new Vm.Log[](_logsCount); + for (uint256 _i = 0; _i < _logsCount; _i++) { + _logs[_i] = _allLogs[_startIndex + _i]; + } + + // Filter for TransactionDeposited events + bytes32 _transactionDepositedHash = keccak256("TransactionDeposited(address,address,uint256,bytes)"); + + uint256 _transactionCount; + uint256 _successCount; + uint256 _failureCount; + + for (uint256 _i = 0; _i < _logs.length; _i++) { + // Check if this is a TransactionDeposited event + if (_logs[_i].topics[0] == _transactionDepositedHash) { + // Decode indexed parameters + address _from = address(uint160(uint256(_logs[_i].topics[1]))); + address _to = address(uint160(uint256(_logs[_i].topics[2]))); + + // Decode the opaqueData + bytes memory _opaqueData = abi.decode(_logs[_i].data, (bytes)); + + _transactionCount++; + + // Process and execute the transaction + bool _success = _processDepositTransaction(_from, _to, _opaqueData, _transactionCount); + + if (_success) { + _successCount++; + } else { + _failureCount++; + } + } + } + + console2.log("\n=== Summary ==="); + console2.log("Total transactions:", _transactionCount); + console2.log("Successful transactions:", _successCount); + console2.log("Failed transactions:", _failureCount); + + // Assert all transactions succeeded + assertEq(_failureCount, 0, "All deposit transactions should succeed"); + assertEq(_successCount, _transactionCount, "All transactions should succeed"); + } + + /// @notice Process and execute a deposit transaction + function _processDepositTransaction(address _from, address _to, bytes memory _opaqueData, uint256 _txNumber) + internal + returns (bool) + { + // Extract value (bytes 0-31) + uint256 _value = uint256(bytes32(_slice(_opaqueData, 0, 32))); + + // Extract gasLimit (bytes 64-71) + uint64 _gasLimit = uint64(bytes8(_slice(_opaqueData, 64, 8))); + + // Extract data (bytes 73 onwards) + bytes memory _data = _slice(_opaqueData, 73, _opaqueData.length - 73); + + // Print Tenderly simulation parameters + _logTransactionDetails(_from, _to, _value, _gasLimit, _data, _txNumber); + + // Execute the transaction on L2 as if it came from the aliased address + vm.prank(_from); + (bool _success,) = _to.call{value: _value, gas: _gasLimit}(_data); + + return _success; + } + + /// @notice Log transaction details and Tenderly link + function _logTransactionDetails( + address _from, + address _to, + uint256 _value, + uint64 _gasLimit, + bytes memory _data, + uint256 _txNumber + ) internal pure { + if (_data.length >= 4) { + bytes4 _selector; + assembly { + _selector := mload(add(_data, 32)) + } + } + + // Generate Tenderly simulation link + string memory _tenderlyLink = _generateTenderlyLink(_to, _from, uint256(_gasLimit), _value, _data); + console2.log("\nTenderly Simulation Link for transaction #", _txNumber); + console2.log(_tenderlyLink); + } + + /// @notice Helper function to slice bytes + function _slice(bytes memory _data, uint256 _start, uint256 _length) internal pure returns (bytes memory) { + bytes memory _result = new bytes(_length); + for (uint256 _i = 0; _i < _length; _i++) { + _result[_i] = _data[_start + _i]; + } + return _result; + } + + /// @notice Generate Tenderly simulation link for L2 transaction + function _generateTenderlyLink( + address _contractAddress, + address _from, + uint256 _gas, + uint256 _value, + bytes memory _rawFunctionInput + ) internal pure returns (string memory) { + // Convert bytes to hex string + string memory _calldataHex = _bytesToHexString(_rawFunctionInput); + + // Build the Tenderly URL + // network=10 for OP Mainnet (change if testing on different L2) + return string.concat( + "https://dashboard.tenderly.co/TENDERLY_USERNAME/TENDERLY_PROJECT/simulator/new", + "?network=10", + "&contractAddress=0x", + _toAsciiString(_contractAddress), + "&from=0x", + _toAsciiString(_from), + "&gas=", + vm.toString(_gas), + "&value=", + vm.toString(_value), + "&rawFunctionInput=0x", + _calldataHex + ); + } + + /// @notice Convert address to lowercase hex string without 0x prefix + function _toAsciiString(address _addr) internal pure returns (string memory) { + bytes memory _s = new bytes(40); + for (uint256 _i = 0; _i < 20; _i++) { + bytes1 _b = bytes1(uint8(uint256(uint160(_addr)) / (2 ** (8 * (19 - _i))))); + bytes1 _hi = bytes1(uint8(_b) / 16); + bytes1 _lo = bytes1(uint8(_b) - 16 * uint8(_hi)); + _s[2 * _i] = _char(_hi); + _s[2 * _i + 1] = _char(_lo); + } + return string(_s); + } + + /// @notice Convert bytes to hex string without 0x prefix + function _bytesToHexString(bytes memory _data) internal pure returns (string memory) { + bytes memory _hexChars = "0123456789abcdef"; + bytes memory _result = new bytes(_data.length * 2); + for (uint256 _i = 0; _i < _data.length; _i++) { + _result[_i * 2] = _hexChars[uint8(_data[_i] >> 4)]; + _result[_i * 2 + 1] = _hexChars[uint8(_data[_i] & 0x0f)]; + } + return string(_result); + } + + /// @notice Convert nibble to hex character + function _char(bytes1 _b) internal pure returns (bytes1) { + if (uint8(_b) < 10) return bytes1(uint8(_b) + 0x30); + else return bytes1(uint8(_b) + 0x57); + } +} diff --git a/test/integration/RevenueShareIntegration.t.sol b/test/integration/RevenueShareIntegration.t.sol new file mode 100644 index 0000000000..e216402bf4 --- /dev/null +++ b/test/integration/RevenueShareIntegration.t.sol @@ -0,0 +1,188 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.15; + +import {RevenueShareV100UpgradePath} from "src/template/RevenueShareUpgradePath.sol"; +import {Action} from "src/libraries/MultisigTypes.sol"; +import {IntegrationBase} from "./IntegrationBase.t.sol"; +import {Test} from "forge-std/Test.sol"; + +enum WithdrawalNetwork { + L1, + L2 +} + +interface IFeeVault { + function MIN_WITHDRAWAL_AMOUNT() external view returns (uint256); + function RECIPIENT() external view returns (address); + function WITHDRAWAL_NETWORK() external view returns (WithdrawalNetwork); + function minWithdrawalAmount() external view returns (uint256); + function recipient() external view returns (address); + function withdrawalNetwork() external view returns (WithdrawalNetwork); +} + +interface IFeeSplitter { + function sharesCalculator() external view returns (address); +} + +interface IL1Withdrawer { + function minWithdrawalAmount() external view returns (uint256); + function recipient() external view returns (address); + function withdrawalGasLimit() external view returns (uint32); +} + +interface ISuperchainRevSharesCalculator { + function shareRecipient() external view returns (address payable); + function remainderRecipient() external view returns (address payable); +} + +contract RevenueShareIntegrationTest is IntegrationBase { + RevenueShareV100UpgradePath public template; + + // Fork IDs + uint256 internal _mainnetForkId; + uint256 internal _l2ForkId; + + // L2 predeploys + /// @notice Address of the Sequencer Fee Vault Predeploy on L2. + address internal constant SEQUENCER_FEE_VAULT = 0x4200000000000000000000000000000000000011; + /// @notice Address of the Operator Fee Vault Predeploy on L2. + address internal constant OPERATOR_FEE_VAULT = 0x420000000000000000000000000000000000001b; + /// @notice Address of the Base Fee Vault Predeploy on L2. + address internal constant BASE_FEE_VAULT = 0x4200000000000000000000000000000000000019; + /// @notice Address of the L1 Fee Vault Predeploy on L2. + address internal constant L1_FEE_VAULT = 0x420000000000000000000000000000000000001A; + /// @notice Address of the FeeSplitter Predeploy on L2. + address internal constant FEE_SPLITTER = 0x420000000000000000000000000000000000002B; + + // Deployed contracts (precalculated as they are deployed with CREATE2) + /// @notice Address of the L1 Withdrawer Predeploy on L2. + address internal constant L1_WITHDRAWER = 0x65E05252dd7964dBb722a9fCa24c6a2D7AFbeF57; + /// @notice Address of the Rev Share Calculator Predeploy on L2. + address internal constant REV_SHARE_CALCULATOR = 0xa9C1d283Ab6f149853337395E18850B3fF6cf192; + + function setUp() public { + _mainnetForkId = vm.createFork("http://127.0.0.1:8545"); + _l2ForkId = vm.createFork("http://127.0.0.1:9545"); + vm.selectFork(_mainnetForkId); + template = new RevenueShareV100UpgradePath(); + } + + /// @notice Test the integration of the revenue share system when the chain is opting in + function test_optInRevenueShare_integration() public { + string memory _configPath = "test/tasks/example/eth/015-revenue-share-upgrade/config.toml"; + + // Step 1: Execute L1 transaction recording logs + vm.recordLogs(); + template.simulate(_configPath, new address[](0)); + + // Step 2: Relay messages from L1 to L2 + // Pass true for _isSimulate since simulate() emits events twice + _relayAllMessages(_l2ForkId, true); + + // Step 3: Assert the state of the L2 contracts + string memory _config = vm.readFile(_configPath); + + // L1Withdrawer: check withdrawal threshold and fees depositor + assertEq( + IL1Withdrawer(L1_WITHDRAWER).minWithdrawalAmount(), + vm.parseTomlUint(_config, ".l1WithdrawerMinWithdrawalAmount") + ); + assertEq(IL1Withdrawer(L1_WITHDRAWER).recipient(), vm.parseTomlAddress(_config, ".l1WithdrawerRecipient")); + assertEq(IL1Withdrawer(L1_WITHDRAWER).withdrawalGasLimit(), vm.parseTomlUint(_config, ".l1WithdrawerGasLimit")); + + // Rev Share Calculator: check chain fees recipient and remainder recipient + assertEq(ISuperchainRevSharesCalculator(REV_SHARE_CALCULATOR).shareRecipient(), L1_WITHDRAWER); + assertEq( + ISuperchainRevSharesCalculator(REV_SHARE_CALCULATOR).remainderRecipient(), + vm.parseTomlAddress(_config, ".scRevShareCalcChainFeesRecipient") + ); + + // Fee Splitter: check calculator is set + assertEq(IFeeSplitter(FEE_SPLITTER).sharesCalculator(), REV_SHARE_CALCULATOR); + + // Vaults: recipient should be fee splitter, withdrawal network should be L2, min withdrawal amount 0 + // getters for legacy and the new values should be the same + _assertFeeVaultsState(true, _config); + } + + /// @notice Test the integration of the revenue share system when the chain is opting out + function test_optOutRevenueShare_integration() public { + string memory _configPath = "test/tasks/example/eth/019-revenueshare-upgrade-opt-out/config.toml"; + + // Step 1: Execute L1 transaction recording logs + vm.recordLogs(); + template.simulate(_configPath, new address[](0)); + + // Step 2: Relay messages from L1 to L2 + // Pass true for _isSimulate since simulate() emits events twice + _relayAllMessages(_l2ForkId, true); + + // Step 3: Assert the state of the L2 contracts + string memory _config = vm.readFile(_configPath); + + // Fee Splitter: check calculator is set to address(0) + assertEq(IFeeSplitter(FEE_SPLITTER).sharesCalculator(), address(0)); + + // Vaults: vaults configuration should be the same as the ones in the config provided + // getters for legacy and the new values should be the same + _assertFeeVaultsState(false, _config); + } + + /// @notice Assert the configuration of the fee vaults + /// @param _isOptIn Whether the chain is opting in to use the Fee Splitter + /// @param _config The configuration of the fee vaults + /// @dev Ensures both the legacy and the new getters return the same value + function _assertFeeVaultsState(bool _isOptIn, string memory _config) internal view { + if (_isOptIn) { + _assertVaultGetters(SEQUENCER_FEE_VAULT, FEE_SPLITTER, WithdrawalNetwork.L2, 0); + _assertVaultGetters(OPERATOR_FEE_VAULT, FEE_SPLITTER, WithdrawalNetwork.L2, 0); + _assertVaultGetters(BASE_FEE_VAULT, FEE_SPLITTER, WithdrawalNetwork.L2, 0); + _assertVaultGetters(L1_FEE_VAULT, FEE_SPLITTER, WithdrawalNetwork.L2, 0); + } else { + _assertVaultGetters( + SEQUENCER_FEE_VAULT, + vm.parseTomlAddress(_config, ".sequencerFeeVaultRecipient"), + WithdrawalNetwork(vm.parseTomlUint(_config, ".sequencerFeeVaultWithdrawalNetwork")), + vm.parseTomlUint(_config, ".sequencerFeeVaultMinWithdrawalAmount") + ); + _assertVaultGetters( + OPERATOR_FEE_VAULT, + vm.parseTomlAddress(_config, ".operatorFeeVaultRecipient"), + WithdrawalNetwork(vm.parseTomlUint(_config, ".operatorFeeVaultWithdrawalNetwork")), + vm.parseTomlUint(_config, ".operatorFeeVaultMinWithdrawalAmount") + ); + _assertVaultGetters( + BASE_FEE_VAULT, + vm.parseTomlAddress(_config, ".baseFeeVaultRecipient"), + WithdrawalNetwork(vm.parseTomlUint(_config, ".baseFeeVaultWithdrawalNetwork")), + vm.parseTomlUint(_config, ".baseFeeVaultMinWithdrawalAmount") + ); + _assertVaultGetters( + L1_FEE_VAULT, + vm.parseTomlAddress(_config, ".l1FeeVaultRecipient"), + WithdrawalNetwork(vm.parseTomlUint(_config, ".l1FeeVaultWithdrawalNetwork")), + vm.parseTomlUint(_config, ".l1FeeVaultMinWithdrawalAmount") + ); + } + } + + /// @notice Assert the configuration of a fee vault + /// @param _vault The address of the fee vault + /// @param _recipient The recipient of the fee vault + /// @param _withdrawalNetwork The withdrawal network of the fee vault + /// @param _minWithdrawalAmount The minimum withdrawal amount of the fee vault + /// @dev Ensures both the legacy and the new getters return the same value + function _assertVaultGetters( + address _vault, + address _recipient, + WithdrawalNetwork _withdrawalNetwork, + uint256 _minWithdrawalAmount + ) internal view { + assertEq(IFeeVault(_vault).recipient(), _recipient); + assertEq(uint256(IFeeVault(_vault).withdrawalNetwork()), uint256(_withdrawalNetwork)); + assertEq(IFeeVault(_vault).minWithdrawalAmount(), _minWithdrawalAmount); + assertEq(IFeeVault(_vault).RECIPIENT(), _recipient); + assertEq(uint256(IFeeVault(_vault).WITHDRAWAL_NETWORK()), uint256(_withdrawalNetwork)); + assertEq(IFeeVault(_vault).MIN_WITHDRAWAL_AMOUNT(), _minWithdrawalAmount); + } +} diff --git a/test/integration/tenderly/RevenueShareSimulations.md b/test/integration/tenderly/RevenueShareSimulations.md new file mode 100644 index 0000000000..c55c5c0f3c --- /dev/null +++ b/test/integration/tenderly/RevenueShareSimulations.md @@ -0,0 +1,28 @@ +# Revenue Share Simulations +A list of tenderly simulations are provided based on the formatting of the `TransactionDeposited` events emitted in L1 and its execution in the target L2, in this case, OP Mainnet. For details, check the [Simulating Portal Deposit Transactions](todo) document + +### Revenue Share Upgrade Opt In +1. [L1Withdrawer Deploy](https://www.tdly.co/shared/simulation/2de00980-0c73-4cf8-834f-c9210ba738d2) Gas: 558,056/625,000 (89%) +2. [Rev Share Calculator Deploy](https://dashboard.tenderly.co/0xchin/project/simulator/c2970c09-7df7-4f97-bd2c-fd74caf1f2b0) Gas: 579,688/625,000 (93%) +3. [Fee Splitter Deploy](https://dashboard.tenderly.co/0xchin/project/simulator/6b084159-75ed-41b1-993c-a0a6953616c5) Gas: 1.121.747/1,235,000 (91%) +4. [Fee Splitter Upgrade](https://www.tdly.co/shared/simulation/3e224c10-f2e9-4346-8ea4-ddb031d37894) Gas: 65,378/150,000 (44%) +5. [Operator Fee Vault Deploy](https://www.tdly.co/shared/simulation/c78942e2-6008-475d-a049-f07866586ef6) Gas: 831,558/910,000 (91%) +6. [Operator Fee Vault Upgrade](https://www.tdly.co/shared/simulation/ff2a2b2b-992b-46f7-9355-743df1cffd96) Gas: 42,886/150,000 (29%) +7. [Sequencer Fee Vault Deploy](https://www.tdly.co/shared/simulation/19e79c8e-4461-48dc-8477-e2bc5e1160eb) Gas: 841,784/910,000 (93%) +8. [Sequencer Fee Vault Upgrade](https://www.tdly.co/shared/simulation/d857f412-b3b3-456a-b2f8-5ecfc064d193) Gas: 40,386/150,000 (27%) +9. [Base Fee Vault Deploy](https://www.tdly.co/shared/simulation/db7e5826-deab-4e22-82e1-20c862ccb195) Gas: 831,546/910,000 (91%) +10. [Base Fee Vault Upgrade](https://www.tdly.co/shared/simulation/e16884f7-0905-4723-bca3-febf65c523b4) Gas: 42,886/150,000 (29%) +11. [L1 Fee Vault Deploy](https://www.tdly.co/shared/simulation/c372faa5-72e2-45a5-97a7-28b3c4826869) Gas: 831,558/910,000 (91%) +12. [L1 Fee Vault Upgrade](https://www.tdly.co/shared/simulation/37d55586-306a-40bd-a80d-954fe2373751) Gas: 42,886/150,000 (29%) + +### Revenue Share Upgrade Opt Out +1. [Fee Splitter Deploy](https://dashboard.tenderly.co/0xchin/project/simulator/6b084159-75ed-41b1-993c-a0a6953616c5) Gas: 1.121.747/1,235,000 (91%) +2. [Fee Splitter Upgrade](https://www.tdly.co/shared/simulation/3e224c10-f2e9-4346-8ea4-ddb031d37894) Gas: 65,378/150,000 (44%) +3. [Operator Fee Vault Deploy](https://www.tdly.co/shared/simulation/c78942e2-6008-475d-a049-f07866586ef6) Gas: 831,558/910,000 (91%) +4. [Operator Fee Vault Upgrade](https://www.tdly.co/shared/simulation/ff2a2b2b-992b-46f7-9355-743df1cffd96) Gas: 42,886/150,000 (29%) +5. [Sequencer Fee Vault Deploy](https://www.tdly.co/shared/simulation/19e79c8e-4461-48dc-8477-e2bc5e1160eb) Gas: 841,784/910,000 (93%) +6. [Sequencer Fee Vault Upgrade](https://www.tdly.co/shared/simulation/d857f412-b3b3-456a-b2f8-5ecfc064d193) Gas: 40,386/150,000 (27%) +7. [Base Fee Vault Deploy](https://www.tdly.co/shared/simulation/db7e5826-deab-4e22-82e1-20c862ccb195) Gas: 831,546/910,000 (91%) +8. [Base Fee Vault Upgrade](https://www.tdly.co/shared/simulation/e16884f7-0905-4723-bca3-febf65c523b4) Gas: 42,886/150,000 (29%) +9. [L1 Fee Vault Deploy](https://www.tdly.co/shared/simulation/c372faa5-72e2-45a5-97a7-28b3c4826869) Gas: 831,558/910,000 (91%) +10. [L1 Fee Vault Upgrade](https://www.tdly.co/shared/simulation/37d55586-306a-40bd-a80d-954fe2373751) Gas: 42,886/150,000 (29%) \ No newline at end of file diff --git a/test/tasks/Regression.t.sol b/test/tasks/Regression.t.sol index bf3ca5eea9..3ee2303357 100644 --- a/test/tasks/Regression.t.sol +++ b/test/tasks/Regression.t.sol @@ -873,7 +873,7 @@ contract RegressionTest is Test { function testRegressionCallDataMatches_RevenueShareV100UpgradePath() public { string memory taskConfigFilePath = "test/tasks/example/eth/015-revenue-share-upgrade/config.toml"; string memory expectedCallData = - "0x174dea710000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000001800000000000000000000000000000000000000000000000000000000000000d2000000000000000000000000000000000000000000000000000000000000018e00000000000000000000000000000000000000000000000000000000000002ee00000000000000000000000000000000000000000000000000000000000003140000000000000000000000000000000000000000000000000000000000000430000000000000000000000000000000000000000000000000000000000000044e000000000000000000000000000000000000000000000000000000000000056e000000000000000000000000000000000000000000000000000000000000058c00000000000000000000000000000000000000000000000000000000000006a800000000000000000000000000000000000000000000000000000000000006c600000000000000000000000000000000000000000000000000000000000007e20000000000000000000000000beb5fc579115071764c7423a4f12edde41f106ed0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000ae4e9e05c4200000000000000000000000013b0d85ccb8bf860b6b79af3029fca081ae9bef200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000098968000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000a0466cfa0570000000000000000000000000000000000000000000000000000000000000000fa8e542d08c461382d17d78973c846bafcf01f0c60f78f77abd977884fd393ff000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000009686080604052348015600e575f80fd5b50604051610908380380610908833981016040819052602b916067565b5f929092556001805463ffffffff909316600160a01b026001600160c01b03199093166001600160a01b039092169190911791909117905560b8565b5f805f606084860312156078575f80fd5b835160208501519093506001600160a01b03811681146095575f80fd5b604085015190925063ffffffff8116811460ad575f80fd5b809150509250925092565b610843806100c55f395ff3fe608060405260043610610071575f3560e01c806366d003ac1161004c57806366d003ac146102995780638312f149146102ea57806385b5b14d1461030c5780639d7955b41461032b575f80fd5b80633bbed4a0146101d7578063500bf72f146101f657806354fd4d5014610244575f80fd5b366101d3576040805134815247602082018190529133917f363f315f930a17d1266b86a20d6dd34b1cfbc5a9db9f13a65d06a689c3a2af8a910160405180910390a25f5481106101d1576001546040517f3dbb202b00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff82166004820152606060248201525f60648201527401000000000000000000000000000000000000000090910463ffffffff16604482015273420000000000000000000000000000000000000790633dbb202b9083906084015f604051808303818588803b158015610169575f80fd5b505af115801561017b573d5f803e3d5ffd5b505060015460405185815273ffffffffffffffffffffffffffffffffffffffff90911693507f6d92f7d3303f995bf21956bb0c51b388bae348eaf45c23debd2cfa3fcd9ec6469250602001905060405180910390a25b005b5f80fd5b3480156101e2575f80fd5b506101d16101f136600461076c565b61034a565b348015610201575f80fd5b5060015461022a9074010000000000000000000000000000000000000000900463ffffffff1681565b60405163ffffffff90911681526020015b60405180910390f35b34801561024f575f80fd5b5061028c6040518060400160405280600581526020017f312e302e3000000000000000000000000000000000000000000000000000000081525081565b60405161023b919061078e565b3480156102a4575f80fd5b506001546102c59073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200161023b565b3480156102f5575f80fd5b506102fe5f5481565b60405190815260200161023b565b348015610317575f80fd5b506101d16103263660046107e1565b6104b6565b348015610336575f80fd5b506101d16103453660046107f8565b6105d8565b73420000000000000000000000000000000000001873ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156103a7573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906103cb919061081b565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461042f576040517f807b982000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff000000000000000000000000000000000000000083168117909355604080519190921680825260208201939093527f62e69886a5df0ba8ffcacbfc1388754e7abd9bde24b036354c561f1acd4e459391015b60405180910390a15050565b73420000000000000000000000000000000000001873ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610513573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610537919061081b565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461059b576040517f807b982000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f80549082905560408051828152602081018490527f895a067c78583e800418fabf3da26a9496aab2ff3429cebdf7fefa642b2e420391016104aa565b73420000000000000000000000000000000000001873ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610635573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610659919061081b565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146106bd576040517f807b982000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001805463ffffffff838116740100000000000000000000000000000000000000008181027fffffffffffffffff00000000ffffffffffffffffffffffffffffffffffffffff85161790945560408051949093049091168084526020840191909152917fd00b9b2acb0059a20066ca19b541618141c03305a0a6644d43277758c539b5de91016104aa565b73ffffffffffffffffffffffffffffffffffffffff81168114610769575f80fd5b50565b5f6020828403121561077c575f80fd5b813561078781610748565b9392505050565b602081525f82518060208401528060208501604085015e5f6040828501015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011684010191505092915050565b5f602082840312156107f1575f80fd5b5035919050565b5f60208284031215610808575f80fd5b813563ffffffff81168114610787575f80fd5b5f6020828403121561082b575f80fd5b81516107878161074856fea164736f6c6343000819000a0000000000000000000000000000000000000000000000000000000000055730000000000000000000000000742d35cc6634c0532925a3b8d0c0c8b8b0c0c8b80000000000000000000000000000000000000000000000000000000000030d400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000beb5fc579115071764c7423a4f12edde41f106ed0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000b04e9e05c4200000000000000000000000013b0d85ccb8bf860b6b79af3029fca081ae9bef200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000098968000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000a2466cfa0570000000000000000000000000000000000000000000000000000000000000000d07fd81b3e1bcfbf3c91e5b2f6b54443cff180a787261d425462132920599561000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000009956080604052348015600e575f80fd5b50604051610955380380610955833981016040819052602b916074565b5f80546001600160a01b039384166001600160a01b0319918216179091556001805492909316911617905560a0565b80516001600160a01b0381168114606f575f80fd5b919050565b5f80604083850312156084575f80fd5b608b83605a565b9150609760208401605a565b90509250929050565b6108a8806100ad5f395ff3fe608060405234801561000f575f80fd5b506004361061009f575f3560e01c80635b201d83116100725780637b42d6c2116100585780637b42d6c21461019157806396d842be1461019a5780639c662fdd146101b9575f80fd5b80635b201d831461016b578063712d7bb814610189575f80fd5b806329f33ec8146100a35780634b012e9a146100ed57806354e7f42d1461010257806354fd4d5014610122575b5f80fd5b6001546100c39073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b6101006100fb3660046106a3565b6101cc565b005b6101156101103660046106c5565b610325565b6040516100e491906106f4565b61015e6040518060400160405280600581526020017f312e302e3000000000000000000000000000000000000000000000000000000081525081565b6040516100e49190610758565b61017461271081565b60405163ffffffff90911681526020016100e4565b61017460fa81565b6101746105dc81565b5f546100c39073ffffffffffffffffffffffffffffffffffffffff1681565b6101006101c73660046106a3565b610524565b73420000000000000000000000000000000000001873ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610229573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061024d91906107ab565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146102b1576040517f67102c4c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917fc7b7459ad1ab31862524bf0c4a5e6a8518c60f27607a5c483a58ea27e30c214c9190a35050565b6040805160028082526060828101909352816020015b604080518082019091525f808252602082015281526020019060019003908161033b575050604080518082019091525f805473ffffffffffffffffffffffffffffffffffffffff16825260208201819052825192935090918391906103a2576103a26107c6565b6020026020010181905250604051806040016040528060015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020015f8152508160018151811061040c5761040c6107c6565b60209081029190910101525f82846104248789610820565b61042e9190610820565b6104389190610820565b90505f61271061044960fa84610839565b6104539190610850565b9050805f0361048e576040517f0174e42600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f6104998584610888565b90505f6127106104ab6105dc84610839565b6104b59190610850565b90505f8184116104c557816104c7565b835b905080865f815181106104dc576104dc6107c6565b60209081029190910181015101526104f48186610888565b86600181518110610507576105076107c6565b602002602001015160200181815250505050505050949350505050565b73420000000000000000000000000000000000001873ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610581573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906105a591906107ab565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610609576040517f67102c4c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f28c1e0a919cd3b91d6d516417dedc06a2bd7954ad8960315347250b1aee2a4f1905f90a35050565b73ffffffffffffffffffffffffffffffffffffffff811681146106a0575f80fd5b50565b5f602082840312156106b3575f80fd5b81356106be8161067f565b9392505050565b5f805f80608085870312156106d8575f80fd5b5050823594602084013594506040840135936060013592509050565b602080825282518282018190525f919060409081850190868401855b8281101561074b578151805173ffffffffffffffffffffffffffffffffffffffff168552860151868501529284019290850190600101610710565b5091979650505050505050565b602081525f82518060208401528060208501604085015e5f6040828501015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011684010191505092915050565b5f602082840312156107bb575f80fd5b81516106be8161067f565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b80820180821115610833576108336107f3565b92915050565b8082028115828204841417610833576108336107f3565b5f82610883577f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b500490565b81810381811115610833576108336107f356fea164736f6c6343000819000a00000000000000000000000065e05252dd7964dbb722a9fca24c6a2d7afbef570000000000000000000000008b0c0c8b8b0c0c8b8b0c0c8b8b0c0c8b8b0c0c8b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000beb5fc579115071764c7423a4f12edde41f106ed0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000001544e9e05c4200000000000000000000000013b0d85ccb8bf860b6b79af3029fca081ae9bef20000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000012d838000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000146466cfa0570000000000000000000000000000000000000000000000000000000000000000d7c04619bfc311a92d20723f9d08baaba18c3c8c7dcd85736bf66b85f59c37f6000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000013d26080604052348015600e575f80fd5b5060156019565b60d4565b5f54610100900460ff161560835760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b5f5460ff908116101560d2575f805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6112f1806100e15f395ff3fe608060405260043610610096575f3560e01c80637dfbd04911610066578063b87ea8d41161004c578063b87ea8d414610313578063c4d66de814610327578063d61a398b14610346575f80fd5b80637dfbd049146102dd5780637fc81bb7146102f4575f80fd5b80630a7617b3146101dd5780630c0544a3146101fe578063394d27311461026057806354fd4d5014610288575f80fd5b366101d9577fe3007e9730850b5618eacb0537bef0cf0f1600267ae8549e472449d77b731e455c6100f3576040517f17617f6100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b337342000000000000000000000000000000000000111480159061012b57503373420000000000000000000000000000000000001914155b801561014b57503373420000000000000000000000000000000000001a14155b801561016b57503373420000000000000000000000000000000000001b14155b156101a2576040517f9dcde10900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60405134815233907f2ccfc58c2cef4ee590b5f16be0548cc54afc12e1c66a67b362b7d640fd16bb2d9060200160405180910390a2005b5f80fd5b3480156101e8575f80fd5b506101fc6101f7366004610f4b565b61039c565b005b348015610209575f80fd5b5060015461023a9070010000000000000000000000000000000090046fffffffffffffffffffffffffffffffff1681565b6040516fffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b34801561026b575f80fd5b5060015461023a906fffffffffffffffffffffffffffffffff1681565b348015610293575f80fd5b506102d06040518060400160405280600581526020017f312e302e3000000000000000000000000000000000000000000000000000000081525081565b6040516102579190610f66565b3480156102e8575f80fd5b5061023a6301e1338081565b3480156102ff575f80fd5b506101fc61030e366004610fb9565b61055e565b34801561031e575f80fd5b506101fc610706565b348015610332575f80fd5b506101fc610341366004610f4b565b610aea565b348015610351575f80fd5b505f546103779062010000900473ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610257565b73420000000000000000000000000000000000001873ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156103f9573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061041d9190610fe8565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610481576040517f38bac74200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff81166104ce576040517f99c6ec0800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f805473ffffffffffffffffffffffffffffffffffffffff838116620100008181027fffffffffffffffffffff0000000000000000000000000000000000000000ffff85161790945560408051949093049091168084526020840191909152917f16417cc372deec0caee5f52e2ad77a5f07b4591fd56b4ff31b6e20f817d4daeb91015b60405180910390a15050565b73420000000000000000000000000000000000001873ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156105bb573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906105df9190610fe8565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610643576040517f38bac74200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6301e133806fffffffffffffffffffffffffffffffff82161115610693576040517f30b9f35e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600180546fffffffffffffffffffffffffffffffff8381167001000000000000000000000000000000008181028385161790945560408051949093049091168084526020840191909152917f4492086b630ed3846eec0979dd87a71c814ceb1c6dab80ab81e3450b21e4de289101610552565b60015461073b906fffffffffffffffffffffffffffffffff700100000000000000000000000000000000820481169116611030565b6fffffffffffffffffffffffffffffffff16421015610786576040517f1e4a9f3a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600180547fffffffffffffffffffffffffffffffff0000000000000000000000000000000016426fffffffffffffffffffffffffffffffff161781556107cb90610ce0565b5f6107e9734200000000000000000000000000000000000011610d06565b90505f610809734200000000000000000000000000000000000019610d06565b90505f61082973420000000000000000000000000000000000001a610d06565b90505f61084973420000000000000000000000000000000000001b610d06565b90506108545f610ce0565b5f82826108618688611060565b61086b9190611060565b6108759190611060565b9050805f036108b0576040517fc8972e5200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f80546040517f54e7f42d000000000000000000000000000000000000000000000000000000008152600481018890526024810187905260448101859052606481018690526201000090910473ffffffffffffffffffffffffffffffffffffffff16906354e7f42d906084015f60405180830381865afa158015610936573d5f803e3d5ffd5b505050506040513d5f823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016820160405261097b9190810190611118565b905080515f036109b7576040517f763970d600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f805b8251811015610a6e575f8382815181106109d6576109d66111e7565b60200260200101515f015190505f8483815181106109f6576109f66111e7565b6020026020010151602001519050805f03610a12575050610a66565b5f610a1d8383610f03565b905080610a56576040517fd68d1b1800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610a608286611060565b94505050505b6001016109ba565b50828114610aa8576040517f9c01eac000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f73f9a13241a1848ec157967f3a85601709353e616f1f2605d818c0f2d21774df8284604051610ad9929190611214565b60405180910390a150505050505050565b5f54610100900460ff1615808015610b0857505f54600160ff909116105b80610b215750303b158015610b2157505f5460ff166001145b610bb1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a6564000000000000000000000000000000000000606482015260840160405180910390fd5b5f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558015610c0d575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b5f80547fffffffffffffffffffff0000000000000000000000000000000000000000ffff166201000073ffffffffffffffffffffffffffffffffffffffff851602179055600180546fffffffffffffffffffffffffffffffff1672015180000000000000000000000000000000001790558015610cdc575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb384740249890602001610552565b5050565b807fe3007e9730850b5618eacb0537bef0cf0f1600267ae8549e472449d77b731e455d50565b5f60018273ffffffffffffffffffffffffffffffffffffffff166382356d8a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610d52573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610d7691906112af565b6001811115610d8757610d87611282565b14610dbe576040517fb4726cbe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b3073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff166366d003ac6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610e1e573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e429190610fe8565b73ffffffffffffffffffffffffffffffffffffffff1614610e8f576040517fc3380cef00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8173ffffffffffffffffffffffffffffffffffffffff16633ccfd60b6040518163ffffffff1660e01b81526004016020604051808303815f875af1158015610ed9573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610efd91906112cd565b92915050565b5f610f0f835a84610f16565b9392505050565b5f805f805f858888f1949350505050565b73ffffffffffffffffffffffffffffffffffffffff81168114610f48575f80fd5b50565b5f60208284031215610f5b575f80fd5b8135610f0f81610f27565b602081525f82518060208401528060208501604085015e5f6040828501015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011684010191505092915050565b5f60208284031215610fc9575f80fd5b81356fffffffffffffffffffffffffffffffff81168114610f0f575f80fd5b5f60208284031215610ff8575f80fd5b8151610f0f81610f27565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b6fffffffffffffffffffffffffffffffff81811683821601908082111561105957611059611003565b5092915050565b80820180821115610efd57610efd611003565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b6040805190810167ffffffffffffffff811182821017156110c3576110c3611073565b60405290565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff8111828210171561111057611110611073565b604052919050565b5f6020808385031215611129575f80fd5b825167ffffffffffffffff80821115611140575f80fd5b818501915085601f830112611153575f80fd5b81518181111561116557611165611073565b611173848260051b016110c9565b818152848101925060069190911b830184019087821115611192575f80fd5b928401925b818410156111dc57604084890312156111ae575f80fd5b6111b66110a0565b84516111c181610f27565b81528486015186820152835260409093019291840191611197565b979650505050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b604080825283518282018190525f91906020906060850190828801855b8281101561126c578151805173ffffffffffffffffffffffffffffffffffffffff168552850151858501529285019290840190600101611231565b5050508093505050508260208301529392505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b5f602082840312156112bf575f80fd5b815160028110610f0f575f80fd5b5f602082840312156112dd575f80fd5b505191905056fea164736f6c6343000819000a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000beb5fc579115071764c7423a4f12edde41f106ed00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000001a4e9e05c420000000000000000000000004200000000000000000000000000000000000018000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000249f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000c49623609d000000000000000000000000420000000000000000000000000000000000002b0000000000000000000000006b0d0b5d65c13ed9ec80617772aee4d6c594a66e00000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000024c4d66de8000000000000000000000000a9c1d283ab6f149853337395e18850b3ff6cf192000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000beb5fc579115071764c7423a4f12edde41f106ed0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000001104e9e05c4200000000000000000000000013b0d85ccb8bf860b6b79af3029fca081ae9bef2000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000de2b0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000102466cfa0570000000000000000000000000000000000000000000000000000000000000000783aa8b3e401c8404e3eff9401ba29702719ddc0c0f69ec9ac77188bacea107300000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000f9c60e060405234801561001057600080fd5b50604051610f3c380380610f3c83398101604081905261002f91610079565b6001600160a01b03831660a0526080829052828282806001811115610056576100566100cc565b60c081600181111561006a5761006a6100cc565b815250505050505050506100e2565b60008060006060848603121561008e57600080fd5b83516001600160a01b03811681146100a557600080fd5b602085015160408601519194509250600281106100c157600080fd5b809150509250925092565b634e487b7160e01b600052602160045260246000fd5b60805160a05160c051610e176101256000396000818161028401526109e101526000818160e901526109710152600081816102b80152610a350152610e176000f3fe6080604052600436106100cb5760003560e01c806382356d8a1161007457806385b5b14d1161004e57806385b5b14d14610252578063d0e12f9014610272578063d3e5792b146102a657600080fd5b806382356d8a146102055780638312f1491461022757806384411d651461023c57600080fd5b80633ccfd60b116100a55780633ccfd60b1461017757806354fd4d501461019a57806366d003ac146101f057600080fd5b80630d9019e1146100d7578063307f2962146101355780633bbed4a01461015757600080fd5b366100d257005b600080fd5b3480156100e357600080fd5b5061010b7f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b34801561014157600080fd5b50610155610150366004610be5565b6102da565b005b34801561016357600080fd5b50610155610172366004610c2b565b6104a2565b34801561018357600080fd5b5061018c610622565b60405190815260200161012c565b3480156101a657600080fd5b506101e36040518060400160405280600581526020017f312e312e3000000000000000000000000000000000000000000000000000000081525081565b60405161012c9190610c48565b3480156101fc57600080fd5b5061010b61092a565b34801561021157600080fd5b5061021a610993565b60405161012c9190610d25565b34801561023357600080fd5b5061018c610a03565b34801561024857600080fd5b5061018c60005481565b34801561025e57600080fd5b5061015561026d366004610d39565b610a57565b34801561027e57600080fd5b5061021a7f000000000000000000000000000000000000000000000000000000000000000081565b3480156102b257600080fd5b5061018c7f000000000000000000000000000000000000000000000000000000000000000081565b73420000000000000000000000000000000000001873ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610339573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061035d9190610d52565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146103c1576040517f7cd7e09f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600280547401000000000000000000000000000000000000000080820460ff1692849290917fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff9091169083600181111561041d5761041d610cbb565b0217905550600280547fffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffff16770100000000000000000000000000000000000000000000001790556040517ff2ec44eb1c3b3acd547b76333eb2c4b27eee311860c57a9fdb04c95f62398fc8906104969083908590610d6f565b60405180910390a15050565b73420000000000000000000000000000000000001873ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610501573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105259190610d52565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610589576040517f7cd7e09f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600280547fffffffffffffffffffff00ff0000000000000000000000000000000000000000811673ffffffffffffffffffffffffffffffffffffffff84811691821775010000000000000000000000000000000000000000001790935560408051939092168084526020840191909152917f62e69886a5df0ba8ffcacbfc1388754e7abd9bde24b036354c561f1acd4e45939101610496565b600061062c610a03565b4710156106e6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604a60248201527f4665655661756c743a207769746864726177616c20616d6f756e74206d75737460448201527f2062652067726561746572207468616e206d696e696d756d207769746864726160648201527f77616c20616d6f756e7400000000000000000000000000000000000000000000608482015260a4015b60405180910390fd5b479050806000808282546106fa9190610d8a565b909155507fc8a211cc64b6ed1b50595a9fcb1932b6d1e5a6e8ef15b60e5b1f988ea9086bba90508161072a61092a565b6040805192835273ffffffffffffffffffffffffffffffffffffffff9091166020830152339082015260600160405180910390a17f38e04cbeb8c10f8f568618aa75be0f10b6729b8b4237743b4de20cbcde2839ee8161078861092a565b33610791610993565b6040516107a19493929190610dc9565b60405180910390a160016107b3610993565b60018111156107c4576107c4610cbb565b0361086f5760006107dc6107d661092a565b83610bbd565b90508061086b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f4665655661756c743a206661696c656420746f2073656e642045544820746f2060448201527f4c322066656520726563697069656e740000000000000000000000000000000060648201526084016106dd565b5090565b73420000000000000000000000000000000000001663c2b3e5ac8261089261092a565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b16815273ffffffffffffffffffffffffffffffffffffffff909116600482015262061a80602482015260606044820152600060648201526084016000604051808303818588803b15801561090e57600080fd5b505af1158015610922573d6000803e3d6000fd5b505050505090565b6002546000907501000000000000000000000000000000000000000000900460ff161561096e575060025473ffffffffffffffffffffffffffffffffffffffff1690565b507f000000000000000000000000000000000000000000000000000000000000000090565b60025460009077010000000000000000000000000000000000000000000000900460ff16156109de575060025474010000000000000000000000000000000000000000900460ff1690565b507f000000000000000000000000000000000000000000000000000000000000000090565b600254600090760100000000000000000000000000000000000000000000900460ff1615610a32575060015490565b507f000000000000000000000000000000000000000000000000000000000000000090565b73420000000000000000000000000000000000001873ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610ab6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ada9190610d52565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610b3e576040517f7cd7e09f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001805490829055600280547fffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffff1676010000000000000000000000000000000000000000000017905560408051828152602081018490527f895a067c78583e800418fabf3da26a9496aab2ff3429cebdf7fefa642b2e42039101610496565b6000610bca835a84610bd1565b9392505050565b6000806000806000858888f1949350505050565b600060208284031215610bf757600080fd5b813560028110610bca57600080fd5b73ffffffffffffffffffffffffffffffffffffffff81168114610c2857600080fd5b50565b600060208284031215610c3d57600080fd5b8135610bca81610c06565b600060208083528351808285015260005b81811015610c7557858101830151858201604001528201610c59565b81811115610c87576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b60028110610d21577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b9052565b60208101610d338284610cea565b92915050565b600060208284031215610d4b57600080fd5b5035919050565b600060208284031215610d6457600080fd5b8151610bca81610c06565b60408101610d7d8285610cea565b610bca6020830184610cea565b60008219821115610dc4577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b500190565b84815273ffffffffffffffffffffffffffffffffffffffff84811660208301528316604082015260808101610e016060830184610cea565b9594505050505056fea164736f6c634300080f000a000000000000000000000000420000000000000000000000000000000000002b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000beb5fc579115071764c7423a4f12edde41f106ed0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000124e9e05c420000000000000000000000004200000000000000000000000000000000000018000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000249f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000004499a88ec4000000000000000000000000420000000000000000000000000000000000001b000000000000000000000000d71e5f87cc7065478ffd16130b3ac640caa14a2e0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000beb5fc579115071764c7423a4f12edde41f106ed0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000001144e9e05c4200000000000000000000000013b0d85ccb8bf860b6b79af3029fca081ae9bef2000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000de2b0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000106466cfa0570000000000000000000000000000000000000000000000000000000000000000204cb368f75f2d6cade61b62cb318bffd2bd31a57a3f86dff75f5bfd9d2dd14900000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000fcb60e060405234801561001057600080fd5b50604051610f6b380380610f6b83398101604081905261002f91610079565b6001600160a01b03831660a0526080829052828282806001811115610056576100566100cc565b60c081600181111561006a5761006a6100cc565b815250505050505050506100e2565b60008060006060848603121561008e57600080fd5b83516001600160a01b03811681146100a557600080fd5b602085015160408601519194509250600281106100c157600080fd5b809150509250925092565b634e487b7160e01b600052602160045260246000fd5b60805160a05160c051610e466101256000396000818161028f0152610a0101526000818160f401526109910152600081816102c30152610a550152610e466000f3fe6080604052600436106100d65760003560e01c806382356d8a1161007f57806385b5b14d1161005957806385b5b14d1461025d578063d0e12f901461027d578063d3e5792b146102b1578063d4ff9218146102e557600080fd5b806382356d8a146102105780638312f1491461023257806384411d651461024757600080fd5b80633ccfd60b116100b05780633ccfd60b1461018257806354fd4d50146101a557806366d003ac146101fb57600080fd5b80630d9019e1146100e2578063307f2962146101405780633bbed4a01461016257600080fd5b366100dd57005b600080fd5b3480156100ee57600080fd5b506101167f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b34801561014c57600080fd5b5061016061015b366004610c14565b6102fa565b005b34801561016e57600080fd5b5061016061017d366004610c5a565b6104c2565b34801561018e57600080fd5b50610197610642565b604051908152602001610137565b3480156101b157600080fd5b506101ee6040518060400160405280600581526020017f312e362e3000000000000000000000000000000000000000000000000000000081525081565b6040516101379190610c77565b34801561020757600080fd5b5061011661094a565b34801561021c57600080fd5b506102256109b3565b6040516101379190610d54565b34801561023e57600080fd5b50610197610a23565b34801561025357600080fd5b5061019760005481565b34801561026957600080fd5b50610160610278366004610d68565b610a77565b34801561028957600080fd5b506102257f000000000000000000000000000000000000000000000000000000000000000081565b3480156102bd57600080fd5b506101977f000000000000000000000000000000000000000000000000000000000000000081565b3480156102f157600080fd5b50610116610bdd565b73420000000000000000000000000000000000001873ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610359573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061037d9190610d81565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146103e1576040517f7cd7e09f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600280547401000000000000000000000000000000000000000080820460ff1692849290917fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff9091169083600181111561043d5761043d610cea565b0217905550600280547fffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffff16770100000000000000000000000000000000000000000000001790556040517ff2ec44eb1c3b3acd547b76333eb2c4b27eee311860c57a9fdb04c95f62398fc8906104b69083908590610d9e565b60405180910390a15050565b73420000000000000000000000000000000000001873ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610521573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105459190610d81565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146105a9576040517f7cd7e09f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600280547fffffffffffffffffffff00ff0000000000000000000000000000000000000000811673ffffffffffffffffffffffffffffffffffffffff84811691821775010000000000000000000000000000000000000000001790935560408051939092168084526020840191909152917f62e69886a5df0ba8ffcacbfc1388754e7abd9bde24b036354c561f1acd4e459391016104b6565b600061064c610a23565b471015610706576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604a60248201527f4665655661756c743a207769746864726177616c20616d6f756e74206d75737460448201527f2062652067726561746572207468616e206d696e696d756d207769746864726160648201527f77616c20616d6f756e7400000000000000000000000000000000000000000000608482015260a4015b60405180910390fd5b4790508060008082825461071a9190610db9565b909155507fc8a211cc64b6ed1b50595a9fcb1932b6d1e5a6e8ef15b60e5b1f988ea9086bba90508161074a61094a565b6040805192835273ffffffffffffffffffffffffffffffffffffffff9091166020830152339082015260600160405180910390a17f38e04cbeb8c10f8f568618aa75be0f10b6729b8b4237743b4de20cbcde2839ee816107a861094a565b336107b16109b3565b6040516107c19493929190610df8565b60405180910390a160016107d36109b3565b60018111156107e4576107e4610cea565b0361088f5760006107fc6107f661094a565b83610bec565b90508061088b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f4665655661756c743a206661696c656420746f2073656e642045544820746f2060448201527f4c322066656520726563697069656e740000000000000000000000000000000060648201526084016106fd565b5090565b73420000000000000000000000000000000000001663c2b3e5ac826108b261094a565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b16815273ffffffffffffffffffffffffffffffffffffffff909116600482015262061a80602482015260606044820152600060648201526084016000604051808303818588803b15801561092e57600080fd5b505af1158015610942573d6000803e3d6000fd5b505050505090565b6002546000907501000000000000000000000000000000000000000000900460ff161561098e575060025473ffffffffffffffffffffffffffffffffffffffff1690565b507f000000000000000000000000000000000000000000000000000000000000000090565b60025460009077010000000000000000000000000000000000000000000000900460ff16156109fe575060025474010000000000000000000000000000000000000000900460ff1690565b507f000000000000000000000000000000000000000000000000000000000000000090565b600254600090760100000000000000000000000000000000000000000000900460ff1615610a52575060015490565b507f000000000000000000000000000000000000000000000000000000000000000090565b73420000000000000000000000000000000000001873ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610ad6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610afa9190610d81565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610b5e576040517f7cd7e09f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001805490829055600280547fffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffff1676010000000000000000000000000000000000000000000017905560408051828152602081018490527f895a067c78583e800418fabf3da26a9496aab2ff3429cebdf7fefa642b2e420391016104b6565b6000610be761094a565b905090565b6000610bf9835a84610c00565b9392505050565b6000806000806000858888f1949350505050565b600060208284031215610c2657600080fd5b813560028110610bf957600080fd5b73ffffffffffffffffffffffffffffffffffffffff81168114610c5757600080fd5b50565b600060208284031215610c6c57600080fd5b8135610bf981610c35565b600060208083528351808285015260005b81811015610ca457858101830151858201604001528201610c88565b81811115610cb6576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b60028110610d50577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b9052565b60208101610d628284610d19565b92915050565b600060208284031215610d7a57600080fd5b5035919050565b600060208284031215610d9357600080fd5b8151610bf981610c35565b60408101610dac8285610d19565b610bf96020830184610d19565b60008219821115610df3577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b500190565b84815273ffffffffffffffffffffffffffffffffffffffff84811660208301528316604082015260808101610e306060830184610d19565b9594505050505056fea164736f6c634300080f000a000000000000000000000000420000000000000000000000000000000000002b000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000beb5fc579115071764c7423a4f12edde41f106ed0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000124e9e05c420000000000000000000000004200000000000000000000000000000000000018000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000249f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000004499a88ec4000000000000000000000000420000000000000000000000000000000000001100000000000000000000000016ffe2014590a40f0ae5fa5f2fca9458335336600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000beb5fc579115071764c7423a4f12edde41f106ed0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000001104e9e05c4200000000000000000000000013b0d85ccb8bf860b6b79af3029fca081ae9bef2000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000de2b0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000102466cfa05700000000000000000000000000000000000000000000000000000000000000007a2bde9cfb7f80a4198677bdf885a43dc36c598688294f694cf64429164f140000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000f9c60e060405234801561001057600080fd5b50604051610f3c380380610f3c83398101604081905261002f91610079565b6001600160a01b03831660a0526080829052828282806001811115610056576100566100cc565b60c081600181111561006a5761006a6100cc565b815250505050505050506100e2565b60008060006060848603121561008e57600080fd5b83516001600160a01b03811681146100a557600080fd5b602085015160408601519194509250600281106100c157600080fd5b809150509250925092565b634e487b7160e01b600052602160045260246000fd5b60805160a05160c051610e176101256000396000818161028401526109e101526000818160e901526109710152600081816102b80152610a350152610e176000f3fe6080604052600436106100cb5760003560e01c806382356d8a1161007457806385b5b14d1161004e57806385b5b14d14610252578063d0e12f9014610272578063d3e5792b146102a657600080fd5b806382356d8a146102055780638312f1491461022757806384411d651461023c57600080fd5b80633ccfd60b116100a55780633ccfd60b1461017757806354fd4d501461019a57806366d003ac146101f057600080fd5b80630d9019e1146100d7578063307f2962146101355780633bbed4a01461015757600080fd5b366100d257005b600080fd5b3480156100e357600080fd5b5061010b7f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b34801561014157600080fd5b50610155610150366004610be5565b6102da565b005b34801561016357600080fd5b50610155610172366004610c2b565b6104a2565b34801561018357600080fd5b5061018c610622565b60405190815260200161012c565b3480156101a657600080fd5b506101e36040518060400160405280600581526020017f312e362e3000000000000000000000000000000000000000000000000000000081525081565b60405161012c9190610c48565b3480156101fc57600080fd5b5061010b61092a565b34801561021157600080fd5b5061021a610993565b60405161012c9190610d25565b34801561023357600080fd5b5061018c610a03565b34801561024857600080fd5b5061018c60005481565b34801561025e57600080fd5b5061015561026d366004610d39565b610a57565b34801561027e57600080fd5b5061021a7f000000000000000000000000000000000000000000000000000000000000000081565b3480156102b257600080fd5b5061018c7f000000000000000000000000000000000000000000000000000000000000000081565b73420000000000000000000000000000000000001873ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610339573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061035d9190610d52565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146103c1576040517f7cd7e09f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600280547401000000000000000000000000000000000000000080820460ff1692849290917fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff9091169083600181111561041d5761041d610cbb565b0217905550600280547fffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffff16770100000000000000000000000000000000000000000000001790556040517ff2ec44eb1c3b3acd547b76333eb2c4b27eee311860c57a9fdb04c95f62398fc8906104969083908590610d6f565b60405180910390a15050565b73420000000000000000000000000000000000001873ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610501573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105259190610d52565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610589576040517f7cd7e09f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600280547fffffffffffffffffffff00ff0000000000000000000000000000000000000000811673ffffffffffffffffffffffffffffffffffffffff84811691821775010000000000000000000000000000000000000000001790935560408051939092168084526020840191909152917f62e69886a5df0ba8ffcacbfc1388754e7abd9bde24b036354c561f1acd4e45939101610496565b600061062c610a03565b4710156106e6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604a60248201527f4665655661756c743a207769746864726177616c20616d6f756e74206d75737460448201527f2062652067726561746572207468616e206d696e696d756d207769746864726160648201527f77616c20616d6f756e7400000000000000000000000000000000000000000000608482015260a4015b60405180910390fd5b479050806000808282546106fa9190610d8a565b909155507fc8a211cc64b6ed1b50595a9fcb1932b6d1e5a6e8ef15b60e5b1f988ea9086bba90508161072a61092a565b6040805192835273ffffffffffffffffffffffffffffffffffffffff9091166020830152339082015260600160405180910390a17f38e04cbeb8c10f8f568618aa75be0f10b6729b8b4237743b4de20cbcde2839ee8161078861092a565b33610791610993565b6040516107a19493929190610dc9565b60405180910390a160016107b3610993565b60018111156107c4576107c4610cbb565b0361086f5760006107dc6107d661092a565b83610bbd565b90508061086b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f4665655661756c743a206661696c656420746f2073656e642045544820746f2060448201527f4c322066656520726563697069656e740000000000000000000000000000000060648201526084016106dd565b5090565b73420000000000000000000000000000000000001663c2b3e5ac8261089261092a565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b16815273ffffffffffffffffffffffffffffffffffffffff909116600482015262061a80602482015260606044820152600060648201526084016000604051808303818588803b15801561090e57600080fd5b505af1158015610922573d6000803e3d6000fd5b505050505090565b6002546000907501000000000000000000000000000000000000000000900460ff161561096e575060025473ffffffffffffffffffffffffffffffffffffffff1690565b507f000000000000000000000000000000000000000000000000000000000000000090565b60025460009077010000000000000000000000000000000000000000000000900460ff16156109de575060025474010000000000000000000000000000000000000000900460ff1690565b507f000000000000000000000000000000000000000000000000000000000000000090565b600254600090760100000000000000000000000000000000000000000000900460ff1615610a32575060015490565b507f000000000000000000000000000000000000000000000000000000000000000090565b73420000000000000000000000000000000000001873ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610ab6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ada9190610d52565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610b3e576040517f7cd7e09f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001805490829055600280547fffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffff1676010000000000000000000000000000000000000000000017905560408051828152602081018490527f895a067c78583e800418fabf3da26a9496aab2ff3429cebdf7fefa642b2e42039101610496565b6000610bca835a84610bd1565b9392505050565b6000806000806000858888f1949350505050565b600060208284031215610bf757600080fd5b813560028110610bca57600080fd5b73ffffffffffffffffffffffffffffffffffffffff81168114610c2857600080fd5b50565b600060208284031215610c3d57600080fd5b8135610bca81610c06565b600060208083528351808285015260005b81811015610c7557858101830151858201604001528201610c59565b81811115610c87576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b60028110610d21577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b9052565b60208101610d338284610cea565b92915050565b600060208284031215610d4b57600080fd5b5035919050565b600060208284031215610d6457600080fd5b8151610bca81610c06565b60408101610d7d8285610cea565b610bca6020830184610cea565b60008219821115610dc4577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b500190565b84815273ffffffffffffffffffffffffffffffffffffffff84811660208301528316604082015260808101610e016060830184610cea565b9594505050505056fea164736f6c634300080f000a000000000000000000000000420000000000000000000000000000000000002b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000beb5fc579115071764c7423a4f12edde41f106ed0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000124e9e05c420000000000000000000000004200000000000000000000000000000000000018000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000249f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000004499a88ec4000000000000000000000000420000000000000000000000000000000000001900000000000000000000000073cafd1099ac8c206790cd7e74dfa9fe43dfd7b50000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000beb5fc579115071764c7423a4f12edde41f106ed0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000001104e9e05c4200000000000000000000000013b0d85ccb8bf860b6b79af3029fca081ae9bef2000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000de2b0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000102466cfa05700000000000000000000000000000000000000000000000000000000000000004ac8e160bee0acc95b22d1744fa9cc7068869945397f78a77ed68ef8ae1d87a900000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000f9c60e060405234801561001057600080fd5b50604051610f3c380380610f3c83398101604081905261002f91610079565b6001600160a01b03831660a0526080829052828282806001811115610056576100566100cc565b60c081600181111561006a5761006a6100cc565b815250505050505050506100e2565b60008060006060848603121561008e57600080fd5b83516001600160a01b03811681146100a557600080fd5b602085015160408601519194509250600281106100c157600080fd5b809150509250925092565b634e487b7160e01b600052602160045260246000fd5b60805160a05160c051610e176101256000396000818161028401526109e101526000818160e901526109710152600081816102b80152610a350152610e176000f3fe6080604052600436106100cb5760003560e01c806382356d8a1161007457806385b5b14d1161004e57806385b5b14d14610252578063d0e12f9014610272578063d3e5792b146102a657600080fd5b806382356d8a146102055780638312f1491461022757806384411d651461023c57600080fd5b80633ccfd60b116100a55780633ccfd60b1461017757806354fd4d501461019a57806366d003ac146101f057600080fd5b80630d9019e1146100d7578063307f2962146101355780633bbed4a01461015757600080fd5b366100d257005b600080fd5b3480156100e357600080fd5b5061010b7f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b34801561014157600080fd5b50610155610150366004610be5565b6102da565b005b34801561016357600080fd5b50610155610172366004610c2b565b6104a2565b34801561018357600080fd5b5061018c610622565b60405190815260200161012c565b3480156101a657600080fd5b506101e36040518060400160405280600581526020017f312e362e3000000000000000000000000000000000000000000000000000000081525081565b60405161012c9190610c48565b3480156101fc57600080fd5b5061010b61092a565b34801561021157600080fd5b5061021a610993565b60405161012c9190610d25565b34801561023357600080fd5b5061018c610a03565b34801561024857600080fd5b5061018c60005481565b34801561025e57600080fd5b5061015561026d366004610d39565b610a57565b34801561027e57600080fd5b5061021a7f000000000000000000000000000000000000000000000000000000000000000081565b3480156102b257600080fd5b5061018c7f000000000000000000000000000000000000000000000000000000000000000081565b73420000000000000000000000000000000000001873ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610339573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061035d9190610d52565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146103c1576040517f7cd7e09f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600280547401000000000000000000000000000000000000000080820460ff1692849290917fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff9091169083600181111561041d5761041d610cbb565b0217905550600280547fffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffff16770100000000000000000000000000000000000000000000001790556040517ff2ec44eb1c3b3acd547b76333eb2c4b27eee311860c57a9fdb04c95f62398fc8906104969083908590610d6f565b60405180910390a15050565b73420000000000000000000000000000000000001873ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610501573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105259190610d52565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610589576040517f7cd7e09f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600280547fffffffffffffffffffff00ff0000000000000000000000000000000000000000811673ffffffffffffffffffffffffffffffffffffffff84811691821775010000000000000000000000000000000000000000001790935560408051939092168084526020840191909152917f62e69886a5df0ba8ffcacbfc1388754e7abd9bde24b036354c561f1acd4e45939101610496565b600061062c610a03565b4710156106e6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604a60248201527f4665655661756c743a207769746864726177616c20616d6f756e74206d75737460448201527f2062652067726561746572207468616e206d696e696d756d207769746864726160648201527f77616c20616d6f756e7400000000000000000000000000000000000000000000608482015260a4015b60405180910390fd5b479050806000808282546106fa9190610d8a565b909155507fc8a211cc64b6ed1b50595a9fcb1932b6d1e5a6e8ef15b60e5b1f988ea9086bba90508161072a61092a565b6040805192835273ffffffffffffffffffffffffffffffffffffffff9091166020830152339082015260600160405180910390a17f38e04cbeb8c10f8f568618aa75be0f10b6729b8b4237743b4de20cbcde2839ee8161078861092a565b33610791610993565b6040516107a19493929190610dc9565b60405180910390a160016107b3610993565b60018111156107c4576107c4610cbb565b0361086f5760006107dc6107d661092a565b83610bbd565b90508061086b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f4665655661756c743a206661696c656420746f2073656e642045544820746f2060448201527f4c322066656520726563697069656e740000000000000000000000000000000060648201526084016106dd565b5090565b73420000000000000000000000000000000000001663c2b3e5ac8261089261092a565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b16815273ffffffffffffffffffffffffffffffffffffffff909116600482015262061a80602482015260606044820152600060648201526084016000604051808303818588803b15801561090e57600080fd5b505af1158015610922573d6000803e3d6000fd5b505050505090565b6002546000907501000000000000000000000000000000000000000000900460ff161561096e575060025473ffffffffffffffffffffffffffffffffffffffff1690565b507f000000000000000000000000000000000000000000000000000000000000000090565b60025460009077010000000000000000000000000000000000000000000000900460ff16156109de575060025474010000000000000000000000000000000000000000900460ff1690565b507f000000000000000000000000000000000000000000000000000000000000000090565b600254600090760100000000000000000000000000000000000000000000900460ff1615610a32575060015490565b507f000000000000000000000000000000000000000000000000000000000000000090565b73420000000000000000000000000000000000001873ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610ab6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ada9190610d52565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610b3e576040517f7cd7e09f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001805490829055600280547fffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffff1676010000000000000000000000000000000000000000000017905560408051828152602081018490527f895a067c78583e800418fabf3da26a9496aab2ff3429cebdf7fefa642b2e42039101610496565b6000610bca835a84610bd1565b9392505050565b6000806000806000858888f1949350505050565b600060208284031215610bf757600080fd5b813560028110610bca57600080fd5b73ffffffffffffffffffffffffffffffffffffffff81168114610c2857600080fd5b50565b600060208284031215610c3d57600080fd5b8135610bca81610c06565b600060208083528351808285015260005b81811015610c7557858101830151858201604001528201610c59565b81811115610c87576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b60028110610d21577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b9052565b60208101610d338284610cea565b92915050565b600060208284031215610d4b57600080fd5b5035919050565b600060208284031215610d6457600080fd5b8151610bca81610c06565b60408101610d7d8285610cea565b610bca6020830184610cea565b60008219821115610dc4577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b500190565b84815273ffffffffffffffffffffffffffffffffffffffff84811660208301528316604082015260808101610e016060830184610cea565b9594505050505056fea164736f6c634300080f000a000000000000000000000000420000000000000000000000000000000000002b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000beb5fc579115071764c7423a4f12edde41f106ed0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000124e9e05c420000000000000000000000004200000000000000000000000000000000000018000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000249f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000004499a88ec4000000000000000000000000420000000000000000000000000000000000001a0000000000000000000000004d76e5decbbd6a0de0ae39e089eca932e14cf6730000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"; + "0x174dea710000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000001800000000000000000000000000000000000000000000000000000000000000d2000000000000000000000000000000000000000000000000000000000000018e00000000000000000000000000000000000000000000000000000000000002ee00000000000000000000000000000000000000000000000000000000000003140000000000000000000000000000000000000000000000000000000000000430000000000000000000000000000000000000000000000000000000000000045a000000000000000000000000000000000000000000000000000000000000057600000000000000000000000000000000000000000000000000000000000005a000000000000000000000000000000000000000000000000000000000000006bc00000000000000000000000000000000000000000000000000000000000006e600000000000000000000000000000000000000000000000000000000000008020000000000000000000000000beb5fc579115071764c7423a4f12edde41f106ed0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000ae4e9e05c4200000000000000000000000013b0d85ccb8bf860b6b79af3029fca081ae9bef200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000098968000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000a0466cfa0570000000000000000000000000000000000000000000000000000000000000000fa8e542d08c461382d17d78973c846bafcf01f0c60f78f77abd977884fd393ff000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000009686080604052348015600e575f80fd5b50604051610908380380610908833981016040819052602b916067565b5f929092556001805463ffffffff909316600160a01b026001600160c01b03199093166001600160a01b039092169190911791909117905560b8565b5f805f606084860312156078575f80fd5b835160208501519093506001600160a01b03811681146095575f80fd5b604085015190925063ffffffff8116811460ad575f80fd5b809150509250925092565b610843806100c55f395ff3fe608060405260043610610071575f3560e01c806366d003ac1161004c57806366d003ac146102995780638312f149146102ea57806385b5b14d1461030c5780639d7955b41461032b575f80fd5b80633bbed4a0146101d7578063500bf72f146101f657806354fd4d5014610244575f80fd5b366101d3576040805134815247602082018190529133917f363f315f930a17d1266b86a20d6dd34b1cfbc5a9db9f13a65d06a689c3a2af8a910160405180910390a25f5481106101d1576001546040517f3dbb202b00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff82166004820152606060248201525f60648201527401000000000000000000000000000000000000000090910463ffffffff16604482015273420000000000000000000000000000000000000790633dbb202b9083906084015f604051808303818588803b158015610169575f80fd5b505af115801561017b573d5f803e3d5ffd5b505060015460405185815273ffffffffffffffffffffffffffffffffffffffff90911693507f6d92f7d3303f995bf21956bb0c51b388bae348eaf45c23debd2cfa3fcd9ec6469250602001905060405180910390a25b005b5f80fd5b3480156101e2575f80fd5b506101d16101f136600461076c565b61034a565b348015610201575f80fd5b5060015461022a9074010000000000000000000000000000000000000000900463ffffffff1681565b60405163ffffffff90911681526020015b60405180910390f35b34801561024f575f80fd5b5061028c6040518060400160405280600581526020017f312e302e3000000000000000000000000000000000000000000000000000000081525081565b60405161023b919061078e565b3480156102a4575f80fd5b506001546102c59073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200161023b565b3480156102f5575f80fd5b506102fe5f5481565b60405190815260200161023b565b348015610317575f80fd5b506101d16103263660046107e1565b6104b6565b348015610336575f80fd5b506101d16103453660046107f8565b6105d8565b73420000000000000000000000000000000000001873ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156103a7573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906103cb919061081b565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461042f576040517f807b982000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff000000000000000000000000000000000000000083168117909355604080519190921680825260208201939093527f62e69886a5df0ba8ffcacbfc1388754e7abd9bde24b036354c561f1acd4e459391015b60405180910390a15050565b73420000000000000000000000000000000000001873ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610513573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610537919061081b565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461059b576040517f807b982000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f80549082905560408051828152602081018490527f895a067c78583e800418fabf3da26a9496aab2ff3429cebdf7fefa642b2e420391016104aa565b73420000000000000000000000000000000000001873ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610635573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610659919061081b565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146106bd576040517f807b982000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001805463ffffffff838116740100000000000000000000000000000000000000008181027fffffffffffffffff00000000ffffffffffffffffffffffffffffffffffffffff85161790945560408051949093049091168084526020840191909152917fd00b9b2acb0059a20066ca19b541618141c03305a0a6644d43277758c539b5de91016104aa565b73ffffffffffffffffffffffffffffffffffffffff81168114610769575f80fd5b50565b5f6020828403121561077c575f80fd5b813561078781610748565b9392505050565b602081525f82518060208401528060208501604085015e5f6040828501015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011684010191505092915050565b5f602082840312156107f1575f80fd5b5035919050565b5f60208284031215610808575f80fd5b813563ffffffff81168114610787575f80fd5b5f6020828403121561082b575f80fd5b81516107878161074856fea164736f6c6343000819000a0000000000000000000000000000000000000000000000000000000000055730000000000000000000000000742d35cc6634c0532925a3b8d0c0c8b8b0c0c8b80000000000000000000000000000000000000000000000000000000000030d400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000beb5fc579115071764c7423a4f12edde41f106ed0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000b04e9e05c4200000000000000000000000013b0d85ccb8bf860b6b79af3029fca081ae9bef200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000098968000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000a2466cfa0570000000000000000000000000000000000000000000000000000000000000000d07fd81b3e1bcfbf3c91e5b2f6b54443cff180a787261d425462132920599561000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000009956080604052348015600e575f80fd5b50604051610955380380610955833981016040819052602b916074565b5f80546001600160a01b039384166001600160a01b0319918216179091556001805492909316911617905560a0565b80516001600160a01b0381168114606f575f80fd5b919050565b5f80604083850312156084575f80fd5b608b83605a565b9150609760208401605a565b90509250929050565b6108a8806100ad5f395ff3fe608060405234801561000f575f80fd5b506004361061009f575f3560e01c80635b201d83116100725780637b42d6c2116100585780637b42d6c21461019157806396d842be1461019a5780639c662fdd146101b9575f80fd5b80635b201d831461016b578063712d7bb814610189575f80fd5b806329f33ec8146100a35780634b012e9a146100ed57806354e7f42d1461010257806354fd4d5014610122575b5f80fd5b6001546100c39073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b6101006100fb3660046106a3565b6101cc565b005b6101156101103660046106c5565b610325565b6040516100e491906106f4565b61015e6040518060400160405280600581526020017f312e302e3000000000000000000000000000000000000000000000000000000081525081565b6040516100e49190610758565b61017461271081565b60405163ffffffff90911681526020016100e4565b61017460fa81565b6101746105dc81565b5f546100c39073ffffffffffffffffffffffffffffffffffffffff1681565b6101006101c73660046106a3565b610524565b73420000000000000000000000000000000000001873ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610229573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061024d91906107ab565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146102b1576040517f67102c4c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917fc7b7459ad1ab31862524bf0c4a5e6a8518c60f27607a5c483a58ea27e30c214c9190a35050565b6040805160028082526060828101909352816020015b604080518082019091525f808252602082015281526020019060019003908161033b575050604080518082019091525f805473ffffffffffffffffffffffffffffffffffffffff16825260208201819052825192935090918391906103a2576103a26107c6565b6020026020010181905250604051806040016040528060015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020015f8152508160018151811061040c5761040c6107c6565b60209081029190910101525f82846104248789610820565b61042e9190610820565b6104389190610820565b90505f61271061044960fa84610839565b6104539190610850565b9050805f0361048e576040517f0174e42600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f6104998584610888565b90505f6127106104ab6105dc84610839565b6104b59190610850565b90505f8184116104c557816104c7565b835b905080865f815181106104dc576104dc6107c6565b60209081029190910181015101526104f48186610888565b86600181518110610507576105076107c6565b602002602001015160200181815250505050505050949350505050565b73420000000000000000000000000000000000001873ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610581573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906105a591906107ab565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610609576040517f67102c4c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f28c1e0a919cd3b91d6d516417dedc06a2bd7954ad8960315347250b1aee2a4f1905f90a35050565b73ffffffffffffffffffffffffffffffffffffffff811681146106a0575f80fd5b50565b5f602082840312156106b3575f80fd5b81356106be8161067f565b9392505050565b5f805f80608085870312156106d8575f80fd5b5050823594602084013594506040840135936060013592509050565b602080825282518282018190525f919060409081850190868401855b8281101561074b578151805173ffffffffffffffffffffffffffffffffffffffff168552860151868501529284019290850190600101610710565b5091979650505050505050565b602081525f82518060208401528060208501604085015e5f6040828501015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011684010191505092915050565b5f602082840312156107bb575f80fd5b81516106be8161067f565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b80820180821115610833576108336107f3565b92915050565b8082028115828204841417610833576108336107f3565b5f82610883577f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b500490565b81810381811115610833576108336107f356fea164736f6c6343000819000a00000000000000000000000065e05252dd7964dbb722a9fca24c6a2d7afbef570000000000000000000000008b0c0c8b8b0c0c8b8b0c0c8b8b0c0c8b8b0c0c8b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000beb5fc579115071764c7423a4f12edde41f106ed0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000001544e9e05c4200000000000000000000000013b0d85ccb8bf860b6b79af3029fca081ae9bef20000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000012d838000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000146466cfa0570000000000000000000000000000000000000000000000000000000000000000d7c04619bfc311a92d20723f9d08baaba18c3c8c7dcd85736bf66b85f59c37f6000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000013d26080604052348015600e575f80fd5b5060156019565b60d4565b5f54610100900460ff161560835760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b5f5460ff908116101560d2575f805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6112f1806100e15f395ff3fe608060405260043610610096575f3560e01c80637dfbd04911610066578063b87ea8d41161004c578063b87ea8d414610313578063c4d66de814610327578063d61a398b14610346575f80fd5b80637dfbd049146102dd5780637fc81bb7146102f4575f80fd5b80630a7617b3146101dd5780630c0544a3146101fe578063394d27311461026057806354fd4d5014610288575f80fd5b366101d9577fe3007e9730850b5618eacb0537bef0cf0f1600267ae8549e472449d77b731e455c6100f3576040517f17617f6100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b337342000000000000000000000000000000000000111480159061012b57503373420000000000000000000000000000000000001914155b801561014b57503373420000000000000000000000000000000000001a14155b801561016b57503373420000000000000000000000000000000000001b14155b156101a2576040517f9dcde10900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60405134815233907f2ccfc58c2cef4ee590b5f16be0548cc54afc12e1c66a67b362b7d640fd16bb2d9060200160405180910390a2005b5f80fd5b3480156101e8575f80fd5b506101fc6101f7366004610f4b565b61039c565b005b348015610209575f80fd5b5060015461023a9070010000000000000000000000000000000090046fffffffffffffffffffffffffffffffff1681565b6040516fffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b34801561026b575f80fd5b5060015461023a906fffffffffffffffffffffffffffffffff1681565b348015610293575f80fd5b506102d06040518060400160405280600581526020017f312e302e3000000000000000000000000000000000000000000000000000000081525081565b6040516102579190610f66565b3480156102e8575f80fd5b5061023a6301e1338081565b3480156102ff575f80fd5b506101fc61030e366004610fb9565b61055e565b34801561031e575f80fd5b506101fc610706565b348015610332575f80fd5b506101fc610341366004610f4b565b610aea565b348015610351575f80fd5b505f546103779062010000900473ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610257565b73420000000000000000000000000000000000001873ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156103f9573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061041d9190610fe8565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610481576040517f38bac74200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff81166104ce576040517f99c6ec0800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f805473ffffffffffffffffffffffffffffffffffffffff838116620100008181027fffffffffffffffffffff0000000000000000000000000000000000000000ffff85161790945560408051949093049091168084526020840191909152917f16417cc372deec0caee5f52e2ad77a5f07b4591fd56b4ff31b6e20f817d4daeb91015b60405180910390a15050565b73420000000000000000000000000000000000001873ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156105bb573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906105df9190610fe8565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610643576040517f38bac74200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6301e133806fffffffffffffffffffffffffffffffff82161115610693576040517f30b9f35e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600180546fffffffffffffffffffffffffffffffff8381167001000000000000000000000000000000008181028385161790945560408051949093049091168084526020840191909152917f4492086b630ed3846eec0979dd87a71c814ceb1c6dab80ab81e3450b21e4de289101610552565b60015461073b906fffffffffffffffffffffffffffffffff700100000000000000000000000000000000820481169116611030565b6fffffffffffffffffffffffffffffffff16421015610786576040517f1e4a9f3a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600180547fffffffffffffffffffffffffffffffff0000000000000000000000000000000016426fffffffffffffffffffffffffffffffff161781556107cb90610ce0565b5f6107e9734200000000000000000000000000000000000011610d06565b90505f610809734200000000000000000000000000000000000019610d06565b90505f61082973420000000000000000000000000000000000001a610d06565b90505f61084973420000000000000000000000000000000000001b610d06565b90506108545f610ce0565b5f82826108618688611060565b61086b9190611060565b6108759190611060565b9050805f036108b0576040517fc8972e5200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f80546040517f54e7f42d000000000000000000000000000000000000000000000000000000008152600481018890526024810187905260448101859052606481018690526201000090910473ffffffffffffffffffffffffffffffffffffffff16906354e7f42d906084015f60405180830381865afa158015610936573d5f803e3d5ffd5b505050506040513d5f823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016820160405261097b9190810190611118565b905080515f036109b7576040517f763970d600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f805b8251811015610a6e575f8382815181106109d6576109d66111e7565b60200260200101515f015190505f8483815181106109f6576109f66111e7565b6020026020010151602001519050805f03610a12575050610a66565b5f610a1d8383610f03565b905080610a56576040517fd68d1b1800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610a608286611060565b94505050505b6001016109ba565b50828114610aa8576040517f9c01eac000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f73f9a13241a1848ec157967f3a85601709353e616f1f2605d818c0f2d21774df8284604051610ad9929190611214565b60405180910390a150505050505050565b5f54610100900460ff1615808015610b0857505f54600160ff909116105b80610b215750303b158015610b2157505f5460ff166001145b610bb1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a6564000000000000000000000000000000000000606482015260840160405180910390fd5b5f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558015610c0d575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b5f80547fffffffffffffffffffff0000000000000000000000000000000000000000ffff166201000073ffffffffffffffffffffffffffffffffffffffff851602179055600180546fffffffffffffffffffffffffffffffff1672015180000000000000000000000000000000001790558015610cdc575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb384740249890602001610552565b5050565b807fe3007e9730850b5618eacb0537bef0cf0f1600267ae8549e472449d77b731e455d50565b5f60018273ffffffffffffffffffffffffffffffffffffffff166382356d8a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610d52573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610d7691906112af565b6001811115610d8757610d87611282565b14610dbe576040517fb4726cbe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b3073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff166366d003ac6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610e1e573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e429190610fe8565b73ffffffffffffffffffffffffffffffffffffffff1614610e8f576040517fc3380cef00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8173ffffffffffffffffffffffffffffffffffffffff16633ccfd60b6040518163ffffffff1660e01b81526004016020604051808303815f875af1158015610ed9573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610efd91906112cd565b92915050565b5f610f0f835a84610f16565b9392505050565b5f805f805f858888f1949350505050565b73ffffffffffffffffffffffffffffffffffffffff81168114610f48575f80fd5b50565b5f60208284031215610f5b575f80fd5b8135610f0f81610f27565b602081525f82518060208401528060208501604085015e5f6040828501015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011684010191505092915050565b5f60208284031215610fc9575f80fd5b81356fffffffffffffffffffffffffffffffff81168114610f0f575f80fd5b5f60208284031215610ff8575f80fd5b8151610f0f81610f27565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b6fffffffffffffffffffffffffffffffff81811683821601908082111561105957611059611003565b5092915050565b80820180821115610efd57610efd611003565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b6040805190810167ffffffffffffffff811182821017156110c3576110c3611073565b60405290565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff8111828210171561111057611110611073565b604052919050565b5f6020808385031215611129575f80fd5b825167ffffffffffffffff80821115611140575f80fd5b818501915085601f830112611153575f80fd5b81518181111561116557611165611073565b611173848260051b016110c9565b818152848101925060069190911b830184019087821115611192575f80fd5b928401925b818410156111dc57604084890312156111ae575f80fd5b6111b66110a0565b84516111c181610f27565b81528486015186820152835260409093019291840191611197565b979650505050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b604080825283518282018190525f91906020906060850190828801855b8281101561126c578151805173ffffffffffffffffffffffffffffffffffffffff168552850151858501529285019290840190600101611231565b5050508093505050508260208301529392505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b5f602082840312156112bf575f80fd5b815160028110610f0f575f80fd5b5f602082840312156112dd575f80fd5b505191905056fea164736f6c6343000819000a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000beb5fc579115071764c7423a4f12edde41f106ed00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000001a4e9e05c420000000000000000000000004200000000000000000000000000000000000018000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000249f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000c49623609d000000000000000000000000420000000000000000000000000000000000002b0000000000000000000000006b0d0b5d65c13ed9ec80617772aee4d6c594a66e00000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000024c4d66de8000000000000000000000000a9c1d283ab6f149853337395e18850b3ff6cf192000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000beb5fc579115071764c7423a4f12edde41f106ed0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000001104e9e05c4200000000000000000000000013b0d85ccb8bf860b6b79af3029fca081ae9bef2000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000de2b0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000102466cfa0570000000000000000000000000000000000000000000000000000000000000000783aa8b3e401c8404e3eff9401ba29702719ddc0c0f69ec9ac77188bacea107300000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000f8f6080604052348015600e575f80fd5b5060156019565b60c9565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff161560685760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b039081161460c65780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b610eb9806100d65f395ff3fe6080604052600436106100d1575f3560e01c806382356d8a1161007c57806385b5b14d1161005757806385b5b14d14610276578063b49dc74114610295578063d0e12f90146102b4578063d3e5792b146102e3575f80fd5b806382356d8a1461020f5780638312f1491461024d57806384411d6514610262575f80fd5b80633ccfd60b116100ac5780633ccfd60b1461016c57806354fd4d501461018e57806366d003ac146101e3575f80fd5b80630d9019e1146100dc578063307f29621461012c5780633bbed4a01461014d575f80fd5b366100d857005b5f80fd5b3480156100e7575f80fd5b5060025473ffffffffffffffffffffffffffffffffffffffff165b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b348015610137575f80fd5b5061014b610146366004610c86565b6102f7565b005b348015610158575f80fd5b5061014b610167366004610cc3565b61047a565b348015610177575f80fd5b506101806105de565b604051908152602001610123565b348015610199575f80fd5b506101d66040518060400160405280600581526020017f312e312e3000000000000000000000000000000000000000000000000000000081525081565b6040516101239190610cde565b3480156101ee575f80fd5b506002546101029073ffffffffffffffffffffffffffffffffffffffff1681565b34801561021a575f80fd5b506002546102409074010000000000000000000000000000000000000000900460ff1681565b6040516101239190610d97565b348015610258575f80fd5b5061018060015481565b34801561026d575f80fd5b506101805f5481565b348015610281575f80fd5b5061014b610290366004610dab565b610918565b3480156102a0575f80fd5b5061014b6102af366004610dc2565b610a3b565b3480156102bf575f80fd5b5060025474010000000000000000000000000000000000000000900460ff16610240565b3480156102ee575f80fd5b50600154610180565b73420000000000000000000000000000000000001873ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610354573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906103789190610dfd565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146103dc576040517f7cd7e09f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600280547401000000000000000000000000000000000000000080820460ff1692849290917fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff9091169083600181111561043857610438610d31565b02179055507ff2ec44eb1c3b3acd547b76333eb2c4b27eee311860c57a9fdb04c95f62398fc8818360405161046e929190610e18565b60405180910390a15050565b73420000000000000000000000000000000000001873ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156104d7573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104fb9190610dfd565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461055f576040517f7cd7e09f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff000000000000000000000000000000000000000083168117909355604080519190921680825260208201939093527f62e69886a5df0ba8ffcacbfc1388754e7abd9bde24b036354c561f1acd4e4593910161046e565b5f60015447101561069c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604a60248201527f4665655661756c743a207769746864726177616c20616d6f756e74206d75737460448201527f2062652067726561746572207468616e206d696e696d756d207769746864726160648201527f77616c20616d6f756e7400000000000000000000000000000000000000000000608482015260a4015b60405180910390fd5b479050805f808282546106af9190610e33565b90915550506002546040805183815273ffffffffffffffffffffffffffffffffffffffff90921660208301523382820152517fc8a211cc64b6ed1b50595a9fcb1932b6d1e5a6e8ef15b60e5b1f988ea9086bba9181900360600190a16002546040517f38e04cbeb8c10f8f568618aa75be0f10b6729b8b4237743b4de20cbcde2839ee9161077491849173ffffffffffffffffffffffffffffffffffffffff811691339174010000000000000000000000000000000000000000900460ff1690610e6b565b60405180910390a1600160025474010000000000000000000000000000000000000000900460ff1660018111156107ad576107ad610d31565b0361086a576002545f906107d79073ffffffffffffffffffffffffffffffffffffffff1683610c4f565b905080610866576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f4665655661756c743a206661696c656420746f2073656e642045544820746f2060448201527f4c322066656520726563697069656e74000000000000000000000000000000006064820152608401610693565b5090565b6002546040517fc2b3e5ac00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff909116600482015262061a806024820152606060448201525f60648201527342000000000000000000000000000000000000169063c2b3e5ac9083906084015f604051808303818588803b1580156108fe575f80fd5b505af1158015610910573d5f803e3d5ffd5b505050505090565b73420000000000000000000000000000000000001873ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610975573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109999190610dfd565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146109fd576040517f7cd7e09f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600180549082905560408051828152602081018490527f895a067c78583e800418fabf3da26a9496aab2ff3429cebdf7fefa642b2e4203910161046e565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000810460ff16159067ffffffffffffffff165f81158015610a855750825b90505f8267ffffffffffffffff166001148015610aa15750303b155b905081158015610aaf575080155b15610ae6576040517ff92ee8a900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b84547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001660011785558315610b475784547fffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffff16680100000000000000001785555b6002805473ffffffffffffffffffffffffffffffffffffffff8a167fffffffffffffffffffffffff000000000000000000000000000000000000000082168117835560018a81558993927fffffffffffffffffffffff000000000000000000000000000000000000000000169091179074010000000000000000000000000000000000000000908490811115610bdf57610bdf610d31565b02179055508315610c455784547fffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffff168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b5050505050505050565b5f610c5b835a84610c62565b9392505050565b5f805f805f858888f1949350505050565b803560028110610c81575f80fd5b919050565b5f60208284031215610c96575f80fd5b610c5b82610c73565b73ffffffffffffffffffffffffffffffffffffffff81168114610cc0575f80fd5b50565b5f60208284031215610cd3575f80fd5b8135610c5b81610c9f565b602081525f82518060208401528060208501604085015e5f6040828501015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011684010191505092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b60028110610d93577f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b9052565b60208101610da58284610d5e565b92915050565b5f60208284031215610dbb575f80fd5b5035919050565b5f805f60608486031215610dd4575f80fd5b8335610ddf81610c9f565b925060208401359150610df460408501610c73565b90509250925092565b5f60208284031215610e0d575f80fd5b8151610c5b81610c9f565b60408101610e268285610d5e565b610c5b6020830184610d5e565b80820180821115610da5577f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b84815273ffffffffffffffffffffffffffffffffffffffff84811660208301528316604082015260808101610ea36060830184610d5e565b9594505050505056fea164736f6c6343000819000a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000beb5fc579115071764c7423a4f12edde41f106ed00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000001e4e9e05c420000000000000000000000004200000000000000000000000000000000000018000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000249f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000001049623609d000000000000000000000000420000000000000000000000000000000000001b000000000000000000000000bb8accad49adb30084bdf22d01a109883fd13dce00000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000064b49dc741000000000000000000000000420000000000000000000000000000000000002b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000beb5fc579115071764c7423a4f12edde41f106ed0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000001104e9e05c4200000000000000000000000013b0d85ccb8bf860b6b79af3029fca081ae9bef2000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000de2b0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000102466cfa0570000000000000000000000000000000000000000000000000000000000000000204cb368f75f2d6cade61b62cb318bffd2bd31a57a3f86dff75f5bfd9d2dd14900000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000f9a6080604052348015600e575f80fd5b5060156019565b60c9565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff161560685760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b039081161460c65780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b610ec4806100d65f395ff3fe6080604052600436106100dc575f3560e01c80638312f1491161007c578063b49dc74111610057578063b49dc741146102a0578063d0e12f90146102bf578063d3e5792b146102ee578063d4ff9218146100e7575f80fd5b80638312f1491461025857806384411d651461026d57806385b5b14d14610281575f80fd5b80633ccfd60b116100b75780633ccfd60b1461017757806354fd4d501461019957806366d003ac146101ee57806382356d8a1461021a575f80fd5b80630d9019e1146100e7578063307f2962146101375780633bbed4a014610158575f80fd5b366100e357005b5f80fd5b3480156100f2575f80fd5b5060025473ffffffffffffffffffffffffffffffffffffffff165b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b348015610142575f80fd5b50610156610151366004610c91565b610302565b005b348015610163575f80fd5b50610156610172366004610cce565b610485565b348015610182575f80fd5b5061018b6105e9565b60405190815260200161012e565b3480156101a4575f80fd5b506101e16040518060400160405280600581526020017f312e362e3000000000000000000000000000000000000000000000000000000081525081565b60405161012e9190610ce9565b3480156101f9575f80fd5b5060025461010d9073ffffffffffffffffffffffffffffffffffffffff1681565b348015610225575f80fd5b5060025461024b9074010000000000000000000000000000000000000000900460ff1681565b60405161012e9190610da2565b348015610263575f80fd5b5061018b60015481565b348015610278575f80fd5b5061018b5f5481565b34801561028c575f80fd5b5061015661029b366004610db6565b610923565b3480156102ab575f80fd5b506101566102ba366004610dcd565b610a46565b3480156102ca575f80fd5b5060025474010000000000000000000000000000000000000000900460ff1661024b565b3480156102f9575f80fd5b5060015461018b565b73420000000000000000000000000000000000001873ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561035f573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906103839190610e08565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146103e7576040517f7cd7e09f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600280547401000000000000000000000000000000000000000080820460ff1692849290917fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff9091169083600181111561044357610443610d3c565b02179055507ff2ec44eb1c3b3acd547b76333eb2c4b27eee311860c57a9fdb04c95f62398fc88183604051610479929190610e23565b60405180910390a15050565b73420000000000000000000000000000000000001873ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156104e2573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906105069190610e08565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461056a576040517f7cd7e09f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff000000000000000000000000000000000000000083168117909355604080519190921680825260208201939093527f62e69886a5df0ba8ffcacbfc1388754e7abd9bde24b036354c561f1acd4e45939101610479565b5f6001544710156106a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604a60248201527f4665655661756c743a207769746864726177616c20616d6f756e74206d75737460448201527f2062652067726561746572207468616e206d696e696d756d207769746864726160648201527f77616c20616d6f756e7400000000000000000000000000000000000000000000608482015260a4015b60405180910390fd5b479050805f808282546106ba9190610e3e565b90915550506002546040805183815273ffffffffffffffffffffffffffffffffffffffff90921660208301523382820152517fc8a211cc64b6ed1b50595a9fcb1932b6d1e5a6e8ef15b60e5b1f988ea9086bba9181900360600190a16002546040517f38e04cbeb8c10f8f568618aa75be0f10b6729b8b4237743b4de20cbcde2839ee9161077f91849173ffffffffffffffffffffffffffffffffffffffff811691339174010000000000000000000000000000000000000000900460ff1690610e76565b60405180910390a1600160025474010000000000000000000000000000000000000000900460ff1660018111156107b8576107b8610d3c565b03610875576002545f906107e29073ffffffffffffffffffffffffffffffffffffffff1683610c5a565b905080610871576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f4665655661756c743a206661696c656420746f2073656e642045544820746f2060448201527f4c322066656520726563697069656e7400000000000000000000000000000000606482015260840161069e565b5090565b6002546040517fc2b3e5ac00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff909116600482015262061a806024820152606060448201525f60648201527342000000000000000000000000000000000000169063c2b3e5ac9083906084015f604051808303818588803b158015610909575f80fd5b505af115801561091b573d5f803e3d5ffd5b505050505090565b73420000000000000000000000000000000000001873ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610980573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109a49190610e08565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610a08576040517f7cd7e09f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600180549082905560408051828152602081018490527f895a067c78583e800418fabf3da26a9496aab2ff3429cebdf7fefa642b2e42039101610479565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000810460ff16159067ffffffffffffffff165f81158015610a905750825b90505f8267ffffffffffffffff166001148015610aac5750303b155b905081158015610aba575080155b15610af1576040517ff92ee8a900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b84547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001660011785558315610b525784547fffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffff16680100000000000000001785555b6002805473ffffffffffffffffffffffffffffffffffffffff8a167fffffffffffffffffffffffff000000000000000000000000000000000000000082168117835560018a81558993927fffffffffffffffffffffff000000000000000000000000000000000000000000169091179074010000000000000000000000000000000000000000908490811115610bea57610bea610d3c565b02179055508315610c505784547fffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffff168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b5050505050505050565b5f610c66835a84610c6d565b9392505050565b5f805f805f858888f1949350505050565b803560028110610c8c575f80fd5b919050565b5f60208284031215610ca1575f80fd5b610c6682610c7e565b73ffffffffffffffffffffffffffffffffffffffff81168114610ccb575f80fd5b50565b5f60208284031215610cde575f80fd5b8135610c6681610caa565b602081525f82518060208401528060208501604085015e5f6040828501015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011684010191505092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b60028110610d9e577f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b9052565b60208101610db08284610d69565b92915050565b5f60208284031215610dc6575f80fd5b5035919050565b5f805f60608486031215610ddf575f80fd5b8335610dea81610caa565b925060208401359150610dff60408501610c7e565b90509250925092565b5f60208284031215610e18575f80fd5b8151610c6681610caa565b60408101610e318285610d69565b610c666020830184610d69565b80820180821115610db0577f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b84815273ffffffffffffffffffffffffffffffffffffffff84811660208301528316604082015260808101610eae6060830184610d69565b9594505050505056fea164736f6c6343000819000a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000beb5fc579115071764c7423a4f12edde41f106ed00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000001e4e9e05c420000000000000000000000004200000000000000000000000000000000000018000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000249f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000001049623609d00000000000000000000000042000000000000000000000000000000000000110000000000000000000000006ca5002ca794cfeebc0ec0d04ef89a382bb3942500000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000064b49dc741000000000000000000000000420000000000000000000000000000000000002b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000beb5fc579115071764c7423a4f12edde41f106ed0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000001104e9e05c4200000000000000000000000013b0d85ccb8bf860b6b79af3029fca081ae9bef2000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000de2b0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000102466cfa05700000000000000000000000000000000000000000000000000000000000000007a2bde9cfb7f80a4198677bdf885a43dc36c598688294f694cf64429164f140000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000f8f6080604052348015600e575f80fd5b5060156019565b60c9565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff161560685760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b039081161460c65780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b610eb9806100d65f395ff3fe6080604052600436106100d1575f3560e01c806382356d8a1161007c57806385b5b14d1161005757806385b5b14d14610276578063b49dc74114610295578063d0e12f90146102b4578063d3e5792b146102e3575f80fd5b806382356d8a1461020f5780638312f1491461024d57806384411d6514610262575f80fd5b80633ccfd60b116100ac5780633ccfd60b1461016c57806354fd4d501461018e57806366d003ac146101e3575f80fd5b80630d9019e1146100dc578063307f29621461012c5780633bbed4a01461014d575f80fd5b366100d857005b5f80fd5b3480156100e7575f80fd5b5060025473ffffffffffffffffffffffffffffffffffffffff165b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b348015610137575f80fd5b5061014b610146366004610c86565b6102f7565b005b348015610158575f80fd5b5061014b610167366004610cc3565b61047a565b348015610177575f80fd5b506101806105de565b604051908152602001610123565b348015610199575f80fd5b506101d66040518060400160405280600581526020017f312e362e3000000000000000000000000000000000000000000000000000000081525081565b6040516101239190610cde565b3480156101ee575f80fd5b506002546101029073ffffffffffffffffffffffffffffffffffffffff1681565b34801561021a575f80fd5b506002546102409074010000000000000000000000000000000000000000900460ff1681565b6040516101239190610d97565b348015610258575f80fd5b5061018060015481565b34801561026d575f80fd5b506101805f5481565b348015610281575f80fd5b5061014b610290366004610dab565b610918565b3480156102a0575f80fd5b5061014b6102af366004610dc2565b610a3b565b3480156102bf575f80fd5b5060025474010000000000000000000000000000000000000000900460ff16610240565b3480156102ee575f80fd5b50600154610180565b73420000000000000000000000000000000000001873ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610354573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906103789190610dfd565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146103dc576040517f7cd7e09f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600280547401000000000000000000000000000000000000000080820460ff1692849290917fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff9091169083600181111561043857610438610d31565b02179055507ff2ec44eb1c3b3acd547b76333eb2c4b27eee311860c57a9fdb04c95f62398fc8818360405161046e929190610e18565b60405180910390a15050565b73420000000000000000000000000000000000001873ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156104d7573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104fb9190610dfd565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461055f576040517f7cd7e09f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff000000000000000000000000000000000000000083168117909355604080519190921680825260208201939093527f62e69886a5df0ba8ffcacbfc1388754e7abd9bde24b036354c561f1acd4e4593910161046e565b5f60015447101561069c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604a60248201527f4665655661756c743a207769746864726177616c20616d6f756e74206d75737460448201527f2062652067726561746572207468616e206d696e696d756d207769746864726160648201527f77616c20616d6f756e7400000000000000000000000000000000000000000000608482015260a4015b60405180910390fd5b479050805f808282546106af9190610e33565b90915550506002546040805183815273ffffffffffffffffffffffffffffffffffffffff90921660208301523382820152517fc8a211cc64b6ed1b50595a9fcb1932b6d1e5a6e8ef15b60e5b1f988ea9086bba9181900360600190a16002546040517f38e04cbeb8c10f8f568618aa75be0f10b6729b8b4237743b4de20cbcde2839ee9161077491849173ffffffffffffffffffffffffffffffffffffffff811691339174010000000000000000000000000000000000000000900460ff1690610e6b565b60405180910390a1600160025474010000000000000000000000000000000000000000900460ff1660018111156107ad576107ad610d31565b0361086a576002545f906107d79073ffffffffffffffffffffffffffffffffffffffff1683610c4f565b905080610866576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f4665655661756c743a206661696c656420746f2073656e642045544820746f2060448201527f4c322066656520726563697069656e74000000000000000000000000000000006064820152608401610693565b5090565b6002546040517fc2b3e5ac00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff909116600482015262061a806024820152606060448201525f60648201527342000000000000000000000000000000000000169063c2b3e5ac9083906084015f604051808303818588803b1580156108fe575f80fd5b505af1158015610910573d5f803e3d5ffd5b505050505090565b73420000000000000000000000000000000000001873ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610975573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109999190610dfd565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146109fd576040517f7cd7e09f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600180549082905560408051828152602081018490527f895a067c78583e800418fabf3da26a9496aab2ff3429cebdf7fefa642b2e4203910161046e565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000810460ff16159067ffffffffffffffff165f81158015610a855750825b90505f8267ffffffffffffffff166001148015610aa15750303b155b905081158015610aaf575080155b15610ae6576040517ff92ee8a900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b84547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001660011785558315610b475784547fffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffff16680100000000000000001785555b6002805473ffffffffffffffffffffffffffffffffffffffff8a167fffffffffffffffffffffffff000000000000000000000000000000000000000082168117835560018a81558993927fffffffffffffffffffffff000000000000000000000000000000000000000000169091179074010000000000000000000000000000000000000000908490811115610bdf57610bdf610d31565b02179055508315610c455784547fffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffff168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b5050505050505050565b5f610c5b835a84610c62565b9392505050565b5f805f805f858888f1949350505050565b803560028110610c81575f80fd5b919050565b5f60208284031215610c96575f80fd5b610c5b82610c73565b73ffffffffffffffffffffffffffffffffffffffff81168114610cc0575f80fd5b50565b5f60208284031215610cd3575f80fd5b8135610c5b81610c9f565b602081525f82518060208401528060208501604085015e5f6040828501015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011684010191505092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b60028110610d93577f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b9052565b60208101610da58284610d5e565b92915050565b5f60208284031215610dbb575f80fd5b5035919050565b5f805f60608486031215610dd4575f80fd5b8335610ddf81610c9f565b925060208401359150610df460408501610c73565b90509250925092565b5f60208284031215610e0d575f80fd5b8151610c5b81610c9f565b60408101610e268285610d5e565b610c5b6020830184610d5e565b80820180821115610da5577f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b84815273ffffffffffffffffffffffffffffffffffffffff84811660208301528316604082015260808101610ea36060830184610d5e565b9594505050505056fea164736f6c6343000819000a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000beb5fc579115071764c7423a4f12edde41f106ed00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000001e4e9e05c420000000000000000000000004200000000000000000000000000000000000018000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000249f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000001049623609d00000000000000000000000042000000000000000000000000000000000000190000000000000000000000003240dd3b3ba917563f63ea129cddff7fb696070500000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000064b49dc741000000000000000000000000420000000000000000000000000000000000002b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000beb5fc579115071764c7423a4f12edde41f106ed0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000001104e9e05c4200000000000000000000000013b0d85ccb8bf860b6b79af3029fca081ae9bef2000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000de2b0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000102466cfa05700000000000000000000000000000000000000000000000000000000000000004ac8e160bee0acc95b22d1744fa9cc7068869945397f78a77ed68ef8ae1d87a900000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000f8f6080604052348015600e575f80fd5b5060156019565b60c9565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff161560685760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b039081161460c65780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b610eb9806100d65f395ff3fe6080604052600436106100d1575f3560e01c806382356d8a1161007c57806385b5b14d1161005757806385b5b14d14610276578063b49dc74114610295578063d0e12f90146102b4578063d3e5792b146102e3575f80fd5b806382356d8a1461020f5780638312f1491461024d57806384411d6514610262575f80fd5b80633ccfd60b116100ac5780633ccfd60b1461016c57806354fd4d501461018e57806366d003ac146101e3575f80fd5b80630d9019e1146100dc578063307f29621461012c5780633bbed4a01461014d575f80fd5b366100d857005b5f80fd5b3480156100e7575f80fd5b5060025473ffffffffffffffffffffffffffffffffffffffff165b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b348015610137575f80fd5b5061014b610146366004610c86565b6102f7565b005b348015610158575f80fd5b5061014b610167366004610cc3565b61047a565b348015610177575f80fd5b506101806105de565b604051908152602001610123565b348015610199575f80fd5b506101d66040518060400160405280600581526020017f312e362e3000000000000000000000000000000000000000000000000000000081525081565b6040516101239190610cde565b3480156101ee575f80fd5b506002546101029073ffffffffffffffffffffffffffffffffffffffff1681565b34801561021a575f80fd5b506002546102409074010000000000000000000000000000000000000000900460ff1681565b6040516101239190610d97565b348015610258575f80fd5b5061018060015481565b34801561026d575f80fd5b506101805f5481565b348015610281575f80fd5b5061014b610290366004610dab565b610918565b3480156102a0575f80fd5b5061014b6102af366004610dc2565b610a3b565b3480156102bf575f80fd5b5060025474010000000000000000000000000000000000000000900460ff16610240565b3480156102ee575f80fd5b50600154610180565b73420000000000000000000000000000000000001873ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610354573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906103789190610dfd565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146103dc576040517f7cd7e09f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600280547401000000000000000000000000000000000000000080820460ff1692849290917fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff9091169083600181111561043857610438610d31565b02179055507ff2ec44eb1c3b3acd547b76333eb2c4b27eee311860c57a9fdb04c95f62398fc8818360405161046e929190610e18565b60405180910390a15050565b73420000000000000000000000000000000000001873ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156104d7573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104fb9190610dfd565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461055f576040517f7cd7e09f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff000000000000000000000000000000000000000083168117909355604080519190921680825260208201939093527f62e69886a5df0ba8ffcacbfc1388754e7abd9bde24b036354c561f1acd4e4593910161046e565b5f60015447101561069c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604a60248201527f4665655661756c743a207769746864726177616c20616d6f756e74206d75737460448201527f2062652067726561746572207468616e206d696e696d756d207769746864726160648201527f77616c20616d6f756e7400000000000000000000000000000000000000000000608482015260a4015b60405180910390fd5b479050805f808282546106af9190610e33565b90915550506002546040805183815273ffffffffffffffffffffffffffffffffffffffff90921660208301523382820152517fc8a211cc64b6ed1b50595a9fcb1932b6d1e5a6e8ef15b60e5b1f988ea9086bba9181900360600190a16002546040517f38e04cbeb8c10f8f568618aa75be0f10b6729b8b4237743b4de20cbcde2839ee9161077491849173ffffffffffffffffffffffffffffffffffffffff811691339174010000000000000000000000000000000000000000900460ff1690610e6b565b60405180910390a1600160025474010000000000000000000000000000000000000000900460ff1660018111156107ad576107ad610d31565b0361086a576002545f906107d79073ffffffffffffffffffffffffffffffffffffffff1683610c4f565b905080610866576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f4665655661756c743a206661696c656420746f2073656e642045544820746f2060448201527f4c322066656520726563697069656e74000000000000000000000000000000006064820152608401610693565b5090565b6002546040517fc2b3e5ac00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff909116600482015262061a806024820152606060448201525f60648201527342000000000000000000000000000000000000169063c2b3e5ac9083906084015f604051808303818588803b1580156108fe575f80fd5b505af1158015610910573d5f803e3d5ffd5b505050505090565b73420000000000000000000000000000000000001873ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610975573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109999190610dfd565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146109fd576040517f7cd7e09f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600180549082905560408051828152602081018490527f895a067c78583e800418fabf3da26a9496aab2ff3429cebdf7fefa642b2e4203910161046e565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000810460ff16159067ffffffffffffffff165f81158015610a855750825b90505f8267ffffffffffffffff166001148015610aa15750303b155b905081158015610aaf575080155b15610ae6576040517ff92ee8a900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b84547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001660011785558315610b475784547fffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffff16680100000000000000001785555b6002805473ffffffffffffffffffffffffffffffffffffffff8a167fffffffffffffffffffffffff000000000000000000000000000000000000000082168117835560018a81558993927fffffffffffffffffffffff000000000000000000000000000000000000000000169091179074010000000000000000000000000000000000000000908490811115610bdf57610bdf610d31565b02179055508315610c455784547fffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffff168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b5050505050505050565b5f610c5b835a84610c62565b9392505050565b5f805f805f858888f1949350505050565b803560028110610c81575f80fd5b919050565b5f60208284031215610c96575f80fd5b610c5b82610c73565b73ffffffffffffffffffffffffffffffffffffffff81168114610cc0575f80fd5b50565b5f60208284031215610cd3575f80fd5b8135610c5b81610c9f565b602081525f82518060208401528060208501604085015e5f6040828501015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011684010191505092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b60028110610d93577f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b9052565b60208101610da58284610d5e565b92915050565b5f60208284031215610dbb575f80fd5b5035919050565b5f805f60608486031215610dd4575f80fd5b8335610ddf81610c9f565b925060208401359150610df460408501610c73565b90509250925092565b5f60208284031215610e0d575f80fd5b8151610c5b81610c9f565b60408101610e268285610d5e565b610c5b6020830184610d5e565b80820180821115610da5577f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b84815273ffffffffffffffffffffffffffffffffffffffff84811660208301528316604082015260808101610ea36060830184610d5e565b9594505050505056fea164736f6c6343000819000a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000beb5fc579115071764c7423a4f12edde41f106ed00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000001e4e9e05c420000000000000000000000004200000000000000000000000000000000000018000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000249f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000001049623609d000000000000000000000000420000000000000000000000000000000000001a0000000000000000000000006b692240ef7a6b18aaf63a56a94d423c1b5cec0a00000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000064b49dc741000000000000000000000000420000000000000000000000000000000000002b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"; MultisigTask multisigTask = new RevenueShareV100UpgradePath(); address rootSafe = address(0x5a0Aae59D09fccBdDb6C6CcEB07B7279367C3d2A); // L1PAO address securityCouncilChildMultisig = address(0xc2819DC788505Aac350142A7A707BF9D03E3Bd03); @@ -886,10 +886,10 @@ contract RegressionTest is Test { string[] memory expectedDataToSign = new string[](2); // Foundation expectedDataToSign[0] = - "0x1901a4a9c312badf3fcaa05eafe5dc9bee8bd9316c78ee8b0bebe3115bb21b7326720313ee9ae43e92fc9227c785e277f13afcaff8a8817806bacef82d6fa81a603a"; + "0x1901a4a9c312badf3fcaa05eafe5dc9bee8bd9316c78ee8b0bebe3115bb21b732672c44bb44f324d271b9734a58c7a830677045c1de195cb8f48299584539b8bbdbd"; // Security Council expectedDataToSign[1] = - "0x1901df53d510b56e539b90b369ef08fce3631020fbf921e3136ea5f8747c20bce9676a65974950a2d2363dd3764f52e7a51528b9159c9bcb10cd57ec23480e3f9ec8"; + "0x1901df53d510b56e539b90b369ef08fce3631020fbf921e3136ea5f8747c20bce967c5c905636dd8d633390ce8159bb909cb8831f92949870769a8f0f0971cc03097"; _assertDataToSignNestedMultisig(multisigTask, actions, expectedDataToSign, MULTICALL3_ADDRESS, rootSafe); } @@ -899,7 +899,7 @@ contract RegressionTest is Test { function testRegressionCallDataMatches_DeployFeesDepositor() public { string memory taskConfigFilePath = "test/tasks/example/eth/016-deploy-fees-depositor/config.toml"; string memory expectedCallData = - "0x174dea7100000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000010400000000000000000000000000000000000000000000000000000000000001e8000000000000000000000000013b0d85ccb8bf860b6b79af3029fca081ae9bef20000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000f2466cfa0570000000000000000000000000000000000000000000000000000000000000000666565732d6465706f7369746f7200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000e9660a060405234801561001057600080fd5b50600160805261001e610023565b6100e3565b600054610100900460ff161561008f5760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b60005460ff90811610156100e1576000805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b608051610d9161010560003960008181610274015261048e0152610d916000f3fe6080604052600436106100cb5760003560e01c8063645006ca11610074578063a2a956171161004e578063a2a9561714610425578063dad544e014610445578063f68016b71461045a57600080fd5b8063645006ca1461038657806366125607146103c85780637b11936e146103e857600080fd5b80633e47158c116100a55780633e47158c146102fb57806352d84c621461031057806354fd4d501461033057600080fd5b80630de2db4d1461024057806338d38c97146102605780633cb747bf146102a357600080fd5b3661023b576040805134815247602082018190529133917f363f315f930a17d1266b86a20d6dd34b1cfbc5a9db9f13a65d06a689c3a2af8a910160405180910390a26001546bffffffffffffffffffffffff16811061023957600154600080546002546040517f3dbb202b00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff6c0100000000000000000000000090950485166004820181905260606024830152606482019490945263ffffffff90911660448201529192620100009091041690633dbb202b9084906084016000604051808303818588803b1580156101ce57600080fd5b505af11580156101e2573d6000803e3d6000fd5b50505050508073ffffffffffffffffffffffffffffffffffffffff167f2acaf92365a0b69fb3570802396f62d51aabccd684036b72c3ce78699425e7ee8360405161022f91815260200190565b60405180910390a2505b005b600080fd5b34801561024c57600080fd5b5061023961025b366004610bde565b61048c565b34801561026c57600080fd5b5060405160ff7f00000000000000000000000000000000000000000000000000000000000000001681526020015b60405180910390f35b3480156102af57600080fd5b506000546102d69062010000900473ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200161029a565b34801561030757600080fd5b506102d661069e565b34801561031c57600080fd5b5061023961032b366004610c36565b6108a9565b34801561033c57600080fd5b506103796040518060400160405280600581526020017f312e302e3000000000000000000000000000000000000000000000000000000081525081565b60405161029a9190610c58565b34801561039257600080fd5b506001546103ab906bffffffffffffffffffffffff1681565b6040516bffffffffffffffffffffffff909116815260200161029a565b3480156103d457600080fd5b506102396103e3366004610ccb565b610928565b3480156103f457600080fd5b506001546102d6906c01000000000000000000000000900473ffffffffffffffffffffffffffffffffffffffff1681565b34801561043157600080fd5b50610239610440366004610ce8565b6109af565b34801561045157600080fd5b506102d6610a2e565b34801561046657600080fd5b506002546104779063ffffffff1681565b60405163ffffffff909116815260200161029a565b7f0000000000000000000000000000000000000000000000000000000000000000600054610100900460ff161580156104cc575060005460ff8083169116105b61055c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a6564000000000000000000000000000000000000606482015260840160405180910390fd5b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00001660ff831617610100179055610595610aab565b6000805473ffffffffffffffffffffffffffffffffffffffff8681166c01000000000000000000000000026bffffffffffffffffffffffff8916176001556002805463ffffffff87167fffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000009091161790557fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff9086166201000002167fffffffffffffffffffff000000000000000000000000000000000000000000ff9091161790556040517f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989061068f90839060ff91909116815260200190565b60405180910390a15050505050565b6000806106c97fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b905073ffffffffffffffffffffffffffffffffffffffff8116156106ec57919050565b6040518060400160405280601a81526020017f4f564d5f4c3143726f7373446f6d61696e4d657373656e67657200000000000081525051600261072f9190610d03565b604080513060208201526000918101919091527f4f564d5f4c3143726f7373446f6d61696e4d657373656e676572000000000000919091179061078a906060015b604051602081830303815290604052805190602001205490565b146107c1576040517f54e433cd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080513060208201526001918101919091526000906107e390606001610770565b905073ffffffffffffffffffffffffffffffffffffffff811615610877578073ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561084c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108709190610d67565b9250505090565b6040517f332144db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6108b1610b2e565b6002805463ffffffff8381167fffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000083168117909355604080519190921680825260208201939093527f84858bb3fb3ecf87e268ebef250ef9ad9cd53ef7973ef7a0ec9d89470bb00a8091015b60405180910390a15050565b610930610b2e565b6001805473ffffffffffffffffffffffffffffffffffffffff8381166c010000000000000000000000008181026bffffffffffffffffffffffff85161790945560408051949093049091168084526020840191909152917f158f04d12e0403fdd63fbced694e8f70d3b87d04d8e2dfad526f5fcf6e49bbcf910161091c565b6109b7610b2e565b600180546bffffffffffffffffffffffff8381167fffffffffffffffffffffffffffffffffffffffff00000000000000000000000083168117909355604080519190921680825260208201939093527f132832be4270c0d1573ca543c41517dd443fe9daf5f21a9c74940e6db282e229910161091c565b6000610a3861069e565b73ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610a82573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610aa69190610d67565b905090565b33610ab461069e565b73ffffffffffffffffffffffffffffffffffffffff1614158015610af5575033610adc610a2e565b73ffffffffffffffffffffffffffffffffffffffff1614155b15610b2c576040517fc4050a2600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b33610b37610a2e565b73ffffffffffffffffffffffffffffffffffffffff1614610b2c576040517f7f12c64b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80356bffffffffffffffffffffffff81168114610ba057600080fd5b919050565b73ffffffffffffffffffffffffffffffffffffffff81168114610bc757600080fd5b50565b803563ffffffff81168114610ba057600080fd5b60008060008060808587031215610bf457600080fd5b610bfd85610b84565b93506020850135610c0d81610ba5565b92506040850135610c1d81610ba5565b9150610c2b60608601610bca565b905092959194509250565b600060208284031215610c4857600080fd5b610c5182610bca565b9392505050565b600060208083528351808285015260005b81811015610c8557858101830151858201604001528201610c69565b81811115610c97576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b600060208284031215610cdd57600080fd5b8135610c5181610ba5565b600060208284031215610cfa57600080fd5b610c5182610b84565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615610d62577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b500290565b600060208284031215610d7957600080fd5b8151610c5181610ba556fea164736f6c634300080f000a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000013b0d85ccb8bf860b6b79af3029fca081ae9bef20000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000d8466cfa0570000000000000000000000000000000000000000000000000000000000000000666565732d6465706f7369746f7200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000ce760806040523480156200001157600080fd5b5060405162000cc738038062000cc783398181016040528101906200003791906200016f565b62000048816200004f60201b60201c565b50620001df565b600062000061620000ce60201b60201c565b905060007fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d610360001b90508281557f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f8284604051620000c1929190620001b2565b60405180910390a1505050565b60008060007fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d610360001b905080549150819250505090565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600062000137826200010a565b9050919050565b62000149816200012a565b81146200015557600080fd5b50565b60008151905062000169816200013e565b92915050565b60006020828403121562000188576200018762000105565b5b6000620001988482850162000158565b91505092915050565b620001ac816200012a565b82525050565b6000604082019050620001c96000830185620001a1565b620001d86020830184620001a1565b9392505050565b610ad880620001ef6000396000f3fe60806040526004361061004e5760003560e01c80633659cfe6146100675780634f1ef286146100905780635c60da1b146100c05780638f283970146100eb578063f851a440146101145761005d565b3661005d5761005b61013f565b005b61006561013f565b005b34801561007357600080fd5b5061008e60048036038101906100899190610715565b6101dc565b005b6100aa60048036038101906100a591906107a7565b610268565b6040516100b791906108a0565b60405180910390f35b3480156100cc57600080fd5b506100d56103ae565b6040516100e291906108d1565b60405180910390f35b3480156100f757600080fd5b50610112600480360381019061010d9190610715565b61043d565b005b34801561012057600080fd5b506101296104c9565b60405161013691906108d1565b60405180910390f35b6000610149610558565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036101ba576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016101b19061096f565b60405180910390fd5b3660008037600080366000845af43d6000803e806101d7573d6000fd5b3d6000f35b6101e461058f565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806102495750600073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b1561025c57610257816105c6565b610265565b61026461013f565b5b50565b606061027261058f565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806102d75750600073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b1561039e576102e5846105c6565b6000808573ffffffffffffffffffffffffffffffffffffffff16858560405161030f9291906109ce565b600060405180830381855af49150503d806000811461034a576040519150601f19603f3d011682016040523d82523d6000602084013e61034f565b606091505b509150915081610394576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161038b90610a59565b60405180910390fd5b80925050506103a7565b6103a661013f565b5b9392505050565b60006103b861058f565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061041d5750600073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b156104315761042a610558565b905061043a565b61043961013f565b5b90565b61044561058f565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806104aa5750600073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b156104bd576104b881610638565b6104c6565b6104c561013f565b5b50565b60006104d361058f565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806105385750600073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b1561054c5761054561058f565b9050610555565b61055461013f565b5b90565b60008060007f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc60001b905080549150819250505090565b60008060007fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d610360001b905080549150819250505090565b60007f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc60001b90508181558173ffffffffffffffffffffffffffffffffffffffff167fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b60405160405180910390a25050565b600061064261058f565b905060007fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d610360001b90508281557f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f82846040516106a0929190610a79565b60405180910390a1505050565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006106e2826106b7565b9050919050565b6106f2816106d7565b81146106fd57600080fd5b50565b60008135905061070f816106e9565b92915050565b60006020828403121561072b5761072a6106ad565b5b600061073984828501610700565b91505092915050565b600080fd5b600080fd5b600080fd5b60008083601f84011261076757610766610742565b5b8235905067ffffffffffffffff81111561078457610783610747565b5b6020830191508360018202830111156107a05761079f61074c565b5b9250929050565b6000806000604084860312156107c0576107bf6106ad565b5b60006107ce86828701610700565b935050602084013567ffffffffffffffff8111156107ef576107ee6106b2565b5b6107fb86828701610751565b92509250509250925092565b600081519050919050565b600082825260208201905092915050565b60005b83811015610841578082015181840152602081019050610826565b83811115610850576000848401525b50505050565b6000601f19601f8301169050919050565b600061087282610807565b61087c8185610812565b935061088c818560208601610823565b61089581610856565b840191505092915050565b600060208201905081810360008301526108ba8184610867565b905092915050565b6108cb816106d7565b82525050565b60006020820190506108e660008301846108c2565b92915050565b600082825260208201905092915050565b7f50726f78793a20696d706c656d656e746174696f6e206e6f7420696e6974696160008201527f6c697a6564000000000000000000000000000000000000000000000000000000602082015250565b60006109596025836108ec565b9150610964826108fd565b604082019050919050565b600060208201905081810360008301526109888161094c565b9050919050565b600081905092915050565b82818337600083830152505050565b60006109b5838561098f565b93506109c283858461099a565b82840190509392505050565b60006109db8284866109a9565b91508190509392505050565b7f50726f78793a2064656c656761746563616c6c20746f206e657720696d706c6560008201527f6d656e746174696f6e20636f6e7472616374206661696c656400000000000000602082015250565b6000610a436039836108ec565b9150610a4e826109e7565b604082019050919050565b60006020820190508181036000830152610a7281610a36565b9050919050565b6000604082019050610a8e60008301856108c2565b610a9b60208301846108c2565b939250505056fea2646970667358221220154d9317746aa0e4cac83ccac5a296d517da380b7a9bb2889947cfba8d5a8bc164736f6c634300080f00330000000000000000000000005a0aae59d09fccbddb6c6cceb07b7279367c3d2a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000032ecd94bbfb350f8aafb70dfba1f4d7fcbc5065b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000001044f1ef28600000000000000000000000090a79d28ad7f6d472ad1cfe3bad65204ab2969a2000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000840de2db4d0000000000000000000000000000000000000000000000004563918244f400000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000beb5fc579115071764c7423a4f12edde41f106ed00000000000000000000000000000000000000000000000000000000000493e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"; + "0x174dea7100000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000010400000000000000000000000000000000000000000000000000000000000001e8000000000000000000000000013b0d85ccb8bf860b6b79af3029fca081ae9bef20000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000f2466cfa0570000000000000000000000000000000000000000000000000000000000000000666565732d6465706f7369746f7200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000e9660a060405234801561001057600080fd5b50600160805261001e610023565b6100e3565b600054610100900460ff161561008f5760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b60005460ff90811610156100e1576000805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b608051610d9161010560003960008181610274015261048e0152610d916000f3fe6080604052600436106100cb5760003560e01c8063645006ca11610074578063a2a956171161004e578063a2a9561714610425578063dad544e014610445578063f68016b71461045a57600080fd5b8063645006ca1461038657806366125607146103c85780637b11936e146103e857600080fd5b80633e47158c116100a55780633e47158c146102fb57806352d84c621461031057806354fd4d501461033057600080fd5b80630de2db4d1461024057806338d38c97146102605780633cb747bf146102a357600080fd5b3661023b576040805134815247602082018190529133917f363f315f930a17d1266b86a20d6dd34b1cfbc5a9db9f13a65d06a689c3a2af8a910160405180910390a26001546bffffffffffffffffffffffff16811061023957600154600080546002546040517f3dbb202b00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff6c0100000000000000000000000090950485166004820181905260606024830152606482019490945263ffffffff90911660448201529192620100009091041690633dbb202b9084906084016000604051808303818588803b1580156101ce57600080fd5b505af11580156101e2573d6000803e3d6000fd5b50505050508073ffffffffffffffffffffffffffffffffffffffff167f2acaf92365a0b69fb3570802396f62d51aabccd684036b72c3ce78699425e7ee8360405161022f91815260200190565b60405180910390a2505b005b600080fd5b34801561024c57600080fd5b5061023961025b366004610bde565b61048c565b34801561026c57600080fd5b5060405160ff7f00000000000000000000000000000000000000000000000000000000000000001681526020015b60405180910390f35b3480156102af57600080fd5b506000546102d69062010000900473ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200161029a565b34801561030757600080fd5b506102d661069e565b34801561031c57600080fd5b5061023961032b366004610c36565b6108a9565b34801561033c57600080fd5b506103796040518060400160405280600581526020017f312e302e3000000000000000000000000000000000000000000000000000000081525081565b60405161029a9190610c58565b34801561039257600080fd5b506001546103ab906bffffffffffffffffffffffff1681565b6040516bffffffffffffffffffffffff909116815260200161029a565b3480156103d457600080fd5b506102396103e3366004610ccb565b610928565b3480156103f457600080fd5b506001546102d6906c01000000000000000000000000900473ffffffffffffffffffffffffffffffffffffffff1681565b34801561043157600080fd5b50610239610440366004610ce8565b6109af565b34801561045157600080fd5b506102d6610a2e565b34801561046657600080fd5b506002546104779063ffffffff1681565b60405163ffffffff909116815260200161029a565b7f0000000000000000000000000000000000000000000000000000000000000000600054610100900460ff161580156104cc575060005460ff8083169116105b61055c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a6564000000000000000000000000000000000000606482015260840160405180910390fd5b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00001660ff831617610100179055610595610aab565b6000805473ffffffffffffffffffffffffffffffffffffffff8681166c01000000000000000000000000026bffffffffffffffffffffffff8916176001556002805463ffffffff87167fffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000009091161790557fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff9086166201000002167fffffffffffffffffffff000000000000000000000000000000000000000000ff9091161790556040517f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989061068f90839060ff91909116815260200190565b60405180910390a15050505050565b6000806106c97fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b905073ffffffffffffffffffffffffffffffffffffffff8116156106ec57919050565b6040518060400160405280601a81526020017f4f564d5f4c3143726f7373446f6d61696e4d657373656e67657200000000000081525051600261072f9190610d03565b604080513060208201526000918101919091527f4f564d5f4c3143726f7373446f6d61696e4d657373656e676572000000000000919091179061078a906060015b604051602081830303815290604052805190602001205490565b146107c1576040517f54e433cd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080513060208201526001918101919091526000906107e390606001610770565b905073ffffffffffffffffffffffffffffffffffffffff811615610877578073ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561084c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108709190610d67565b9250505090565b6040517f332144db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6108b1610b2e565b6002805463ffffffff8381167fffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000083168117909355604080519190921680825260208201939093527f84858bb3fb3ecf87e268ebef250ef9ad9cd53ef7973ef7a0ec9d89470bb00a8091015b60405180910390a15050565b610930610b2e565b6001805473ffffffffffffffffffffffffffffffffffffffff8381166c010000000000000000000000008181026bffffffffffffffffffffffff85161790945560408051949093049091168084526020840191909152917f158f04d12e0403fdd63fbced694e8f70d3b87d04d8e2dfad526f5fcf6e49bbcf910161091c565b6109b7610b2e565b600180546bffffffffffffffffffffffff8381167fffffffffffffffffffffffffffffffffffffffff00000000000000000000000083168117909355604080519190921680825260208201939093527f132832be4270c0d1573ca543c41517dd443fe9daf5f21a9c74940e6db282e229910161091c565b6000610a3861069e565b73ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610a82573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610aa69190610d67565b905090565b33610ab461069e565b73ffffffffffffffffffffffffffffffffffffffff1614158015610af5575033610adc610a2e565b73ffffffffffffffffffffffffffffffffffffffff1614155b15610b2c576040517fc4050a2600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b33610b37610a2e565b73ffffffffffffffffffffffffffffffffffffffff1614610b2c576040517f7f12c64b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80356bffffffffffffffffffffffff81168114610ba057600080fd5b919050565b73ffffffffffffffffffffffffffffffffffffffff81168114610bc757600080fd5b50565b803563ffffffff81168114610ba057600080fd5b60008060008060808587031215610bf457600080fd5b610bfd85610b84565b93506020850135610c0d81610ba5565b92506040850135610c1d81610ba5565b9150610c2b60608601610bca565b905092959194509250565b600060208284031215610c4857600080fd5b610c5182610bca565b9392505050565b600060208083528351808285015260005b81811015610c8557858101830151858201604001528201610c69565b81811115610c97576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b600060208284031215610cdd57600080fd5b8135610c5181610ba5565b600060208284031215610cfa57600080fd5b610c5182610b84565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615610d62577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b500290565b600060208284031215610d7957600080fd5b8151610c5181610ba556fea164736f6c634300080f000a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000013b0d85ccb8bf860b6b79af3029fca081ae9bef20000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000d8466cfa0570000000000000000000000000000000000000000000000000000000000000000666565732d6465706f7369746f7200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000ce760806040523480156200001157600080fd5b5060405162000cc738038062000cc783398181016040528101906200003791906200016f565b62000048816200004f60201b60201c565b50620001df565b600062000061620000ce60201b60201c565b905060007fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d610360001b90508281557f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f8284604051620000c1929190620001b2565b60405180910390a1505050565b60008060007fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d610360001b905080549150819250505090565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600062000137826200010a565b9050919050565b62000149816200012a565b81146200015557600080fd5b50565b60008151905062000169816200013e565b92915050565b60006020828403121562000188576200018762000105565b5b6000620001988482850162000158565b91505092915050565b620001ac816200012a565b82525050565b6000604082019050620001c96000830185620001a1565b620001d86020830184620001a1565b9392505050565b610ad880620001ef6000396000f3fe60806040526004361061004e5760003560e01c80633659cfe6146100675780634f1ef286146100905780635c60da1b146100c05780638f283970146100eb578063f851a440146101145761005d565b3661005d5761005b61013f565b005b61006561013f565b005b34801561007357600080fd5b5061008e60048036038101906100899190610715565b6101dc565b005b6100aa60048036038101906100a591906107a7565b610268565b6040516100b791906108a0565b60405180910390f35b3480156100cc57600080fd5b506100d56103ae565b6040516100e291906108d1565b60405180910390f35b3480156100f757600080fd5b50610112600480360381019061010d9190610715565b61043d565b005b34801561012057600080fd5b506101296104c9565b60405161013691906108d1565b60405180910390f35b6000610149610558565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036101ba576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016101b19061096f565b60405180910390fd5b3660008037600080366000845af43d6000803e806101d7573d6000fd5b3d6000f35b6101e461058f565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806102495750600073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b1561025c57610257816105c6565b610265565b61026461013f565b5b50565b606061027261058f565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806102d75750600073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b1561039e576102e5846105c6565b6000808573ffffffffffffffffffffffffffffffffffffffff16858560405161030f9291906109ce565b600060405180830381855af49150503d806000811461034a576040519150601f19603f3d011682016040523d82523d6000602084013e61034f565b606091505b509150915081610394576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161038b90610a59565b60405180910390fd5b80925050506103a7565b6103a661013f565b5b9392505050565b60006103b861058f565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061041d5750600073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b156104315761042a610558565b905061043a565b61043961013f565b5b90565b61044561058f565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806104aa5750600073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b156104bd576104b881610638565b6104c6565b6104c561013f565b5b50565b60006104d361058f565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806105385750600073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b1561054c5761054561058f565b9050610555565b61055461013f565b5b90565b60008060007f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc60001b905080549150819250505090565b60008060007fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d610360001b905080549150819250505090565b60007f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc60001b90508181558173ffffffffffffffffffffffffffffffffffffffff167fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b60405160405180910390a25050565b600061064261058f565b905060007fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d610360001b90508281557f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f82846040516106a0929190610a79565b60405180910390a1505050565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006106e2826106b7565b9050919050565b6106f2816106d7565b81146106fd57600080fd5b50565b60008135905061070f816106e9565b92915050565b60006020828403121561072b5761072a6106ad565b5b600061073984828501610700565b91505092915050565b600080fd5b600080fd5b600080fd5b60008083601f84011261076757610766610742565b5b8235905067ffffffffffffffff81111561078457610783610747565b5b6020830191508360018202830111156107a05761079f61074c565b5b9250929050565b6000806000604084860312156107c0576107bf6106ad565b5b60006107ce86828701610700565b935050602084013567ffffffffffffffff8111156107ef576107ee6106b2565b5b6107fb86828701610751565b92509250509250925092565b600081519050919050565b600082825260208201905092915050565b60005b83811015610841578082015181840152602081019050610826565b83811115610850576000848401525b50505050565b6000601f19601f8301169050919050565b600061087282610807565b61087c8185610812565b935061088c818560208601610823565b61089581610856565b840191505092915050565b600060208201905081810360008301526108ba8184610867565b905092915050565b6108cb816106d7565b82525050565b60006020820190506108e660008301846108c2565b92915050565b600082825260208201905092915050565b7f50726f78793a20696d706c656d656e746174696f6e206e6f7420696e6974696160008201527f6c697a6564000000000000000000000000000000000000000000000000000000602082015250565b60006109596025836108ec565b9150610964826108fd565b604082019050919050565b600060208201905081810360008301526109888161094c565b9050919050565b600081905092915050565b82818337600083830152505050565b60006109b5838561098f565b93506109c283858461099a565b82840190509392505050565b60006109db8284866109a9565b91508190509392505050565b7f50726f78793a2064656c656761746563616c6c20746f206e657720696d706c6560008201527f6d656e746174696f6e20636f6e7472616374206661696c656400000000000000602082015250565b6000610a436039836108ec565b9150610a4e826109e7565b604082019050919050565b60006020820190508181036000830152610a7281610a36565b9050919050565b6000604082019050610a8e60008301856108c2565b610a9b60208301846108c2565b939250505056fea2646970667358221220e170e6bf8ee3cc199be5ea3ca30084b98725d89b560e407f600f4a174236633364736f6c634300080f00330000000000000000000000005a0aae59d09fccbddb6c6cceb07b7279367c3d2a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000fa7da4552791535ae416525d695a85743f40624300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000001044f1ef28600000000000000000000000090a79d28ad7f6d472ad1cfe3bad65204ab2969a2000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000840de2db4d0000000000000000000000000000000000000000000000004563918244f400000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000beb5fc579115071764c7423a4f12edde41f106ed00000000000000000000000000000000000000000000000000000000000493e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"; MultisigTask multisigTask = new DeployFeesDepositor(); address rootSafe = address(0x5a0Aae59D09fccBdDb6C6CcEB07B7279367C3d2A); // L1PAO address securityCouncilChildMultisig = address(0xc2819DC788505Aac350142A7A707BF9D03E3Bd03); @@ -912,10 +912,10 @@ contract RegressionTest is Test { string[] memory expectedDataToSign = new string[](2); // Foundation expectedDataToSign[0] = - "0x1901a4a9c312badf3fcaa05eafe5dc9bee8bd9316c78ee8b0bebe3115bb21b732672145a6a0f915fed1b5793937cb6d6cba1ec86fd6563b0315d14f55a409de52ab9"; + "0x1901a4a9c312badf3fcaa05eafe5dc9bee8bd9316c78ee8b0bebe3115bb21b7326728b096f6bceaab1716dfe8e85bae705192df4b5dae6e3b94d58bdf567edb6bfef"; // Security Council expectedDataToSign[1] = - "0x1901df53d510b56e539b90b369ef08fce3631020fbf921e3136ea5f8747c20bce9673ef6274f3fe58ee20ab2931fc049b8a5af8bd6319918f91e2c9951e8630f9247"; + "0x1901df53d510b56e539b90b369ef08fce3631020fbf921e3136ea5f8747c20bce967e5d2666095a6ced42244873f800e6714389265e35cf0e8e9e5236e720601e2b6"; _assertDataToSignNestedMultisig(multisigTask, actions, expectedDataToSign, MULTICALL3_ADDRESS, rootSafe); } @@ -925,7 +925,7 @@ contract RegressionTest is Test { function testRegressionCallDataMatches_RevenueShareV100UpgradePathOptOut() public { string memory taskConfigFilePath = "test/tasks/example/eth/019-revenueshare-upgrade-opt-out/config.toml"; string memory expectedCallData = - "0x174dea710000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000174000000000000000000000000000000000000000000000000000000000000019a00000000000000000000000000000000000000000000000000000000000002b600000000000000000000000000000000000000000000000000000000000002d400000000000000000000000000000000000000000000000000000000000003f40000000000000000000000000000000000000000000000000000000000000412000000000000000000000000000000000000000000000000000000000000052e000000000000000000000000000000000000000000000000000000000000054c00000000000000000000000000000000000000000000000000000000000006680000000000000000000000000beb5fc579115071764c7423a4f12edde41f106ed0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000001544e9e05c4200000000000000000000000013b0d85ccb8bf860b6b79af3029fca081ae9bef20000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000012d838000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000146466cfa0570000000000000000000000000000000000000000000000000000000000000000d7c04619bfc311a92d20723f9d08baaba18c3c8c7dcd85736bf66b85f59c37f6000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000013d26080604052348015600e575f80fd5b5060156019565b60d4565b5f54610100900460ff161560835760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b5f5460ff908116101560d2575f805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6112f1806100e15f395ff3fe608060405260043610610096575f3560e01c80637dfbd04911610066578063b87ea8d41161004c578063b87ea8d414610313578063c4d66de814610327578063d61a398b14610346575f80fd5b80637dfbd049146102dd5780637fc81bb7146102f4575f80fd5b80630a7617b3146101dd5780630c0544a3146101fe578063394d27311461026057806354fd4d5014610288575f80fd5b366101d9577fe3007e9730850b5618eacb0537bef0cf0f1600267ae8549e472449d77b731e455c6100f3576040517f17617f6100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b337342000000000000000000000000000000000000111480159061012b57503373420000000000000000000000000000000000001914155b801561014b57503373420000000000000000000000000000000000001a14155b801561016b57503373420000000000000000000000000000000000001b14155b156101a2576040517f9dcde10900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60405134815233907f2ccfc58c2cef4ee590b5f16be0548cc54afc12e1c66a67b362b7d640fd16bb2d9060200160405180910390a2005b5f80fd5b3480156101e8575f80fd5b506101fc6101f7366004610f4b565b61039c565b005b348015610209575f80fd5b5060015461023a9070010000000000000000000000000000000090046fffffffffffffffffffffffffffffffff1681565b6040516fffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b34801561026b575f80fd5b5060015461023a906fffffffffffffffffffffffffffffffff1681565b348015610293575f80fd5b506102d06040518060400160405280600581526020017f312e302e3000000000000000000000000000000000000000000000000000000081525081565b6040516102579190610f66565b3480156102e8575f80fd5b5061023a6301e1338081565b3480156102ff575f80fd5b506101fc61030e366004610fb9565b61055e565b34801561031e575f80fd5b506101fc610706565b348015610332575f80fd5b506101fc610341366004610f4b565b610aea565b348015610351575f80fd5b505f546103779062010000900473ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610257565b73420000000000000000000000000000000000001873ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156103f9573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061041d9190610fe8565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610481576040517f38bac74200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff81166104ce576040517f99c6ec0800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f805473ffffffffffffffffffffffffffffffffffffffff838116620100008181027fffffffffffffffffffff0000000000000000000000000000000000000000ffff85161790945560408051949093049091168084526020840191909152917f16417cc372deec0caee5f52e2ad77a5f07b4591fd56b4ff31b6e20f817d4daeb91015b60405180910390a15050565b73420000000000000000000000000000000000001873ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156105bb573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906105df9190610fe8565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610643576040517f38bac74200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6301e133806fffffffffffffffffffffffffffffffff82161115610693576040517f30b9f35e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600180546fffffffffffffffffffffffffffffffff8381167001000000000000000000000000000000008181028385161790945560408051949093049091168084526020840191909152917f4492086b630ed3846eec0979dd87a71c814ceb1c6dab80ab81e3450b21e4de289101610552565b60015461073b906fffffffffffffffffffffffffffffffff700100000000000000000000000000000000820481169116611030565b6fffffffffffffffffffffffffffffffff16421015610786576040517f1e4a9f3a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600180547fffffffffffffffffffffffffffffffff0000000000000000000000000000000016426fffffffffffffffffffffffffffffffff161781556107cb90610ce0565b5f6107e9734200000000000000000000000000000000000011610d06565b90505f610809734200000000000000000000000000000000000019610d06565b90505f61082973420000000000000000000000000000000000001a610d06565b90505f61084973420000000000000000000000000000000000001b610d06565b90506108545f610ce0565b5f82826108618688611060565b61086b9190611060565b6108759190611060565b9050805f036108b0576040517fc8972e5200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f80546040517f54e7f42d000000000000000000000000000000000000000000000000000000008152600481018890526024810187905260448101859052606481018690526201000090910473ffffffffffffffffffffffffffffffffffffffff16906354e7f42d906084015f60405180830381865afa158015610936573d5f803e3d5ffd5b505050506040513d5f823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016820160405261097b9190810190611118565b905080515f036109b7576040517f763970d600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f805b8251811015610a6e575f8382815181106109d6576109d66111e7565b60200260200101515f015190505f8483815181106109f6576109f66111e7565b6020026020010151602001519050805f03610a12575050610a66565b5f610a1d8383610f03565b905080610a56576040517fd68d1b1800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610a608286611060565b94505050505b6001016109ba565b50828114610aa8576040517f9c01eac000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f73f9a13241a1848ec157967f3a85601709353e616f1f2605d818c0f2d21774df8284604051610ad9929190611214565b60405180910390a150505050505050565b5f54610100900460ff1615808015610b0857505f54600160ff909116105b80610b215750303b158015610b2157505f5460ff166001145b610bb1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a6564000000000000000000000000000000000000606482015260840160405180910390fd5b5f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558015610c0d575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b5f80547fffffffffffffffffffff0000000000000000000000000000000000000000ffff166201000073ffffffffffffffffffffffffffffffffffffffff851602179055600180546fffffffffffffffffffffffffffffffff1672015180000000000000000000000000000000001790558015610cdc575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb384740249890602001610552565b5050565b807fe3007e9730850b5618eacb0537bef0cf0f1600267ae8549e472449d77b731e455d50565b5f60018273ffffffffffffffffffffffffffffffffffffffff166382356d8a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610d52573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610d7691906112af565b6001811115610d8757610d87611282565b14610dbe576040517fb4726cbe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b3073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff166366d003ac6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610e1e573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e429190610fe8565b73ffffffffffffffffffffffffffffffffffffffff1614610e8f576040517fc3380cef00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8173ffffffffffffffffffffffffffffffffffffffff16633ccfd60b6040518163ffffffff1660e01b81526004016020604051808303815f875af1158015610ed9573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610efd91906112cd565b92915050565b5f610f0f835a84610f16565b9392505050565b5f805f805f858888f1949350505050565b73ffffffffffffffffffffffffffffffffffffffff81168114610f48575f80fd5b50565b5f60208284031215610f5b575f80fd5b8135610f0f81610f27565b602081525f82518060208401528060208501604085015e5f6040828501015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011684010191505092915050565b5f60208284031215610fc9575f80fd5b81356fffffffffffffffffffffffffffffffff81168114610f0f575f80fd5b5f60208284031215610ff8575f80fd5b8151610f0f81610f27565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b6fffffffffffffffffffffffffffffffff81811683821601908082111561105957611059611003565b5092915050565b80820180821115610efd57610efd611003565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b6040805190810167ffffffffffffffff811182821017156110c3576110c3611073565b60405290565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff8111828210171561111057611110611073565b604052919050565b5f6020808385031215611129575f80fd5b825167ffffffffffffffff80821115611140575f80fd5b818501915085601f830112611153575f80fd5b81518181111561116557611165611073565b611173848260051b016110c9565b818152848101925060069190911b830184019087821115611192575f80fd5b928401925b818410156111dc57604084890312156111ae575f80fd5b6111b66110a0565b84516111c181610f27565b81528486015186820152835260409093019291840191611197565b979650505050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b604080825283518282018190525f91906020906060850190828801855b8281101561126c578151805173ffffffffffffffffffffffffffffffffffffffff168552850151858501529285019290840190600101611231565b5050508093505050508260208301529392505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b5f602082840312156112bf575f80fd5b815160028110610f0f575f80fd5b5f602082840312156112dd575f80fd5b505191905056fea164736f6c6343000819000a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000beb5fc579115071764c7423a4f12edde41f106ed00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000001a4e9e05c420000000000000000000000004200000000000000000000000000000000000018000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000249f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000c49623609d000000000000000000000000420000000000000000000000000000000000002b0000000000000000000000006b0d0b5d65c13ed9ec80617772aee4d6c594a66e00000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000024c4d66de80000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000beb5fc579115071764c7423a4f12edde41f106ed0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000001104e9e05c4200000000000000000000000013b0d85ccb8bf860b6b79af3029fca081ae9bef2000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000de2b0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000102466cfa0570000000000000000000000000000000000000000000000000000000000000000783aa8b3e401c8404e3eff9401ba29702719ddc0c0f69ec9ac77188bacea107300000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000f9c60e060405234801561001057600080fd5b50604051610f3c380380610f3c83398101604081905261002f91610079565b6001600160a01b03831660a0526080829052828282806001811115610056576100566100cc565b60c081600181111561006a5761006a6100cc565b815250505050505050506100e2565b60008060006060848603121561008e57600080fd5b83516001600160a01b03811681146100a557600080fd5b602085015160408601519194509250600281106100c157600080fd5b809150509250925092565b634e487b7160e01b600052602160045260246000fd5b60805160a05160c051610e176101256000396000818161028401526109e101526000818160e901526109710152600081816102b80152610a350152610e176000f3fe6080604052600436106100cb5760003560e01c806382356d8a1161007457806385b5b14d1161004e57806385b5b14d14610252578063d0e12f9014610272578063d3e5792b146102a657600080fd5b806382356d8a146102055780638312f1491461022757806384411d651461023c57600080fd5b80633ccfd60b116100a55780633ccfd60b1461017757806354fd4d501461019a57806366d003ac146101f057600080fd5b80630d9019e1146100d7578063307f2962146101355780633bbed4a01461015757600080fd5b366100d257005b600080fd5b3480156100e357600080fd5b5061010b7f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b34801561014157600080fd5b50610155610150366004610be5565b6102da565b005b34801561016357600080fd5b50610155610172366004610c2b565b6104a2565b34801561018357600080fd5b5061018c610622565b60405190815260200161012c565b3480156101a657600080fd5b506101e36040518060400160405280600581526020017f312e312e3000000000000000000000000000000000000000000000000000000081525081565b60405161012c9190610c48565b3480156101fc57600080fd5b5061010b61092a565b34801561021157600080fd5b5061021a610993565b60405161012c9190610d25565b34801561023357600080fd5b5061018c610a03565b34801561024857600080fd5b5061018c60005481565b34801561025e57600080fd5b5061015561026d366004610d39565b610a57565b34801561027e57600080fd5b5061021a7f000000000000000000000000000000000000000000000000000000000000000081565b3480156102b257600080fd5b5061018c7f000000000000000000000000000000000000000000000000000000000000000081565b73420000000000000000000000000000000000001873ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610339573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061035d9190610d52565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146103c1576040517f7cd7e09f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600280547401000000000000000000000000000000000000000080820460ff1692849290917fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff9091169083600181111561041d5761041d610cbb565b0217905550600280547fffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffff16770100000000000000000000000000000000000000000000001790556040517ff2ec44eb1c3b3acd547b76333eb2c4b27eee311860c57a9fdb04c95f62398fc8906104969083908590610d6f565b60405180910390a15050565b73420000000000000000000000000000000000001873ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610501573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105259190610d52565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610589576040517f7cd7e09f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600280547fffffffffffffffffffff00ff0000000000000000000000000000000000000000811673ffffffffffffffffffffffffffffffffffffffff84811691821775010000000000000000000000000000000000000000001790935560408051939092168084526020840191909152917f62e69886a5df0ba8ffcacbfc1388754e7abd9bde24b036354c561f1acd4e45939101610496565b600061062c610a03565b4710156106e6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604a60248201527f4665655661756c743a207769746864726177616c20616d6f756e74206d75737460448201527f2062652067726561746572207468616e206d696e696d756d207769746864726160648201527f77616c20616d6f756e7400000000000000000000000000000000000000000000608482015260a4015b60405180910390fd5b479050806000808282546106fa9190610d8a565b909155507fc8a211cc64b6ed1b50595a9fcb1932b6d1e5a6e8ef15b60e5b1f988ea9086bba90508161072a61092a565b6040805192835273ffffffffffffffffffffffffffffffffffffffff9091166020830152339082015260600160405180910390a17f38e04cbeb8c10f8f568618aa75be0f10b6729b8b4237743b4de20cbcde2839ee8161078861092a565b33610791610993565b6040516107a19493929190610dc9565b60405180910390a160016107b3610993565b60018111156107c4576107c4610cbb565b0361086f5760006107dc6107d661092a565b83610bbd565b90508061086b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f4665655661756c743a206661696c656420746f2073656e642045544820746f2060448201527f4c322066656520726563697069656e740000000000000000000000000000000060648201526084016106dd565b5090565b73420000000000000000000000000000000000001663c2b3e5ac8261089261092a565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b16815273ffffffffffffffffffffffffffffffffffffffff909116600482015262061a80602482015260606044820152600060648201526084016000604051808303818588803b15801561090e57600080fd5b505af1158015610922573d6000803e3d6000fd5b505050505090565b6002546000907501000000000000000000000000000000000000000000900460ff161561096e575060025473ffffffffffffffffffffffffffffffffffffffff1690565b507f000000000000000000000000000000000000000000000000000000000000000090565b60025460009077010000000000000000000000000000000000000000000000900460ff16156109de575060025474010000000000000000000000000000000000000000900460ff1690565b507f000000000000000000000000000000000000000000000000000000000000000090565b600254600090760100000000000000000000000000000000000000000000900460ff1615610a32575060015490565b507f000000000000000000000000000000000000000000000000000000000000000090565b73420000000000000000000000000000000000001873ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610ab6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ada9190610d52565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610b3e576040517f7cd7e09f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001805490829055600280547fffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffff1676010000000000000000000000000000000000000000000017905560408051828152602081018490527f895a067c78583e800418fabf3da26a9496aab2ff3429cebdf7fefa642b2e42039101610496565b6000610bca835a84610bd1565b9392505050565b6000806000806000858888f1949350505050565b600060208284031215610bf757600080fd5b813560028110610bca57600080fd5b73ffffffffffffffffffffffffffffffffffffffff81168114610c2857600080fd5b50565b600060208284031215610c3d57600080fd5b8135610bca81610c06565b600060208083528351808285015260005b81811015610c7557858101830151858201604001528201610c59565b81811115610c87576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b60028110610d21577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b9052565b60208101610d338284610cea565b92915050565b600060208284031215610d4b57600080fd5b5035919050565b600060208284031215610d6457600080fd5b8151610bca81610c06565b60408101610d7d8285610cea565b610bca6020830184610cea565b60008219821115610dc4577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b500190565b84815273ffffffffffffffffffffffffffffffffffffffff84811660208301528316604082015260808101610e016060830184610cea565b9594505050505056fea164736f6c634300080f000a00000000000000000000000066666666666666666666666666666666666666660000000000000000000000000000000000000000000000000de0b6b3a76400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000beb5fc579115071764c7423a4f12edde41f106ed0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000124e9e05c420000000000000000000000004200000000000000000000000000000000000018000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000249f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000004499a88ec4000000000000000000000000420000000000000000000000000000000000001b0000000000000000000000001e2d5b3362d3b6726dd715284dc83faf7e6c27ed0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000beb5fc579115071764c7423a4f12edde41f106ed0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000001144e9e05c4200000000000000000000000013b0d85ccb8bf860b6b79af3029fca081ae9bef2000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000de2b0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000106466cfa0570000000000000000000000000000000000000000000000000000000000000000204cb368f75f2d6cade61b62cb318bffd2bd31a57a3f86dff75f5bfd9d2dd14900000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000fcb60e060405234801561001057600080fd5b50604051610f6b380380610f6b83398101604081905261002f91610079565b6001600160a01b03831660a0526080829052828282806001811115610056576100566100cc565b60c081600181111561006a5761006a6100cc565b815250505050505050506100e2565b60008060006060848603121561008e57600080fd5b83516001600160a01b03811681146100a557600080fd5b602085015160408601519194509250600281106100c157600080fd5b809150509250925092565b634e487b7160e01b600052602160045260246000fd5b60805160a05160c051610e466101256000396000818161028f0152610a0101526000818160f401526109910152600081816102c30152610a550152610e466000f3fe6080604052600436106100d65760003560e01c806382356d8a1161007f57806385b5b14d1161005957806385b5b14d1461025d578063d0e12f901461027d578063d3e5792b146102b1578063d4ff9218146102e557600080fd5b806382356d8a146102105780638312f1491461023257806384411d651461024757600080fd5b80633ccfd60b116100b05780633ccfd60b1461018257806354fd4d50146101a557806366d003ac146101fb57600080fd5b80630d9019e1146100e2578063307f2962146101405780633bbed4a01461016257600080fd5b366100dd57005b600080fd5b3480156100ee57600080fd5b506101167f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b34801561014c57600080fd5b5061016061015b366004610c14565b6102fa565b005b34801561016e57600080fd5b5061016061017d366004610c5a565b6104c2565b34801561018e57600080fd5b50610197610642565b604051908152602001610137565b3480156101b157600080fd5b506101ee6040518060400160405280600581526020017f312e362e3000000000000000000000000000000000000000000000000000000081525081565b6040516101379190610c77565b34801561020757600080fd5b5061011661094a565b34801561021c57600080fd5b506102256109b3565b6040516101379190610d54565b34801561023e57600080fd5b50610197610a23565b34801561025357600080fd5b5061019760005481565b34801561026957600080fd5b50610160610278366004610d68565b610a77565b34801561028957600080fd5b506102257f000000000000000000000000000000000000000000000000000000000000000081565b3480156102bd57600080fd5b506101977f000000000000000000000000000000000000000000000000000000000000000081565b3480156102f157600080fd5b50610116610bdd565b73420000000000000000000000000000000000001873ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610359573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061037d9190610d81565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146103e1576040517f7cd7e09f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600280547401000000000000000000000000000000000000000080820460ff1692849290917fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff9091169083600181111561043d5761043d610cea565b0217905550600280547fffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffff16770100000000000000000000000000000000000000000000001790556040517ff2ec44eb1c3b3acd547b76333eb2c4b27eee311860c57a9fdb04c95f62398fc8906104b69083908590610d9e565b60405180910390a15050565b73420000000000000000000000000000000000001873ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610521573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105459190610d81565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146105a9576040517f7cd7e09f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600280547fffffffffffffffffffff00ff0000000000000000000000000000000000000000811673ffffffffffffffffffffffffffffffffffffffff84811691821775010000000000000000000000000000000000000000001790935560408051939092168084526020840191909152917f62e69886a5df0ba8ffcacbfc1388754e7abd9bde24b036354c561f1acd4e459391016104b6565b600061064c610a23565b471015610706576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604a60248201527f4665655661756c743a207769746864726177616c20616d6f756e74206d75737460448201527f2062652067726561746572207468616e206d696e696d756d207769746864726160648201527f77616c20616d6f756e7400000000000000000000000000000000000000000000608482015260a4015b60405180910390fd5b4790508060008082825461071a9190610db9565b909155507fc8a211cc64b6ed1b50595a9fcb1932b6d1e5a6e8ef15b60e5b1f988ea9086bba90508161074a61094a565b6040805192835273ffffffffffffffffffffffffffffffffffffffff9091166020830152339082015260600160405180910390a17f38e04cbeb8c10f8f568618aa75be0f10b6729b8b4237743b4de20cbcde2839ee816107a861094a565b336107b16109b3565b6040516107c19493929190610df8565b60405180910390a160016107d36109b3565b60018111156107e4576107e4610cea565b0361088f5760006107fc6107f661094a565b83610bec565b90508061088b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f4665655661756c743a206661696c656420746f2073656e642045544820746f2060448201527f4c322066656520726563697069656e740000000000000000000000000000000060648201526084016106fd565b5090565b73420000000000000000000000000000000000001663c2b3e5ac826108b261094a565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b16815273ffffffffffffffffffffffffffffffffffffffff909116600482015262061a80602482015260606044820152600060648201526084016000604051808303818588803b15801561092e57600080fd5b505af1158015610942573d6000803e3d6000fd5b505050505090565b6002546000907501000000000000000000000000000000000000000000900460ff161561098e575060025473ffffffffffffffffffffffffffffffffffffffff1690565b507f000000000000000000000000000000000000000000000000000000000000000090565b60025460009077010000000000000000000000000000000000000000000000900460ff16156109fe575060025474010000000000000000000000000000000000000000900460ff1690565b507f000000000000000000000000000000000000000000000000000000000000000090565b600254600090760100000000000000000000000000000000000000000000900460ff1615610a52575060015490565b507f000000000000000000000000000000000000000000000000000000000000000090565b73420000000000000000000000000000000000001873ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610ad6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610afa9190610d81565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610b5e576040517f7cd7e09f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001805490829055600280547fffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffff1676010000000000000000000000000000000000000000000017905560408051828152602081018490527f895a067c78583e800418fabf3da26a9496aab2ff3429cebdf7fefa642b2e420391016104b6565b6000610be761094a565b905090565b6000610bf9835a84610c00565b9392505050565b6000806000806000858888f1949350505050565b600060208284031215610c2657600080fd5b813560028110610bf957600080fd5b73ffffffffffffffffffffffffffffffffffffffff81168114610c5757600080fd5b50565b600060208284031215610c6c57600080fd5b8135610bf981610c35565b600060208083528351808285015260005b81811015610ca457858101830151858201604001528201610c88565b81811115610cb6576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b60028110610d50577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b9052565b60208101610d628284610d19565b92915050565b600060208284031215610d7a57600080fd5b5035919050565b600060208284031215610d9357600080fd5b8151610bf981610c35565b60408101610dac8285610d19565b610bf96020830184610d19565b60008219821115610df3577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b500190565b84815273ffffffffffffffffffffffffffffffffffffffff84811660208301528316604082015260808101610e306060830184610d19565b9594505050505056fea164736f6c634300080f000a00000000000000000000000055555555555555555555555555555555555555550000000000000000000000000000000000000000000000000de0b6b3a764000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000beb5fc579115071764c7423a4f12edde41f106ed0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000124e9e05c420000000000000000000000004200000000000000000000000000000000000018000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000249f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000004499a88ec400000000000000000000000042000000000000000000000000000000000000110000000000000000000000002ca727314d2c6c683998ce385c2853923719aea10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000beb5fc579115071764c7423a4f12edde41f106ed0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000001104e9e05c4200000000000000000000000013b0d85ccb8bf860b6b79af3029fca081ae9bef2000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000de2b0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000102466cfa05700000000000000000000000000000000000000000000000000000000000000007a2bde9cfb7f80a4198677bdf885a43dc36c598688294f694cf64429164f140000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000f9c60e060405234801561001057600080fd5b50604051610f3c380380610f3c83398101604081905261002f91610079565b6001600160a01b03831660a0526080829052828282806001811115610056576100566100cc565b60c081600181111561006a5761006a6100cc565b815250505050505050506100e2565b60008060006060848603121561008e57600080fd5b83516001600160a01b03811681146100a557600080fd5b602085015160408601519194509250600281106100c157600080fd5b809150509250925092565b634e487b7160e01b600052602160045260246000fd5b60805160a05160c051610e176101256000396000818161028401526109e101526000818160e901526109710152600081816102b80152610a350152610e176000f3fe6080604052600436106100cb5760003560e01c806382356d8a1161007457806385b5b14d1161004e57806385b5b14d14610252578063d0e12f9014610272578063d3e5792b146102a657600080fd5b806382356d8a146102055780638312f1491461022757806384411d651461023c57600080fd5b80633ccfd60b116100a55780633ccfd60b1461017757806354fd4d501461019a57806366d003ac146101f057600080fd5b80630d9019e1146100d7578063307f2962146101355780633bbed4a01461015757600080fd5b366100d257005b600080fd5b3480156100e357600080fd5b5061010b7f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b34801561014157600080fd5b50610155610150366004610be5565b6102da565b005b34801561016357600080fd5b50610155610172366004610c2b565b6104a2565b34801561018357600080fd5b5061018c610622565b60405190815260200161012c565b3480156101a657600080fd5b506101e36040518060400160405280600581526020017f312e362e3000000000000000000000000000000000000000000000000000000081525081565b60405161012c9190610c48565b3480156101fc57600080fd5b5061010b61092a565b34801561021157600080fd5b5061021a610993565b60405161012c9190610d25565b34801561023357600080fd5b5061018c610a03565b34801561024857600080fd5b5061018c60005481565b34801561025e57600080fd5b5061015561026d366004610d39565b610a57565b34801561027e57600080fd5b5061021a7f000000000000000000000000000000000000000000000000000000000000000081565b3480156102b257600080fd5b5061018c7f000000000000000000000000000000000000000000000000000000000000000081565b73420000000000000000000000000000000000001873ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610339573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061035d9190610d52565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146103c1576040517f7cd7e09f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600280547401000000000000000000000000000000000000000080820460ff1692849290917fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff9091169083600181111561041d5761041d610cbb565b0217905550600280547fffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffff16770100000000000000000000000000000000000000000000001790556040517ff2ec44eb1c3b3acd547b76333eb2c4b27eee311860c57a9fdb04c95f62398fc8906104969083908590610d6f565b60405180910390a15050565b73420000000000000000000000000000000000001873ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610501573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105259190610d52565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610589576040517f7cd7e09f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600280547fffffffffffffffffffff00ff0000000000000000000000000000000000000000811673ffffffffffffffffffffffffffffffffffffffff84811691821775010000000000000000000000000000000000000000001790935560408051939092168084526020840191909152917f62e69886a5df0ba8ffcacbfc1388754e7abd9bde24b036354c561f1acd4e45939101610496565b600061062c610a03565b4710156106e6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604a60248201527f4665655661756c743a207769746864726177616c20616d6f756e74206d75737460448201527f2062652067726561746572207468616e206d696e696d756d207769746864726160648201527f77616c20616d6f756e7400000000000000000000000000000000000000000000608482015260a4015b60405180910390fd5b479050806000808282546106fa9190610d8a565b909155507fc8a211cc64b6ed1b50595a9fcb1932b6d1e5a6e8ef15b60e5b1f988ea9086bba90508161072a61092a565b6040805192835273ffffffffffffffffffffffffffffffffffffffff9091166020830152339082015260600160405180910390a17f38e04cbeb8c10f8f568618aa75be0f10b6729b8b4237743b4de20cbcde2839ee8161078861092a565b33610791610993565b6040516107a19493929190610dc9565b60405180910390a160016107b3610993565b60018111156107c4576107c4610cbb565b0361086f5760006107dc6107d661092a565b83610bbd565b90508061086b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f4665655661756c743a206661696c656420746f2073656e642045544820746f2060448201527f4c322066656520726563697069656e740000000000000000000000000000000060648201526084016106dd565b5090565b73420000000000000000000000000000000000001663c2b3e5ac8261089261092a565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b16815273ffffffffffffffffffffffffffffffffffffffff909116600482015262061a80602482015260606044820152600060648201526084016000604051808303818588803b15801561090e57600080fd5b505af1158015610922573d6000803e3d6000fd5b505050505090565b6002546000907501000000000000000000000000000000000000000000900460ff161561096e575060025473ffffffffffffffffffffffffffffffffffffffff1690565b507f000000000000000000000000000000000000000000000000000000000000000090565b60025460009077010000000000000000000000000000000000000000000000900460ff16156109de575060025474010000000000000000000000000000000000000000900460ff1690565b507f000000000000000000000000000000000000000000000000000000000000000090565b600254600090760100000000000000000000000000000000000000000000900460ff1615610a32575060015490565b507f000000000000000000000000000000000000000000000000000000000000000090565b73420000000000000000000000000000000000001873ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610ab6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ada9190610d52565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610b3e576040517f7cd7e09f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001805490829055600280547fffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffff1676010000000000000000000000000000000000000000000017905560408051828152602081018490527f895a067c78583e800418fabf3da26a9496aab2ff3429cebdf7fefa642b2e42039101610496565b6000610bca835a84610bd1565b9392505050565b6000806000806000858888f1949350505050565b600060208284031215610bf757600080fd5b813560028110610bca57600080fd5b73ffffffffffffffffffffffffffffffffffffffff81168114610c2857600080fd5b50565b600060208284031215610c3d57600080fd5b8135610bca81610c06565b600060208083528351808285015260005b81811015610c7557858101830151858201604001528201610c59565b81811115610c87576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b60028110610d21577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b9052565b60208101610d338284610cea565b92915050565b600060208284031215610d4b57600080fd5b5035919050565b600060208284031215610d6457600080fd5b8151610bca81610c06565b60408101610d7d8285610cea565b610bca6020830184610cea565b60008219821115610dc4577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b500190565b84815273ffffffffffffffffffffffffffffffffffffffff84811660208301528316604082015260808101610e016060830184610cea565b9594505050505056fea164736f6c634300080f000a00000000000000000000000033333333333333333333333333333333333333330000000000000000000000000000000000000000000000000de0b6b3a76400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000beb5fc579115071764c7423a4f12edde41f106ed0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000124e9e05c420000000000000000000000004200000000000000000000000000000000000018000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000249f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000004499a88ec4000000000000000000000000420000000000000000000000000000000000001900000000000000000000000063e87ea1598d7b59b88685b56be6e5d7b2e11ed90000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000beb5fc579115071764c7423a4f12edde41f106ed0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000001104e9e05c4200000000000000000000000013b0d85ccb8bf860b6b79af3029fca081ae9bef2000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000de2b0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000102466cfa05700000000000000000000000000000000000000000000000000000000000000004ac8e160bee0acc95b22d1744fa9cc7068869945397f78a77ed68ef8ae1d87a900000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000f9c60e060405234801561001057600080fd5b50604051610f3c380380610f3c83398101604081905261002f91610079565b6001600160a01b03831660a0526080829052828282806001811115610056576100566100cc565b60c081600181111561006a5761006a6100cc565b815250505050505050506100e2565b60008060006060848603121561008e57600080fd5b83516001600160a01b03811681146100a557600080fd5b602085015160408601519194509250600281106100c157600080fd5b809150509250925092565b634e487b7160e01b600052602160045260246000fd5b60805160a05160c051610e176101256000396000818161028401526109e101526000818160e901526109710152600081816102b80152610a350152610e176000f3fe6080604052600436106100cb5760003560e01c806382356d8a1161007457806385b5b14d1161004e57806385b5b14d14610252578063d0e12f9014610272578063d3e5792b146102a657600080fd5b806382356d8a146102055780638312f1491461022757806384411d651461023c57600080fd5b80633ccfd60b116100a55780633ccfd60b1461017757806354fd4d501461019a57806366d003ac146101f057600080fd5b80630d9019e1146100d7578063307f2962146101355780633bbed4a01461015757600080fd5b366100d257005b600080fd5b3480156100e357600080fd5b5061010b7f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b34801561014157600080fd5b50610155610150366004610be5565b6102da565b005b34801561016357600080fd5b50610155610172366004610c2b565b6104a2565b34801561018357600080fd5b5061018c610622565b60405190815260200161012c565b3480156101a657600080fd5b506101e36040518060400160405280600581526020017f312e362e3000000000000000000000000000000000000000000000000000000081525081565b60405161012c9190610c48565b3480156101fc57600080fd5b5061010b61092a565b34801561021157600080fd5b5061021a610993565b60405161012c9190610d25565b34801561023357600080fd5b5061018c610a03565b34801561024857600080fd5b5061018c60005481565b34801561025e57600080fd5b5061015561026d366004610d39565b610a57565b34801561027e57600080fd5b5061021a7f000000000000000000000000000000000000000000000000000000000000000081565b3480156102b257600080fd5b5061018c7f000000000000000000000000000000000000000000000000000000000000000081565b73420000000000000000000000000000000000001873ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610339573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061035d9190610d52565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146103c1576040517f7cd7e09f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600280547401000000000000000000000000000000000000000080820460ff1692849290917fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff9091169083600181111561041d5761041d610cbb565b0217905550600280547fffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffff16770100000000000000000000000000000000000000000000001790556040517ff2ec44eb1c3b3acd547b76333eb2c4b27eee311860c57a9fdb04c95f62398fc8906104969083908590610d6f565b60405180910390a15050565b73420000000000000000000000000000000000001873ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610501573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105259190610d52565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610589576040517f7cd7e09f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600280547fffffffffffffffffffff00ff0000000000000000000000000000000000000000811673ffffffffffffffffffffffffffffffffffffffff84811691821775010000000000000000000000000000000000000000001790935560408051939092168084526020840191909152917f62e69886a5df0ba8ffcacbfc1388754e7abd9bde24b036354c561f1acd4e45939101610496565b600061062c610a03565b4710156106e6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604a60248201527f4665655661756c743a207769746864726177616c20616d6f756e74206d75737460448201527f2062652067726561746572207468616e206d696e696d756d207769746864726160648201527f77616c20616d6f756e7400000000000000000000000000000000000000000000608482015260a4015b60405180910390fd5b479050806000808282546106fa9190610d8a565b909155507fc8a211cc64b6ed1b50595a9fcb1932b6d1e5a6e8ef15b60e5b1f988ea9086bba90508161072a61092a565b6040805192835273ffffffffffffffffffffffffffffffffffffffff9091166020830152339082015260600160405180910390a17f38e04cbeb8c10f8f568618aa75be0f10b6729b8b4237743b4de20cbcde2839ee8161078861092a565b33610791610993565b6040516107a19493929190610dc9565b60405180910390a160016107b3610993565b60018111156107c4576107c4610cbb565b0361086f5760006107dc6107d661092a565b83610bbd565b90508061086b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f4665655661756c743a206661696c656420746f2073656e642045544820746f2060448201527f4c322066656520726563697069656e740000000000000000000000000000000060648201526084016106dd565b5090565b73420000000000000000000000000000000000001663c2b3e5ac8261089261092a565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b16815273ffffffffffffffffffffffffffffffffffffffff909116600482015262061a80602482015260606044820152600060648201526084016000604051808303818588803b15801561090e57600080fd5b505af1158015610922573d6000803e3d6000fd5b505050505090565b6002546000907501000000000000000000000000000000000000000000900460ff161561096e575060025473ffffffffffffffffffffffffffffffffffffffff1690565b507f000000000000000000000000000000000000000000000000000000000000000090565b60025460009077010000000000000000000000000000000000000000000000900460ff16156109de575060025474010000000000000000000000000000000000000000900460ff1690565b507f000000000000000000000000000000000000000000000000000000000000000090565b600254600090760100000000000000000000000000000000000000000000900460ff1615610a32575060015490565b507f000000000000000000000000000000000000000000000000000000000000000090565b73420000000000000000000000000000000000001873ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610ab6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ada9190610d52565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610b3e576040517f7cd7e09f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001805490829055600280547fffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffff1676010000000000000000000000000000000000000000000017905560408051828152602081018490527f895a067c78583e800418fabf3da26a9496aab2ff3429cebdf7fefa642b2e42039101610496565b6000610bca835a84610bd1565b9392505050565b6000806000806000858888f1949350505050565b600060208284031215610bf757600080fd5b813560028110610bca57600080fd5b73ffffffffffffffffffffffffffffffffffffffff81168114610c2857600080fd5b50565b600060208284031215610c3d57600080fd5b8135610bca81610c06565b600060208083528351808285015260005b81811015610c7557858101830151858201604001528201610c59565b81811115610c87576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b60028110610d21577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b9052565b60208101610d338284610cea565b92915050565b600060208284031215610d4b57600080fd5b5035919050565b600060208284031215610d6457600080fd5b8151610bca81610c06565b60408101610d7d8285610cea565b610bca6020830184610cea565b60008219821115610dc4577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b500190565b84815273ffffffffffffffffffffffffffffffffffffffff84811660208301528316604082015260808101610e016060830184610cea565b9594505050505056fea164736f6c634300080f000a00000000000000000000000044444444444444444444444444444444444444440000000000000000000000000000000000000000000000000de0b6b3a76400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000beb5fc579115071764c7423a4f12edde41f106ed0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000124e9e05c420000000000000000000000004200000000000000000000000000000000000018000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000249f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000004499a88ec4000000000000000000000000420000000000000000000000000000000000001a000000000000000000000000ad552e53be11c5fc03a95d8be3bb72ab675e0ddb0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"; + "0x174dea710000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000174000000000000000000000000000000000000000000000000000000000000019a00000000000000000000000000000000000000000000000000000000000002b600000000000000000000000000000000000000000000000000000000000002e000000000000000000000000000000000000000000000000000000000000003fc00000000000000000000000000000000000000000000000000000000000004260000000000000000000000000000000000000000000000000000000000000542000000000000000000000000000000000000000000000000000000000000056c00000000000000000000000000000000000000000000000000000000000006880000000000000000000000000beb5fc579115071764c7423a4f12edde41f106ed0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000001544e9e05c4200000000000000000000000013b0d85ccb8bf860b6b79af3029fca081ae9bef20000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000012d838000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000146466cfa0570000000000000000000000000000000000000000000000000000000000000000d7c04619bfc311a92d20723f9d08baaba18c3c8c7dcd85736bf66b85f59c37f6000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000013d26080604052348015600e575f80fd5b5060156019565b60d4565b5f54610100900460ff161560835760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b5f5460ff908116101560d2575f805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6112f1806100e15f395ff3fe608060405260043610610096575f3560e01c80637dfbd04911610066578063b87ea8d41161004c578063b87ea8d414610313578063c4d66de814610327578063d61a398b14610346575f80fd5b80637dfbd049146102dd5780637fc81bb7146102f4575f80fd5b80630a7617b3146101dd5780630c0544a3146101fe578063394d27311461026057806354fd4d5014610288575f80fd5b366101d9577fe3007e9730850b5618eacb0537bef0cf0f1600267ae8549e472449d77b731e455c6100f3576040517f17617f6100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b337342000000000000000000000000000000000000111480159061012b57503373420000000000000000000000000000000000001914155b801561014b57503373420000000000000000000000000000000000001a14155b801561016b57503373420000000000000000000000000000000000001b14155b156101a2576040517f9dcde10900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60405134815233907f2ccfc58c2cef4ee590b5f16be0548cc54afc12e1c66a67b362b7d640fd16bb2d9060200160405180910390a2005b5f80fd5b3480156101e8575f80fd5b506101fc6101f7366004610f4b565b61039c565b005b348015610209575f80fd5b5060015461023a9070010000000000000000000000000000000090046fffffffffffffffffffffffffffffffff1681565b6040516fffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b34801561026b575f80fd5b5060015461023a906fffffffffffffffffffffffffffffffff1681565b348015610293575f80fd5b506102d06040518060400160405280600581526020017f312e302e3000000000000000000000000000000000000000000000000000000081525081565b6040516102579190610f66565b3480156102e8575f80fd5b5061023a6301e1338081565b3480156102ff575f80fd5b506101fc61030e366004610fb9565b61055e565b34801561031e575f80fd5b506101fc610706565b348015610332575f80fd5b506101fc610341366004610f4b565b610aea565b348015610351575f80fd5b505f546103779062010000900473ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610257565b73420000000000000000000000000000000000001873ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156103f9573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061041d9190610fe8565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610481576040517f38bac74200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff81166104ce576040517f99c6ec0800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f805473ffffffffffffffffffffffffffffffffffffffff838116620100008181027fffffffffffffffffffff0000000000000000000000000000000000000000ffff85161790945560408051949093049091168084526020840191909152917f16417cc372deec0caee5f52e2ad77a5f07b4591fd56b4ff31b6e20f817d4daeb91015b60405180910390a15050565b73420000000000000000000000000000000000001873ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156105bb573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906105df9190610fe8565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610643576040517f38bac74200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6301e133806fffffffffffffffffffffffffffffffff82161115610693576040517f30b9f35e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600180546fffffffffffffffffffffffffffffffff8381167001000000000000000000000000000000008181028385161790945560408051949093049091168084526020840191909152917f4492086b630ed3846eec0979dd87a71c814ceb1c6dab80ab81e3450b21e4de289101610552565b60015461073b906fffffffffffffffffffffffffffffffff700100000000000000000000000000000000820481169116611030565b6fffffffffffffffffffffffffffffffff16421015610786576040517f1e4a9f3a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600180547fffffffffffffffffffffffffffffffff0000000000000000000000000000000016426fffffffffffffffffffffffffffffffff161781556107cb90610ce0565b5f6107e9734200000000000000000000000000000000000011610d06565b90505f610809734200000000000000000000000000000000000019610d06565b90505f61082973420000000000000000000000000000000000001a610d06565b90505f61084973420000000000000000000000000000000000001b610d06565b90506108545f610ce0565b5f82826108618688611060565b61086b9190611060565b6108759190611060565b9050805f036108b0576040517fc8972e5200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f80546040517f54e7f42d000000000000000000000000000000000000000000000000000000008152600481018890526024810187905260448101859052606481018690526201000090910473ffffffffffffffffffffffffffffffffffffffff16906354e7f42d906084015f60405180830381865afa158015610936573d5f803e3d5ffd5b505050506040513d5f823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016820160405261097b9190810190611118565b905080515f036109b7576040517f763970d600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f805b8251811015610a6e575f8382815181106109d6576109d66111e7565b60200260200101515f015190505f8483815181106109f6576109f66111e7565b6020026020010151602001519050805f03610a12575050610a66565b5f610a1d8383610f03565b905080610a56576040517fd68d1b1800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610a608286611060565b94505050505b6001016109ba565b50828114610aa8576040517f9c01eac000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f73f9a13241a1848ec157967f3a85601709353e616f1f2605d818c0f2d21774df8284604051610ad9929190611214565b60405180910390a150505050505050565b5f54610100900460ff1615808015610b0857505f54600160ff909116105b80610b215750303b158015610b2157505f5460ff166001145b610bb1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a6564000000000000000000000000000000000000606482015260840160405180910390fd5b5f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558015610c0d575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b5f80547fffffffffffffffffffff0000000000000000000000000000000000000000ffff166201000073ffffffffffffffffffffffffffffffffffffffff851602179055600180546fffffffffffffffffffffffffffffffff1672015180000000000000000000000000000000001790558015610cdc575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb384740249890602001610552565b5050565b807fe3007e9730850b5618eacb0537bef0cf0f1600267ae8549e472449d77b731e455d50565b5f60018273ffffffffffffffffffffffffffffffffffffffff166382356d8a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610d52573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610d7691906112af565b6001811115610d8757610d87611282565b14610dbe576040517fb4726cbe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b3073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff166366d003ac6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610e1e573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e429190610fe8565b73ffffffffffffffffffffffffffffffffffffffff1614610e8f576040517fc3380cef00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8173ffffffffffffffffffffffffffffffffffffffff16633ccfd60b6040518163ffffffff1660e01b81526004016020604051808303815f875af1158015610ed9573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610efd91906112cd565b92915050565b5f610f0f835a84610f16565b9392505050565b5f805f805f858888f1949350505050565b73ffffffffffffffffffffffffffffffffffffffff81168114610f48575f80fd5b50565b5f60208284031215610f5b575f80fd5b8135610f0f81610f27565b602081525f82518060208401528060208501604085015e5f6040828501015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011684010191505092915050565b5f60208284031215610fc9575f80fd5b81356fffffffffffffffffffffffffffffffff81168114610f0f575f80fd5b5f60208284031215610ff8575f80fd5b8151610f0f81610f27565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b6fffffffffffffffffffffffffffffffff81811683821601908082111561105957611059611003565b5092915050565b80820180821115610efd57610efd611003565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b6040805190810167ffffffffffffffff811182821017156110c3576110c3611073565b60405290565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff8111828210171561111057611110611073565b604052919050565b5f6020808385031215611129575f80fd5b825167ffffffffffffffff80821115611140575f80fd5b818501915085601f830112611153575f80fd5b81518181111561116557611165611073565b611173848260051b016110c9565b818152848101925060069190911b830184019087821115611192575f80fd5b928401925b818410156111dc57604084890312156111ae575f80fd5b6111b66110a0565b84516111c181610f27565b81528486015186820152835260409093019291840191611197565b979650505050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b604080825283518282018190525f91906020906060850190828801855b8281101561126c578151805173ffffffffffffffffffffffffffffffffffffffff168552850151858501529285019290840190600101611231565b5050508093505050508260208301529392505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b5f602082840312156112bf575f80fd5b815160028110610f0f575f80fd5b5f602082840312156112dd575f80fd5b505191905056fea164736f6c6343000819000a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000beb5fc579115071764c7423a4f12edde41f106ed00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000001a4e9e05c420000000000000000000000004200000000000000000000000000000000000018000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000249f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000c49623609d000000000000000000000000420000000000000000000000000000000000002b0000000000000000000000006b0d0b5d65c13ed9ec80617772aee4d6c594a66e00000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000024c4d66de80000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000beb5fc579115071764c7423a4f12edde41f106ed0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000001104e9e05c4200000000000000000000000013b0d85ccb8bf860b6b79af3029fca081ae9bef2000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000de2b0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000102466cfa0570000000000000000000000000000000000000000000000000000000000000000783aa8b3e401c8404e3eff9401ba29702719ddc0c0f69ec9ac77188bacea107300000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000f8f6080604052348015600e575f80fd5b5060156019565b60c9565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff161560685760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b039081161460c65780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b610eb9806100d65f395ff3fe6080604052600436106100d1575f3560e01c806382356d8a1161007c57806385b5b14d1161005757806385b5b14d14610276578063b49dc74114610295578063d0e12f90146102b4578063d3e5792b146102e3575f80fd5b806382356d8a1461020f5780638312f1491461024d57806384411d6514610262575f80fd5b80633ccfd60b116100ac5780633ccfd60b1461016c57806354fd4d501461018e57806366d003ac146101e3575f80fd5b80630d9019e1146100dc578063307f29621461012c5780633bbed4a01461014d575f80fd5b366100d857005b5f80fd5b3480156100e7575f80fd5b5060025473ffffffffffffffffffffffffffffffffffffffff165b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b348015610137575f80fd5b5061014b610146366004610c86565b6102f7565b005b348015610158575f80fd5b5061014b610167366004610cc3565b61047a565b348015610177575f80fd5b506101806105de565b604051908152602001610123565b348015610199575f80fd5b506101d66040518060400160405280600581526020017f312e312e3000000000000000000000000000000000000000000000000000000081525081565b6040516101239190610cde565b3480156101ee575f80fd5b506002546101029073ffffffffffffffffffffffffffffffffffffffff1681565b34801561021a575f80fd5b506002546102409074010000000000000000000000000000000000000000900460ff1681565b6040516101239190610d97565b348015610258575f80fd5b5061018060015481565b34801561026d575f80fd5b506101805f5481565b348015610281575f80fd5b5061014b610290366004610dab565b610918565b3480156102a0575f80fd5b5061014b6102af366004610dc2565b610a3b565b3480156102bf575f80fd5b5060025474010000000000000000000000000000000000000000900460ff16610240565b3480156102ee575f80fd5b50600154610180565b73420000000000000000000000000000000000001873ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610354573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906103789190610dfd565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146103dc576040517f7cd7e09f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600280547401000000000000000000000000000000000000000080820460ff1692849290917fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff9091169083600181111561043857610438610d31565b02179055507ff2ec44eb1c3b3acd547b76333eb2c4b27eee311860c57a9fdb04c95f62398fc8818360405161046e929190610e18565b60405180910390a15050565b73420000000000000000000000000000000000001873ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156104d7573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104fb9190610dfd565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461055f576040517f7cd7e09f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff000000000000000000000000000000000000000083168117909355604080519190921680825260208201939093527f62e69886a5df0ba8ffcacbfc1388754e7abd9bde24b036354c561f1acd4e4593910161046e565b5f60015447101561069c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604a60248201527f4665655661756c743a207769746864726177616c20616d6f756e74206d75737460448201527f2062652067726561746572207468616e206d696e696d756d207769746864726160648201527f77616c20616d6f756e7400000000000000000000000000000000000000000000608482015260a4015b60405180910390fd5b479050805f808282546106af9190610e33565b90915550506002546040805183815273ffffffffffffffffffffffffffffffffffffffff90921660208301523382820152517fc8a211cc64b6ed1b50595a9fcb1932b6d1e5a6e8ef15b60e5b1f988ea9086bba9181900360600190a16002546040517f38e04cbeb8c10f8f568618aa75be0f10b6729b8b4237743b4de20cbcde2839ee9161077491849173ffffffffffffffffffffffffffffffffffffffff811691339174010000000000000000000000000000000000000000900460ff1690610e6b565b60405180910390a1600160025474010000000000000000000000000000000000000000900460ff1660018111156107ad576107ad610d31565b0361086a576002545f906107d79073ffffffffffffffffffffffffffffffffffffffff1683610c4f565b905080610866576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f4665655661756c743a206661696c656420746f2073656e642045544820746f2060448201527f4c322066656520726563697069656e74000000000000000000000000000000006064820152608401610693565b5090565b6002546040517fc2b3e5ac00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff909116600482015262061a806024820152606060448201525f60648201527342000000000000000000000000000000000000169063c2b3e5ac9083906084015f604051808303818588803b1580156108fe575f80fd5b505af1158015610910573d5f803e3d5ffd5b505050505090565b73420000000000000000000000000000000000001873ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610975573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109999190610dfd565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146109fd576040517f7cd7e09f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600180549082905560408051828152602081018490527f895a067c78583e800418fabf3da26a9496aab2ff3429cebdf7fefa642b2e4203910161046e565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000810460ff16159067ffffffffffffffff165f81158015610a855750825b90505f8267ffffffffffffffff166001148015610aa15750303b155b905081158015610aaf575080155b15610ae6576040517ff92ee8a900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b84547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001660011785558315610b475784547fffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffff16680100000000000000001785555b6002805473ffffffffffffffffffffffffffffffffffffffff8a167fffffffffffffffffffffffff000000000000000000000000000000000000000082168117835560018a81558993927fffffffffffffffffffffff000000000000000000000000000000000000000000169091179074010000000000000000000000000000000000000000908490811115610bdf57610bdf610d31565b02179055508315610c455784547fffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffff168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b5050505050505050565b5f610c5b835a84610c62565b9392505050565b5f805f805f858888f1949350505050565b803560028110610c81575f80fd5b919050565b5f60208284031215610c96575f80fd5b610c5b82610c73565b73ffffffffffffffffffffffffffffffffffffffff81168114610cc0575f80fd5b50565b5f60208284031215610cd3575f80fd5b8135610c5b81610c9f565b602081525f82518060208401528060208501604085015e5f6040828501015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011684010191505092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b60028110610d93577f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b9052565b60208101610da58284610d5e565b92915050565b5f60208284031215610dbb575f80fd5b5035919050565b5f805f60608486031215610dd4575f80fd5b8335610ddf81610c9f565b925060208401359150610df460408501610c73565b90509250925092565b5f60208284031215610e0d575f80fd5b8151610c5b81610c9f565b60408101610e268285610d5e565b610c5b6020830184610d5e565b80820180821115610da5577f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b84815273ffffffffffffffffffffffffffffffffffffffff84811660208301528316604082015260808101610ea36060830184610d5e565b9594505050505056fea164736f6c6343000819000a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000beb5fc579115071764c7423a4f12edde41f106ed00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000001e4e9e05c420000000000000000000000004200000000000000000000000000000000000018000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000249f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000001049623609d000000000000000000000000420000000000000000000000000000000000001b000000000000000000000000bb8accad49adb30084bdf22d01a109883fd13dce00000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000064b49dc74100000000000000000000000066666666666666666666666666666666666666660000000000000000000000000000000000000000000000000de0b6b3a76400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000beb5fc579115071764c7423a4f12edde41f106ed0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000001104e9e05c4200000000000000000000000013b0d85ccb8bf860b6b79af3029fca081ae9bef2000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000de2b0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000102466cfa0570000000000000000000000000000000000000000000000000000000000000000204cb368f75f2d6cade61b62cb318bffd2bd31a57a3f86dff75f5bfd9d2dd14900000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000f9a6080604052348015600e575f80fd5b5060156019565b60c9565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff161560685760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b039081161460c65780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b610ec4806100d65f395ff3fe6080604052600436106100dc575f3560e01c80638312f1491161007c578063b49dc74111610057578063b49dc741146102a0578063d0e12f90146102bf578063d3e5792b146102ee578063d4ff9218146100e7575f80fd5b80638312f1491461025857806384411d651461026d57806385b5b14d14610281575f80fd5b80633ccfd60b116100b75780633ccfd60b1461017757806354fd4d501461019957806366d003ac146101ee57806382356d8a1461021a575f80fd5b80630d9019e1146100e7578063307f2962146101375780633bbed4a014610158575f80fd5b366100e357005b5f80fd5b3480156100f2575f80fd5b5060025473ffffffffffffffffffffffffffffffffffffffff165b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b348015610142575f80fd5b50610156610151366004610c91565b610302565b005b348015610163575f80fd5b50610156610172366004610cce565b610485565b348015610182575f80fd5b5061018b6105e9565b60405190815260200161012e565b3480156101a4575f80fd5b506101e16040518060400160405280600581526020017f312e362e3000000000000000000000000000000000000000000000000000000081525081565b60405161012e9190610ce9565b3480156101f9575f80fd5b5060025461010d9073ffffffffffffffffffffffffffffffffffffffff1681565b348015610225575f80fd5b5060025461024b9074010000000000000000000000000000000000000000900460ff1681565b60405161012e9190610da2565b348015610263575f80fd5b5061018b60015481565b348015610278575f80fd5b5061018b5f5481565b34801561028c575f80fd5b5061015661029b366004610db6565b610923565b3480156102ab575f80fd5b506101566102ba366004610dcd565b610a46565b3480156102ca575f80fd5b5060025474010000000000000000000000000000000000000000900460ff1661024b565b3480156102f9575f80fd5b5060015461018b565b73420000000000000000000000000000000000001873ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561035f573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906103839190610e08565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146103e7576040517f7cd7e09f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600280547401000000000000000000000000000000000000000080820460ff1692849290917fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff9091169083600181111561044357610443610d3c565b02179055507ff2ec44eb1c3b3acd547b76333eb2c4b27eee311860c57a9fdb04c95f62398fc88183604051610479929190610e23565b60405180910390a15050565b73420000000000000000000000000000000000001873ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156104e2573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906105069190610e08565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461056a576040517f7cd7e09f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff000000000000000000000000000000000000000083168117909355604080519190921680825260208201939093527f62e69886a5df0ba8ffcacbfc1388754e7abd9bde24b036354c561f1acd4e45939101610479565b5f6001544710156106a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604a60248201527f4665655661756c743a207769746864726177616c20616d6f756e74206d75737460448201527f2062652067726561746572207468616e206d696e696d756d207769746864726160648201527f77616c20616d6f756e7400000000000000000000000000000000000000000000608482015260a4015b60405180910390fd5b479050805f808282546106ba9190610e3e565b90915550506002546040805183815273ffffffffffffffffffffffffffffffffffffffff90921660208301523382820152517fc8a211cc64b6ed1b50595a9fcb1932b6d1e5a6e8ef15b60e5b1f988ea9086bba9181900360600190a16002546040517f38e04cbeb8c10f8f568618aa75be0f10b6729b8b4237743b4de20cbcde2839ee9161077f91849173ffffffffffffffffffffffffffffffffffffffff811691339174010000000000000000000000000000000000000000900460ff1690610e76565b60405180910390a1600160025474010000000000000000000000000000000000000000900460ff1660018111156107b8576107b8610d3c565b03610875576002545f906107e29073ffffffffffffffffffffffffffffffffffffffff1683610c5a565b905080610871576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f4665655661756c743a206661696c656420746f2073656e642045544820746f2060448201527f4c322066656520726563697069656e7400000000000000000000000000000000606482015260840161069e565b5090565b6002546040517fc2b3e5ac00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff909116600482015262061a806024820152606060448201525f60648201527342000000000000000000000000000000000000169063c2b3e5ac9083906084015f604051808303818588803b158015610909575f80fd5b505af115801561091b573d5f803e3d5ffd5b505050505090565b73420000000000000000000000000000000000001873ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610980573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109a49190610e08565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610a08576040517f7cd7e09f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600180549082905560408051828152602081018490527f895a067c78583e800418fabf3da26a9496aab2ff3429cebdf7fefa642b2e42039101610479565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000810460ff16159067ffffffffffffffff165f81158015610a905750825b90505f8267ffffffffffffffff166001148015610aac5750303b155b905081158015610aba575080155b15610af1576040517ff92ee8a900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b84547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001660011785558315610b525784547fffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffff16680100000000000000001785555b6002805473ffffffffffffffffffffffffffffffffffffffff8a167fffffffffffffffffffffffff000000000000000000000000000000000000000082168117835560018a81558993927fffffffffffffffffffffff000000000000000000000000000000000000000000169091179074010000000000000000000000000000000000000000908490811115610bea57610bea610d3c565b02179055508315610c505784547fffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffff168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b5050505050505050565b5f610c66835a84610c6d565b9392505050565b5f805f805f858888f1949350505050565b803560028110610c8c575f80fd5b919050565b5f60208284031215610ca1575f80fd5b610c6682610c7e565b73ffffffffffffffffffffffffffffffffffffffff81168114610ccb575f80fd5b50565b5f60208284031215610cde575f80fd5b8135610c6681610caa565b602081525f82518060208401528060208501604085015e5f6040828501015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011684010191505092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b60028110610d9e577f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b9052565b60208101610db08284610d69565b92915050565b5f60208284031215610dc6575f80fd5b5035919050565b5f805f60608486031215610ddf575f80fd5b8335610dea81610caa565b925060208401359150610dff60408501610c7e565b90509250925092565b5f60208284031215610e18575f80fd5b8151610c6681610caa565b60408101610e318285610d69565b610c666020830184610d69565b80820180821115610db0577f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b84815273ffffffffffffffffffffffffffffffffffffffff84811660208301528316604082015260808101610eae6060830184610d69565b9594505050505056fea164736f6c6343000819000a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000beb5fc579115071764c7423a4f12edde41f106ed00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000001e4e9e05c420000000000000000000000004200000000000000000000000000000000000018000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000249f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000001049623609d00000000000000000000000042000000000000000000000000000000000000110000000000000000000000006ca5002ca794cfeebc0ec0d04ef89a382bb3942500000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000064b49dc74100000000000000000000000055555555555555555555555555555555555555550000000000000000000000000000000000000000000000000de0b6b3a76400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000beb5fc579115071764c7423a4f12edde41f106ed0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000001104e9e05c4200000000000000000000000013b0d85ccb8bf860b6b79af3029fca081ae9bef2000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000de2b0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000102466cfa05700000000000000000000000000000000000000000000000000000000000000007a2bde9cfb7f80a4198677bdf885a43dc36c598688294f694cf64429164f140000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000f8f6080604052348015600e575f80fd5b5060156019565b60c9565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff161560685760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b039081161460c65780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b610eb9806100d65f395ff3fe6080604052600436106100d1575f3560e01c806382356d8a1161007c57806385b5b14d1161005757806385b5b14d14610276578063b49dc74114610295578063d0e12f90146102b4578063d3e5792b146102e3575f80fd5b806382356d8a1461020f5780638312f1491461024d57806384411d6514610262575f80fd5b80633ccfd60b116100ac5780633ccfd60b1461016c57806354fd4d501461018e57806366d003ac146101e3575f80fd5b80630d9019e1146100dc578063307f29621461012c5780633bbed4a01461014d575f80fd5b366100d857005b5f80fd5b3480156100e7575f80fd5b5060025473ffffffffffffffffffffffffffffffffffffffff165b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b348015610137575f80fd5b5061014b610146366004610c86565b6102f7565b005b348015610158575f80fd5b5061014b610167366004610cc3565b61047a565b348015610177575f80fd5b506101806105de565b604051908152602001610123565b348015610199575f80fd5b506101d66040518060400160405280600581526020017f312e362e3000000000000000000000000000000000000000000000000000000081525081565b6040516101239190610cde565b3480156101ee575f80fd5b506002546101029073ffffffffffffffffffffffffffffffffffffffff1681565b34801561021a575f80fd5b506002546102409074010000000000000000000000000000000000000000900460ff1681565b6040516101239190610d97565b348015610258575f80fd5b5061018060015481565b34801561026d575f80fd5b506101805f5481565b348015610281575f80fd5b5061014b610290366004610dab565b610918565b3480156102a0575f80fd5b5061014b6102af366004610dc2565b610a3b565b3480156102bf575f80fd5b5060025474010000000000000000000000000000000000000000900460ff16610240565b3480156102ee575f80fd5b50600154610180565b73420000000000000000000000000000000000001873ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610354573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906103789190610dfd565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146103dc576040517f7cd7e09f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600280547401000000000000000000000000000000000000000080820460ff1692849290917fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff9091169083600181111561043857610438610d31565b02179055507ff2ec44eb1c3b3acd547b76333eb2c4b27eee311860c57a9fdb04c95f62398fc8818360405161046e929190610e18565b60405180910390a15050565b73420000000000000000000000000000000000001873ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156104d7573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104fb9190610dfd565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461055f576040517f7cd7e09f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff000000000000000000000000000000000000000083168117909355604080519190921680825260208201939093527f62e69886a5df0ba8ffcacbfc1388754e7abd9bde24b036354c561f1acd4e4593910161046e565b5f60015447101561069c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604a60248201527f4665655661756c743a207769746864726177616c20616d6f756e74206d75737460448201527f2062652067726561746572207468616e206d696e696d756d207769746864726160648201527f77616c20616d6f756e7400000000000000000000000000000000000000000000608482015260a4015b60405180910390fd5b479050805f808282546106af9190610e33565b90915550506002546040805183815273ffffffffffffffffffffffffffffffffffffffff90921660208301523382820152517fc8a211cc64b6ed1b50595a9fcb1932b6d1e5a6e8ef15b60e5b1f988ea9086bba9181900360600190a16002546040517f38e04cbeb8c10f8f568618aa75be0f10b6729b8b4237743b4de20cbcde2839ee9161077491849173ffffffffffffffffffffffffffffffffffffffff811691339174010000000000000000000000000000000000000000900460ff1690610e6b565b60405180910390a1600160025474010000000000000000000000000000000000000000900460ff1660018111156107ad576107ad610d31565b0361086a576002545f906107d79073ffffffffffffffffffffffffffffffffffffffff1683610c4f565b905080610866576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f4665655661756c743a206661696c656420746f2073656e642045544820746f2060448201527f4c322066656520726563697069656e74000000000000000000000000000000006064820152608401610693565b5090565b6002546040517fc2b3e5ac00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff909116600482015262061a806024820152606060448201525f60648201527342000000000000000000000000000000000000169063c2b3e5ac9083906084015f604051808303818588803b1580156108fe575f80fd5b505af1158015610910573d5f803e3d5ffd5b505050505090565b73420000000000000000000000000000000000001873ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610975573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109999190610dfd565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146109fd576040517f7cd7e09f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600180549082905560408051828152602081018490527f895a067c78583e800418fabf3da26a9496aab2ff3429cebdf7fefa642b2e4203910161046e565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000810460ff16159067ffffffffffffffff165f81158015610a855750825b90505f8267ffffffffffffffff166001148015610aa15750303b155b905081158015610aaf575080155b15610ae6576040517ff92ee8a900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b84547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001660011785558315610b475784547fffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffff16680100000000000000001785555b6002805473ffffffffffffffffffffffffffffffffffffffff8a167fffffffffffffffffffffffff000000000000000000000000000000000000000082168117835560018a81558993927fffffffffffffffffffffff000000000000000000000000000000000000000000169091179074010000000000000000000000000000000000000000908490811115610bdf57610bdf610d31565b02179055508315610c455784547fffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffff168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b5050505050505050565b5f610c5b835a84610c62565b9392505050565b5f805f805f858888f1949350505050565b803560028110610c81575f80fd5b919050565b5f60208284031215610c96575f80fd5b610c5b82610c73565b73ffffffffffffffffffffffffffffffffffffffff81168114610cc0575f80fd5b50565b5f60208284031215610cd3575f80fd5b8135610c5b81610c9f565b602081525f82518060208401528060208501604085015e5f6040828501015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011684010191505092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b60028110610d93577f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b9052565b60208101610da58284610d5e565b92915050565b5f60208284031215610dbb575f80fd5b5035919050565b5f805f60608486031215610dd4575f80fd5b8335610ddf81610c9f565b925060208401359150610df460408501610c73565b90509250925092565b5f60208284031215610e0d575f80fd5b8151610c5b81610c9f565b60408101610e268285610d5e565b610c5b6020830184610d5e565b80820180821115610da5577f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b84815273ffffffffffffffffffffffffffffffffffffffff84811660208301528316604082015260808101610ea36060830184610d5e565b9594505050505056fea164736f6c6343000819000a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000beb5fc579115071764c7423a4f12edde41f106ed00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000001e4e9e05c420000000000000000000000004200000000000000000000000000000000000018000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000249f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000001049623609d00000000000000000000000042000000000000000000000000000000000000190000000000000000000000003240dd3b3ba917563f63ea129cddff7fb696070500000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000064b49dc74100000000000000000000000033333333333333333333333333333333333333330000000000000000000000000000000000000000000000000de0b6b3a76400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000beb5fc579115071764c7423a4f12edde41f106ed0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000001104e9e05c4200000000000000000000000013b0d85ccb8bf860b6b79af3029fca081ae9bef2000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000de2b0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000102466cfa05700000000000000000000000000000000000000000000000000000000000000004ac8e160bee0acc95b22d1744fa9cc7068869945397f78a77ed68ef8ae1d87a900000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000f8f6080604052348015600e575f80fd5b5060156019565b60c9565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff161560685760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b039081161460c65780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b610eb9806100d65f395ff3fe6080604052600436106100d1575f3560e01c806382356d8a1161007c57806385b5b14d1161005757806385b5b14d14610276578063b49dc74114610295578063d0e12f90146102b4578063d3e5792b146102e3575f80fd5b806382356d8a1461020f5780638312f1491461024d57806384411d6514610262575f80fd5b80633ccfd60b116100ac5780633ccfd60b1461016c57806354fd4d501461018e57806366d003ac146101e3575f80fd5b80630d9019e1146100dc578063307f29621461012c5780633bbed4a01461014d575f80fd5b366100d857005b5f80fd5b3480156100e7575f80fd5b5060025473ffffffffffffffffffffffffffffffffffffffff165b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b348015610137575f80fd5b5061014b610146366004610c86565b6102f7565b005b348015610158575f80fd5b5061014b610167366004610cc3565b61047a565b348015610177575f80fd5b506101806105de565b604051908152602001610123565b348015610199575f80fd5b506101d66040518060400160405280600581526020017f312e362e3000000000000000000000000000000000000000000000000000000081525081565b6040516101239190610cde565b3480156101ee575f80fd5b506002546101029073ffffffffffffffffffffffffffffffffffffffff1681565b34801561021a575f80fd5b506002546102409074010000000000000000000000000000000000000000900460ff1681565b6040516101239190610d97565b348015610258575f80fd5b5061018060015481565b34801561026d575f80fd5b506101805f5481565b348015610281575f80fd5b5061014b610290366004610dab565b610918565b3480156102a0575f80fd5b5061014b6102af366004610dc2565b610a3b565b3480156102bf575f80fd5b5060025474010000000000000000000000000000000000000000900460ff16610240565b3480156102ee575f80fd5b50600154610180565b73420000000000000000000000000000000000001873ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610354573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906103789190610dfd565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146103dc576040517f7cd7e09f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600280547401000000000000000000000000000000000000000080820460ff1692849290917fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff9091169083600181111561043857610438610d31565b02179055507ff2ec44eb1c3b3acd547b76333eb2c4b27eee311860c57a9fdb04c95f62398fc8818360405161046e929190610e18565b60405180910390a15050565b73420000000000000000000000000000000000001873ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156104d7573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104fb9190610dfd565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461055f576040517f7cd7e09f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff000000000000000000000000000000000000000083168117909355604080519190921680825260208201939093527f62e69886a5df0ba8ffcacbfc1388754e7abd9bde24b036354c561f1acd4e4593910161046e565b5f60015447101561069c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604a60248201527f4665655661756c743a207769746864726177616c20616d6f756e74206d75737460448201527f2062652067726561746572207468616e206d696e696d756d207769746864726160648201527f77616c20616d6f756e7400000000000000000000000000000000000000000000608482015260a4015b60405180910390fd5b479050805f808282546106af9190610e33565b90915550506002546040805183815273ffffffffffffffffffffffffffffffffffffffff90921660208301523382820152517fc8a211cc64b6ed1b50595a9fcb1932b6d1e5a6e8ef15b60e5b1f988ea9086bba9181900360600190a16002546040517f38e04cbeb8c10f8f568618aa75be0f10b6729b8b4237743b4de20cbcde2839ee9161077491849173ffffffffffffffffffffffffffffffffffffffff811691339174010000000000000000000000000000000000000000900460ff1690610e6b565b60405180910390a1600160025474010000000000000000000000000000000000000000900460ff1660018111156107ad576107ad610d31565b0361086a576002545f906107d79073ffffffffffffffffffffffffffffffffffffffff1683610c4f565b905080610866576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f4665655661756c743a206661696c656420746f2073656e642045544820746f2060448201527f4c322066656520726563697069656e74000000000000000000000000000000006064820152608401610693565b5090565b6002546040517fc2b3e5ac00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff909116600482015262061a806024820152606060448201525f60648201527342000000000000000000000000000000000000169063c2b3e5ac9083906084015f604051808303818588803b1580156108fe575f80fd5b505af1158015610910573d5f803e3d5ffd5b505050505090565b73420000000000000000000000000000000000001873ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610975573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109999190610dfd565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146109fd576040517f7cd7e09f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600180549082905560408051828152602081018490527f895a067c78583e800418fabf3da26a9496aab2ff3429cebdf7fefa642b2e4203910161046e565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000810460ff16159067ffffffffffffffff165f81158015610a855750825b90505f8267ffffffffffffffff166001148015610aa15750303b155b905081158015610aaf575080155b15610ae6576040517ff92ee8a900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b84547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001660011785558315610b475784547fffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffff16680100000000000000001785555b6002805473ffffffffffffffffffffffffffffffffffffffff8a167fffffffffffffffffffffffff000000000000000000000000000000000000000082168117835560018a81558993927fffffffffffffffffffffff000000000000000000000000000000000000000000169091179074010000000000000000000000000000000000000000908490811115610bdf57610bdf610d31565b02179055508315610c455784547fffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffff168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b5050505050505050565b5f610c5b835a84610c62565b9392505050565b5f805f805f858888f1949350505050565b803560028110610c81575f80fd5b919050565b5f60208284031215610c96575f80fd5b610c5b82610c73565b73ffffffffffffffffffffffffffffffffffffffff81168114610cc0575f80fd5b50565b5f60208284031215610cd3575f80fd5b8135610c5b81610c9f565b602081525f82518060208401528060208501604085015e5f6040828501015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011684010191505092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b60028110610d93577f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b9052565b60208101610da58284610d5e565b92915050565b5f60208284031215610dbb575f80fd5b5035919050565b5f805f60608486031215610dd4575f80fd5b8335610ddf81610c9f565b925060208401359150610df460408501610c73565b90509250925092565b5f60208284031215610e0d575f80fd5b8151610c5b81610c9f565b60408101610e268285610d5e565b610c5b6020830184610d5e565b80820180821115610da5577f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b84815273ffffffffffffffffffffffffffffffffffffffff84811660208301528316604082015260808101610ea36060830184610d5e565b9594505050505056fea164736f6c6343000819000a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000beb5fc579115071764c7423a4f12edde41f106ed00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000001e4e9e05c420000000000000000000000004200000000000000000000000000000000000018000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000249f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000001049623609d000000000000000000000000420000000000000000000000000000000000001a0000000000000000000000006b692240ef7a6b18aaf63a56a94d423c1b5cec0a00000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000064b49dc74100000000000000000000000044444444444444444444444444444444444444440000000000000000000000000000000000000000000000000de0b6b3a76400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"; MultisigTask multisigTask = new RevenueShareV100UpgradePath(); address rootSafe = address(0x5a0Aae59D09fccBdDb6C6CcEB07B7279367C3d2A); // L1PAO address securityCouncilChildMultisig = address(0xc2819DC788505Aac350142A7A707BF9D03E3Bd03); @@ -938,10 +938,10 @@ contract RegressionTest is Test { string[] memory expectedDataToSign = new string[](2); // Foundation expectedDataToSign[0] = - "0x1901a4a9c312badf3fcaa05eafe5dc9bee8bd9316c78ee8b0bebe3115bb21b7326720fcac3c106c785224ef903950a68b26a207774df0678d827e05193070a0bccb1"; + "0x1901a4a9c312badf3fcaa05eafe5dc9bee8bd9316c78ee8b0bebe3115bb21b73267239c98a2190652e75765bd0ea126d17bac09e3b1d5fbc0279c907394fb2b84c19"; // Security Council expectedDataToSign[1] = - "0x1901df53d510b56e539b90b369ef08fce3631020fbf921e3136ea5f8747c20bce96711b7f5b7a1340529fc0442b8beb32a2df55edd7fb2d6c77f35ed285cd6bcc267"; + "0x1901df53d510b56e539b90b369ef08fce3631020fbf921e3136ea5f8747c20bce9670525b8e323c17ad930925c81e1673aaafc2005d19738ef733095ce585329714f"; _assertDataToSignNestedMultisig(multisigTask, actions, expectedDataToSign, MULTICALL3_ADDRESS, rootSafe); } diff --git a/test/tasks/example/eth/019-revenueshare-upgrade-opt-out/config.toml b/test/tasks/example/eth/019-revenueshare-upgrade-opt-out/config.toml index 2bd40a4548..559b1eea89 100644 --- a/test/tasks/example/eth/019-revenueshare-upgrade-opt-out/config.toml +++ b/test/tasks/example/eth/019-revenueshare-upgrade-opt-out/config.toml @@ -6,7 +6,6 @@ optInRevenueShare = false # Portal and deployment configuration portal = "0xbEb5Fc579115071764c7423A4f12eDde41f106Ed" # OptimismPortal address saltSeed = "DeploymentSalt" # Deployment salt -deploymentGasLimit = 1000000 # Vaults Configuration baseFeeVaultWithdrawalNetwork = 0 diff --git a/test/template/RevenueShareUpgradePath.t.sol b/test/template/RevenueShareUpgradePath.t.sol index 2efd463dca..1dc7646b3c 100644 --- a/test/template/RevenueShareUpgradePath.t.sol +++ b/test/template/RevenueShareUpgradePath.t.sol @@ -26,7 +26,10 @@ interface ICreate2Deployer { interface IProxyAdmin { function upgrade(address _proxy, address _implementation) external; - function upgradeAndCall(address _proxy, address _implementation, bytes memory _data) external payable returns (bytes memory); + function upgradeAndCall(address _proxy, address _implementation, bytes memory _data) + external + payable + returns (bytes memory); } contract RevenueShareUpgradePathTest is Test { @@ -338,10 +341,7 @@ contract RevenueShareUpgradePathTest is Test { /// @notice Verify the target address is the proxy admin /// @param _to The target address function _assertIsProxyAdmin(address _to) internal pure { - assertTrue( - _to == PROXY_ADMIN, - "Upgrade should target the proxy admin" - ); + assertTrue(_to == PROXY_ADMIN, "Upgrade should target the proxy admin"); } /// @notice Expect the portal events @@ -355,7 +355,9 @@ contract RevenueShareUpgradePathTest is Test { bytes memory _opaqueData = abi.encodePacked(uint256(0), uint256(0), _actualGasLimit, _isCreation, _data); vm.expectEmit(true, true, true, true, PORTAL); - emit TransactionDeposited(AddressAliasHelper.applyL1ToL2Alias(PROXY_ADMIN_OWNER), _to, DEPOSIT_VERSION, _opaqueData); + emit TransactionDeposited( + AddressAliasHelper.applyL1ToL2Alias(PROXY_ADMIN_OWNER), _to, DEPOSIT_VERSION, _opaqueData + ); } } }