More Info
Private Name Tags
ContractCreator
Latest 6 from a total of 6 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Claim Rewards | 8546190 | 4 days ago | IN | 0 S | 0.00470173 | ||||
Claim Rewards | 8546166 | 4 days ago | IN | 0 S | 0.00470173 | ||||
Claim Tap Bonus | 8546120 | 4 days ago | IN | 0 S | 0.0046145 | ||||
Claim Rewards | 8546107 | 4 days ago | IN | 0 S | 0.00470173 | ||||
Claim Tap Bonus | 8546085 | 4 days ago | IN | 0 S | 0.00540199 | ||||
Stake Multiple | 8545325 | 4 days ago | IN | 0 S | 0.02103073 |
Loading...
Loading
Contract Name:
FlowerNFTStaking
Compiler Version
v0.8.19+commit.7dd6d404
Contract Source Code (Solidity)
/** *Submitted for verification at SonicScan.org on 2025-02-18 */ // SPDX-License-Identifier: unlicensed // File: @openzeppelin/[email protected]/security/ReentrancyGuard.sol // OpenZeppelin Contracts (last updated v4.9.0) (security/ReentrancyGuard.sol) pragma solidity ^0.8.0; /** * @dev Contract module that helps prevent reentrant calls to a function. * * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier * available, which can be applied to functions to make sure there are no nested * (reentrant) calls to them. * * Note that because there is a single `nonReentrant` guard, functions marked as * `nonReentrant` may not call one another. This can be worked around by making * those functions `private`, and then adding `external` `nonReentrant` entry * points to them. * * TIP: If you would like to learn more about reentrancy and alternative ways * to protect against it, check out our blog post * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. */ abstract contract ReentrancyGuard { // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot's contents, replace the bits taken up by the boolean, and then write // back. This is the compiler's defense against contract upgrades and // pointer aliasing, and it cannot be disabled. // The values being non-zero value makes deployment a bit more expensive, // but in exchange the refund on every call to nonReentrant will be lower in // amount. Since refunds are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to // increase the likelihood of the full refund coming into effect. uint256 private constant _NOT_ENTERED = 1; uint256 private constant _ENTERED = 2; uint256 private _status; constructor() { _status = _NOT_ENTERED; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and making it call a * `private` function that does the actual work. */ modifier nonReentrant() { _nonReentrantBefore(); _; _nonReentrantAfter(); } function _nonReentrantBefore() private { // On the first call to nonReentrant, _status will be _NOT_ENTERED require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; } function _nonReentrantAfter() private { // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } /** * @dev Returns true if the reentrancy guard is currently set to "entered", which indicates there is a * `nonReentrant` function in the call stack. */ function _reentrancyGuardEntered() internal view returns (bool) { return _status == _ENTERED; } } // File: @openzeppelin/[email protected]/utils/Context.sol // OpenZeppelin Contracts (last updated v4.9.4) (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } function _contextSuffixLength() internal view virtual returns (uint256) { return 0; } } // File: @openzeppelin/[email protected]/security/Pausable.sol // OpenZeppelin Contracts (last updated v4.7.0) (security/Pausable.sol) pragma solidity ^0.8.0; /** * @dev Contract module which allows children to implement an emergency stop * mechanism that can be triggered by an authorized account. * * This module is used through inheritance. It will make available the * modifiers `whenNotPaused` and `whenPaused`, which can be applied to * the functions of your contract. Note that they will not be pausable by * simply including this module, only once the modifiers are put in place. */ abstract contract Pausable is Context { /** * @dev Emitted when the pause is triggered by `account`. */ event Paused(address account); /** * @dev Emitted when the pause is lifted by `account`. */ event Unpaused(address account); bool private _paused; /** * @dev Initializes the contract in unpaused state. */ constructor() { _paused = false; } /** * @dev Modifier to make a function callable only when the contract is not paused. * * Requirements: * * - The contract must not be paused. */ modifier whenNotPaused() { _requireNotPaused(); _; } /** * @dev Modifier to make a function callable only when the contract is paused. * * Requirements: * * - The contract must be paused. */ modifier whenPaused() { _requirePaused(); _; } /** * @dev Returns true if the contract is paused, and false otherwise. */ function paused() public view virtual returns (bool) { return _paused; } /** * @dev Throws if the contract is paused. */ function _requireNotPaused() internal view virtual { require(!paused(), "Pausable: paused"); } /** * @dev Throws if the contract is not paused. */ function _requirePaused() internal view virtual { require(paused(), "Pausable: not paused"); } /** * @dev Triggers stopped state. * * Requirements: * * - The contract must not be paused. */ function _pause() internal virtual whenNotPaused { _paused = true; emit Paused(_msgSender()); } /** * @dev Returns to normal state. * * Requirements: * * - The contract must be paused. */ function _unpause() internal virtual whenPaused { _paused = false; emit Unpaused(_msgSender()); } } // File: @openzeppelin/[email protected]/access/Ownable.sol // OpenZeppelin Contracts (last updated v4.9.0) (access/Ownable.sol) pragma solidity ^0.8.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { _checkOwner(); _; } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if the sender is not the owner. */ function _checkOwner() internal view virtual { require(owner() == _msgSender(), "Ownable: caller is not the owner"); } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby disabling any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // File: @openzeppelin/[email protected]/utils/introspection/IERC165.sol // OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } // File: @openzeppelin/[email protected]/token/ERC721/IERC721.sol // OpenZeppelin Contracts (last updated v4.9.0) (token/ERC721/IERC721.sol) pragma solidity ^0.8.0; /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom(address from, address to, uint256 tokenId, bytes calldata data) external; /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom(address from, address to, uint256 tokenId) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Note that the caller is responsible to confirm that the recipient is capable of receiving ERC721 * or else they may be permanently lost. Usage of {safeTransferFrom} prevents loss, though the caller must * understand this adds an external call which potentially creates a reentrancy vulnerability. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom(address from, address to, uint256 tokenId) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool approved) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); } // File: @openzeppelin/[email protected]/token/ERC721/IERC721Receiver.sol // OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721Receiver.sol) pragma solidity ^0.8.0; /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721Receiver.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } // File: @openzeppelin/[email protected]/token/ERC20/IERC20.sol // OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/IERC20.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `to`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address to, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `from` to `to` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom(address from, address to, uint256 amount) external returns (bool); } // File: growflowerstaking.sol pragma solidity ^0.8.0; pragma solidity ^0.8.0; interface IFlowerNFT { function levels(uint256 tokenId) external view returns (uint256); } contract FlowerNFTStaking is Ownable, ReentrancyGuard, Pausable, IERC721Receiver { IERC721 public flowerNFT; IERC20 public flowerToken; IERC721 public stonerToken; uint256 public rewardRate = 1 ether; uint256 public stonerBonusMultiplier = 110; // 10% bonus uint256 public flowerNFTBonusMultiplier = 105; // 5% bonus uint256 public tapBonusAmount = 0.1 ether; uint256 public tapCooldown = 1 hours; struct Stake { uint256 tokenId; uint256 stakedAt; uint256 lastTapped; uint256 nftLevelAtStake; } mapping(address => Stake[]) public stakes; mapping(uint256 => address) public stakedTokenOwners; mapping(address => uint256[]) public stonerStakes; /** EVENTS **/ event Staked(address indexed user, uint256[] flowerTokenIds, uint256[] stonerTokenIds); event Unstaked(address indexed user, uint256[] flowerTokenIds, uint256[] stonerTokenIds); event RewardClaimed(address indexed user, uint256 amount); event TapBonusClaimed(address indexed user, uint256 tokenId, uint256 amount); event TokensWithdrawn(address indexed owner, uint256 amount); event RewardRateUpdated(uint256 newRate); event StonerBonusUpdated(uint256 newMultiplier); event FlowerNFTBonusUpdated(uint256 newMultiplier); event TapBonusUpdated(uint256 newAmount); event TapCooldownUpdated(uint256 newCooldown); event NFTContractUpdated(address newAddress); event TokenContractUpdated(address newAddress); constructor(address _flowerNFT, address _flowerToken, address _stonerToken) { require(_flowerNFT != address(0) && _flowerToken != address(0) && _stonerToken != address(0), "Invalid contract address"); flowerNFT = IERC721(_flowerNFT); flowerToken = IERC20(_flowerToken); stonerToken = IERC721(_stonerToken); } /** ✅ ADMIN FUNCTIONS **/ function setFlowerNFTContract(address newAddress) external onlyOwner { require(newAddress != address(0), "Invalid address"); flowerNFT = IERC721(newAddress); emit NFTContractUpdated(newAddress); } function setStonerTokenContract(address newAddress) external onlyOwner { require(newAddress != address(0), "Invalid address"); stonerToken = IERC721(newAddress); emit NFTContractUpdated(newAddress); } function setFlowerTokenContract(address newAddress) external onlyOwner { require(newAddress != address(0), "Invalid address"); flowerToken = IERC20(newAddress); emit TokenContractUpdated(newAddress); } function setRewardRate(uint256 newRate) external onlyOwner { require(newRate > 0, "Reward rate must be greater than zero"); rewardRate = newRate; emit RewardRateUpdated(newRate); } function setStonerBonusMultiplier(uint256 newMultiplier) external onlyOwner { require(newMultiplier >= 100, "Multiplier must be at least 100"); stonerBonusMultiplier = newMultiplier; emit StonerBonusUpdated(newMultiplier); } function setFlowerNFTBonusMultiplier(uint256 newMultiplier) external onlyOwner { require(newMultiplier >= 100, "Multiplier must be at least 100"); flowerNFTBonusMultiplier = newMultiplier; emit FlowerNFTBonusUpdated(newMultiplier); } function setTapBonusAmount(uint256 newAmount) external onlyOwner { require(newAmount > 0, "Bonus amount must be greater than zero"); tapBonusAmount = newAmount; emit TapBonusUpdated(newAmount); } function setTapCooldown(uint256 newCooldown) external onlyOwner { require(newCooldown > 0, "Cooldown must be greater than zero"); tapCooldown = newCooldown; emit TapCooldownUpdated(newCooldown); } function withdrawTokens(uint256 amount) external onlyOwner { require(amount > 0, "Amount must be greater than zero"); require(flowerToken.balanceOf(address(this)) >= amount, "Not enough tokens in contract"); flowerToken.transfer(msg.sender, amount); emit TokensWithdrawn(msg.sender, amount); } function calculateReward(address user, uint256 tokenId) public view returns (uint256) { for (uint256 i = 0; i < stakes[user].length; i++) { if (stakes[user][i].tokenId == tokenId) { uint256 timeStaked = block.timestamp - stakes[user][i].stakedAt; uint256 nftLevel = stakes[user][i].nftLevelAtStake; uint256 baseReward = (timeStaked * nftLevel * rewardRate) / 1 days; uint256 flowerBonus = (baseReward * (flowerNFTBonusMultiplier - 100)) / 100; uint256 stonerBonus = stonerStakes[user].length > 0 ? (baseReward * (stonerBonusMultiplier - 100)) / 100 : 0; return baseReward + flowerBonus + stonerBonus; } } return 0; } /** ✅ CLAIM REWARDS WITHOUT UNSTAKING **/ function claimRewards() external nonReentrant whenNotPaused { uint256 totalReward = 0; for (uint256 i = 0; i < stakes[msg.sender].length; i++) { uint256 tokenId = stakes[msg.sender][i].tokenId; uint256 reward = calculateReward(msg.sender, tokenId); totalReward += reward; stakes[msg.sender][i].stakedAt = block.timestamp; } require(totalReward > 0, "No rewards to claim"); require(flowerToken.balanceOf(address(this)) >= totalReward, "Insufficient tokens in contract"); bool success = flowerToken.transfer(msg.sender, totalReward); require(success, "Token transfer failed"); emit RewardClaimed(msg.sender, totalReward); } /** ✅ CLAIM TAP BONUS **/ function claimTapBonus(uint256 tokenId) external nonReentrant whenNotPaused { bool found = false; for (uint256 i = 0; i < stakes[msg.sender].length; i++) { if (stakes[msg.sender][i].tokenId == tokenId) { require(block.timestamp - stakes[msg.sender][i].lastTapped >= tapCooldown, "Tap bonus cooldown not reached"); stakes[msg.sender][i].lastTapped = block.timestamp; found = true; break; } } require(found, "Token not staked by user"); require(flowerToken.balanceOf(address(this)) >= tapBonusAmount, "Insufficient tokens in contract"); bool success = flowerToken.transfer(msg.sender, tapBonusAmount); require(success, "Token transfer failed"); emit TapBonusClaimed(msg.sender, tokenId, tapBonusAmount); } /** ✅ STAKING **/ function stakeMultiple(uint256[] memory flowerTokenIds, uint256[] memory stonerTokenIds) external nonReentrant whenNotPaused { require(flowerTokenIds.length > 0 || stonerTokenIds.length > 0, "No NFTs provided"); // Check for duplicate token IDs for (uint256 i = 0; i < flowerTokenIds.length; i++) { for (uint256 j = i + 1; j < flowerTokenIds.length; j++) { require(flowerTokenIds[i] != flowerTokenIds[j], "Duplicate FlowerNFT token ID"); } } for (uint256 i = 0; i < stonerTokenIds.length; i++) { for (uint256 j = i + 1; j < stonerTokenIds.length; j++) { require(stonerTokenIds[i] != stonerTokenIds[j], "Duplicate StonerNFT token ID"); } } for (uint256 i = 0; i < flowerTokenIds.length; i++) { uint256 tokenId = flowerTokenIds[i]; require(flowerNFT.ownerOf(tokenId) == msg.sender, "Not NFT owner"); if (stakedTokenOwners[tokenId] != address(0)) { _removeStake(msg.sender, tokenId); } stakes[msg.sender].push(Stake(tokenId, block.timestamp, 0, IFlowerNFT(address(flowerNFT)).levels(tokenId))); // Store the level stakedTokenOwners[tokenId] = msg.sender; flowerNFT.safeTransferFrom(msg.sender, address(this), tokenId); } for (uint256 i = 0; i < stonerTokenIds.length; i++) { uint256 stonerId = stonerTokenIds[i]; require(stonerToken.ownerOf(stonerId) == msg.sender, "Not NFT owner"); stonerToken.safeTransferFrom(msg.sender, address(this), stonerId); stonerStakes[msg.sender].push(stonerId); } emit Staked(msg.sender, flowerTokenIds, stonerTokenIds); } function unstakeMultiple(uint256[] memory flowerTokenIds, uint256[] memory stonerTokenIds) external nonReentrant whenNotPaused { require(flowerTokenIds.length > 0 || stonerTokenIds.length > 0, "No NFTs provided"); uint256 totalReward = 0; // Check for duplicate token IDs for (uint256 i = 0; i < flowerTokenIds.length; i++) { for (uint256 j = i + 1; j < flowerTokenIds.length; j++) { require(flowerTokenIds[i] != flowerTokenIds[j], "Duplicate FlowerNFT token ID"); } } for (uint256 i = 0; i < stonerTokenIds.length; i++) { for (uint256 j = i + 1; j < stonerTokenIds.length; j++) { require(stonerTokenIds[i] != stonerTokenIds[j], "Duplicate StonerNFT token ID"); } } // Unstaking Flower NFTs for (uint256 i = 0; i < flowerTokenIds.length; i++) { uint256 tokenId = flowerTokenIds[i]; require(stakedTokenOwners[tokenId] == msg.sender, "You do not own this staked NFT"); totalReward += calculateReward(msg.sender, tokenId); delete stakedTokenOwners[tokenId]; flowerNFT.safeTransferFrom(address(this), msg.sender, tokenId); // Remove from stakes array _removeStake(msg.sender, tokenId); } // Unstaking Stoner NFTs require(stonerStakes[msg.sender].length >= stonerTokenIds.length, "Not enough staked StonerNFTs"); for (uint256 i = 0; i < stonerTokenIds.length; i++) { uint256 stonerId = stonerTokenIds[i]; require(_isStonerStaked(msg.sender, stonerId), "StonerNFT not staked by user"); bool removed = _removeStonerStake(msg.sender, stonerId); require(removed, "StonerNFT not staked by user"); stonerToken.safeTransferFrom(address(this), msg.sender, stonerId); } if (totalReward > 0) { require(flowerToken.balanceOf(address(this)) >= totalReward, "Insufficient tokens in contract"); bool success = flowerToken.transfer(msg.sender, totalReward); require(success, "Token transfer failed"); emit RewardClaimed(msg.sender, totalReward); } emit Unstaked(msg.sender, flowerTokenIds, stonerTokenIds); } function _removeStake(address user, uint256 tokenId) internal { Stake[] storage userStakes = stakes[user]; for (uint256 i = 0; i < userStakes.length; i++) { if (userStakes[i].tokenId == tokenId) { userStakes[i] = userStakes[userStakes.length - 1]; userStakes.pop(); break; } } } function _isStonerStaked(address user, uint256 tokenId) internal view returns (bool) { for (uint256 i = 0; i < stonerStakes[user].length; i++) { if (stonerStakes[user][i] == tokenId) { return true; } } return false; } function _removeStonerStake(address user, uint256 tokenId) internal returns (bool) { uint256[] storage stakedNFTs = stonerStakes[user]; for (uint256 i = 0; i < stakedNFTs.length; i++) { if (stakedNFTs[i] == tokenId) { stakedNFTs[i] = stakedNFTs[stakedNFTs.length - 1]; stakedNFTs.pop(); return true; } } return false; // If tokenId was not found in the staked list } function onERC721Received(address, address, uint256, bytes memory) public virtual override returns (bytes4) { return this.onERC721Received.selector; } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"_flowerNFT","type":"address"},{"internalType":"address","name":"_flowerToken","type":"address"},{"internalType":"address","name":"_stonerToken","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"newMultiplier","type":"uint256"}],"name":"FlowerNFTBonusUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"newAddress","type":"address"}],"name":"NFTContractUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"RewardClaimed","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"newRate","type":"uint256"}],"name":"RewardRateUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256[]","name":"flowerTokenIds","type":"uint256[]"},{"indexed":false,"internalType":"uint256[]","name":"stonerTokenIds","type":"uint256[]"}],"name":"Staked","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"newMultiplier","type":"uint256"}],"name":"StonerBonusUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"TapBonusClaimed","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"newAmount","type":"uint256"}],"name":"TapBonusUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"newCooldown","type":"uint256"}],"name":"TapCooldownUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"newAddress","type":"address"}],"name":"TokenContractUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"TokensWithdrawn","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256[]","name":"flowerTokenIds","type":"uint256[]"},{"indexed":false,"internalType":"uint256[]","name":"stonerTokenIds","type":"uint256[]"}],"name":"Unstaked","type":"event"},{"inputs":[{"internalType":"address","name":"user","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"calculateReward","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"claimRewards","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"claimTapBonus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"flowerNFT","outputs":[{"internalType":"contract IERC721","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"flowerNFTBonusMultiplier","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"flowerToken","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"onERC721Received","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"rewardRate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"newMultiplier","type":"uint256"}],"name":"setFlowerNFTBonusMultiplier","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newAddress","type":"address"}],"name":"setFlowerNFTContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newAddress","type":"address"}],"name":"setFlowerTokenContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newRate","type":"uint256"}],"name":"setRewardRate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newMultiplier","type":"uint256"}],"name":"setStonerBonusMultiplier","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newAddress","type":"address"}],"name":"setStonerTokenContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newAmount","type":"uint256"}],"name":"setTapBonusAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newCooldown","type":"uint256"}],"name":"setTapCooldown","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"flowerTokenIds","type":"uint256[]"},{"internalType":"uint256[]","name":"stonerTokenIds","type":"uint256[]"}],"name":"stakeMultiple","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"stakedTokenOwners","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"stakes","outputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"stakedAt","type":"uint256"},{"internalType":"uint256","name":"lastTapped","type":"uint256"},{"internalType":"uint256","name":"nftLevelAtStake","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"stonerBonusMultiplier","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"stonerStakes","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"stonerToken","outputs":[{"internalType":"contract IERC721","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tapBonusAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tapCooldown","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"flowerTokenIds","type":"uint256[]"},{"internalType":"uint256[]","name":"stonerTokenIds","type":"uint256[]"}],"name":"unstakeMultiple","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdrawTokens","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
6080604052670de0b6b3a7640000600555606e600655606960075567016345785d8a0000600855610e106009553480156200003957600080fd5b506040516200495a3803806200495a83398181016040528101906200005f91906200038a565b6200007f620000736200025460201b60201c565b6200025c60201b60201c565b600180819055506000600260006101000a81548160ff021916908315150217905550600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141580156200010c5750600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b8015620001465750600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614155b62000188576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200017f9062000447565b60405180910390fd5b82600260016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555081600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050505062000469565b600033905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000620003528262000325565b9050919050565b620003648162000345565b81146200037057600080fd5b50565b600081519050620003848162000359565b92915050565b600080600060608486031215620003a657620003a562000320565b5b6000620003b68682870162000373565b9350506020620003c98682870162000373565b9250506040620003dc8682870162000373565b9150509250925092565b600082825260208201905092915050565b7f496e76616c696420636f6e747261637420616464726573730000000000000000600082015250565b60006200042f601883620003e6565b91506200043c82620003f7565b602082019050919050565b60006020820190508181036000830152620004628162000420565b9050919050565b6144e180620004796000396000f3fe608060405234801561001057600080fd5b50600436106101da5760003560e01c8063602095ce116101045780638da5cb5b116100a25780639f60421f116100715780639f60421f1461050e578063d65f3a781461052a578063e7d554ac14610546578063f2fde38b14610562576101da565b80638da5cb5b1461049a57806393dbbc18146104b857806396e840a9146104d45780639e447fc6146104f2576101da565b8063721a1f45116100de578063721a1f45146104105780637b0a47ee1461042e578063851fbb541461044c5780638b3d81b31461046a576101da565b8063602095ce146103cc57806365532df7146103ea578063715018a614610406576101da565b80633b18dc711161017c57806351f3db481161014b57806351f3db4814610343578063584b62a11461035f5780635c975abb146103925780635cae8f59146103b0576101da565b80633b18dc71146102b95780633b3f944c146102d75780633cfd1568146102f557806341cd5f7314610325576101da565b80632c583bf3116101b85780632c583bf31461025b578063315a095d14610277578063333e3e6a14610293578063372500ab146102af576101da565b8063150b7a02146101df5780631852e8d91461020f5780631cc6ec931461023f575b600080fd5b6101f960048036038101906101f491906131dc565b61057e565b604051610206919061329a565b60405180910390f35b610229600480360381019061022491906132b5565b610592565b6040516102369190613304565b60405180910390f35b6102596004803603810190610254919061331f565b610837565b005b61027560048036038101906102709190613414565b6108c3565b005b610291600480360381019061028c919061331f565b611136565b005b6102ad60048036038101906102a8919061331f565b611351565b005b6102b76117b3565b005b6102c1611b70565b6040516102ce9190613304565b60405180910390f35b6102df611b76565b6040516102ec9190613304565b60405180910390f35b61030f600480360381019061030a91906132b5565b611b7c565b60405161031c9190613304565b60405180910390f35b61032d611bad565b60405161033a9190613304565b60405180910390f35b61035d6004803603810190610358919061331f565b611bb3565b005b610379600480360381019061037491906132b5565b611c3f565b604051610389949392919061348c565b60405180910390f35b61039a611c8c565b6040516103a791906134ec565b60405180910390f35b6103ca60048036038101906103c5919061331f565b611ca3565b005b6103d4611d30565b6040516103e19190613566565b60405180910390f35b61040460048036038101906103ff9190613581565b611d56565b005b61040e611e48565b005b610418611e5c565b60405161042591906135cf565b60405180910390f35b610436611e82565b6040516104439190613304565b60405180910390f35b610454611e88565b60405161046191906135cf565b60405180910390f35b610484600480360381019061047f919061331f565b611eae565b60405161049191906135f9565b60405180910390f35b6104a2611ee1565b6040516104af91906135f9565b60405180910390f35b6104d260048036038101906104cd9190613581565b611f0a565b005b6104dc611ffc565b6040516104e99190613304565b60405180910390f35b61050c6004803603810190610507919061331f565b612002565b005b61052860048036038101906105239190613414565b61208e565b005b610544600480360381019061053f9190613581565b6128a9565b005b610560600480360381019061055b919061331f565b61299b565b005b61057c60048036038101906105779190613581565b612a28565b005b600063150b7a0260e01b9050949350505050565b600080600090505b600a60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208054905081101561082b5782600a60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020828154811061063657610635613614565b5b90600052602060002090600402016000015403610818576000600a60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002082815481106106a05761069f613614565b5b906000526020600020906004020160010154426106bd9190613672565b90506000600a60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020838154811061071257610711613614565b5b9060005260206000209060040201600301549050600062015180600554838561073b91906136a6565b61074591906136a6565b61074f9190613717565b905060006064806007546107639190613672565b8361076e91906136a6565b6107789190613717565b9050600080600c60008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002080549050116107cc5760006107f2565b6064806006546107dc9190613672565b846107e791906136a6565b6107f19190613717565b5b90508082846108019190613748565b61080b9190613748565b9650505050505050610831565b80806108239061377c565b91505061059a565b50600090505b92915050565b61083f612aab565b60008111610882576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161087990613847565b60405180910390fd5b806009819055507fa292edce75c880178d165ee8473be051a702186c35b27ea86dab6c73ce88ff57816040516108b89190613304565b60405180910390a150565b6108cb612b29565b6108d3612b78565b6000825111806108e4575060008151115b610923576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161091a906138b3565b60405180910390fd5b60005b82518110156109e757600060018261093e9190613748565b90505b83518110156109d35783818151811061095d5761095c613614565b5b602002602001015184838151811061097857610977613614565b5b6020026020010151036109c0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109b79061391f565b60405180910390fd5b80806109cb9061377c565b915050610941565b5080806109df9061377c565b915050610926565b5060005b8151811015610aac576000600182610a039190613748565b90505b8251811015610a9857828181518110610a2257610a21613614565b5b6020026020010151838381518110610a3d57610a3c613614565b5b602002602001015103610a85576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a7c9061398b565b60405180910390fd5b8080610a909061377c565b915050610a06565b508080610aa49061377c565b9150506109eb565b5060005b8251811015610e99576000838281518110610ace57610acd613614565b5b602002602001015190503373ffffffffffffffffffffffffffffffffffffffff16600260019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636352211e836040518263ffffffff1660e01b8152600401610b4a9190613304565b602060405180830381865afa158015610b67573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b8b91906139c0565b73ffffffffffffffffffffffffffffffffffffffff1614610be1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bd890613a39565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600b600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610c5357610c523382612bc2565b5b600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020604051806080016040528083815260200142815260200160008152602001600260019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663b2596a67856040518263ffffffff1660e01b8152600401610d0b9190613304565b602060405180830381865afa158015610d28573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d4c9190613a6e565b815250908060018154018082558091505060019003906000526020600020906004020160009091909190915060008201518160000155602082015181600101556040820151816002015560608201518160030155505033600b600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600260019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166342842e0e3330846040518463ffffffff1660e01b8152600401610e5393929190613a9b565b600060405180830381600087803b158015610e6d57600080fd5b505af1158015610e81573d6000803e3d6000fd5b50505050508080610e919061377c565b915050610ab0565b5060005b81518110156110d9576000828281518110610ebb57610eba613614565b5b602002602001015190503373ffffffffffffffffffffffffffffffffffffffff16600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636352211e836040518263ffffffff1660e01b8152600401610f379190613304565b602060405180830381865afa158015610f54573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f7891906139c0565b73ffffffffffffffffffffffffffffffffffffffff1614610fce576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fc590613a39565b60405180910390fd5b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166342842e0e3330846040518463ffffffff1660e01b815260040161102d93929190613a9b565b600060405180830381600087803b15801561104757600080fd5b505af115801561105b573d6000803e3d6000fd5b50505050600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190806001815401808255809150506001900390600052602060002001600090919091909150555080806110d19061377c565b915050610e9d565b503373ffffffffffffffffffffffffffffffffffffffff167f859a4049709b7ed7c28d73c9122229b70aa55880d8744d1931e98e093a1b5b918383604051611122929190613b90565b60405180910390a2611132612d24565b5050565b61113e612aab565b60008111611181576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161117890613c13565b60405180910390fd5b80600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016111dd91906135f9565b602060405180830381865afa1580156111fa573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061121e9190613a6e565b101561125f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161125690613c7f565b60405180910390fd5b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33836040518363ffffffff1660e01b81526004016112bc929190613c9f565b6020604051808303816000875af11580156112db573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112ff9190613cf4565b503373ffffffffffffffffffffffffffffffffffffffff167f6352c5382c4a4578e712449ca65e83cdb392d045dfcf1cad9615189db2da244b826040516113469190613304565b60405180910390a250565b611359612b29565b611361612b78565b6000805b600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208054905081101561154d5782600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020828154811061140157611400613614565b5b9060005260206000209060040201600001540361153a57600954600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020828154811061146c5761146b613614565b5b906000526020600020906004020160020154426114899190613672565b10156114ca576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114c190613d6d565b60405180910390fd5b42600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020828154811061151c5761151b613614565b5b9060005260206000209060040201600201819055506001915061154d565b80806115459061377c565b915050611365565b508061158e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161158590613dd9565b60405180910390fd5b600854600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016115ec91906135f9565b602060405180830381865afa158015611609573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061162d9190613a6e565b101561166e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161166590613e45565b60405180910390fd5b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb336008546040518363ffffffff1660e01b81526004016116cf929190613c9f565b6020604051808303816000875af11580156116ee573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117129190613cf4565b905080611754576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161174b90613eb1565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff167fd44f824c77912892e22ec4e0f3e0dafa6d4a2512c57d64ba56b9a1b3c053dddb8460085460405161179e929190613ed1565b60405180910390a250506117b0612d24565b50565b6117bb612b29565b6117c3612b78565b6000805b600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002080549050811015611910576000600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020828154811061186457611863613614565b5b906000526020600020906004020160000154905060006118843383610592565b905080846118929190613748565b935042600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002084815481106118e6576118e5613614565b5b906000526020600020906004020160010181905550505080806119089061377c565b9150506117c7565b5060008111611954576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161194b90613f46565b60405180910390fd5b80600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016119b091906135f9565b602060405180830381865afa1580156119cd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119f19190613a6e565b1015611a32576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a2990613e45565b60405180910390fd5b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33846040518363ffffffff1660e01b8152600401611a91929190613c9f565b6020604051808303816000875af1158015611ab0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ad49190613cf4565b905080611b16576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b0d90613eb1565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff167f106f923f993c2149d49b4255ff723acafa1f2d94393f561d3eda32ae348f724183604051611b5c9190613304565b60405180910390a25050611b6e612d24565b565b60085481565b60075481565b600c6020528160005260406000208181548110611b9857600080fd5b90600052602060002001600091509150505481565b60095481565b611bbb612aab565b60008111611bfe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bf590613fd8565b60405180910390fd5b806008819055507f984f97438a61d2a2abf6ae7cccfe9dc9c37c8e3111255c24be5ef1129c6f2c7681604051611c349190613304565b60405180910390a150565b600a6020528160005260406000208181548110611c5b57600080fd5b9060005260206000209060040201600091509150508060000154908060010154908060020154908060030154905084565b6000600260009054906101000a900460ff16905090565b611cab612aab565b6064811015611cef576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ce690614044565b60405180910390fd5b806006819055507ff4b2d54c414c720f8a9e79192fc7b4918e9b12a7ce94b34ab404a40bccc6821d81604051611d259190613304565b60405180910390a150565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b611d5e612aab565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611dcd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dc4906140b0565b60405180910390fd5b80600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507f23d5823548e4652c04b1d029323232659612a32681d27872dd94b8d6b97ce6b181604051611e3d91906135f9565b60405180910390a150565b611e50612aab565b611e5a6000612d2d565b565b600260019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60055481565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600b6020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b611f12612aab565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611f81576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f78906140b0565b60405180910390fd5b80600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507ff2610996d245d9b77e4ff84c2174eea0b76fb44c422218404f66e28816d78fb981604051611ff191906135f9565b60405180910390a150565b60065481565b61200a612aab565b6000811161204d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161204490614142565b60405180910390fd5b806005819055507f41d466ebd06fb97e7786086ac8b69b7eb7da798592036251291d34e9791cde01816040516120839190613304565b60405180910390a150565b612096612b29565b61209e612b78565b6000825111806120af575060008151115b6120ee576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120e5906138b3565b60405180910390fd5b6000805b83518110156121b357600060018261210a9190613748565b90505b845181101561219f5784818151811061212957612128613614565b5b602002602001015185838151811061214457612143613614565b5b60200260200101510361218c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121839061391f565b60405180910390fd5b80806121979061377c565b91505061210d565b5080806121ab9061377c565b9150506120f2565b5060005b82518110156122785760006001826121cf9190613748565b90505b8351811015612264578381815181106121ee576121ed613614565b5b602002602001015184838151811061220957612208613614565b5b602002602001015103612251576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122489061398b565b60405180910390fd5b808061225c9061377c565b9150506121d2565b5080806122709061377c565b9150506121b7565b5060005b835181101561244157600084828151811061229a57612299613614565b5b602002602001015190503373ffffffffffffffffffffffffffffffffffffffff16600b600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614612345576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161233c906141ae565b60405180910390fd5b61234f3382610592565b8361235a9190613748565b9250600b600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055600260019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166342842e0e3033846040518463ffffffff1660e01b81526004016123f193929190613a9b565b600060405180830381600087803b15801561240b57600080fd5b505af115801561241f573d6000803e3d6000fd5b5050505061242d3382612bc2565b5080806124399061377c565b91505061227c565b508151600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208054905010156124c8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124bf9061421a565b60405180910390fd5b60005b82518110156126305760008382815181106124e9576124e8613614565b5b602002602001015190506124fd3382612df1565b61253c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161253390614286565b60405180910390fd5b60006125483383612ece565b90508061258a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161258190614286565b60405180910390fd5b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166342842e0e3033856040518463ffffffff1660e01b81526004016125e993929190613a9b565b600060405180830381600087803b15801561260357600080fd5b505af1158015612617573d6000803e3d6000fd5b50505050505080806126289061377c565b9150506124cb565b50600081111561284c5780600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161269691906135f9565b602060405180830381865afa1580156126b3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126d79190613a6e565b1015612718576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161270f90613e45565b60405180910390fd5b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33846040518363ffffffff1660e01b8152600401612777929190613c9f565b6020604051808303816000875af1158015612796573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127ba9190613cf4565b9050806127fc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127f390613eb1565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff167f106f923f993c2149d49b4255ff723acafa1f2d94393f561d3eda32ae348f7241836040516128429190613304565b60405180910390a2505b3373ffffffffffffffffffffffffffffffffffffffff167fef3bc8b2408263209f01abd2cf8120586077da5e4cf45d8a7dd83d2a0545f1038484604051612894929190613b90565b60405180910390a2506128a5612d24565b5050565b6128b1612aab565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603612920576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612917906140b0565b60405180910390fd5b80600260016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507ff2610996d245d9b77e4ff84c2174eea0b76fb44c422218404f66e28816d78fb98160405161299091906135f9565b60405180910390a150565b6129a3612aab565b60648110156129e7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129de90614044565b60405180910390fd5b806007819055507ff3570cd97015150a0e5502c9cf62bb4b8fd0d2891b81254dd7da2d319adf884181604051612a1d9190613304565b60405180910390a150565b612a30612aab565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603612a9f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a9690614318565b60405180910390fd5b612aa881612d2d565b50565b612ab3612fe6565b73ffffffffffffffffffffffffffffffffffffffff16612ad1611ee1565b73ffffffffffffffffffffffffffffffffffffffff1614612b27576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b1e90614384565b60405180910390fd5b565b600260015403612b6e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b65906143f0565b60405180910390fd5b6002600181905550565b612b80611c8c565b15612bc0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bb79061445c565b60405180910390fd5b565b6000600a60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905060005b8180549050811015612d1e5782828281548110612c2857612c27613614565b5b90600052602060002090600402016000015403612d0b578160018380549050612c519190613672565b81548110612c6257612c61613614565b5b9060005260206000209060040201828281548110612c8357612c82613614565b5b90600052602060002090600402016000820154816000015560018201548160010155600282015481600201556003820154816003015590505081805480612ccd57612ccc61447c565b5b600190038181906000526020600020906004020160008082016000905560018201600090556002820160009055600382016000905550509055612d1e565b8080612d169061377c565b915050612c08565b50505050565b60018081905550565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600080600090505b600c60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002080549050811015612ec25782600c60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208281548110612e9557612e94613614565b5b906000526020600020015403612eaf576001915050612ec8565b8080612eba9061377c565b915050612df9565b50600090505b92915050565b600080600c60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905060005b8180549050811015612fd95783828281548110612f3557612f34613614565b5b906000526020600020015403612fc6578160018380549050612f579190613672565b81548110612f6857612f67613614565b5b9060005260206000200154828281548110612f8657612f85613614565b5b906000526020600020018190555081805480612fa557612fa461447c565b5b60019003818190600052602060002001600090559055600192505050612fe0565b8080612fd19061377c565b915050612f15565b5060009150505b92915050565b600033905090565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061302d82613002565b9050919050565b61303d81613022565b811461304857600080fd5b50565b60008135905061305a81613034565b92915050565b6000819050919050565b61307381613060565b811461307e57600080fd5b50565b6000813590506130908161306a565b92915050565b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6130e9826130a0565b810181811067ffffffffffffffff82111715613108576131076130b1565b5b80604052505050565b600061311b612fee565b905061312782826130e0565b919050565b600067ffffffffffffffff821115613147576131466130b1565b5b613150826130a0565b9050602081019050919050565b82818337600083830152505050565b600061317f61317a8461312c565b613111565b90508281526020810184848401111561319b5761319a61309b565b5b6131a684828561315d565b509392505050565b600082601f8301126131c3576131c2613096565b5b81356131d384826020860161316c565b91505092915050565b600080600080608085870312156131f6576131f5612ff8565b5b60006132048782880161304b565b94505060206132158782880161304b565b935050604061322687828801613081565b925050606085013567ffffffffffffffff81111561324757613246612ffd565b5b613253878288016131ae565b91505092959194509250565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6132948161325f565b82525050565b60006020820190506132af600083018461328b565b92915050565b600080604083850312156132cc576132cb612ff8565b5b60006132da8582860161304b565b92505060206132eb85828601613081565b9150509250929050565b6132fe81613060565b82525050565b600060208201905061331960008301846132f5565b92915050565b60006020828403121561333557613334612ff8565b5b600061334384828501613081565b91505092915050565b600067ffffffffffffffff821115613367576133666130b1565b5b602082029050602081019050919050565b600080fd5b600061339061338b8461334c565b613111565b905080838252602082019050602084028301858111156133b3576133b2613378565b5b835b818110156133dc57806133c88882613081565b8452602084019350506020810190506133b5565b5050509392505050565b600082601f8301126133fb576133fa613096565b5b813561340b84826020860161337d565b91505092915050565b6000806040838503121561342b5761342a612ff8565b5b600083013567ffffffffffffffff81111561344957613448612ffd565b5b613455858286016133e6565b925050602083013567ffffffffffffffff81111561347657613475612ffd565b5b613482858286016133e6565b9150509250929050565b60006080820190506134a160008301876132f5565b6134ae60208301866132f5565b6134bb60408301856132f5565b6134c860608301846132f5565b95945050505050565b60008115159050919050565b6134e6816134d1565b82525050565b600060208201905061350160008301846134dd565b92915050565b6000819050919050565b600061352c61352761352284613002565b613507565b613002565b9050919050565b600061353e82613511565b9050919050565b600061355082613533565b9050919050565b61356081613545565b82525050565b600060208201905061357b6000830184613557565b92915050565b60006020828403121561359757613596612ff8565b5b60006135a58482850161304b565b91505092915050565b60006135b982613533565b9050919050565b6135c9816135ae565b82525050565b60006020820190506135e460008301846135c0565b92915050565b6135f381613022565b82525050565b600060208201905061360e60008301846135ea565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061367d82613060565b915061368883613060565b92508282039050818111156136a05761369f613643565b5b92915050565b60006136b182613060565b91506136bc83613060565b92508282026136ca81613060565b915082820484148315176136e1576136e0613643565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061372282613060565b915061372d83613060565b92508261373d5761373c6136e8565b5b828204905092915050565b600061375382613060565b915061375e83613060565b925082820190508082111561377657613775613643565b5b92915050565b600061378782613060565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036137b9576137b8613643565b5b600182019050919050565b600082825260208201905092915050565b7f436f6f6c646f776e206d7573742062652067726561746572207468616e207a6560008201527f726f000000000000000000000000000000000000000000000000000000000000602082015250565b60006138316022836137c4565b915061383c826137d5565b604082019050919050565b6000602082019050818103600083015261386081613824565b9050919050565b7f4e6f204e4654732070726f766964656400000000000000000000000000000000600082015250565b600061389d6010836137c4565b91506138a882613867565b602082019050919050565b600060208201905081810360008301526138cc81613890565b9050919050565b7f4475706c696361746520466c6f7765724e465420746f6b656e20494400000000600082015250565b6000613909601c836137c4565b9150613914826138d3565b602082019050919050565b60006020820190508181036000830152613938816138fc565b9050919050565b7f4475706c69636174652053746f6e65724e465420746f6b656e20494400000000600082015250565b6000613975601c836137c4565b91506139808261393f565b602082019050919050565b600060208201905081810360008301526139a481613968565b9050919050565b6000815190506139ba81613034565b92915050565b6000602082840312156139d6576139d5612ff8565b5b60006139e4848285016139ab565b91505092915050565b7f4e6f74204e4654206f776e657200000000000000000000000000000000000000600082015250565b6000613a23600d836137c4565b9150613a2e826139ed565b602082019050919050565b60006020820190508181036000830152613a5281613a16565b9050919050565b600081519050613a688161306a565b92915050565b600060208284031215613a8457613a83612ff8565b5b6000613a9284828501613a59565b91505092915050565b6000606082019050613ab060008301866135ea565b613abd60208301856135ea565b613aca60408301846132f5565b949350505050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b613b0781613060565b82525050565b6000613b198383613afe565b60208301905092915050565b6000602082019050919050565b6000613b3d82613ad2565b613b478185613add565b9350613b5283613aee565b8060005b83811015613b83578151613b6a8882613b0d565b9750613b7583613b25565b925050600181019050613b56565b5085935050505092915050565b60006040820190508181036000830152613baa8185613b32565b90508181036020830152613bbe8184613b32565b90509392505050565b7f416d6f756e74206d7573742062652067726561746572207468616e207a65726f600082015250565b6000613bfd6020836137c4565b9150613c0882613bc7565b602082019050919050565b60006020820190508181036000830152613c2c81613bf0565b9050919050565b7f4e6f7420656e6f75676820746f6b656e7320696e20636f6e7472616374000000600082015250565b6000613c69601d836137c4565b9150613c7482613c33565b602082019050919050565b60006020820190508181036000830152613c9881613c5c565b9050919050565b6000604082019050613cb460008301856135ea565b613cc160208301846132f5565b9392505050565b613cd1816134d1565b8114613cdc57600080fd5b50565b600081519050613cee81613cc8565b92915050565b600060208284031215613d0a57613d09612ff8565b5b6000613d1884828501613cdf565b91505092915050565b7f54617020626f6e757320636f6f6c646f776e206e6f7420726561636865640000600082015250565b6000613d57601e836137c4565b9150613d6282613d21565b602082019050919050565b60006020820190508181036000830152613d8681613d4a565b9050919050565b7f546f6b656e206e6f74207374616b656420627920757365720000000000000000600082015250565b6000613dc36018836137c4565b9150613dce82613d8d565b602082019050919050565b60006020820190508181036000830152613df281613db6565b9050919050565b7f496e73756666696369656e7420746f6b656e7320696e20636f6e747261637400600082015250565b6000613e2f601f836137c4565b9150613e3a82613df9565b602082019050919050565b60006020820190508181036000830152613e5e81613e22565b9050919050565b7f546f6b656e207472616e73666572206661696c65640000000000000000000000600082015250565b6000613e9b6015836137c4565b9150613ea682613e65565b602082019050919050565b60006020820190508181036000830152613eca81613e8e565b9050919050565b6000604082019050613ee660008301856132f5565b613ef360208301846132f5565b9392505050565b7f4e6f207265776172647320746f20636c61696d00000000000000000000000000600082015250565b6000613f306013836137c4565b9150613f3b82613efa565b602082019050919050565b60006020820190508181036000830152613f5f81613f23565b9050919050565b7f426f6e757320616d6f756e74206d75737420626520677265617465722074686160008201527f6e207a65726f0000000000000000000000000000000000000000000000000000602082015250565b6000613fc26026836137c4565b9150613fcd82613f66565b604082019050919050565b60006020820190508181036000830152613ff181613fb5565b9050919050565b7f4d756c7469706c696572206d757374206265206174206c656173742031303000600082015250565b600061402e601f836137c4565b915061403982613ff8565b602082019050919050565b6000602082019050818103600083015261405d81614021565b9050919050565b7f496e76616c696420616464726573730000000000000000000000000000000000600082015250565b600061409a600f836137c4565b91506140a582614064565b602082019050919050565b600060208201905081810360008301526140c98161408d565b9050919050565b7f5265776172642072617465206d7573742062652067726561746572207468616e60008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b600061412c6025836137c4565b9150614137826140d0565b604082019050919050565b6000602082019050818103600083015261415b8161411f565b9050919050565b7f596f7520646f206e6f74206f776e2074686973207374616b6564204e46540000600082015250565b6000614198601e836137c4565b91506141a382614162565b602082019050919050565b600060208201905081810360008301526141c78161418b565b9050919050565b7f4e6f7420656e6f756768207374616b65642053746f6e65724e46547300000000600082015250565b6000614204601c836137c4565b915061420f826141ce565b602082019050919050565b60006020820190508181036000830152614233816141f7565b9050919050565b7f53746f6e65724e4654206e6f74207374616b6564206279207573657200000000600082015250565b6000614270601c836137c4565b915061427b8261423a565b602082019050919050565b6000602082019050818103600083015261429f81614263565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006143026026836137c4565b915061430d826142a6565b604082019050919050565b60006020820190508181036000830152614331816142f5565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b600061436e6020836137c4565b915061437982614338565b602082019050919050565b6000602082019050818103600083015261439d81614361565b9050919050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b60006143da601f836137c4565b91506143e5826143a4565b602082019050919050565b60006020820190508181036000830152614409816143cd565b9050919050565b7f5061757361626c653a2070617573656400000000000000000000000000000000600082015250565b60006144466010836137c4565b915061445182614410565b602082019050919050565b6000602082019050818103600083015261447581614439565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fdfea2646970667358221220c23c3e4a30cc4157e727e14cef25b82e2bbe9a3f44cd4bed56a3ec2270d7365c64736f6c634300081300330000000000000000000000003be8d7a305856dcc5f6a41ade1b2f63ce4cdc86d000000000000000000000000a58cd405fb0f4ad5c917393518aafd71a72644890000000000000000000000009b567e03d891f537b2b7874aa4a3308cfe2f4fbb
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106101da5760003560e01c8063602095ce116101045780638da5cb5b116100a25780639f60421f116100715780639f60421f1461050e578063d65f3a781461052a578063e7d554ac14610546578063f2fde38b14610562576101da565b80638da5cb5b1461049a57806393dbbc18146104b857806396e840a9146104d45780639e447fc6146104f2576101da565b8063721a1f45116100de578063721a1f45146104105780637b0a47ee1461042e578063851fbb541461044c5780638b3d81b31461046a576101da565b8063602095ce146103cc57806365532df7146103ea578063715018a614610406576101da565b80633b18dc711161017c57806351f3db481161014b57806351f3db4814610343578063584b62a11461035f5780635c975abb146103925780635cae8f59146103b0576101da565b80633b18dc71146102b95780633b3f944c146102d75780633cfd1568146102f557806341cd5f7314610325576101da565b80632c583bf3116101b85780632c583bf31461025b578063315a095d14610277578063333e3e6a14610293578063372500ab146102af576101da565b8063150b7a02146101df5780631852e8d91461020f5780631cc6ec931461023f575b600080fd5b6101f960048036038101906101f491906131dc565b61057e565b604051610206919061329a565b60405180910390f35b610229600480360381019061022491906132b5565b610592565b6040516102369190613304565b60405180910390f35b6102596004803603810190610254919061331f565b610837565b005b61027560048036038101906102709190613414565b6108c3565b005b610291600480360381019061028c919061331f565b611136565b005b6102ad60048036038101906102a8919061331f565b611351565b005b6102b76117b3565b005b6102c1611b70565b6040516102ce9190613304565b60405180910390f35b6102df611b76565b6040516102ec9190613304565b60405180910390f35b61030f600480360381019061030a91906132b5565b611b7c565b60405161031c9190613304565b60405180910390f35b61032d611bad565b60405161033a9190613304565b60405180910390f35b61035d6004803603810190610358919061331f565b611bb3565b005b610379600480360381019061037491906132b5565b611c3f565b604051610389949392919061348c565b60405180910390f35b61039a611c8c565b6040516103a791906134ec565b60405180910390f35b6103ca60048036038101906103c5919061331f565b611ca3565b005b6103d4611d30565b6040516103e19190613566565b60405180910390f35b61040460048036038101906103ff9190613581565b611d56565b005b61040e611e48565b005b610418611e5c565b60405161042591906135cf565b60405180910390f35b610436611e82565b6040516104439190613304565b60405180910390f35b610454611e88565b60405161046191906135cf565b60405180910390f35b610484600480360381019061047f919061331f565b611eae565b60405161049191906135f9565b60405180910390f35b6104a2611ee1565b6040516104af91906135f9565b60405180910390f35b6104d260048036038101906104cd9190613581565b611f0a565b005b6104dc611ffc565b6040516104e99190613304565b60405180910390f35b61050c6004803603810190610507919061331f565b612002565b005b61052860048036038101906105239190613414565b61208e565b005b610544600480360381019061053f9190613581565b6128a9565b005b610560600480360381019061055b919061331f565b61299b565b005b61057c60048036038101906105779190613581565b612a28565b005b600063150b7a0260e01b9050949350505050565b600080600090505b600a60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208054905081101561082b5782600a60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020828154811061063657610635613614565b5b90600052602060002090600402016000015403610818576000600a60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002082815481106106a05761069f613614565b5b906000526020600020906004020160010154426106bd9190613672565b90506000600a60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020838154811061071257610711613614565b5b9060005260206000209060040201600301549050600062015180600554838561073b91906136a6565b61074591906136a6565b61074f9190613717565b905060006064806007546107639190613672565b8361076e91906136a6565b6107789190613717565b9050600080600c60008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002080549050116107cc5760006107f2565b6064806006546107dc9190613672565b846107e791906136a6565b6107f19190613717565b5b90508082846108019190613748565b61080b9190613748565b9650505050505050610831565b80806108239061377c565b91505061059a565b50600090505b92915050565b61083f612aab565b60008111610882576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161087990613847565b60405180910390fd5b806009819055507fa292edce75c880178d165ee8473be051a702186c35b27ea86dab6c73ce88ff57816040516108b89190613304565b60405180910390a150565b6108cb612b29565b6108d3612b78565b6000825111806108e4575060008151115b610923576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161091a906138b3565b60405180910390fd5b60005b82518110156109e757600060018261093e9190613748565b90505b83518110156109d35783818151811061095d5761095c613614565b5b602002602001015184838151811061097857610977613614565b5b6020026020010151036109c0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109b79061391f565b60405180910390fd5b80806109cb9061377c565b915050610941565b5080806109df9061377c565b915050610926565b5060005b8151811015610aac576000600182610a039190613748565b90505b8251811015610a9857828181518110610a2257610a21613614565b5b6020026020010151838381518110610a3d57610a3c613614565b5b602002602001015103610a85576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a7c9061398b565b60405180910390fd5b8080610a909061377c565b915050610a06565b508080610aa49061377c565b9150506109eb565b5060005b8251811015610e99576000838281518110610ace57610acd613614565b5b602002602001015190503373ffffffffffffffffffffffffffffffffffffffff16600260019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636352211e836040518263ffffffff1660e01b8152600401610b4a9190613304565b602060405180830381865afa158015610b67573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b8b91906139c0565b73ffffffffffffffffffffffffffffffffffffffff1614610be1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bd890613a39565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600b600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610c5357610c523382612bc2565b5b600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020604051806080016040528083815260200142815260200160008152602001600260019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663b2596a67856040518263ffffffff1660e01b8152600401610d0b9190613304565b602060405180830381865afa158015610d28573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d4c9190613a6e565b815250908060018154018082558091505060019003906000526020600020906004020160009091909190915060008201518160000155602082015181600101556040820151816002015560608201518160030155505033600b600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600260019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166342842e0e3330846040518463ffffffff1660e01b8152600401610e5393929190613a9b565b600060405180830381600087803b158015610e6d57600080fd5b505af1158015610e81573d6000803e3d6000fd5b50505050508080610e919061377c565b915050610ab0565b5060005b81518110156110d9576000828281518110610ebb57610eba613614565b5b602002602001015190503373ffffffffffffffffffffffffffffffffffffffff16600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636352211e836040518263ffffffff1660e01b8152600401610f379190613304565b602060405180830381865afa158015610f54573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f7891906139c0565b73ffffffffffffffffffffffffffffffffffffffff1614610fce576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fc590613a39565b60405180910390fd5b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166342842e0e3330846040518463ffffffff1660e01b815260040161102d93929190613a9b565b600060405180830381600087803b15801561104757600080fd5b505af115801561105b573d6000803e3d6000fd5b50505050600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190806001815401808255809150506001900390600052602060002001600090919091909150555080806110d19061377c565b915050610e9d565b503373ffffffffffffffffffffffffffffffffffffffff167f859a4049709b7ed7c28d73c9122229b70aa55880d8744d1931e98e093a1b5b918383604051611122929190613b90565b60405180910390a2611132612d24565b5050565b61113e612aab565b60008111611181576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161117890613c13565b60405180910390fd5b80600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016111dd91906135f9565b602060405180830381865afa1580156111fa573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061121e9190613a6e565b101561125f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161125690613c7f565b60405180910390fd5b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33836040518363ffffffff1660e01b81526004016112bc929190613c9f565b6020604051808303816000875af11580156112db573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112ff9190613cf4565b503373ffffffffffffffffffffffffffffffffffffffff167f6352c5382c4a4578e712449ca65e83cdb392d045dfcf1cad9615189db2da244b826040516113469190613304565b60405180910390a250565b611359612b29565b611361612b78565b6000805b600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208054905081101561154d5782600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020828154811061140157611400613614565b5b9060005260206000209060040201600001540361153a57600954600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020828154811061146c5761146b613614565b5b906000526020600020906004020160020154426114899190613672565b10156114ca576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114c190613d6d565b60405180910390fd5b42600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020828154811061151c5761151b613614565b5b9060005260206000209060040201600201819055506001915061154d565b80806115459061377c565b915050611365565b508061158e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161158590613dd9565b60405180910390fd5b600854600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016115ec91906135f9565b602060405180830381865afa158015611609573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061162d9190613a6e565b101561166e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161166590613e45565b60405180910390fd5b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb336008546040518363ffffffff1660e01b81526004016116cf929190613c9f565b6020604051808303816000875af11580156116ee573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117129190613cf4565b905080611754576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161174b90613eb1565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff167fd44f824c77912892e22ec4e0f3e0dafa6d4a2512c57d64ba56b9a1b3c053dddb8460085460405161179e929190613ed1565b60405180910390a250506117b0612d24565b50565b6117bb612b29565b6117c3612b78565b6000805b600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002080549050811015611910576000600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020828154811061186457611863613614565b5b906000526020600020906004020160000154905060006118843383610592565b905080846118929190613748565b935042600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002084815481106118e6576118e5613614565b5b906000526020600020906004020160010181905550505080806119089061377c565b9150506117c7565b5060008111611954576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161194b90613f46565b60405180910390fd5b80600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016119b091906135f9565b602060405180830381865afa1580156119cd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119f19190613a6e565b1015611a32576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a2990613e45565b60405180910390fd5b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33846040518363ffffffff1660e01b8152600401611a91929190613c9f565b6020604051808303816000875af1158015611ab0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ad49190613cf4565b905080611b16576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b0d90613eb1565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff167f106f923f993c2149d49b4255ff723acafa1f2d94393f561d3eda32ae348f724183604051611b5c9190613304565b60405180910390a25050611b6e612d24565b565b60085481565b60075481565b600c6020528160005260406000208181548110611b9857600080fd5b90600052602060002001600091509150505481565b60095481565b611bbb612aab565b60008111611bfe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bf590613fd8565b60405180910390fd5b806008819055507f984f97438a61d2a2abf6ae7cccfe9dc9c37c8e3111255c24be5ef1129c6f2c7681604051611c349190613304565b60405180910390a150565b600a6020528160005260406000208181548110611c5b57600080fd5b9060005260206000209060040201600091509150508060000154908060010154908060020154908060030154905084565b6000600260009054906101000a900460ff16905090565b611cab612aab565b6064811015611cef576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ce690614044565b60405180910390fd5b806006819055507ff4b2d54c414c720f8a9e79192fc7b4918e9b12a7ce94b34ab404a40bccc6821d81604051611d259190613304565b60405180910390a150565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b611d5e612aab565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611dcd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dc4906140b0565b60405180910390fd5b80600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507f23d5823548e4652c04b1d029323232659612a32681d27872dd94b8d6b97ce6b181604051611e3d91906135f9565b60405180910390a150565b611e50612aab565b611e5a6000612d2d565b565b600260019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60055481565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600b6020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b611f12612aab565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611f81576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f78906140b0565b60405180910390fd5b80600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507ff2610996d245d9b77e4ff84c2174eea0b76fb44c422218404f66e28816d78fb981604051611ff191906135f9565b60405180910390a150565b60065481565b61200a612aab565b6000811161204d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161204490614142565b60405180910390fd5b806005819055507f41d466ebd06fb97e7786086ac8b69b7eb7da798592036251291d34e9791cde01816040516120839190613304565b60405180910390a150565b612096612b29565b61209e612b78565b6000825111806120af575060008151115b6120ee576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120e5906138b3565b60405180910390fd5b6000805b83518110156121b357600060018261210a9190613748565b90505b845181101561219f5784818151811061212957612128613614565b5b602002602001015185838151811061214457612143613614565b5b60200260200101510361218c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121839061391f565b60405180910390fd5b80806121979061377c565b91505061210d565b5080806121ab9061377c565b9150506120f2565b5060005b82518110156122785760006001826121cf9190613748565b90505b8351811015612264578381815181106121ee576121ed613614565b5b602002602001015184838151811061220957612208613614565b5b602002602001015103612251576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122489061398b565b60405180910390fd5b808061225c9061377c565b9150506121d2565b5080806122709061377c565b9150506121b7565b5060005b835181101561244157600084828151811061229a57612299613614565b5b602002602001015190503373ffffffffffffffffffffffffffffffffffffffff16600b600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614612345576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161233c906141ae565b60405180910390fd5b61234f3382610592565b8361235a9190613748565b9250600b600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055600260019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166342842e0e3033846040518463ffffffff1660e01b81526004016123f193929190613a9b565b600060405180830381600087803b15801561240b57600080fd5b505af115801561241f573d6000803e3d6000fd5b5050505061242d3382612bc2565b5080806124399061377c565b91505061227c565b508151600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208054905010156124c8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124bf9061421a565b60405180910390fd5b60005b82518110156126305760008382815181106124e9576124e8613614565b5b602002602001015190506124fd3382612df1565b61253c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161253390614286565b60405180910390fd5b60006125483383612ece565b90508061258a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161258190614286565b60405180910390fd5b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166342842e0e3033856040518463ffffffff1660e01b81526004016125e993929190613a9b565b600060405180830381600087803b15801561260357600080fd5b505af1158015612617573d6000803e3d6000fd5b50505050505080806126289061377c565b9150506124cb565b50600081111561284c5780600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161269691906135f9565b602060405180830381865afa1580156126b3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126d79190613a6e565b1015612718576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161270f90613e45565b60405180910390fd5b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33846040518363ffffffff1660e01b8152600401612777929190613c9f565b6020604051808303816000875af1158015612796573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127ba9190613cf4565b9050806127fc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127f390613eb1565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff167f106f923f993c2149d49b4255ff723acafa1f2d94393f561d3eda32ae348f7241836040516128429190613304565b60405180910390a2505b3373ffffffffffffffffffffffffffffffffffffffff167fef3bc8b2408263209f01abd2cf8120586077da5e4cf45d8a7dd83d2a0545f1038484604051612894929190613b90565b60405180910390a2506128a5612d24565b5050565b6128b1612aab565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603612920576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612917906140b0565b60405180910390fd5b80600260016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507ff2610996d245d9b77e4ff84c2174eea0b76fb44c422218404f66e28816d78fb98160405161299091906135f9565b60405180910390a150565b6129a3612aab565b60648110156129e7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129de90614044565b60405180910390fd5b806007819055507ff3570cd97015150a0e5502c9cf62bb4b8fd0d2891b81254dd7da2d319adf884181604051612a1d9190613304565b60405180910390a150565b612a30612aab565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603612a9f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a9690614318565b60405180910390fd5b612aa881612d2d565b50565b612ab3612fe6565b73ffffffffffffffffffffffffffffffffffffffff16612ad1611ee1565b73ffffffffffffffffffffffffffffffffffffffff1614612b27576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b1e90614384565b60405180910390fd5b565b600260015403612b6e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b65906143f0565b60405180910390fd5b6002600181905550565b612b80611c8c565b15612bc0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bb79061445c565b60405180910390fd5b565b6000600a60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905060005b8180549050811015612d1e5782828281548110612c2857612c27613614565b5b90600052602060002090600402016000015403612d0b578160018380549050612c519190613672565b81548110612c6257612c61613614565b5b9060005260206000209060040201828281548110612c8357612c82613614565b5b90600052602060002090600402016000820154816000015560018201548160010155600282015481600201556003820154816003015590505081805480612ccd57612ccc61447c565b5b600190038181906000526020600020906004020160008082016000905560018201600090556002820160009055600382016000905550509055612d1e565b8080612d169061377c565b915050612c08565b50505050565b60018081905550565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600080600090505b600c60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002080549050811015612ec25782600c60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208281548110612e9557612e94613614565b5b906000526020600020015403612eaf576001915050612ec8565b8080612eba9061377c565b915050612df9565b50600090505b92915050565b600080600c60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905060005b8180549050811015612fd95783828281548110612f3557612f34613614565b5b906000526020600020015403612fc6578160018380549050612f579190613672565b81548110612f6857612f67613614565b5b9060005260206000200154828281548110612f8657612f85613614565b5b906000526020600020018190555081805480612fa557612fa461447c565b5b60019003818190600052602060002001600090559055600192505050612fe0565b8080612fd19061377c565b915050612f15565b5060009150505b92915050565b600033905090565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061302d82613002565b9050919050565b61303d81613022565b811461304857600080fd5b50565b60008135905061305a81613034565b92915050565b6000819050919050565b61307381613060565b811461307e57600080fd5b50565b6000813590506130908161306a565b92915050565b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6130e9826130a0565b810181811067ffffffffffffffff82111715613108576131076130b1565b5b80604052505050565b600061311b612fee565b905061312782826130e0565b919050565b600067ffffffffffffffff821115613147576131466130b1565b5b613150826130a0565b9050602081019050919050565b82818337600083830152505050565b600061317f61317a8461312c565b613111565b90508281526020810184848401111561319b5761319a61309b565b5b6131a684828561315d565b509392505050565b600082601f8301126131c3576131c2613096565b5b81356131d384826020860161316c565b91505092915050565b600080600080608085870312156131f6576131f5612ff8565b5b60006132048782880161304b565b94505060206132158782880161304b565b935050604061322687828801613081565b925050606085013567ffffffffffffffff81111561324757613246612ffd565b5b613253878288016131ae565b91505092959194509250565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6132948161325f565b82525050565b60006020820190506132af600083018461328b565b92915050565b600080604083850312156132cc576132cb612ff8565b5b60006132da8582860161304b565b92505060206132eb85828601613081565b9150509250929050565b6132fe81613060565b82525050565b600060208201905061331960008301846132f5565b92915050565b60006020828403121561333557613334612ff8565b5b600061334384828501613081565b91505092915050565b600067ffffffffffffffff821115613367576133666130b1565b5b602082029050602081019050919050565b600080fd5b600061339061338b8461334c565b613111565b905080838252602082019050602084028301858111156133b3576133b2613378565b5b835b818110156133dc57806133c88882613081565b8452602084019350506020810190506133b5565b5050509392505050565b600082601f8301126133fb576133fa613096565b5b813561340b84826020860161337d565b91505092915050565b6000806040838503121561342b5761342a612ff8565b5b600083013567ffffffffffffffff81111561344957613448612ffd565b5b613455858286016133e6565b925050602083013567ffffffffffffffff81111561347657613475612ffd565b5b613482858286016133e6565b9150509250929050565b60006080820190506134a160008301876132f5565b6134ae60208301866132f5565b6134bb60408301856132f5565b6134c860608301846132f5565b95945050505050565b60008115159050919050565b6134e6816134d1565b82525050565b600060208201905061350160008301846134dd565b92915050565b6000819050919050565b600061352c61352761352284613002565b613507565b613002565b9050919050565b600061353e82613511565b9050919050565b600061355082613533565b9050919050565b61356081613545565b82525050565b600060208201905061357b6000830184613557565b92915050565b60006020828403121561359757613596612ff8565b5b60006135a58482850161304b565b91505092915050565b60006135b982613533565b9050919050565b6135c9816135ae565b82525050565b60006020820190506135e460008301846135c0565b92915050565b6135f381613022565b82525050565b600060208201905061360e60008301846135ea565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061367d82613060565b915061368883613060565b92508282039050818111156136a05761369f613643565b5b92915050565b60006136b182613060565b91506136bc83613060565b92508282026136ca81613060565b915082820484148315176136e1576136e0613643565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061372282613060565b915061372d83613060565b92508261373d5761373c6136e8565b5b828204905092915050565b600061375382613060565b915061375e83613060565b925082820190508082111561377657613775613643565b5b92915050565b600061378782613060565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036137b9576137b8613643565b5b600182019050919050565b600082825260208201905092915050565b7f436f6f6c646f776e206d7573742062652067726561746572207468616e207a6560008201527f726f000000000000000000000000000000000000000000000000000000000000602082015250565b60006138316022836137c4565b915061383c826137d5565b604082019050919050565b6000602082019050818103600083015261386081613824565b9050919050565b7f4e6f204e4654732070726f766964656400000000000000000000000000000000600082015250565b600061389d6010836137c4565b91506138a882613867565b602082019050919050565b600060208201905081810360008301526138cc81613890565b9050919050565b7f4475706c696361746520466c6f7765724e465420746f6b656e20494400000000600082015250565b6000613909601c836137c4565b9150613914826138d3565b602082019050919050565b60006020820190508181036000830152613938816138fc565b9050919050565b7f4475706c69636174652053746f6e65724e465420746f6b656e20494400000000600082015250565b6000613975601c836137c4565b91506139808261393f565b602082019050919050565b600060208201905081810360008301526139a481613968565b9050919050565b6000815190506139ba81613034565b92915050565b6000602082840312156139d6576139d5612ff8565b5b60006139e4848285016139ab565b91505092915050565b7f4e6f74204e4654206f776e657200000000000000000000000000000000000000600082015250565b6000613a23600d836137c4565b9150613a2e826139ed565b602082019050919050565b60006020820190508181036000830152613a5281613a16565b9050919050565b600081519050613a688161306a565b92915050565b600060208284031215613a8457613a83612ff8565b5b6000613a9284828501613a59565b91505092915050565b6000606082019050613ab060008301866135ea565b613abd60208301856135ea565b613aca60408301846132f5565b949350505050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b613b0781613060565b82525050565b6000613b198383613afe565b60208301905092915050565b6000602082019050919050565b6000613b3d82613ad2565b613b478185613add565b9350613b5283613aee565b8060005b83811015613b83578151613b6a8882613b0d565b9750613b7583613b25565b925050600181019050613b56565b5085935050505092915050565b60006040820190508181036000830152613baa8185613b32565b90508181036020830152613bbe8184613b32565b90509392505050565b7f416d6f756e74206d7573742062652067726561746572207468616e207a65726f600082015250565b6000613bfd6020836137c4565b9150613c0882613bc7565b602082019050919050565b60006020820190508181036000830152613c2c81613bf0565b9050919050565b7f4e6f7420656e6f75676820746f6b656e7320696e20636f6e7472616374000000600082015250565b6000613c69601d836137c4565b9150613c7482613c33565b602082019050919050565b60006020820190508181036000830152613c9881613c5c565b9050919050565b6000604082019050613cb460008301856135ea565b613cc160208301846132f5565b9392505050565b613cd1816134d1565b8114613cdc57600080fd5b50565b600081519050613cee81613cc8565b92915050565b600060208284031215613d0a57613d09612ff8565b5b6000613d1884828501613cdf565b91505092915050565b7f54617020626f6e757320636f6f6c646f776e206e6f7420726561636865640000600082015250565b6000613d57601e836137c4565b9150613d6282613d21565b602082019050919050565b60006020820190508181036000830152613d8681613d4a565b9050919050565b7f546f6b656e206e6f74207374616b656420627920757365720000000000000000600082015250565b6000613dc36018836137c4565b9150613dce82613d8d565b602082019050919050565b60006020820190508181036000830152613df281613db6565b9050919050565b7f496e73756666696369656e7420746f6b656e7320696e20636f6e747261637400600082015250565b6000613e2f601f836137c4565b9150613e3a82613df9565b602082019050919050565b60006020820190508181036000830152613e5e81613e22565b9050919050565b7f546f6b656e207472616e73666572206661696c65640000000000000000000000600082015250565b6000613e9b6015836137c4565b9150613ea682613e65565b602082019050919050565b60006020820190508181036000830152613eca81613e8e565b9050919050565b6000604082019050613ee660008301856132f5565b613ef360208301846132f5565b9392505050565b7f4e6f207265776172647320746f20636c61696d00000000000000000000000000600082015250565b6000613f306013836137c4565b9150613f3b82613efa565b602082019050919050565b60006020820190508181036000830152613f5f81613f23565b9050919050565b7f426f6e757320616d6f756e74206d75737420626520677265617465722074686160008201527f6e207a65726f0000000000000000000000000000000000000000000000000000602082015250565b6000613fc26026836137c4565b9150613fcd82613f66565b604082019050919050565b60006020820190508181036000830152613ff181613fb5565b9050919050565b7f4d756c7469706c696572206d757374206265206174206c656173742031303000600082015250565b600061402e601f836137c4565b915061403982613ff8565b602082019050919050565b6000602082019050818103600083015261405d81614021565b9050919050565b7f496e76616c696420616464726573730000000000000000000000000000000000600082015250565b600061409a600f836137c4565b91506140a582614064565b602082019050919050565b600060208201905081810360008301526140c98161408d565b9050919050565b7f5265776172642072617465206d7573742062652067726561746572207468616e60008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b600061412c6025836137c4565b9150614137826140d0565b604082019050919050565b6000602082019050818103600083015261415b8161411f565b9050919050565b7f596f7520646f206e6f74206f776e2074686973207374616b6564204e46540000600082015250565b6000614198601e836137c4565b91506141a382614162565b602082019050919050565b600060208201905081810360008301526141c78161418b565b9050919050565b7f4e6f7420656e6f756768207374616b65642053746f6e65724e46547300000000600082015250565b6000614204601c836137c4565b915061420f826141ce565b602082019050919050565b60006020820190508181036000830152614233816141f7565b9050919050565b7f53746f6e65724e4654206e6f74207374616b6564206279207573657200000000600082015250565b6000614270601c836137c4565b915061427b8261423a565b602082019050919050565b6000602082019050818103600083015261429f81614263565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006143026026836137c4565b915061430d826142a6565b604082019050919050565b60006020820190508181036000830152614331816142f5565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b600061436e6020836137c4565b915061437982614338565b602082019050919050565b6000602082019050818103600083015261439d81614361565b9050919050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b60006143da601f836137c4565b91506143e5826143a4565b602082019050919050565b60006020820190508181036000830152614409816143cd565b9050919050565b7f5061757361626c653a2070617573656400000000000000000000000000000000600082015250565b60006144466010836137c4565b915061445182614410565b602082019050919050565b6000602082019050818103600083015261447581614439565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fdfea2646970667358221220c23c3e4a30cc4157e727e14cef25b82e2bbe9a3f44cd4bed56a3ec2270d7365c64736f6c63430008130033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000003be8d7a305856dcc5f6a41ade1b2f63ce4cdc86d000000000000000000000000a58cd405fb0f4ad5c917393518aafd71a72644890000000000000000000000009b567e03d891f537b2b7874aa4a3308cfe2f4fbb
-----Decoded View---------------
Arg [0] : _flowerNFT (address): 0x3be8d7A305856Dcc5f6a41aDE1B2F63CE4CDc86D
Arg [1] : _flowerToken (address): 0xa58cD405FB0F4aD5C917393518aAFd71A7264489
Arg [2] : _stonerToken (address): 0x9b567e03d891F537b2B7874aA4A3308Cfe2F4FBb
-----Encoded View---------------
3 Constructor Arguments found :
Arg [0] : 0000000000000000000000003be8d7a305856dcc5f6a41ade1b2f63ce4cdc86d
Arg [1] : 000000000000000000000000a58cd405fb0f4ad5c917393518aafd71a7264489
Arg [2] : 0000000000000000000000009b567e03d891f537b2b7874aa4a3308cfe2f4fbb
Deployed Bytecode Sourcemap
19695:12332:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31860:164;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23917:782;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23339:228;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;26474:1815;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;23575:334;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;25557:884;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;24756:760;;;:::i;:::-;;20049:41;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;19985:45;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20395:49;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20097:36;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23104:227;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;20288:41;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;;;;;5988:86;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22567:256;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;19814:25;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22106:233;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;8852:103;;;:::i;:::-;;19783:24;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;19881:35;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;19846:26;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20336:52;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;8211:87;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21866:232;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;19923:42;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22347:212;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;28297:2366;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;21630:228;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;22831:265;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;9110:201;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;31860:164;31960:6;31986:30;;;31979:37;;31860:164;;;;;;:::o;23917:782::-;23994:7;24019:9;24031:1;24019:13;;24014:659;24038:6;:12;24045:4;24038:12;;;;;;;;;;;;;;;:19;;;;24034:1;:23;24014:659;;;24110:7;24083:6;:12;24090:4;24083:12;;;;;;;;;;;;;;;24096:1;24083:15;;;;;;;;:::i;:::-;;;;;;;;;;;;:23;;;:34;24079:583;;24138:18;24177:6;:12;24184:4;24177:12;;;;;;;;;;;;;;;24190:1;24177:15;;;;;;;;:::i;:::-;;;;;;;;;;;;:24;;;24159:15;:42;;;;:::i;:::-;24138:63;;24220:16;24239:6;:12;24246:4;24239:12;;;;;;;;;;;;;;;24252:1;24239:15;;;;;;;;:::i;:::-;;;;;;;;;;;;:31;;;24220:50;;24291:18;24351:6;24337:10;;24326:8;24313:10;:21;;;;:::i;:::-;:34;;;;:::i;:::-;24312:45;;;;:::i;:::-;24291:66;;24378:19;24450:3;24442;24415:24;;:30;;;;:::i;:::-;24401:10;:45;;;;:::i;:::-;24400:53;;;;:::i;:::-;24378:75;;24472:19;24522:1;24494:12;:18;24507:4;24494:18;;;;;;;;;;;;;;;:25;;;;:29;:86;;24579:1;24494:86;;;24573:3;24565;24541:21;;:27;;;;:::i;:::-;24527:10;:42;;;;:::i;:::-;24526:50;;;;:::i;:::-;24494:86;24472:108;;24635:11;24621;24608:10;:24;;;;:::i;:::-;:38;;;;:::i;:::-;24601:45;;;;;;;;;;24079:583;24059:3;;;;;:::i;:::-;;;;24014:659;;;;24690:1;24683:8;;23917:782;;;;;:::o;23339:228::-;8097:13;:11;:13::i;:::-;23436:1:::1;23422:11;:15;23414:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;23501:11;23487;:25;;;;23528:31;23547:11;23528:31;;;;;;:::i;:::-;;;;;;;;23339:228:::0;:::o;26474:1815::-;2393:21;:19;:21::i;:::-;5593:19:::1;:17;:19::i;:::-;26642:1:::2;26618:14;:21;:25;:54;;;;26671:1;26647:14;:21;:25;26618:54;26610:83;;;;;;;;;;;;:::i;:::-;;;;;;;;;26753:9;26748:248;26772:14;:21;26768:1;:25;26748:248;;;26820:9;26836:1;26832;:5;;;;:::i;:::-;26820:17;;26815:170;26843:14;:21;26839:1;:25;26815:170;;;26919:14;26934:1;26919:17;;;;;;;;:::i;:::-;;;;;;;;26898:14;26913:1;26898:17;;;;;;;;:::i;:::-;;;;;;;;:38:::0;26890:79:::2;;;;;;;;;;;;:::i;:::-;;;;;;;;;26866:3;;;;;:::i;:::-;;;;26815:170;;;;26795:3;;;;;:::i;:::-;;;;26748:248;;;;27013:9;27008:248;27032:14;:21;27028:1;:25;27008:248;;;27080:9;27096:1;27092;:5;;;;:::i;:::-;27080:17;;27075:170;27103:14;:21;27099:1;:25;27075:170;;;27179:14;27194:1;27179:17;;;;;;;;:::i;:::-;;;;;;;;27158:14;27173:1;27158:17;;;;;;;;:::i;:::-;;;;;;;;:38:::0;27150:79:::2;;;;;;;;;;;;:::i;:::-;;;;;;;;;27126:3;;;;;:::i;:::-;;;;27075:170;;;;27055:3;;;;;:::i;:::-;;;;27008:248;;;;27273:9;27268:599;27292:14;:21;27288:1;:25;27268:599;;;27335:15;27353:14;27368:1;27353:17;;;;;;;;:::i;:::-;;;;;;;;27335:35;;27423:10;27393:40;;:9;;;;;;;;;;;:17;;;27411:7;27393:26;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:40;;;27385:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;27510:1;27472:40;;:17;:26;27490:7;27472:26;;;;;;;;;;;;;;;;;;;;;:40;;;27468:114;;27533:33;27546:10;27558:7;27533:12;:33::i;:::-;27468:114;27598:6;:18;27605:10;27598:18;;;;;;;;;;;;;;;27622:82;;;;;;;;27628:7;27622:82;;;;27637:15;27622:82;;;;27654:1;27622:82;;;;27676:9;;;;;;;;;;;27657:37;;;27695:7;27657:46;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;27622:82;;::::0;27598:107:::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27768:10;27739:17;:26;27757:7;27739:26;;;;;;;;;;;;:39;;;;;;;;;;;;;;;;;;27793:9;;;;;;;;;;;:26;;;27820:10;27840:4;27847:7;27793:62;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;27320:547;27315:3;;;;;:::i;:::-;;;;27268:599;;;;27884:9;27879:335;27903:14;:21;27899:1;:25;27879:335;;;27946:16;27965:14;27980:1;27965:17;;;;;;;;:::i;:::-;;;;;;;;27946:36;;28038:10;28005:43;;:11;;;;;;;;;;;:19;;;28025:8;28005:29;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:43;;;27997:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;28083:11;;;;;;;;;;;:28;;;28112:10;28132:4;28139:8;28083:65;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;28163:12;:24;28176:10;28163:24;;;;;;;;;;;;;;;28193:8;28163:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27931:283;27926:3;;;;;:::i;:::-;;;;27879:335;;;;28238:10;28231:50;;;28250:14;28266;28231:50;;;;;;;:::i;:::-;;;;;;;;2437:20:::0;:18;:20::i;:::-;26474:1815;;:::o;23575:334::-;8097:13;:11;:13::i;:::-;23662:1:::1;23653:6;:10;23645:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;23759:6;23719:11;;;;;;;;;;;:21;;;23749:4;23719:36;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:46;;23711:88;;;;;;;;;;;;:::i;:::-;;;;;;;;;23810:11;;;;;;;;;;;:20;;;23831:10;23843:6;23810:40;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;23882:10;23866:35;;;23894:6;23866:35;;;;;;:::i;:::-;;;;;;;;23575:334:::0;:::o;25557:884::-;2393:21;:19;:21::i;:::-;5593:19:::1;:17;:19::i;:::-;25644:10:::2;25680:9:::0;25675:397:::2;25699:6;:18;25706:10;25699:18;;;;;;;;;;;;;;;:25;;;;25695:1;:29;25675:397;;;25783:7;25750:6;:18;25757:10;25750:18;;;;;;;;;;;;;;;25769:1;25750:21;;;;;;;;:::i;:::-;;;;;;;;;;;;:29;;;:40:::0;25746:315:::2;;25873:11;;25837:6;:18;25844:10;25837:18;;;;;;;;;;;;;;;25856:1;25837:21;;;;;;;;:::i;:::-;;;;;;;;;;;;:32;;;25819:15;:50;;;;:::i;:::-;:65;;25811:108;;;;;;;;;;;;:::i;:::-;;;;;;;;;25975:15;25940:6;:18;25947:10;25940:18;;;;;;;;;;;;;;;25959:1;25940:21;;;;;;;;:::i;:::-;;;;;;;;;;;;:32;;:50;;;;26017:4;26009:12;;26040:5;;25746:315;25726:3;;;;;:::i;:::-;;;;25675:397;;;;26092:5;26084:42;;;;;;;;;;;;:::i;:::-;;;;;;;;;26185:14;;26145:11;;;;;;;;;;;:21;;;26175:4;26145:36;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:54;;26137:98;;;;;;;;;;;;:::i;:::-;;;;;;;;;26248:12;26263:11;;;;;;;;;;;:20;;;26284:10;26296:14;;26263:48;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;26248:63;;26330:7;26322:41;;;;;;;;;;;;:::i;:::-;;;;;;;;;26397:10;26381:52;;;26409:7;26418:14;;26381:52;;;;;;;:::i;:::-;;;;;;;;25633:808;;2437:20:::0;:18;:20::i;:::-;25557:884;:::o;24756:760::-;2393:21;:19;:21::i;:::-;5593:19:::1;:17;:19::i;:::-;24827::::2;24868:9:::0;24863:299:::2;24887:6;:18;24894:10;24887:18;;;;;;;;;;;;;;;:25;;;;24883:1;:29;24863:299;;;24934:15;24952:6;:18;24959:10;24952:18;;;;;;;;;;;;;;;24971:1;24952:21;;;;;;;;:::i;:::-;;;;;;;;;;;;:29;;;24934:47;;24996:14;25013:36;25029:10;25041:7;25013:15;:36::i;:::-;24996:53;;25079:6;25064:21;;;;;:::i;:::-;;;25135:15;25102:6;:18;25109:10;25102:18;;;;;;;;;;;;;;;25121:1;25102:21;;;;;;;;:::i;:::-;;;;;;;;;;;;:30;;:48;;;;24919:243;;24914:3;;;;;:::i;:::-;;;;24863:299;;;;25196:1;25182:11;:15;25174:47;;;;;;;;;;;;:::i;:::-;;;;;;;;;25280:11;25240;;;;;;;;;;;:21;;;25270:4;25240:36;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:51;;25232:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;25340:12;25355:11;;;;;;;;;;;:20;;;25376:10;25388:11;25355:45;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;25340:60;;25419:7;25411:41;;;;;;;;;;;;:::i;:::-;;;;;;;;;25484:10;25470:38;;;25496:11;25470:38;;;;;;:::i;:::-;;;;;;;;24816:700;;2437:20:::0;:18;:20::i;:::-;24756:760::o;20049:41::-;;;;:::o;19985:45::-;;;;:::o;20395:49::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;20097:36::-;;;;:::o;23104:227::-;8097:13;:11;:13::i;:::-;23200:1:::1;23188:9;:13;23180:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;23272:9;23255:14;:26;;;;23297;23313:9;23297:26;;;;;;:::i;:::-;;;;;;;;23104:227:::0;:::o;20288:41::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;5988:86::-;6035:4;6059:7;;;;;;;;;;;6052:14;;5988:86;:::o;22567:256::-;8097:13;:11;:13::i;:::-;22679:3:::1;22662:13;:20;;22654:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;22753:13;22729:21;:37;;;;22782:33;22801:13;22782:33;;;;;;:::i;:::-;;;;;;;;22567:256:::0;:::o;19814:25::-;;;;;;;;;;;;;:::o;22106:233::-;8097:13;:11;:13::i;:::-;22218:1:::1;22196:24;;:10;:24;;::::0;22188:52:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;22272:10;22251:11;;:32;;;;;;;;;;;;;;;;;;22299;22320:10;22299:32;;;;;;:::i;:::-;;;;;;;;22106:233:::0;:::o;8852:103::-;8097:13;:11;:13::i;:::-;8917:30:::1;8944:1;8917:18;:30::i;:::-;8852:103::o:0;19783:24::-;;;;;;;;;;;;;:::o;19881:35::-;;;;:::o;19846:26::-;;;;;;;;;;;;;:::o;20336:52::-;;;;;;;;;;;;;;;;;;;;;;:::o;8211:87::-;8257:7;8284:6;;;;;;;;;;;8277:13;;8211:87;:::o;21866:232::-;8097:13;:11;:13::i;:::-;21978:1:::1;21956:24;;:10;:24;;::::0;21948:52:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;22033:10;22011:11;;:33;;;;;;;;;;;;;;;;;;22060:30;22079:10;22060:30;;;;;;:::i;:::-;;;;;;;;21866:232:::0;:::o;19923:42::-;;;;:::o;22347:212::-;8097:13;:11;:13::i;:::-;22435:1:::1;22425:7;:11;22417:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;22502:7;22489:10;:20;;;;22525:26;22543:7;22525:26;;;;;;:::i;:::-;;;;;;;;22347:212:::0;:::o;28297:2366::-;2393:21;:19;:21::i;:::-;5593:19:::1;:17;:19::i;:::-;28467:1:::2;28443:14;:21;:25;:54;;;;28496:1;28472:14;:21;:25;28443:54;28435:83;;;;;;;;;;;;:::i;:::-;;;;;;;;;28531:19;28614:9:::0;28609:248:::2;28633:14;:21;28629:1;:25;28609:248;;;28681:9;28697:1;28693;:5;;;;:::i;:::-;28681:17;;28676:170;28704:14;:21;28700:1;:25;28676:170;;;28780:14;28795:1;28780:17;;;;;;;;:::i;:::-;;;;;;;;28759:14;28774:1;28759:17;;;;;;;;:::i;:::-;;;;;;;;:38:::0;28751:79:::2;;;;;;;;;;;;:::i;:::-;;;;;;;;;28727:3;;;;;:::i;:::-;;;;28676:170;;;;28656:3;;;;;:::i;:::-;;;;28609:248;;;;28874:9;28869:248;28893:14;:21;28889:1;:25;28869:248;;;28941:9;28957:1;28953;:5;;;;:::i;:::-;28941:17;;28936:170;28964:14;:21;28960:1;:25;28936:170;;;29040:14;29055:1;29040:17;;;;;;;;:::i;:::-;;;;;;;;29019:14;29034:1;29019:17;;;;;;;;:::i;:::-;;;;;;;;:38:::0;29011:79:::2;;;;;;;;;;;;:::i;:::-;;;;;;;;;28987:3;;;;;:::i;:::-;;;;28936:170;;;;28916:3;;;;;:::i;:::-;;;;28869:248;;;;29168:9;29163:498;29187:14;:21;29183:1;:25;29163:498;;;29230:15;29248:14;29263:1;29248:17;;;;;;;;:::i;:::-;;;;;;;;29230:35;;29318:10;29288:40;;:17;:26;29306:7;29288:26;;;;;;;;;;;;;;;;;;;;;:40;;;29280:83;;;;;;;;;;;;:::i;:::-;;;;;;;;;29395:36;29411:10;29423:7;29395:15;:36::i;:::-;29380:51;;;;;:::i;:::-;;;29455:17;:26;29473:7;29455:26;;;;;;;;;;;;29448:33;;;;;;;;;;;29496:9;;;;;;;;;;;:26;;;29531:4;29538:10;29550:7;29496:62;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;29616:33;29629:10;29641:7;29616:12;:33::i;:::-;29215:446;29210:3;;;;;:::i;:::-;;;;29163:498;;;;29750:14;:21;29715:12;:24;29728:10;29715:24;;;;;;;;;;;;;;;:31;;;;:56;;29707:97;;;;;;;;;;;;:::i;:::-;;;;;;;;;29822:9;29817:425;29841:14;:21;29837:1;:25;29817:425;;;29884:16;29903:14;29918:1;29903:17;;;;;;;;:::i;:::-;;;;;;;;29884:36;;29943:37;29959:10;29971:8;29943:15;:37::i;:::-;29935:78;;;;;;;;;;;;:::i;:::-;;;;;;;;;30030:12;30045:40;30064:10;30076:8;30045:18;:40::i;:::-;30030:55;;30108:7;30100:48;;;;;;;;;;;;:::i;:::-;;;;;;;;;30165:11;;;;;;;;;;;:28;;;30202:4;30209:10;30221:8;30165:65;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;29869:373;;29864:3;;;;;:::i;:::-;;;;29817:425;;;;30272:1;30258:11;:15;30254:332;;;30338:11;30298;;;;;;;;;;;:21;;;30328:4;30298:36;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:51;;30290:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;30400:12;30415:11;;;;;;;;;;;:20;;;30436:10;30448:11;30415:45;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;30400:60;;30483:7;30475:41;;;;;;;;;;;;:::i;:::-;;;;;;;;;30550:10;30536:38;;;30562:11;30536:38;;;;;;:::i;:::-;;;;;;;;30275:311;30254:332;30612:10;30603:52;;;30624:14;30640;30603:52;;;;;;;:::i;:::-;;;;;;;;28424:2239;2437:20:::0;:18;:20::i;:::-;28297:2366;;:::o;21630:228::-;8097:13;:11;:13::i;:::-;21740:1:::1;21718:24;;:10;:24;;::::0;21710:52:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;21793:10;21773:9;;:31;;;;;;;;;;;;;;;;;;21820:30;21839:10;21820:30;;;;;;:::i;:::-;;;;;;;;21630:228:::0;:::o;22831:265::-;8097:13;:11;:13::i;:::-;22946:3:::1;22929:13;:20;;22921:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;23023:13;22996:24;:40;;;;23052:36;23074:13;23052:36;;;;;;:::i;:::-;;;;;;;;22831:265:::0;:::o;9110:201::-;8097:13;:11;:13::i;:::-;9219:1:::1;9199:22;;:8;:22;;::::0;9191:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;9275:28;9294:8;9275:18;:28::i;:::-;9110:201:::0;:::o;8376:132::-;8451:12;:10;:12::i;:::-;8440:23;;:7;:5;:7::i;:::-;:23;;;8432:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;8376:132::o;2473:293::-;1875:1;2607:7;;:19;2599:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;1875:1;2740:7;:18;;;;2473:293::o;6147:108::-;6218:8;:6;:8::i;:::-;6217:9;6209:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;6147:108::o;30671:387::-;30744:26;30773:6;:12;30780:4;30773:12;;;;;;;;;;;;;;;30744:41;;30801:9;30796:255;30820:10;:17;;;;30816:1;:21;30796:255;;;30888:7;30863:10;30874:1;30863:13;;;;;;;;:::i;:::-;;;;;;;;;;;;:21;;;:32;30859:181;;30932:10;30963:1;30943:10;:17;;;;:21;;;;:::i;:::-;30932:33;;;;;;;;:::i;:::-;;;;;;;;;;;;30916:10;30927:1;30916:13;;;;;;;;:::i;:::-;;;;;;;;;;;;:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30984:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31019:5;;30859:181;30839:3;;;;;:::i;:::-;;;;30796:255;;;;30733:325;30671:387;;:::o;2774:213::-;1831:1;2957:7;:22;;;;2774:213::o;9471:191::-;9545:16;9564:6;;;;;;;;;;;9545:25;;9590:8;9581:6;;:17;;;;;;;;;;;;;;;;;;9645:8;9614:40;;9635:8;9614:40;;;;;;;;;;;;9534:128;9471:191;:::o;31066:292::-;31145:4;31167:9;31179:1;31167:13;;31162:166;31186:12;:18;31199:4;31186:18;;;;;;;;;;;;;;;:25;;;;31182:1;:29;31162:166;;;31262:7;31237:12;:18;31250:4;31237:18;;;;;;;;;;;;;;;31256:1;31237:21;;;;;;;;:::i;:::-;;;;;;;;;;:32;31233:84;;31297:4;31290:11;;;;;31233:84;31213:3;;;;;:::i;:::-;;;;31162:166;;;;31345:5;31338:12;;31066:292;;;;;:::o;31366:486::-;31443:4;31460:28;31491:12;:18;31504:4;31491:18;;;;;;;;;;;;;;;31460:49;;31527:9;31522:253;31546:10;:17;;;;31542:1;:21;31522:253;;;31606:7;31589:10;31600:1;31589:13;;;;;;;;:::i;:::-;;;;;;;;;;:24;31585:179;;31650:10;31681:1;31661:10;:17;;;;:21;;;;:::i;:::-;31650:33;;;;;;;;:::i;:::-;;;;;;;;;;31634:10;31645:1;31634:13;;;;;;;;:::i;:::-;;;;;;;;;:49;;;;31702:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;31744:4;31737:11;;;;;;31585:179;31565:3;;;;;:::i;:::-;;;;31522:253;;;;31792:5;31785:12;;;31366:486;;;;;:::o;3988:98::-;4041:7;4068:10;4061:17;;3988:98;:::o;7:75:1:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:126;371:7;411:42;404:5;400:54;389:65;;334:126;;;:::o;466:96::-;503:7;532:24;550:5;532:24;:::i;:::-;521:35;;466:96;;;:::o;568:122::-;641:24;659:5;641:24;:::i;:::-;634:5;631:35;621:63;;680:1;677;670:12;621:63;568:122;:::o;696:139::-;742:5;780:6;767:20;758:29;;796:33;823:5;796:33;:::i;:::-;696:139;;;;:::o;841:77::-;878:7;907:5;896:16;;841:77;;;:::o;924:122::-;997:24;1015:5;997:24;:::i;:::-;990:5;987:35;977:63;;1036:1;1033;1026:12;977:63;924:122;:::o;1052:139::-;1098:5;1136:6;1123:20;1114:29;;1152:33;1179:5;1152:33;:::i;:::-;1052:139;;;;:::o;1197:117::-;1306:1;1303;1296:12;1320:117;1429:1;1426;1419:12;1443:102;1484:6;1535:2;1531:7;1526:2;1519:5;1515:14;1511:28;1501:38;;1443:102;;;:::o;1551:180::-;1599:77;1596:1;1589:88;1696:4;1693:1;1686:15;1720:4;1717:1;1710:15;1737:281;1820:27;1842:4;1820:27;:::i;:::-;1812:6;1808:40;1950:6;1938:10;1935:22;1914:18;1902:10;1899:34;1896:62;1893:88;;;1961:18;;:::i;:::-;1893:88;2001:10;1997:2;1990:22;1780:238;1737:281;;:::o;2024:129::-;2058:6;2085:20;;:::i;:::-;2075:30;;2114:33;2142:4;2134:6;2114:33;:::i;:::-;2024:129;;;:::o;2159:307::-;2220:4;2310:18;2302:6;2299:30;2296:56;;;2332:18;;:::i;:::-;2296:56;2370:29;2392:6;2370:29;:::i;:::-;2362:37;;2454:4;2448;2444:15;2436:23;;2159:307;;;:::o;2472:146::-;2569:6;2564:3;2559;2546:30;2610:1;2601:6;2596:3;2592:16;2585:27;2472:146;;;:::o;2624:423::-;2701:5;2726:65;2742:48;2783:6;2742:48;:::i;:::-;2726:65;:::i;:::-;2717:74;;2814:6;2807:5;2800:21;2852:4;2845:5;2841:16;2890:3;2881:6;2876:3;2872:16;2869:25;2866:112;;;2897:79;;:::i;:::-;2866:112;2987:54;3034:6;3029:3;3024;2987:54;:::i;:::-;2707:340;2624:423;;;;;:::o;3066:338::-;3121:5;3170:3;3163:4;3155:6;3151:17;3147:27;3137:122;;3178:79;;:::i;:::-;3137:122;3295:6;3282:20;3320:78;3394:3;3386:6;3379:4;3371:6;3367:17;3320:78;:::i;:::-;3311:87;;3127:277;3066:338;;;;:::o;3410:943::-;3505:6;3513;3521;3529;3578:3;3566:9;3557:7;3553:23;3549:33;3546:120;;;3585:79;;:::i;:::-;3546:120;3705:1;3730:53;3775:7;3766:6;3755:9;3751:22;3730:53;:::i;:::-;3720:63;;3676:117;3832:2;3858:53;3903:7;3894:6;3883:9;3879:22;3858:53;:::i;:::-;3848:63;;3803:118;3960:2;3986:53;4031:7;4022:6;4011:9;4007:22;3986:53;:::i;:::-;3976:63;;3931:118;4116:2;4105:9;4101:18;4088:32;4147:18;4139:6;4136:30;4133:117;;;4169:79;;:::i;:::-;4133:117;4274:62;4328:7;4319:6;4308:9;4304:22;4274:62;:::i;:::-;4264:72;;4059:287;3410:943;;;;;;;:::o;4359:149::-;4395:7;4435:66;4428:5;4424:78;4413:89;;4359:149;;;:::o;4514:115::-;4599:23;4616:5;4599:23;:::i;:::-;4594:3;4587:36;4514:115;;:::o;4635:218::-;4726:4;4764:2;4753:9;4749:18;4741:26;;4777:69;4843:1;4832:9;4828:17;4819:6;4777:69;:::i;:::-;4635:218;;;;:::o;4859:474::-;4927:6;4935;4984:2;4972:9;4963:7;4959:23;4955:32;4952:119;;;4990:79;;:::i;:::-;4952:119;5110:1;5135:53;5180:7;5171:6;5160:9;5156:22;5135:53;:::i;:::-;5125:63;;5081:117;5237:2;5263:53;5308:7;5299:6;5288:9;5284:22;5263:53;:::i;:::-;5253:63;;5208:118;4859:474;;;;;:::o;5339:118::-;5426:24;5444:5;5426:24;:::i;:::-;5421:3;5414:37;5339:118;;:::o;5463:222::-;5556:4;5594:2;5583:9;5579:18;5571:26;;5607:71;5675:1;5664:9;5660:17;5651:6;5607:71;:::i;:::-;5463:222;;;;:::o;5691:329::-;5750:6;5799:2;5787:9;5778:7;5774:23;5770:32;5767:119;;;5805:79;;:::i;:::-;5767:119;5925:1;5950:53;5995:7;5986:6;5975:9;5971:22;5950:53;:::i;:::-;5940:63;;5896:117;5691:329;;;;:::o;6026:311::-;6103:4;6193:18;6185:6;6182:30;6179:56;;;6215:18;;:::i;:::-;6179:56;6265:4;6257:6;6253:17;6245:25;;6325:4;6319;6315:15;6307:23;;6026:311;;;:::o;6343:117::-;6452:1;6449;6442:12;6483:710;6579:5;6604:81;6620:64;6677:6;6620:64;:::i;:::-;6604:81;:::i;:::-;6595:90;;6705:5;6734:6;6727:5;6720:21;6768:4;6761:5;6757:16;6750:23;;6821:4;6813:6;6809:17;6801:6;6797:30;6850:3;6842:6;6839:15;6836:122;;;6869:79;;:::i;:::-;6836:122;6984:6;6967:220;7001:6;6996:3;6993:15;6967:220;;;7076:3;7105:37;7138:3;7126:10;7105:37;:::i;:::-;7100:3;7093:50;7172:4;7167:3;7163:14;7156:21;;7043:144;7027:4;7022:3;7018:14;7011:21;;6967:220;;;6971:21;6585:608;;6483:710;;;;;:::o;7216:370::-;7287:5;7336:3;7329:4;7321:6;7317:17;7313:27;7303:122;;7344:79;;:::i;:::-;7303:122;7461:6;7448:20;7486:94;7576:3;7568:6;7561:4;7553:6;7549:17;7486:94;:::i;:::-;7477:103;;7293:293;7216:370;;;;:::o;7592:894::-;7710:6;7718;7767:2;7755:9;7746:7;7742:23;7738:32;7735:119;;;7773:79;;:::i;:::-;7735:119;7921:1;7910:9;7906:17;7893:31;7951:18;7943:6;7940:30;7937:117;;;7973:79;;:::i;:::-;7937:117;8078:78;8148:7;8139:6;8128:9;8124:22;8078:78;:::i;:::-;8068:88;;7864:302;8233:2;8222:9;8218:18;8205:32;8264:18;8256:6;8253:30;8250:117;;;8286:79;;:::i;:::-;8250:117;8391:78;8461:7;8452:6;8441:9;8437:22;8391:78;:::i;:::-;8381:88;;8176:303;7592:894;;;;;:::o;8492:553::-;8669:4;8707:3;8696:9;8692:19;8684:27;;8721:71;8789:1;8778:9;8774:17;8765:6;8721:71;:::i;:::-;8802:72;8870:2;8859:9;8855:18;8846:6;8802:72;:::i;:::-;8884;8952:2;8941:9;8937:18;8928:6;8884:72;:::i;:::-;8966;9034:2;9023:9;9019:18;9010:6;8966:72;:::i;:::-;8492:553;;;;;;;:::o;9051:90::-;9085:7;9128:5;9121:13;9114:21;9103:32;;9051:90;;;:::o;9147:109::-;9228:21;9243:5;9228:21;:::i;:::-;9223:3;9216:34;9147:109;;:::o;9262:210::-;9349:4;9387:2;9376:9;9372:18;9364:26;;9400:65;9462:1;9451:9;9447:17;9438:6;9400:65;:::i;:::-;9262:210;;;;:::o;9478:60::-;9506:3;9527:5;9520:12;;9478:60;;;:::o;9544:142::-;9594:9;9627:53;9645:34;9654:24;9672:5;9654:24;:::i;:::-;9645:34;:::i;:::-;9627:53;:::i;:::-;9614:66;;9544:142;;;:::o;9692:126::-;9742:9;9775:37;9806:5;9775:37;:::i;:::-;9762:50;;9692:126;;;:::o;9824:140::-;9888:9;9921:37;9952:5;9921:37;:::i;:::-;9908:50;;9824:140;;;:::o;9970:159::-;10071:51;10116:5;10071:51;:::i;:::-;10066:3;10059:64;9970:159;;:::o;10135:250::-;10242:4;10280:2;10269:9;10265:18;10257:26;;10293:85;10375:1;10364:9;10360:17;10351:6;10293:85;:::i;:::-;10135:250;;;;:::o;10391:329::-;10450:6;10499:2;10487:9;10478:7;10474:23;10470:32;10467:119;;;10505:79;;:::i;:::-;10467:119;10625:1;10650:53;10695:7;10686:6;10675:9;10671:22;10650:53;:::i;:::-;10640:63;;10596:117;10391:329;;;;:::o;10726:141::-;10791:9;10824:37;10855:5;10824:37;:::i;:::-;10811:50;;10726:141;;;:::o;10873:161::-;10975:52;11021:5;10975:52;:::i;:::-;10970:3;10963:65;10873:161;;:::o;11040:252::-;11148:4;11186:2;11175:9;11171:18;11163:26;;11199:86;11282:1;11271:9;11267:17;11258:6;11199:86;:::i;:::-;11040:252;;;;:::o;11298:118::-;11385:24;11403:5;11385:24;:::i;:::-;11380:3;11373:37;11298:118;;:::o;11422:222::-;11515:4;11553:2;11542:9;11538:18;11530:26;;11566:71;11634:1;11623:9;11619:17;11610:6;11566:71;:::i;:::-;11422:222;;;;:::o;11650:180::-;11698:77;11695:1;11688:88;11795:4;11792:1;11785:15;11819:4;11816:1;11809:15;11836:180;11884:77;11881:1;11874:88;11981:4;11978:1;11971:15;12005:4;12002:1;11995:15;12022:194;12062:4;12082:20;12100:1;12082:20;:::i;:::-;12077:25;;12116:20;12134:1;12116:20;:::i;:::-;12111:25;;12160:1;12157;12153:9;12145:17;;12184:1;12178:4;12175:11;12172:37;;;12189:18;;:::i;:::-;12172:37;12022:194;;;;:::o;12222:410::-;12262:7;12285:20;12303:1;12285:20;:::i;:::-;12280:25;;12319:20;12337:1;12319:20;:::i;:::-;12314:25;;12374:1;12371;12367:9;12396:30;12414:11;12396:30;:::i;:::-;12385:41;;12575:1;12566:7;12562:15;12559:1;12556:22;12536:1;12529:9;12509:83;12486:139;;12605:18;;:::i;:::-;12486:139;12270:362;12222:410;;;;:::o;12638:180::-;12686:77;12683:1;12676:88;12783:4;12780:1;12773:15;12807:4;12804:1;12797:15;12824:185;12864:1;12881:20;12899:1;12881:20;:::i;:::-;12876:25;;12915:20;12933:1;12915:20;:::i;:::-;12910:25;;12954:1;12944:35;;12959:18;;:::i;:::-;12944:35;13001:1;12998;12994:9;12989:14;;12824:185;;;;:::o;13015:191::-;13055:3;13074:20;13092:1;13074:20;:::i;:::-;13069:25;;13108:20;13126:1;13108:20;:::i;:::-;13103:25;;13151:1;13148;13144:9;13137:16;;13172:3;13169:1;13166:10;13163:36;;;13179:18;;:::i;:::-;13163:36;13015:191;;;;:::o;13212:233::-;13251:3;13274:24;13292:5;13274:24;:::i;:::-;13265:33;;13320:66;13313:5;13310:77;13307:103;;13390:18;;:::i;:::-;13307:103;13437:1;13430:5;13426:13;13419:20;;13212:233;;;:::o;13451:169::-;13535:11;13569:6;13564:3;13557:19;13609:4;13604:3;13600:14;13585:29;;13451:169;;;;:::o;13626:221::-;13766:34;13762:1;13754:6;13750:14;13743:58;13835:4;13830:2;13822:6;13818:15;13811:29;13626:221;:::o;13853:366::-;13995:3;14016:67;14080:2;14075:3;14016:67;:::i;:::-;14009:74;;14092:93;14181:3;14092:93;:::i;:::-;14210:2;14205:3;14201:12;14194:19;;13853:366;;;:::o;14225:419::-;14391:4;14429:2;14418:9;14414:18;14406:26;;14478:9;14472:4;14468:20;14464:1;14453:9;14449:17;14442:47;14506:131;14632:4;14506:131;:::i;:::-;14498:139;;14225:419;;;:::o;14650:166::-;14790:18;14786:1;14778:6;14774:14;14767:42;14650:166;:::o;14822:366::-;14964:3;14985:67;15049:2;15044:3;14985:67;:::i;:::-;14978:74;;15061:93;15150:3;15061:93;:::i;:::-;15179:2;15174:3;15170:12;15163:19;;14822:366;;;:::o;15194:419::-;15360:4;15398:2;15387:9;15383:18;15375:26;;15447:9;15441:4;15437:20;15433:1;15422:9;15418:17;15411:47;15475:131;15601:4;15475:131;:::i;:::-;15467:139;;15194:419;;;:::o;15619:178::-;15759:30;15755:1;15747:6;15743:14;15736:54;15619:178;:::o;15803:366::-;15945:3;15966:67;16030:2;16025:3;15966:67;:::i;:::-;15959:74;;16042:93;16131:3;16042:93;:::i;:::-;16160:2;16155:3;16151:12;16144:19;;15803:366;;;:::o;16175:419::-;16341:4;16379:2;16368:9;16364:18;16356:26;;16428:9;16422:4;16418:20;16414:1;16403:9;16399:17;16392:47;16456:131;16582:4;16456:131;:::i;:::-;16448:139;;16175:419;;;:::o;16600:178::-;16740:30;16736:1;16728:6;16724:14;16717:54;16600:178;:::o;16784:366::-;16926:3;16947:67;17011:2;17006:3;16947:67;:::i;:::-;16940:74;;17023:93;17112:3;17023:93;:::i;:::-;17141:2;17136:3;17132:12;17125:19;;16784:366;;;:::o;17156:419::-;17322:4;17360:2;17349:9;17345:18;17337:26;;17409:9;17403:4;17399:20;17395:1;17384:9;17380:17;17373:47;17437:131;17563:4;17437:131;:::i;:::-;17429:139;;17156:419;;;:::o;17581:143::-;17638:5;17669:6;17663:13;17654:22;;17685:33;17712:5;17685:33;:::i;:::-;17581:143;;;;:::o;17730:351::-;17800:6;17849:2;17837:9;17828:7;17824:23;17820:32;17817:119;;;17855:79;;:::i;:::-;17817:119;17975:1;18000:64;18056:7;18047:6;18036:9;18032:22;18000:64;:::i;:::-;17990:74;;17946:128;17730:351;;;;:::o;18087:163::-;18227:15;18223:1;18215:6;18211:14;18204:39;18087:163;:::o;18256:366::-;18398:3;18419:67;18483:2;18478:3;18419:67;:::i;:::-;18412:74;;18495:93;18584:3;18495:93;:::i;:::-;18613:2;18608:3;18604:12;18597:19;;18256:366;;;:::o;18628:419::-;18794:4;18832:2;18821:9;18817:18;18809:26;;18881:9;18875:4;18871:20;18867:1;18856:9;18852:17;18845:47;18909:131;19035:4;18909:131;:::i;:::-;18901:139;;18628:419;;;:::o;19053:143::-;19110:5;19141:6;19135:13;19126:22;;19157:33;19184:5;19157:33;:::i;:::-;19053:143;;;;:::o;19202:351::-;19272:6;19321:2;19309:9;19300:7;19296:23;19292:32;19289:119;;;19327:79;;:::i;:::-;19289:119;19447:1;19472:64;19528:7;19519:6;19508:9;19504:22;19472:64;:::i;:::-;19462:74;;19418:128;19202:351;;;;:::o;19559:442::-;19708:4;19746:2;19735:9;19731:18;19723:26;;19759:71;19827:1;19816:9;19812:17;19803:6;19759:71;:::i;:::-;19840:72;19908:2;19897:9;19893:18;19884:6;19840:72;:::i;:::-;19922;19990:2;19979:9;19975:18;19966:6;19922:72;:::i;:::-;19559:442;;;;;;:::o;20007:114::-;20074:6;20108:5;20102:12;20092:22;;20007:114;;;:::o;20127:184::-;20226:11;20260:6;20255:3;20248:19;20300:4;20295:3;20291:14;20276:29;;20127:184;;;;:::o;20317:132::-;20384:4;20407:3;20399:11;;20437:4;20432:3;20428:14;20420:22;;20317:132;;;:::o;20455:108::-;20532:24;20550:5;20532:24;:::i;:::-;20527:3;20520:37;20455:108;;:::o;20569:179::-;20638:10;20659:46;20701:3;20693:6;20659:46;:::i;:::-;20737:4;20732:3;20728:14;20714:28;;20569:179;;;;:::o;20754:113::-;20824:4;20856;20851:3;20847:14;20839:22;;20754:113;;;:::o;20903:732::-;21022:3;21051:54;21099:5;21051:54;:::i;:::-;21121:86;21200:6;21195:3;21121:86;:::i;:::-;21114:93;;21231:56;21281:5;21231:56;:::i;:::-;21310:7;21341:1;21326:284;21351:6;21348:1;21345:13;21326:284;;;21427:6;21421:13;21454:63;21513:3;21498:13;21454:63;:::i;:::-;21447:70;;21540:60;21593:6;21540:60;:::i;:::-;21530:70;;21386:224;21373:1;21370;21366:9;21361:14;;21326:284;;;21330:14;21626:3;21619:10;;21027:608;;;20903:732;;;;:::o;21641:634::-;21862:4;21900:2;21889:9;21885:18;21877:26;;21949:9;21943:4;21939:20;21935:1;21924:9;21920:17;21913:47;21977:108;22080:4;22071:6;21977:108;:::i;:::-;21969:116;;22132:9;22126:4;22122:20;22117:2;22106:9;22102:18;22095:48;22160:108;22263:4;22254:6;22160:108;:::i;:::-;22152:116;;21641:634;;;;;:::o;22281:182::-;22421:34;22417:1;22409:6;22405:14;22398:58;22281:182;:::o;22469:366::-;22611:3;22632:67;22696:2;22691:3;22632:67;:::i;:::-;22625:74;;22708:93;22797:3;22708:93;:::i;:::-;22826:2;22821:3;22817:12;22810:19;;22469:366;;;:::o;22841:419::-;23007:4;23045:2;23034:9;23030:18;23022:26;;23094:9;23088:4;23084:20;23080:1;23069:9;23065:17;23058:47;23122:131;23248:4;23122:131;:::i;:::-;23114:139;;22841:419;;;:::o;23266:179::-;23406:31;23402:1;23394:6;23390:14;23383:55;23266:179;:::o;23451:366::-;23593:3;23614:67;23678:2;23673:3;23614:67;:::i;:::-;23607:74;;23690:93;23779:3;23690:93;:::i;:::-;23808:2;23803:3;23799:12;23792:19;;23451:366;;;:::o;23823:419::-;23989:4;24027:2;24016:9;24012:18;24004:26;;24076:9;24070:4;24066:20;24062:1;24051:9;24047:17;24040:47;24104:131;24230:4;24104:131;:::i;:::-;24096:139;;23823:419;;;:::o;24248:332::-;24369:4;24407:2;24396:9;24392:18;24384:26;;24420:71;24488:1;24477:9;24473:17;24464:6;24420:71;:::i;:::-;24501:72;24569:2;24558:9;24554:18;24545:6;24501:72;:::i;:::-;24248:332;;;;;:::o;24586:116::-;24656:21;24671:5;24656:21;:::i;:::-;24649:5;24646:32;24636:60;;24692:1;24689;24682:12;24636:60;24586:116;:::o;24708:137::-;24762:5;24793:6;24787:13;24778:22;;24809:30;24833:5;24809:30;:::i;:::-;24708:137;;;;:::o;24851:345::-;24918:6;24967:2;24955:9;24946:7;24942:23;24938:32;24935:119;;;24973:79;;:::i;:::-;24935:119;25093:1;25118:61;25171:7;25162:6;25151:9;25147:22;25118:61;:::i;:::-;25108:71;;25064:125;24851:345;;;;:::o;25202:180::-;25342:32;25338:1;25330:6;25326:14;25319:56;25202:180;:::o;25388:366::-;25530:3;25551:67;25615:2;25610:3;25551:67;:::i;:::-;25544:74;;25627:93;25716:3;25627:93;:::i;:::-;25745:2;25740:3;25736:12;25729:19;;25388:366;;;:::o;25760:419::-;25926:4;25964:2;25953:9;25949:18;25941:26;;26013:9;26007:4;26003:20;25999:1;25988:9;25984:17;25977:47;26041:131;26167:4;26041:131;:::i;:::-;26033:139;;25760:419;;;:::o;26185:174::-;26325:26;26321:1;26313:6;26309:14;26302:50;26185:174;:::o;26365:366::-;26507:3;26528:67;26592:2;26587:3;26528:67;:::i;:::-;26521:74;;26604:93;26693:3;26604:93;:::i;:::-;26722:2;26717:3;26713:12;26706:19;;26365:366;;;:::o;26737:419::-;26903:4;26941:2;26930:9;26926:18;26918:26;;26990:9;26984:4;26980:20;26976:1;26965:9;26961:17;26954:47;27018:131;27144:4;27018:131;:::i;:::-;27010:139;;26737:419;;;:::o;27162:181::-;27302:33;27298:1;27290:6;27286:14;27279:57;27162:181;:::o;27349:366::-;27491:3;27512:67;27576:2;27571:3;27512:67;:::i;:::-;27505:74;;27588:93;27677:3;27588:93;:::i;:::-;27706:2;27701:3;27697:12;27690:19;;27349:366;;;:::o;27721:419::-;27887:4;27925:2;27914:9;27910:18;27902:26;;27974:9;27968:4;27964:20;27960:1;27949:9;27945:17;27938:47;28002:131;28128:4;28002:131;:::i;:::-;27994:139;;27721:419;;;:::o;28146:171::-;28286:23;28282:1;28274:6;28270:14;28263:47;28146:171;:::o;28323:366::-;28465:3;28486:67;28550:2;28545:3;28486:67;:::i;:::-;28479:74;;28562:93;28651:3;28562:93;:::i;:::-;28680:2;28675:3;28671:12;28664:19;;28323:366;;;:::o;28695:419::-;28861:4;28899:2;28888:9;28884:18;28876:26;;28948:9;28942:4;28938:20;28934:1;28923:9;28919:17;28912:47;28976:131;29102:4;28976:131;:::i;:::-;28968:139;;28695:419;;;:::o;29120:332::-;29241:4;29279:2;29268:9;29264:18;29256:26;;29292:71;29360:1;29349:9;29345:17;29336:6;29292:71;:::i;:::-;29373:72;29441:2;29430:9;29426:18;29417:6;29373:72;:::i;:::-;29120:332;;;;;:::o;29458:169::-;29598:21;29594:1;29586:6;29582:14;29575:45;29458:169;:::o;29633:366::-;29775:3;29796:67;29860:2;29855:3;29796:67;:::i;:::-;29789:74;;29872:93;29961:3;29872:93;:::i;:::-;29990:2;29985:3;29981:12;29974:19;;29633:366;;;:::o;30005:419::-;30171:4;30209:2;30198:9;30194:18;30186:26;;30258:9;30252:4;30248:20;30244:1;30233:9;30229:17;30222:47;30286:131;30412:4;30286:131;:::i;:::-;30278:139;;30005:419;;;:::o;30430:225::-;30570:34;30566:1;30558:6;30554:14;30547:58;30639:8;30634:2;30626:6;30622:15;30615:33;30430:225;:::o;30661:366::-;30803:3;30824:67;30888:2;30883:3;30824:67;:::i;:::-;30817:74;;30900:93;30989:3;30900:93;:::i;:::-;31018:2;31013:3;31009:12;31002:19;;30661:366;;;:::o;31033:419::-;31199:4;31237:2;31226:9;31222:18;31214:26;;31286:9;31280:4;31276:20;31272:1;31261:9;31257:17;31250:47;31314:131;31440:4;31314:131;:::i;:::-;31306:139;;31033:419;;;:::o;31458:181::-;31598:33;31594:1;31586:6;31582:14;31575:57;31458:181;:::o;31645:366::-;31787:3;31808:67;31872:2;31867:3;31808:67;:::i;:::-;31801:74;;31884:93;31973:3;31884:93;:::i;:::-;32002:2;31997:3;31993:12;31986:19;;31645:366;;;:::o;32017:419::-;32183:4;32221:2;32210:9;32206:18;32198:26;;32270:9;32264:4;32260:20;32256:1;32245:9;32241:17;32234:47;32298:131;32424:4;32298:131;:::i;:::-;32290:139;;32017:419;;;:::o;32442:165::-;32582:17;32578:1;32570:6;32566:14;32559:41;32442:165;:::o;32613:366::-;32755:3;32776:67;32840:2;32835:3;32776:67;:::i;:::-;32769:74;;32852:93;32941:3;32852:93;:::i;:::-;32970:2;32965:3;32961:12;32954:19;;32613:366;;;:::o;32985:419::-;33151:4;33189:2;33178:9;33174:18;33166:26;;33238:9;33232:4;33228:20;33224:1;33213:9;33209:17;33202:47;33266:131;33392:4;33266:131;:::i;:::-;33258:139;;32985:419;;;:::o;33410:224::-;33550:34;33546:1;33538:6;33534:14;33527:58;33619:7;33614:2;33606:6;33602:15;33595:32;33410:224;:::o;33640:366::-;33782:3;33803:67;33867:2;33862:3;33803:67;:::i;:::-;33796:74;;33879:93;33968:3;33879:93;:::i;:::-;33997:2;33992:3;33988:12;33981:19;;33640:366;;;:::o;34012:419::-;34178:4;34216:2;34205:9;34201:18;34193:26;;34265:9;34259:4;34255:20;34251:1;34240:9;34236:17;34229:47;34293:131;34419:4;34293:131;:::i;:::-;34285:139;;34012:419;;;:::o;34437:180::-;34577:32;34573:1;34565:6;34561:14;34554:56;34437:180;:::o;34623:366::-;34765:3;34786:67;34850:2;34845:3;34786:67;:::i;:::-;34779:74;;34862:93;34951:3;34862:93;:::i;:::-;34980:2;34975:3;34971:12;34964:19;;34623:366;;;:::o;34995:419::-;35161:4;35199:2;35188:9;35184:18;35176:26;;35248:9;35242:4;35238:20;35234:1;35223:9;35219:17;35212:47;35276:131;35402:4;35276:131;:::i;:::-;35268:139;;34995:419;;;:::o;35420:178::-;35560:30;35556:1;35548:6;35544:14;35537:54;35420:178;:::o;35604:366::-;35746:3;35767:67;35831:2;35826:3;35767:67;:::i;:::-;35760:74;;35843:93;35932:3;35843:93;:::i;:::-;35961:2;35956:3;35952:12;35945:19;;35604:366;;;:::o;35976:419::-;36142:4;36180:2;36169:9;36165:18;36157:26;;36229:9;36223:4;36219:20;36215:1;36204:9;36200:17;36193:47;36257:131;36383:4;36257:131;:::i;:::-;36249:139;;35976:419;;;:::o;36401:178::-;36541:30;36537:1;36529:6;36525:14;36518:54;36401:178;:::o;36585:366::-;36727:3;36748:67;36812:2;36807:3;36748:67;:::i;:::-;36741:74;;36824:93;36913:3;36824:93;:::i;:::-;36942:2;36937:3;36933:12;36926:19;;36585:366;;;:::o;36957:419::-;37123:4;37161:2;37150:9;37146:18;37138:26;;37210:9;37204:4;37200:20;37196:1;37185:9;37181:17;37174:47;37238:131;37364:4;37238:131;:::i;:::-;37230:139;;36957:419;;;:::o;37382:225::-;37522:34;37518:1;37510:6;37506:14;37499:58;37591:8;37586:2;37578:6;37574:15;37567:33;37382:225;:::o;37613:366::-;37755:3;37776:67;37840:2;37835:3;37776:67;:::i;:::-;37769:74;;37852:93;37941:3;37852:93;:::i;:::-;37970:2;37965:3;37961:12;37954:19;;37613:366;;;:::o;37985:419::-;38151:4;38189:2;38178:9;38174:18;38166:26;;38238:9;38232:4;38228:20;38224:1;38213:9;38209:17;38202:47;38266:131;38392:4;38266:131;:::i;:::-;38258:139;;37985:419;;;:::o;38410:182::-;38550:34;38546:1;38538:6;38534:14;38527:58;38410:182;:::o;38598:366::-;38740:3;38761:67;38825:2;38820:3;38761:67;:::i;:::-;38754:74;;38837:93;38926:3;38837:93;:::i;:::-;38955:2;38950:3;38946:12;38939:19;;38598:366;;;:::o;38970:419::-;39136:4;39174:2;39163:9;39159:18;39151:26;;39223:9;39217:4;39213:20;39209:1;39198:9;39194:17;39187:47;39251:131;39377:4;39251:131;:::i;:::-;39243:139;;38970:419;;;:::o;39395:181::-;39535:33;39531:1;39523:6;39519:14;39512:57;39395:181;:::o;39582:366::-;39724:3;39745:67;39809:2;39804:3;39745:67;:::i;:::-;39738:74;;39821:93;39910:3;39821:93;:::i;:::-;39939:2;39934:3;39930:12;39923:19;;39582:366;;;:::o;39954:419::-;40120:4;40158:2;40147:9;40143:18;40135:26;;40207:9;40201:4;40197:20;40193:1;40182:9;40178:17;40171:47;40235:131;40361:4;40235:131;:::i;:::-;40227:139;;39954:419;;;:::o;40379:166::-;40519:18;40515:1;40507:6;40503:14;40496:42;40379:166;:::o;40551:366::-;40693:3;40714:67;40778:2;40773:3;40714:67;:::i;:::-;40707:74;;40790:93;40879:3;40790:93;:::i;:::-;40908:2;40903:3;40899:12;40892:19;;40551:366;;;:::o;40923:419::-;41089:4;41127:2;41116:9;41112:18;41104:26;;41176:9;41170:4;41166:20;41162:1;41151:9;41147:17;41140:47;41204:131;41330:4;41204:131;:::i;:::-;41196:139;;40923:419;;;:::o;41348:180::-;41396:77;41393:1;41386:88;41493:4;41490:1;41483:15;41517:4;41514:1;41507:15
Swarm Source
ipfs://c23c3e4a30cc4157e727e14cef25b82e2bbe9a3f44cd4bed56a3ec2270d7365c
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 31 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.