0 txs
1 call
constructor
constructor(string _name, string _symbol, address _creatorToken, address _weth, address _admin, address _owner, string _baseURI, address _renderer, uint256[] _tagIds, (uint256 price, uint256 maxSupply) _mintInfo, uint256 _mintFee)
functions
admin
viewfunction admin() view returns (address)
balanceOf
viewfunction balanceOf(address owner) view returns (uint256)
contractURI
viewfunction contractURI() view returns (string)
creatorFeeReceiver
viewfunction creatorFeeReceiver() view returns (address)
creatorFeeSplit
viewfunction creatorFeeSplit() view returns (uint256)
creatorToken
viewfunction creatorToken() view returns (address)
currentFeeCurrency
viewfunction currentFeeCurrency() view returns (address)
currentVersion
viewfunction currentVersion() view returns (uint256)
ETH_CURRENCY
viewfunction ETH_CURRENCY() view returns (address)
evolutionPermissions
viewfunction evolutionPermissions(uint256) view returns (uint8)
FEE_DENOMINATOR
viewfunction FEE_DENOMINATOR() view returns (uint256)
feeGrowthRate
viewfunction feeGrowthRate() view returns (uint256)
fxFeeReceiver
viewfunction fxFeeReceiver() view returns (address)
getApproved
viewfunction getApproved(uint256 tokenId) view returns (address)
getBaseFee
viewfunction getBaseFee(uint256 _amount) view returns (address feeCurrency, uint256 mintFee, uint256 baseFeeAmount)
getEvolutionFee
viewfunction getEvolutionFee(uint256 _parentId, uint256 _amount) view returns (address feeCurrency, uint256 mintFee, uint256 baseFeeAmount, uint256 evolutionFeeAmount)
getTokenLineage
viewfunction getTokenLineage(uint256 _tokenId, uint256 _limit) view returns (uint256[] lineage, address[] owners)
INITIAL_CREATOR_FEE_SPLIT
viewfunction INITIAL_CREATOR_FEE_SPLIT() view returns (uint256)
INITIAL_FEE_GROWTH_RATE
viewfunction INITIAL_FEE_GROWTH_RATE() view returns (uint256)
INITIAL_MAX_LINEAGE_DEPTH
viewfunction INITIAL_MAX_LINEAGE_DEPTH() view returns (uint256)
INITIAL_MIN_FEE_AMOUNT
viewfunction INITIAL_MIN_FEE_AMOUNT() view returns (uint256)
isAllowedToEvolve
viewfunction isAllowedToEvolve(uint256 _tokenId, address _user) view returns (bool)
isApprovedForAll
viewfunction isApprovedForAll(address owner, address operator) view returns (bool)
isInEvolutionAllowlist
viewfunction isInEvolutionAllowlist(uint256 _tokenId, address _user) view returns (bool)
lineageDepth
viewfunction lineageDepth(uint256) view returns (uint256)
maxLineageDepth
viewfunction maxLineageDepth() view returns (uint256)
minFeeAmount
viewfunction minFeeAmount() view returns (uint256)
mintFees
viewfunction mintFees(address) view returns (uint256)
mintInfo
viewfunction mintInfo() view returns (uint256 price, uint256 maxSupply)
name
viewfunction name() view returns (string)
nextTokenId
viewfunction nextTokenId() view returns (uint256)
owner
viewfunction owner() view returns (address)
ownerOf
viewfunction ownerOf(uint256 tokenId) view returns (address)
parentOf
viewfunction parentOf(uint256) view returns (uint256)
paused
viewfunction paused() view returns (bool)
pausedSelectors
viewfunction pausedSelectors(bytes4) view returns (bool)
supportedCurrencies
viewfunction supportedCurrencies(address) view returns (bool)
supportsInterface
viewfunction supportsInterface(bytes4 _interfaceId) view returns (bool)
symbol
viewfunction symbol() view returns (string)
tokenByIndex
viewfunction tokenByIndex(uint256 index) view returns (uint256)
tokenInfo
viewfunction tokenInfo(uint256) view returns (uint256 mintPrice, uint256 version, bytes32 seed, bool metadataLocked)
tokenOfOwnerByIndex
viewfunction tokenOfOwnerByIndex(address owner, uint256 index) view returns (uint256)
tokenURI
viewfunction tokenURI(uint256 _tokenId) view returns (string)
totalSupply
viewfunction totalSupply() view returns (uint256)
versionInfo
viewfunction versionInfo(uint256) view returns (address renderer, string mutableURI, string immutableURI, uint256 lastIteration, address onchainPointer)
weth
viewfunction weth() view returns (address)
addSupportedCurrency
nonpayablefunction addSupportedCurrency(address _currency)
approve
nonpayablefunction approve(address to, uint256 tokenId)
batchLiquidate
nonpayablefunction batchLiquidate(uint256[] _tokenIds)
batchMint
payablefunction batchMint(address _to, uint256 _amount) payable returns (uint256[] tokenIds)
burn
nonpayablefunction burn(uint256 _tokenId)
evolve
payablefunction evolve(uint256 _parentId, address _to, uint256 _amount) payable returns (uint256[] tokenIds)
evolveWithCustom
payablefunction evolveWithCustom(uint256 _parentId, address _to, uint256 _amount) payable returns (uint256[] tokenIds)
evolveWithEveryone
payablefunction evolveWithEveryone(uint256 _parentId, address _to, uint256 _amount) payable returns (uint256[] tokenIds)
liquidate
nonpayablefunction liquidate(uint256 _tokenId)
lockMetadata
nonpayablefunction lockMetadata(uint256 _tokenId, uint8 _permission)
mint
payablefunction mint(address _to) payable returns (uint256 tokenId)
pause
nonpayablefunction pause()
pauseSelector
nonpayablefunction pauseSelector(bytes4 _selector)
regenerate
payablefunction regenerate(uint256 _tokenId, address _to) payable returns (uint256 newTokenId)
removeSupportedCurrency
nonpayablefunction removeSupportedCurrency(address _currency)
renounceAdmin
nonpayablefunction renounceAdmin()
renounceOwnership
nonpayablefunction renounceOwnership()
safeTransferFrom
nonpayablefunction safeTransferFrom(address from, address to, uint256 tokenId, bytes data)
safeTransferFrom
nonpayablefunction safeTransferFrom(address from, address to, uint256 tokenId)
setApprovalForAll
nonpayablefunction setApprovalForAll(address operator, bool approved)
setCreatorFeeReceiver
nonpayablefunction setCreatorFeeReceiver(address _newReceiver)
setCreatorFeeSplit
nonpayablefunction setCreatorFeeSplit(uint256 _creatorSplit)
setCurrentFeeCurrency
nonpayablefunction setCurrentFeeCurrency(address _currency)
setCurrentVersion
nonpayablefunction setCurrentVersion(uint256 _newVersion)
setEvolutionAllowlist
nonpayablefunction setEvolutionAllowlist(uint256 _tokenId, address _user, bool _canEvolve)
setEvolutionPermission
nonpayablefunction setEvolutionPermission(uint256 _tokenId, uint8 _permission)
setFeeGrowthRate
nonpayablefunction setFeeGrowthRate(uint256 _growthRate)
setFxFeeReceiver
nonpayablefunction setFxFeeReceiver(address _newReceiver)
setMaxLineageDepth
nonpayablefunction setMaxLineageDepth(uint256 _maxDepth)
setMaxSupply
nonpayablefunction setMaxSupply(uint256 _maxSupply)
setMinFeeAmount
nonpayablefunction setMinFeeAmount(uint256 _minFee)
setMintFee
nonpayablefunction setMintFee(address _currency, uint256 _fee)
setMintPrice
nonpayablefunction setMintPrice(uint256 _newPrice)
setTags
nonpayablefunction setTags(uint256[] _tagIds)
setVersionInfo
nonpayablefunction setVersionInfo(uint256 _version, address _renderer, string _newMutableURI, string _newImmutableURI, uint256 _lastIteration, bytes _onchainData)
transferAdmin
nonpayablefunction transferAdmin(address _newAdmin)
transferFrom
nonpayablefunction transferFrom(address from, address to, uint256 tokenId)
transferOwnership
nonpayablefunction transferOwnership(address newOwner)
unpause
nonpayablefunction unpause()
unpauseSelector
nonpayablefunction unpauseSelector(bytes4 _selector)
events
Approval
event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId)
ApprovalForAll
event ApprovalForAll(address indexed owner, address indexed operator, bool approved)
ContractURIUpdated
event ContractURIUpdated()
CreatorFeeReceiverUpdated
event CreatorFeeReceiverUpdated(address indexed creatorFeeReceiver)
CreatorFeeSplitUpdated
event CreatorFeeSplitUpdated(uint256 creatorSplit, uint256 fxSplit)
CurrentFeeCurrencyUpdated
event CurrentFeeCurrencyUpdated(address indexed previousCurrency, address indexed newCurrency)
CurrentVersionUpdated
event CurrentVersionUpdated(uint256 indexed newVersion)
ERC20FeesDistributed
event ERC20FeesDistributed(address indexed currency, uint256 totalFeeAmount, uint256 fxAmount, uint256 creatorAmount, uint256 amountPerOwner, uint256 lineageSize)
ETHFeesDistributed
event ETHFeesDistributed(address indexed currency, uint256 fxAmount, uint256 creatorAmount, uint256 amountPerOwner, uint256 lineageSize)
ETHTransferFailed
event ETHTransferFailed(address indexed to, uint256 value)
EvolutionAllowlistSet
event EvolutionAllowlistSet(uint256 indexed tokenId, address indexed user, bool canEvolve)
EvolutionPermissionSet
event EvolutionPermissionSet(uint256 indexed tokenId, uint8 permission)
FeeGrowthRateUpdated
event FeeGrowthRateUpdated(uint256 feeGrowthRate)
FxReceiverUpdated
event FxReceiverUpdated(address indexed fxFeeReceiver)
MaxLineageDepthUpdated
event MaxLineageDepthUpdated(uint256 maxLineageDepth)
MaxSupplyUpdated
event MaxSupplyUpdated(uint256 maxSupply)
MetadataLocked
event MetadataLocked(uint256 indexed tokenId, address indexed owner, bool locked)
MinFeeAmountUpdated
event MinFeeAmountUpdated(uint256 mintFeeAmount)
MintFeeUpdated
event MintFeeUpdated(address indexed currency, uint256 fee)
MintInfoInitialized
event MintInfoInitialized(uint256 price, uint256 maxSupply)
MintPriceUpdated
event MintPriceUpdated(uint256 currentPrice, uint256 newPrice)
OwnershipTransferred
event OwnershipTransferred(address indexed previousOwner, address indexed newOwner)
Paused
event Paused(address account)
ProjectTags
event ProjectTags(uint256[] tagIds)
SeedFulfilled
event SeedFulfilled(uint256 indexed tokenId, bytes32 seed)
SelectorPaused
event SelectorPaused(bytes4 indexed selector)
SelectorUnpaused
event SelectorUnpaused(bytes4 indexed selector)
SupportedCurrencyAdded
event SupportedCurrencyAdded(address indexed currency)
SupportedCurrencyRemoved
event SupportedCurrencyRemoved(address indexed currency)
TokenEvolved
event TokenEvolved(address indexed owner, uint256 indexed parentId, uint256 indexed newTokenId)
TokenLiquidated
event TokenLiquidated(address indexed owner, uint256 indexed tokenId, uint256 mintPrice)
TokenRegenerated
event TokenRegenerated(address indexed minter, uint256 indexed oldTokenId, uint256 indexed newTokenId)
Transfer
event Transfer(address indexed from, address indexed to, uint256 indexed tokenId)
TransferAdmin
event TransferAdmin(address indexed oldAdmin, address indexed newAdmin)
Unpaused
event Unpaused(address account)
VersionInfoUpdated
event VersionInfoUpdated(uint256 indexed version, address indexed renderer, string mutableURI, string immutableURI, uint256 lastIteration, address onchainPointer)
errors
AdminableUnauthorizedAccount
error AdminableUnauthorizedAccount(address admin, address caller)
EnforcedPause
error EnforcedPause()
ERC721EnumerableForbiddenBatchMint
error ERC721EnumerableForbiddenBatchMint()
ERC721IncorrectOwner
error ERC721IncorrectOwner(address sender, uint256 tokenId, address owner)
ERC721InsufficientApproval
error ERC721InsufficientApproval(address operator, uint256 tokenId)
ERC721InvalidApprover
error ERC721InvalidApprover(address approver)
ERC721InvalidOperator
error ERC721InvalidOperator(address operator)
ERC721InvalidOwner
error ERC721InvalidOwner(address owner)
ERC721InvalidReceiver
error ERC721InvalidReceiver(address receiver)
ERC721InvalidSender
error ERC721InvalidSender(address sender)
ERC721NonexistentToken
error ERC721NonexistentToken(uint256 tokenId)
ERC721OutOfBoundsIndex
error ERC721OutOfBoundsIndex(address owner, uint256 index)
ExpectedPause
error ExpectedPause()
OwnableInvalidOwner
error OwnableInvalidOwner(address owner)
OwnableUnauthorizedAccount
error OwnableUnauthorizedAccount(address account)
ProjectToken__CurrencyAlreadySupported
error ProjectToken__CurrencyAlreadySupported(address currency)
ProjectToken__CurrencyNotSupported
error ProjectToken__CurrencyNotSupported(address currency)
ProjectToken__ETHTransferFailed
error ProjectToken__ETHTransferFailed()
ProjectToken__EvolutionNotAllowed
error ProjectToken__EvolutionNotAllowed(uint256 tokenId)
ProjectToken__EvolutionNotCustom
error ProjectToken__EvolutionNotCustom(uint256 tokenId)
ProjectToken__InsufficientSupply
error ProjectToken__InsufficientSupply()
ProjectToken__InvalidAmount
error ProjectToken__InvalidAmount()
ProjectToken__InvalidCurrency
error ProjectToken__InvalidCurrency(address currency)
ProjectToken__InvalidFeeSplit
error ProjectToken__InvalidFeeSplit()
ProjectToken__InvalidMintFee
error ProjectToken__InvalidMintFee()
ProjectToken__InvalidVersion
error ProjectToken__InvalidVersion()
ProjectToken__MetadataAlreadyLocked
error ProjectToken__MetadataAlreadyLocked(uint256 tokenId)
ProjectToken__MetadataNotLocked
error ProjectToken__MetadataNotLocked(uint256 tokenId)
ProjectToken__UnexpectedETH
error ProjectToken__UnexpectedETH()
ProjectToken__ZeroAddress
error ProjectToken__ZeroAddress()
ReentrancyGuardReentrantCall
error ReentrancyGuardReentrantCall()
SafeERC20FailedOperation
error SafeERC20FailedOperation(address token)
SelectorNotPausedError
error SelectorNotPausedError(bytes4 selector)
SelectorPausedError
error SelectorPausedError(bytes4 selector)
creation bytecode
0x60c060405260016012556001601655348015610019575f5ffd5b5060405161554538038061554583398101604081905261003891610972565b858b8b896001600160a01b038116610071576040516317b75e8b60e01b81525f6004820181905260248201526044015b60405180910390fd5b61007b5f826101ae565b5060016100888382610b22565b5060026100958282610b22565b5050506001600160a01b0381166100c157604051631e4fbdf760e01b81525f6004820152602401610068565b6100ca816101fc565b50600b805460ff60a01b191690556001600d556001600160a01b03808a16608052881660a05261010066038d7ea4c6800061024d565b61010b612328610289565b6101166109c46102f4565b6101206028610329565b6101298761035e565b610132866103b0565b610164601254858760405180602001604052805f8152505f60405180602001604052805f81525061040260201b60201c565b61016d83610523565b61017682610552565b61017f5f610597565b6101885f6105e2565b60805161019490610597565b61019e5f82610633565b5050505050505050505050610d05565b5f80546001600160a01b0319166001600160a01b0383811691821783556040519192908516917fbdd36143ee09de60bdefca70680e0f71189b2ed7acee364b53917ad433fdaf809190a35050565b600b80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b60158190556040518181527fd94318f0d3bc0eb93ae168cbc5e3bb1d4399a4bebc8da99ba523a1ce82d7f417906020015b60405180910390a150565b6127108111156102ac5760405163a27d364960e01b815260040160405180910390fd5b60118190557f98fa1e060c5dc541067608e2ea477f438fb1617efc9546b527c1eb8c935fb179816102df81612710610bdc565b6040805192835260208301919091520161027e565b60138190556040518181527fe51b1f1789c4d3b2b2cbca6f3c85525e95feb549832e82313520202e21d1f7099060200161027e565b60148190556040518181527f70d78751ad6132096f2a8a93ceab22525b96ac344bb2040600ea2515ffb437c69060200161027e565b610367816106f1565b601080546001600160a01b0319166001600160a01b0383169081179091556040517fd7e625e1513d15a58573e07ef53deed06c48fc99e3a85669d91cd1f3e8470a5a905f90a250565b6103b9816106f1565b600e80546001600160a01b0319166001600160a01b0383169081179091556040517f56b1a8af191f8719bb31fbb37a82fc3f6169b98f9cc1ec77aac41d3c27605dd5905f90a250565b61040b8661071b565b610414856106f1565b80515f9015610429576104268261073b565b90505b6040805160a0810182526001600160a01b03888116825260208083018981528385018990526060840188905285831660808501525f8c8152918052939020825181546001600160a01b0319169216919091178155915190919060018201906104919082610b22565b50604082015160028201906104a69082610b22565b5060608201516003820155608090910151600490910180546001600160a01b0319166001600160a01b039283161790556040519087169088907fc966c75c829f551b25422c917f6d264c7a6c3d65daa76475379b1815fa81ef0190610512908990899089908890610c2f565b60405180910390a350505050505050565b7f91d93ab23c0e928561b37be74dc3858c4f7f90f67399c0e151f266b47b79a0f38160405161027e9190610c75565b80516017819055602080830151601881905560408051938452918301527fd324d5a9379297520466ef31087c263beb256a6ac75f29c7ba25bbdc2fb1af71910161027e565b6001600160a01b0381165f818152601a6020526040808220805460ff19166001179055517f052a14e122efcd42e31a786e7b87546757adcfae559f9dd379263c20b1758a1e9190a250565b600f80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f6a6a9a9fe556cfe04398a0a94dcbc1bd6513b0a2049635fde08c04377b1ce06f905f90a35050565b6001600160a01b0382165f908152601a602052604090205460ff1661067657604051635e21c95160e11b81526001600160a01b0383166004820152602401610068565b60155481101561069957604051635590a88f60e01b815260040160405180910390fd5b6001600160a01b0382165f8181526019602052604090819020839055517fd6592600c10ce111686dad4215b4d9e58f7c92fa2ad2b1a72c4ff3af9f8c9e45906106e59084815260200190565b60405180910390a25050565b6001600160a01b0381166107185760405163065d37a560e51b815260040160405180910390fd5b50565b805f03610718576040516392d5f43760e01b815260040160405180910390fd5b5f5f8260405160200161074e9190610cce565b60405160208183030381529060405290505f816040516020016107719190610ce6565b60405160208183030381529060405290508051602082015ff092506001600160a01b0383166107d65760405162461bcd60e51b81526020600482015260116024820152701111541313d65351539517d19052531151607a1b6044820152606401610068565b5050919050565b634e487b7160e01b5f52604160045260245ffd5b604051601f8201601f191681016001600160401b0381118282101715610819576108196107dd565b604052919050565b5f82601f830112610830575f5ffd5b81516001600160401b03811115610849576108496107dd565b61085c601f8201601f19166020016107f1565b818152846020838601011115610870575f5ffd5b8160208501602083015e5f918101602001919091529392505050565b80516001600160a01b03811681146108a2575f5ffd5b919050565b5f82601f8301126108b6575f5ffd5b81516001600160401b038111156108cf576108cf6107dd565b8060051b6108df602082016107f1565b918252602081850181019290810190868411156108fa575f5ffd5b6020860192505b8383101561091c578251825260209283019290910190610901565b9695505050505050565b5f60408284031215610936575f5ffd5b604080519081016001600160401b0381118282101715610958576109586107dd565b604052825181526020928301519281019290925250919050565b5f5f5f5f5f5f5f5f5f5f5f6101808c8e03121561098d575f5ffd5b8b516001600160401b038111156109a2575f5ffd5b6109ae8e828f01610821565b60208e0151909c5090506001600160401b038111156109cb575f5ffd5b6109d78e828f01610821565b9a50506109e660408d0161088c565b98506109f460608d0161088c565b9750610a0260808d0161088c565b9650610a1060a08d0161088c565b60c08d01519096506001600160401b03811115610a2b575f5ffd5b610a378e828f01610821565b955050610a4660e08d0161088c565b6101008d01519094506001600160401b03811115610a62575f5ffd5b610a6e8e828f016108a7565b935050610a7f8d6101208e01610926565b91505f6101608d01519050809150509295989b509295989b9093969950565b600181811c90821680610ab257607f821691505b602082108103610ad057634e487b7160e01b5f52602260045260245ffd5b50919050565b601f821115610b1d57805f5260205f20601f840160051c81016020851015610afb5750805b601f840160051c820191505b81811015610b1a575f8155600101610b07565b50505b505050565b81516001600160401b03811115610b3b57610b3b6107dd565b610b4f81610b498454610a9e565b84610ad6565b6020601f821160018114610b81575f8315610b6a5750848201515b5f19600385901b1c1916600184901b178455610b1a565b5f84815260208120601f198516915b82811015610bb05787850151825560209485019460019092019101610b90565b5084821015610bcd57868401515f19600387901b60f8161c191681555b50505050600190811b01905550565b81810381811115610bfb57634e487b7160e01b5f52601160045260245ffd5b92915050565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b608081525f610c416080830187610c01565b8281036020840152610c538187610c01565b604084019590955250506001600160a01b039190911660609091015292915050565b602080825282518282018190525f918401906040840190835b81811015610cac578351835260209384019390920191600101610c8e565b509095945050505050565b5f81518060208401855e5f93019283525090919050565b5f81525f610cdf6001830184610cb7565b9392505050565b6a600b5981380380925939f360a81b81525f610cdf600b830184610cb7565b60805160a0516147fc610d495f395f8181610722015281816136ca01528181613b440152613baf01525f81816107f10152818161241a015261349801526147fc5ff3fe6080604052600436106104a5575f3560e01c806375829def11610262578063cd67de001161014a578063e852b80a116100be578063f3a0ce4111610083578063f3a0ce4114610ef3578063f4a0a52814610f12578063f5d3647514610f31578063f851a44014610f46578063f8f2d60e14610f64578063fbc4e9a014610f83575f5ffd5b8063e852b80a14610e57578063e8a3d48514610e76578063e985e9c514610e8a578063ef811cea14610ea9578063f2fde38b14610ed4575f5ffd5b8063d61175291161010f578063d611752914610dbc578063d73792a914610ddb578063d97b6b1514610df0578063e19b2aa914610e0f578063e2f7186614610e23578063e76e713714610e42575f5ffd5b8063cd67de0014610d15578063cfa3c13214610d40578063d2c678e014610d6b578063d331caa014610d8a578063d5e31ee714610da9575f5ffd5b80639d888e86116101e1578063b88d4fde116101a6578063b88d4fde14610be9578063c05e264a14610c08578063c678a48c14610c35578063c73ee9ff14610c48578063c87b56dd14610c91578063cc33c87514610cb0575f5ffd5b80639d888e8614610b395780639d934e1b14610b4e578063a22cb46514610b61578063ace2bed514610b80578063b6c58c7a14610bae575f5ffd5b80638bad0c0a116102275780638bad0c0a14610ab65780638da5cb5b14610aca57806395d89b4114610ae7578063983b115c14610afb578063993fdf6914610b1a575f5ffd5b806375829def14610a215780637ab4156714610a405780638456cb5914610a5357806386dccbcb14610a6757806387114b8c14610a86575f5ffd5b806342842e0e116103905780635e280991116103045780636a627842116102c95780636a627842146109635780636c8af435146109765780636f8b44b0146109ba57806370a08231146109d9578063715018a6146109f857806375794a3c14610a0c575f5ffd5b80635e280991146108dc5780636352211e146108fb57806363d813c51461091a578063650df725146109395780636701c9781461094e575f5ffd5b80634bc9444c116103555780634bc9444c146108285780634f6ccce7146108475780634fcb15a51461086657806354de1cd9146108855780635a1c585c146108a45780635c975abb146108be575f5ffd5b806342842e0e1461078257806342966c68146107a157806343508b05146107c0578063483a5f14146107e057806348733c5514610813575f5ffd5b806318160ddd116104275780632f745c59116103ec5780632f745c59146106c95780633143e7fc146106e85780633f4ba83a146106fd5780633fc8cef314610711578063415f12401461074457806341d3b18014610763575f5ffd5b806318160ddd1461061f5780632101b9091461063d57806323b872dd1461065c5780632b2910581461067b5780632bb27cea146106aa575f5ffd5b8063081812fc1161046d578063081812fc1461056c578063095ea7b3146105a35780630b7eee94146105c25780630ba1baf2146105e157806316db87a614610600575f5ffd5b806301ffc9a7146104a957806303f13e25146104dd578063044cc4261461050b5780630590a0901461052c57806306fdde031461054b575b5f5ffd5b3480156104b4575f5ffd5b506104c86104c3366004613e68565b610f96565b60405190151581526020015b60405180910390f35b3480156104e8575f5ffd5b506104c86104f7366004613e68565b600c6020525f908152604090205460ff1681565b348015610516575f5ffd5b5061052a610525366004613e99565b611009565b005b348015610537575f5ffd5b5061052a610546366004613ec1565b611066565b348015610556575f5ffd5b5061055f61116d565b6040516104d49190613f28565b348015610577575f5ffd5b5061058b610586366004613f3a565b6111fd565b6040516001600160a01b0390911681526020016104d4565b3480156105ae575f5ffd5b5061052a6105bd366004613f51565b611224565b3480156105cd575f5ffd5b5061052a6105dc366004613f3a565b611233565b3480156105ec575f5ffd5b5061052a6105fb366004613fbd565b611244565b34801561060b575f5ffd5b5061052a61061a366004613e99565b611255565b34801561062a575f5ffd5b506009545b6040519081526020016104d4565b348015610648575f5ffd5b506104c8610657366004614067565b611266565b348015610667575f5ffd5b5061052a610676366004614091565b611284565b348015610686575f5ffd5b50601754601854610695919082565b604080519283526020830191909152016104d4565b3480156106b5575f5ffd5b5060105461058b906001600160a01b031681565b3480156106d4575f5ffd5b5061062f6106e3366004613f51565b61130d565b3480156106f3575f5ffd5b5061062f61232881565b348015610708575f5ffd5b5061052a611370565b34801561071c575f5ffd5b5061058b7f000000000000000000000000000000000000000000000000000000000000000081565b34801561074f575f5ffd5b5061052a61075e366004613f3a565b611382565b34801561076e575f5ffd5b5061052a61077d366004613e68565b6113de565b34801561078d575f5ffd5b5061052a61079c366004614091565b6113ef565b3480156107ac575f5ffd5b5061052a6107bb366004613f3a565b61140e565b6107d36107ce366004613f51565b611420565b6040516104d49190614105565b3480156107eb575f5ffd5b5061058b7f000000000000000000000000000000000000000000000000000000000000000081565b34801561081e575f5ffd5b5061062f60115481565b348015610833575f5ffd5b5061052a610842366004614117565b611434565b348015610852575f5ffd5b5061062f610861366004613f3a565b61148d565b348015610871575f5ffd5b5061052a610880366004614117565b6114e2565b348015610890575f5ffd5b5061052a61089f3660046141c2565b611538565b3480156108af575f5ffd5b5061062f66038d7ea4c6800081565b3480156108c9575f5ffd5b50600b54600160a01b900460ff166104c8565b3480156108e7575f5ffd5b506104c86108f6366004614067565b611556565b348015610906575f5ffd5b5061058b610915366004613f3a565b6115c9565b348015610925575f5ffd5b5061052a610934366004613e99565b6115d3565b348015610944575f5ffd5b5061062f60135481565b348015610959575f5ffd5b5061062f6109c481565b61062f610971366004613e99565b6115e4565b348015610981575f5ffd5b50610995610990366004613f3a565b611618565b604080516001600160a01b0390941684526020840192909252908201526060016104d4565b3480156109c5575f5ffd5b5061052a6109d4366004613f3a565b611645565b3480156109e4575f5ffd5b5061062f6109f3366004613e99565b611656565b348015610a03575f5ffd5b5061052a61169b565b348015610a17575f5ffd5b5061062f60165481565b348015610a2c575f5ffd5b5061052a610a3b366004613e99565b6116ac565b61062f610a4e366004614067565b6116be565b348015610a5e575f5ffd5b5061052a611735565b348015610a72575f5ffd5b50600f5461058b906001600160a01b031681565b348015610a91575f5ffd5b50610aa5610aa0366004613f3a565b611745565b6040516104d495949392919061426f565b348015610ac1575f5ffd5b5061052a611892565b348015610ad5575f5ffd5b50600b546001600160a01b031661058b565b348015610af2575f5ffd5b5061055f6118a4565b348015610b06575f5ffd5b5061052a610b15366004613e68565b6118b3565b348015610b25575f5ffd5b5061052a610b34366004613f3a565b6118c4565b348015610b44575f5ffd5b5061062f60125481565b348015610b59575f5ffd5b5061058b5f81565b348015610b6c575f5ffd5b5061052a610b7b3660046142c7565b6118d5565b348015610b8b575f5ffd5b506104c8610b9a366004613e99565b601a6020525f908152604090205460ff1681565b348015610bb9575f5ffd5b50610bdc610bc8366004613f3a565b601e6020525f908152604090205460ff1681565b6040516104d49190614303565b348015610bf4575f5ffd5b5061052a610c03366004614329565b6118e0565b348015610c13575f5ffd5b50610c27610c2236600461438c565b6118f8565b6040516104d49291906143ac565b6107d3610c4336600461440d565b611ac8565b348015610c53575f5ffd5b50610c67610c6236600461438c565b611ae8565b604080516001600160a01b03909516855260208501939093529183015260608201526080016104d4565b348015610c9c575f5ffd5b5061055f610cab366004613f3a565b611b15565b348015610cbb575f5ffd5b50610cf3610cca366004613f3a565b601f6020525f908152604090208054600182015460028301546003909301549192909160ff1684565b60408051948552602085019390935291830152151560608201526080016104d4565b348015610d20575f5ffd5b5061062f610d2f366004613e99565b60196020525f908152604090205481565b348015610d4b575f5ffd5b5061062f610d5a366004613f3a565b601c6020525f908152604090205481565b348015610d76575f5ffd5b5061052a610d85366004613f51565b611d8a565b348015610d95575f5ffd5b50600e5461058b906001600160a01b031681565b6107d3610db736600461440d565b611d9c565b348015610dc7575f5ffd5b5061052a610dd6366004613f3a565b611da9565b348015610de6575f5ffd5b5061062f61271081565b348015610dfb575f5ffd5b5061052a610e0a366004613fbd565b611dba565b348015610e1a575f5ffd5b5061062f602881565b348015610e2e575f5ffd5b5061052a610e3d366004613e99565b611df8565b348015610e4d575f5ffd5b5061062f60145481565b348015610e62575f5ffd5b5061052a610e71366004613f3a565b611e4c565b348015610e81575f5ffd5b5061055f611e5d565b348015610e95575f5ffd5b506104c8610ea436600461442f565b611edd565b348015610eb4575f5ffd5b5061062f610ec3366004613f3a565b601b6020525f908152604090205481565b348015610edf575f5ffd5b5061052a610eee366004613e99565b611f0a565b348015610efe575f5ffd5b5061052a610f0d366004613f3a565b611f44565b348015610f1d575f5ffd5b5061052a610f2c366004613f3a565b611f87565b348015610f3c575f5ffd5b5061062f60155481565b348015610f51575f5ffd5b505f5461058b906001600160a01b031681565b348015610f6f575f5ffd5b5061052a610f7e366004613e99565b611fd4565b6107d3610f9136600461440d565b6120b3565b5f6001600160e01b031982166301ffc9a760e01b1480610fbe57506001600160e01b03198216155b80610fd957506001600160e01b0319821663e8a3d48560e01b145b80610ff457506001600160e01b031982166389b656d560e01b145b80611003575061100382612113565b92915050565b611011612137565b6001600160a01b0381165f908152601a602052604090205460ff161561105a57604051633d4c308960e11b81526001600160a01b03821660048201526024015b60405180910390fd5b61106381612175565b50565b8233611071826115c9565b6001600160a01b03161461109a576040516339e3563760e11b8152336004820152602401611051565b6110a3846121c0565b60025f858152601e602052604090205460ff1660028111156110c7576110c76142ef565b146110e8576040516315e92dc360e21b815260048101859052602401611051565b81611109575f848152601d6020526040902061110490846121f4565b611120565b5f848152601d602052604090206111209084612208565b50826001600160a01b0316847f91250d9126fc3970ac4c20561f31fd5d68f5b881624b48f6347fadc1527122968460405161115f911515815260200190565b60405180910390a350505050565b60606001805461117c90614457565b80601f01602080910402602001604051908101604052809291908181526020018280546111a890614457565b80156111f35780601f106111ca576101008083540402835291602001916111f3565b820191905f5260205f20905b8154815290600101906020018083116111d657829003601f168201915b5050505050905090565b5f6112078261221c565b505f828152600560205260409020546001600160a01b0316611003565b61122f828233612254565b5050565b61123b612137565b61106381612261565b61124c61229d565b611063816122ca565b61125d61229d565b611063816122f9565b5f828152601d6020526040812061127d908361234b565b9392505050565b6001600160a01b0382166112ad57604051633250574960e11b81525f6004820152602401611051565b5f6112b983833361236c565b9050836001600160a01b0316816001600160a01b031614611307576040516364283d7b60e01b81526001600160a01b0380861660048301526024820184905282166044820152606401611051565b50505050565b5f61131783611656565b82106113485760405163295f44f760e21b81526001600160a01b038416600482015260248101839052604401611051565b506001600160a01b03919091165f908152600760209081526040808320938352929052205490565b611378612137565b611380612383565b565b61138a6123d8565b5f611394826123f4565b905081336001600160a01b03167f9068629cb06e90072db057cc69f69baca240a3c54d09f0227bf648aeb5e476ef836040516113d291815260200190565b60405180910390a35050565b6113e6612137565b61106381612446565b61140983838360405180602001604052805f8152506118e0565b505050565b6114178161249b565b611063816124d0565b606061142a6123d8565b61127d83836124db565b61143c6123d8565b8133611447826115c9565b6001600160a01b031614611470576040516339e3563760e11b8152336004820152602401611051565b6114798361249b565b61148383336125d9565b6114098383612635565b5f61149760095490565b82106114bf5760405163295f44f760e21b81525f600482015260248101839052604401611051565b600982815481106114d2576114d261448f565b905f5260205f2001549050919050565b81336114ed826115c9565b6001600160a01b031614611516576040516339e3563760e11b8152336004820152602401611051565b5f838152601f602052604090206003015460ff166114835761148383336125d9565b611540612137565b61154e8686868686866126a0565b505050505050565b5f805f848152601e602052604090205460ff16600281111561157a5761157a6142ef565b0361158657505f611003565b60025f848152601e602052604090205460ff1660028111156115aa576115aa6142ef565b036115c0576115b98383611266565b9050611003565b50600192915050565b5f6110038261221c565b6115db612137565b611063816127c1565b5f6115ed6123d8565b6115f88260016124db565b5f815181106116095761160961448f565b60200260200101519050919050565b600f546001600160a01b03165f818152601960205260408120549061163d84836144b7565b929491935050565b61164d612137565b61106381612813565b5f6001600160a01b038216611680576040516322718ad960e21b81525f6004820152602401611051565b506001600160a01b03165f9081526004602052604090205490565b6116a361229d565b6113805f612848565b6116b4612137565b6110633382612899565b5f6116c76123d8565b6116d0836123f4565b506116dc8260016124db565b5f815181106116ed576116ed61448f565b602002602001015190508083336001600160a01b03167f483806fe19c49d57531cc537af43a240b9dc05f4d3ca666699c3f09a5a41c71860405160405180910390a492915050565b61173d612137565b6113806128e7565b602080525f9081526040902080546001820180546001600160a01b03909216929161176f90614457565b80601f016020809104026020016040519081016040528092919081815260200182805461179b90614457565b80156117e65780601f106117bd576101008083540402835291602001916117e6565b820191905f5260205f20905b8154815290600101906020018083116117c957829003601f168201915b5050505050908060020180546117fb90614457565b80601f016020809104026020016040519081016040528092919081815260200182805461182790614457565b80156118725780601f1061184957610100808354040283529160200191611872565b820191905f5260205f20905b81548152906001019060200180831161185557829003601f168201915b5050505060038301546004909301549192916001600160a01b0316905085565b61189a612137565b611380335f612899565b60606002805461117c90614457565b6118bb612137565b6110638161292a565b6118cc612137565b6110638161297c565b61122f3383836129b1565b6118eb848484611284565b6113073385858585612a4f565b6060806119048461221c565b505f848152601c60205260409020546001905b801580159061192557508482105b1561194d5781611934816144ce565b5f928352601c6020526040909220549192506119179050565b816001600160401b0381111561196557611965613f79565b60405190808252806020026020018201604052801561198e578160200160208202803683370190505b509350816001600160401b038111156119a9576119a9613f79565b6040519080825280602002602001820160405280156119d2578160200160208202803683370190505b50925085845f815181106119e8576119e861448f565b6020026020010181815250506119fd866115c9565b835f81518110611a0f57611a0f61448f565b6001600160a01b039092166020928302919091018201525f878152601c9091526040902054905060015b8115801590611a4757508281105b15611abe5781858281518110611a5f57611a5f61448f565b602002602001018181525050611a74826115c9565b848281518110611a8657611a8661448f565b6001600160a01b039092166020928302919091018201525f928352601c90526040909120549080611ab6816144ce565b915050611a39565b5050509250929050565b6060611ad5846002611434565b611ae08484846120b3565b949350505050565b5f5f5f5f611af585611618565b91955093509150611b068287612b75565b50959894975092955093505050565b6060611b208261221c565b505f828152601f60209081526040808320600190810154808552838052828520835160a0810190945280546001600160a01b031684529182018054919594840191611b6a90614457565b80601f0160208091040260200160405190810160405280929190818152602001828054611b9690614457565b8015611be15780601f10611bb857610100808354040283529160200191611be1565b820191905f5260205f20905b815481529060010190602001808311611bc457829003601f168201915b50505050508152602001600282018054611bfa90614457565b80601f0160208091040260200160405190810160405280929190818152602001828054611c2690614457565b8015611c715780601f10611c4857610100808354040283529160200191611c71565b820191905f5260205f20905b815481529060010190602001808311611c5457829003601f168201915b5050509183525050600382015460208201526004909101546001600160a01b031660409091015280516060820151919250905f90861115611cb6578260200151611cbc565b82604001515b60808401519091505f8282611cd08a6115c9565b5f8b8152601f6020908152604080832060020154815180840183529384529051611cff969594939192016144e6565b60408051601f1981840301815290829052634bda247160e11b825291506001600160a01b038516906397b448e290611d3d908b908590600401614528565b5f60405180830381865afa158015611d57573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611d7e9190810190614540565b98975050505050505050565b611d9261229d565b61122f8282612c2b565b6060611ad5846001611434565b611db1612137565b61106381612cdd565b611dc26123d8565b80515f5b8181101561140957611df0838281518110611de357611de361448f565b6020026020010151611382565b600101611dc6565b611e0061229d565b6001600160a01b0381165f908152601a602052604090205460ff16611e4357604051635e21c95160e11b81526001600160a01b0382166004820152602401611051565b61106381612d12565b611e54612137565b61106381612d63565b6012545f90815260208052604080822054815163e8a3d48560e01b815291516060936001600160a01b0390921692839263e8a3d485926004808401938290030181865afa158015611eb0573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611ed79190810190614540565b91505090565b6001600160a01b039182165f90815260066020908152604080832093909416825291909152205460ff1690565b611f1261229d565b6001600160a01b038116611f3b57604051631e4fbdf760e01b81525f6004820152602401611051565b61106381612848565b611f4c612137565b611f5581612dce565b601281905560405181907ff5b43300bd24eab1c8c92f84726e5c0df6ad7d2e9ac9ebc17c6047091803d7ad905f90a250565b611f8f61229d565b601780549082905560408051828152602081018490527f2e1c9e000c6e8dda4d03536adb13b7cb6034ccff90d17f01de381e4d5097b525910160405180910390a15050565b611fdc612137565b6001600160a01b0381165f908152601a602052604090205460ff1661201f57604051635e21c95160e11b81526001600160a01b0382166004820152602401611051565b6001600160a01b03811615806120425750600f546001600160a01b038281169116145b1561206b57604051631823257760e31b81526001600160a01b0382166004820152602401611051565b6001600160a01b0381165f818152601a6020526040808220805460ff19169055517f9f175a2c76887d68aeea50d85ebf1e5be6dbf2324b7566b671d29568d0b2ec899190a250565b60606120bd6123d8565b6120c6846121c0565b336120d0856115c9565b6001600160a01b031614612108576120e88433611556565b61210857604051631c250d8f60e01b815260048101859052602401611051565b611ae0848484612dee565b5f6001600160e01b0319821663780e9d6360e01b1480611003575061100382612f2e565b5f546001600160a01b03163314611380575f546040516317b75e8b60e01b81526001600160a01b039091166004820152336024820152604401611051565b6001600160a01b0381165f818152601a6020526040808220805460ff19166001179055517f052a14e122efcd42e31a786e7b87546757adcfae559f9dd379263c20b1758a1e9190a250565b5f818152601f602052604090206003015460ff16611063576040516385dc19b560e01b815260048101829052602401611051565b5f61127d836001600160a01b038416612f7d565b5f61127d836001600160a01b038416613060565b5f818152600360205260408120546001600160a01b03168061100357604051637e27328960e01b815260048101849052602401611051565b61140983838360016130ac565b60138190556040518181527fe51b1f1789c4d3b2b2cbca6f3c85525e95feb549832e82313520202e21d1f709906020015b60405180910390a150565b600b546001600160a01b031633146113805760405163118cdaa760e01b8152336004820152602401611051565b7f91d93ab23c0e928561b37be74dc3858c4f7f90f67399c0e151f266b47b79a0f3816040516122929190614105565b612302816131b0565b600e80546001600160a01b0319166001600160a01b0383169081179091556040517f56b1a8af191f8719bb31fbb37a82fc3f6169b98f9cc1ec77aac41d3c27605dd5905f90a250565b6001600160a01b0381165f908152600183016020526040812054151561127d565b5f6123788484846131d7565b905061127d836132a2565b61238b61332e565b600b805460ff60a01b191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a1565b6123e0613358565b6113805f356001600160e01b031916613383565b5f6123fe8261140e565b505f818152601f60205260409020546124416001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001633836133c9565b919050565b61244f81613383565b6001600160e01b031981165f818152600c6020526040808220805460ff19166001179055517f0e537dd2f63ec58dc3739dffa33dcf389cf602fbfc51cf36546d7b07af7df41e9190a250565b5f818152601f602052604090206003015460ff161561106357604051633b50770760e21b815260048101829052602401611051565b61122f5f823361236c565b60606124e682613428565b6017546124f3818461347e565b5f836001600160401b0381111561250c5761250c613f79565b604051908082528060200260200182016040528015612535578160200160208202803683370190505b5092505f5b848110156125c65760168054905f612551836144ce565b9190505591508184828151811061256a5761256a61448f565b6020908102919091018101919091525f838152601f82526040808220868155601254600190910155601b9092529081208054916125a6836144ce565b91905055506125b586836134c0565b6125be82613521565b60010161253a565b506125d15f856135c6565b505092915050565b5f828152601f6020908152604091829020600301805460ff1916600190811790915591519182526001600160a01b0383169184917fdc5bcdc9157d00d0837a32a2c216f77981e322b698cf643e311e76f0c1176bdc91016113d2565b5f828152601e60205260409020805482919060ff1916600183600281111561265f5761265f6142ef565b0217905550817fd5a49a2b076be59c45ee1951768e86e0deee94e58e1ffa3096ee1a233258a316826040516126949190614303565b60405180910390a25050565b6126a986612dce565b6126b2856131b0565b80515f90156126c7576126c48261370e565b90505b6040805160a0810182526001600160a01b03888116825260208083018981528385018990526060840188905285831660808501525f8c8152918052939020825181546001600160a01b03191692169190911781559151909190600182019061272f90826145f8565b506040820151600282019061274490826145f8565b5060608201516003820155608090910151600490910180546001600160a01b0319166001600160a01b039283161790556040519087169088907fc966c75c829f551b25422c917f6d264c7a6c3d65daa76475379b1815fa81ef01906127b09089908990899088906146b2565b60405180910390a350505050505050565b6127ca816131b0565b601080546001600160a01b0319166001600160a01b0383169081179091556040517fd7e625e1513d15a58573e07ef53deed06c48fc99e3a85669d91cd1f3e8470a5a905f90a250565b60188190556040518181527f7810bd47de260c3e9ee10061cf438099dd12256c79485f12f94dbccc981e806c90602001612292565b600b80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b5f80546001600160a01b0319166001600160a01b0383811691821783556040519192908516917fbdd36143ee09de60bdefca70680e0f71189b2ed7acee364b53917ad433fdaf809190a35050565b6128ef6123d8565b600b805460ff60a01b1916600160a01b1790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586123bb3390565b612933816137b0565b6001600160e01b031981165f818152600c6020526040808220805460ff19169055517f2727e23868bf9fbf6f8140b8ae0ddca078eb0c3cb157939f35724bcaf7de6fae9190a250565b60148190556040518181527f70d78751ad6132096f2a8a93ceab22525b96ac344bb2040600ea2515ffb437c690602001612292565b6001600160a01b0382166129e357604051630b61174360e31b81526001600160a01b0383166004820152602401611051565b6001600160a01b038381165f81815260066020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b6001600160a01b0383163b15612b6e57604051630a85bd0160e11b81526001600160a01b0384169063150b7a0290612a919088908890879087906004016146f8565b6020604051808303815f875af1925050508015612acb575060408051601f3d908101601f19168201909252612ac891810190614734565b60015b612b32573d808015612af8576040519150601f19603f3d011682016040523d82523d5f602084013e612afd565b606091505b5080515f03612b2a57604051633250574960e11b81526001600160a01b0385166004820152602401611051565b805181602001fd5b6001600160e01b03198116630a85bd0160e11b1461154e57604051633250574960e11b81526001600160a01b0385166004820152602401611051565b5050505050565b5f818152601b6020526040812054601354829182918291908290612b9a9083906144b7565b9050612710612ba9828a6144b7565b612bb3919061474f565b95505f612bc160028861474f565b90505f612bce828961476e565b9050612bda848361474f565b9450601454841115612c0f575f60145486612bf591906144b7565b9050612c01818461476e565b612c0b9083614781565b9150505b612c18816137f5565b989b909a50979850939695505050505050565b6001600160a01b0382165f908152601a602052604090205460ff16612c6e57604051635e21c95160e11b81526001600160a01b0383166004820152602401611051565b601554811015612c9157604051635590a88f60e01b815260040160405180910390fd5b6001600160a01b0382165f8181526019602052604090819020839055517fd6592600c10ce111686dad4215b4d9e58f7c92fa2ad2b1a72c4ff3af9f8c9e45906126949084815260200190565b60158190556040518181527fd94318f0d3bc0eb93ae168cbc5e3bb1d4399a4bebc8da99ba523a1ce82d7f41790602001612292565b600f80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f6a6a9a9fe556cfe04398a0a94dcbc1bd6513b0a2049635fde08c04377b1ce06f905f90a35050565b612710811115612d865760405163a27d364960e01b815260040160405180910390fd5b60118190557f98fa1e060c5dc541067608e2ea477f438fb1617efc9546b527c1eb8c935fb17981612db98161271061476e565b60408051928352602083019190915201612292565b805f03611063576040516392d5f43760e01b815260040160405180910390fd5b6060612df982613428565b601754612e06818461347e565b5f836001600160401b03811115612e1f57612e1f613f79565b604051908082528060200260200182016040528015612e48578160200160208202803683370190505b5092505f5b84811015612f1a5760168054905f612e64836144ce565b91905055915081848281518110612e7d57612e7d61448f565b6020908102919091018101919091525f838152601f82526040808220868155601254600191820155601c84528183208b90558a8352601b909352902054612ec391614781565b5f838152601b6020526040902055612edb86836134c0565b612ee482613521565b6040518290889033907f81d45b7db483300ecc74040692ae45614632cf2274950ca4c1c9a408b81ec161905f90a4600101612e4d565b50612f2586856135c6565b50509392505050565b5f6001600160e01b031982166380ac58cd60e01b1480612f5e57506001600160e01b03198216635b5e139f60e01b145b8061100357506301ffc9a760e01b6001600160e01b0319831614611003565b5f8181526001830160205260408120548015613057575f612f9f60018361476e565b85549091505f90612fb29060019061476e565b9050808214613011575f865f018281548110612fd057612fd061448f565b905f5260205f200154905080875f018481548110612ff057612ff061448f565b5f918252602080832090910192909255918252600188019052604090208390555b855486908061302257613022614794565b600190038181905f5260205f20015f90559055856001015f8681526020019081526020015f205f905560019350505050611003565b5f915050611003565b5f8181526001830160205260408120546130a557508154600181810184555f848152602080822090930184905584548482528286019093526040902091909155611003565b505f611003565b80806130c057506001600160a01b03821615155b15613181575f6130cf8461221c565b90506001600160a01b038316158015906130fb5750826001600160a01b0316816001600160a01b031614155b801561310e575061310c8184611edd565b155b156131375760405163a9fbf51f60e01b81526001600160a01b0384166004820152602401611051565b811561317f5783856001600160a01b0316826001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45b505b50505f90815260056020526040902080546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b0381166110635760405163065d37a560e51b815260040160405180910390fd5b5f5f6131e4858585613825565b90506001600160a01b0381166132405761323b84600980545f838152600a60205260408120829055600182018355919091527f6e1540171b6c0c960b71a7020d9f60077f6af931a8bbf590da0223dacf75c7af0155565b613263565b846001600160a01b0316816001600160a01b031614613263576132638185613917565b6001600160a01b03851661327f5761327a84613994565b611ae0565b846001600160a01b0316816001600160a01b031614611ae057611ae08585613a3b565b5f818152601e60209081526040808320805460ff19169055601d90915281205b5f6132cc82613a89565b1115611409576132dc815f613a92565b91506132e881836121f4565b506040515f81526001600160a01b0383169084907f91250d9126fc3970ac4c20561f31fd5d68f5b881624b48f6347fadc1527122969060200160405180910390a36132c2565b600b54600160a01b900460ff1661138057604051638dfc202b60e01b815260040160405180910390fd5b600b54600160a01b900460ff16156113805760405163d93c066560e01b815260040160405180910390fd5b6001600160e01b031981165f908152600c602052604090205460ff161561106357604051639b3eea4f60e01b81526001600160e01b031982166004820152602401611051565b6040516001600160a01b0383811660248301526044820183905261140991859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180516001600160e01b038381831617835250505050613a9d565b805f036134485760405163fc62281f60e01b815260040160405180910390fd5b6018548161345560095490565b61345f9190614781565b111561106357604051633a498ca960e21b815260040160405180910390fd5b5f61348982846144b7565b90506114096001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016333084613b09565b6001600160a01b0382166134e957604051633250574960e11b81525f6004820152602401611051565b5f6134f583835f61236c565b90506001600160a01b03811615611409576040516339e3563760e11b81525f6004820152602401611051565b5f81334361353060018261476e565b4060405160200161356c949392919093845260609290921b6bffffffffffffffffffffffff191660208401526034830152605482015260740190565b60408051808303601f1901815282825280516020918201205f868152601f83529290922060020182905581835290925083917fee54cd279bede6cac79e08069d8021b5159ab3141574127e06d78822ba8a83559101612694565b5f5f5f6135d284611618565b919450925090506001600160a01b0383161580156135ee575081155b15613612573415612b6e5760405163108a5ab160e11b815260040160405180910390fd5b6001600160a01b0383161561364e5734156136405760405163108a5ab160e11b815260040160405180910390fd5b815f0361364e575050505050565b805f8061365a836137f5565b915091505f6060895f146136ba575f5f5f613675898e612b75565b601454909850929550909350915061368e908e906118f8565b945061369c90508389614781565b97506136a88288614781565b96506136b48187614781565b95505050505b6001600160a01b0388166136f4577f000000000000000000000000000000000000000000000000000000000000000097506136f485613b42565b613702888686868686613bad565b50505050505050505050565b5f5f8260405160200161372191906147bf565b60405160208183030381529060405290505f8160405160200161374491906147d0565b60405160208183030381529060405290508051602082015ff092506001600160a01b0383166137a95760405162461bcd60e51b81526020600482015260116024820152701111541313d65351539517d19052531151607a1b6044820152606401611051565b5050919050565b6001600160e01b031981165f908152600c602052604090205460ff1661106357604051631d7e88d160e21b81526001600160e01b031982166004820152602401611051565b5f5f6127106011548461380891906144b7565b613812919061474f565b915061381e828461476e565b9050915091565b5f828152600360205260408120546001600160a01b039081169083161561385157613851818486613ce7565b6001600160a01b0381161561388b5761386c5f855f5f6130ac565b6001600160a01b0381165f90815260046020526040902080545f190190555b6001600160a01b038516156138b9576001600160a01b0385165f908152600460205260409020805460010190555b5f8481526003602052604080822080546001600160a01b0319166001600160a01b0389811691821790925591518793918516917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4949350505050565b5f61392183611656565b5f838152600860209081526040808320546001600160a01b0388168452600790925290912091925090818314613976575f83815260208281526040808320548584528184208190558352600890915290208290555b5f938452600860209081526040808620869055938552525081205550565b6009545f906139a59060019061476e565b5f838152600a6020526040812054600980549394509092849081106139cc576139cc61448f565b905f5260205f200154905080600983815481106139eb576139eb61448f565b5f918252602080832090910192909255828152600a90915260408082208490558582528120556009805480613a2257613a22614794565b600190038181905f5260205f20015f9055905550505050565b5f6001613a4784611656565b613a51919061476e565b6001600160a01b039093165f908152600760209081526040808320868452825280832085905593825260089052919091209190915550565b5f611003825490565b5f61127d8383613d4b565b5f5f60205f8451602086015f885af180613abc576040513d5f823e3d81fd5b50505f513d91508115613ad3578060011415613ae0565b6001600160a01b0384163b155b1561130757604051635274afe760e01b81526001600160a01b0385166004820152602401611051565b6040516001600160a01b0384811660248301528381166044830152606482018390526113079186918216906323b872dd906084016133f6565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db0826040518263ffffffff1660e01b81526004015f604051808303818588803b158015613b9b575f5ffd5b505af115801561154e573d5f5f3e3d5ffd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316866001600160a01b031614613bfb57613bfb6001600160a01b038716333088613b09565b600e54613c15906001600160a01b038881169116866133c9565b601054613c2f906001600160a01b038881169116856133c9565b8115613c81575f5b8151811015613c7f57613c77828281518110613c5557613c5561448f565b602002602001015184896001600160a01b03166133c99092919063ffffffff16565b600101613c37565b505b805160408051878152602081018690529081018690526060810184905260808101919091526001600160a01b038716907f03ec14d75c910d763ab7c70a90a965e1a1943a4b5c9c869c67bb221f37b1a2ae9060a00160405180910390a261154e85613d71565b613cf2838383613df2565b611409576001600160a01b038316613d2057604051637e27328960e01b815260048101829052602401611051565b60405163177e802f60e01b81526001600160a01b038316600482015260248101829052604401611051565b5f825f018281548110613d6057613d6061448f565b905f5260205f200154905092915050565b80341115611063575f613d84823461476e565b6040519091505f90339061753090849084818181858888f193505050503d805f8114613dcb576040519150601f19603f3d011682016040523d82523d5f602084013e613dd0565b606091505b505090508061140957604051632e1be09f60e01b815260040160405180910390fd5b5f6001600160a01b03831615801590611ae05750826001600160a01b0316846001600160a01b03161480613e2b5750613e2b8484611edd565b80611ae05750505f908152600560205260409020546001600160a01b03908116911614919050565b6001600160e01b031981168114611063575f5ffd5b5f60208284031215613e78575f5ffd5b813561127d81613e53565b80356001600160a01b0381168114612441575f5ffd5b5f60208284031215613ea9575f5ffd5b61127d82613e83565b80358015158114612441575f5ffd5b5f5f5f60608486031215613ed3575f5ffd5b83359250613ee360208501613e83565b9150613ef160408501613eb2565b90509250925092565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f61127d6020830184613efa565b5f60208284031215613f4a575f5ffd5b5035919050565b5f5f60408385031215613f62575f5ffd5b613f6b83613e83565b946020939093013593505050565b634e487b7160e01b5f52604160045260245ffd5b604051601f8201601f191681016001600160401b0381118282101715613fb557613fb5613f79565b604052919050565b5f60208284031215613fcd575f5ffd5b81356001600160401b03811115613fe2575f5ffd5b8201601f81018413613ff2575f5ffd5b80356001600160401b0381111561400b5761400b613f79565b8060051b61401b60208201613f8d565b91825260208184018101929081019087841115614036575f5ffd5b6020850194505b8385101561405c5784358083526020958601959093509091019061403d565b979650505050505050565b5f5f60408385031215614078575f5ffd5b8235915061408860208401613e83565b90509250929050565b5f5f5f606084860312156140a3575f5ffd5b6140ac84613e83565b92506140ba60208501613e83565b929592945050506040919091013590565b5f8151808452602084019350602083015f5b828110156140fb5781518652602095860195909101906001016140dd565b5093949350505050565b602081525f61127d60208301846140cb565b5f5f60408385031215614128575f5ffd5b8235915060208301356003811061413d575f5ffd5b809150509250929050565b5f6001600160401b0382111561416057614160613f79565b50601f01601f191660200190565b5f82601f83011261417d575f5ffd5b8135602083015f61419561419084614148565b613f8d565b90508281528583830111156141a8575f5ffd5b828260208301375f92810160200192909252509392505050565b5f5f5f5f5f5f60c087890312156141d7575f5ffd5b863595506141e760208801613e83565b945060408701356001600160401b03811115614201575f5ffd5b61420d89828a0161416e565b94505060608701356001600160401b03811115614228575f5ffd5b61423489828a0161416e565b9350506080870135915060a08701356001600160401b03811115614256575f5ffd5b61426289828a0161416e565b9150509295509295509295565b6001600160a01b038616815260a0602082018190525f9061429290830187613efa565b82810360408401526142a48187613efa565b606084019590955250506001600160a01b03919091166080909101529392505050565b5f5f604083850312156142d8575f5ffd5b6142e183613e83565b915061408860208401613eb2565b634e487b7160e01b5f52602160045260245ffd5b602081016003831061432357634e487b7160e01b5f52602160045260245ffd5b91905290565b5f5f5f5f6080858703121561433c575f5ffd5b61434585613e83565b935061435360208601613e83565b92506040850135915060608501356001600160401b03811115614374575f5ffd5b6143808782880161416e565b91505092959194509250565b5f5f6040838503121561439d575f5ffd5b50508035926020909101359150565b604081525f6143be60408301856140cb565b82810360208401528084518083526020830191506020860192505f5b818110156144015783516001600160a01b03168352602093840193909201916001016143da565b50909695505050505050565b5f5f5f6060848603121561441f575f5ffd5b833592506140ba60208501613e83565b5f5f60408385031215614440575f5ffd5b61444983613e83565b915061408860208401613e83565b600181811c9082168061446b57607f821691505b60208210810361448957634e487b7160e01b5f52602260045260245ffd5b50919050565b634e487b7160e01b5f52603260045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b8082028115828204841417611003576110036144a3565b5f600182016144df576144df6144a3565b5060010190565b60a081525f6144f860a0830188613efa565b6001600160a01b03878116602085015286166040840152606083018590528281036080840152611d7e8185613efa565b828152604060208201525f611ae06040830184613efa565b5f60208284031215614550575f5ffd5b81516001600160401b03811115614565575f5ffd5b8201601f81018413614575575f5ffd5b805161458361419082614148565b818152856020838501011115614597575f5ffd5b8160208401602083015e5f91810160200191909152949350505050565b601f82111561140957805f5260205f20601f840160051c810160208510156145d95750805b601f840160051c820191505b81811015612b6e575f81556001016145e5565b81516001600160401b0381111561461157614611613f79565b6146258161461f8454614457565b846145b4565b6020601f821160018114614657575f83156146405750848201515b5f19600385901b1c1916600184901b178455612b6e565b5f84815260208120601f198516915b828110156146865787850151825560209485019460019092019101614666565b50848210156146a357868401515f19600387901b60f8161c191681555b50505050600190811b01905550565b608081525f6146c46080830187613efa565b82810360208401526146d68187613efa565b604084019590955250506001600160a01b039190911660609091015292915050565b6001600160a01b03858116825284166020820152604081018390526080606082018190525f9061472a90830184613efa565b9695505050505050565b5f60208284031215614744575f5ffd5b815161127d81613e53565b5f8261476957634e487b7160e01b5f52601260045260245ffd5b500490565b81810381811115611003576110036144a3565b80820180821115611003576110036144a3565b634e487b7160e01b5f52603160045260245ffd5b5f81518060208401855e5f93019283525090919050565b5f81525f61127d60018301846147a8565b6a600b5981380380925939f360a81b81525f61127d600b8301846147a856fea164736f6c634300081b000a000000000000000000000000000000000000000000000000000000000000018000000000000000000000000000000000000000000000000000000000000001a0000000000000000000000000123456789012345678901234567890123456789000000000000000000000000012345678901234567890123456789012345678900000000000000000000000001234567890123456789012345678901234567890000000000000000000000000123456789012345678901234567890123456789000000000000000000000000000000000000000000000000000000000000001c0000000000000000000000000123456789012345678901234567890123456789000000000000000000000000000000000000000000000000000000000000001e00000000000000000000000000000000000000000000000000de0b6b3a764000000000000000000000000000000000000000000000000000000000000000003e8000000000000000000000000000000000000000000000000002386f26fc100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000