Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 554 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Unstake | 12610622 | 1398 days ago | IN | 0 ETH | 0.00216316 | ||||
Unstake | 12529473 | 1411 days ago | IN | 0 ETH | 0.00476779 | ||||
Unstake | 12509508 | 1414 days ago | IN | 0 ETH | 0.0064895 | ||||
Unstake | 12346413 | 1439 days ago | IN | 0 ETH | 0.0059269 | ||||
Unstake | 12013558 | 1490 days ago | IN | 0 ETH | 0.02986388 | ||||
Unstake | 11882716 | 1510 days ago | IN | 0 ETH | 0.04848988 | ||||
Unstake | 11846163 | 1516 days ago | IN | 0 ETH | 0.03975122 | ||||
Unstake | 11753752 | 1530 days ago | IN | 0 ETH | 0.01640232 | ||||
Unstake | 11749388 | 1531 days ago | IN | 0 ETH | 0.01937988 | ||||
Unstake | 11743516 | 1532 days ago | IN | 0 ETH | 0.01669718 | ||||
Unstake | 11721051 | 1535 days ago | IN | 0 ETH | 0.01744382 | ||||
Unstake | 11657274 | 1545 days ago | IN | 0 ETH | 0.01207348 | ||||
Unstake | 11656209 | 1545 days ago | IN | 0 ETH | 0.01016739 | ||||
Unstake | 11638300 | 1548 days ago | IN | 0 ETH | 0.01404352 | ||||
Unstake | 11613725 | 1552 days ago | IN | 0 ETH | 0.03382575 | ||||
Unstake | 11560943 | 1560 days ago | IN | 0 ETH | 0.02394927 | ||||
Unstake | 11551242 | 1561 days ago | IN | 0 ETH | 0.01596682 | ||||
Unstake | 11526926 | 1565 days ago | IN | 0 ETH | 0.01271381 | ||||
Unstake | 11511982 | 1567 days ago | IN | 0 ETH | 0.01376977 | ||||
Unstake | 11502684 | 1569 days ago | IN | 0 ETH | 0.00935694 | ||||
Unstake | 11500050 | 1569 days ago | IN | 0 ETH | 0.02042351 | ||||
Unstake | 11487122 | 1571 days ago | IN | 0 ETH | 0.00834859 | ||||
Unstake | 11464894 | 1574 days ago | IN | 0 ETH | 0.02397 | ||||
Unstake | 11457816 | 1576 days ago | IN | 0 ETH | 0.03502313 | ||||
Unstake | 11455040 | 1576 days ago | IN | 0 ETH | 0.02808865 |
Latest 3 internal transactions
Advanced mode:
Parent Transaction Hash | Method | Block |
From
|
To
|
|||
---|---|---|---|---|---|---|---|
- | 11028988 | 1641 days ago | Contract Creation | 0 ETH | |||
- | 11028988 | 1641 days ago | Contract Creation | 0 ETH | |||
- | 11028988 | 1641 days ago | Contract Creation | 0 ETH |
Loading...
Loading
Contract Name:
TokenGeyser
Compiler Version
v0.5.0+commit.1d4f565a
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2020-10-10 */ // File: openzeppelin-solidity/contracts/math/SafeMath.sol pragma solidity ^0.5.0; /** * @dev Wrappers over Solidity's arithmetic operations with added overflow * checks. * * Arithmetic operations in Solidity wrap on overflow. This can easily result * in bugs, because programmers usually assume that an overflow raises an * error, which is the standard behavior in high level programming languages. * `SafeMath` restores this intuition by reverting the transaction when an * operation overflows. * * Using this library instead of the unchecked operations eliminates an entire * class of bugs, so it's recommended to use it always. */ library SafeMath { /** * @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) { uint256 c = a + b; require(c >= a, "SafeMath: addition overflow"); return c; } /** * @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 sub(a, b, "SafeMath: subtraction overflow"); } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * - Subtraction cannot overflow. * * _Available since v2.4.0._ */ function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b <= a, errorMessage); uint256 c = a - b; return c; } /** * @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) { // 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 0; } uint256 c = a * b; require(c / a == b, "SafeMath: multiplication overflow"); return c; } /** * @dev Returns the integer division of two unsigned integers. Reverts 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) internal pure returns (uint256) { return div(a, b, "SafeMath: division by zero"); } /** * @dev Returns the integer division of two unsigned integers. Reverts 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. * * _Available since v2.4.0._ */ function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { // Solidity only automatically asserts when dividing by 0 require(b > 0, errorMessage); uint256 c = a / b; // assert(a == b * c + a % b); // There is no case in which this doesn't hold return c; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * Reverts 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 mod(a, b, "SafeMath: modulo by zero"); } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * Reverts with custom message 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. * * _Available since v2.4.0._ */ function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b != 0, errorMessage); return a % b; } } // File: openzeppelin-solidity/contracts/token/ERC20/IERC20.sol pragma solidity ^0.5.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. Does not include * the optional functions; to access them see {ERC20Detailed}. */ interface IERC20 { /** * @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 `recipient`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address recipient, 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 `sender` to `recipient` 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 sender, address recipient, uint256 amount) external returns (bool); /** * @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); } // File: openzeppelin-solidity/contracts/GSN/Context.sol pragma solidity ^0.5.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 GSN 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. */ contract Context { // Empty internal constructor, to prevent people from mistakenly deploying // an instance of this contract, which should be used via inheritance. constructor () internal { } // solhint-disable-previous-line no-empty-blocks function _msgSender() internal view returns (address payable) { return msg.sender; } function _msgData() internal view returns (bytes memory) { this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 return msg.data; } } // File: openzeppelin-solidity/contracts/ownership/Ownable.sol pragma solidity ^0.5.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. * * 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. */ 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 () internal { _owner = _msgSender(); emit OwnershipTransferred(address(0), _owner); } /** * @dev Returns the address of the current owner. */ function owner() public view returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(isOwner(), "Ownable: caller is not the owner"); _; } /** * @dev Returns true if the caller is the current owner. */ function isOwner() public view returns (bool) { return _msgSender() == _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 onlyOwner { emit OwnershipTransferred(_owner, address(0)); _owner = 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 onlyOwner { _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). */ function _transferOwnership(address newOwner) internal { require(newOwner != address(0), "Ownable: new owner is the zero address"); emit OwnershipTransferred(_owner, newOwner); _owner = newOwner; } } // File: contracts/IStaking.sol pragma solidity 0.5.0; /** * @title Staking interface, as defined by EIP-900. * @dev https://github.com/ethereum/EIPs/blob/master/EIPS/eip-900.md */ contract IStaking { event Staked(address indexed user, uint256 amount, uint256 total, bytes data); event Unstaked(address indexed user, uint256 amount, uint256 total, bytes data); function stake(uint256 amount, bytes calldata data) external; function stakeFor(address user, uint256 amount, bytes calldata data) external; function unstake(uint256 amount, bytes calldata data) external; function totalStakedFor(address addr) public view returns (uint256); function totalStaked() public view returns (uint256); function token() external view returns (address); /** * @return False. This application does not support staking history. */ function supportsHistory() external pure returns (bool) { return false; } } // File: contracts/TokenPool.sol pragma solidity 0.5.0; /** * @title A simple holder of tokens. * This is a simple contract to hold tokens. It's useful in the case where a separate contract * needs to hold multiple distinct pools of the same token. */ contract TokenPool is Ownable { IERC20 public token; constructor(IERC20 _token) public { token = _token; } function balance() public view returns (uint256) { return token.balanceOf(address(this)); } function transfer(address to, uint256 value) external onlyOwner returns (bool) { return token.transfer(to, value); } function rescueFunds(address tokenToRescue, address to, uint256 amount) external onlyOwner returns (bool) { require(address(token) != tokenToRescue, 'TokenPool: Cannot claim token held by the contract'); return IERC20(tokenToRescue).transfer(to, amount); } } // File: contracts/TokenGeyser.sol pragma solidity 0.5.0; /** * @title Token Geyser * @dev A smart-contract based mechanism to distribute tokens over time, inspired loosely by * Compound and Uniswap. * * Distribution tokens are added to a locked pool in the contract and become unlocked over time * according to a once-configurable unlock schedule. Once unlocked, they are available to be * claimed by users. * * A user may deposit tokens to accrue ownership share over the unlocked pool. This owner share * is a function of the number of tokens deposited as well as the length of time deposited. * Specifically, a user's share of the currently-unlocked pool equals their "deposit-seconds" * divided by the global "deposit-seconds". This aligns the new token distribution with long * term supporters of the project, addressing one of the major drawbacks of simple airdrops. * * More background and motivation available at: * https://github.com/ampleforth/RFCs/blob/master/RFCs/rfc-1.md */ contract TokenGeyser is IStaking, Ownable { using SafeMath for uint256; event Staked(address indexed user, uint256 amount, uint256 total, bytes data); event Unstaked(address indexed user, uint256 amount, uint256 total, bytes data); event TokensClaimed(address indexed user, uint256 amount); event TokensLocked(uint256 amount, uint256 durationSec, uint256 total); // amount: Unlocked tokens, total: Total locked tokens event TokensUnlocked(uint256 amount, uint256 total); TokenPool private _stakingPool; TokenPool private _unlockedPool; TokenPool private _lockedPool; // // Time-bonus params // uint256 public constant BONUS_DECIMALS = 2; uint256 public startBonus = 0; uint256 public bonusPeriodSec = 0; // // Global accounting state // uint256 public totalLockedShares = 0; uint256 public totalStakingShares = 0; uint256 private _totalStakingShareSeconds = 0; uint256 private _lastAccountingTimestampSec = now; uint256 private _maxUnlockSchedules = 0; uint256 private _initialSharesPerToken = 0; // // User accounting state // // Represents a single stake for a user. A user may have multiple. struct Stake { uint256 stakingShares; uint256 timestampSec; } // Caches aggregated values from the User->Stake[] map to save computation. // If lastAccountingTimestampSec is 0, there's no entry for that user. struct UserTotals { uint256 stakingShares; uint256 stakingShareSeconds; uint256 lastAccountingTimestampSec; } // Aggregated staking values per user mapping(address => UserTotals) private _userTotals; // The collection of stakes for each user. Ordered by timestamp, earliest to latest. mapping(address => Stake[]) private _userStakes; // // Locked/Unlocked Accounting state // struct UnlockSchedule { uint256 initialLockedShares; uint256 unlockedShares; uint256 lastUnlockTimestampSec; uint256 endAtSec; uint256 durationSec; } UnlockSchedule[] public unlockSchedules; bool public initialized; /** * @param stakingToken The token users deposit as stake. * @param distributionToken The token users receive as they unstake. * @param maxUnlockSchedules Max number of unlock stages, to guard against hitting gas limit. * @param startBonus_ Starting time bonus, BONUS_DECIMALS fixed point. * e.g. 25% means user gets 25% of max distribution tokens. * @param bonusPeriodSec_ Length of time for bonus to increase linearly to max. * @param initialSharesPerToken Number of shares to mint per staking token on first stake. */ function init(IERC20 stakingToken, IERC20 distributionToken, uint256 maxUnlockSchedules, uint256 startBonus_, uint256 bonusPeriodSec_, uint256 initialSharesPerToken) public { require(!initialized, "Already initialized"); initialized = true; // The start bonus must be some fraction of the max. (i.e. <= 100%) require(startBonus_ <= 10**BONUS_DECIMALS, 'TokenGeyser: start bonus too high'); // If no period is desired, instead set startBonus = 100% // and bonusPeriod to a small value like 1sec. require(bonusPeriodSec_ != 0, 'TokenGeyser: bonus period is zero'); require(initialSharesPerToken > 0, 'TokenGeyser: initialSharesPerToken is zero'); _stakingPool = new TokenPool(stakingToken); _unlockedPool = new TokenPool(distributionToken); _lockedPool = new TokenPool(distributionToken); startBonus = startBonus_; bonusPeriodSec = bonusPeriodSec_; _maxUnlockSchedules = maxUnlockSchedules; _initialSharesPerToken = initialSharesPerToken; } /** * @return The token users deposit as stake. */ function getStakingToken() public view returns (IERC20) { return _stakingPool.token(); } /** * @return The token users receive as they unstake. */ function getDistributionToken() public view returns (IERC20) { assert(_unlockedPool.token() == _lockedPool.token()); return _unlockedPool.token(); } /** * @dev Transfers amount of deposit tokens from the user. * @param amount Number of deposit tokens to stake. * @param data Not used. */ function stake(uint256 amount, bytes calldata data) external { _stakeFor(msg.sender, msg.sender, amount); } /** * @dev Created for compatibility with UniPool staking contract * @param amount Amount to stake */ function stake(uint256 amount) external { _stakeFor(msg.sender, msg.sender, amount); } /** * @dev Transfers amount of deposit tokens from the caller on behalf of user. * @param user User address who gains credit for this stake operation. * @param amount Number of deposit tokens to stake. * @param data Not used. */ function stakeFor(address user, uint256 amount, bytes calldata data) external onlyOwner { _stakeFor(msg.sender, user, amount); } /** * @dev Private implementation of staking methods. * @param staker User address who deposits tokens to stake. * @param beneficiary User address who gains credit for this stake operation. * @param amount Number of deposit tokens to stake. */ function _stakeFor(address staker, address beneficiary, uint256 amount) private { require(amount > 0, 'TokenGeyser: stake amount is zero'); require(beneficiary != address(0), 'TokenGeyser: beneficiary is zero address'); require(totalStakingShares == 0 || totalStaked() > 0, 'TokenGeyser: Invalid state. Staking shares exist, but no staking tokens do'); uint256 mintedStakingShares = (totalStakingShares > 0) ? totalStakingShares.mul(amount).div(totalStaked()) : amount.mul(_initialSharesPerToken); require(mintedStakingShares > 0, 'TokenGeyser: Stake amount is too small'); updateAccounting(); // 1. User Accounting UserTotals storage totals = _userTotals[beneficiary]; totals.stakingShares = totals.stakingShares.add(mintedStakingShares); totals.lastAccountingTimestampSec = now; Stake memory newStake = Stake(mintedStakingShares, now); _userStakes[beneficiary].push(newStake); // 2. Global Accounting totalStakingShares = totalStakingShares.add(mintedStakingShares); // Already set in updateAccounting() // _lastAccountingTimestampSec = now; // interactions require(_stakingPool.token().transferFrom(staker, address(_stakingPool), amount), 'TokenGeyser: transfer into staking pool failed'); emit Staked(beneficiary, amount, totalStakedFor(beneficiary), ""); } /** * @dev Unstakes a certain amount of previously deposited tokens. User also receives their * alotted number of distribution tokens. * @param amount Number of deposit tokens to unstake / withdraw. * @param data Not used. */ function unstake(uint256 amount, bytes calldata data) external { _unstake(amount); } /** * @dev Created for compatibility with UniPool contract * @param amount Number of tokens to withdraw */ function withdraw(uint256 amount) external { _unstake(amount); } /** * @param amount Number of deposit tokens to unstake / withdraw. * @return The total number of distribution tokens that would be rewarded. */ function unstakeQuery(uint256 amount) public returns (uint256) { return _unstake(amount); } /** * @dev Unstakes a certain amount of previously deposited tokens. User also receives their * alotted number of distribution tokens. * @param amount Number of deposit tokens to unstake / withdraw. * @return The total number of distribution tokens rewarded. */ function _unstake(uint256 amount) private returns (uint256) { updateAccounting(); // checks require(amount > 0, 'TokenGeyser: unstake amount is zero'); require(totalStakedFor(msg.sender) >= amount, 'TokenGeyser: unstake amount is greater than total user stakes'); uint256 stakingSharesToBurn = totalStakingShares.mul(amount).div(totalStaked()); require(stakingSharesToBurn > 0, 'TokenGeyser: Unable to unstake amount this small'); // 1. User Accounting UserTotals storage totals = _userTotals[msg.sender]; Stake[] storage accountStakes = _userStakes[msg.sender]; // Redeem from most recent stake and go backwards in time. uint256 stakingShareSecondsToBurn = 0; uint256 sharesLeftToBurn = stakingSharesToBurn; uint256 rewardAmount = 0; while (sharesLeftToBurn > 0) { Stake storage lastStake = accountStakes[accountStakes.length - 1]; uint256 stakeTimeSec = now.sub(lastStake.timestampSec); uint256 newStakingShareSecondsToBurn = 0; if (lastStake.stakingShares <= sharesLeftToBurn) { // fully redeem a past stake newStakingShareSecondsToBurn = lastStake.stakingShares.mul(stakeTimeSec); rewardAmount = computeNewReward(rewardAmount, newStakingShareSecondsToBurn, stakeTimeSec); stakingShareSecondsToBurn = stakingShareSecondsToBurn.add(newStakingShareSecondsToBurn); sharesLeftToBurn = sharesLeftToBurn.sub(lastStake.stakingShares); accountStakes.length--; } else { // partially redeem a past stake newStakingShareSecondsToBurn = sharesLeftToBurn.mul(stakeTimeSec); rewardAmount = computeNewReward(rewardAmount, newStakingShareSecondsToBurn, stakeTimeSec); stakingShareSecondsToBurn = stakingShareSecondsToBurn.add(newStakingShareSecondsToBurn); lastStake.stakingShares = lastStake.stakingShares.sub(sharesLeftToBurn); sharesLeftToBurn = 0; } } totals.stakingShareSeconds = totals.stakingShareSeconds.sub(stakingShareSecondsToBurn); totals.stakingShares = totals.stakingShares.sub(stakingSharesToBurn); // Already set in updateAccounting // totals.lastAccountingTimestampSec = now; // 2. Global Accounting _totalStakingShareSeconds = _totalStakingShareSeconds.sub(stakingShareSecondsToBurn); totalStakingShares = totalStakingShares.sub(stakingSharesToBurn); // Already set in updateAccounting // _lastAccountingTimestampSec = now; // interactions require(_stakingPool.transfer(msg.sender, amount), 'TokenGeyser: transfer out of staking pool failed'); require(_unlockedPool.transfer(msg.sender, rewardAmount), 'TokenGeyser: transfer out of unlocked pool failed'); emit Unstaked(msg.sender, amount, totalStakedFor(msg.sender), ""); emit TokensClaimed(msg.sender, rewardAmount); require(totalStakingShares == 0 || totalStaked() > 0, "TokenGeyser: Error unstaking. Staking shares exist, but no staking tokens do"); return rewardAmount; } /** * @dev Applies an additional time-bonus to a distribution amount. This is necessary to * encourage long-term deposits instead of constant unstake/restakes. * The bonus-multiplier is the result of a linear function that starts at startBonus and * ends at 100% over bonusPeriodSec, then stays at 100% thereafter. * @param currentRewardTokens The current number of distribution tokens already alotted for this * unstake op. Any bonuses are already applied. * @param stakingShareSeconds The stakingShare-seconds that are being burned for new * distribution tokens. * @param stakeTimeSec Length of time for which the tokens were staked. Needed to calculate * the time-bonus. * @return Updated amount of distribution tokens to award, with any bonus included on the * newly added tokens. */ function computeNewReward(uint256 currentRewardTokens, uint256 stakingShareSeconds, uint256 stakeTimeSec) private view returns (uint256) { uint256 newRewardTokens = totalUnlocked() .mul(stakingShareSeconds) .div(_totalStakingShareSeconds); if (stakeTimeSec >= bonusPeriodSec) { return currentRewardTokens.add(newRewardTokens); } uint256 oneHundredPct = 10**BONUS_DECIMALS; uint256 bonusedReward = startBonus .add(oneHundredPct.sub(startBonus).mul(stakeTimeSec).div(bonusPeriodSec)) .mul(newRewardTokens) .div(oneHundredPct); return currentRewardTokens.add(bonusedReward); } /** * @param addr The user to look up staking information for. * @return The number of staking tokens deposited for addr. */ function totalStakedFor(address addr) public view returns (uint256) { return totalStakingShares > 0 ? totalStaked().mul(_userTotals[addr].stakingShares).div(totalStakingShares) : 0; } /** * @dev Created for compatibility with UniPool staking contract * @return The number of staking tokens deposited for addr. */ function balanceOf(address addr) external view returns (uint256) { return totalStakedFor(addr); } /** * @return The total number of deposit tokens staked globally, by all users. */ function totalStaked() public view returns (uint256) { return _stakingPool.balance(); } /** * @dev Created for compatibility with UniPool staking contract * @return The total number of staked tokens */ function totalSupply() external view returns (uint256) { return totalStaked(); } /** * @dev Note that this application has a staking token as well as a distribution token, which * may be different. This function is required by EIP-900. * @return The deposit token used for staking. */ function token() external view returns (address) { return address(getStakingToken()); } /** * @dev A globally callable function to update the accounting state of the system. * Global state and state for the caller are updated. * @return [0] balance of the locked pool * @return [1] balance of the unlocked pool * @return [2] caller's staking share seconds * @return [3] global staking share seconds * @return [4] Rewards caller has accumulated, optimistically assumes max time-bonus. * @return [5] block timestamp */ function updateAccounting() public returns ( uint256, uint256, uint256, uint256, uint256, uint256) { unlockTokens(); // Global accounting uint256 newStakingShareSeconds = now .sub(_lastAccountingTimestampSec) .mul(totalStakingShares); _totalStakingShareSeconds = _totalStakingShareSeconds.add(newStakingShareSeconds); _lastAccountingTimestampSec = now; // User Accounting UserTotals storage totals = _userTotals[msg.sender]; uint256 newUserStakingShareSeconds = now .sub(totals.lastAccountingTimestampSec) .mul(totals.stakingShares); totals.stakingShareSeconds = totals.stakingShareSeconds .add(newUserStakingShareSeconds); totals.lastAccountingTimestampSec = now; uint256 totalUserRewards = (_totalStakingShareSeconds > 0) ? totalUnlocked().mul(totals.stakingShareSeconds).div(_totalStakingShareSeconds) : 0; return ( totalLocked(), totalUnlocked(), totals.stakingShareSeconds, _totalStakingShareSeconds, totalUserRewards, now ); } /** * @return Total number of locked distribution tokens. */ function totalLocked() public view returns (uint256) { return _lockedPool.balance(); } /** * @return Total number of unlocked distribution tokens. */ function totalUnlocked() public view returns (uint256) { return _unlockedPool.balance(); } /** * @return Number of unlock schedules. */ function unlockScheduleCount() public view returns (uint256) { return unlockSchedules.length; } /** * @dev This funcion allows the contract owner to add more locked distribution tokens, along * with the associated "unlock schedule". These locked tokens immediately begin unlocking * linearly over the duraction of durationSec timeframe. * @param amount Number of distribution tokens to lock. These are transferred from the caller. * @param durationSec Length of time to linear unlock the tokens. */ function lockTokens(uint256 amount, uint256 durationSec) external onlyOwner { require(unlockSchedules.length < _maxUnlockSchedules, 'TokenGeyser: reached maximum unlock schedules'); // Update lockedTokens amount before using it in computations after. updateAccounting(); uint256 lockedTokens = totalLocked(); uint256 mintedLockedShares = (lockedTokens > 0) ? totalLockedShares.mul(amount).div(lockedTokens) : amount.mul(_initialSharesPerToken); UnlockSchedule memory schedule; schedule.initialLockedShares = mintedLockedShares; schedule.lastUnlockTimestampSec = now; schedule.endAtSec = now.add(durationSec); schedule.durationSec = durationSec; unlockSchedules.push(schedule); totalLockedShares = totalLockedShares.add(mintedLockedShares); require(_lockedPool.token().transferFrom(msg.sender, address(_lockedPool), amount), 'TokenGeyser: transfer into locked pool failed'); emit TokensLocked(amount, durationSec, totalLocked()); } /** * @dev Moves distribution tokens from the locked pool to the unlocked pool, according to the * previously defined unlock schedules. Publicly callable. * @return Number of newly unlocked distribution tokens. */ function unlockTokens() public returns (uint256) { uint256 unlockedTokens = 0; uint256 lockedTokens = totalLocked(); if (totalLockedShares == 0) { unlockedTokens = lockedTokens; } else { uint256 unlockedShares = 0; for (uint256 s = 0; s < unlockSchedules.length; s++) { unlockedShares = unlockedShares.add(unlockScheduleShares(s)); } unlockedTokens = unlockedShares.mul(lockedTokens).div(totalLockedShares); totalLockedShares = totalLockedShares.sub(unlockedShares); } if (unlockedTokens > 0) { require(_lockedPool.transfer(address(_unlockedPool), unlockedTokens), 'TokenGeyser: transfer out of locked pool failed'); emit TokensUnlocked(unlockedTokens, totalLocked()); } return unlockedTokens; } /** * @dev Returns the number of unlockable shares from a given schedule. The returned value * depends on the time since the last unlock. This function updates schedule accounting, * but does not actually transfer any tokens. * @param s Index of the unlock schedule. * @return The number of unlocked shares. */ function unlockScheduleShares(uint256 s) private returns (uint256) { UnlockSchedule storage schedule = unlockSchedules[s]; if(schedule.unlockedShares >= schedule.initialLockedShares) { return 0; } uint256 sharesToUnlock = 0; // Special case to handle any leftover dust from integer division if (now >= schedule.endAtSec) { sharesToUnlock = (schedule.initialLockedShares.sub(schedule.unlockedShares)); schedule.lastUnlockTimestampSec = schedule.endAtSec; } else { sharesToUnlock = now.sub(schedule.lastUnlockTimestampSec) .mul(schedule.initialLockedShares) .div(schedule.durationSec); schedule.lastUnlockTimestampSec = now; } schedule.unlockedShares = schedule.unlockedShares.add(sharesToUnlock); return sharesToUnlock; } /** * @dev Lets the owner rescue funds air-dropped to the staking pool. * @param tokenToRescue Address of the token to be rescued. * @param to Address to which the rescued funds are to be sent. * @param amount Amount of tokens to be rescued. * @return Transfer success. */ function rescueFundsFromStakingPool(address tokenToRescue, address to, uint256 amount) public onlyOwner returns (bool) { return _stakingPool.rescueFunds(tokenToRescue, to, amount); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"constant":false,"inputs":[{"name":"amount","type":"uint256"},{"name":"data","type":"bytes"}],"name":"stake","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"user","type":"address"},{"name":"amount","type":"uint256"},{"name":"data","type":"bytes"}],"name":"stakeFor","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"initialized","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"totalSupply","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"BONUS_DECIMALS","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getDistributionToken","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"amount","type":"uint256"}],"name":"withdraw","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"startBonus","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"updateAccounting","outputs":[{"name":"","type":"uint256"},{"name":"","type":"uint256"},{"name":"","type":"uint256"},{"name":"","type":"uint256"},{"name":"","type":"uint256"},{"name":"","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"addr","type":"address"}],"name":"totalStakedFor","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"totalLocked","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"tokenToRescue","type":"address"},{"name":"to","type":"address"},{"name":"amount","type":"uint256"}],"name":"rescueFundsFromStakingPool","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"unlockSchedules","outputs":[{"name":"initialLockedShares","type":"uint256"},{"name":"unlockedShares","type":"uint256"},{"name":"lastUnlockTimestampSec","type":"uint256"},{"name":"endAtSec","type":"uint256"},{"name":"durationSec","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"supportsHistory","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[{"name":"addr","type":"address"}],"name":"balanceOf","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"totalStakingShares","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"renounceOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"bonusPeriodSec","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"totalStaked","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"totalLockedShares","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"amount","type":"uint256"}],"name":"unstakeQuery","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"amount","type":"uint256"},{"name":"durationSec","type":"uint256"}],"name":"lockTokens","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"isOwner","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getStakingToken","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"amount","type":"uint256"}],"name":"stake","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"totalUnlocked","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"stakingToken","type":"address"},{"name":"distributionToken","type":"address"},{"name":"maxUnlockSchedules","type":"uint256"},{"name":"startBonus_","type":"uint256"},{"name":"bonusPeriodSec_","type":"uint256"},{"name":"initialSharesPerToken","type":"uint256"}],"name":"init","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"unlockScheduleCount","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"amount","type":"uint256"},{"name":"data","type":"bytes"}],"name":"unstake","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"unlockTokens","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"token","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"anonymous":false,"inputs":[{"indexed":true,"name":"user","type":"address"},{"indexed":false,"name":"amount","type":"uint256"},{"indexed":false,"name":"total","type":"uint256"},{"indexed":false,"name":"data","type":"bytes"}],"name":"Staked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"user","type":"address"},{"indexed":false,"name":"amount","type":"uint256"},{"indexed":false,"name":"total","type":"uint256"},{"indexed":false,"name":"data","type":"bytes"}],"name":"Unstaked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"user","type":"address"},{"indexed":false,"name":"amount","type":"uint256"}],"name":"TokensClaimed","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"amount","type":"uint256"},{"indexed":false,"name":"durationSec","type":"uint256"},{"indexed":false,"name":"total","type":"uint256"}],"name":"TokensLocked","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"amount","type":"uint256"},{"indexed":false,"name":"total","type":"uint256"}],"name":"TokensUnlocked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"previousOwner","type":"address"},{"indexed":true,"name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"}]
Contract Creation Code
608060405260006004556000600555600060065560006007556000600855426009556000600a556000600b55610042610102640100000000026401000000009004565b6000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a361010a565b600033905090565b614cbf806200011a6000396000f3fe608060405260043610620001c3576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff1680630e89439b14620001c85780630ef96356146200025f578063158ef93e146200031657806318160ddd14620003485780631dc27fde146200037657806322c12b8414620003a45780632e1a7d4d14620003fe57806338b45fde146200043d578063494347e7146200046b5780634b341aed14620004bc5780635689141214620005255780635a72bbef14620005535780635c94bcb214620005ea5780637033e4a6146200065957806370a08231146200068b57806370c6a17e14620006f4578063715018a614620007225780637c6aa6f4146200073c578063817b1cd2146200076a57806381c39bec146200079857806386805dd114620007c657806389158d8e14620008195780638da5cb5b14620008625780638f32d59b14620008bc5780639f9106d114620008ee578063a694fc3a1462000948578063a779d0801462000987578063c1051d8f14620009b5578063c7ae20071462000a52578063c8fd6ed01462000a80578063f2fde38b1462000b17578063f968f4931462000b6c578063fc0c546a1462000b9a575b600080fd5b348015620001d557600080fd5b506200025d60048036036040811015620001ee57600080fd5b8101908080359060200190929190803590602001906401000000008111156200021657600080fd5b8201836020820111156200022957600080fd5b803590602001918460018302840111640100000000831117156200024c57600080fd5b909192939192939050505062000bf4565b005b3480156200026c57600080fd5b5062000314600480360360608110156200028557600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919080359060200190640100000000811115620002cd57600080fd5b820183602082011115620002e057600080fd5b803590602001918460018302840111640100000000831117156200030357600080fd5b909192939192939050505062000c06565b005b3480156200032357600080fd5b506200032e62000c98565b604051808215151515815260200191505060405180910390f35b3480156200035557600080fd5b506200036062000cab565b6040518082815260200191505060405180910390f35b3480156200038357600080fd5b506200038e62000cbc565b6040518082815260200191505060405180910390f35b348015620003b157600080fd5b50620003bc62000cc1565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3480156200040b57600080fd5b506200043b600480360360208110156200042457600080fd5b810190808035906020019092919050505062000f44565b005b3480156200044a57600080fd5b506200045562000f53565b6040518082815260200191505060405180910390f35b3480156200047857600080fd5b506200048362000f59565b60405180878152602001868152602001858152602001848152602001838152602001828152602001965050505050505060405180910390f35b348015620004c957600080fd5b506200050f60048036036020811015620004e257600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050620010e9565b6040518082815260200191505060405180910390f35b3480156200053257600080fd5b506200053d6200117b565b6040518082815260200191505060405180910390f35b3480156200056057600080fd5b50620005d0600480360360608110156200057957600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919050505062001244565b604051808215151515815260200191505060405180910390f35b348015620005f757600080fd5b5062000627600480360360208110156200061057600080fd5b810190808035906020019092919050505062001405565b604051808681526020018581526020018481526020018381526020018281526020019550505050505060405180910390f35b3480156200066657600080fd5b50620006716200144b565b604051808215151515815260200191505060405180910390f35b3480156200069857600080fd5b50620006de60048036036020811015620006b157600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505062001453565b6040518082815260200191505060405180910390f35b3480156200070157600080fd5b506200070c62001467565b6040518082815260200191505060405180910390f35b3480156200072f57600080fd5b506200073a6200146d565b005b3480156200074957600080fd5b5062000754620015ab565b6040518082815260200191505060405180910390f35b3480156200077757600080fd5b5062000782620015b1565b6040518082815260200191505060405180910390f35b348015620007a557600080fd5b50620007b06200167a565b6040518082815260200191505060405180910390f35b348015620007d357600080fd5b506200080360048036036020811015620007ec57600080fd5b810190808035906020019092919050505062001680565b6040518082815260200191505060405180910390f35b3480156200082657600080fd5b5062000860600480360360408110156200083f57600080fd5b81019080803590602001909291908035906020019092919050505062001694565b005b3480156200086f57600080fd5b506200087a62001bdb565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b348015620008c957600080fd5b50620008d462001c04565b604051808215151515815260200191505060405180910390f35b348015620008fb57600080fd5b506200090662001c64565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3480156200095557600080fd5b5062000985600480360360208110156200096e57600080fd5b810190808035906020019092919050505062001d2d565b005b3480156200099457600080fd5b506200099f62001d3d565b6040518082815260200191505060405180910390f35b348015620009c257600080fd5b5062000a50600480360360c0811015620009db57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919080359060200190929190803590602001909291908035906020019092919050505062001e06565b005b34801562000a5f57600080fd5b5062000a6a6200228a565b6040518082815260200191505060405180910390f35b34801562000a8d57600080fd5b5062000b156004803603604081101562000aa657600080fd5b81019080803590602001909291908035906020019064010000000081111562000ace57600080fd5b82018360208201111562000ae157600080fd5b8035906020019184600183028401116401000000008311171562000b0457600080fd5b909192939192939050505062002297565b005b34801562000b2457600080fd5b5062000b6a6004803603602081101562000b3d57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050620022a8565b005b34801562000b7957600080fd5b5062000b8462002335565b6040518082815260200191505060405180910390f35b34801562000ba757600080fd5b5062000bb26200260f565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b62000c0133338562002620565b505050565b62000c1062001c04565b151562000c85576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b62000c9233858562002620565b50505050565b600f60009054906101000a900460ff1681565b600062000cb7620015b1565b905090565b600281565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663fc0c546a6040518163ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040160206040518083038186803b15801562000d4857600080fd5b505afa15801562000d5d573d6000803e3d6000fd5b505050506040513d602081101562000d7457600080fd5b810190808051906020019092919050505073ffffffffffffffffffffffffffffffffffffffff16600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663fc0c546a6040518163ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040160206040518083038186803b15801562000e2057600080fd5b505afa15801562000e35573d6000803e3d6000fd5b505050506040513d602081101562000e4c57600080fd5b810190808051906020019092919050505073ffffffffffffffffffffffffffffffffffffffff1614151562000e7d57fe5b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663fc0c546a6040518163ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040160206040518083038186803b15801562000f0257600080fd5b505afa15801562000f17573d6000803e3d6000fd5b505050506040513d602081101562000f2e57600080fd5b8101908080519060200190929190505050905090565b62000f4f8162002db2565b5050565b60045481565b60008060008060008062000f6c62002335565b50600062000f9c60075462000f8d600954426200372490919063ffffffff16565b6200377090919063ffffffff16565b905062000fb5816008546200384190919063ffffffff16565b600881905550426009819055506000600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000620010388260000154620010298460020154426200372490919063ffffffff16565b6200377090919063ffffffff16565b9050620010538183600101546200384190919063ffffffff16565b82600101819055504282600201819055506000806008541162001078576000620010b1565b620010b0600854620010a185600101546200109262001d3d565b6200377090919063ffffffff16565b620038cc90919063ffffffff16565b5b9050620010bd6200117b565b620010c762001d3d565b8460010154600854844299509950995099509950995050505050909192939495565b60008060075411620010fd57600062001174565b6200117360075462001164600c60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000015462001155620015b1565b6200377090919063ffffffff16565b620038cc90919063ffffffff16565b5b9050919050565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663b69ef8a86040518163ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040160206040518083038186803b1580156200120257600080fd5b505afa15801562001217573d6000803e3d6000fd5b505050506040513d60208110156200122e57600080fd5b8101908080519060200190929190505050905090565b60006200125062001c04565b1515620012c5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636ccae0548585856040518463ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050602060405180830381600087803b158015620013bf57600080fd5b505af1158015620013d4573d6000803e3d6000fd5b505050506040513d6020811015620013eb57600080fd5b810190808051906020019092919050505090509392505050565b600e818154811015156200141557fe5b90600052602060002090600502016000915090508060000154908060010154908060020154908060030154908060040154905085565b600080905090565b60006200146082620010e9565b9050919050565b60075481565b6200147762001c04565b1515620014ec576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff166000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a360008060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b60055481565b6000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663b69ef8a86040518163ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040160206040518083038186803b1580156200163857600080fd5b505afa1580156200164d573d6000803e3d6000fd5b505050506040513d60208110156200166457600080fd5b8101908080519060200190929190505050905090565b60065481565b60006200168d8262002db2565b9050919050565b6200169e62001c04565b151562001713576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600a54600e80549050101515620017b8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602d8152602001807f546f6b656e4765797365723a2072656163686564206d6178696d756d20756e6c81526020017f6f636b207363686564756c65730000000000000000000000000000000000000081525060400191505060405180910390fd5b620017c262000f59565b5050505050506000620017d46200117b565b90506000808211620017fd57620017f7600b54856200377090919063ffffffff16565b62001829565b620018288262001819866006546200377090919063ffffffff16565b620038cc90919063ffffffff16565b5b90506200183562003e56565b81816000018181525050428160400181815250506200185e84426200384190919063ffffffff16565b81606001818152505083816080018181525050600e81908060018154018082558091505090600182039060005260206000209060050201600090919290919091506000820151816000015560208201518160010155604082015181600201556060820151816003015560808201518160040155505050620018eb826006546200384190919063ffffffff16565b600681905550600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663fc0c546a6040518163ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040160206040518083038186803b1580156200197657600080fd5b505afa1580156200198b573d6000803e3d6000fd5b505050506040513d6020811015620019a257600080fd5b810190808051906020019092919050505073ffffffffffffffffffffffffffffffffffffffff166323b872dd33600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16886040518463ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050602060405180830381600087803b15801562001aac57600080fd5b505af115801562001ac1573d6000803e3d6000fd5b505050506040513d602081101562001ad857600080fd5b8101908080519060200190929190505050151562001b84576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602d8152602001807f546f6b656e4765797365723a207472616e7366657220696e746f206c6f636b6581526020017f6420706f6f6c206661696c65640000000000000000000000000000000000000081525060400191505060405180910390fd5b7ff346961af4c52f314df1b45964746280fe409abb959d4a2458d58f79408b1fe8858562001bb16200117b565b60405180848152602001838152602001828152602001935050505060405180910390a15050505050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1662001c4862003918565b73ffffffffffffffffffffffffffffffffffffffff1614905090565b6000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663fc0c546a6040518163ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040160206040518083038186803b15801562001ceb57600080fd5b505afa15801562001d00573d6000803e3d6000fd5b505050506040513d602081101562001d1757600080fd5b8101908080519060200190929190505050905090565b62001d3a33338362002620565b50565b6000600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663b69ef8a86040518163ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040160206040518083038186803b15801562001dc457600080fd5b505afa15801562001dd9573d6000803e3d6000fd5b505050506040513d602081101562001df057600080fd5b8101908080519060200190929190505050905090565b600f60009054906101000a900460ff1615151562001e8c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260138152602001807f416c726561647920696e697469616c697a65640000000000000000000000000081525060200191505060405180910390fd5b6001600f60006101000a81548160ff0219169083151502179055506002600a0a831115151562001f4a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001807f546f6b656e4765797365723a20737461727420626f6e757320746f6f2068696781526020017f680000000000000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b6000821415151562001fea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001807f546f6b656e4765797365723a20626f6e757320706572696f64206973207a657281526020017f6f0000000000000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b60008111151562002089576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a8152602001807f546f6b656e4765797365723a20696e697469616c536861726573506572546f6b81526020017f656e206973207a65726f0000000000000000000000000000000000000000000081525060400191505060405180910390fd5b856200209462003e86565b808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001915050604051809103906000f080158015620020e7573d6000803e3d6000fd5b50600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550846200213362003e86565b808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001915050604051809103906000f08015801562002186573d6000803e3d6000fd5b50600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555084620021d262003e86565b808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001915050604051809103906000f08015801562002225573d6000803e3d6000fd5b50600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550826004819055508160058190555083600a8190555080600b81905550505050505050565b6000600e80549050905090565b620022a28362002db2565b50505050565b620022b262001c04565b151562002327576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b620023328162003920565b50565b600080600090506000620023486200117b565b9050600060065414156200235f57809150620023f4565b600080905060008090505b600e80549050811015620023a75762002397620023878262003aaa565b836200384190919063ffffffff16565b915080806001019150506200236a565b50620023d3600654620023c484846200377090919063ffffffff16565b620038cc90919063ffffffff16565b9250620023ec816006546200372490919063ffffffff16565b600681905550505b60008211156200260757600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16846040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b158015620024e657600080fd5b505af1158015620024fb573d6000803e3d6000fd5b505050506040513d60208110156200251257600080fd5b81019080805190602001909291905050501515620025be576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602f8152602001807f546f6b656e4765797365723a207472616e73666572206f7574206f66206c6f6381526020017f6b656420706f6f6c206661696c6564000000000000000000000000000000000081525060400191505060405180910390fd5b7f2e444eb379b177e88ce0649c6110a3b01099f03e297127919dd5e3b63a761a9c82620025ea6200117b565b604051808381526020018281526020019250505060405180910390a15b819250505090565b60006200261b62001c64565b905090565b600081111515620026bf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001807f546f6b656e4765797365723a207374616b6520616d6f756e74206973207a657281526020017f6f0000000000000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141515156200278b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260288152602001807f546f6b656e4765797365723a2062656e6566696369617279206973207a65726f81526020017f206164647265737300000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b60006007541480620027a657506000620027a4620015b1565b115b151562002867576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252604a8152602001807f546f6b656e4765797365723a20496e76616c69642073746174652e205374616b81526020017f696e67207368617265732065786973742c20627574206e6f207374616b696e6781526020017f20746f6b656e7320646f0000000000000000000000000000000000000000000081525060600191505060405180910390fd5b6000806007541162002890576200288a600b54836200377090919063ffffffff16565b620028c5565b620028c46200289e620015b1565b620028b5846007546200377090919063ffffffff16565b620038cc90919063ffffffff16565b5b905060008111151562002966576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001807f546f6b656e4765797365723a205374616b6520616d6f756e7420697320746f6f81526020017f20736d616c6c000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b6200297062000f59565b5050505050506000600c60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000209050620029d28282600001546200384190919063ffffffff16565b8160000181905550428160020181905550620029ed62003e97565b6040805190810160405280848152602001428152509050600d60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190806001815401808255809150509060018203906000526020600020906002020160009091929091909150600082015181600001556020820151816001015550505062002a9d836007546200384190919063ffffffff16565b600781905550600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663fc0c546a6040518163ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040160206040518083038186803b15801562002b2857600080fd5b505afa15801562002b3d573d6000803e3d6000fd5b505050506040513d602081101562002b5457600080fd5b810190808051906020019092919050505073ffffffffffffffffffffffffffffffffffffffff166323b872dd87600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16876040518463ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050602060405180830381600087803b15801562002c5e57600080fd5b505af115801562002c73573d6000803e3d6000fd5b505050506040513d602081101562002c8a57600080fd5b8101908080519060200190929190505050151562002d36576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602e8152602001807f546f6b656e4765797365723a207472616e7366657220696e746f207374616b6981526020017f6e6720706f6f6c206661696c656400000000000000000000000000000000000081525060400191505060405180910390fd5b8473ffffffffffffffffffffffffffffffffffffffff167fc65e53b88159e7d2c0fc12a0600072e28ae53ff73b4c1715369c30f1609351428562002d7a88620010e9565b6040518083815260200182815260200180602001828103825260008152602001602001935050505060405180910390a2505050505050565b600062002dbe62000f59565b50505050505060008211151562002e63576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260238152602001807f546f6b656e4765797365723a20756e7374616b6520616d6f756e74206973207a81526020017f65726f000000000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b8162002e6f33620010e9565b1015151562002f0c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603d8152602001807f546f6b656e4765797365723a20756e7374616b6520616d6f756e74206973206781526020017f726561746572207468616e20746f74616c2075736572207374616b657300000081525060400191505060405180910390fd5b600062002f4262002f1c620015b1565b62002f33856007546200377090919063ffffffff16565b620038cc90919063ffffffff16565b905060008111151562002fe3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260308152602001807f546f6b656e4765797365723a20556e61626c6520746f20756e7374616b65206181526020017f6d6f756e74207468697320736d616c6c0000000000000000000000000000000081525060400191505060405180910390fd5b6000600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000809050600084905060008090505b6000821115620031c05760008460018680549050038154811015156200309b57fe5b906000526020600020906002020190506000620030c68260010154426200372490919063ffffffff16565b905060008090508483600001541115156200315457620030f48284600001546200377090919063ffffffff16565b90506200310384828462003bb0565b93506200311a81876200384190919063ffffffff16565b9550620031358360000154866200372490919063ffffffff16565b9450868054809190600190036200314d919062003eb1565b50620031b7565b6200316982866200377090919063ffffffff16565b90506200317884828462003bb0565b93506200318f81876200384190919063ffffffff16565b9550620031aa8584600001546200372490919063ffffffff16565b8360000181905550600094505b50505062003079565b620031d98386600101546200372490919063ffffffff16565b8560010181905550620031fa8686600001546200372490919063ffffffff16565b856000018190555062003219836008546200372490919063ffffffff16565b60088190555062003236866007546200372490919063ffffffff16565b600781905550600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb338a6040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b1580156200330257600080fd5b505af115801562003317573d6000803e3d6000fd5b505050506040513d60208110156200332e57600080fd5b81019080805190602001909291905050501515620033da576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260308152602001807f546f6b656e4765797365723a207472616e73666572206f7574206f662073746181526020017f6b696e6720706f6f6c206661696c65640000000000000000000000000000000081525060400191505060405180910390fd5b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33836040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b158015620034a057600080fd5b505af1158015620034b5573d6000803e3d6000fd5b505050506040513d6020811015620034cc57600080fd5b8101908080519060200190929190505050151562003578576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260318152602001807f546f6b656e4765797365723a207472616e73666572206f7574206f6620756e6c81526020017f6f636b656420706f6f6c206661696c656400000000000000000000000000000081525060400191505060405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff167faf01bfc8475df280aca00b578c4a948e6d95700f0db8c13365240f7f973c875489620035bc33620010e9565b6040518083815260200182815260200180602001828103825260008152602001602001935050505060405180910390a23373ffffffffffffffffffffffffffffffffffffffff167f896e034966eaaf1adc54acc0f257056febbd300c9e47182cf761982cf1f5e430826040518082815260200191505060405180910390a260006007541480620036555750600062003653620015b1565b115b151562003716576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252604c8152602001807f546f6b656e4765797365723a204572726f7220756e7374616b696e672e20537481526020017f616b696e67207368617265732065786973742c20627574206e6f207374616b6981526020017f6e6720746f6b656e7320646f000000000000000000000000000000000000000081525060600191505060405180910390fd5b809650505050505050919050565b60006200376883836040805190810160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f77000081525062003cc1565b905092915050565b6000808314156200378557600090506200383b565b600082840290508284828115156200379957fe5b0414151562003836576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001807f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f81526020017f770000000000000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b809150505b92915050565b6000808284019050838110151515620038c2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f536166654d6174683a206164646974696f6e206f766572666c6f77000000000081525060200191505060405180910390fd5b8091505092915050565b60006200391083836040805190810160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f00000000000081525062003d87565b905092915050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614151515620039ec576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001807f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206181526020017f646472657373000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600080600e8381548110151562003abd57fe5b906000526020600020906005020190508060000154816001015410151562003aea57600091505062003bab565b600080905081600301544210151562003b2f5762003b1a826001015483600001546200372490919063ffffffff16565b90508160030154826002018190555062003b84565b62003b78826004015462003b69846000015462003b5a8660020154426200372490919063ffffffff16565b6200377090919063ffffffff16565b620038cc90919063ffffffff16565b90504282600201819055505b62003b9d8183600101546200384190919063ffffffff16565b826001018190555080925050505b919050565b60008062003be760085462003bd88662003bc962001d3d565b6200377090919063ffffffff16565b620038cc90919063ffffffff16565b90506005548310151562003c135762003c0a81866200384190919063ffffffff16565b91505062003cba565b60006002600a0a9050600062003c9d8262003c8e8562003c7f62003c6d60055462003c5e8c62003c4f6004548c6200372490919063ffffffff16565b6200377090919063ffffffff16565b620038cc90919063ffffffff16565b6004546200384190919063ffffffff16565b6200377090919063ffffffff16565b620038cc90919063ffffffff16565b905062003cb481886200384190919063ffffffff16565b93505050505b9392505050565b6000838311158290151562003d74576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b8381101562003d3857808201518184015260208101905062003d1b565b50505050905090810190601f16801562003d665780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5060008385039050809150509392505050565b60008083118290151562003e39576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b8381101562003dfd57808201518184015260208101905062003de0565b50505050905090810190601f16801562003e2b5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b506000838581151562003e4857fe5b049050809150509392505050565b60a06040519081016040528060008152602001600081526020016000815260200160008152602001600081525090565b604051610d7b8062003f1983390190565b604080519081016040528060008152602001600081525090565b81548183558181111562003ee15760020281600202836000526020600020918201910162003ee0919062003ee6565b5b505050565b62003f1591905b8082111562003f115760008082016000905560018201600090555060020162003eed565b5090565b9056fe608060405234801561001057600080fd5b50604051602080610d7b8339810180604052602081101561003057600080fd5b810190808051906020019092919050505061005861015a640100000000026401000000009004565b6000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050610162565b600033905090565b610c0a806101716000396000f3fe60806040526004361061008e576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff1680636ccae05414610093578063715018a6146101265780638da5cb5b1461013d5780638f32d59b14610194578063a9059cbb146101c3578063b69ef8a814610236578063f2fde38b14610261578063fc0c546a146102b2575b600080fd5b34801561009f57600080fd5b5061010c600480360360608110156100b657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050610309565b604051808215151515815260200191505060405180910390f35b34801561013257600080fd5b5061013b61055a565b005b34801561014957600080fd5b50610152610695565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3480156101a057600080fd5b506101a96106be565b604051808215151515815260200191505060405180910390f35b3480156101cf57600080fd5b5061021c600480360360408110156101e657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919050505061071c565b604051808215151515815260200191505060405180910390f35b34801561024257600080fd5b5061024b6108a2565b6040518082815260200191505060405180910390f35b34801561026d57600080fd5b506102b06004803603602081101561028457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061099f565b005b3480156102be57600080fd5b506102c7610a27565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b60006103136106be565b1515610387576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b8373ffffffffffffffffffffffffffffffffffffffff16600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614151515610473576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260328152602001807f546f6b656e506f6f6c3a2043616e6e6f7420636c61696d20746f6b656e20686581526020017f6c642062792074686520636f6e7472616374000000000000000000000000000081525060400191505060405180910390fd5b8373ffffffffffffffffffffffffffffffffffffffff1663a9059cbb84846040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b15801561051657600080fd5b505af115801561052a573d6000803e3d6000fd5b505050506040513d602081101561054057600080fd5b810190808051906020019092919050505090509392505050565b6105626106be565b15156105d6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff166000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a360008060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16610700610a4d565b73ffffffffffffffffffffffffffffffffffffffff1614905090565b60006107266106be565b151561079a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb84846040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b15801561085f57600080fd5b505af1158015610873573d6000803e3d6000fd5b505050506040513d602081101561088957600080fd5b8101908080519060200190929190505050905092915050565b6000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b15801561095f57600080fd5b505afa158015610973573d6000803e3d6000fd5b505050506040513d602081101561098957600080fd5b8101908080519060200190929190505050905090565b6109a76106be565b1515610a1b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b610a2481610a55565b50565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614151515610b20576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001807f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206181526020017f646472657373000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505056fea165627a7a72305820fad489c7d96df0eb6b19b10caedbf2fd989f26d171a077c078b713d0f67918430029a165627a7a7230582003f7bc927a0582a6733e0d9991353261a1d887bc529e80f8dc922498fde8178f0029
Deployed Bytecode
0x608060405260043610620001c3576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff1680630e89439b14620001c85780630ef96356146200025f578063158ef93e146200031657806318160ddd14620003485780631dc27fde146200037657806322c12b8414620003a45780632e1a7d4d14620003fe57806338b45fde146200043d578063494347e7146200046b5780634b341aed14620004bc5780635689141214620005255780635a72bbef14620005535780635c94bcb214620005ea5780637033e4a6146200065957806370a08231146200068b57806370c6a17e14620006f4578063715018a614620007225780637c6aa6f4146200073c578063817b1cd2146200076a57806381c39bec146200079857806386805dd114620007c657806389158d8e14620008195780638da5cb5b14620008625780638f32d59b14620008bc5780639f9106d114620008ee578063a694fc3a1462000948578063a779d0801462000987578063c1051d8f14620009b5578063c7ae20071462000a52578063c8fd6ed01462000a80578063f2fde38b1462000b17578063f968f4931462000b6c578063fc0c546a1462000b9a575b600080fd5b348015620001d557600080fd5b506200025d60048036036040811015620001ee57600080fd5b8101908080359060200190929190803590602001906401000000008111156200021657600080fd5b8201836020820111156200022957600080fd5b803590602001918460018302840111640100000000831117156200024c57600080fd5b909192939192939050505062000bf4565b005b3480156200026c57600080fd5b5062000314600480360360608110156200028557600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919080359060200190640100000000811115620002cd57600080fd5b820183602082011115620002e057600080fd5b803590602001918460018302840111640100000000831117156200030357600080fd5b909192939192939050505062000c06565b005b3480156200032357600080fd5b506200032e62000c98565b604051808215151515815260200191505060405180910390f35b3480156200035557600080fd5b506200036062000cab565b6040518082815260200191505060405180910390f35b3480156200038357600080fd5b506200038e62000cbc565b6040518082815260200191505060405180910390f35b348015620003b157600080fd5b50620003bc62000cc1565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3480156200040b57600080fd5b506200043b600480360360208110156200042457600080fd5b810190808035906020019092919050505062000f44565b005b3480156200044a57600080fd5b506200045562000f53565b6040518082815260200191505060405180910390f35b3480156200047857600080fd5b506200048362000f59565b60405180878152602001868152602001858152602001848152602001838152602001828152602001965050505050505060405180910390f35b348015620004c957600080fd5b506200050f60048036036020811015620004e257600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050620010e9565b6040518082815260200191505060405180910390f35b3480156200053257600080fd5b506200053d6200117b565b6040518082815260200191505060405180910390f35b3480156200056057600080fd5b50620005d0600480360360608110156200057957600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919050505062001244565b604051808215151515815260200191505060405180910390f35b348015620005f757600080fd5b5062000627600480360360208110156200061057600080fd5b810190808035906020019092919050505062001405565b604051808681526020018581526020018481526020018381526020018281526020019550505050505060405180910390f35b3480156200066657600080fd5b50620006716200144b565b604051808215151515815260200191505060405180910390f35b3480156200069857600080fd5b50620006de60048036036020811015620006b157600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505062001453565b6040518082815260200191505060405180910390f35b3480156200070157600080fd5b506200070c62001467565b6040518082815260200191505060405180910390f35b3480156200072f57600080fd5b506200073a6200146d565b005b3480156200074957600080fd5b5062000754620015ab565b6040518082815260200191505060405180910390f35b3480156200077757600080fd5b5062000782620015b1565b6040518082815260200191505060405180910390f35b348015620007a557600080fd5b50620007b06200167a565b6040518082815260200191505060405180910390f35b348015620007d357600080fd5b506200080360048036036020811015620007ec57600080fd5b810190808035906020019092919050505062001680565b6040518082815260200191505060405180910390f35b3480156200082657600080fd5b5062000860600480360360408110156200083f57600080fd5b81019080803590602001909291908035906020019092919050505062001694565b005b3480156200086f57600080fd5b506200087a62001bdb565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b348015620008c957600080fd5b50620008d462001c04565b604051808215151515815260200191505060405180910390f35b348015620008fb57600080fd5b506200090662001c64565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3480156200095557600080fd5b5062000985600480360360208110156200096e57600080fd5b810190808035906020019092919050505062001d2d565b005b3480156200099457600080fd5b506200099f62001d3d565b6040518082815260200191505060405180910390f35b348015620009c257600080fd5b5062000a50600480360360c0811015620009db57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919080359060200190929190803590602001909291908035906020019092919050505062001e06565b005b34801562000a5f57600080fd5b5062000a6a6200228a565b6040518082815260200191505060405180910390f35b34801562000a8d57600080fd5b5062000b156004803603604081101562000aa657600080fd5b81019080803590602001909291908035906020019064010000000081111562000ace57600080fd5b82018360208201111562000ae157600080fd5b8035906020019184600183028401116401000000008311171562000b0457600080fd5b909192939192939050505062002297565b005b34801562000b2457600080fd5b5062000b6a6004803603602081101562000b3d57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050620022a8565b005b34801562000b7957600080fd5b5062000b8462002335565b6040518082815260200191505060405180910390f35b34801562000ba757600080fd5b5062000bb26200260f565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b62000c0133338562002620565b505050565b62000c1062001c04565b151562000c85576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b62000c9233858562002620565b50505050565b600f60009054906101000a900460ff1681565b600062000cb7620015b1565b905090565b600281565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663fc0c546a6040518163ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040160206040518083038186803b15801562000d4857600080fd5b505afa15801562000d5d573d6000803e3d6000fd5b505050506040513d602081101562000d7457600080fd5b810190808051906020019092919050505073ffffffffffffffffffffffffffffffffffffffff16600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663fc0c546a6040518163ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040160206040518083038186803b15801562000e2057600080fd5b505afa15801562000e35573d6000803e3d6000fd5b505050506040513d602081101562000e4c57600080fd5b810190808051906020019092919050505073ffffffffffffffffffffffffffffffffffffffff1614151562000e7d57fe5b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663fc0c546a6040518163ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040160206040518083038186803b15801562000f0257600080fd5b505afa15801562000f17573d6000803e3d6000fd5b505050506040513d602081101562000f2e57600080fd5b8101908080519060200190929190505050905090565b62000f4f8162002db2565b5050565b60045481565b60008060008060008062000f6c62002335565b50600062000f9c60075462000f8d600954426200372490919063ffffffff16565b6200377090919063ffffffff16565b905062000fb5816008546200384190919063ffffffff16565b600881905550426009819055506000600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000620010388260000154620010298460020154426200372490919063ffffffff16565b6200377090919063ffffffff16565b9050620010538183600101546200384190919063ffffffff16565b82600101819055504282600201819055506000806008541162001078576000620010b1565b620010b0600854620010a185600101546200109262001d3d565b6200377090919063ffffffff16565b620038cc90919063ffffffff16565b5b9050620010bd6200117b565b620010c762001d3d565b8460010154600854844299509950995099509950995050505050909192939495565b60008060075411620010fd57600062001174565b6200117360075462001164600c60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000015462001155620015b1565b6200377090919063ffffffff16565b620038cc90919063ffffffff16565b5b9050919050565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663b69ef8a86040518163ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040160206040518083038186803b1580156200120257600080fd5b505afa15801562001217573d6000803e3d6000fd5b505050506040513d60208110156200122e57600080fd5b8101908080519060200190929190505050905090565b60006200125062001c04565b1515620012c5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636ccae0548585856040518463ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050602060405180830381600087803b158015620013bf57600080fd5b505af1158015620013d4573d6000803e3d6000fd5b505050506040513d6020811015620013eb57600080fd5b810190808051906020019092919050505090509392505050565b600e818154811015156200141557fe5b90600052602060002090600502016000915090508060000154908060010154908060020154908060030154908060040154905085565b600080905090565b60006200146082620010e9565b9050919050565b60075481565b6200147762001c04565b1515620014ec576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff166000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a360008060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b60055481565b6000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663b69ef8a86040518163ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040160206040518083038186803b1580156200163857600080fd5b505afa1580156200164d573d6000803e3d6000fd5b505050506040513d60208110156200166457600080fd5b8101908080519060200190929190505050905090565b60065481565b60006200168d8262002db2565b9050919050565b6200169e62001c04565b151562001713576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600a54600e80549050101515620017b8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602d8152602001807f546f6b656e4765797365723a2072656163686564206d6178696d756d20756e6c81526020017f6f636b207363686564756c65730000000000000000000000000000000000000081525060400191505060405180910390fd5b620017c262000f59565b5050505050506000620017d46200117b565b90506000808211620017fd57620017f7600b54856200377090919063ffffffff16565b62001829565b620018288262001819866006546200377090919063ffffffff16565b620038cc90919063ffffffff16565b5b90506200183562003e56565b81816000018181525050428160400181815250506200185e84426200384190919063ffffffff16565b81606001818152505083816080018181525050600e81908060018154018082558091505090600182039060005260206000209060050201600090919290919091506000820151816000015560208201518160010155604082015181600201556060820151816003015560808201518160040155505050620018eb826006546200384190919063ffffffff16565b600681905550600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663fc0c546a6040518163ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040160206040518083038186803b1580156200197657600080fd5b505afa1580156200198b573d6000803e3d6000fd5b505050506040513d6020811015620019a257600080fd5b810190808051906020019092919050505073ffffffffffffffffffffffffffffffffffffffff166323b872dd33600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16886040518463ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050602060405180830381600087803b15801562001aac57600080fd5b505af115801562001ac1573d6000803e3d6000fd5b505050506040513d602081101562001ad857600080fd5b8101908080519060200190929190505050151562001b84576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602d8152602001807f546f6b656e4765797365723a207472616e7366657220696e746f206c6f636b6581526020017f6420706f6f6c206661696c65640000000000000000000000000000000000000081525060400191505060405180910390fd5b7ff346961af4c52f314df1b45964746280fe409abb959d4a2458d58f79408b1fe8858562001bb16200117b565b60405180848152602001838152602001828152602001935050505060405180910390a15050505050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1662001c4862003918565b73ffffffffffffffffffffffffffffffffffffffff1614905090565b6000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663fc0c546a6040518163ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040160206040518083038186803b15801562001ceb57600080fd5b505afa15801562001d00573d6000803e3d6000fd5b505050506040513d602081101562001d1757600080fd5b8101908080519060200190929190505050905090565b62001d3a33338362002620565b50565b6000600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663b69ef8a86040518163ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040160206040518083038186803b15801562001dc457600080fd5b505afa15801562001dd9573d6000803e3d6000fd5b505050506040513d602081101562001df057600080fd5b8101908080519060200190929190505050905090565b600f60009054906101000a900460ff1615151562001e8c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260138152602001807f416c726561647920696e697469616c697a65640000000000000000000000000081525060200191505060405180910390fd5b6001600f60006101000a81548160ff0219169083151502179055506002600a0a831115151562001f4a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001807f546f6b656e4765797365723a20737461727420626f6e757320746f6f2068696781526020017f680000000000000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b6000821415151562001fea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001807f546f6b656e4765797365723a20626f6e757320706572696f64206973207a657281526020017f6f0000000000000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b60008111151562002089576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a8152602001807f546f6b656e4765797365723a20696e697469616c536861726573506572546f6b81526020017f656e206973207a65726f0000000000000000000000000000000000000000000081525060400191505060405180910390fd5b856200209462003e86565b808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001915050604051809103906000f080158015620020e7573d6000803e3d6000fd5b50600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550846200213362003e86565b808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001915050604051809103906000f08015801562002186573d6000803e3d6000fd5b50600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555084620021d262003e86565b808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001915050604051809103906000f08015801562002225573d6000803e3d6000fd5b50600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550826004819055508160058190555083600a8190555080600b81905550505050505050565b6000600e80549050905090565b620022a28362002db2565b50505050565b620022b262001c04565b151562002327576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b620023328162003920565b50565b600080600090506000620023486200117b565b9050600060065414156200235f57809150620023f4565b600080905060008090505b600e80549050811015620023a75762002397620023878262003aaa565b836200384190919063ffffffff16565b915080806001019150506200236a565b50620023d3600654620023c484846200377090919063ffffffff16565b620038cc90919063ffffffff16565b9250620023ec816006546200372490919063ffffffff16565b600681905550505b60008211156200260757600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16846040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b158015620024e657600080fd5b505af1158015620024fb573d6000803e3d6000fd5b505050506040513d60208110156200251257600080fd5b81019080805190602001909291905050501515620025be576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602f8152602001807f546f6b656e4765797365723a207472616e73666572206f7574206f66206c6f6381526020017f6b656420706f6f6c206661696c6564000000000000000000000000000000000081525060400191505060405180910390fd5b7f2e444eb379b177e88ce0649c6110a3b01099f03e297127919dd5e3b63a761a9c82620025ea6200117b565b604051808381526020018281526020019250505060405180910390a15b819250505090565b60006200261b62001c64565b905090565b600081111515620026bf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001807f546f6b656e4765797365723a207374616b6520616d6f756e74206973207a657281526020017f6f0000000000000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141515156200278b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260288152602001807f546f6b656e4765797365723a2062656e6566696369617279206973207a65726f81526020017f206164647265737300000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b60006007541480620027a657506000620027a4620015b1565b115b151562002867576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252604a8152602001807f546f6b656e4765797365723a20496e76616c69642073746174652e205374616b81526020017f696e67207368617265732065786973742c20627574206e6f207374616b696e6781526020017f20746f6b656e7320646f0000000000000000000000000000000000000000000081525060600191505060405180910390fd5b6000806007541162002890576200288a600b54836200377090919063ffffffff16565b620028c5565b620028c46200289e620015b1565b620028b5846007546200377090919063ffffffff16565b620038cc90919063ffffffff16565b5b905060008111151562002966576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001807f546f6b656e4765797365723a205374616b6520616d6f756e7420697320746f6f81526020017f20736d616c6c000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b6200297062000f59565b5050505050506000600c60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000209050620029d28282600001546200384190919063ffffffff16565b8160000181905550428160020181905550620029ed62003e97565b6040805190810160405280848152602001428152509050600d60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190806001815401808255809150509060018203906000526020600020906002020160009091929091909150600082015181600001556020820151816001015550505062002a9d836007546200384190919063ffffffff16565b600781905550600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663fc0c546a6040518163ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040160206040518083038186803b15801562002b2857600080fd5b505afa15801562002b3d573d6000803e3d6000fd5b505050506040513d602081101562002b5457600080fd5b810190808051906020019092919050505073ffffffffffffffffffffffffffffffffffffffff166323b872dd87600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16876040518463ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050602060405180830381600087803b15801562002c5e57600080fd5b505af115801562002c73573d6000803e3d6000fd5b505050506040513d602081101562002c8a57600080fd5b8101908080519060200190929190505050151562002d36576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602e8152602001807f546f6b656e4765797365723a207472616e7366657220696e746f207374616b6981526020017f6e6720706f6f6c206661696c656400000000000000000000000000000000000081525060400191505060405180910390fd5b8473ffffffffffffffffffffffffffffffffffffffff167fc65e53b88159e7d2c0fc12a0600072e28ae53ff73b4c1715369c30f1609351428562002d7a88620010e9565b6040518083815260200182815260200180602001828103825260008152602001602001935050505060405180910390a2505050505050565b600062002dbe62000f59565b50505050505060008211151562002e63576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260238152602001807f546f6b656e4765797365723a20756e7374616b6520616d6f756e74206973207a81526020017f65726f000000000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b8162002e6f33620010e9565b1015151562002f0c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603d8152602001807f546f6b656e4765797365723a20756e7374616b6520616d6f756e74206973206781526020017f726561746572207468616e20746f74616c2075736572207374616b657300000081525060400191505060405180910390fd5b600062002f4262002f1c620015b1565b62002f33856007546200377090919063ffffffff16565b620038cc90919063ffffffff16565b905060008111151562002fe3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260308152602001807f546f6b656e4765797365723a20556e61626c6520746f20756e7374616b65206181526020017f6d6f756e74207468697320736d616c6c0000000000000000000000000000000081525060400191505060405180910390fd5b6000600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000809050600084905060008090505b6000821115620031c05760008460018680549050038154811015156200309b57fe5b906000526020600020906002020190506000620030c68260010154426200372490919063ffffffff16565b905060008090508483600001541115156200315457620030f48284600001546200377090919063ffffffff16565b90506200310384828462003bb0565b93506200311a81876200384190919063ffffffff16565b9550620031358360000154866200372490919063ffffffff16565b9450868054809190600190036200314d919062003eb1565b50620031b7565b6200316982866200377090919063ffffffff16565b90506200317884828462003bb0565b93506200318f81876200384190919063ffffffff16565b9550620031aa8584600001546200372490919063ffffffff16565b8360000181905550600094505b50505062003079565b620031d98386600101546200372490919063ffffffff16565b8560010181905550620031fa8686600001546200372490919063ffffffff16565b856000018190555062003219836008546200372490919063ffffffff16565b60088190555062003236866007546200372490919063ffffffff16565b600781905550600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb338a6040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b1580156200330257600080fd5b505af115801562003317573d6000803e3d6000fd5b505050506040513d60208110156200332e57600080fd5b81019080805190602001909291905050501515620033da576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260308152602001807f546f6b656e4765797365723a207472616e73666572206f7574206f662073746181526020017f6b696e6720706f6f6c206661696c65640000000000000000000000000000000081525060400191505060405180910390fd5b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33836040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b158015620034a057600080fd5b505af1158015620034b5573d6000803e3d6000fd5b505050506040513d6020811015620034cc57600080fd5b8101908080519060200190929190505050151562003578576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260318152602001807f546f6b656e4765797365723a207472616e73666572206f7574206f6620756e6c81526020017f6f636b656420706f6f6c206661696c656400000000000000000000000000000081525060400191505060405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff167faf01bfc8475df280aca00b578c4a948e6d95700f0db8c13365240f7f973c875489620035bc33620010e9565b6040518083815260200182815260200180602001828103825260008152602001602001935050505060405180910390a23373ffffffffffffffffffffffffffffffffffffffff167f896e034966eaaf1adc54acc0f257056febbd300c9e47182cf761982cf1f5e430826040518082815260200191505060405180910390a260006007541480620036555750600062003653620015b1565b115b151562003716576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252604c8152602001807f546f6b656e4765797365723a204572726f7220756e7374616b696e672e20537481526020017f616b696e67207368617265732065786973742c20627574206e6f207374616b6981526020017f6e6720746f6b656e7320646f000000000000000000000000000000000000000081525060600191505060405180910390fd5b809650505050505050919050565b60006200376883836040805190810160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f77000081525062003cc1565b905092915050565b6000808314156200378557600090506200383b565b600082840290508284828115156200379957fe5b0414151562003836576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001807f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f81526020017f770000000000000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b809150505b92915050565b6000808284019050838110151515620038c2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f536166654d6174683a206164646974696f6e206f766572666c6f77000000000081525060200191505060405180910390fd5b8091505092915050565b60006200391083836040805190810160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f00000000000081525062003d87565b905092915050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614151515620039ec576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001807f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206181526020017f646472657373000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600080600e8381548110151562003abd57fe5b906000526020600020906005020190508060000154816001015410151562003aea57600091505062003bab565b600080905081600301544210151562003b2f5762003b1a826001015483600001546200372490919063ffffffff16565b90508160030154826002018190555062003b84565b62003b78826004015462003b69846000015462003b5a8660020154426200372490919063ffffffff16565b6200377090919063ffffffff16565b620038cc90919063ffffffff16565b90504282600201819055505b62003b9d8183600101546200384190919063ffffffff16565b826001018190555080925050505b919050565b60008062003be760085462003bd88662003bc962001d3d565b6200377090919063ffffffff16565b620038cc90919063ffffffff16565b90506005548310151562003c135762003c0a81866200384190919063ffffffff16565b91505062003cba565b60006002600a0a9050600062003c9d8262003c8e8562003c7f62003c6d60055462003c5e8c62003c4f6004548c6200372490919063ffffffff16565b6200377090919063ffffffff16565b620038cc90919063ffffffff16565b6004546200384190919063ffffffff16565b6200377090919063ffffffff16565b620038cc90919063ffffffff16565b905062003cb481886200384190919063ffffffff16565b93505050505b9392505050565b6000838311158290151562003d74576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b8381101562003d3857808201518184015260208101905062003d1b565b50505050905090810190601f16801562003d665780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5060008385039050809150509392505050565b60008083118290151562003e39576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b8381101562003dfd57808201518184015260208101905062003de0565b50505050905090810190601f16801562003e2b5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b506000838581151562003e4857fe5b049050809150509392505050565b60a06040519081016040528060008152602001600081526020016000815260200160008152602001600081525090565b604051610d7b8062003f1983390190565b604080519081016040528060008152602001600081525090565b81548183558181111562003ee15760020281600202836000526020600020918201910162003ee0919062003ee6565b5b505050565b62003f1591905b8082111562003f115760008082016000905560018201600090555060020162003eed565b5090565b9056fe608060405234801561001057600080fd5b50604051602080610d7b8339810180604052602081101561003057600080fd5b810190808051906020019092919050505061005861015a640100000000026401000000009004565b6000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050610162565b600033905090565b610c0a806101716000396000f3fe60806040526004361061008e576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff1680636ccae05414610093578063715018a6146101265780638da5cb5b1461013d5780638f32d59b14610194578063a9059cbb146101c3578063b69ef8a814610236578063f2fde38b14610261578063fc0c546a146102b2575b600080fd5b34801561009f57600080fd5b5061010c600480360360608110156100b657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050610309565b604051808215151515815260200191505060405180910390f35b34801561013257600080fd5b5061013b61055a565b005b34801561014957600080fd5b50610152610695565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3480156101a057600080fd5b506101a96106be565b604051808215151515815260200191505060405180910390f35b3480156101cf57600080fd5b5061021c600480360360408110156101e657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919050505061071c565b604051808215151515815260200191505060405180910390f35b34801561024257600080fd5b5061024b6108a2565b6040518082815260200191505060405180910390f35b34801561026d57600080fd5b506102b06004803603602081101561028457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061099f565b005b3480156102be57600080fd5b506102c7610a27565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b60006103136106be565b1515610387576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b8373ffffffffffffffffffffffffffffffffffffffff16600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614151515610473576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260328152602001807f546f6b656e506f6f6c3a2043616e6e6f7420636c61696d20746f6b656e20686581526020017f6c642062792074686520636f6e7472616374000000000000000000000000000081525060400191505060405180910390fd5b8373ffffffffffffffffffffffffffffffffffffffff1663a9059cbb84846040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b15801561051657600080fd5b505af115801561052a573d6000803e3d6000fd5b505050506040513d602081101561054057600080fd5b810190808051906020019092919050505090509392505050565b6105626106be565b15156105d6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff166000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a360008060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16610700610a4d565b73ffffffffffffffffffffffffffffffffffffffff1614905090565b60006107266106be565b151561079a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb84846040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b15801561085f57600080fd5b505af1158015610873573d6000803e3d6000fd5b505050506040513d602081101561088957600080fd5b8101908080519060200190929190505050905092915050565b6000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b15801561095f57600080fd5b505afa158015610973573d6000803e3d6000fd5b505050506040513d602081101561098957600080fd5b8101908080519060200190929190505050905090565b6109a76106be565b1515610a1b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b610a2481610a55565b50565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614151515610b20576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001807f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206181526020017f646472657373000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505056fea165627a7a72305820fad489c7d96df0eb6b19b10caedbf2fd989f26d171a077c078b713d0f67918430029a165627a7a7230582003f7bc927a0582a6733e0d9991353261a1d887bc529e80f8dc922498fde8178f0029
Deployed Bytecode Sourcemap
15120:21769:0:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19664:121;;8:9:-1;5:2;;;30:1;27;20:12;5:2;19664:121:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;19664:121:0;;;;;;;;;;;;;;;;;;;21:11:-1;8;5:28;2:2;;;46:1;43;36:12;2:2;19664:121:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;19664:121:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;39:11;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;19664:121:0;;;;;;;;;;;;;;;20290:142;;8:9:-1;5:2;;;30:1;27;20:12;5:2;20290:142:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;20290:142:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21:11:-1;8;5:28;2:2;;;46:1;43;36:12;2:2;20290:142:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;20290:142:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;39:11;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;20290:142:0;;;;;;;;;;;;;;;17333:23;;8:9:-1;5:2;;;30:1;27;20:12;5:2;17333:23:0;;;;;;;;;;;;;;;;;;;;;;;;;;;29535:94;;8:9:-1;5:2;;;30:1;27;20:12;5:2;29535:94:0;;;;;;;;;;;;;;;;;;;;;;;15790:42;;8:9:-1;5:2;;;30:1;27;20:12;5:2;15790:42:0;;;;;;;;;;;;;;;;;;;;;;;19317:171;;8:9:-1;5:2;;;30:1;27;20:12;5:2;19317:171:0;;;;;;;;;;;;;;;;;;;;;;;;;;;22730:78;;8:9:-1;5:2;;;30:1;27;20:12;5:2;22730:78:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;22730:78:0;;;;;;;;;;;;;;;;;;;;15839:29;;8:9:-1;5:2;;;30:1;27;20:12;5:2;15839:29:0;;;;;;;;;;;;;;;;;;;;;;;30472:1281;;8:9:-1;5:2;;;30:1;27;20:12;5:2;30472:1281:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28701:210;;8:9:-1;5:2;;;30:1;27;20:12;5:2;28701:210:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;28701:210:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31839:100;;8:9:-1;5:2;;;30:1;27;20:12;5:2;31839:100:0;;;;;;;;;;;;;;;;;;;;;;;36679:207;;8:9:-1;5:2;;;30:1;27;20:12;5:2;36679:207:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;36679:207:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17285:39;;8:9:-1;5:2;;;30:1;27;20:12;5:2;17285:39:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;17285:39:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12981:87;;8:9:-1;5:2;;;30:1;27;20:12;5:2;12981:87:0;;;;;;;;;;;;;;;;;;;;;;;;;;;29070:111;;8:9:-1;5:2;;;30:1;27;20:12;5:2;29070:111:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;29070:111:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16008:37;;8:9:-1;5:2;;;30:1;27;20:12;5:2;16008:37:0;;;;;;;;;;;;;;;;;;;;;;;11342:140;;8:9:-1;5:2;;;30:1;27;20:12;5:2;11342:140:0;;;;;;15875:33;;8:9:-1;5:2;;;30:1;27;20:12;5:2;15875:33:0;;;;;;;;;;;;;;;;;;;;;;;29289:101;;8:9:-1;5:2;;;30:1;27;20:12;5:2;29289:101:0;;;;;;;;;;;;;;;;;;;;;;;15965:36;;8:9:-1;5:2;;;30:1;27;20:12;5:2;15965:36:0;;;;;;;;;;;;;;;;;;;;;;;22984:105;;8:9:-1;5:2;;;30:1;27;20:12;5:2;22984:105:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;22984:105:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32772:1123;;8:9:-1;5:2;;;30:1;27;20:12;5:2;32772:1123:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;32772:1123:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10531:79;;8:9:-1;5:2;;;30:1;27;20:12;5:2;10531:79:0;;;;;;;;;;;;;;;;;;;;;;;;;;;10897:94;;8:9:-1;5:2;;;30:1;27;20:12;5:2;10897:94:0;;;;;;;;;;;;;;;;;;;;;;;;;;;19132:102;;8:9:-1;5:2;;;30:1;27;20:12;5:2;19132:102:0;;;;;;;;;;;;;;;;;;;;;;;;;;;19918:100;;8:9:-1;5:2;;;30:1;27;20:12;5:2;19918:100:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;19918:100:0;;;;;;;;;;;;;;;;;;;;32027:104;;8:9:-1;5:2;;;30:1;27;20:12;5:2;32027:104:0;;;;;;;;;;;;;;;;;;;;;;;17959:1097;;8:9:-1;5:2;;;30:1;27;20:12;5:2;17959:1097:0;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;17959:1097:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32201:109;;8:9:-1;5:2;;;30:1;27;20:12;5:2;32201:109:0;;;;;;;;;;;;;;;;;;;;;;;22495:98;;8:9:-1;5:2;;;30:1;27;20:12;5:2;22495:98:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;22495:98:0;;;;;;;;;;;;;;;;;;;21:11:-1;8;5:28;2:2;;;46:1;43;36:12;2:2;22495:98:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;22495:98:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;39:11;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;22495:98:0;;;;;;;;;;;;;;;11637:109;;8:9:-1;5:2;;;30:1;27;20:12;5:2;11637:109:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;11637:109:0;;;;;;;;;;;;;;;;;;;;;;34151:916;;8:9:-1;5:2;;;30:1;27;20:12;5:2;34151:916:0;;;;;;;;;;;;;;;;;;;;;;;29870:101;;8:9:-1;5:2;;;30:1;27;20:12;5:2;29870:101:0;;;;;;;;;;;;;;;;;;;;;;;;;;;19664:121;19736:41;19746:10;19758;19770:6;19736:9;:41::i;:::-;19664:121;;;:::o;20290:142::-;10743:9;:7;:9::i;:::-;10735:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20389:35;20399:10;20411:4;20417:6;20389:9;:35::i;:::-;20290:142;;;;:::o;17333:23::-;;;;;;;;;;;;;:::o;29535:94::-;29581:7;29608:13;:11;:13::i;:::-;29601:20;;29535:94;:::o;15790:42::-;15831:1;15790:42;:::o;19317:171::-;19370:6;19421:11;;;;;;;;;;;:17;;;:19;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;19421:19:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;19421:19:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;19421:19:0;;;;;;;;;;;;;;;;19396:44;;:13;;;;;;;;;;;:19;;;:21;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;19396:21:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;19396:21:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;19396:21:0;;;;;;;;;;;;;;;;:44;;;19389:52;;;;;;19459:13;;;;;;;;;;;:19;;;:21;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;19459:21:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;19459:21:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;19459:21:0;;;;;;;;;;;;;;;;19452:28;;19317:171;:::o;22730:78::-;22784:16;22793:6;22784:8;:16::i;:::-;;22730:78;:::o;15839:29::-;;;;:::o;30472:1281::-;30526:7;30535;30544;30553;30562;30571;30593:14;:12;:14::i;:::-;;30650:30;30696:88;30765:18;;30696:50;30718:27;;30696:3;:21;;:50;;;;:::i;:::-;:68;;:88;;;;:::i;:::-;30650:134;;30823:53;30853:22;30823:25;;:29;;:53;;;;:::i;:::-;30795:25;:81;;;;30917:3;30887:27;:33;;;;30961:25;30989:11;:23;31001:10;30989:23;;;;;;;;;;;;;;;30961:51;;31023:34;31073:96;31148:6;:20;;;31073:56;31095:6;:33;;;31073:3;:21;;:56;;;;:::i;:::-;:74;;:96;;;;:::i;:::-;31023:146;;31222:72;31267:26;31222:6;:26;;;:44;;:72;;;;:::i;:::-;31180:6;:26;;:114;;;;31341:3;31305:6;:33;;:39;;;;31357:24;31413:1;31385:25;;:29;31384:142;;31525:1;31384:142;;;31431:78;31483:25;;31431:47;31451:6;:26;;;31431:15;:13;:15::i;:::-;:19;;:47;;;;:::i;:::-;:51;;:78;;;;:::i;:::-;31384:142;31357:169;;31561:13;:11;:13::i;:::-;31589:15;:13;:15::i;:::-;31619:6;:26;;;31660:25;;31700:16;31731:3;31539:206;;;;;;;;;;;;;;;;30472:1281;;;;;;:::o;28701:210::-;28760:7;28808:1;28787:18;;:22;:116;;28902:1;28787:116;;;28825:74;28880:18;;28825:50;28843:11;:17;28855:4;28843:17;;;;;;;;;;;;;;;:31;;;28825:13;:11;:13::i;:::-;:17;;:50;;;;:::i;:::-;:54;;:74;;;;:::i;:::-;28787:116;28780:123;;28701:210;;;:::o;31839:100::-;31883:7;31910:11;;;;;;;;;;;:19;;;:21;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;31910:21:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;31910:21:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;31910:21:0;;;;;;;;;;;;;;;;31903:28;;31839:100;:::o;36679:207::-;36801:4;10743:9;:7;:9::i;:::-;10735:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36827:12;;;;;;;;;;;:24;;;36852:13;36867:2;36871:6;36827:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;36827:51:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;36827:51:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;36827:51:0;;;;;;;;;;;;;;;;36820:58;;36679:207;;;;;:::o;17285:39::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;12981:87::-;13031:4;13055:5;13048:12;;12981:87;:::o;29070:111::-;29126:7;29153:20;29168:4;29153:14;:20::i;:::-;29146:27;;29070:111;;;:::o;16008:37::-;;;;:::o;11342:140::-;10743:9;:7;:9::i;:::-;10735:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11441:1;11404:40;;11425:6;;;;;;;;;;;11404:40;;;;;;;;;;;;11472:1;11455:6;;:19;;;;;;;;;;;;;;;;;;11342:140::o;15875:33::-;;;;:::o;29289:101::-;29333:7;29360:12;;;;;;;;;;;:20;;;:22;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;29360:22:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;29360:22:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;29360:22:0;;;;;;;;;;;;;;;;29353:29;;29289:101;:::o;15965:36::-;;;;:::o;22984:105::-;23038:7;23065:16;23074:6;23065:8;:16::i;:::-;23058:23;;22984:105;;;:::o;32772:1123::-;10743:9;:7;:9::i;:::-;10735:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32892:19;;32867:15;:22;;;;:44;32859:115;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33065:18;:16;:18::i;:::-;;;;;;;33096:20;33119:13;:11;:13::i;:::-;33096:36;;33143:26;33188:1;33173:12;:16;33172:131;;33269:34;33280:22;;33269:6;:10;;:34;;;;:::i;:::-;33172:131;;;33206:47;33240:12;33206:29;33228:6;33206:17;;:21;;:29;;;;:::i;:::-;:33;;:47;;;;:::i;:::-;33172:131;33143:160;;33316:30;;:::i;:::-;33388:18;33357:8;:28;;:49;;;;;33451:3;33417:8;:31;;:37;;;;;33485:20;33493:11;33485:3;:7;;:20;;;;:::i;:::-;33465:8;:17;;:40;;;;;33539:11;33516:8;:20;;:34;;;;;33561:15;33582:8;33561:30;;39:1:-1;33:3;27:10;23:18;57:10;52:3;45:23;79:10;72:17;;0:93;33561:30:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33624:41;33646:18;33624:17;;:21;;:41;;;;:::i;:::-;33604:17;:61;;;;33686:11;;;;;;;;;;;:17;;;:19;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;33686:19:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;33686:19:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;33686:19:0;;;;;;;;;;;;;;;;:32;;;33719:10;33739:11;;;;;;;;;;;33753:6;33686:74;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;33686:74:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;33686:74:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;33686:74:0;;;;;;;;;;;;;;;;33678:145;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33839:48;33852:6;33860:11;33873:13;:11;:13::i;:::-;33839:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10800:1;;;32772:1123;;:::o;10531:79::-;10569:7;10596:6;;;;;;;;;;;10589:13;;10531:79;:::o;10897:94::-;10937:4;10977:6;;;;;;;;;;;10961:22;;:12;:10;:12::i;:::-;:22;;;10954:29;;10897:94;:::o;19132:102::-;19180:6;19206:12;;;;;;;;;;;:18;;;:20;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;19206:20:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;19206:20:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;19206:20:0;;;;;;;;;;;;;;;;19199:27;;19132:102;:::o;19918:100::-;19969:41;19979:10;19991;20003:6;19969:9;:41::i;:::-;19918:100;:::o;32027:104::-;32073:7;32100:13;;;;;;;;;;;:21;;;:23;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;32100:23:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;32100:23:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;32100:23:0;;;;;;;;;;;;;;;;32093:30;;32027:104;:::o;17959:1097::-;18169:11;;;;;;;;;;;18168:12;18160:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18229:4;18215:11;;:18;;;;;;;;;;;;;;;;;;15831:1;18344:2;:18;18329:11;:33;;18321:79;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18561:1;18542:15;:20;;18534:66;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18643:1;18619:21;:25;18611:80;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18733:12;18719:27;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;18719:27:0;18704:12;;:42;;;;;;;;;;;;;;;;;;18787:17;18773:32;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;18773:32:0;18757:13;;:48;;;;;;;;;;;;;;;;;;18844:17;18830:32;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;18830:32:0;18816:11;;:46;;;;;;;;;;;;;;;;;;18886:11;18873:10;:24;;;;18925:15;18908:14;:32;;;;18973:18;18951:19;:40;;;;19027:21;19002:22;:46;;;;17959:1097;;;;;;:::o;32201:109::-;32253:7;32280:15;:22;;;;32273:29;;32201:109;:::o;22495:98::-;22569:16;22578:6;22569:8;:16::i;:::-;;22495:98;;;:::o;11637:109::-;10743:9;:7;:9::i;:::-;10735:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11710:28;11729:8;11710:18;:28::i;:::-;11637:109;:::o;34151:916::-;34191:7;34211:22;34236:1;34211:26;;34248:20;34271:13;:11;:13::i;:::-;34248:36;;34322:1;34301:17;;:22;34297:464;;;34357:12;34340:29;;34297:464;;;34402:22;34427:1;34402:26;;34448:9;34460:1;34448:13;;34443:148;34467:15;:22;;;;34463:1;:26;34443:148;;;34532:43;34551:23;34572:1;34551:20;:23::i;:::-;34532:14;:18;;:43;;;;:::i;:::-;34515:60;;34491:3;;;;;;;34443:148;;;;34622:55;34659:17;;34622:32;34641:12;34622:14;:18;;:32;;;;:::i;:::-;:36;;:55;;;;:::i;:::-;34605:72;;34712:37;34734:14;34712:17;;:21;;:37;;;;:::i;:::-;34692:17;:57;;;;34297:464;;34794:1;34777:14;:18;34773:253;;;34820:11;;;;;;;;;;;:20;;;34849:13;;;;;;;;;;;34865:14;34820:60;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;34820:60:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;34820:60:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;34820:60:0;;;;;;;;;;;;;;;;34812:137;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34969:45;34984:14;35000:13;:11;:13::i;:::-;34969:45;;;;;;;;;;;;;;;;;;;;;;;;34773:253;35045:14;35038:21;;;;34151:916;:::o;29870:101::-;29910:7;29945:17;:15;:17::i;:::-;29930:33;;29870:101;:::o;20719:1507::-;20827:1;20818:6;:10;20810:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20908:1;20885:25;;:11;:25;;;;20877:78;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20996:1;20974:18;;:23;:44;;;;21017:1;21001:13;:11;:13::i;:::-;:17;20974:44;20966:148;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21127:27;21179:1;21158:18;;:22;21157:139;;21262:34;21273:22;;21262:6;:10;;:34;;;;:::i;:::-;21157:139;;;21197:49;21232:13;:11;:13::i;:::-;21197:30;21220:6;21197:18;;:22;;:30;;;;:::i;:::-;:34;;:49;;;;:::i;:::-;21157:139;21127:169;;21337:1;21315:19;:23;21307:74;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21394:18;:16;:18::i;:::-;;;;;;;21456:25;21484:11;:24;21496:11;21484:24;;;;;;;;;;;;;;;21456:52;;21542:45;21567:19;21542:6;:20;;;:24;;:45;;;;:::i;:::-;21519:6;:20;;:68;;;;21634:3;21598:6;:33;;:39;;;;21650:21;;:::i;:::-;21674:31;;;;;;;;;21680:19;21674:31;;;;21701:3;21674:31;;;21650:55;;21716:11;:24;21728:11;21716:24;;;;;;;;;;;;;;;21746:8;21716:39;;39:1:-1;33:3;27:10;23:18;57:10;52:3;45:23;79:10;72:17;;0:93;21716:39:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21822:43;21845:19;21822:18;;:22;;:43;;;;:::i;:::-;21801:18;:64;;;;22004:12;;;;;;;;;;;:18;;;:20;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;22004:20:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;22004:20:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;22004:20:0;;;;;;;;;;;;;;;;:33;;;22038:6;22054:12;;;;;;;;;;;22069:6;22004:72;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;22004:72:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;22004:72:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;22004:72:0;;;;;;;;;;;;;;;;21996:144;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22165:11;22158:60;;;22178:6;22186:27;22201:11;22186:14;:27::i;:::-;22158:60;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20719:1507;;;;;;:::o;23394:3367::-;23445:7;23465:18;:16;:18::i;:::-;;;;;;;23532:1;23523:6;:10;23515:58;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23622:6;23592:26;23607:10;23592:14;:26::i;:::-;:36;;23584:123;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23718:27;23748:49;23783:13;:11;:13::i;:::-;23748:30;23771:6;23748:18;;:22;;:30;;;;:::i;:::-;:34;;:49;;;;:::i;:::-;23718:79;;23838:1;23816:19;:23;23808:84;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23936:25;23964:11;:23;23976:10;23964:23;;;;;;;;;;;;;;;23936:51;;23998:29;24030:11;:23;24042:10;24030:23;;;;;;;;;;;;;;;23998:55;;24134:33;24170:1;24134:37;;24182:24;24209:19;24182:46;;24239:20;24262:1;24239:24;;24274:1298;24300:1;24281:16;:20;24274:1298;;;24318:23;24344:13;24381:1;24358:13;:20;;;;:24;24344:39;;;;;;;;;;;;;;;;;;;;24318:65;;24398:20;24421:31;24429:9;:22;;;24421:3;:7;;:31;;;;:::i;:::-;24398:54;;24467:36;24506:1;24467:40;;24553:16;24526:9;:23;;;:43;;24522:1039;;;24667:41;24695:12;24667:9;:23;;;:27;;:41;;;;:::i;:::-;24636:72;;24742:74;24759:12;24773:28;24803:12;24742:16;:74::i;:::-;24727:89;;24863:59;24893:28;24863:25;:29;;:59;;;;:::i;:::-;24835:87;;24960:45;24981:9;:23;;;24960:16;:20;;:45;;;;:::i;:::-;24941:64;;25024:13;:22;;;;;;;;;;;;:::i;:::-;;24522:1039;;;25168:34;25189:12;25168:16;:20;;:34;;;;:::i;:::-;25137:65;;25236:74;25253:12;25267:28;25297:12;25236:16;:74::i;:::-;25221:89;;25357:59;25387:28;25357:25;:29;;:59;;;;:::i;:::-;25329:87;;25461:45;25489:16;25461:9;:23;;;:27;;:45;;;;:::i;:::-;25435:9;:23;;:71;;;;25544:1;25525:20;;24522:1039;24274:1298;;;;;;25611:57;25642:25;25611:6;:26;;;:30;;:57;;;;:::i;:::-;25582:6;:26;;:86;;;;25702:45;25727:19;25702:6;:20;;;:24;;:45;;;;:::i;:::-;25679:6;:20;;:68;;;;25918:56;25948:25;25918;;:29;;:56;;;;:::i;:::-;25890:25;:84;;;;26006:43;26029:19;26006:18;;:22;;:43;;;;:::i;:::-;25985:18;:64;;;;26186:12;;;;;;;;;;;:21;;;26208:10;26220:6;26186:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;26186:41:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;26186:41:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;26186:41:0;;;;;;;;;;;;;;;;26178:115;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26312:13;;;;;;;;;;;:22;;;26335:10;26347:12;26312:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;26312:48:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;26312:48:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;26312:48:0;;;;;;;;;;;;;;;;26304:123;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26454:10;26445:60;;;26466:6;26474:26;26489:10;26474:14;:26::i;:::-;26445:60;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26535:10;26521:39;;;26547:12;26521:39;;;;;;;;;;;;;;;;;;26603:1;26581:18;;:23;:44;;;;26624:1;26608:13;:11;:13::i;:::-;:17;26581:44;26573:150;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26741:12;26734:19;;;;;;;;23394:3367;;;:::o;1377:136::-;1435:7;1462:43;1466:1;1469;1462:43;;;;;;;;;;;;;;;;;;:3;:43::i;:::-;1455:50;;1377:136;;;;:::o;2293:471::-;2351:7;2601:1;2596;:6;2592:47;;;2626:1;2619:8;;;;2592:47;2651:9;2667:1;2663;:5;2651:17;;2696:1;2691;2687;:5;;;;;;;;:10;2679:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2755:1;2748:8;;;2293:471;;;;;:::o;921:181::-;979:7;999:9;1015:1;1011;:5;999:17;;1040:1;1035;:6;;1027:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1093:1;1086:8;;;921:181;;;;:::o;3232:132::-;3290:7;3317:39;3321:1;3324;3317:39;;;;;;;;;;;;;;;;;;:3;:39::i;:::-;3310:46;;3232:132;;;;:::o;9272:98::-;9317:15;9352:10;9345:17;;9272:98;:::o;11852:229::-;11946:1;11926:22;;:8;:22;;;;11918:73;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12036:8;12007:38;;12028:6;;;;;;;;;;;12007:38;;;;;;;;;;;;12065:8;12056:6;;:17;;;;;;;;;;;;;;;;;;11852:229;:::o;35437:920::-;35495:7;35515:31;35549:15;35565:1;35549:18;;;;;;;;;;;;;;;;;;;;35515:52;;35610:8;:28;;;35583:8;:23;;;:55;;35580:95;;;35662:1;35655:8;;;;;35580:95;35687:22;35712:1;35687:26;;35810:8;:17;;;35803:3;:24;;35799:437;;;35862:57;35895:8;:23;;;35862:8;:28;;;:32;;:57;;;;:::i;:::-;35844:76;;35969:8;:17;;;35935:8;:31;;:51;;;;35799:437;;;36036:136;36151:8;:20;;;36036:92;36099:8;:28;;;36036:40;36044:8;:31;;;36036:3;:7;;:40;;;;:::i;:::-;:62;;:92;;;;:::i;:::-;:114;;:136;;;;:::i;:::-;36019:153;;36221:3;36187:8;:31;;:37;;;;35799:437;36274:43;36302:14;36274:8;:23;;;:27;;:43;;;;:::i;:::-;36248:8;:23;;:69;;;;36335:14;36328:21;;;;35437:920;;;;:::o;27737:808::-;27931:7;27953:23;27992:99;28065:25;;27992:54;28026:19;27992:15;:13;:15::i;:::-;:33;;:54;;;;:::i;:::-;:72;;:99;;;;:::i;:::-;27953:138;;28124:14;;28108:12;:30;;28104:110;;;28162:40;28186:15;28162:19;:23;;:40;;;;:::i;:::-;28155:47;;;;;28104:110;28226:21;15831:1;28250:2;:18;28226:42;;28279:21;28316:165;28467:13;28316:132;28432:15;28316:97;28345:67;28397:14;;28345:47;28379:12;28345:29;28363:10;;28345:13;:17;;:29;;;;:::i;:::-;:33;;:47;;;;:::i;:::-;:51;;:67;;;;:::i;:::-;28316:10;;:28;;:97;;;;:::i;:::-;:115;;:132;;;;:::i;:::-;:150;;:165;;;;:::i;:::-;28279:202;;28499:38;28523:13;28499:19;:23;;:38;;;;:::i;:::-;28492:45;;;;;27737:808;;;;;;:::o;1850:192::-;1936:7;1969:1;1964;:6;;1972:12;1956:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;1956:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1996:9;2012:1;2008;:5;1996:17;;2033:1;2026:8;;;1850:192;;;;;:::o;3894:345::-;3980:7;4079:1;4075;:5;4082:12;4067:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;4067:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4106:9;4122:1;4118;:5;;;;;;;;4106:17;;4230:1;4223:8;;;3894:345;;;;;:::o;15120:21769::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o
Swarm Source
bzzr://03f7bc927a0582a6733e0d9991353261a1d887bc529e80f8dc922498fde8178f
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 34 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ 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.