0 txs
98 calls
constructor
constructor(address mToken_, address registrar_)
functions
DEFAULT_ADMIN_ROLE
viewfunction DEFAULT_ADMIN_ROLE() view returns (bytes32)
EARNERS_LIST_IGNORED_KEY
viewfunction EARNERS_LIST_IGNORED_KEY() view returns (bytes32)
EARNERS_LIST_NAME
viewfunction EARNERS_LIST_NAME() view returns (bytes32)
getRoleAdmin
viewfunction getRoleAdmin(bytes32 role) view returns (bytes32)
hasRole
viewfunction hasRole(bytes32 role, address account) view returns (bool)
isMSwapper
viewfunction isMSwapper(address swapper) view returns (bool)
isPermissionedExtension
viewfunction isPermissionedExtension(address extension) view returns (bool)
isPermissionedMSwapper
viewfunction isPermissionedMSwapper(address extension, address swapper) view returns (bool)
isTrustedRouter
viewfunction isTrustedRouter(address router) view returns (bool)
M_SWAPPER_ROLE
viewfunction M_SWAPPER_ROLE() view returns (bytes32)
msgSender
viewfunction msgSender() view returns (address)
mToken
viewfunction mToken() view returns (address)
registrar
viewfunction registrar() view returns (address)
supportsInterface
viewfunction supportsInterface(bytes4 interfaceId) view returns (bool)
grantRole
nonpayablefunction grantRole(bytes32 role, address account)
initialize
nonpayablefunction initialize(address admin)
renounceRole
nonpayablefunction renounceRole(bytes32 role, address callerConfirmation)
revokeRole
nonpayablefunction revokeRole(bytes32 role, address account)
setPermissionedExtension
nonpayablefunction setPermissionedExtension(address extension, bool permissioned)
setPermissionedMSwapper
nonpayablefunction setPermissionedMSwapper(address extension, address swapper, bool allowed)
setTrustedRouter
nonpayablefunction setTrustedRouter(address router, bool trusted)
swap
nonpayablefunction swap(address extensionIn, address extensionOut, uint256 amount, address recipient)
swapInM
nonpayablefunction swapInM(address extensionOut, uint256 amount, address recipient)
swapInMWithPermit
nonpayablefunction swapInMWithPermit(address extensionOut, uint256 amount, address recipient, uint256 deadline, bytes signature)
swapInMWithPermit
nonpayablefunction swapInMWithPermit(address extensionOut, uint256 amount, address recipient, uint256 deadline, uint8 v, bytes32 r, bytes32 s)
swapOutM
nonpayablefunction swapOutM(address extensionIn, uint256 amount, address recipient)
swapOutMWithPermit
nonpayablefunction swapOutMWithPermit(address extensionIn, uint256 amount, address recipient, uint256 deadline, bytes signature)
swapOutMWithPermit
nonpayablefunction swapOutMWithPermit(address extensionIn, uint256 amount, address recipient, uint256 deadline, uint8 v, bytes32 r, bytes32 s)
swapWithPermit
nonpayablefunction swapWithPermit(address extensionIn, address extensionOut, uint256 amount, address recipient, uint256 deadline, bytes signature)
swapWithPermit
nonpayablefunction swapWithPermit(address extensionIn, address extensionOut, uint256 amount, address recipient, uint256 deadline, uint8 v, bytes32 r, bytes32 s)
events
Initialized
event Initialized(uint64 version)
PermissionedExtensionSet
event PermissionedExtensionSet(address indexed extension, bool allowed)
PermissionedMSwapperSet
event PermissionedMSwapperSet(address indexed extension, address indexed swapper, bool allowed)
RoleAdminChanged
event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole)
RoleGranted
event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender)
RoleRevoked
event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender)
Swapped
event Swapped(address indexed extensionIn, address indexed extensionOut, uint256 amount, address indexed recipient)
SwappedInM
event SwappedInM(address indexed extensionOut, uint256 amount, address indexed recipient)
SwappedOutM
event SwappedOutM(address indexed extensionIn, uint256 amount, address indexed recipient)
TrustedRouterSet
event TrustedRouterSet(address indexed router, bool trusted)
errors
AccessControlBadConfirmation
error AccessControlBadConfirmation()
AccessControlUnauthorizedAccount
error AccessControlUnauthorizedAccount(address account, bytes32 neededRole)
ContractLocked
error ContractLocked()
InvalidInitialization
error InvalidInitialization()
NotApprovedExtension
error NotApprovedExtension(address extension)
NotApprovedPermissionedSwapper
error NotApprovedPermissionedSwapper(address extension, address swapper)
NotApprovedSwapper
error NotApprovedSwapper(address extension, address swapper)
NotInitializing
error NotInitializing()
PermissionedExtension
error PermissionedExtension(address extension)
ZeroAdmin
error ZeroAdmin()
ZeroExtension
error ZeroExtension()
ZeroMToken
error ZeroMToken()
ZeroRegistrar
error ZeroRegistrar()
ZeroRouter
error ZeroRouter()
ZeroSwapper
error ZeroSwapper()
creation bytecode
0x60c060405234801561000f575f80fd5b506040516131ed3803806131ed83398101604081905261002e91610162565b610036610095565b6001600160a01b03821660808190526100625760405163b01d5e2b60e01b815260040160405180910390fd5b6001600160a01b03811660a081905261008e576040516379a6314960e01b815260040160405180910390fd5b5050610193565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100e55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101445780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b80516001600160a01b038116811461015d575f80fd5b919050565b5f8060408385031215610173575f80fd5b61017c83610147565b915061018a60208401610147565b90509250929050565b60805160a051612ffa6101f35f395f81816102d9015281816128fb01526129ec01525f81816104dd015281816107680152818161143601528181611afe01528181611bca01528181611ed4015281816123ef01526127580152612ffa5ff3fe608060405234801561000f575f80fd5b50600436106101d1575f3560e01c8063799c44b2116100fe578063c3b6f9391161009e578063d547741f1161006e578063d547741f14610538578063d737d0c71461054b578063de3d425414610572578063e274ffb814610585575f80fd5b8063c3b6f939146104d8578063c4d66de8146104ff578063c64f535114610512578063ccf43d2f14610525575f80fd5b8063a217fddf116100d9578063a217fddf14610484578063a8ffb8a51461048b578063aaaad098146104b2578063af870157146104c5575f80fd5b8063799c44b2146103fa57806391d148541461040d5780639e5e91f414610471575f80fd5b80632af4d36e116101745780635a734520116101445780635a734520146103465780635d77e1ca1461036d57806360657bc6146103805780636e81221c146103e7575f80fd5b80632af4d36e146102c15780632b20e397146102d45780632f2ff15d1461032057806336568abe14610333575f80fd5b8063135597c3116101af578063135597c31461024757806314217eed1461025a578063248a9ca31461026d578063264e97e0146102ae575f80fd5b806301ffc9a7146101d55780630a85ce8c146101fd5780630cf52c2714610232575b5f80fd5b6101e86101e3366004612a73565b610598565b60405190151581526020015b60405180910390f35b6102247f6561726e6572735f6c6973745f69676e6f72656400000000000000000000000081565b6040519081526020016101f4565b610245610240366004612b1f565b610630565b005b6101e8610255366004612b96565b6107ed565b610245610268366004612bc6565b61083e565b61022461027b366004612c42565b5f9081527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b626800602052604090206001015490565b6101e86102bc366004612b96565b6109fa565b6102456102cf366004612c66565b610a21565b6102fb7f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101f4565b61024561032e366004612c9d565b610b36565b610245610341366004612c9d565b610b7f565b6102247f6561726e6572730000000000000000000000000000000000000000000000000081565b61024561037b366004612cc0565b610bd8565b6101e861038e366004612d49565b73ffffffffffffffffffffffffffffffffffffffff9182165f9081527f2f6671d90ec6fb8a38d5fa4043e503b2789e716b6e5219d1b20da9c6434dde016020908152604080832093909416825291909152205460ff1690565b6102456103f5366004612d75565b610d77565b610245610408366004612dc5565b610e8e565b6101e861041b366004612c9d565b5f9182527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b6268006020908152604080842073ffffffffffffffffffffffffffffffffffffffff93909316845291905290205460ff1690565b61024561047f366004612e0d565b611048565b6102245f81565b6102247fafa8499804819c4de3fc4b1a2e9723737c59b02467b5c043939709ac9f066b4381565b6102456104c0366004612b1f565b611157565b6102456104d3366004612e41565b6112e2565b6102fb7f000000000000000000000000000000000000000000000000000000000000000081565b61024561050d366004612b96565b6114a9565b610245610520366004612c66565b611612565b610245610533366004612e41565b61174e565b610245610546366004612c9d565b6118f5565b7f0aedd6bde10e3aa2adec092b02a3e3e805795516cda41f27aa145b8f300af87a5c6102fb565b6101e8610580366004612b96565b611938565b610245610593366004612e0d565b611984565b5f7fffffffff0000000000000000000000000000000000000000000000000000000082167f7965db0b00000000000000000000000000000000000000000000000000000000148061062a57507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b92915050565b73ffffffffffffffffffffffffffffffffffffffff7f0aedd6bde10e3aa2adec092b02a3e3e805795516cda41f27aa145b8f300af87a5c161561069f576040517f6f5ffb7e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f6106a9336109fa565b6106b35733610720565b3373ffffffffffffffffffffffffffffffffffffffff1663d737d0c76040518163ffffffff1660e01b8152600401602060405180830381865afa1580156106fc573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107209190612eab565b905061072b81611a8a565b6040517f9fd5a6cf00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001690639fd5a6cf906107a790339030908b908a908a908a90600401612ec6565b5f604051808303815f87803b1580156107be575f80fd5b505af19250505080156107cf575060015b506107db878787611ab0565b6107e45f611a8a565b50505050505050565b5f7f2f6671d90ec6fb8a38d5fa4043e503b2789e716b6e5219d1b20da9c6434dde005b73ffffffffffffffffffffffffffffffffffffffff9092165f90815260209290925250604090205460ff1690565b73ffffffffffffffffffffffffffffffffffffffff7f0aedd6bde10e3aa2adec092b02a3e3e805795516cda41f27aa145b8f300af87a5c16156108ad576040517f6f5ffb7e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f6108b7336109fa565b6108c1573361092e565b3373ffffffffffffffffffffffffffffffffffffffff1663d737d0c76040518163ffffffff1660e01b8152600401602060405180830381865afa15801561090a573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061092e9190612eab565b905061093981611a8a565b6040517fd505accf000000000000000000000000000000000000000000000000000000008152336004820152306024820152604481018890526064810186905260ff8516608482015260a4810184905260c4810183905273ffffffffffffffffffffffffffffffffffffffff8a169063d505accf9060e4015f604051808303815f87803b1580156109c8575f80fd5b505af19250505080156109d9575060015b506109e689898989611d24565b6109ef5f611a8a565b505050505050505050565b5f7f157708201859ed3ceee295d1baf4381ae5b622de496b1cee3705ed07c6a50200610810565b5f610a2b81612049565b73ffffffffffffffffffffffffffffffffffffffff8316610a78576040517f2359556c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b811515610a84846107ed565b151514610b315773ffffffffffffffffffffffffffffffffffffffff83165f8181527f2f6671d90ec6fb8a38d5fa4043e503b2789e716b6e5219d1b20da9c6434dde00602090815260409182902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016861515908117909155825190815291517fa1e65189c2e656be12ff01879244361cbbc5fe8a08224278b332004fe3489f589281900390910190a25b505050565b5f8281527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b6268006020526040902060010154610b6f81612049565b610b798383612056565b50505050565b73ffffffffffffffffffffffffffffffffffffffff81163314610bce576040517f6697b23200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610b318282612174565b73ffffffffffffffffffffffffffffffffffffffff7f0aedd6bde10e3aa2adec092b02a3e3e805795516cda41f27aa145b8f300af87a5c1615610c47576040517f6f5ffb7e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f610c51336109fa565b610c5b5733610cc8565b3373ffffffffffffffffffffffffffffffffffffffff1663d737d0c76040518163ffffffff1660e01b8152600401602060405180830381865afa158015610ca4573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610cc89190612eab565b9050610cd381611a8a565b6040517f9fd5a6cf00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff891690639fd5a6cf90610d2f90339030908b908a908a908a90600401612ec6565b5f604051808303815f87803b158015610d46575f80fd5b505af1925050508015610d57575060015b50610d6488888888611d24565b610d6d5f611a8a565b5050505050505050565b73ffffffffffffffffffffffffffffffffffffffff7f0aedd6bde10e3aa2adec092b02a3e3e805795516cda41f27aa145b8f300af87a5c1615610de6576040517f6f5ffb7e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f610df0336109fa565b610dfa5733610e67565b3373ffffffffffffffffffffffffffffffffffffffff1663d737d0c76040518163ffffffff1660e01b8152600401602060405180830381865afa158015610e43573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e679190612eab565b9050610e7281611a8a565b610e7e85858585611d24565b610e875f611a8a565b5050505050565b5f610e9881612049565b73ffffffffffffffffffffffffffffffffffffffff8416610ee5576040517f2359556c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8316610f32576040517f3099ab8800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8481165f9081527f2f6671d90ec6fb8a38d5fa4043e503b2789e716b6e5219d1b20da9c6434dde01602090815260408083209387168352929052205460ff16151582151514610b795773ffffffffffffffffffffffffffffffffffffffff8481165f8181527f2f6671d90ec6fb8a38d5fa4043e503b2789e716b6e5219d1b20da9c6434dde01602090815260408083209488168084529482529182902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001687151590811790915591519182527fe315f6e65becaee65bf0cbc2a489ea61e16e2ab2845a5aa3ec92420dc284117a91015b60405180910390a350505050565b73ffffffffffffffffffffffffffffffffffffffff7f0aedd6bde10e3aa2adec092b02a3e3e805795516cda41f27aa145b8f300af87a5c16156110b7576040517f6f5ffb7e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f6110c1336109fa565b6110cb5733611138565b3373ffffffffffffffffffffffffffffffffffffffff1663d737d0c76040518163ffffffff1660e01b8152600401602060405180830381865afa158015611114573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906111389190612eab565b905061114381611a8a565b61114e848484612250565b610b795f611a8a565b73ffffffffffffffffffffffffffffffffffffffff7f0aedd6bde10e3aa2adec092b02a3e3e805795516cda41f27aa145b8f300af87a5c16156111c6576040517f6f5ffb7e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f6111d0336109fa565b6111da5733611247565b3373ffffffffffffffffffffffffffffffffffffffff1663d737d0c76040518163ffffffff1660e01b8152600401602060405180830381865afa158015611223573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906112479190612eab565b905061125281611a8a565b6040517f9fd5a6cf00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff881690639fd5a6cf906112ae90339030908b908a908a908a90600401612ec6565b5f604051808303815f87803b1580156112c5575f80fd5b505af19250505080156112d6575060015b506107db878787612250565b73ffffffffffffffffffffffffffffffffffffffff7f0aedd6bde10e3aa2adec092b02a3e3e805795516cda41f27aa145b8f300af87a5c1615611351576040517f6f5ffb7e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f61135b336109fa565b61136557336113d2565b3373ffffffffffffffffffffffffffffffffffffffff1663d737d0c76040518163ffffffff1660e01b8152600401602060405180830381865afa1580156113ae573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906113d29190612eab565b90506113dd81611a8a565b6040517fd505accf000000000000000000000000000000000000000000000000000000008152336004820152306024820152604481018890526064810186905260ff8516608482015260a4810184905260c481018390527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169063d505accf9060e4015f604051808303815f87803b15801561148c575f80fd5b505af192505050801561149d575060015b50610d64888888611ab0565b5f6114b26124bb565b805490915060ff68010000000000000000820416159067ffffffffffffffff165f811580156114de5750825b90505f8267ffffffffffffffff1660011480156114fa5750303b155b905081158015611508575080155b1561153f576040517ff92ee8a900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b84547fffffffffffffffffffffffffffffffffffffffffffffffff000000000000000016600117855583156115a05784547fffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffff16680100000000000000001785555b6115a9866124e3565b831561160a5784547fffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffff168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b505050505050565b5f61161c81612049565b73ffffffffffffffffffffffffffffffffffffffff8316611669576040517f920d929200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff83165f9081527f157708201859ed3ceee295d1baf4381ae5b622de496b1cee3705ed07c6a50200602081905260409091205483151560ff9091161515036116c55750505050565b73ffffffffffffffffffffffffffffffffffffffff84165f818152602083815260409182902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001687151590811790915591519182527ff03b9904b8234e041267377d7a55ddb345d1ee737d0116a2e621e3a5fad07a7d910160405180910390a250505050565b73ffffffffffffffffffffffffffffffffffffffff7f0aedd6bde10e3aa2adec092b02a3e3e805795516cda41f27aa145b8f300af87a5c16156117bd576040517f6f5ffb7e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f6117c7336109fa565b6117d1573361183e565b3373ffffffffffffffffffffffffffffffffffffffff1663d737d0c76040518163ffffffff1660e01b8152600401602060405180830381865afa15801561181a573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061183e9190612eab565b905061184981611a8a565b6040517fd505accf000000000000000000000000000000000000000000000000000000008152336004820152306024820152604481018890526064810186905260ff8516608482015260a4810184905260c4810183905273ffffffffffffffffffffffffffffffffffffffff89169063d505accf9060e4015f604051808303815f87803b1580156118d8575f80fd5b505af19250505080156118e9575060015b50610d64888888612250565b5f8281527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b626800602052604090206001015461192e81612049565b610b798383612174565b73ffffffffffffffffffffffffffffffffffffffff81165f9081527f6b691b2d012e26a1efd9948ce05990847eae29d1cebd577c171024c61e06d6eb602052604081205460ff1661062a565b73ffffffffffffffffffffffffffffffffffffffff7f0aedd6bde10e3aa2adec092b02a3e3e805795516cda41f27aa145b8f300af87a5c16156119f3576040517f6f5ffb7e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f6119fd336109fa565b611a075733611a74565b3373ffffffffffffffffffffffffffffffffffffffff1663d737d0c76040518163ffffffff1660e01b8152600401602060405180830381865afa158015611a50573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611a749190612eab565b9050611a7f81611a8a565b61114e848484611ab0565b807f0aedd6bde10e3aa2adec092b02a3e3e805795516cda41f27aa145b8f300af87a5d50565b611ab983612546565b611ac383336125a2565b6040517f23b872dd000000000000000000000000000000000000000000000000000000008152336004820152306024820152604481018390527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906323b872dd906064016020604051808303815f875af1158015611b59573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611b7d9190612f5a565b506040517f095ea7b300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8481166004830152602482018490527f0000000000000000000000000000000000000000000000000000000000000000169063095ea7b3906044016020604051808303815f875af1158015611c10573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611c349190612f5a565b506040517fbf376c7a00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff82811660048301526024820184905284169063bf376c7a906044015f604051808303815f87803b158015611ca2575f80fd5b505af1158015611cb4573d5f803e3d5ffd5b505050508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fea5845e6161e56b30740f4a743f316fa77bd8f48b1c3ce6eff595ab0385ba74584604051611d1791815260200190565b60405180910390a3505050565b611d2d84612546565b611d3683612546565b611d3f846126b9565b611d48836126b9565b6040517f23b872dd0000000000000000000000000000000000000000000000000000000081523360048201523060248201526044810183905273ffffffffffffffffffffffffffffffffffffffff8516906323b872dd906064016020604051808303815f875af1158015611dbe573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611de29190612f5a565b505f611ded30612711565b6040517f39f476930000000000000000000000000000000000000000000000000000000081523060048201526024810185905290915073ffffffffffffffffffffffffffffffffffffffff8616906339f47693906044015f604051808303815f87803b158015611e5b575f80fd5b505af1158015611e6d573d5f803e3d5ffd5b5050505080611e7b30612711565b611e859190612f75565b6040517f095ea7b300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8681166004830152602482018390529194507f00000000000000000000000000000000000000000000000000000000000000009091169063095ea7b3906044016020604051808303815f875af1158015611f1c573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611f409190612f5a565b506040517fbf376c7a00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff83811660048301526024820185905285169063bf376c7a906044015f604051808303815f87803b158015611fae575f80fd5b505af1158015611fc0573d5f803e3d5ffd5b505050508173ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167f7621e0d883c1038028d167fa29ecc01dbb8bc0cf673db584432530d693259e518660405161203a91815260200190565b60405180910390a45050505050565b61205381336127c3565b50565b5f8281527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b6268006020818152604080842073ffffffffffffffffffffffffffffffffffffffff8616855290915282205460ff1661216b575f8481526020828152604080832073ffffffffffffffffffffffffffffffffffffffff87168452909152902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790556121073390565b73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16857f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a4600191505061062a565b5f91505061062a565b5f8281527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b6268006020818152604080842073ffffffffffffffffffffffffffffffffffffffff8616855290915282205460ff161561216b575f8481526020828152604080832073ffffffffffffffffffffffffffffffffffffffff8716808552925280832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905551339287917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a4600191505061062a565b61225983612546565b61226383336125a2565b6040517f23b872dd0000000000000000000000000000000000000000000000000000000081523360048201523060248201526044810183905273ffffffffffffffffffffffffffffffffffffffff8416906323b872dd906064016020604051808303815f875af11580156122d9573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906122fd9190612f5a565b505f61230830612711565b6040517f39f476930000000000000000000000000000000000000000000000000000000081523060048201526024810185905290915073ffffffffffffffffffffffffffffffffffffffff8516906339f47693906044015f604051808303815f87803b158015612376575f80fd5b505af1158015612388573d5f803e3d5ffd5b505050508061239630612711565b6123a09190612f75565b6040517fa9059cbb00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8481166004830152602482018390529194507f00000000000000000000000000000000000000000000000000000000000000009091169063a9059cbb906044016020604051808303815f875af1158015612437573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061245b9190612f5a565b508173ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f20715489f1868041ab913834efbaabc996170336daf633a4999d62bd5c162f088560405161103a91815260200190565b5f807ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0061062a565b6124eb612869565b73ffffffffffffffffffffffffffffffffffffffff8116612538576040517f7289db0e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6125425f82612056565b5050565b61254f816128a9565b612053576040517f2d32af6000000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff821660048201526024015b60405180910390fd5b6125ab826107ed565b1561265a5773ffffffffffffffffffffffffffffffffffffffff8083165f9081527f2f6671d90ec6fb8a38d5fa4043e503b2789e716b6e5219d1b20da9c6434dde01602090815260408083209385168352929052205460ff16612542576040517fe5fae0d000000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff808416600483015282166024820152604401612599565b61266381611938565b612542576040517f10833dfe00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff808416600483015282166024820152604401612599565b6126c2816107ed565b15612053576040517f0bc7a0d000000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff82166004820152602401612599565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff82811660048301525f917f0000000000000000000000000000000000000000000000000000000000000000909116906370a0823190602401602060405180830381865afa15801561279f573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061062a9190612fad565b5f8281527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b6268006020908152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915290205460ff16612542576040517fe2517d3f00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8216600482015260248101839052604401612599565b612871612a55565b6128a7576040517fd7e6bcf800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b6040517f8eaa6ac00000000000000000000000000000000000000000000000000000000081527f6561726e6572735f6c6973745f69676e6f72656400000000000000000000000060048201525f9081907f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690638eaa6ac090602401602060405180830381865afa158015612955573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906129799190612fad565b14158061062a57506040517fd7d1c1c00000000000000000000000000000000000000000000000000000000081527f6561726e65727300000000000000000000000000000000000000000000000000600482015273ffffffffffffffffffffffffffffffffffffffff83811660248301527f0000000000000000000000000000000000000000000000000000000000000000169063d7d1c1c090604401602060405180830381865afa158015612a31573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061062a9190612f5a565b5f612a5e6124bb565b5468010000000000000000900460ff16919050565b5f60208284031215612a83575f80fd5b81357fffffffff0000000000000000000000000000000000000000000000000000000081168114612ab2575f80fd5b9392505050565b73ffffffffffffffffffffffffffffffffffffffff81168114612053575f80fd5b5f8083601f840112612aea575f80fd5b50813567ffffffffffffffff811115612b01575f80fd5b602083019150836020828501011115612b18575f80fd5b9250929050565b5f805f805f8060a08789031215612b34575f80fd5b8635612b3f81612ab9565b9550602087013594506040870135612b5681612ab9565b935060608701359250608087013567ffffffffffffffff811115612b78575f80fd5b612b8489828a01612ada565b979a9699509497509295939492505050565b5f60208284031215612ba6575f80fd5b8135612ab281612ab9565b803560ff81168114612bc1575f80fd5b919050565b5f805f805f805f80610100898b031215612bde575f80fd5b8835612be981612ab9565b97506020890135612bf981612ab9565b9650604089013595506060890135612c1081612ab9565b945060808901359350612c2560a08a01612bb1565b979a969950949793969295929450505060c08201359160e0013590565b5f60208284031215612c52575f80fd5b5035919050565b8015158114612053575f80fd5b5f8060408385031215612c77575f80fd5b8235612c8281612ab9565b91506020830135612c9281612c59565b809150509250929050565b5f8060408385031215612cae575f80fd5b823591506020830135612c9281612ab9565b5f805f805f805f60c0888a031215612cd6575f80fd5b8735612ce181612ab9565b96506020880135612cf181612ab9565b9550604088013594506060880135612d0881612ab9565b93506080880135925060a088013567ffffffffffffffff811115612d2a575f80fd5b612d368a828b01612ada565b989b979a50959850939692959293505050565b5f8060408385031215612d5a575f80fd5b8235612d6581612ab9565b91506020830135612c9281612ab9565b5f805f8060808587031215612d88575f80fd5b8435612d9381612ab9565b93506020850135612da381612ab9565b9250604085013591506060850135612dba81612ab9565b939692955090935050565b5f805f60608486031215612dd7575f80fd5b8335612de281612ab9565b92506020840135612df281612ab9565b91506040840135612e0281612c59565b809150509250925092565b5f805f60608486031215612e1f575f80fd5b8335612e2a81612ab9565b9250602084013591506040840135612e0281612ab9565b5f805f805f805f60e0888a031215612e57575f80fd5b8735612e6281612ab9565b9650602088013595506040880135612e7981612ab9565b945060608801359350612e8e60808901612bb1565b9699959850939692959460a0840135945060c09093013592915050565b5f60208284031215612ebb575f80fd5b8151612ab281612ab9565b73ffffffffffffffffffffffffffffffffffffffff8716815273ffffffffffffffffffffffffffffffffffffffff8616602082015284604082015283606082015260a060808201528160a0820152818360c08301375f81830160c090810191909152601f9092017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016010195945050505050565b5f60208284031215612f6a575f80fd5b8151612ab281612c59565b8181038181111561062a577f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f60208284031215612fbd575f80fd5b505191905056fea2646970667358221220b81e8e78f99959e71c24e1d630d5ddc81aec117926f37066ed07ada416007e6464736f6c634300081a0033000000000000000000000000866a2bf4e572cbcf37d5071a7a58503bfb36be1b000000000000000000000000119fbeedd4f4f4298fb59b720d5654442b81ae2c