More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 561 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Unstake NFT | 19551439 | 280 days ago | IN | 0 ETH | 0.0022912 | ||||
Unstake | 18606446 | 413 days ago | IN | 0 ETH | 0.00515775 | ||||
Unstake | 18497031 | 428 days ago | IN | 0 ETH | 0.00633689 | ||||
Unstake | 18483670 | 430 days ago | IN | 0 ETH | 0.01220909 | ||||
Unstake | 18471446 | 432 days ago | IN | 0 ETH | 0.00580683 | ||||
Unstake | 18451104 | 434 days ago | IN | 0 ETH | 0.0028097 | ||||
Unstake NFT | 18446479 | 435 days ago | IN | 0 ETH | 0.0044087 | ||||
Unstake | 18445349 | 435 days ago | IN | 0 ETH | 0.00031494 | ||||
Unstake | 18445349 | 435 days ago | IN | 0 ETH | 0.00024686 | ||||
Unstake | 18445349 | 435 days ago | IN | 0 ETH | 0.00169543 | ||||
Unstake | 18439317 | 436 days ago | IN | 0 ETH | 0.00245692 | ||||
Unstake | 18423961 | 438 days ago | IN | 0 ETH | 0.00546896 | ||||
Unstake | 18420077 | 439 days ago | IN | 0 ETH | 0.00417696 | ||||
Unstake NFT | 18399001 | 442 days ago | IN | 0 ETH | 0.00129577 | ||||
Unstake NFT | 18398823 | 442 days ago | IN | 0 ETH | 0.0042967 | ||||
Unstake | 18398811 | 442 days ago | IN | 0 ETH | 0.00122379 | ||||
Unstake NFT | 18396090 | 442 days ago | IN | 0 ETH | 0.0011627 | ||||
Unstake | 18396063 | 442 days ago | IN | 0 ETH | 0.00610359 | ||||
Unstake | 18388882 | 443 days ago | IN | 0 ETH | 0.00483046 | ||||
Unstake | 18387017 | 443 days ago | IN | 0 ETH | 0.00244718 | ||||
Unstake | 18378756 | 445 days ago | IN | 0 ETH | 0.00940606 | ||||
Unstake NFT | 18375818 | 445 days ago | IN | 0 ETH | 0.00100646 | ||||
Claim Reward For... | 18375793 | 445 days ago | IN | 0 ETH | 0.00020432 | ||||
Unstake | 18375788 | 445 days ago | IN | 0 ETH | 0.00535955 | ||||
Claim Reward For... | 18375783 | 445 days ago | IN | 0 ETH | 0.00166036 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
KittPad
Compiler Version
v0.8.4+commit.c7e474f2
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-05-07 */ // File: @uniswap/v2-periphery/contracts/interfaces/IUniswapV2Router01.sol pragma solidity >=0.6.2; interface IUniswapV2Router01 { function factory() external pure returns (address); function WETH() external pure returns (address); function addLiquidity( address tokenA, address tokenB, uint amountADesired, uint amountBDesired, uint amountAMin, uint amountBMin, address to, uint deadline ) external returns (uint amountA, uint amountB, uint liquidity); function addLiquidityETH( address token, uint amountTokenDesired, uint amountTokenMin, uint amountETHMin, address to, uint deadline ) external payable returns (uint amountToken, uint amountETH, uint liquidity); function removeLiquidity( address tokenA, address tokenB, uint liquidity, uint amountAMin, uint amountBMin, address to, uint deadline ) external returns (uint amountA, uint amountB); function removeLiquidityETH( address token, uint liquidity, uint amountTokenMin, uint amountETHMin, address to, uint deadline ) external returns (uint amountToken, uint amountETH); function removeLiquidityWithPermit( address tokenA, address tokenB, uint liquidity, uint amountAMin, uint amountBMin, address to, uint deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) external returns (uint amountA, uint amountB); function removeLiquidityETHWithPermit( address token, uint liquidity, uint amountTokenMin, uint amountETHMin, address to, uint deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) external returns (uint amountToken, uint amountETH); function swapExactTokensForTokens( uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline ) external returns (uint[] memory amounts); function swapTokensForExactTokens( uint amountOut, uint amountInMax, address[] calldata path, address to, uint deadline ) external returns (uint[] memory amounts); function swapExactETHForTokens(uint amountOutMin, address[] calldata path, address to, uint deadline) external payable returns (uint[] memory amounts); function swapTokensForExactETH(uint amountOut, uint amountInMax, address[] calldata path, address to, uint deadline) external returns (uint[] memory amounts); function swapExactTokensForETH(uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline) external returns (uint[] memory amounts); function swapETHForExactTokens(uint amountOut, address[] calldata path, address to, uint deadline) external payable returns (uint[] memory amounts); function quote(uint amountA, uint reserveA, uint reserveB) external pure returns (uint amountB); function getAmountOut(uint amountIn, uint reserveIn, uint reserveOut) external pure returns (uint amountOut); function getAmountIn(uint amountOut, uint reserveIn, uint reserveOut) external pure returns (uint amountIn); function getAmountsOut(uint amountIn, address[] calldata path) external view returns (uint[] memory amounts); function getAmountsIn(uint amountOut, address[] calldata path) external view returns (uint[] memory amounts); } // File: @uniswap/v2-periphery/contracts/interfaces/IUniswapV2Router02.sol pragma solidity >=0.6.2; interface IUniswapV2Router02 is IUniswapV2Router01 { function removeLiquidityETHSupportingFeeOnTransferTokens( address token, uint liquidity, uint amountTokenMin, uint amountETHMin, address to, uint deadline ) external returns (uint amountETH); function removeLiquidityETHWithPermitSupportingFeeOnTransferTokens( address token, uint liquidity, uint amountTokenMin, uint amountETHMin, address to, uint deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) external returns (uint amountETH); function swapExactTokensForTokensSupportingFeeOnTransferTokens( uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline ) external; function swapExactETHForTokensSupportingFeeOnTransferTokens( uint amountOutMin, address[] calldata path, address to, uint deadline ) external payable; function swapExactTokensForETHSupportingFeeOnTransferTokens( uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline ) external; } // File: @openzeppelin/contracts/utils/math/SafeMath.sol // OpenZeppelin Contracts (last updated v4.6.0) (utils/math/SafeMath.sol) pragma solidity ^0.8.0; // CAUTION // This version of SafeMath should only be used with Solidity 0.8 or later, // because it relies on the compiler's built in overflow checks. /** * @dev Wrappers over Solidity's arithmetic operations. * * NOTE: `SafeMath` is generally not needed starting with Solidity 0.8, since the compiler * now has built in overflow checking. */ library SafeMath { /** * @dev Returns the addition of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { uint256 c = a + b; if (c < a) return (false, 0); return (true, c); } } /** * @dev Returns the subtraction of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b > a) return (false, 0); return (true, a - b); } } /** * @dev Returns the multiplication of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) return (true, 0); uint256 c = a * b; if (c / a != b) return (false, 0); return (true, c); } } /** * @dev Returns the division of two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a / b); } } /** * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a % b); } } /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { return a + b; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { return a - b; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { return a * b; } /** * @dev Returns the integer division of two unsigned integers, reverting on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { return a / b; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { return a % b; } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {trySub}. * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b <= a, errorMessage); return a - b; } } /** * @dev Returns the integer division of two unsigned integers, reverting with custom message on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b > 0, errorMessage); return a / b; } } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting with custom message when dividing by zero. * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {tryMod}. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b > 0, errorMessage); return a % b; } } } // File: @openzeppelin/contracts/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/contracts/token/ERC721/IERC721.sol // OpenZeppelin Contracts (last updated v4.6.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 be 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: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * 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/contracts/interfaces/IERC721.sol // OpenZeppelin Contracts v4.4.1 (interfaces/IERC721.sol) pragma solidity ^0.8.0; // File: @openzeppelin/contracts/token/ERC20/IERC20.sol // OpenZeppelin Contracts (last updated v4.6.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: @openzeppelin/contracts/interfaces/IERC20.sol // OpenZeppelin Contracts v4.4.1 (interfaces/IERC20.sol) pragma solidity ^0.8.0; // File: @openzeppelin/contracts/utils/Context.sol // OpenZeppelin Contracts v4.4.1 (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; } } // File: @openzeppelin/contracts/access/Ownable.sol // OpenZeppelin Contracts v4.4.1 (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 Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing 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: KittPad.sol pragma solidity ^0.8.4; interface IKittPad { function depositRewardsEth() external payable; function getShares(address wallet) external view returns (uint256); function getBoostNfts(address wallet) external view returns (uint256[] memory); } contract KittPad is IKittPad, Ownable { using SafeMath for uint256; struct Reward { mapping(address => uint256) totalExcluded; // excluded reward mapping(address => uint256) totalRealised; uint256 totalRealisedForNft; uint256 totalExcludedForNft; uint256 lastClaim; // used for boosting logic } struct Share { uint256 amount; uint256 amountBase; uint256 stakedTime; uint256 nftStakedTime; uint256[] nftBoostTokenIds; } uint256 public minSecondsBeforeUnstake = 43200; uint256 public minSecondsBeforeUnstakeNFT = 2592000; // 30 days address public shareholderToken; address public nftBoosterToken; uint256 public nftBoostPercentage = 2; // 2% boost per NFT staked uint256 public maxNftsCanBoost = 10; uint256 public totalStakedUsers; uint256 public totalSharesBoosted; uint256 public totalNftStaked; uint256 public totalSharesDeposited; // will only be actual deposited tokens without handling any reflections or otherwise IUniswapV2Router02 router; // amount of shares a user has mapping(address => Share) shares; // reward information per user mapping(address => Reward) public rewards; // staker list address[] public stakers; uint256 public totalRewardsEth; mapping(address => uint256) totalRewardsToken; mapping(address => uint256) rewardsPerShareToken; address[] public prTokenList; uint256 public totalDistributed; uint256 public rewardsEthPerNft; uint256 public constant ACC_FACTOR = 10**36; constructor( address _shareholderToken, address _nftToken ) { shareholderToken = _shareholderToken; nftBoosterToken = _nftToken; } function getPrTokenList() external view returns(address[] memory){ return prTokenList; } function stake(uint256 amount) external { _stake(msg.sender, amount); } function stakeNFT(uint256[] memory nftTokenIds) external { address shareholder = msg.sender; require(nftTokenIds.length > 0, "You should stake NFTs more than one."); if (shares[shareholder].nftBoostTokenIds.length > 0) distributeRewardForNft(shareholder); IERC721 nftContract = IERC721(nftBoosterToken); for (uint256 i = 0; i < nftTokenIds.length; i++) { nftContract.transferFrom(shareholder, address(this), nftTokenIds[i]); shares[shareholder].nftBoostTokenIds.push(nftTokenIds[i]); } shares[shareholder].nftStakedTime = block.timestamp; totalNftStaked = totalNftStaked.add(nftTokenIds.length); rewards[shareholder].totalExcludedForNft = getCumulativeRewardsEth( shares[shareholder].nftBoostTokenIds.length ); } function unstakeNFT(uint256[] memory nftTokenIds) external { address shareholder = msg.sender; require( shares[shareholder].nftBoostTokenIds.length > 0 && (nftTokenIds.length == 0 || nftTokenIds.length <= shares[shareholder].nftBoostTokenIds.length), "you can only unstake if you have some staked" ); require( block.timestamp > shares[shareholder].nftStakedTime + minSecondsBeforeUnstakeNFT, "must be staked for minimum time and at least one block if no min" ); if (shares[shareholder].nftBoostTokenIds.length > 0) distributeRewardForNft(shareholder); IERC721 nftContract = IERC721(nftBoosterToken); if (nftTokenIds.length == 0) { uint i; for (i = 0; i < shares[shareholder].nftBoostTokenIds.length; i++) { nftContract.transferFrom(address(this), shareholder, shares[shareholder].nftBoostTokenIds[i]); } delete shares[shareholder].nftBoostTokenIds; } else { for (uint256 i = 0; i < nftTokenIds.length; i++) { uint256 j; for (j = 0; j < shares[shareholder].nftBoostTokenIds.length; j++) { if (nftTokenIds[i] == shares[shareholder].nftBoostTokenIds[j]) { break; } } require(j < shares[shareholder].nftBoostTokenIds.length, "Wrong id."); if (j == shares[shareholder].nftBoostTokenIds.length - 1) shares[shareholder].nftBoostTokenIds.pop(); else { shares[shareholder].nftBoostTokenIds[j] = shares[shareholder] .nftBoostTokenIds[shares[shareholder].nftBoostTokenIds.length - 1]; shares[shareholder].nftBoostTokenIds.pop(); } nftContract.transferFrom(address(this), shareholder, nftTokenIds[i]); } } rewards[shareholder].totalExcludedForNft = getCumulativeRewardsEth( shares[shareholder].nftBoostTokenIds.length ); totalNftStaked = totalNftStaked.sub(nftTokenIds.length); } function _stake(address shareholder, uint256 amount) private { if (shares[shareholder].amount > 0) { for (uint256 i = 0; i < prTokenList.length; i++) { address rwdToken = prTokenList[i]; distributeReward(shareholder, rwdToken); } } IERC20 shareContract = IERC20(shareholderToken); uint256 stakeAmount = amount == 0 ? shareContract.balanceOf(shareholder) : amount; uint256 sharesBefore = shares[shareholder].amount; // for compounding we will pass in this contract override flag and assume the tokens // received by the contract during the compounding process are already here, therefore // whatever the amount is passed in is what we care about and leave it at that. If a normal // staking though by a user, transfer tokens from the user to the contract. uint256 finalBaseAdded = stakeAmount; uint256 shareBalanceBefore = shareContract.balanceOf(address(this)); shareContract.transferFrom(shareholder, address(this), stakeAmount); finalBaseAdded = shareContract.balanceOf(address(this)).sub( shareBalanceBefore ); uint256 finalBoostedAmount = shares[shareholder].amountBase.add(finalBaseAdded); totalSharesDeposited = totalSharesDeposited.add(finalBaseAdded); totalSharesBoosted = totalSharesBoosted.sub(shares[shareholder].amount).add( finalBoostedAmount ); shares[shareholder].amountBase += finalBaseAdded; shares[shareholder].amount = finalBoostedAmount; shares[shareholder].stakedTime = block.timestamp; if (sharesBefore == 0 && shares[shareholder].amount > 0) { totalStakedUsers++; } for (uint256 i = 0; i < prTokenList.length; i++) { address rwdToken = prTokenList[i]; rewards[shareholder].totalExcluded[rwdToken] = getCumulativeRewardsToken( shares[shareholder].amount, rwdToken ); } stakers.push(shareholder); } function _unstake( address account, uint256 boostedAmount ) private { require( shares[account].amount > 0 && (boostedAmount == 0 || boostedAmount <= shares[account].amount), "you can only unstake if you have some staked" ); require( block.timestamp > shares[account].stakedTime + minSecondsBeforeUnstake, "must be staked for minimum time and at least one block if no min" ); for (uint256 i = 0; i < prTokenList.length; i++) { address rewardsToken = prTokenList[i]; distributeReward(account, rewardsToken); } IERC20 shareContract = IERC20(shareholderToken); uint256 boostedAmountToUnstake = boostedAmount == 0 ? shares[account].amount : boostedAmount; uint256 baseAmount = boostedAmountToUnstake; if (boostedAmount == 0) { totalStakedUsers--; } shareContract.transfer(account, baseAmount); totalSharesDeposited = totalSharesDeposited.sub(baseAmount); totalSharesBoosted = totalSharesBoosted.sub(boostedAmountToUnstake); shares[account].amountBase -= baseAmount; shares[account].amount -= boostedAmountToUnstake; for (uint256 i = 0; i < prTokenList.length; i++) { address tkAddr = prTokenList[i]; rewards[account].totalExcluded[tkAddr] = getCumulativeRewardsToken( shares[account].amount, tkAddr ); } } function unstake(uint256 boostedAmount) external { _unstake(msg.sender, boostedAmount); } function depositRewardsEth() external payable override { require(msg.value > 0, "value must be greater than 0"); require( totalNftStaked > 0, "must be shares deposited to be rewarded rewards" ); uint256 amount = msg.value; totalRewardsEth = totalRewardsEth.add(amount); rewardsEthPerNft = rewardsEthPerNft.add( ACC_FACTOR.mul(amount).div(totalNftStaked) ); } function depositRewardsToken(address tokenAddr, uint256 amount) external { require(amount > 0, "value must be greater than 0"); require( totalSharesBoosted > 0, "must be shares deposited to be rewarded rewards" ); // transfer token from sender to this contract IERC20 rewardsToken = IERC20(tokenAddr); rewardsToken.transferFrom(msg.sender, address(this), amount); // register project token to the list if (totalRewardsToken[tokenAddr] == 0) prTokenList.push(tokenAddr); // accumulate reward token amount totalRewardsToken[tokenAddr] = totalRewardsToken[tokenAddr].add(amount); // calculate rewarding factor rewardsPerShareToken[tokenAddr] = rewardsPerShareToken[tokenAddr].add( ACC_FACTOR.mul(amount).div(totalSharesBoosted) ); } function distributeRewardForNft(address shareholder) internal { uint256 earnedRewards = getUnpaidEth(shareholder); if (earnedRewards == 0) return; rewards[shareholder].totalRealisedForNft = rewards[shareholder].totalRealisedForNft.add(earnedRewards); rewards[shareholder].totalExcludedForNft = getCumulativeRewardsEth(shares[shareholder].nftBoostTokenIds.length); uint256 balanceBefore = address(this).balance; (bool sent, ) = payable(shareholder).call{ value: earnedRewards }(""); require(sent, "ETH was not successfully sent"); require( address(this).balance >= balanceBefore - earnedRewards, "only take proper amount from contract" ); } function distributeReward( address shareholder, address rewardsToken ) internal { // require( // block.timestamp > rewards[shareholder].lastClaim, // 'can only claim once per block' // ); if (shares[shareholder].amount == 0) { return; } uint256 amount = getUnpaidToken(shareholder, rewardsToken); if (amount == 0) return; rewards[shareholder].totalRealised[rewardsToken] = rewards[shareholder] .totalRealised[rewardsToken] .add(amount); rewards[shareholder].totalExcluded[rewardsToken] = getCumulativeRewardsToken(shares[shareholder].amount, rewardsToken); rewards[shareholder].lastClaim = block.timestamp; if (amount > 0) { totalDistributed = totalDistributed.add(amount); IERC20 rwdt = IERC20(rewardsToken); rwdt.transfer(shareholder, amount); } } function totalClaimed(address rewardsToken) external view returns(uint256) { return rewards[msg.sender].totalRealised[rewardsToken]; } function totalClaimedEth() external view returns(uint256) { return rewards[msg.sender].totalRealisedForNft; } function claimRewardForKD(address rewardsToken) external { distributeReward(msg.sender, rewardsToken); } function claimRewardForNft() external { distributeRewardForNft(msg.sender); } function getUnpaidEth(address shareholder) public view returns (uint256) { if (shares[shareholder].nftBoostTokenIds.length == 0) return 0; uint256 earnedRewards = getCumulativeRewardsEth( shares[shareholder].nftBoostTokenIds.length ); uint256 rewardsExcluded = rewards[shareholder].totalExcludedForNft; if (earnedRewards <= rewardsExcluded) { return 0; } return earnedRewards.sub(rewardsExcluded); } function getUnpaidToken(address shareholder, address tokenAddr) public view returns (uint256) { if (shares[shareholder].amount == 0) { return 0; } uint256 earnedRewards = getCumulativeRewardsToken( shares[shareholder].amount, tokenAddr ); uint256 rewardsExcluded = rewards[shareholder].totalExcluded[tokenAddr]; if (earnedRewards <= rewardsExcluded) { return 0; } return earnedRewards.sub(rewardsExcluded); } function getCumulativeRewardsToken(uint256 share, address tokenAddr) internal view returns (uint256) { return share.mul(rewardsPerShareToken[tokenAddr]).div(ACC_FACTOR); } function getCumulativeRewardsEth(uint256 share) internal view returns (uint256) { return share.mul(rewardsEthPerNft).div(ACC_FACTOR); } function getBaseShares(address user) external view returns (uint256) { return shares[user].amountBase; } function getShares(address user) external view override returns (uint256) { return shares[user].amount; } function getBoostNfts(address user) public view override returns (uint256[] memory) { return shares[user].nftBoostTokenIds; } function setShareholderToken(address _token) external onlyOwner { shareholderToken = _token; } function setMinSecondsBeforeUnstake(uint256 _seconds) external onlyOwner { minSecondsBeforeUnstake = _seconds; } function setMinSecondsBeforeUnstakeNft(uint256 _seconds) external onlyOwner { minSecondsBeforeUnstakeNFT = _seconds; } function setNftBoosterToken(address _nft) external onlyOwner { nftBoosterToken = _nft; } function setNftBoostPercentage(uint256 _percentage) external onlyOwner { nftBoostPercentage = _percentage; } function setMaxNftsToBoost(uint256 _amount) external onlyOwner { maxNftsCanBoost = _amount; } function unstakeAll() public onlyOwner { if (stakers.length == 0) return; for (uint256 i = 0; i < stakers.length; i++) { if (shares[stakers[i]].amount <= 0) continue; _unstake(stakers[i], 0); } delete stakers; } function withdrawAll() external onlyOwner { unstakeAll(); IERC20 shareContract = IERC20(shareholderToken); uint256 amount = shareContract.balanceOf(address(this)); shareContract.transfer(owner(), amount); amount = address(this).balance; payable(owner()).call{ value: amount, gas: 30000 }(""); } receive() external payable {} }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"_shareholderToken","type":"address"},{"internalType":"address","name":"_nftToken","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"inputs":[],"name":"ACC_FACTOR","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"rewardsToken","type":"address"}],"name":"claimRewardForKD","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"claimRewardForNft","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"depositRewardsEth","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenAddr","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"depositRewardsToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"getBaseShares","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"getBoostNfts","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getPrTokenList","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"getShares","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"shareholder","type":"address"}],"name":"getUnpaidEth","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"shareholder","type":"address"},{"internalType":"address","name":"tokenAddr","type":"address"}],"name":"getUnpaidToken","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxNftsCanBoost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minSecondsBeforeUnstake","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minSecondsBeforeUnstakeNFT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nftBoostPercentage","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nftBoosterToken","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"prTokenList","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"rewards","outputs":[{"internalType":"uint256","name":"totalRealisedForNft","type":"uint256"},{"internalType":"uint256","name":"totalExcludedForNft","type":"uint256"},{"internalType":"uint256","name":"lastClaim","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rewardsEthPerNft","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"setMaxNftsToBoost","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_seconds","type":"uint256"}],"name":"setMinSecondsBeforeUnstake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_seconds","type":"uint256"}],"name":"setMinSecondsBeforeUnstakeNft","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_percentage","type":"uint256"}],"name":"setNftBoostPercentage","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_nft","type":"address"}],"name":"setNftBoosterToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"}],"name":"setShareholderToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"shareholderToken","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"stake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"nftTokenIds","type":"uint256[]"}],"name":"stakeNFT","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"stakers","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"rewardsToken","type":"address"}],"name":"totalClaimed","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalClaimedEth","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalDistributed","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalNftStaked","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalRewardsEth","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSharesBoosted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSharesDeposited","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalStakedUsers","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":"boostedAmount","type":"uint256"}],"name":"unstake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unstakeAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"nftTokenIds","type":"uint256[]"}],"name":"unstakeNFT","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
608060405261a8c060015562278d006002556002600555600a6006553480156200002857600080fd5b506040516200507e3803806200507e83398181016040528101906200004e9190620001db565b6200006e62000062620000f860201b60201c565b6200010060201b60201c565b81600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050506200026a565b600033905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600081519050620001d58162000250565b92915050565b60008060408385031215620001ef57600080fd5b6000620001ff85828601620001c4565b92505060206200021285828601620001c4565b9150509250929050565b6000620002298262000230565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6200025b816200021c565b81146200026757600080fd5b50565b614e04806200027a6000396000f3fe60806040526004361061026b5760003560e01c806388b0e46f11610144578063dd6bff1a116100b6578063efca2eed1161007a578063efca2eed146108d2578063f04da65b146108fd578063f2e0c9151461093a578063f2fde38b14610963578063faaec8491461098c578063fd5e6dd1146109b757610272565b8063dd6bff1a146107e9578063df83bf6e14610814578063e13326991461083f578063e5f735d61461086a578063ef5d9ae81461089557610272565b8063a694fc3a11610108578063a694fc3a146106c5578063af17e3b7146106ee578063b5030d9d14610719578063b99567a414610744578063beb68d0514610781578063d14d1e95146107ac57610272565b806388b0e46f146105e05780638da5cb5b1461061d57806392359c19146106485780639e75fd77146106715780639f8c9b2e1461069a57610272565b80633cbabf3f116101dd5780636ab7ffda116101a15780636ab7ffda1461051e5780636d8aa88d14610547578063715018a61461055e57806380bb4055146105755780638453734d146105a0578063853828b6146105c957610272565b80633cbabf3f1461046a5780634da881a8146104955780635f6ffe35146104c0578063654b792f146104ca57806367ab3c49146104f557610272565b8063294c494d1161022f578063294c494d146103845780632e17de78146103ad57806334f20084146103d657806335322f37146103ff578063389d6cbe146104165780633c6e67891461043f57610272565b80630700037d14610277578063134e82e9146102b657806315a3d12c146102e1578063182c57441461031e578063253ccae41461034757610272565b3661027257005b600080fd5b34801561028357600080fd5b5061029e6004803603810190610299919061411e565b6109f4565b6040516102ad93929190614753565b60405180910390f35b3480156102c257600080fd5b506102cb610a1e565b6040516102d89190614738565b60405180910390f35b3480156102ed57600080fd5b5061030860048036038101906103039190614229565b610a24565b6040516103159190614539565b60405180910390f35b34801561032a57600080fd5b50610345600480360381019061034091906141bf565b610a63565b005b34801561035357600080fd5b5061036e60048036038101906103699190614147565b610d9f565b60405161037b9190614738565b60405180910390f35b34801561039057600080fd5b506103ab60048036038101906103a69190614229565b610ef8565b005b3480156103b957600080fd5b506103d460048036038101906103cf9190614229565b610f7e565b005b3480156103e257600080fd5b506103fd60048036038101906103f89190614229565b610f8b565b005b34801561040b57600080fd5b50610414611011565b005b34801561042257600080fd5b5061043d60048036038101906104389190614229565b6111f8565b005b34801561044b57600080fd5b5061045461127e565b6040516104619190614738565b60405180910390f35b34801561047657600080fd5b5061047f611284565b60405161048c9190614738565b60405180910390f35b3480156104a157600080fd5b506104aa61128a565b6040516104b79190614738565b60405180910390f35b6104c8611290565b005b3480156104d657600080fd5b506104df61138b565b6040516104ec9190614738565b60405180910390f35b34801561050157600080fd5b5061051c6004803603810190610517919061411e565b611391565b005b34801561052a57600080fd5b506105456004803603810190610540919061411e565b61139e565b005b34801561055357600080fd5b5061055c61145e565b005b34801561056a57600080fd5b50610573611469565b005b34801561058157600080fd5b5061058a6114f1565b6040516105979190614738565b60405180910390f35b3480156105ac57600080fd5b506105c760048036038101906105c291906141bf565b6114f7565b005b3480156105d557600080fd5b506105de611ec0565b005b3480156105ec57600080fd5b506106076004803603810190610602919061411e565b612109565b6040516106149190614738565b60405180910390f35b34801561062957600080fd5b50610632612155565b60405161063f9190614539565b60405180910390f35b34801561065457600080fd5b5061066f600480360381019061066a9190614183565b61217e565b005b34801561067d57600080fd5b506106986004803603810190610693919061411e565b6124ab565b005b3480156106a657600080fd5b506106af61256b565b6040516106bc9190614738565b60405180910390f35b3480156106d157600080fd5b506106ec60048036038101906106e79190614229565b612571565b005b3480156106fa57600080fd5b5061070361257e565b6040516107109190614539565b60405180910390f35b34801561072557600080fd5b5061072e6125a4565b60405161073b9190614738565b60405180910390f35b34801561075057600080fd5b5061076b6004803603810190610766919061411e565b6125aa565b60405161077891906145d6565b60405180910390f35b34801561078d57600080fd5b50610796612644565b6040516107a39190614539565b60405180910390f35b3480156107b857600080fd5b506107d360048036038101906107ce919061411e565b61266a565b6040516107e09190614738565b60405180910390f35b3480156107f557600080fd5b506107fe61278a565b60405161080b9190614738565b60405180910390f35b34801561082057600080fd5b506108296127d4565b6040516108369190614738565b60405180910390f35b34801561084b57600080fd5b506108546127e7565b6040516108619190614738565b60405180910390f35b34801561087657600080fd5b5061087f6127ed565b60405161088c91906145b4565b60405180910390f35b3480156108a157600080fd5b506108bc60048036038101906108b7919061411e565b61287b565b6040516108c99190614738565b60405180910390f35b3480156108de57600080fd5b506108e7612904565b6040516108f49190614738565b60405180910390f35b34801561090957600080fd5b50610924600480360381019061091f919061411e565b61290a565b6040516109319190614738565b60405180910390f35b34801561094657600080fd5b50610961600480360381019061095c9190614229565b612956565b005b34801561096f57600080fd5b5061098a6004803603810190610985919061411e565b6129dc565b005b34801561099857600080fd5b506109a1612ad4565b6040516109ae9190614738565b60405180910390f35b3480156109c357600080fd5b506109de60048036038101906109d99190614229565b612ada565b6040516109eb9190614539565b60405180910390f35b600d6020528060005260406000206000915090508060020154908060030154908060040154905083565b60145481565b60128181548110610a3457600080fd5b906000526020600020016000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60003390506000825111610aac576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610aa390614698565b60405180910390fd5b6000600c60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600401805490501115610b0457610b0381612b19565b5b6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905060005b8351811015610ca2578173ffffffffffffffffffffffffffffffffffffffff166323b872dd8430878581518110610b8e577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101516040518463ffffffff1660e01b8152600401610bb493929190614554565b600060405180830381600087803b158015610bce57600080fd5b505af1158015610be2573d6000803e3d6000fd5b50505050600c60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600401848281518110610c61577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015190806001815401808255809150506001900390600052602060002001600090919091909150558080610c9a90614a21565b915050610b2e565b5042600c60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060030181905550610d008351600954612d6a90919063ffffffff16565b600981905550610d54600c60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060040180549050612d80565b600d60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060030181905550505050565b600080600c60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001541415610df45760009050610ef2565b6000610e42600c60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000015484612dbf565b90506000600d60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050808211610eda57600092505050610ef2565b610eed8183612e3c90919063ffffffff16565b925050505b92915050565b610f00612e52565b73ffffffffffffffffffffffffffffffffffffffff16610f1e612155565b73ffffffffffffffffffffffffffffffffffffffff1614610f74576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f6b906146b8565b60405180910390fd5b8060018190555050565b610f883382612e5a565b50565b610f93612e52565b73ffffffffffffffffffffffffffffffffffffffff16610fb1612155565b73ffffffffffffffffffffffffffffffffffffffff1614611007576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ffe906146b8565b60405180910390fd5b8060028190555050565b611019612e52565b73ffffffffffffffffffffffffffffffffffffffff16611037612155565b73ffffffffffffffffffffffffffffffffffffffff161461108d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611084906146b8565b60405180910390fd5b6000600e8054905014156110a0576111f6565b60005b600e805490508110156111e6576000600c6000600e84815481106110f0577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000015411611163576111d3565b6111d2600e82815481106111a0577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166000612e5a565b5b80806111de90614a21565b9150506110a3565b50600e60006111f59190613fd5565b5b565b611200612e52565b73ffffffffffffffffffffffffffffffffffffffff1661121e612155565b73ffffffffffffffffffffffffffffffffffffffff1614611274576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161126b906146b8565b60405180910390fd5b8060068190555050565b600a5481565b60085481565b60015481565b600034116112d3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112ca90614658565b60405180910390fd5b600060095411611318576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161130f90614678565b60405180910390fd5b600034905061133281600f54612d6a90919063ffffffff16565b600f81905550611382611371600954611363846ec097ce7bc90715b34b9f10000000006133de90919063ffffffff16565b6133f490919063ffffffff16565b601454612d6a90919063ffffffff16565b60148190555050565b60025481565b61139b338261340a565b50565b6113a6612e52565b73ffffffffffffffffffffffffffffffffffffffff166113c4612155565b73ffffffffffffffffffffffffffffffffffffffff161461141a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611411906146b8565b60405180910390fd5b80600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b61146733612b19565b565b611471612e52565b73ffffffffffffffffffffffffffffffffffffffff1661148f612155565b73ffffffffffffffffffffffffffffffffffffffff16146114e5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114dc906146b8565b60405180910390fd5b6114ef6000613761565b565b60075481565b60003390506000600c60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600401805490501180156115a357506000825114806115a25750600c60008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060040180549050825111155b5b6115e2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115d9906146f8565b60405180910390fd5b600254600c60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600301546116329190614869565b4211611673576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161166a90614638565b60405180910390fd5b6000600c60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206004018054905011156116cb576116ca81612b19565b5b6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690506000835114156118a65760005b600c60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060040180549050811015611852578173ffffffffffffffffffffffffffffffffffffffff166323b872dd3085600c60008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060040185815481106117e4577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001546040518463ffffffff1660e01b815260040161180d93929190614554565b600060405180830381600087803b15801561182757600080fd5b505af115801561183b573d6000803e3d6000fd5b50505050808061184a90614a21565b9150506116ff565b600c60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060040160006118a09190613ff6565b50611e0b565b60005b8351811015611e095760005b600c60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600401805490508110156119e657600c60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600401818154811061197c577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001548583815181106119c0577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015114156119d3576119e6565b80806119de90614a21565b9150506118b5565b600c60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600401805490508110611a6d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a64906146d8565b60405180910390fd5b6001600c60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060040180549050611abf919061494a565b811415611b5957600c60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600401805480611b3e577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b60019003818190600052602060002001600090559055611d46565b600c60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206004016001600c60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060040180549050611bed919061494a565b81548110611c24577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200154600c60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206004018281548110611ca9577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200181905550600c60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600401805480611d2f577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b600190038181906000526020600020016000905590555b8273ffffffffffffffffffffffffffffffffffffffff166323b872dd3086888681518110611d9d577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101516040518463ffffffff1660e01b8152600401611dc393929190614554565b600060405180830381600087803b158015611ddd57600080fd5b505af1158015611df1573d6000803e3d6000fd5b50505050508080611e0190614a21565b9150506118a9565b505b611e59600c60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060040180549050612d80565b600d60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060030181905550611eb58351600954612e3c90919063ffffffff16565b600981905550505050565b611ec8612e52565b73ffffffffffffffffffffffffffffffffffffffff16611ee6612155565b73ffffffffffffffffffffffffffffffffffffffff1614611f3c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f33906146b8565b60405180910390fd5b611f44611011565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905060008173ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401611fa69190614539565b60206040518083038186803b158015611fbe57600080fd5b505afa158015611fd2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ff69190614252565b90508173ffffffffffffffffffffffffffffffffffffffff1663a9059cbb61201c612155565b836040518363ffffffff1660e01b815260040161203a92919061458b565b602060405180830381600087803b15801561205457600080fd5b505af1158015612068573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061208c9190614200565b50479050612098612155565b73ffffffffffffffffffffffffffffffffffffffff1681617530906040516120bf90614524565b600060405180830381858888f193505050503d80600081146120fd576040519150601f19603f3d011682016040523d82523d6000602084013e612102565b606091505b5050505050565b6000600c60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101549050919050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600081116121c1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121b890614658565b60405180910390fd5b600060085411612206576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121fd90614678565b60405180910390fd5b60008290508073ffffffffffffffffffffffffffffffffffffffff166323b872dd3330856040518463ffffffff1660e01b815260040161224893929190614554565b602060405180830381600087803b15801561226257600080fd5b505af1158015612276573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061229a9190614200565b506000601060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541415612347576012839080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b61239982601060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612d6a90919063ffffffff16565b601060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550612463612415600854612407856ec097ce7bc90715b34b9f10000000006133de90919063ffffffff16565b6133f490919063ffffffff16565b601160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612d6a90919063ffffffff16565b601160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550505050565b6124b3612e52565b73ffffffffffffffffffffffffffffffffffffffff166124d1612155565b73ffffffffffffffffffffffffffffffffffffffff1614612527576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161251e906146b8565b60405180910390fd5b80600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60055481565b61257b3382613825565b50565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600f5481565b6060600c60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060040180548060200260200160405190810160405280929190818152602001828054801561263857602002820191906000526020600020905b815481526020019060010190808311612624575b50505050509050919050565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600080600c60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206004018054905014156126c25760009050612785565b6000612712600c60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060040180549050612d80565b90506000600d60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060030154905080821161276d57600092505050612785565b6127808183612e3c90919063ffffffff16565b925050505b919050565b6000600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060020154905090565b6ec097ce7bc90715b34b9f100000000081565b60065481565b6060601280548060200260200160405190810160405280929190818152602001828054801561287157602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019060010190808311612827575b5050505050905090565b6000600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60135481565b6000600c60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001549050919050565b61295e612e52565b73ffffffffffffffffffffffffffffffffffffffff1661297c612155565b73ffffffffffffffffffffffffffffffffffffffff16146129d2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129c9906146b8565b60405180910390fd5b8060058190555050565b6129e4612e52565b73ffffffffffffffffffffffffffffffffffffffff16612a02612155565b73ffffffffffffffffffffffffffffffffffffffff1614612a58576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a4f906146b8565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612ac8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612abf90614618565b60405180910390fd5b612ad181613761565b50565b60095481565b600e8181548110612aea57600080fd5b906000526020600020016000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000612b248261266a565b90506000811415612b355750612d67565b612b8a81600d60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060020154612d6a90919063ffffffff16565b600d60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060020181905550612c1e600c60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060040180549050612d80565b600d60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060030181905550600047905060008373ffffffffffffffffffffffffffffffffffffffff1683604051612c8f90614524565b60006040518083038185875af1925050503d8060008114612ccc576040519150601f19603f3d011682016040523d82523d6000602084013e612cd1565b606091505b5050905080612d15576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d0c906145f8565b60405180910390fd5b8282612d21919061494a565b471015612d63576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d5a90614718565b60405180910390fd5b5050505b50565b60008183612d789190614869565b905092915050565b6000612db86ec097ce7bc90715b34b9f1000000000612daa601454856133de90919063ffffffff16565b6133f490919063ffffffff16565b9050919050565b6000612e346ec097ce7bc90715b34b9f1000000000612e26601160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054866133de90919063ffffffff16565b6133f490919063ffffffff16565b905092915050565b60008183612e4a919061494a565b905092915050565b600033905090565b6000600c60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000154118015612ef957506000811480612ef85750600c60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001548111155b5b612f38576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f2f906146f8565b60405180910390fd5b600154600c60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060020154612f889190614869565b4211612fc9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612fc090614638565b60405180910390fd5b60005b60128054905081101561306057600060128281548110613015577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905061304c848261340a565b50808061305890614a21565b915050612fcc565b506000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600080831461309757826130db565b600c60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001545b90506000819050600084141561310457600760008154809291906130fe906149c6565b91905055505b8273ffffffffffffffffffffffffffffffffffffffff1663a9059cbb86836040518363ffffffff1660e01b815260040161313f92919061458b565b602060405180830381600087803b15801561315957600080fd5b505af115801561316d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906131919190614200565b506131a781600a54612e3c90919063ffffffff16565b600a819055506131c282600854612e3c90919063ffffffff16565b60088190555080600c60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101600082825461321a919061494a565b9250508190555081600c60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000016000828254613273919061494a565b9250508190555060005b6012805490508110156133d6576000601282815481106132c6577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905061333f600c60008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000015482612dbf565b600d60008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505080806133ce90614a21565b91505061327d565b505050505050565b600081836133ec91906148f0565b905092915050565b6000818361340291906148bf565b905092915050565b6000600c60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000154141561345a5761375d565b60006134668383610d9f565b90506000811415613477575061375d565b61350981600d60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612d6a90919063ffffffff16565b600d60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506135d8600c60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000015483612dbf565b600d60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555042600d60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060040181905550600081111561375b576136c081601354612d6a90919063ffffffff16565b60138190555060008290508073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb85846040518363ffffffff1660e01b815260040161370692919061458b565b602060405180830381600087803b15801561372057600080fd5b505af1158015613734573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906137589190614200565b50505b505b5050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000600c60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000015411156139095760005b601280549050811015613907576000601282815481106138bc577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690506138f3848261340a565b5080806138ff90614a21565b915050613873565b505b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600080831461393f57826139c9565b8173ffffffffffffffffffffffffffffffffffffffff166370a08231856040518263ffffffff1660e01b81526004016139789190614539565b60206040518083038186803b15801561399057600080fd5b505afa1580156139a4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906139c89190614252565b5b90506000600c60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001549050600082905060008473ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401613a529190614539565b60206040518083038186803b158015613a6a57600080fd5b505afa158015613a7e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613aa29190614252565b90508473ffffffffffffffffffffffffffffffffffffffff166323b872dd8830876040518463ffffffff1660e01b8152600401613ae193929190614554565b602060405180830381600087803b158015613afb57600080fd5b505af1158015613b0f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613b339190614200565b50613bcf818673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401613b719190614539565b60206040518083038186803b158015613b8957600080fd5b505afa158015613b9d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613bc19190614252565b612e3c90919063ffffffff16565b91506000613c2883600c60008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010154612d6a90919063ffffffff16565b9050613c3f83600a54612d6a90919063ffffffff16565b600a81905550613cae81613ca0600c60008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000154600854612e3c90919063ffffffff16565b612d6a90919063ffffffff16565b60088190555082600c60008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001016000828254613d069190614869565b9250508190555080600c60008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000018190555042600c60008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060020181905550600084148015613ded57506000600c60008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000154115b15613e0b5760076000815480929190613e0590614a21565b91905055505b60005b601280549050811015613f6757600060128281548110613e57577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050613ed0600c60008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000015482612dbf565b600d60008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550508080613f5f90614a21565b915050613e0e565b50600e889080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050505050505050565b5080546000825590600052602060002090810190613ff39190614017565b50565b50805460008255906000526020600020908101906140149190614017565b50565b5b80821115614030576000816000905550600101614018565b5090565b6000614047614042846147af565b61478a565b9050808382526020820190508285602086028201111561406657600080fd5b60005b85811015614096578161407c88826140f4565b845260208401935060208301925050600181019050614069565b5050509392505050565b6000813590506140af81614d89565b92915050565b600082601f8301126140c657600080fd5b81356140d6848260208601614034565b91505092915050565b6000815190506140ee81614da0565b92915050565b60008135905061410381614db7565b92915050565b60008151905061411881614db7565b92915050565b60006020828403121561413057600080fd5b600061413e848285016140a0565b91505092915050565b6000806040838503121561415a57600080fd5b6000614168858286016140a0565b9250506020614179858286016140a0565b9150509250929050565b6000806040838503121561419657600080fd5b60006141a4858286016140a0565b92505060206141b5858286016140f4565b9150509250929050565b6000602082840312156141d157600080fd5b600082013567ffffffffffffffff8111156141eb57600080fd5b6141f7848285016140b5565b91505092915050565b60006020828403121561421257600080fd5b6000614220848285016140df565b91505092915050565b60006020828403121561423b57600080fd5b6000614249848285016140f4565b91505092915050565b60006020828403121561426457600080fd5b600061427284828501614109565b91505092915050565b600061428783836142ab565b60208301905092915050565b600061429f8383614506565b60208301905092915050565b6142b48161497e565b82525050565b6142c38161497e565b82525050565b60006142d4826147fb565b6142de818561482b565b93506142e9836147db565b8060005b8381101561431a578151614301888261427b565b975061430c83614811565b9250506001810190506142ed565b5085935050505092915050565b600061433282614806565b61433c818561483c565b9350614347836147eb565b8060005b8381101561437857815161435f8882614293565b975061436a8361481e565b92505060018101905061434b565b5085935050505092915050565b6000614392601d83614858565b915061439d82614b08565b602082019050919050565b60006143b5602683614858565b91506143c082614b31565b604082019050919050565b60006143d8604083614858565b91506143e382614b80565b604082019050919050565b60006143fb601c83614858565b915061440682614bcf565b602082019050919050565b600061441e602f83614858565b915061442982614bf8565b604082019050919050565b6000614441602483614858565b915061444c82614c47565b604082019050919050565b6000614464602083614858565b915061446f82614c96565b602082019050919050565b6000614487600983614858565b915061449282614cbf565b602082019050919050565b60006144aa60008361484d565b91506144b582614ce8565b600082019050919050565b60006144cd602c83614858565b91506144d882614ceb565b604082019050919050565b60006144f0602583614858565b91506144fb82614d3a565b604082019050919050565b61450f816149bc565b82525050565b61451e816149bc565b82525050565b600061452f8261449d565b9150819050919050565b600060208201905061454e60008301846142ba565b92915050565b600060608201905061456960008301866142ba565b61457660208301856142ba565b6145836040830184614515565b949350505050565b60006040820190506145a060008301856142ba565b6145ad6020830184614515565b9392505050565b600060208201905081810360008301526145ce81846142c9565b905092915050565b600060208201905081810360008301526145f08184614327565b905092915050565b6000602082019050818103600083015261461181614385565b9050919050565b60006020820190508181036000830152614631816143a8565b9050919050565b60006020820190508181036000830152614651816143cb565b9050919050565b60006020820190508181036000830152614671816143ee565b9050919050565b6000602082019050818103600083015261469181614411565b9050919050565b600060208201905081810360008301526146b181614434565b9050919050565b600060208201905081810360008301526146d181614457565b9050919050565b600060208201905081810360008301526146f18161447a565b9050919050565b60006020820190508181036000830152614711816144c0565b9050919050565b60006020820190508181036000830152614731816144e3565b9050919050565b600060208201905061474d6000830184614515565b92915050565b60006060820190506147686000830186614515565b6147756020830185614515565b6147826040830184614515565b949350505050565b60006147946147a5565b90506147a082826149f0565b919050565b6000604051905090565b600067ffffffffffffffff8211156147ca576147c9614ac8565b5b602082029050602081019050919050565b6000819050602082019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b6000614874826149bc565b915061487f836149bc565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156148b4576148b3614a6a565b5b828201905092915050565b60006148ca826149bc565b91506148d5836149bc565b9250826148e5576148e4614a99565b5b828204905092915050565b60006148fb826149bc565b9150614906836149bc565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561493f5761493e614a6a565b5b828202905092915050565b6000614955826149bc565b9150614960836149bc565b92508282101561497357614972614a6a565b5b828203905092915050565b60006149898261499c565b9050919050565b60008115159050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b60006149d1826149bc565b915060008214156149e5576149e4614a6a565b5b600182039050919050565b6149f982614af7565b810181811067ffffffffffffffff82111715614a1857614a17614ac8565b5b80604052505050565b6000614a2c826149bc565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614a5f57614a5e614a6a565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b7f45544820776173206e6f74207375636365737366756c6c792073656e74000000600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f6d757374206265207374616b656420666f72206d696e696d756d2074696d652060008201527f616e64206174206c65617374206f6e6520626c6f636b206966206e6f206d696e602082015250565b7f76616c7565206d7573742062652067726561746572207468616e203000000000600082015250565b7f6d75737420626520736861726573206465706f736974656420746f206265207260008201527f6577617264656420726577617264730000000000000000000000000000000000602082015250565b7f596f752073686f756c64207374616b65204e465473206d6f7265207468616e2060008201527f6f6e652e00000000000000000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f57726f6e672069642e0000000000000000000000000000000000000000000000600082015250565b50565b7f796f752063616e206f6e6c7920756e7374616b6520696620796f75206861766560008201527f20736f6d65207374616b65640000000000000000000000000000000000000000602082015250565b7f6f6e6c792074616b652070726f70657220616d6f756e742066726f6d20636f6e60008201527f7472616374000000000000000000000000000000000000000000000000000000602082015250565b614d928161497e565b8114614d9d57600080fd5b50565b614da981614990565b8114614db457600080fd5b50565b614dc0816149bc565b8114614dcb57600080fd5b5056fea264697066735822122009884d441b43f01998f9aa2e22d0ede414f6765f66f61046b1973d9c699180fb64736f6c634300080400330000000000000000000000002c33b28527a63cdf13c0b24ce4cf5bf9c9fb3bc600000000000000000000000046084f00dd87b2f50c1e898399241e760d2284e3
Deployed Bytecode
0x60806040526004361061026b5760003560e01c806388b0e46f11610144578063dd6bff1a116100b6578063efca2eed1161007a578063efca2eed146108d2578063f04da65b146108fd578063f2e0c9151461093a578063f2fde38b14610963578063faaec8491461098c578063fd5e6dd1146109b757610272565b8063dd6bff1a146107e9578063df83bf6e14610814578063e13326991461083f578063e5f735d61461086a578063ef5d9ae81461089557610272565b8063a694fc3a11610108578063a694fc3a146106c5578063af17e3b7146106ee578063b5030d9d14610719578063b99567a414610744578063beb68d0514610781578063d14d1e95146107ac57610272565b806388b0e46f146105e05780638da5cb5b1461061d57806392359c19146106485780639e75fd77146106715780639f8c9b2e1461069a57610272565b80633cbabf3f116101dd5780636ab7ffda116101a15780636ab7ffda1461051e5780636d8aa88d14610547578063715018a61461055e57806380bb4055146105755780638453734d146105a0578063853828b6146105c957610272565b80633cbabf3f1461046a5780634da881a8146104955780635f6ffe35146104c0578063654b792f146104ca57806367ab3c49146104f557610272565b8063294c494d1161022f578063294c494d146103845780632e17de78146103ad57806334f20084146103d657806335322f37146103ff578063389d6cbe146104165780633c6e67891461043f57610272565b80630700037d14610277578063134e82e9146102b657806315a3d12c146102e1578063182c57441461031e578063253ccae41461034757610272565b3661027257005b600080fd5b34801561028357600080fd5b5061029e6004803603810190610299919061411e565b6109f4565b6040516102ad93929190614753565b60405180910390f35b3480156102c257600080fd5b506102cb610a1e565b6040516102d89190614738565b60405180910390f35b3480156102ed57600080fd5b5061030860048036038101906103039190614229565b610a24565b6040516103159190614539565b60405180910390f35b34801561032a57600080fd5b50610345600480360381019061034091906141bf565b610a63565b005b34801561035357600080fd5b5061036e60048036038101906103699190614147565b610d9f565b60405161037b9190614738565b60405180910390f35b34801561039057600080fd5b506103ab60048036038101906103a69190614229565b610ef8565b005b3480156103b957600080fd5b506103d460048036038101906103cf9190614229565b610f7e565b005b3480156103e257600080fd5b506103fd60048036038101906103f89190614229565b610f8b565b005b34801561040b57600080fd5b50610414611011565b005b34801561042257600080fd5b5061043d60048036038101906104389190614229565b6111f8565b005b34801561044b57600080fd5b5061045461127e565b6040516104619190614738565b60405180910390f35b34801561047657600080fd5b5061047f611284565b60405161048c9190614738565b60405180910390f35b3480156104a157600080fd5b506104aa61128a565b6040516104b79190614738565b60405180910390f35b6104c8611290565b005b3480156104d657600080fd5b506104df61138b565b6040516104ec9190614738565b60405180910390f35b34801561050157600080fd5b5061051c6004803603810190610517919061411e565b611391565b005b34801561052a57600080fd5b506105456004803603810190610540919061411e565b61139e565b005b34801561055357600080fd5b5061055c61145e565b005b34801561056a57600080fd5b50610573611469565b005b34801561058157600080fd5b5061058a6114f1565b6040516105979190614738565b60405180910390f35b3480156105ac57600080fd5b506105c760048036038101906105c291906141bf565b6114f7565b005b3480156105d557600080fd5b506105de611ec0565b005b3480156105ec57600080fd5b506106076004803603810190610602919061411e565b612109565b6040516106149190614738565b60405180910390f35b34801561062957600080fd5b50610632612155565b60405161063f9190614539565b60405180910390f35b34801561065457600080fd5b5061066f600480360381019061066a9190614183565b61217e565b005b34801561067d57600080fd5b506106986004803603810190610693919061411e565b6124ab565b005b3480156106a657600080fd5b506106af61256b565b6040516106bc9190614738565b60405180910390f35b3480156106d157600080fd5b506106ec60048036038101906106e79190614229565b612571565b005b3480156106fa57600080fd5b5061070361257e565b6040516107109190614539565b60405180910390f35b34801561072557600080fd5b5061072e6125a4565b60405161073b9190614738565b60405180910390f35b34801561075057600080fd5b5061076b6004803603810190610766919061411e565b6125aa565b60405161077891906145d6565b60405180910390f35b34801561078d57600080fd5b50610796612644565b6040516107a39190614539565b60405180910390f35b3480156107b857600080fd5b506107d360048036038101906107ce919061411e565b61266a565b6040516107e09190614738565b60405180910390f35b3480156107f557600080fd5b506107fe61278a565b60405161080b9190614738565b60405180910390f35b34801561082057600080fd5b506108296127d4565b6040516108369190614738565b60405180910390f35b34801561084b57600080fd5b506108546127e7565b6040516108619190614738565b60405180910390f35b34801561087657600080fd5b5061087f6127ed565b60405161088c91906145b4565b60405180910390f35b3480156108a157600080fd5b506108bc60048036038101906108b7919061411e565b61287b565b6040516108c99190614738565b60405180910390f35b3480156108de57600080fd5b506108e7612904565b6040516108f49190614738565b60405180910390f35b34801561090957600080fd5b50610924600480360381019061091f919061411e565b61290a565b6040516109319190614738565b60405180910390f35b34801561094657600080fd5b50610961600480360381019061095c9190614229565b612956565b005b34801561096f57600080fd5b5061098a6004803603810190610985919061411e565b6129dc565b005b34801561099857600080fd5b506109a1612ad4565b6040516109ae9190614738565b60405180910390f35b3480156109c357600080fd5b506109de60048036038101906109d99190614229565b612ada565b6040516109eb9190614539565b60405180910390f35b600d6020528060005260406000206000915090508060020154908060030154908060040154905083565b60145481565b60128181548110610a3457600080fd5b906000526020600020016000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60003390506000825111610aac576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610aa390614698565b60405180910390fd5b6000600c60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600401805490501115610b0457610b0381612b19565b5b6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905060005b8351811015610ca2578173ffffffffffffffffffffffffffffffffffffffff166323b872dd8430878581518110610b8e577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101516040518463ffffffff1660e01b8152600401610bb493929190614554565b600060405180830381600087803b158015610bce57600080fd5b505af1158015610be2573d6000803e3d6000fd5b50505050600c60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600401848281518110610c61577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015190806001815401808255809150506001900390600052602060002001600090919091909150558080610c9a90614a21565b915050610b2e565b5042600c60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060030181905550610d008351600954612d6a90919063ffffffff16565b600981905550610d54600c60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060040180549050612d80565b600d60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060030181905550505050565b600080600c60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001541415610df45760009050610ef2565b6000610e42600c60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000015484612dbf565b90506000600d60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050808211610eda57600092505050610ef2565b610eed8183612e3c90919063ffffffff16565b925050505b92915050565b610f00612e52565b73ffffffffffffffffffffffffffffffffffffffff16610f1e612155565b73ffffffffffffffffffffffffffffffffffffffff1614610f74576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f6b906146b8565b60405180910390fd5b8060018190555050565b610f883382612e5a565b50565b610f93612e52565b73ffffffffffffffffffffffffffffffffffffffff16610fb1612155565b73ffffffffffffffffffffffffffffffffffffffff1614611007576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ffe906146b8565b60405180910390fd5b8060028190555050565b611019612e52565b73ffffffffffffffffffffffffffffffffffffffff16611037612155565b73ffffffffffffffffffffffffffffffffffffffff161461108d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611084906146b8565b60405180910390fd5b6000600e8054905014156110a0576111f6565b60005b600e805490508110156111e6576000600c6000600e84815481106110f0577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000015411611163576111d3565b6111d2600e82815481106111a0577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166000612e5a565b5b80806111de90614a21565b9150506110a3565b50600e60006111f59190613fd5565b5b565b611200612e52565b73ffffffffffffffffffffffffffffffffffffffff1661121e612155565b73ffffffffffffffffffffffffffffffffffffffff1614611274576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161126b906146b8565b60405180910390fd5b8060068190555050565b600a5481565b60085481565b60015481565b600034116112d3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112ca90614658565b60405180910390fd5b600060095411611318576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161130f90614678565b60405180910390fd5b600034905061133281600f54612d6a90919063ffffffff16565b600f81905550611382611371600954611363846ec097ce7bc90715b34b9f10000000006133de90919063ffffffff16565b6133f490919063ffffffff16565b601454612d6a90919063ffffffff16565b60148190555050565b60025481565b61139b338261340a565b50565b6113a6612e52565b73ffffffffffffffffffffffffffffffffffffffff166113c4612155565b73ffffffffffffffffffffffffffffffffffffffff161461141a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611411906146b8565b60405180910390fd5b80600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b61146733612b19565b565b611471612e52565b73ffffffffffffffffffffffffffffffffffffffff1661148f612155565b73ffffffffffffffffffffffffffffffffffffffff16146114e5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114dc906146b8565b60405180910390fd5b6114ef6000613761565b565b60075481565b60003390506000600c60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600401805490501180156115a357506000825114806115a25750600c60008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060040180549050825111155b5b6115e2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115d9906146f8565b60405180910390fd5b600254600c60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600301546116329190614869565b4211611673576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161166a90614638565b60405180910390fd5b6000600c60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206004018054905011156116cb576116ca81612b19565b5b6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690506000835114156118a65760005b600c60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060040180549050811015611852578173ffffffffffffffffffffffffffffffffffffffff166323b872dd3085600c60008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060040185815481106117e4577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001546040518463ffffffff1660e01b815260040161180d93929190614554565b600060405180830381600087803b15801561182757600080fd5b505af115801561183b573d6000803e3d6000fd5b50505050808061184a90614a21565b9150506116ff565b600c60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060040160006118a09190613ff6565b50611e0b565b60005b8351811015611e095760005b600c60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600401805490508110156119e657600c60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600401818154811061197c577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001548583815181106119c0577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015114156119d3576119e6565b80806119de90614a21565b9150506118b5565b600c60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600401805490508110611a6d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a64906146d8565b60405180910390fd5b6001600c60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060040180549050611abf919061494a565b811415611b5957600c60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600401805480611b3e577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b60019003818190600052602060002001600090559055611d46565b600c60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206004016001600c60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060040180549050611bed919061494a565b81548110611c24577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200154600c60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206004018281548110611ca9577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200181905550600c60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600401805480611d2f577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b600190038181906000526020600020016000905590555b8273ffffffffffffffffffffffffffffffffffffffff166323b872dd3086888681518110611d9d577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101516040518463ffffffff1660e01b8152600401611dc393929190614554565b600060405180830381600087803b158015611ddd57600080fd5b505af1158015611df1573d6000803e3d6000fd5b50505050508080611e0190614a21565b9150506118a9565b505b611e59600c60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060040180549050612d80565b600d60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060030181905550611eb58351600954612e3c90919063ffffffff16565b600981905550505050565b611ec8612e52565b73ffffffffffffffffffffffffffffffffffffffff16611ee6612155565b73ffffffffffffffffffffffffffffffffffffffff1614611f3c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f33906146b8565b60405180910390fd5b611f44611011565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905060008173ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401611fa69190614539565b60206040518083038186803b158015611fbe57600080fd5b505afa158015611fd2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ff69190614252565b90508173ffffffffffffffffffffffffffffffffffffffff1663a9059cbb61201c612155565b836040518363ffffffff1660e01b815260040161203a92919061458b565b602060405180830381600087803b15801561205457600080fd5b505af1158015612068573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061208c9190614200565b50479050612098612155565b73ffffffffffffffffffffffffffffffffffffffff1681617530906040516120bf90614524565b600060405180830381858888f193505050503d80600081146120fd576040519150601f19603f3d011682016040523d82523d6000602084013e612102565b606091505b5050505050565b6000600c60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101549050919050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600081116121c1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121b890614658565b60405180910390fd5b600060085411612206576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121fd90614678565b60405180910390fd5b60008290508073ffffffffffffffffffffffffffffffffffffffff166323b872dd3330856040518463ffffffff1660e01b815260040161224893929190614554565b602060405180830381600087803b15801561226257600080fd5b505af1158015612276573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061229a9190614200565b506000601060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541415612347576012839080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b61239982601060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612d6a90919063ffffffff16565b601060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550612463612415600854612407856ec097ce7bc90715b34b9f10000000006133de90919063ffffffff16565b6133f490919063ffffffff16565b601160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612d6a90919063ffffffff16565b601160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550505050565b6124b3612e52565b73ffffffffffffffffffffffffffffffffffffffff166124d1612155565b73ffffffffffffffffffffffffffffffffffffffff1614612527576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161251e906146b8565b60405180910390fd5b80600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60055481565b61257b3382613825565b50565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600f5481565b6060600c60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060040180548060200260200160405190810160405280929190818152602001828054801561263857602002820191906000526020600020905b815481526020019060010190808311612624575b50505050509050919050565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600080600c60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206004018054905014156126c25760009050612785565b6000612712600c60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060040180549050612d80565b90506000600d60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060030154905080821161276d57600092505050612785565b6127808183612e3c90919063ffffffff16565b925050505b919050565b6000600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060020154905090565b6ec097ce7bc90715b34b9f100000000081565b60065481565b6060601280548060200260200160405190810160405280929190818152602001828054801561287157602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019060010190808311612827575b5050505050905090565b6000600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60135481565b6000600c60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001549050919050565b61295e612e52565b73ffffffffffffffffffffffffffffffffffffffff1661297c612155565b73ffffffffffffffffffffffffffffffffffffffff16146129d2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129c9906146b8565b60405180910390fd5b8060058190555050565b6129e4612e52565b73ffffffffffffffffffffffffffffffffffffffff16612a02612155565b73ffffffffffffffffffffffffffffffffffffffff1614612a58576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a4f906146b8565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612ac8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612abf90614618565b60405180910390fd5b612ad181613761565b50565b60095481565b600e8181548110612aea57600080fd5b906000526020600020016000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000612b248261266a565b90506000811415612b355750612d67565b612b8a81600d60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060020154612d6a90919063ffffffff16565b600d60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060020181905550612c1e600c60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060040180549050612d80565b600d60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060030181905550600047905060008373ffffffffffffffffffffffffffffffffffffffff1683604051612c8f90614524565b60006040518083038185875af1925050503d8060008114612ccc576040519150601f19603f3d011682016040523d82523d6000602084013e612cd1565b606091505b5050905080612d15576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d0c906145f8565b60405180910390fd5b8282612d21919061494a565b471015612d63576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d5a90614718565b60405180910390fd5b5050505b50565b60008183612d789190614869565b905092915050565b6000612db86ec097ce7bc90715b34b9f1000000000612daa601454856133de90919063ffffffff16565b6133f490919063ffffffff16565b9050919050565b6000612e346ec097ce7bc90715b34b9f1000000000612e26601160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054866133de90919063ffffffff16565b6133f490919063ffffffff16565b905092915050565b60008183612e4a919061494a565b905092915050565b600033905090565b6000600c60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000154118015612ef957506000811480612ef85750600c60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001548111155b5b612f38576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f2f906146f8565b60405180910390fd5b600154600c60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060020154612f889190614869565b4211612fc9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612fc090614638565b60405180910390fd5b60005b60128054905081101561306057600060128281548110613015577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905061304c848261340a565b50808061305890614a21565b915050612fcc565b506000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600080831461309757826130db565b600c60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001545b90506000819050600084141561310457600760008154809291906130fe906149c6565b91905055505b8273ffffffffffffffffffffffffffffffffffffffff1663a9059cbb86836040518363ffffffff1660e01b815260040161313f92919061458b565b602060405180830381600087803b15801561315957600080fd5b505af115801561316d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906131919190614200565b506131a781600a54612e3c90919063ffffffff16565b600a819055506131c282600854612e3c90919063ffffffff16565b60088190555080600c60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101600082825461321a919061494a565b9250508190555081600c60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000016000828254613273919061494a565b9250508190555060005b6012805490508110156133d6576000601282815481106132c6577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905061333f600c60008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000015482612dbf565b600d60008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505080806133ce90614a21565b91505061327d565b505050505050565b600081836133ec91906148f0565b905092915050565b6000818361340291906148bf565b905092915050565b6000600c60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000154141561345a5761375d565b60006134668383610d9f565b90506000811415613477575061375d565b61350981600d60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612d6a90919063ffffffff16565b600d60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506135d8600c60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000015483612dbf565b600d60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555042600d60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060040181905550600081111561375b576136c081601354612d6a90919063ffffffff16565b60138190555060008290508073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb85846040518363ffffffff1660e01b815260040161370692919061458b565b602060405180830381600087803b15801561372057600080fd5b505af1158015613734573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906137589190614200565b50505b505b5050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000600c60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000015411156139095760005b601280549050811015613907576000601282815481106138bc577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690506138f3848261340a565b5080806138ff90614a21565b915050613873565b505b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600080831461393f57826139c9565b8173ffffffffffffffffffffffffffffffffffffffff166370a08231856040518263ffffffff1660e01b81526004016139789190614539565b60206040518083038186803b15801561399057600080fd5b505afa1580156139a4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906139c89190614252565b5b90506000600c60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001549050600082905060008473ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401613a529190614539565b60206040518083038186803b158015613a6a57600080fd5b505afa158015613a7e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613aa29190614252565b90508473ffffffffffffffffffffffffffffffffffffffff166323b872dd8830876040518463ffffffff1660e01b8152600401613ae193929190614554565b602060405180830381600087803b158015613afb57600080fd5b505af1158015613b0f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613b339190614200565b50613bcf818673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401613b719190614539565b60206040518083038186803b158015613b8957600080fd5b505afa158015613b9d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613bc19190614252565b612e3c90919063ffffffff16565b91506000613c2883600c60008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010154612d6a90919063ffffffff16565b9050613c3f83600a54612d6a90919063ffffffff16565b600a81905550613cae81613ca0600c60008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000154600854612e3c90919063ffffffff16565b612d6a90919063ffffffff16565b60088190555082600c60008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001016000828254613d069190614869565b9250508190555080600c60008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000018190555042600c60008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060020181905550600084148015613ded57506000600c60008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000154115b15613e0b5760076000815480929190613e0590614a21565b91905055505b60005b601280549050811015613f6757600060128281548110613e57577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050613ed0600c60008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000015482612dbf565b600d60008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550508080613f5f90614a21565b915050613e0e565b50600e889080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050505050505050565b5080546000825590600052602060002090810190613ff39190614017565b50565b50805460008255906000526020600020908101906140149190614017565b50565b5b80821115614030576000816000905550600101614018565b5090565b6000614047614042846147af565b61478a565b9050808382526020820190508285602086028201111561406657600080fd5b60005b85811015614096578161407c88826140f4565b845260208401935060208301925050600181019050614069565b5050509392505050565b6000813590506140af81614d89565b92915050565b600082601f8301126140c657600080fd5b81356140d6848260208601614034565b91505092915050565b6000815190506140ee81614da0565b92915050565b60008135905061410381614db7565b92915050565b60008151905061411881614db7565b92915050565b60006020828403121561413057600080fd5b600061413e848285016140a0565b91505092915050565b6000806040838503121561415a57600080fd5b6000614168858286016140a0565b9250506020614179858286016140a0565b9150509250929050565b6000806040838503121561419657600080fd5b60006141a4858286016140a0565b92505060206141b5858286016140f4565b9150509250929050565b6000602082840312156141d157600080fd5b600082013567ffffffffffffffff8111156141eb57600080fd5b6141f7848285016140b5565b91505092915050565b60006020828403121561421257600080fd5b6000614220848285016140df565b91505092915050565b60006020828403121561423b57600080fd5b6000614249848285016140f4565b91505092915050565b60006020828403121561426457600080fd5b600061427284828501614109565b91505092915050565b600061428783836142ab565b60208301905092915050565b600061429f8383614506565b60208301905092915050565b6142b48161497e565b82525050565b6142c38161497e565b82525050565b60006142d4826147fb565b6142de818561482b565b93506142e9836147db565b8060005b8381101561431a578151614301888261427b565b975061430c83614811565b9250506001810190506142ed565b5085935050505092915050565b600061433282614806565b61433c818561483c565b9350614347836147eb565b8060005b8381101561437857815161435f8882614293565b975061436a8361481e565b92505060018101905061434b565b5085935050505092915050565b6000614392601d83614858565b915061439d82614b08565b602082019050919050565b60006143b5602683614858565b91506143c082614b31565b604082019050919050565b60006143d8604083614858565b91506143e382614b80565b604082019050919050565b60006143fb601c83614858565b915061440682614bcf565b602082019050919050565b600061441e602f83614858565b915061442982614bf8565b604082019050919050565b6000614441602483614858565b915061444c82614c47565b604082019050919050565b6000614464602083614858565b915061446f82614c96565b602082019050919050565b6000614487600983614858565b915061449282614cbf565b602082019050919050565b60006144aa60008361484d565b91506144b582614ce8565b600082019050919050565b60006144cd602c83614858565b91506144d882614ceb565b604082019050919050565b60006144f0602583614858565b91506144fb82614d3a565b604082019050919050565b61450f816149bc565b82525050565b61451e816149bc565b82525050565b600061452f8261449d565b9150819050919050565b600060208201905061454e60008301846142ba565b92915050565b600060608201905061456960008301866142ba565b61457660208301856142ba565b6145836040830184614515565b949350505050565b60006040820190506145a060008301856142ba565b6145ad6020830184614515565b9392505050565b600060208201905081810360008301526145ce81846142c9565b905092915050565b600060208201905081810360008301526145f08184614327565b905092915050565b6000602082019050818103600083015261461181614385565b9050919050565b60006020820190508181036000830152614631816143a8565b9050919050565b60006020820190508181036000830152614651816143cb565b9050919050565b60006020820190508181036000830152614671816143ee565b9050919050565b6000602082019050818103600083015261469181614411565b9050919050565b600060208201905081810360008301526146b181614434565b9050919050565b600060208201905081810360008301526146d181614457565b9050919050565b600060208201905081810360008301526146f18161447a565b9050919050565b60006020820190508181036000830152614711816144c0565b9050919050565b60006020820190508181036000830152614731816144e3565b9050919050565b600060208201905061474d6000830184614515565b92915050565b60006060820190506147686000830186614515565b6147756020830185614515565b6147826040830184614515565b949350505050565b60006147946147a5565b90506147a082826149f0565b919050565b6000604051905090565b600067ffffffffffffffff8211156147ca576147c9614ac8565b5b602082029050602081019050919050565b6000819050602082019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b6000614874826149bc565b915061487f836149bc565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156148b4576148b3614a6a565b5b828201905092915050565b60006148ca826149bc565b91506148d5836149bc565b9250826148e5576148e4614a99565b5b828204905092915050565b60006148fb826149bc565b9150614906836149bc565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561493f5761493e614a6a565b5b828202905092915050565b6000614955826149bc565b9150614960836149bc565b92508282101561497357614972614a6a565b5b828203905092915050565b60006149898261499c565b9050919050565b60008115159050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b60006149d1826149bc565b915060008214156149e5576149e4614a6a565b5b600182039050919050565b6149f982614af7565b810181811067ffffffffffffffff82111715614a1857614a17614ac8565b5b80604052505050565b6000614a2c826149bc565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614a5f57614a5e614a6a565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b7f45544820776173206e6f74207375636365737366756c6c792073656e74000000600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f6d757374206265207374616b656420666f72206d696e696d756d2074696d652060008201527f616e64206174206c65617374206f6e6520626c6f636b206966206e6f206d696e602082015250565b7f76616c7565206d7573742062652067726561746572207468616e203000000000600082015250565b7f6d75737420626520736861726573206465706f736974656420746f206265207260008201527f6577617264656420726577617264730000000000000000000000000000000000602082015250565b7f596f752073686f756c64207374616b65204e465473206d6f7265207468616e2060008201527f6f6e652e00000000000000000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f57726f6e672069642e0000000000000000000000000000000000000000000000600082015250565b50565b7f796f752063616e206f6e6c7920756e7374616b6520696620796f75206861766560008201527f20736f6d65207374616b65640000000000000000000000000000000000000000602082015250565b7f6f6e6c792074616b652070726f70657220616d6f756e742066726f6d20636f6e60008201527f7472616374000000000000000000000000000000000000000000000000000000602082015250565b614d928161497e565b8114614d9d57600080fd5b50565b614da981614990565b8114614db457600080fd5b50565b614dc0816149bc565b8114614dcb57600080fd5b5056fea264697066735822122009884d441b43f01998f9aa2e22d0ede414f6765f66f61046b1973d9c699180fb64736f6c63430008040033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000002c33b28527a63cdf13c0b24ce4cf5bf9c9fb3bc600000000000000000000000046084f00dd87b2f50c1e898399241e760d2284e3
-----Decoded View---------------
Arg [0] : _shareholderToken (address): 0x2C33B28527A63Cdf13C0B24Ce4cf5BF9C9fB3BC6
Arg [1] : _nftToken (address): 0x46084F00dD87B2f50c1E898399241E760D2284E3
-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 0000000000000000000000002c33b28527a63cdf13c0b24ce4cf5bf9c9fb3bc6
Arg [1] : 00000000000000000000000046084f00dd87b2f50c1e898399241e760d2284e3
Deployed Bytecode Sourcemap
24825:14634:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25987:41;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;26287:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26218:28;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26726:793;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;36867:501;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38251:120;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;32946:97;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38377:126;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38840:248;;;;;;;;;;;;;:::i;:::-;;38733:101;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;25724:35;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25652:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25318:46;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33049:421;;;:::i;:::-;;25369:51;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36179:112;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38509:96;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;36297:85;;;;;;;;;;;;;:::i;:::-;;23695:103;;;;;;;;;;;;;:::i;:::-;;25616:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27525:1998;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;39094:327;;;;;;;;;;;;;:::i;:::-;;37744:112;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23044:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33476:824;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38143:102;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;25507:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26641:79;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;25472:30;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26080;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37981:156;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25436:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36388:473;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36056:117;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26325:43;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25576:35;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26539:96;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35908:142;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26251:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37862:113;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38611:116;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;23953:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;25690:29;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26051:24;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25987:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;26287:31::-;;;;:::o;26218:28::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;26726:793::-;26790:19;26812:10;26790:32;;26858:1;26837:11;:18;:22;26829:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;26957:1;26911:6;:19;26918:11;26911:19;;;;;;;;;;;;;;;:36;;:43;;;;:47;26907:95;;;26967:35;26990:11;26967:22;:35::i;:::-;26907:95;27009:19;27039:15;;;;;;;;;;;27009:46;;27067:9;27062:200;27086:11;:18;27082:1;:22;27062:200;;;27120:11;:24;;;27145:11;27166:4;27173:11;27185:1;27173:14;;;;;;;;;;;;;;;;;;;;;;27120:68;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27197:6;:19;27204:11;27197:19;;;;;;;;;;;;;;;:36;;27239:11;27251:1;27239:14;;;;;;;;;;;;;;;;;;;;;;27197:57;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27106:3;;;;;:::i;:::-;;;;27062:200;;;;27304:15;27268:6;:19;27275:11;27268:19;;;;;;;;;;;;;;;:33;;:51;;;;27343:38;27362:11;:18;27343:14;;:18;;:38;;;;:::i;:::-;27326:14;:55;;;;27431:82;27463:6;:19;27470:11;27463:19;;;;;;;;;;;;;;;:36;;:43;;;;27431:23;:82::i;:::-;27388:7;:20;27396:11;27388:20;;;;;;;;;;;;;;;:40;;:125;;;;26726:793;;;:::o;36867:501::-;36967:7;37020:1;36990:6;:19;36997:11;36990:19;;;;;;;;;;;;;;;:26;;;:31;36986:62;;;37039:1;37032:8;;;;36986:62;37056:21;37080:85;37114:6;:19;37121:11;37114:19;;;;;;;;;;;;;;;:26;;;37149:9;37080:25;:85::i;:::-;37056:109;;37172:23;37198:7;:20;37206:11;37198:20;;;;;;;;;;;;;;;:34;;:45;37233:9;37198:45;;;;;;;;;;;;;;;;37172:71;;37271:15;37254:13;:32;37250:63;;37304:1;37297:8;;;;;;37250:63;37328:34;37346:15;37328:13;:17;;:34;;;;:::i;:::-;37321:41;;;;36867:501;;;;;:::o;38251:120::-;23275:12;:10;:12::i;:::-;23264:23;;:7;:5;:7::i;:::-;:23;;;23256:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;38357:8:::1;38331:23;:34;;;;38251:120:::0;:::o;32946:97::-;33002:35;33011:10;33023:13;33002:8;:35::i;:::-;32946:97;:::o;38377:126::-;23275:12;:10;:12::i;:::-;23264:23;;:7;:5;:7::i;:::-;:23;;;23256:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;38489:8:::1;38460:26;:37;;;;38377:126:::0;:::o;38840:248::-;23275:12;:10;:12::i;:::-;23264:23;;:7;:5;:7::i;:::-;:23;;;23256:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;38908:1:::1;38890:7;:14;;;;:19;38886:32;;;38911:7;;38886:32;38929:9;38924:138;38948:7;:14;;;;38944:1;:18;38924:138;;;39011:1;38982:6;:18;38989:7;38997:1;38989:10;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38982:18;;;;;;;;;;;;;;;:25;;;:30;38978:44;;39014:8;;38978:44;39031:23;39040:7;39048:1;39040:10;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39052:1;39031:8;:23::i;:::-;38924:138;38964:3;;;;;:::i;:::-;;;;38924:138;;;;39075:7;;39068:14;;;;:::i;:::-;23335:1;38840:248::o:0;38733:101::-;23275:12;:10;:12::i;:::-;23264:23;;:7;:5;:7::i;:::-;:23;;;23256:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;38821:7:::1;38803:15;:25;;;;38733:101:::0;:::o;25724:35::-;;;;:::o;25652:33::-;;;;:::o;25318:46::-;;;;:::o;33049:421::-;33131:1;33119:9;:13;33111:54;;;;;;;;;;;;:::i;:::-;;;;;;;;;33205:1;33188:14;;:18;33172:99;;;;;;;;;;;;:::i;:::-;;;;;;;;;33280:14;33297:9;33280:26;;33333:27;33353:6;33333:15;;:19;;:27;;;;:::i;:::-;33315:15;:45;;;;33386:78;33415:42;33442:14;;33415:22;33430:6;26362;33415:14;;:22;;;;:::i;:::-;:26;;:42;;;;:::i;:::-;33386:16;;:20;;:78;;;;:::i;:::-;33367:16;:97;;;;33049:421;:::o;25369:51::-;;;;:::o;36179:112::-;36243:42;36260:10;36272:12;36243:16;:42::i;:::-;36179:112;:::o;38509:96::-;23275:12;:10;:12::i;:::-;23264:23;;:7;:5;:7::i;:::-;:23;;;23256:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;38595:4:::1;38577:15;;:22;;;;;;;;;;;;;;;;;;38509:96:::0;:::o;36297:85::-;36342:34;36365:10;36342:22;:34::i;:::-;36297:85::o;23695:103::-;23275:12;:10;:12::i;:::-;23264:23;;:7;:5;:7::i;:::-;:23;;;23256:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;23760:30:::1;23787:1;23760:18;:30::i;:::-;23695:103::o:0;25616:31::-;;;;:::o;27525:1998::-;27591:19;27613:10;27591:32;;27692:1;27646:6;:19;27653:11;27646:19;;;;;;;;;;;;;;;:36;;:43;;;;:47;:154;;;;;27729:1;27707:11;:18;:23;:92;;;;27756:6;:19;27763:11;27756:19;;;;;;;;;;;;;;;:36;;:43;;;;27734:11;:18;:65;;27707:92;27646:154;27630:232;;;;;;;;;;;;:::i;:::-;;;;;;;;;27939:26;;27903:6;:19;27910:11;27903:19;;;;;;;;;;;;;;;:33;;;:62;;;;:::i;:::-;27885:15;:80;27869:178;;;;;;;;;;;;:::i;:::-;;;;;;;;;28106:1;28060:6;:19;28067:11;28060:19;;;;;;;;;;;;;;;:36;;:43;;;;:47;28056:95;;;28116:35;28139:11;28116:22;:35::i;:::-;28056:95;28158:19;28188:15;;;;;;;;;;;28158:46;;28237:1;28215:11;:18;:23;28211:1113;;;28249:6;28264:180;28280:6;:19;28287:11;28280:19;;;;;;;;;;;;;;;:36;;:43;;;;28276:1;:47;28264:180;;;28341:11;:24;;;28374:4;28381:11;28394:6;:19;28401:11;28394:19;;;;;;;;;;;;;;;:36;;28431:1;28394:39;;;;;;;;;;;;;;;;;;;;;;;;28341:93;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28325:3;;;;;:::i;:::-;;;;28264:180;;;28459:6;:19;28466:11;28459:19;;;;;;;;;;;;;;;:36;;;28452:43;;;;:::i;:::-;28211:1113;;;;28529:9;28524:793;28548:11;:18;28544:1;:22;28524:793;;;28584:9;28604:187;28620:6;:19;28627:11;28620:19;;;;;;;;;;;;;;;:36;;:43;;;;28616:1;:47;28604:187;;;28705:6;:19;28712:11;28705:19;;;;;;;;;;;;;;;:36;;28742:1;28705:39;;;;;;;;;;;;;;;;;;;;;;;;28687:11;28699:1;28687:14;;;;;;;;;;;;;;;;;;;;;;:57;28683:97;;;28761:5;;28683:97;28665:3;;;;;:::i;:::-;;;;28604:187;;;28813:6;:19;28820:11;28813:19;;;;;;;;;;;;;;;:36;;:43;;;;28809:1;:47;28801:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;28936:1;28890:6;:19;28897:11;28890:19;;;;;;;;;;;;;;;:36;;:43;;;;:47;;;;:::i;:::-;28885:1;:52;28881:348;;;28950:6;:19;28957:11;28950:19;;;;;;;;;;;;;;;:36;;:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28881:348;;;29063:6;:19;29070:11;29063:19;;;;;;;;;;;;;;;:50;;29160:1;29114:6;:19;29121:11;29114:19;;;;;;;;;;;;;;;:36;;:43;;;;:47;;;;:::i;:::-;29063:99;;;;;;;;;;;;;;;;;;;;;;;;29021:6;:19;29028:11;29021:19;;;;;;;;;;;;;;;:36;;29058:1;29021:39;;;;;;;;;;;;;;;;;;;;;;;:141;;;;29175:6;:19;29182:11;29175:19;;;;;;;;;;;;;;;:36;;:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28881:348;29239:11;:24;;;29272:4;29279:11;29292;29304:1;29292:14;;;;;;;;;;;;;;;;;;;;;;29239:68;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28524:793;28568:3;;;;;:::i;:::-;;;;28524:793;;;;28211:1113;29373:82;29405:6;:19;29412:11;29405:19;;;;;;;;;;;;;;;:36;;:43;;;;29373:23;:82::i;:::-;29330:7;:20;29338:11;29330:20;;;;;;;;;;;;;;;:40;;:125;;;;29479:38;29498:11;:18;29479:14;;:18;;:38;;;;:::i;:::-;29462:14;:55;;;;27525:1998;;;:::o;39094:327::-;23275:12;:10;:12::i;:::-;23264:23;;:7;:5;:7::i;:::-;:23;;;23256:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;39143:12:::1;:10;:12::i;:::-;39162:20;39192:16;;;;;;;;;;;39162:47;;39216:14;39233:13;:23;;;39265:4;39233:38;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;39216:55;;39278:13;:22;;;39301:7;:5;:7::i;:::-;39310:6;39278:39;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;39333:21;39324:30;;39369:7;:5;:7::i;:::-;39361:21;;39391:6;39404:5;39361:54;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23335:1;;39094:327::o:0;37744:112::-;37804:7;37827:6;:12;37834:4;37827:12;;;;;;;;;;;;;;;:23;;;37820:30;;37744:112;;;:::o;23044:87::-;23090:7;23117:6;;;;;;;;;;;23110:13;;23044:87;:::o;33476:824::-;33573:1;33564:6;:10;33556:51;;;;;;;;;;;;:::i;:::-;;;;;;;;;33651:1;33630:18;;:22;33614:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;33778:19;33807:9;33778:39;;33824:12;:25;;;33850:10;33870:4;33877:6;33824:60;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;33972:1;33940:17;:28;33958:9;33940:28;;;;;;;;;;;;;;;;:33;33936:66;;;33975:11;33992:9;33975:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33936:66;34079:40;34112:6;34079:17;:28;34097:9;34079:28;;;;;;;;;;;;;;;;:32;;:40;;;;:::i;:::-;34048:17;:28;34066:9;34048:28;;;;;;;;;;;;;;;:71;;;;34197:97;34241:46;34268:18;;34241:22;34256:6;26362;34241:14;;:22;;;;:::i;:::-;:26;;:46;;;;:::i;:::-;34197:20;:31;34218:9;34197:31;;;;;;;;;;;;;;;;:35;;:97;;;;:::i;:::-;34163:20;:31;34184:9;34163:31;;;;;;;;;;;;;;;:131;;;;33476:824;;;:::o;38143:102::-;23275:12;:10;:12::i;:::-;23264:23;;:7;:5;:7::i;:::-;:23;;;23256:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;38233:6:::1;38214:16;;:25;;;;;;;;;;;;;;;;;;38143:102:::0;:::o;25507:37::-;;;;:::o;26641:79::-;26688:26;26695:10;26707:6;26688;:26::i;:::-;26641:79;:::o;25472:30::-;;;;;;;;;;;;;:::o;26080:::-;;;;:::o;37981:156::-;38067:16;38102:6;:12;38109:4;38102:12;;;;;;;;;;;;;;;:29;;38095:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37981:156;;;:::o;25436:31::-;;;;;;;;;;;;;:::o;36388:473::-;36467:7;36537:1;36490:6;:19;36497:11;36490:19;;;;;;;;;;;;;;;:36;;:43;;;;:48;36486:62;;;36547:1;36540:8;;;;36486:62;36557:21;36581:82;36613:6;:19;36620:11;36613:19;;;;;;;;;;;;;;;:36;;:43;;;;36581:23;:82::i;:::-;36557:106;;36670:23;36696:7;:20;36704:11;36696:20;;;;;;;;;;;;;;;:40;;;36670:66;;36764:15;36747:13;:32;36743:63;;36797:1;36790:8;;;;;;36743:63;36821:34;36839:15;36821:13;:17;;:34;;;;:::i;:::-;36814:41;;;;36388:473;;;;:::o;36056:117::-;36105:7;36128;:19;36136:10;36128:19;;;;;;;;;;;;;;;:39;;;36121:46;;36056:117;:::o;26325:43::-;26362:6;26325:43;:::o;25576:35::-;;;;:::o;26539:96::-;26587:16;26618:11;26611:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26539:96;:::o;35908:142::-;35974:7;35997;:19;36005:10;35997:19;;;;;;;;;;;;;;;:33;;:47;36031:12;35997:47;;;;;;;;;;;;;;;;35990:54;;35908:142;;;:::o;26251:31::-;;;;:::o;37862:113::-;37927:7;37950:6;:12;37957:4;37950:12;;;;;;;;;;;;;;;:19;;;37943:26;;37862:113;;;:::o;38611:116::-;23275:12;:10;:12::i;:::-;23264:23;;:7;:5;:7::i;:::-;:23;;;23256:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;38710:11:::1;38689:18;:32;;;;38611:116:::0;:::o;23953:201::-;23275:12;:10;:12::i;:::-;23264:23;;:7;:5;:7::i;:::-;:23;;;23256:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;24062:1:::1;24042:22;;:8;:22;;;;24034:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;24118:28;24137:8;24118:18;:28::i;:::-;23953:201:::0;:::o;25690:29::-;;;;:::o;26051:24::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;34306:708::-;34375:21;34399:25;34412:11;34399:12;:25::i;:::-;34375:49;;34452:1;34435:13;:18;34431:38;;;34462:7;;;34431:38;34518:59;34563:13;34518:7;:20;34526:11;34518:20;;;;;;;;;;;;;;;:40;;;:44;;:59;;;;:::i;:::-;34475:7;:20;34483:11;34475:20;;;;;;;;;;;;;;;:40;;:102;;;;34627:68;34651:6;:19;34658:11;34651:19;;;;;;;;;;;;;;;:36;;:43;;;;34627:23;:68::i;:::-;34584:7;:20;34592:11;34584:20;;;;;;;;;;;;;;;:40;;:111;;;;34702:21;34726;34702:45;;34755:9;34778:11;34770:25;;34804:13;34770:53;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34754:69;;;34838:4;34830:46;;;;;;;;;;;;:::i;:::-;;;;;;;;;34940:13;34924;:29;;;;:::i;:::-;34899:21;:54;;34883:125;;;;;;;;;;;;:::i;:::-;;;;;;;;;34306:708;;;;;:::o;7951:98::-;8009:7;8040:1;8036;:5;;;;:::i;:::-;8029:12;;7951:98;;;;:::o;37577:161::-;37663:7;37689:43;26362:6;37689:27;37699:16;;37689:5;:9;;:27;;;;:::i;:::-;:31;;:43;;;;:::i;:::-;37682:50;;37577:161;;;:::o;37374:197::-;37481:7;37507:58;26362:6;37507:42;37517:20;:31;37538:9;37517:31;;;;;;;;;;;;;;;;37507:5;:9;;:42;;;;:::i;:::-;:46;;:58;;;;:::i;:::-;37500:65;;37374:197;;;;:::o;8332:98::-;8390:7;8421:1;8417;:5;;;;:::i;:::-;8410:12;;8332:98;;;;:::o;21768:::-;21821:7;21848:10;21841:17;;21768:98;:::o;31507:1433::-;31636:1;31611:6;:15;31618:7;31611:15;;;;;;;;;;;;;;;:22;;;:26;:102;;;;;31668:1;31651:13;:18;:61;;;;31690:6;:15;31697:7;31690:15;;;;;;;;;;;;;;;:22;;;31673:13;:39;;31651:61;31611:102;31595:180;;;;;;;;;;;;:::i;:::-;;;;;;;;;31845:23;;31816:6;:15;31823:7;31816:15;;;;;;;;;;;;;;;:26;;;:52;;;;:::i;:::-;31798:15;:70;31782:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;31968:9;31963:151;31987:11;:18;;;;31983:1;:22;31963:151;;;32021:20;32044:11;32056:1;32044:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32021:37;;32067:39;32084:7;32093:12;32067:16;:39::i;:::-;31963:151;32007:3;;;;;:::i;:::-;;;;31963:151;;;;32122:20;32152:16;;;;;;;;;;;32122:47;;32176:30;32226:1;32209:13;:18;:73;;32269:13;32209:73;;;32237:6;:15;32244:7;32237:15;;;;;;;;;;;;;;;:22;;;32209:73;32176:106;;32291:18;32312:22;32291:43;;32364:1;32347:13;:18;32343:59;;;32376:16;;:18;;;;;;;;;:::i;:::-;;;;;;32343:59;32410:13;:22;;;32433:7;32442:10;32410:43;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;32485:36;32510:10;32485:20;;:24;;:36;;;;:::i;:::-;32462:20;:59;;;;32549:46;32572:22;32549:18;;:22;;:46;;;;:::i;:::-;32528:18;:67;;;;32632:10;32602:6;:15;32609:7;32602:15;;;;;;;;;;;;;;;:26;;;:40;;;;;;;:::i;:::-;;;;;;;;32675:22;32649:6;:15;32656:7;32649:15;;;;;;;;;;;;;;;:22;;;:48;;;;;;;:::i;:::-;;;;;;;;32709:9;32704:231;32728:11;:18;;;;32724:1;:22;32704:231;;;32762:14;32779:11;32791:1;32779:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32762:31;;32843:84;32879:6;:15;32886:7;32879:15;;;;;;;;;;;;;;;:22;;;32912:6;32843:25;:84::i;:::-;32802:7;:16;32810:7;32802:16;;;;;;;;;;;;;;;:30;;:38;32833:6;32802:38;;;;;;;;;;;;;;;:125;;;;32704:231;32748:3;;;;;:::i;:::-;;;;32704:231;;;;31507:1433;;;;;:::o;8689:98::-;8747:7;8778:1;8774;:5;;;;:::i;:::-;8767:12;;8689:98;;;;:::o;9088:::-;9146:7;9177:1;9173;:5;;;;:::i;:::-;9166:12;;9088:98;;;;:::o;35020:882::-;35284:1;35254:6;:19;35261:11;35254:19;;;;;;;;;;;;;;;:26;;;:31;35250:60;;;35296:7;;35250:60;35318:14;35335:41;35350:11;35363:12;35335:14;:41::i;:::-;35318:58;;35397:1;35387:6;:11;35383:24;;;35400:7;;;35383:24;35466:76;35535:6;35466:7;:20;35474:11;35466:20;;;;;;;;;;;;;;;:42;;:56;35509:12;35466:56;;;;;;;;;;;;;;;;:68;;:76;;;;:::i;:::-;35415:7;:20;35423:11;35415:20;;;;;;;;;;;;;;;:34;;:48;35450:12;35415:48;;;;;;;;;;;;;;;:127;;;;35600:67;35626:6;:19;35633:11;35626:19;;;;;;;;;;;;;;;:26;;;35654:12;35600:25;:67::i;:::-;35549:7;:20;35557:11;35549:20;;;;;;;;;;;;;;;:34;;:48;35584:12;35549:48;;;;;;;;;;;;;;;:118;;;;35707:15;35674:7;:20;35682:11;35674:20;;;;;;;;;;;;;;;:30;;:48;;;;35744:1;35735:6;:10;35731:166;;;35775:28;35796:6;35775:16;;:20;;:28;;;;:::i;:::-;35756:16;:47;;;;35812:11;35833:12;35812:34;;35855:4;:13;;;35869:11;35882:6;35855:34;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;35731:166;;35020:882;;;;:::o;24314:191::-;24388:16;24407:6;;;;;;;;;;;24388:25;;24433:8;24424:6;;:17;;;;;;;;;;;;;;;;;;24488:8;24457:40;;24478:8;24457:40;;;;;;;;;;;;24314:191;;:::o;29529:1972::-;29630:1;29601:6;:19;29608:11;29601:19;;;;;;;;;;;;;;;:26;;;:30;29597:205;;;29647:9;29642:153;29666:11;:18;;;;29662:1;:22;29642:153;;;29702:16;29721:11;29733:1;29721:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29702:33;;29746:39;29763:11;29776:8;29746:16;:39::i;:::-;29642:153;29686:3;;;;;:::i;:::-;;;;29642:153;;;;29597:205;29810:20;29840:16;;;;;;;;;;;29810:47;;29864:19;29896:1;29886:6;:11;:73;;29953:6;29886:73;;;29907:13;:23;;;29931:11;29907:36;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;29886:73;29864:95;;29966:20;29989:6;:19;29996:11;29989:19;;;;;;;;;;;;;;;:26;;;29966:49;;30384:22;30409:11;30384:36;;30429:26;30458:13;:23;;;30490:4;30458:38;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;30429:67;;30503:13;:26;;;30530:11;30551:4;30558:11;30503:67;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;30594:76;30645:18;30594:13;:23;;;30626:4;30594:38;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:42;;:76;;;;:::i;:::-;30577:93;;30679:26;30708:50;30743:14;30708:6;:19;30715:11;30708:19;;;;;;;;;;;;;;;:30;;;:34;;:50;;;;:::i;:::-;30679:79;;30790:40;30815:14;30790:20;;:24;;:40;;;;:::i;:::-;30767:20;:63;;;;30858:92;30923:18;30858:50;30881:6;:19;30888:11;30881:19;;;;;;;;;;;;;;;:26;;;30858:18;;:22;;:50;;;;:::i;:::-;:54;;:92;;;;:::i;:::-;30837:18;:113;;;;30991:14;30957:6;:19;30964:11;30957:19;;;;;;;;;;;;;;;:30;;;:48;;;;;;;:::i;:::-;;;;;;;;31041:18;31012:6;:19;31019:11;31012:19;;;;;;;;;;;;;;;:26;;:47;;;;31099:15;31066:6;:19;31073:11;31066:19;;;;;;;;;;;;;;;:30;;:48;;;;31141:1;31125:12;:17;:51;;;;;31175:1;31146:6;:19;31153:11;31146:19;;;;;;;;;;;;;;;:26;;;:30;31125:51;31121:92;;;31187:16;;:18;;;;;;;;;:::i;:::-;;;;;;31121:92;31224:9;31219:245;31243:11;:18;;;;31239:1;:22;31219:245;;;31277:16;31296:11;31308:1;31296:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31277:33;;31366:90;31402:6;:19;31409:11;31402:19;;;;;;;;;;;;;;;:26;;;31439:8;31366:25;:90::i;:::-;31319:7;:20;31327:11;31319:20;;;;;;;;;;;;;;;:34;;:44;31354:8;31319:44;;;;;;;;;;;;;;;:137;;;;31219:245;31263:3;;;;;:::i;:::-;;;;31219:245;;;;31470:7;31483:11;31470:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29529:1972;;;;;;;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;24:655:1:-;120:5;145:81;161:64;218:6;161:64;:::i;:::-;145:81;:::i;:::-;136:90;;246:5;275:6;268:5;261:21;309:4;302:5;298:16;291:23;;335:6;385:3;377:4;369:6;365:17;360:3;356:27;353:36;350:2;;;414:1;411;404:12;350:2;450:1;435:238;460:6;457:1;454:13;435:238;;;528:3;557:37;590:3;578:10;557:37;:::i;:::-;552:3;545:50;624:4;619:3;615:14;608:21;;658:4;653:3;649:14;642:21;;495:178;482:1;479;475:9;470:14;;435:238;;;439:14;126:553;;;;;;;:::o;685:139::-;731:5;769:6;756:20;747:29;;785:33;812:5;785:33;:::i;:::-;737:87;;;;:::o;847:303::-;918:5;967:3;960:4;952:6;948:17;944:27;934:2;;985:1;982;975:12;934:2;1025:6;1012:20;1050:94;1140:3;1132:6;1125:4;1117:6;1113:17;1050:94;:::i;:::-;1041:103;;924:226;;;;;:::o;1156:137::-;1210:5;1241:6;1235:13;1226:22;;1257:30;1281:5;1257:30;:::i;:::-;1216:77;;;;:::o;1299:139::-;1345:5;1383:6;1370:20;1361:29;;1399:33;1426:5;1399:33;:::i;:::-;1351:87;;;;:::o;1444:143::-;1501:5;1532:6;1526:13;1517:22;;1548:33;1575:5;1548:33;:::i;:::-;1507:80;;;;:::o;1593:262::-;1652:6;1701:2;1689:9;1680:7;1676:23;1672:32;1669:2;;;1717:1;1714;1707:12;1669:2;1760:1;1785:53;1830:7;1821:6;1810:9;1806:22;1785:53;:::i;:::-;1775:63;;1731:117;1659:196;;;;:::o;1861:407::-;1929:6;1937;1986:2;1974:9;1965:7;1961:23;1957:32;1954:2;;;2002:1;1999;1992:12;1954:2;2045:1;2070:53;2115:7;2106:6;2095:9;2091:22;2070:53;:::i;:::-;2060:63;;2016:117;2172:2;2198:53;2243:7;2234:6;2223:9;2219:22;2198:53;:::i;:::-;2188:63;;2143:118;1944:324;;;;;:::o;2274:407::-;2342:6;2350;2399:2;2387:9;2378:7;2374:23;2370:32;2367:2;;;2415:1;2412;2405:12;2367:2;2458:1;2483:53;2528:7;2519:6;2508:9;2504:22;2483:53;:::i;:::-;2473:63;;2429:117;2585:2;2611:53;2656:7;2647:6;2636:9;2632:22;2611:53;:::i;:::-;2601:63;;2556:118;2357:324;;;;;:::o;2687:405::-;2771:6;2820:2;2808:9;2799:7;2795:23;2791:32;2788:2;;;2836:1;2833;2826:12;2788:2;2907:1;2896:9;2892:17;2879:31;2937:18;2929:6;2926:30;2923:2;;;2969:1;2966;2959:12;2923:2;2997:78;3067:7;3058:6;3047:9;3043:22;2997:78;:::i;:::-;2987:88;;2850:235;2778:314;;;;:::o;3098:278::-;3165:6;3214:2;3202:9;3193:7;3189:23;3185:32;3182:2;;;3230:1;3227;3220:12;3182:2;3273:1;3298:61;3351:7;3342:6;3331:9;3327:22;3298:61;:::i;:::-;3288:71;;3244:125;3172:204;;;;:::o;3382:262::-;3441:6;3490:2;3478:9;3469:7;3465:23;3461:32;3458:2;;;3506:1;3503;3496:12;3458:2;3549:1;3574:53;3619:7;3610:6;3599:9;3595:22;3574:53;:::i;:::-;3564:63;;3520:117;3448:196;;;;:::o;3650:284::-;3720:6;3769:2;3757:9;3748:7;3744:23;3740:32;3737:2;;;3785:1;3782;3775:12;3737:2;3828:1;3853:64;3909:7;3900:6;3889:9;3885:22;3853:64;:::i;:::-;3843:74;;3799:128;3727:207;;;;:::o;3940:179::-;4009:10;4030:46;4072:3;4064:6;4030:46;:::i;:::-;4108:4;4103:3;4099:14;4085:28;;4020:99;;;;:::o;4125:179::-;4194:10;4215:46;4257:3;4249:6;4215:46;:::i;:::-;4293:4;4288:3;4284:14;4270:28;;4205:99;;;;:::o;4310:108::-;4387:24;4405:5;4387:24;:::i;:::-;4382:3;4375:37;4365:53;;:::o;4424:118::-;4511:24;4529:5;4511:24;:::i;:::-;4506:3;4499:37;4489:53;;:::o;4578:732::-;4697:3;4726:54;4774:5;4726:54;:::i;:::-;4796:86;4875:6;4870:3;4796:86;:::i;:::-;4789:93;;4906:56;4956:5;4906:56;:::i;:::-;4985:7;5016:1;5001:284;5026:6;5023:1;5020:13;5001:284;;;5102:6;5096:13;5129:63;5188:3;5173:13;5129:63;:::i;:::-;5122:70;;5215:60;5268:6;5215:60;:::i;:::-;5205:70;;5061:224;5048:1;5045;5041:9;5036:14;;5001:284;;;5005:14;5301:3;5294:10;;4702:608;;;;;;;:::o;5346:732::-;5465:3;5494:54;5542:5;5494:54;:::i;:::-;5564:86;5643:6;5638:3;5564:86;:::i;:::-;5557:93;;5674:56;5724:5;5674:56;:::i;:::-;5753:7;5784:1;5769:284;5794:6;5791:1;5788:13;5769:284;;;5870:6;5864:13;5897:63;5956:3;5941:13;5897:63;:::i;:::-;5890:70;;5983:60;6036:6;5983:60;:::i;:::-;5973:70;;5829:224;5816:1;5813;5809:9;5804:14;;5769:284;;;5773:14;6069:3;6062:10;;5470:608;;;;;;;:::o;6084:366::-;6226:3;6247:67;6311:2;6306:3;6247:67;:::i;:::-;6240:74;;6323:93;6412:3;6323:93;:::i;:::-;6441:2;6436:3;6432:12;6425:19;;6230:220;;;:::o;6456:366::-;6598:3;6619:67;6683:2;6678:3;6619:67;:::i;:::-;6612:74;;6695:93;6784:3;6695:93;:::i;:::-;6813:2;6808:3;6804:12;6797:19;;6602:220;;;:::o;6828:366::-;6970:3;6991:67;7055:2;7050:3;6991:67;:::i;:::-;6984:74;;7067:93;7156:3;7067:93;:::i;:::-;7185:2;7180:3;7176:12;7169:19;;6974:220;;;:::o;7200:366::-;7342:3;7363:67;7427:2;7422:3;7363:67;:::i;:::-;7356:74;;7439:93;7528:3;7439:93;:::i;:::-;7557:2;7552:3;7548:12;7541:19;;7346:220;;;:::o;7572:366::-;7714:3;7735:67;7799:2;7794:3;7735:67;:::i;:::-;7728:74;;7811:93;7900:3;7811:93;:::i;:::-;7929:2;7924:3;7920:12;7913:19;;7718:220;;;:::o;7944:366::-;8086:3;8107:67;8171:2;8166:3;8107:67;:::i;:::-;8100:74;;8183:93;8272:3;8183:93;:::i;:::-;8301:2;8296:3;8292:12;8285:19;;8090:220;;;:::o;8316:366::-;8458:3;8479:67;8543:2;8538:3;8479:67;:::i;:::-;8472:74;;8555:93;8644:3;8555:93;:::i;:::-;8673:2;8668:3;8664:12;8657:19;;8462:220;;;:::o;8688:365::-;8830:3;8851:66;8915:1;8910:3;8851:66;:::i;:::-;8844:73;;8926:93;9015:3;8926:93;:::i;:::-;9044:2;9039:3;9035:12;9028:19;;8834:219;;;:::o;9059:398::-;9218:3;9239:83;9320:1;9315:3;9239:83;:::i;:::-;9232:90;;9331:93;9420:3;9331:93;:::i;:::-;9449:1;9444:3;9440:11;9433:18;;9222:235;;;:::o;9463:366::-;9605:3;9626:67;9690:2;9685:3;9626:67;:::i;:::-;9619:74;;9702:93;9791:3;9702:93;:::i;:::-;9820:2;9815:3;9811:12;9804:19;;9609:220;;;:::o;9835:366::-;9977:3;9998:67;10062:2;10057:3;9998:67;:::i;:::-;9991:74;;10074:93;10163:3;10074:93;:::i;:::-;10192:2;10187:3;10183:12;10176:19;;9981:220;;;:::o;10207:108::-;10284:24;10302:5;10284:24;:::i;:::-;10279:3;10272:37;10262:53;;:::o;10321:118::-;10408:24;10426:5;10408:24;:::i;:::-;10403:3;10396:37;10386:53;;:::o;10445:379::-;10629:3;10651:147;10794:3;10651:147;:::i;:::-;10644:154;;10815:3;10808:10;;10633:191;;;:::o;10830:222::-;10923:4;10961:2;10950:9;10946:18;10938:26;;10974:71;11042:1;11031:9;11027:17;11018:6;10974:71;:::i;:::-;10928:124;;;;:::o;11058:442::-;11207:4;11245:2;11234:9;11230:18;11222:26;;11258:71;11326:1;11315:9;11311:17;11302:6;11258:71;:::i;:::-;11339:72;11407:2;11396:9;11392:18;11383:6;11339:72;:::i;:::-;11421;11489:2;11478:9;11474:18;11465:6;11421:72;:::i;:::-;11212:288;;;;;;:::o;11506:332::-;11627:4;11665:2;11654:9;11650:18;11642:26;;11678:71;11746:1;11735:9;11731:17;11722:6;11678:71;:::i;:::-;11759:72;11827:2;11816:9;11812:18;11803:6;11759:72;:::i;:::-;11632:206;;;;;:::o;11844:373::-;11987:4;12025:2;12014:9;12010:18;12002:26;;12074:9;12068:4;12064:20;12060:1;12049:9;12045:17;12038:47;12102:108;12205:4;12196:6;12102:108;:::i;:::-;12094:116;;11992:225;;;;:::o;12223:373::-;12366:4;12404:2;12393:9;12389:18;12381:26;;12453:9;12447:4;12443:20;12439:1;12428:9;12424:17;12417:47;12481:108;12584:4;12575:6;12481:108;:::i;:::-;12473:116;;12371:225;;;;:::o;12602:419::-;12768:4;12806:2;12795:9;12791:18;12783:26;;12855:9;12849:4;12845:20;12841:1;12830:9;12826:17;12819:47;12883:131;13009:4;12883:131;:::i;:::-;12875:139;;12773:248;;;:::o;13027:419::-;13193:4;13231:2;13220:9;13216:18;13208:26;;13280:9;13274:4;13270:20;13266:1;13255:9;13251:17;13244:47;13308:131;13434:4;13308:131;:::i;:::-;13300:139;;13198:248;;;:::o;13452:419::-;13618:4;13656:2;13645:9;13641:18;13633:26;;13705:9;13699:4;13695:20;13691:1;13680:9;13676:17;13669:47;13733:131;13859:4;13733:131;:::i;:::-;13725:139;;13623:248;;;:::o;13877:419::-;14043:4;14081:2;14070:9;14066:18;14058:26;;14130:9;14124:4;14120:20;14116:1;14105:9;14101:17;14094:47;14158:131;14284:4;14158:131;:::i;:::-;14150:139;;14048:248;;;:::o;14302:419::-;14468:4;14506:2;14495:9;14491:18;14483:26;;14555:9;14549:4;14545:20;14541:1;14530:9;14526:17;14519:47;14583:131;14709:4;14583:131;:::i;:::-;14575:139;;14473:248;;;:::o;14727:419::-;14893:4;14931:2;14920:9;14916:18;14908:26;;14980:9;14974:4;14970:20;14966:1;14955:9;14951:17;14944:47;15008:131;15134:4;15008:131;:::i;:::-;15000:139;;14898:248;;;:::o;15152:419::-;15318:4;15356:2;15345:9;15341:18;15333:26;;15405:9;15399:4;15395:20;15391:1;15380:9;15376:17;15369:47;15433:131;15559:4;15433:131;:::i;:::-;15425:139;;15323:248;;;:::o;15577:419::-;15743:4;15781:2;15770:9;15766:18;15758:26;;15830:9;15824:4;15820:20;15816:1;15805:9;15801:17;15794:47;15858:131;15984:4;15858:131;:::i;:::-;15850:139;;15748:248;;;:::o;16002:419::-;16168:4;16206:2;16195:9;16191:18;16183:26;;16255:9;16249:4;16245:20;16241:1;16230:9;16226:17;16219:47;16283:131;16409:4;16283:131;:::i;:::-;16275:139;;16173:248;;;:::o;16427:419::-;16593:4;16631:2;16620:9;16616:18;16608:26;;16680:9;16674:4;16670:20;16666:1;16655:9;16651:17;16644:47;16708:131;16834:4;16708:131;:::i;:::-;16700:139;;16598:248;;;:::o;16852:222::-;16945:4;16983:2;16972:9;16968:18;16960:26;;16996:71;17064:1;17053:9;17049:17;17040:6;16996:71;:::i;:::-;16950:124;;;;:::o;17080:442::-;17229:4;17267:2;17256:9;17252:18;17244:26;;17280:71;17348:1;17337:9;17333:17;17324:6;17280:71;:::i;:::-;17361:72;17429:2;17418:9;17414:18;17405:6;17361:72;:::i;:::-;17443;17511:2;17500:9;17496:18;17487:6;17443:72;:::i;:::-;17234:288;;;;;;:::o;17528:129::-;17562:6;17589:20;;:::i;:::-;17579:30;;17618:33;17646:4;17638:6;17618:33;:::i;:::-;17569:88;;;:::o;17663:75::-;17696:6;17729:2;17723:9;17713:19;;17703:35;:::o;17744:311::-;17821:4;17911:18;17903:6;17900:30;17897:2;;;17933:18;;:::i;:::-;17897:2;17983:4;17975:6;17971:17;17963:25;;18043:4;18037;18033:15;18025:23;;17826:229;;;:::o;18061:132::-;18128:4;18151:3;18143:11;;18181:4;18176:3;18172:14;18164:22;;18133:60;;;:::o;18199:132::-;18266:4;18289:3;18281:11;;18319:4;18314:3;18310:14;18302:22;;18271:60;;;:::o;18337:114::-;18404:6;18438:5;18432:12;18422:22;;18411:40;;;:::o;18457:114::-;18524:6;18558:5;18552:12;18542:22;;18531:40;;;:::o;18577:113::-;18647:4;18679;18674:3;18670:14;18662:22;;18652:38;;;:::o;18696:113::-;18766:4;18798;18793:3;18789:14;18781:22;;18771:38;;;:::o;18815:184::-;18914:11;18948:6;18943:3;18936:19;18988:4;18983:3;18979:14;18964:29;;18926:73;;;;:::o;19005:184::-;19104:11;19138:6;19133:3;19126:19;19178:4;19173:3;19169:14;19154:29;;19116:73;;;;:::o;19195:147::-;19296:11;19333:3;19318:18;;19308:34;;;;:::o;19348:169::-;19432:11;19466:6;19461:3;19454:19;19506:4;19501:3;19497:14;19482:29;;19444:73;;;;:::o;19523:305::-;19563:3;19582:20;19600:1;19582:20;:::i;:::-;19577:25;;19616:20;19634:1;19616:20;:::i;:::-;19611:25;;19770:1;19702:66;19698:74;19695:1;19692:81;19689:2;;;19776:18;;:::i;:::-;19689:2;19820:1;19817;19813:9;19806:16;;19567:261;;;;:::o;19834:185::-;19874:1;19891:20;19909:1;19891:20;:::i;:::-;19886:25;;19925:20;19943:1;19925:20;:::i;:::-;19920:25;;19964:1;19954:2;;19969:18;;:::i;:::-;19954:2;20011:1;20008;20004:9;19999:14;;19876:143;;;;:::o;20025:348::-;20065:7;20088:20;20106:1;20088:20;:::i;:::-;20083:25;;20122:20;20140:1;20122:20;:::i;:::-;20117:25;;20310:1;20242:66;20238:74;20235:1;20232:81;20227:1;20220:9;20213:17;20209:105;20206:2;;;20317:18;;:::i;:::-;20206:2;20365:1;20362;20358:9;20347:20;;20073:300;;;;:::o;20379:191::-;20419:4;20439:20;20457:1;20439:20;:::i;:::-;20434:25;;20473:20;20491:1;20473:20;:::i;:::-;20468:25;;20512:1;20509;20506:8;20503:2;;;20517:18;;:::i;:::-;20503:2;20562:1;20559;20555:9;20547:17;;20424:146;;;;:::o;20576:96::-;20613:7;20642:24;20660:5;20642:24;:::i;:::-;20631:35;;20621:51;;;:::o;20678:90::-;20712:7;20755:5;20748:13;20741:21;20730:32;;20720:48;;;:::o;20774:126::-;20811:7;20851:42;20844:5;20840:54;20829:65;;20819:81;;;:::o;20906:77::-;20943:7;20972:5;20961:16;;20951:32;;;:::o;20989:171::-;21028:3;21051:24;21069:5;21051:24;:::i;:::-;21042:33;;21097:4;21090:5;21087:15;21084:2;;;21105:18;;:::i;:::-;21084:2;21152:1;21145:5;21141:13;21134:20;;21032:128;;;:::o;21166:281::-;21249:27;21271:4;21249:27;:::i;:::-;21241:6;21237:40;21379:6;21367:10;21364:22;21343:18;21331:10;21328:34;21325:62;21322:2;;;21390:18;;:::i;:::-;21322:2;21430:10;21426:2;21419:22;21209:238;;;:::o;21453:233::-;21492:3;21515:24;21533:5;21515:24;:::i;:::-;21506:33;;21561:66;21554:5;21551:77;21548:2;;;21631:18;;:::i;:::-;21548:2;21678:1;21671:5;21667:13;21660:20;;21496:190;;;:::o;21692:180::-;21740:77;21737:1;21730:88;21837:4;21834:1;21827:15;21861:4;21858:1;21851:15;21878:180;21926:77;21923:1;21916:88;22023:4;22020:1;22013:15;22047:4;22044:1;22037:15;22064:180;22112:77;22109:1;22102:88;22209:4;22206:1;22199:15;22233:4;22230:1;22223:15;22250:102;22291:6;22342:2;22338:7;22333:2;22326:5;22322:14;22318:28;22308:38;;22298:54;;;:::o;22358:179::-;22498:31;22494:1;22486:6;22482:14;22475:55;22464:73;:::o;22543:225::-;22683:34;22679:1;22671:6;22667:14;22660:58;22752:8;22747:2;22739:6;22735:15;22728:33;22649:119;:::o;22774:251::-;22914:34;22910:1;22902:6;22898:14;22891:58;22983:34;22978:2;22970:6;22966:15;22959:59;22880:145;:::o;23031:178::-;23171:30;23167:1;23159:6;23155:14;23148:54;23137:72;:::o;23215:234::-;23355:34;23351:1;23343:6;23339:14;23332:58;23424:17;23419:2;23411:6;23407:15;23400:42;23321:128;:::o;23455:223::-;23595:34;23591:1;23583:6;23579:14;23572:58;23664:6;23659:2;23651:6;23647:15;23640:31;23561:117;:::o;23684:182::-;23824:34;23820:1;23812:6;23808:14;23801:58;23790:76;:::o;23872:159::-;24012:11;24008:1;24000:6;23996:14;23989:35;23978:53;:::o;24037:114::-;24143:8;:::o;24157:231::-;24297:34;24293:1;24285:6;24281:14;24274:58;24366:14;24361:2;24353:6;24349:15;24342:39;24263:125;:::o;24394:224::-;24534:34;24530:1;24522:6;24518:14;24511:58;24603:7;24598:2;24590:6;24586:15;24579:32;24500:118;:::o;24624:122::-;24697:24;24715:5;24697:24;:::i;:::-;24690:5;24687:35;24677:2;;24736:1;24733;24726:12;24677:2;24667:79;:::o;24752:116::-;24822:21;24837:5;24822:21;:::i;:::-;24815:5;24812:32;24802:2;;24858:1;24855;24848:12;24802:2;24792:76;:::o;24874:122::-;24947:24;24965:5;24947:24;:::i;:::-;24940:5;24937:35;24927:2;;24986:1;24983;24976:12;24927:2;24917:79;:::o
Swarm Source
ipfs://09884d441b43f01998f9aa2e22d0ede414f6765f66f61046b1973d9c699180fb
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|---|---|---|---|---|
ETH | 100.00% | $0.00056 | 785,560.4514 | $439.74 |
Loading...
Loading
[ 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.