0 txs
41 calls
constructor
constructor(address _factory, address _royaltyExecutor, address _feeManager, address _oraOracleDelegateCaller)
functions
DEFAULT_FEE_BPS
viewfunction DEFAULT_FEE_BPS() view returns (uint16)
DEFAULT_PROTOCOL_FEE_BPS
viewfunction DEFAULT_PROTOCOL_FEE_BPS() view returns (uint16)
factory
viewfunction factory() view returns (address)
feeManager
viewfunction feeManager() view returns (address)
getBuyCoverNFTQuote
viewfunction getBuyCoverNFTQuote() view returns (tuple quote)
getBuyNFTQuote
viewfunction getBuyNFTQuote(uint256 assetId, uint256 numItems, bool isPick) view returns (tuple quote)
getPresaleQuote
viewfunction getPresaleQuote(uint256 assetId, uint256 numItems) view returns (tuple quote)
getSellNFTQuote
viewfunction getSellNFTQuote(uint256 assetId, uint256 numItems) view returns (tuple quote)
nextUnIssuedTokenId
viewfunction nextUnIssuedTokenId() view returns (uint256)
nft
viewfunction nft() view returns (address)
nftTotalSupply
viewfunction nftTotalSupply() view returns (uint256)
oraOracleDelegateCaller
viewfunction oraOracleDelegateCaller() view returns (address)
owner
viewfunction owner() view returns (address)
pairType
purefunction pairType() pure returns (uint8)
pairVariant
purefunction pairVariant() pure returns (uint8)
presalePurchasePerAddress
viewfunction presalePurchasePerAddress(address) view returns (uint256)
propertyChecker
viewfunction propertyChecker() view returns (address)
royaltyExecutor
viewfunction royaltyExecutor() view returns (address)
salesConfig
viewfunction salesConfig() view returns (uint32 maxPresalePurchasePerAddress, uint32 presaleMaxAmount, uint64 presaleStart, uint64 presaleEnd, uint64 publicSaleStart, uint96 presalePrice, address bondingCurve, bytes32 presaleMerkleRoot)
token
viewfunction token() view returns (address)
buyCoverNFT
payablefunction buyCoverNFT(address nftRecipient, bool isRouter, address routerCaller) payable returns (uint256 inputAmount, tuple revealFee)
initialize
nonpayablefunction initialize(address _owner, address _token, address _nft, address _propertyChecker, uint256 _nftTotalSupply, tuple _salesConfig)
purchasePresale
payablefunction purchasePresale(uint256 nftAmount, address nftRecipient, bytes32[] merkleProof, bool isRouter, address routerCaller) payable returns (uint256 nftOuputAmount, uint256 inputAmount, tuple revealFee)
renounceOwnership
nonpayablefunction renounceOwnership()
setPresaleMerkleRoot
nonpayablefunction setPresaleMerkleRoot(bytes32 newRoot)
swapNFTsForToken
nonpayablefunction swapNFTsForToken(uint256[] tokenIds, uint256 minExpectedAverageTokenPrice, address tokenRecipient, bool isRouter, address routerCaller) returns (uint256 nftInputAmount, uint256 outputAmount)
swapTokenForNFTs
payablefunction swapTokenForNFTs(uint256 nftAmount, uint256 maxExpectedAverageTokenPrice, address nftRecipient, bool isRouter, address routerCaller) payable returns (uint256 nftOutputAmount, uint256 inputAmount, tuple revealFee)
swapTokenForSpecificNFTs
payablefunction swapTokenForSpecificNFTs(uint256[] targetTokenIds, uint256 minNFTAmount, uint256 maxExpectedAverageTokenPrice, address nftRecipient, bool isRouter, address routerCaller) payable returns (uint256 nftOutputAmount, uint256 inputAmount)
syncNFTStatus
nonpayablefunction syncNFTStatus(uint256 tokenId)
transferOwnership
nonpayablefunction transferOwnership(address newOwner)
withdrawERC20
nonpayablefunction withdrawERC20(address _token, address recipient, uint256 amount)
withdrawETH
nonpayablefunction withdrawETH(address recipient, uint256 amount)
events
Initialized
event Initialized(uint64 version)
OwnershipTransferred
event OwnershipTransferred(address indexed previousOwner, address indexed newOwner)
PresaleMerkleRootUpdate
event PresaleMerkleRootUpdate(bytes32 newRoot)
SwapNFTInPair
event SwapNFTInPair(address indexed seller, uint256 amountOut, uint256 circulatingSupply, uint256[] ids)
SwapNFTOutPair
event SwapNFTOutPair(address indexed buyer, uint256 amountIn, uint256 circulatingSupply, (uint256 nativeFee, uint256 tokenFee, address token) revealFee, uint256[] ids)
SwapNFTOutPairInPresale
event SwapNFTOutPairInPresale(address indexed buyer, uint256 amountIn, (uint256 nativeFee, uint256 tokenFee, address token) revealFee, uint256[] ids)
TokenWithdrawal
event TokenWithdrawal(address recipient, uint256 amount)
errors
CoverNFTAlreadySold
error CoverNFTAlreadySold()
InputTooLarge
error InputTooLarge()
InsufficientBalance
error InsufficientBalance()
InsufficientInput
error InsufficientInput()
InvalidInitialization
error InvalidInitialization()
InvalidNFTTotalSupply
error InvalidNFTTotalSupply()
NoMatchingNFTBySlippage
error NoMatchingNFTBySlippage()
NotFactory
error NotFactory()
NotInitializing
error NotInitializing()
NotRouter
error NotRouter()
OutputTooSmall
error OutputTooSmall()
OwnableInvalidOwner
error OwnableInvalidOwner(address owner)
OwnableUnauthorizedAccount
error OwnableUnauthorizedAccount(address account)
PresaleInactive
error PresaleInactive()
PresaleMerkleNotApproved
error PresaleMerkleNotApproved()
PresaleTooManyForAddress
error PresaleTooManyForAddress()
ReentrancyGuardReentrantCall
error ReentrancyGuardReentrantCall()
SaleInactive
error SaleInactive()
SoldOut
error SoldOut()
TokenIdUnIssued
error TokenIdUnIssued()
ZeroAddress
error ZeroAddress()
ZeroSwapAmount
error ZeroSwapAmount()
creation bytecode
0x610100604052348015610010575f5ffd5b50604051614beb380380614beb83398101604081905261002f916101c8565b6001600160a01b0384166100565760405163d92e233d60e01b815260040160405180910390fd5b6001600160a01b03831661007d5760405163d92e233d60e01b815260040160405180910390fd5b6001600160a01b0382166100a45760405163d92e233d60e01b815260040160405180910390fd5b6001600160a01b0381166100cb5760405163d92e233d60e01b815260040160405180910390fd5b6001600160a01b0380851660805283811660a05282811660c052811660e0526100f26100fb565b50505050610219565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff161561014b5760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101aa5780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b80516001600160a01b03811681146101c3575f5ffd5b919050565b5f5f5f5f608085870312156101db575f5ffd5b6101e4856101ad565b93506101f2602086016101ad565b9250610200604086016101ad565b915061020e606086016101ad565b905092959194509250565b60805160a05160c05160e0516148f06102fb5f395f8181610386015281816116ad015281816119950152818161272201528181613515015261354401525f818161063501528181610c2801528181610f1e0152818161100b01528181611c6d0152818161224a01528181612a8d01526136bf01525f818161021801528181610cce015281816110a101528181611d03015281816122e001528181612b03015261374201525f81816105e801528181610741015281816111ca0152818161139a01528181611466015281816117c801528181611e01015261245c01526148f05ff3fe6080604052600436106101db575f3560e01c80636cc296db116100fd578063c4ea552811610092578063e3d0d1ba11610062578063e3d0d1ba1461068b578063ec64747e1461069f578063f2fde38b146106b2578063fc0c546a146106d1575f5ffd5b8063c4ea55281461060a578063d0fb020314610624578063dc3a44cc14610657578063ddcca24f14610676575f5ffd5b8063944a020d116100cd578063944a020d14610415578063b1d3f1c114610599578063b5710178146105b8578063c45a0155146105d7575f5ffd5b80636cc296db14610531578063715018a6146105525780638da5cb5b1461056657806390b967041461057a575f5ffd5b806333d8262c116101735780634782f779116101435780634782f779146104a657806347ccca02146104c5578063540d90e5146104e457806360bc1d331461050f575f5ffd5b806333d8262c146104155780633a9017e31461043c5780633f18b6281461045b57806344004cc114610487575f5ffd5b806328d7b276116101ae57806328d7b276146103545780632ec1b614146103755780633053fc58146103a857806333b24a3a146103c3575f5ffd5b80630bb23784146101df57806315d4683c146102075780631a3c703e146102525780631d2c0b381461027a575b5f5ffd5b3480156101ea575f5ffd5b506101f460045481565b6040519081526020015b60405180910390f35b348015610212575f5ffd5b5061023a7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b0390911681526020016101fe565b610265610260366004613dd6565b6106ef565b604080519283526020830191909152016101fe565b348015610285575f5ffd5b506005546006546007546102f09263ffffffff808216936401000000008304909116926001600160401b03600160401b8404811693600160801b8104821693600160c01b909104909116916001600160601b038216916001600160a01b03600160601b909104169088565b6040805163ffffffff998a1681529890971660208901526001600160401b03958616968801969096529284166060870152921660808501526001600160601b0390911660a08401526001600160a01b031660c083015260e0820152610100016101fe565b34801561035f575f5ffd5b5061037361036e366004613e5f565b610ab0565b005b348015610380575f5ffd5b5061023a7f000000000000000000000000000000000000000000000000000000000000000081565b3480156103b3575f5ffd5b5060016040516101fe9190613e8a565b3480156103ce575f5ffd5b506103e26103dd366004613ea4565b610b59565b6040516101fe91908151815260208083015190820152604080830151908201526060918201519181019190915260800190565b348015610420575f5ffd5b50610429606481565b60405161ffff90911681526020016101fe565b348015610447575f5ffd5b50610373610456366004613ec4565b610d6a565b348015610466575f5ffd5b5061047a610475366004613ea4565b610fc8565b6040516101fe9190613f64565b348015610492575f5ffd5b506103736104a1366004613fa6565b6111bf565b3480156104b1575f5ffd5b506103736104c0366004613fe4565b61138f565b3480156104d0575f5ffd5b5060015461023a906001600160a01b031681565b3480156104ef575f5ffd5b506101f46104fe36600461400e565b60086020525f908152604090205481565b61052261051d366004614029565b6113ef565b6040516101fe939291906140a8565b61054461053f3660046140c3565b6117a2565b6040516101fe92919061410b565b34801561055d575f5ffd5b50610373611ae7565b348015610571575f5ffd5b5061023a611afa565b348015610585575f5ffd5b5061047a61059436600461411f565b611b31565b3480156105a4575f5ffd5b506102656105b336600461414a565b611daf565b3480156105c3575f5ffd5b506103736105d2366004613e5f565b6120ba565b3480156105e2575f5ffd5b5061023a7f000000000000000000000000000000000000000000000000000000000000000081565b348015610615575f5ffd5b505f6040516101fe91906141ab565b34801561062f575f5ffd5b5061023a7f000000000000000000000000000000000000000000000000000000000000000081565b348015610662575f5ffd5b5060025461023a906001600160a01b031681565b348015610681575f5ffd5b506101f460035481565b348015610696575f5ffd5b5061047a6121a7565b6105226106ad3660046141bf565b612402565b3480156106bd575f5ffd5b506103736106cc36600461400e565b61293f565b3480156106dc575f5ffd5b505f5461023a906001600160a01b031681565b5f5f6106f9612979565b600554600160c01b90046001600160401b031642101561072c57604051630fe219dd60e21b815260040160405180910390fd5b6040516361771e4960e01b81523360048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906361771e4990602401602060405180830381865afa15801561078e573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107b2919061421a565b6107cf57604051639165520160e01b815260040160405180910390fd5b875f8190036107f157604051630cfa49a160e11b815260040160405180910390fd5b5f6107fa6129b0565b90505f610805612a27565b604051630a2ea46560e41b81526004810184905260248101859052604481018b90526001600160a01b03919091169063a2ea4650906064016040805180830381865afa158015610857573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061087b9190614235565b915050805f0361089e5760405163091c340b60e41b815260040160405180910390fd5b5f816001600160401b038111156108b7576108b7614257565b6040519080825280602002602001820160405280156108e0578160200160208202803683370190505b5090505f5b8481101561096a575f8e8e838181106109005761090061426b565b90506020020135905061091d816009612a3d90919063ffffffff16565b156109285750610962565b8083898151811061093b5761093b61426b565b6020908102919091010152610951600189614293565b9750838810610960575061096a565b505b6001016108e5565b50855f0361098b576040516352df9fe560e01b815260040160405180910390fd5b8a8610156109ac57604051635a201b5f60e11b815260040160405180910390fd5b8581525f6109b8612a27565b60405163c157253d60e01b815260048101869052602481018990526001600160a01b03919091169063c157253d90604401602060405180830381865afa158015610a04573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a2891906142a6565b9050610a37898984848e612a61565b9550610a41613d17565b8a6001600160a01b03167f79b4d075b32a2ecaef4bac0eddb4282f8c3176d52665e50e0bb9fed8ae7ea2c288878487604051610a8094939291906142f7565b60405180910390a2505050505050610aa460015f51602061489b5f395f51905f5255565b97509795505050505050565b610ab8612f59565b600554600160401b90046001600160401b03164210610b1e5760405162461bcd60e51b815260206004820152601b60248201527f50726573616c652068617320616c72656164792073746172746564000000000060448201526064015b60405180910390fd5b60078190556040518181527f9a0d91a5f5556bb6ab064c78048fee526568ddcf7e4daba855bac8a76e9211639060200160405180910390a150565b610b8060405180608001604052805f81526020015f81526020015f81526020015f81525090565b610b88612a27565b6001600160a01b0316639477d85d610b9e6129b0565b846040518363ffffffff1660e01b8152600401610bc5929190918252602082015260400190565b602060405180830381865afa158015610be0573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610c0491906142a6565b602082018190526040516379350a8f60e01b815230600482015260248101919091527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906379350a8f906044015f60405180830381865afa158015610c74573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610c9b91908101906143e8565b606084018190526020840151610cb493509091506144b8565b808252604051635344947160e11b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169163a68928e291610d069130918891906004016144cb565b5f60405180830381865afa158015610d20573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610d4791908101906143e8565b604084018190528351909250839150610d619083906144b8565b90525092915050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff1615906001600160401b03165f81158015610dae5750825b90505f826001600160401b03166001148015610dc95750303b155b905081158015610dd7575080155b15610df55760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff191660011785558315610e1f57845460ff60401b1916600160401b1785555b6001600160a01b038a16610e465760405163d92e233d60e01b815260040160405180910390fd5b6001600160a01b038916610e6d5760405163d92e233d60e01b815260040160405180910390fd5b865f03610e8d5760405163630dde3f60e11b815260040160405180910390fd5b610e9686612f8b565b610e9f8b613362565b5f80546001600160a01b03808d166001600160a01b031992831617909255600180548c841690831617905560028054928b16929091169190911790556004879055856005610eed8282614549565b5050604051632487f5f960e11b81526001600160a01b038c81166004830152606460248301819052604483018190527f00000000000000000000000000000000000000000000000000000000000000009091169163490febf291015f604051808303815f87803b158015610f5f575f5ffd5b505af1158015610f71573d5f5f3e3d5ffd5b505050508315610fbb57845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b5050505050505050505050565b610fd0613d3e565b600654610fe79083906001600160601b03166146c0565b602082018190526040516379350a8f60e01b815230600482015260248101919091527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906379350a8f906044015f60405180830381865afa158015611057573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261107e91908101906143e8565b606084015250506020810151604051635344947160e11b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169163a68928e2916110d99130918891906004016144cb565b5f60405180830381865afa1580156110f3573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261111a91908101906143e8565b60408481019190915260015490516306908ad760e11b8152600481018690526001600160a01b039091169250630d2115ae9150602401606060405180830381865afa15801561116b573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061118f91906146d7565b60808201526040810151606082015160208301516111ad9190614293565b6111b79190614293565b815292915050565b336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461120857604051631966391b60e11b815260040160405180910390fd5b5f546001600160a01b0390811690841603611376575f611226612a27565b6001600160a01b031663c157253d5f61123d6129b0565b6040516001600160e01b031960e085901b16815260048101929092526024820152604401602060405180830381865afa15801561127c573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906112a091906142a6565b6040516370a0823160e01b81523060048201529091506001600160a01b038516906370a0823190602401602060405180830381865afa1580156112e5573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061130991906142a6565b6113138383614293565b111561133257604051631e9acf1760e31b815260040160405180910390fd5b604080516001600160a01b0385168152602081018490527feddb53e10e60b3a2396b4222b3db092137bdbf7a6fecceaf2b0b438ff0ddc66e910160405180910390a1505b61138a6001600160a01b0384168383613373565b505050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146113d857604051631966391b60e11b815260040160405180910390fd5b6113eb6001600160a01b038316826133bd565b5050565b5f5f6113f9613d17565b611401612979565b600554600160401b90046001600160401b03164210806114335750600554600160801b90046001600160401b03164210155b15611451576040516335c33e8160e01b815260040160405180910390fd5b6040516361771e4960e01b81523360048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906361771e4990602401602060405180830381865afa1580156114b3573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906114d7919061421a565b6114f457604051639165520160e01b815260040160405180910390fd5b60035460055461151d918b916115189190640100000000900463ffffffff166144b8565b6133d6565b9250825f0361153f576040516352df9fe560e01b815260040160405180910390fd5b61154c85858989876133ed565b5f836001600160401b0381111561156557611565614257565b60405190808252806020026020018201604052801561158e578160200160208202803683370190505b5090505f5b848110156115ce57806003546115a99190614293565b8282815181106115bb576115bb61426b565b6020908102919091010152600101611593565b508360035f8282546115e09190614293565b909155505060015460405163ef53b6cb60e01b8152600481018690526001600160a01b039091169063ef53b6cb90602401606060405180830381865afa15801561162c573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061165091906146d7565b80519092503410156116755760405163f8b3bb6160e01b815260040160405180910390fd5b611680868684613502565b6001548251604051632f6bad2b60e21b81526001600160a01b039092169163bdaeb4ac91906116d59085907f000000000000000000000000000000000000000000000000000000000000000090600401614736565b5f604051808303818588803b1580156116ec575f5ffd5b505af11580156116fe573d5f5f3e3d5ffd5b505050505061170f825f0151613607565b6006545f906117289086906001600160601b03166146c0565b9050611737878784848e612a61565b9350896001600160a01b03167f9e56cf83ecd5576fa4b03b897168556baffa3e7e3fa88329a96e3bd9fb5b5fbf8585856040516117769392919061475f565b60405180910390a2505061179660015f51602061489b5f395f51905f5255565b96509650969350505050565b5f6117ab613d17565b6117b3612979565b6040516361771e4960e01b81523360048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906361771e4990602401602060405180830381865afa158015611815573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611839919061421a565b61185657604051639165520160e01b815260040160405180910390fd5b60035415611877576040516315eef84560e21b815260040160405180910390fd5b600160035f8282546118899190614293565b90915550506040805160018082528183019092525f91602080830190803683370190505090505f815f815181106118c2576118c261426b565b60209081029190910101526001805460405163ef53b6cb60e01b815260048101929092526001600160a01b03169063ef53b6cb90602401606060405180830381865afa158015611914573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061193891906146d7565b805190925034101561195d5760405163f8b3bb6160e01b815260040160405180910390fd5b611968858584613502565b6001548251604051632f6bad2b60e21b81526001600160a01b039092169163bdaeb4ac91906119bd9085907f000000000000000000000000000000000000000000000000000000000000000090600401614736565b5f604051808303818588803b1580156119d4575f5ffd5b505af11580156119e6573d5f5f3e3d5ffd5b50505050506119f7825f0151613607565b5f611a00612a27565b60405163c157253d60e01b81525f6004820152600160248201526001600160a01b03919091169063c157253d90604401602060405180830381865afa158015611a4b573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611a6f91906142a6565b9050611a7e868684848b612a61565b9350866001600160a01b03167f79b4d075b32a2ecaef4bac0eddb4282f8c3176d52665e50e0bb9fed8ae7ea2c2855f8686604051611abf94939291906142f7565b60405180910390a25050611adf60015f51602061489b5f395f51905f5255565b935093915050565b611aef612f59565b611af85f613623565b565b5f611b2c7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b031690565b905090565b611b39613d3e565b5f82611bc557611b538460035460045461151891906144b8565b6001546040516306908ad760e11b8152600481018390529192506001600160a01b031690630d2115ae90602401606060405180830381865afa158015611b9b573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611bbf91906146d7565b60808301525b611bcd612a27565b6001600160a01b031663c157253d611be36129b0565b866040518363ffffffff1660e01b8152600401611c0a929190918252602082015260400190565b602060405180830381865afa158015611c25573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611c4991906142a6565b602083018190526040516379350a8f60e01b815230600482015260248101919091527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906379350a8f906044015f60405180830381865afa158015611cb9573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611ce091908101906143e8565b606085015250506020820151604051635344947160e11b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169163a68928e291611d3b9130918a91906004016144cb565b5f60405180830381865afa158015611d55573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611d7c91908101906143e8565b6040850181905260608501516020860151919350611d9b925090614293565b611da59190614293565b8252509392505050565b5f5f611db9612979565b600554600160c01b90046001600160401b0316421015611dec57604051630fe219dd60e21b815260040160405180910390fd5b6040516361771e4960e01b81523360048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906361771e4990602401602060405180830381865afa158015611e4e573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611e72919061421a565b611e8f57604051639165520160e01b815260040160405180910390fd5b5f879003611eb057604051630cfa49a160e11b815260040160405180910390fd5b5f611eb96129b0565b90505f611ec4612a27565b60405163ef4cddd760e01b815260048101849052602481018b9052604481018a90526001600160a01b03919091169063ef4cddd7906064016040805180830381865afa158015611f16573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611f3a9190614235565b945090505f849003611f5f5760405163091c340b60e41b815260040160405180910390fd5b6060898503611fa3578a8a808060200260200160405190810160405280939291908181526020018383602002808284375f9201919091525092935061203192505050565b846001600160401b03811115611fbb57611fbb614257565b604051908082528060200260200182016040528015611fe4578160200160208202803683370190505b5090505f5b8581101561202f578b8b828181106120035761200361426b565b9050602002013582828151811061201c5761201c61426b565b6020908102919091010152600101611fe9565b505b5f8761203d573361203f565b865b905061204e818d8d868d613693565b9450806001600160a01b03167f6ee5e05d4b85ec866b18cfd95e5b963a1be282845d9cc4863e309067df4dd6bd86868560405161208d9392919061478d565b60405180910390a2505050506120af60015f51602061489b5f395f51905f5255565b965096945050505050565b6120c2612979565b60045481106121055760405162461bcd60e51b815260206004820152600f60248201526e1a5b9d985b1a59081d1bdad95b9259608a1b6044820152606401610b15565b6001546040516331a9108f60e11b8152600481018390525f9130916001600160a01b0390911690636352211e90602401602060405180830381865afa158015612150573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061217491906147ab565b6001600160a01b031614905061218d60098383156138b3565b506121a460015f51602061489b5f395f51905f5255565b50565b6121af613d3e565b6121b7612a27565b60405163c157253d60e01b81525f6004820152600160248201526001600160a01b03919091169063c157253d90604401602060405180830381865afa158015612202573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061222691906142a6565b602082018190526040516379350a8f60e01b815230600482015260248101919091527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906379350a8f906044015f60405180830381865afa158015612296573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526122bd91908101906143e8565b606084015250506020810151604051635344947160e11b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169163a68928e2916123189130915f91906004016144cb565b5f60405180830381865afa158015612332573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261235991908101906143e8565b60408085019190915260018054915163ef53b6cb60e01b81526001600160a01b03909216935063ef53b6cb92506123969160040190815260200190565b606060405180830381865afa1580156123b1573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906123d591906146d7565b60808201526040810151606082015160208301516123f39190614293565b6123fd9190614293565b815290565b5f5f61240c613d17565b612414612979565b600554600160c01b90046001600160401b031642101561244757604051630fe219dd60e21b815260040160405180910390fd5b6040516361771e4960e01b81523360048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906361771e4990602401602060405180830381865afa1580156124a9573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906124cd919061421a565b6124ea57604051639165520160e01b815260040160405180910390fd5b875f0361250a57604051630cfa49a160e11b815260040160405180910390fd5b5f6125136129b0565b905061251d612a27565b604051630a2ea46560e41b815260048101839052602481018b9052604481018a90526001600160a01b03919091169063a2ea4650906064016040805180830381865afa15801561256f573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906125939190614235565b9950505f8990036125b75760405163091c340b60e41b815260040160405180910390fd5b5f896001600160401b038111156125d0576125d0614257565b6040519080825280602002602001820160405280156125f9578160200160208202803683370190505b5090505f6126118b60035460045461151891906144b8565b90505f5b81811015612650578060035461262b9190614293565b83828151811061263d5761263d61426b565b6020908102919091010152600101612615565b5080156127885760015460405163ef53b6cb60e01b8152600481018390526001600160a01b039091169063ef53b6cb90602401606060405180830381865afa15801561269e573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906126c291906146d7565b81835280519094503410156126ea5760405163f8b3bb6160e01b815260040160405180910390fd5b6126f5888886613502565b6001548451604051632f6bad2b60e21b81526001600160a01b039092169163bdaeb4ac919061274a9086907f000000000000000000000000000000000000000000000000000000000000000090600401614736565b5f604051808303818588803b158015612761575f5ffd5b505af1158015612773573d5f5f3e3d5ffd5b5050505050612784845f0151613607565b8a82525b5f8b821015612801575f6127a461279f848f6144b8565b613900565b8051925090505f5b828110156127fe578181815181106127c6576127c661426b565b60200260200101518585836127db9190614293565b815181106127eb576127eb61426b565b60209081029190910101526001016127ac565b50505b61280b8183614293565b9650865f0361282d576040516352df9fe560e01b815260040160405180910390fd5b8683528160035f8282546128419190614293565b9250508190555050505f612853612a27565b60405163c157253d60e01b815260048101859052602481018890526001600160a01b03919091169063c157253d90604401602060405180830381865afa15801561289f573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906128c391906142a6565b90506128d2888884848d612a61565b9450886001600160a01b03167f79b4d075b32a2ecaef4bac0eddb4282f8c3176d52665e50e0bb9fed8ae7ea2c28685878660405161291394939291906142f7565b60405180910390a250505061293460015f51602061489b5f395f51905f5255565b955095509592505050565b612947612f59565b6001600160a01b03811661297057604051631e4fbdf760e01b81525f6004820152602401610b15565b6121a481613623565b5f51602061489b5f395f51905f528054600119016129aa57604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b6001546040516370a0823160e01b81523060048201525f916001600160a01b0316906370a0823190602401602060405180830381865afa1580156129f6573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612a1a91906142a6565b600454611b2c91906144b8565b600654600160601b90046001600160a01b031690565b600881901c5f90815260208390526040902054600160ff83161b1615155b92915050565b6040516379350a8f60e01b8152306004820152602481018390525f908190819081906001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906379350a8f906044015f60405180830381865afa158015612ad1573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052612af891908101906143e8565b9250925092505f5f5f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a68928e2308c5f81518110612b4357612b4361426b565b60200260200101518c6040518463ffffffff1660e01b8152600401612b6a939291906144cb565b5f60405180830381865afa158015612b84573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052612bab91908101906143e8565b9194509250905080612bbd858b614293565b612bc79190614293565b96508b15612dad575f546040516349c71bed60e11b8152339163938e37da91612c02916001600160a01b0316908f9030908f906004016147c6565b5f604051808303815f87803b158015612c19575f5ffd5b505af1158015612c2b573d5f5f3e3d5ffd5b505f925050505b8651811015612ceb57336001600160a01b031663938e37da5f5f9054906101000a90046001600160a01b03168e8a8581518110612c7157612c7161426b565b60200260200101518a8681518110612c8b57612c8b61426b565b60200260200101516040518563ffffffff1660e01b8152600401612cb294939291906147c6565b5f604051808303815f87803b158015612cc9575f5ffd5b505af1158015612cdb573d5f5f3e3d5ffd5b505060019092019150612c329050565b505f5b8351811015612da757336001600160a01b031663938e37da5f5f9054906101000a90046001600160a01b03168e878581518110612d2d57612d2d61426b565b6020026020010151878681518110612d4757612d4761426b565b60200260200101516040518563ffffffff1660e01b8152600401612d6e94939291906147c6565b5f604051808303815f87803b158015612d85575f5ffd5b505af1158015612d97573d5f5f3e3d5ffd5b505060019092019150612cee9050565b50612e6b565b5f54612dc4906001600160a01b031633308c613aff565b5f5b8651811015612e2557612e1d33888381518110612de557612de561426b565b6020026020010151888481518110612dff57612dff61426b565b60209081029190910101515f546001600160a01b0316929190613aff565b600101612dc6565b505f5b8351811015612e6957612e6133858381518110612e4757612e4761426b565b6020026020010151858481518110612dff57612dff61426b565b600101612e28565b505b89515f5b81811015612f48575f8c8281518110612e8a57612e8a61426b565b602002602001015190506003548110612eb657604051630943c76960e31b815260040160405180910390fd5b600881901c5f9081526009602052604090208054600160ff84161b1790556001546040516323b872dd60e01b81523060048201526001600160a01b038d8116602483015260448201849052909116906323b872dd906064015f604051808303815f87803b158015612f25575f5ffd5b505af1158015612f37573d5f5f3e3d5ffd5b505060019093019250612e6f915050565b505050505050505095945050505050565b33612f62611afa565b6001600160a01b031614611af85760405163118cdaa760e01b8152336004820152602401610b15565b5f612f9c60e0830160c0840161400e565b6001600160a01b031603612fc35760405163d92e233d60e01b815260040160405180910390fd5b612fd360808201606083016147f0565b6001600160401b0316612fec60a08301608084016147f0565b6001600160401b031610156130555760405162461bcd60e51b815260206004820152602960248201527f5075626c69632073616c65206d7573742073746172742061667465722070726560448201526873616c6520656e647360b81b6064820152608401610b15565b5f61306660808301606084016147f0565b6001600160401b03161115613299575f613086604083016020840161480b565b63ffffffff16116130e55760405162461bcd60e51b815260206004820152602360248201527f70726573616c654d6178416d6f756e742073686f756c64206e6f74206265207a60448201526265726f60e81b6064820152608401610b15565b5f6130f3602083018361480b565b63ffffffff161161315e5760405162461bcd60e51b815260206004820152602f60248201527f6d617850726573616c655075726368617365506572416464726573732073686f60448201526e756c64206e6f74206265207a65726f60881b6064820152608401610b15565b5f61316f60e0830160c0840161400e565b6001600160a01b031663c157253d600161318f604086016020870161480b565b6040516001600160e01b031960e085901b168152600481019290925263ffffffff166024820152604401602060405180830381865afa1580156131d4573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906131f891906142a6565b90505f61320b604084016020850161480b565b63ffffffff1661322160c0850160a08601614826565b61322b9190614841565b6001600160601b031690508181101561138a5760405162461bcd60e51b815260206004820152602a60248201527f54686520707269636520616e64206d61784e756d206f662070726573616c65206044820152691a5cc81a5b9d985b1a5960b21b6064820152608401610b15565b6132a960c0820160a08301614826565b6001600160601b0316156132ff5760405162461bcd60e51b815260206004820152601c60248201527f70726573616c652070726963652073686f756c64206265207a65726f000000006044820152606401610b15565b61330f604082016020830161480b565b63ffffffff16156121a45760405162461bcd60e51b815260206004820152601e60248201527f70726573616c65206d6178206e756d2073686f756c64206265207a65726f00006044820152606401610b15565b61336a613b58565b6121a481613ba1565b816014528060345263a9059cbb60601b5f5260205f604460105f875af18060015f5114166133b357803d853b1517106133b3576390b8ec185f526004601cfd5b505f603452505050565b5f385f3884865af16113eb5763b12d13eb5f526004601cfd5b5f8183106133e457816133e6565b825b9392505050565b5f856133f957336133fb565b845b6001600160a01b0381165f90815260086020526040812080549293508492909190613427908490614293565b90915550506005546001600160a01b0382165f9081526008602052604090205463ffffffff909116101561346e57604051633bf571cb60e01b815260040160405180910390fd5b604080516001600160a01b03831660208201525f910160408051601f198184030181528282528051602091820120908301520160408051601f198184030181529190528051602090910120600754909150158015906134db57506134d9858560056002015484613ba9565b155b156134f9576040516346cabb7560e01b815260040160405180910390fd5b50505050505050565b80602001515f0361351257505050565b5f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031615613568577f0000000000000000000000000000000000000000000000000000000000000000613575565b6001546001600160a01b03165b905083156135e157604080830151602084015191516349c71bed60e11b8152339263938e37da926135af92909188918791906004016147c6565b5f604051808303815f87803b1580156135c6575f5ffd5b505af11580156135d8573d5f5f3e3d5ffd5b50505050613601565b60208201515f54613601916001600160a01b039091169033908490613aff565b50505050565b803411156121a4576121a461361c82346144b8565b33906133bd565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080546001600160a01b031981166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a3505050565b6040516379350a8f60e01b8152306004820152602481018390525f908190819081906001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906379350a8f906044015f60405180830381865afa158015613703573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261372a91908101906143e8565b9194509250905061373b81876144b8565b93505f5f5f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a68928e2308d8d5f8181106137825761378261426b565b905060200201358a6040518463ffffffff1660e01b81526004016137a8939291906144cb565b5f60405180830381865afa1580156137c2573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526137e991908101906143e8565b919450925090506137fa81886144b8565b96506138078c8c8c613bc2565b6138118888613c8e565b5f5b8651811015613860576138588782815181106138315761383161426b565b602002602001015187838151811061384b5761384b61426b565b6020026020010151613c8e565b600101613813565b505f5b83518110156138a35761389b8482815181106138815761388161426b565b602002602001015184838151811061384b5761384b61426b565b600101613863565b5050505050505095945050505050565b80156138dc57600882901c5f9081526020849052604090208054600160ff85161b179055505050565b600882901c5f9081526020849052604090208054600160ff85161b19169055505050565b6060816001600160401b0381111561391a5761391a614257565b604051908082528060200260200182016040528015613943578160200160208202803683370190505b5090505f600860035460ff6139589190614293565b901c90505f613968824340614863565b6003549091505f9060ff168181613980575f1961398d565b61398d600180841b6144b8565b90505f5b858110801561399f57508784105b15613af2575f866139b08388614293565b6139ba9190614863565b5f818152600960205260408120549192506139d660018a6144b8565b83146139e3575f196139e5565b845b9050811981165b80158015906139fa57508b88105b15613adb575f613a92827e1f0d1e100c1d070f090b19131c1706010e11080a1a141802121b150316040581196001019091166101e07f804040554300526644320000502061067405302602000010750620017611707760fc7fb6db6db6ddddddddd34d34d349249249210842108c6318c639ce739cffffffff840260f81c161b60f71c1690811c63d76453e004601f169190911a1790565b600886901b179050808c8a81518110613aad57613aad61426b565b602090810291909101015288613ac281614882565b9950613ad190506001836144b8565b82169150506139ec565b505050508080613aea90614882565b915050613991565b5050508352509092915050565b60405181606052826040528360601b602c526323b872dd60601b600c5260205f6064601c5f895af18060015f511416613b4a57803d873b151710613b4a57637939f4245f526004601cfd5b505f60605260405250505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff16611af857604051631afcd79f60e31b815260040160405180910390fd5b612947613b58565b5f82613bb6868685613caa565b1490505b949350505050565b5f5b8181101561360157613bf3838383818110613be157613be161426b565b6009926020909102013590505f6138b3565b6001546001600160a01b03166323b872dd8530868686818110613c1857613c1861426b565b6040516001600160e01b031960e088901b1681526001600160a01b039586166004820152949093166024850152506020909102013560448201526064015f604051808303815f87803b158015613c6c575f5ffd5b505af1158015613c7e573d5f5f3e3d5ffd5b505060019092019150613bc49050565b80156113eb575f546113eb906001600160a01b03168383613373565b5f81815b84811015613ce257613cd882878784818110613ccc57613ccc61426b565b90506020020135613ceb565b9150600101613cae565b50949350505050565b5f818310613d05575f8281526020849052604090206133e6565b5f8381526020839052604090206133e6565b60405180606001604052805f81526020015f81526020015f6001600160a01b031681525090565b6040518060a001604052805f81526020015f81526020015f81526020015f8152602001613d69613d17565b905290565b5f5f83601f840112613d7e575f5ffd5b5081356001600160401b03811115613d94575f5ffd5b6020830191508360208260051b8501011115613dae575f5ffd5b9250929050565b6001600160a01b03811681146121a4575f5ffd5b80151581146121a4575f5ffd5b5f5f5f5f5f5f5f60c0888a031215613dec575f5ffd5b87356001600160401b03811115613e01575f5ffd5b613e0d8a828b01613d6e565b90985096505060208801359450604088013593506060880135613e2f81613db5565b92506080880135613e3f81613dc9565b915060a0880135613e4f81613db5565b8091505092959891949750929550565b5f60208284031215613e6f575f5ffd5b5035919050565b634e487b7160e01b5f52602160045260245ffd5b6020810160028310613e9e57613e9e613e76565b91905290565b5f5f60408385031215613eb5575f5ffd5b50508035926020909101359150565b5f5f5f5f5f5f8688036101a0811215613edb575f5ffd5b8735613ee681613db5565b96506020880135613ef681613db5565b95506040880135613f0681613db5565b94506060880135613f1681613db5565b935060808801359250610100609f1982011215613f31575f5ffd5b5060a0870190509295509295509295565b80518252602080820151908301526040908101516001600160a01b0316910152565b5f60e082019050825182526020830151602083015260408301516040830152606083015160608301526080830151613f9f6080840182613f42565b5092915050565b5f5f5f60608486031215613fb8575f5ffd5b8335613fc381613db5565b92506020840135613fd381613db5565b929592945050506040919091013590565b5f5f60408385031215613ff5575f5ffd5b823561400081613db5565b946020939093013593505050565b5f6020828403121561401e575f5ffd5b81356133e681613db5565b5f5f5f5f5f5f60a0878903121561403e575f5ffd5b86359550602087013561405081613db5565b945060408701356001600160401b0381111561406a575f5ffd5b61407689828a01613d6e565b909550935050606087013561408a81613dc9565b9150608087013561409a81613db5565b809150509295509295509295565b8381526020810183905260a08101613bba6040830184613f42565b5f5f5f606084860312156140d5575f5ffd5b83356140e081613db5565b925060208401356140f081613dc9565b9150604084013561410081613db5565b809150509250925092565b828152608081016133e66020830184613f42565b5f5f5f60608486031215614131575f5ffd5b8335925060208401359150604084013561410081613dc9565b5f5f5f5f5f5f60a0878903121561415f575f5ffd5b86356001600160401b03811115614174575f5ffd5b61418089828a01613d6e565b90975095505060208701359350604087013561419b81613db5565b9250606087013561408a81613dc9565b6020810160018310613e9e57613e9e613e76565b5f5f5f5f5f60a086880312156141d3575f5ffd5b853594506020860135935060408601356141ec81613db5565b925060608601356141fc81613dc9565b9150608086013561420c81613db5565b809150509295509295909350565b5f6020828403121561422a575f5ffd5b81516133e681613dc9565b5f5f60408385031215614246575f5ffd5b505080516020909101519092909150565b634e487b7160e01b5f52604160045260245ffd5b634e487b7160e01b5f52603260045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b80820180821115612a5b57612a5b61427f565b5f602082840312156142b6575f5ffd5b5051919050565b5f8151808452602084019350602083015f5b828110156142ed5781518652602095860195909101906001016142cf565b5093949350505050565b84815283602082015261430d6040820184613f42565b60c060a08201525f61432260c08301846142bd565b9695505050505050565b604051601f8201601f191681016001600160401b038111828210171561435457614354614257565b604052919050565b5f6001600160401b0382111561437457614374614257565b5060051b60200190565b5f82601f83011261438d575f5ffd5b81516143a061439b8261435c565b61432c565b8082825260208201915060208360051b8601019250858311156143c1575f5ffd5b602085015b838110156143de5780518352602092830192016143c6565b5095945050505050565b5f5f5f606084860312156143fa575f5ffd5b83516001600160401b0381111561440f575f5ffd5b8401601f8101861361441f575f5ffd5b805161442d61439b8261435c565b8082825260208201915060208360051b85010192508883111561444e575f5ffd5b6020840193505b8284101561447957835161446881613db5565b825260209384019390910190614455565b8096505050505060208401516001600160401b03811115614498575f5ffd5b6144a48682870161437e565b604095909501519396949550929392505050565b81810381811115612a5b57612a5b61427f565b6001600160a01b039390931683526020830191909152604082015260600190565b63ffffffff811681146121a4575f5ffd5b6001600160401b03811681146121a4575f5ffd5b5f8135612a5b816144fd565b6001600160601b03811681146121a4575f5ffd5b5f8135612a5b8161451d565b5f8135612a5b81613db5565b8135614554816144ec565b63ffffffff811663ffffffff19835416178255505f6020830135614577816144ec565b825467ffffffff00000000191660209190911b67ffffffff0000000016178255506145d96145a760408401614511565b82546fffffffffffffffff0000000000000000191660409190911b6fffffffffffffffff000000000000000016178255565b6146146145e860608401614511565b82805467ffffffffffffffff60801b191660809290921b67ffffffffffffffff60801b16919091179055565b61464761462360808401614511565b8280546001600160c01b031660c09290921b6001600160c01b031916919091179055565b6001810161467c61465a60a08501614531565b82546bffffffffffffffffffffffff19166001600160601b0391909116178255565b6146b061468b60c0850161453d565b82546001600160601b031660609190911b6bffffffffffffffffffffffff1916178255565b5060e09190910135600290910155565b8082028115828204841417612a5b57612a5b61427f565b5f60608284031280156146e8575f5ffd5b50604051606081016001600160401b038111828210171561470b5761470b614257565b6040908152835182526020808501519083015283015161472a81613db5565b60408201529392505050565b604081525f61474860408301856142bd565b905060018060a01b03831660208301529392505050565b83815261476f6020820184613f42565b60a060808201525f61478460a08301846142bd565b95945050505050565b838152826020820152606060408201525f61478460608301846142bd565b5f602082840312156147bb575f5ffd5b81516133e681613db5565b6001600160a01b039485168152928416602084015292166040820152606081019190915260800190565b5f60208284031215614800575f5ffd5b81356133e6816144fd565b5f6020828403121561481b575f5ffd5b81356133e6816144ec565b5f60208284031215614836575f5ffd5b81356133e68161451d565b6001600160601b038181168382160290811690818114613f9f57613f9f61427f565b5f8261487d57634e487b7160e01b5f52601260045260245ffd5b500690565b5f600182016148935761489361427f565b506001019056fe9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00a26469706673582212202ea65089c962ae66c667fe8fb6bd0942ee5636a89f3c8705347a0c1e315a6b1464736f6c634300081c0033000000000000000000000000adbf5c44fd6379dc51f29c3564cc4a5f1babe1490000000000000000000000008e39cd6557b37f21294f9138c34e1281f3c6b7af000000000000000000000000aa210ca16e3bb3ce0663156c469b21af93c44c590000000000000000000000008ee1f62ad278d507351f514cf50b5fabc72cae7c