Feature Tip: Add private address tag to any address under My Name Tag !
More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 6,706 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Withdraw R3Token... | 21270456 | 54 days ago | IN | 0 ETH | 0.0013544 | ||||
Withdraw R2Token... | 20720723 | 131 days ago | IN | 0 ETH | 0.00231109 | ||||
Withdraw R3Token... | 19959885 | 237 days ago | IN | 0 ETH | 0.00190656 | ||||
Withdraw Restake... | 19806730 | 259 days ago | IN | 0 ETH | 0.00026858 | ||||
Claim Dividends | 19806715 | 259 days ago | IN | 0 ETH | 0.00015554 | ||||
Withdraw R3Token... | 19806711 | 259 days ago | IN | 0 ETH | 0.00079342 | ||||
Withdraw Funds | 19806708 | 259 days ago | IN | 0 ETH | 0.00015794 | ||||
Withdraw R2Token... | 19806700 | 259 days ago | IN | 0 ETH | 0.00083563 | ||||
Withdraw R2Token... | 19687506 | 275 days ago | IN | 0 ETH | 0.00303459 | ||||
Withdraw Restake... | 19639534 | 282 days ago | IN | 0 ETH | 0.00075629 | ||||
Claim Dividends | 19639506 | 282 days ago | IN | 0 ETH | 0.0015468 | ||||
Withdraw R3Token... | 19593078 | 288 days ago | IN | 0 ETH | 0.00177121 | ||||
Claim Dividends | 19593000 | 288 days ago | IN | 0 ETH | 0.00030421 | ||||
Withdraw R3Token... | 19592939 | 288 days ago | IN | 0 ETH | 0.00193814 | ||||
Withdraw R1Token... | 19199257 | 344 days ago | IN | 0 ETH | 0.00406221 | ||||
Withdraw R2Token... | 19199248 | 344 days ago | IN | 0 ETH | 0.00410826 | ||||
Withdraw R3Token... | 19199240 | 344 days ago | IN | 0 ETH | 0.00368864 | ||||
Claim Dividends | 19199225 | 344 days ago | IN | 0 ETH | 0.00402729 | ||||
Withdraw R3Token... | 18893040 | 387 days ago | IN | 0 ETH | 0.00371663 | ||||
Withdraw R2Token... | 18892951 | 387 days ago | IN | 0 ETH | 0.0033169 | ||||
Claim Dividends | 18826897 | 396 days ago | IN | 0 ETH | 0.00129992 | ||||
Withdraw Restake... | 18826881 | 396 days ago | IN | 0 ETH | 0.00212798 | ||||
Claim Dividends | 18826874 | 396 days ago | IN | 0 ETH | 0.00479129 | ||||
Withdraw R3Token... | 18740655 | 408 days ago | IN | 0 ETH | 0.00457497 | ||||
Claim Dividends | 18740567 | 408 days ago | IN | 0 ETH | 0.00096145 |
Latest 7 internal transactions
Advanced mode:
Loading...
Loading
Contract Name:
UnistakeTokenSale
Compiler Version
v0.6.6+commit.6c089d02
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2020-10-05 */ pragma solidity 0.6.6; /** * @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. */ 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. */ function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { 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. */ function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b != 0, errorMessage); return a % b; } } interface IUniswapV2Router01 { function factory() external pure returns (address); function WETH() external pure returns (address); function addLiquidity( address tokenA, address tokenB, uint256 amountADesired, uint256 amountBDesired, uint256 amountAMin, uint256 amountBMin, address to, uint256 deadline ) external returns ( uint256 amountA, uint256 amountB, uint256 liquidity ); function addLiquidityETH( address token, uint256 amountTokenDesired, uint256 amountTokenMin, uint256 amountETHMin, address to, uint256 deadline ) external payable returns ( uint256 amountToken, uint256 amountETH, uint256 liquidity ); function removeLiquidity( address tokenA, address tokenB, uint256 liquidity, uint256 amountAMin, uint256 amountBMin, address to, uint256 deadline ) external returns (uint256 amountA, uint256 amountB); function removeLiquidityETH( address token, uint256 liquidity, uint256 amountTokenMin, uint256 amountETHMin, address to, uint256 deadline ) external returns (uint256 amountToken, uint256 amountETH); function removeLiquidityWithPermit( address tokenA, address tokenB, uint256 liquidity, uint256 amountAMin, uint256 amountBMin, address to, uint256 deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) external returns (uint256 amountA, uint256 amountB); function removeLiquidityETHWithPermit( address token, uint256 liquidity, uint256 amountTokenMin, uint256 amountETHMin, address to, uint256 deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) external returns (uint256 amountToken, uint256 amountETH); function swapExactTokensForTokens( uint256 amountIn, uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external returns (uint256[] memory amounts); function swapTokensForExactTokens( uint256 amountOut, uint256 amountInMax, address[] calldata path, address to, uint256 deadline ) external returns (uint256[] memory amounts); function swapExactETHForTokens( uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external payable returns (uint256[] memory amounts); function swapTokensForExactETH( uint256 amountOut, uint256 amountInMax, address[] calldata path, address to, uint256 deadline ) external returns (uint256[] memory amounts); function swapExactTokensForETH( uint256 amountIn, uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external returns (uint256[] memory amounts); function swapETHForExactTokens( uint256 amountOut, address[] calldata path, address to, uint256 deadline ) external payable returns (uint256[] memory amounts); function quote( uint256 amountA, uint256 reserveA, uint256 reserveB ) external pure returns (uint256 amountB); function getAmountOut( uint256 amountIn, uint256 reserveIn, uint256 reserveOut ) external pure returns (uint256 amountOut); function getAmountIn( uint256 amountOut, uint256 reserveIn, uint256 reserveOut ) external pure returns (uint256 amountIn); function getAmountsOut(uint256 amountIn, address[] calldata path) external view returns (uint256[] memory amounts); function getAmountsIn(uint256 amountOut, address[] calldata path) external view returns (uint256[] memory amounts); } interface IUniswapV2Router02 is IUniswapV2Router01 { function removeLiquidityETHSupportingFeeOnTransferTokens( address token, uint256 liquidity, uint256 amountTokenMin, uint256 amountETHMin, address to, uint256 deadline ) external returns (uint256 amountETH); function removeLiquidityETHWithPermitSupportingFeeOnTransferTokens( address token, uint256 liquidity, uint256 amountTokenMin, uint256 amountETHMin, address to, uint256 deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) external returns (uint256 amountETH); function swapExactTokensForTokensSupportingFeeOnTransferTokens( uint256 amountIn, uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external; function swapExactETHForTokensSupportingFeeOnTransferTokens( uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external payable; function swapExactTokensForETHSupportingFeeOnTransferTokens( uint256 amountIn, uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external; } /** * @dev Interface of the ERC20 standard as defined in the EIP. */ 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); } /** * @dev Implementation of the {IERC20} interface. * * This implementation is agnostic to the way tokens are created. This means * that a supply mechanism has to be added in a derived contract using {_mint}. * For a generic mechanism see {ERC20PresetMinterPauser}. * * TIP: For a detailed writeup see our guide * https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How * to implement supply mechanisms]. * * We have followed general OpenZeppelin guidelines: functions revert instead * of returning `false` on failure. This behavior is nonetheless conventional * and does not conflict with the expectations of ERC20 applications. * * Additionally, an {Approval} event is emitted on calls to {transferFrom}. * This allows applications to reconstruct the allowance for all accounts just * by listening to said events. Other implementations of the EIP may not emit * these events, as it isn't required by the specification. * * Finally, the non-standard {decreaseAllowance} and {increaseAllowance} * functions have been added to mitigate the well-known issues around setting * allowances. See {IERC20-approve}. */ contract ERC20 is IERC20 { using SafeMath for uint256; mapping(address => uint256) private _balances; mapping(address => mapping(address => uint256)) private _allowances; uint256 private _totalSupply; string private _name; string private _symbol; uint8 private _decimals; /** * @dev Sets the values for {name} and {symbol}, initializes {decimals} with * a default value of 18. * * To select a different value for {decimals}, use {_setupDecimals}. * * All three of these values are immutable: they can only be set once during * construction. */ constructor(string memory name, string memory symbol) public { _name = name; _symbol = symbol; _decimals = 18; } /** * @dev Returns the name of the token. */ function name() public view returns (string memory) { return _name; } /** * @dev Returns the symbol of the token, usually a shorter version of the * name. */ function symbol() public view returns (string memory) { return _symbol; } /** * @dev Returns the number of decimals used to get its user representation. * For example, if `decimals` equals `2`, a balance of `505` tokens should * be displayed to a user as `5,05` (`505 / 10 ** 2`). * * Tokens usually opt for a value of 18, imitating the relationship between * Ether and Wei. This is the value {ERC20} uses, unless {_setupDecimals} is * called. * * NOTE: This information is only used for _display_ purposes: it in * no way affects any of the arithmetic of the contract, including * {IERC20-balanceOf} and {IERC20-transfer}. */ function decimals() public view returns (uint8) { return _decimals; } /** * @dev See {IERC20-totalSupply}. */ function totalSupply() public override view returns (uint256) { return _totalSupply; } /** * @dev See {IERC20-balanceOf}. */ function balanceOf(address account) public override view returns (uint256) { return _balances[account]; } /** * @dev See {IERC20-transfer}. * * Requirements: * * - `recipient` cannot be the zero address. * - the caller must have a balance of at least `amount`. */ function transfer(address recipient, uint256 amount) public override returns (bool) { _transfer(msg.sender, recipient, amount); return true; } /** * @dev See {IERC20-allowance}. */ function allowance(address owner, address spender) public override view returns (uint256) { return _allowances[owner][spender]; } /** * @dev See {IERC20-approve}. * * Requirements: * * - `spender` cannot be the zero address. */ function approve(address spender, uint256 amount) public override returns (bool) { _approve(msg.sender, spender, amount); return true; } /** * @dev See {IERC20-transferFrom}. * * Emits an {Approval} event indicating the updated allowance. This is not * required by the EIP. See the note at the beginning of {ERC20}; * * Requirements: * - `sender` and `recipient` cannot be the zero address. * - `sender` must have a balance of at least `amount`. * - the caller must have allowance for ``sender``'s tokens of at least * `amount`. */ function transferFrom( address sender, address recipient, uint256 amount ) public virtual override returns (bool) { _transfer(sender, recipient, amount); _approve( sender, msg.sender, _allowances[sender][msg.sender].sub( amount, 'ERC20: transfer amount exceeds allowance' ) ); return true; } /** * @dev Atomically increases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {IERC20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. */ function increaseAllowance(address spender, uint256 addedValue) public returns (bool) { _approve( msg.sender, spender, _allowances[msg.sender][spender].add(addedValue) ); return true; } /** * @dev Atomically decreases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {IERC20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. * - `spender` must have allowance for the caller of at least * `subtractedValue`. */ function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) { _approve( msg.sender, spender, _allowances[msg.sender][spender].sub( subtractedValue, 'ERC20: decreased allowance below zero' ) ); return true; } /** * @dev Moves tokens `amount` from `sender` to `recipient`. * * This is internal function is equivalent to {transfer}, and can be used to * e.g. implement automatic token fees, slashing mechanisms, etc. * * Emits a {Transfer} event. * * Requirements: * * - `sender` cannot be the zero address. * - `recipient` cannot be the zero address. * - `sender` must have a balance of at least `amount`. */ function _transfer( address sender, address recipient, uint256 amount ) internal virtual { require(sender != address(0), 'ERC20: transfer from the zero address'); require(recipient != address(0), 'ERC20: transfer to the zero address'); _balances[sender] = _balances[sender].sub( amount, 'ERC20: transfer amount exceeds balance' ); _balances[recipient] = _balances[recipient].add(amount); emit Transfer(sender, recipient, amount); } /** @dev Creates `amount` tokens and assigns them to `account`, increasing * the total supply. * * Emits a {Transfer} event with `from` set to the zero address. * * Requirements * * - `to` cannot be the zero address. */ function _mint(address account, uint256 amount) internal virtual { require(account != address(0), 'ERC20: mint to the zero address'); _totalSupply = _totalSupply.add(amount); _balances[account] = _balances[account].add(amount); emit Transfer(address(0), account, amount); } /** * @dev Destroys `amount` tokens from `account`, reducing the * total supply. * * Emits a {Transfer} event with `to` set to the zero address. * * Requirements * * - `account` cannot be the zero address. * - `account` must have at least `amount` tokens. */ function _burn(address account, uint256 amount) internal virtual { require(account != address(0), 'ERC20: burn from the zero address'); _balances[account] = _balances[account].sub( amount, 'ERC20: burn amount exceeds balance' ); _totalSupply = _totalSupply.sub(amount); emit Transfer(account, address(0), amount); } /** * @dev Sets `amount` as the allowance of `spender` over the `owner`s tokens. * * This is internal function is equivalent to `approve`, and can be used to * e.g. set automatic allowances for certain subsystems, etc. * * Emits an {Approval} event. * * Requirements: * * - `owner` cannot be the zero address. * - `spender` cannot be the zero address. */ function _approve( address owner, address spender, uint256 amount ) internal virtual { require(owner != address(0), 'ERC20: approve from the zero address'); require(spender != address(0), 'ERC20: approve to the zero address'); _allowances[owner][spender] = amount; emit Approval(owner, spender, amount); } } /** * @dev Extension of {ERC20} that allows token holders to destroy both their own * tokens and those that they have an allowance for, in a way that can be * recognized off-chain (via event analysis). */ abstract contract ERC20Burnable is ERC20 { /** * @dev Destroys `amount` tokens from the caller. * * See {ERC20-_burn}. */ function burn(uint256 amount) public virtual { _burn(msg.sender, amount); } /** * @dev Destroys `amount` tokens from `account`, deducting from the caller's * allowance. * * See {ERC20-_burn} and {ERC20-allowance}. * * Requirements: * * - the caller must have allowance for ``accounts``'s tokens of at least * `amount`. */ function burnFrom(address account, uint256 amount) public virtual { uint256 decreasedAllowance = allowance(account, msg.sender).sub( amount, 'ERC20: burn amount exceeds allowance' ); _approve(account, msg.sender, decreasedAllowance); _burn(account, amount); } } /* * @dev Implementation of a token compliant with the ERC20 Token protocol; * The token has additional burn functionality. */ contract Token is ERC20Burnable { using SafeMath for uint256; /* * @dev Initialization of the token, * following arguments are provided via the constructor: name, symbol, recipient, totalSupply. * The total supply of tokens is minted to the specified recipient. */ constructor( string memory name, string memory symbol, address recipient, uint256 totalSupply ) public ERC20(name, symbol) { _mint(recipient, totalSupply); } } /* * @dev Implementation of the Initial Stake Offering (ISO). * The ISO is a decentralized token offering with trustless liquidity provisioning, * dividend accumulation and bonus rewards from staking. */ contract UnistakeTokenSale { using SafeMath for uint256; struct Contributor { uint256 phase; uint256 remainder; uint256 fromTotalDivs; } address payable public immutable wallet; uint256 public immutable totalSupplyR1; uint256 public immutable totalSupplyR2; uint256 public immutable totalSupplyR3; uint256 public immutable totalSupplyUniswap; uint256 public immutable rateR1; uint256 public immutable rateR2; uint256 public immutable rateR3; uint256 public immutable periodDurationR3; uint256 public immutable timeDelayR1; uint256 public immutable timeDelayR2; uint256 public immutable stakingPeriodR1; uint256 public immutable stakingPeriodR2; uint256 public immutable stakingPeriodR3; Token public immutable token; IUniswapV2Router02 public immutable uniswapRouter; uint256 public immutable decreasingPctToken; uint256 public immutable decreasingPctETH; uint256 public immutable decreasingPctRate; uint256 public immutable decreasingPctBonus; uint256 public immutable listingRate; address public immutable platformStakingContract; mapping(address => bool) private _contributor; mapping(address => Contributor) private _contributors; mapping(address => uint256)[3] private _contributions; bool[3] private _hasEnded; uint256[3] private _actualSupply; uint256 private _startTimeR2 = 2**256 - 1; uint256 private _startTimeR3 = 2**256 - 1; uint256 private _endTimeR3 = 2**256 - 1; mapping(address => bool)[3] private _hasWithdrawn; bool private _bonusOfferingActive; uint256 private _bonusOfferingActivated; uint256 private _bonusTotal; uint256 private _contributionsTotal; uint256 private _contributorsTotal; uint256 private _contributedFundsTotal; uint256 private _bonusReductionFactor; uint256 private _fundsWithdrawn; uint256 private _endedDayR3; uint256 private _latestStakingPlatformPayment; uint256 private _totalDividends; uint256 private _scaledRemainder; uint256 private _scaling = uint256(10) ** 12; uint256 private _phase = 1; uint256 private _totalRestakedDividends; mapping(address => uint256) private _restkedDividends; mapping(uint256 => uint256) private _payouts; event Staked( address indexed account, uint256 amount); event Claimed( address indexed account, uint256 amount); event Reclaimed( address indexed account, uint256 amount); event Withdrawn( address indexed account, uint256 amount); event Penalized( address indexed account, uint256 amount); event Ended( address indexed account, uint256 amount, uint256 time); event Splitted( address indexed account, uint256 amount1, uint256 amount2); event Bought( uint8 indexed round, address indexed account, uint256 amount); event Activated( bool status, uint256 time); /* * @dev Initialization of the ISO, * following arguments are provided via the constructor: * ---------------------------------------------------- * tokenArg - token offered in the ISO. * totalSupplyArg - total amount of tokens allocated for each round. * totalSupplyUniswapArg - amount of tokens that will be sent to uniswap. * ratesArg - contribution ratio ETH:Token for each round. * periodDurationR3 - duration of a day during round 3. * timeDelayR1Arg - time delay between round 1 and round 2. * timeDelayR2Arg - time delay between round 2 and round 3. * stakingPeriodArg - staking duration required to get bonus tokens for each round. * uniswapRouterArg - contract address of the uniswap router object. * decreasingPctArg - decreasing percentages associated with: token, ETH, rate, and bonus. * listingRateArg - initial listing rate of the offered token. * platformStakingContractArg - contract address of the timed distribution contract. * walletArg - account address of the team wallet. * */ constructor( address tokenArg, uint256[3] memory totalSupplyArg, uint256 totalSupplyUniswapArg, uint256[3] memory ratesArg, uint256 periodDurationR3Arg, uint256 timeDelayR1Arg, uint256 timeDelayR2Arg, uint256[3] memory stakingPeriodArg, address uniswapRouterArg, uint256[4] memory decreasingPctArg, uint256 listingRateArg, address platformStakingContractArg, address payable walletArg ) public { for (uint256 j = 0; j < 3; j++) { require(totalSupplyArg[j] > 0, "The 'totalSupplyArg' argument must be larger than zero"); require(ratesArg[j] > 0, "The 'ratesArg' argument must be larger than zero"); require(stakingPeriodArg[j] > 0, "The 'stakingPeriodArg' argument must be larger than zero"); } for (uint256 j = 0; j < 4; j++) { require(decreasingPctArg[j] < 10000, "The 'decreasingPctArg' arguments must be less than 100 percent"); } require(totalSupplyUniswapArg > 0, "The 'totalSupplyUniswapArg' argument must be larger than zero"); require(periodDurationR3Arg > 0, "The 'slotDurationR3Arg' argument must be larger than zero"); require(tokenArg != address(0), "The 'tokenArg' argument cannot be the zero address"); require(uniswapRouterArg != address(0), "The 'uniswapRouterArg' argument cannot be the zero addresss"); require(listingRateArg > 0, "The 'listingRateArg' argument must be larger than zero"); require(platformStakingContractArg != address(0), "The 'vestingContractArg' argument cannot be the zero address"); require(walletArg != address(0), "The 'walletArg' argument cannot be the zero address"); token = Token(tokenArg); totalSupplyR1 = totalSupplyArg[0]; totalSupplyR2 = totalSupplyArg[1]; totalSupplyR3 = totalSupplyArg[2]; totalSupplyUniswap = totalSupplyUniswapArg; periodDurationR3 = periodDurationR3Arg; timeDelayR1 = timeDelayR1Arg; timeDelayR2 = timeDelayR2Arg; rateR1 = ratesArg[0]; rateR2 = ratesArg[1]; rateR3 = ratesArg[2]; stakingPeriodR1 = stakingPeriodArg[0]; stakingPeriodR2 = stakingPeriodArg[1]; stakingPeriodR3 = stakingPeriodArg[2]; uniswapRouter = IUniswapV2Router02(uniswapRouterArg); decreasingPctToken = decreasingPctArg[0]; decreasingPctETH = decreasingPctArg[1]; decreasingPctRate = decreasingPctArg[2]; decreasingPctBonus = decreasingPctArg[3]; listingRate = listingRateArg; platformStakingContract = platformStakingContractArg; wallet = walletArg; } /** * @dev The fallback function is used for all contributions * during the ISO. The function monitors the current * round and manages token contributions accordingly. */ receive() external payable { if (token.balanceOf(address(this)) > 0) { uint8 currentRound = _calculateCurrentRound(); if (currentRound == 0) { _buyTokenR1(); } else if (currentRound == 1) { _buyTokenR2(); } else if (currentRound == 2) { _buyTokenR3(); } else { revert("The stake offering rounds are not active"); } } else { revert("The stake offering must be active"); } } /** * @dev Wrapper around the round 3 closing function. */ function closeR3() external { uint256 period = _calculatePeriod(block.timestamp); _closeR3(period); } /** * @dev This function prepares the staking and bonus reward settings * and it also provides liquidity to a freshly created uniswap pair. */ function activateStakesAndUniswapLiquidity() external { require(_hasEnded[0] && _hasEnded[1] && _hasEnded[2], "all rounds must have ended"); require(!_bonusOfferingActive, "the bonus offering and uniswap paring can only be done once per ISO"); uint256[3] memory bonusSupplies = [ (_actualSupply[0].mul(_bonusReductionFactor)).div(10000), (_actualSupply[1].mul(_bonusReductionFactor)).div(10000), (_actualSupply[2].mul(_bonusReductionFactor)).div(10000) ]; uint256 totalSupply = totalSupplyR1.add(totalSupplyR2).add(totalSupplyR3); uint256 soldSupply = _actualSupply[0].add(_actualSupply[1]).add(_actualSupply[2]); uint256 unsoldSupply = totalSupply.sub(soldSupply); uint256 exceededBonus = totalSupply .sub(bonusSupplies[0]) .sub(bonusSupplies[1]) .sub(bonusSupplies[2]); uint256 exceededUniswapAmount = _createUniswapPair(_endedDayR3); _bonusOfferingActive = true; _bonusOfferingActivated = block.timestamp; _bonusTotal = bonusSupplies[0].add(bonusSupplies[1]).add(bonusSupplies[2]); _contributionsTotal = soldSupply; _distribute(unsoldSupply.add(exceededBonus).add(exceededUniswapAmount)); emit Activated(true, block.timestamp); } /** * @dev This function allows the caller to stake claimable dividends. */ function restakeDividends() external { uint256 pending = _pendingDividends(msg.sender); pending = pending.add(_contributors[msg.sender].remainder); require(pending >= 0, "You do not have dividends to restake"); _restkedDividends[msg.sender] = _restkedDividends[msg.sender].add(pending); _totalRestakedDividends = _totalRestakedDividends.add(pending); _bonusTotal = _bonusTotal.sub(pending); _contributors[msg.sender].phase = _phase; _contributors[msg.sender].remainder = 0; _contributors[msg.sender].fromTotalDivs = _totalDividends; emit Staked(msg.sender, pending); } /** * @dev This function is called by contributors to * withdraw round 1 tokens. * ----------------------------------------------------- * Withdrawing tokens might result in bonus tokens, dividends, * or similar (based on the staking duration of the contributor). * */ function withdrawR1Tokens() external { require(_bonusOfferingActive, "The bonus offering is not active yet"); _withdrawTokens(0); } /** * @dev This function is called by contributors to * withdraw round 2 tokens. * ----------------------------------------------------- * Withdrawing tokens might result in bonus tokens, dividends, * or similar (based on the staking duration of the contributor). * */ function withdrawR2Tokens() external { require(_bonusOfferingActive, "The bonus offering is not active yet"); _withdrawTokens(1); } /** * @dev This function is called by contributors to * withdraw round 3 tokens. * ----------------------------------------------------- * Withdrawing tokens might result in bonus tokens, dividends, * or similar (based on the staking duration of the contributor). * */ function withdrawR3Tokens() external { require(_bonusOfferingActive, "The bonus offering is not active yet"); _withdrawTokens(2); } /** * @dev wrapper around the withdrawal of funds function. */ function withdrawFunds() external { uint256 amount = ((address(this).balance).sub(_fundsWithdrawn)).div(2); _withdrawFunds(amount); } /** * @dev Returns the total amount of restaked dividends in the ISO. */ function getRestakedDividendsTotal() external view returns (uint256) { return _totalRestakedDividends; } /** * @dev Returns the total staking bonuses in the ISO. */ function getStakingBonusesTotal() external view returns (uint256) { return _bonusTotal; } /** * @dev Returns the latest amount of tokens sent to the timed distribution contract. */ function getLatestStakingPlatformPayment() external view returns (uint256) { return _latestStakingPlatformPayment; } /** * @dev Returns the current day of round 3. */ function getCurrentDayR3() external view returns (uint256) { if (_endedDayR3 != 0) { return _endedDayR3; } return _calculatePeriod(block.timestamp); } /** * @dev Returns the ending day of round 3. */ function getEndedDayR3() external view returns (uint256) { return _endedDayR3; } /** * @dev Returns the start time of round 2. */ function getR2Start() external view returns (uint256) { return _startTimeR2; } /** * @dev Returns the start time of round 3. */ function getR3Start() external view returns (uint256) { return _startTimeR3; } /** * @dev Returns the end time of round 3. */ function getR3End() external view returns (uint256) { return _endTimeR3; } /** * @dev Returns the total amount of contributors in the ISO. */ function getContributorsTotal() external view returns (uint256) { return _contributorsTotal; } /** * @dev Returns the total amount of contributed funds (ETH) in the ISO */ function getContributedFundsTotal() external view returns (uint256) { return _contributedFundsTotal; } /** * @dev Returns the current round of the ISO. */ function getCurrentRound() external view returns (uint8) { uint8 round = _calculateCurrentRound(); if (round == 0 && !_hasEnded[0]) { return 1; } if (round == 1 && !_hasEnded[1] && _hasEnded[0]) { if (block.timestamp <= _startTimeR2) { return 0; } return 2; } if (round == 2 && !_hasEnded[2] && _hasEnded[1]) { if (block.timestamp <= _startTimeR3) { return 0; } return 3; } else { return 0; } } /** * @dev Returns whether round 1 has ended or not. */ function hasR1Ended() external view returns (bool) { return _hasEnded[0]; } /** * @dev Returns whether round 2 has ended or not. */ function hasR2Ended() external view returns (bool) { return _hasEnded[1]; } /** * @dev Returns whether round 3 has ended or not. */ function hasR3Ended() external view returns (bool) { return _hasEnded[2]; } /** * @dev Returns the remaining time delay between round 1 and round 2. */ function getRemainingTimeDelayR1R2() external view returns (uint256) { if (timeDelayR1 > 0) { if (_hasEnded[0] && !_hasEnded[1]) { if (_startTimeR2.sub(block.timestamp) > 0) { return _startTimeR2.sub(block.timestamp); } else { return 0; } } else { return 0; } } else { return 0; } } /** * @dev Returns the remaining time delay between round 2 and round 3. */ function getRemainingTimeDelayR2R3() external view returns (uint256) { if (timeDelayR2 > 0) { if (_hasEnded[0] && _hasEnded[1] && !_hasEnded[2]) { if (_startTimeR3.sub(block.timestamp) > 0) { return _startTimeR3.sub(block.timestamp); } else { return 0; } } else { return 0; } } else { return 0; } } /** * @dev Returns the total sales for round 1. */ function getR1Sales() external view returns (uint256) { return _actualSupply[0]; } /** * @dev Returns the total sales for round 2. */ function getR2Sales() external view returns (uint256) { return _actualSupply[1]; } /** * @dev Returns the total sales for round 3. */ function getR3Sales() external view returns (uint256) { return _actualSupply[2]; } /** * @dev Returns whether the staking- and bonus functionality has been activated or not. */ function getStakingActivationStatus() external view returns (bool) { return _bonusOfferingActive; } /** * @dev This function allows the caller to withdraw claimable dividends. */ function claimDividends() public { if (_totalDividends > _contributors[msg.sender].fromTotalDivs) { uint256 pending = _pendingDividends(msg.sender); pending = pending.add(_contributors[msg.sender].remainder); require(pending >= 0, "You do not have dividends to claim"); _contributors[msg.sender].phase = _phase; _contributors[msg.sender].remainder = 0; _contributors[msg.sender].fromTotalDivs = _totalDividends; _bonusTotal = _bonusTotal.sub(pending); require(token.transfer(msg.sender, pending), "Error in sending reward from contract"); emit Claimed(msg.sender, pending); } } /** * @dev This function allows the caller to withdraw restaked dividends. */ function withdrawRestakedDividends() public { uint256 amount = _restkedDividends[msg.sender]; require(amount >= 0, "You do not have restaked dividends to withdraw"); claimDividends(); _restkedDividends[msg.sender] = 0; _totalRestakedDividends = _totalRestakedDividends.sub(amount); token.transfer(msg.sender, amount); emit Reclaimed(msg.sender, amount); } /** * @dev Returns claimable dividends. */ function getDividends(address accountArg) public view returns (uint256) { uint256 amount = ((_totalDividends.sub(_payouts[_contributors[accountArg].phase - 1])).mul(getContributionTotal(accountArg))).div(_scaling); amount += ((_totalDividends.sub(_payouts[_contributors[accountArg].phase - 1])).mul(getContributionTotal(accountArg))) % _scaling ; return (amount.add(_contributors[msg.sender].remainder)); } /** * @dev Returns restaked dividends. */ function getRestakedDividends(address accountArg) public view returns (uint256) { return _restkedDividends[accountArg]; } /** * @dev Returns round 1 contributions of an account. */ function getR1Contribution(address accountArg) public view returns (uint256) { return _contributions[0][accountArg]; } /** * @dev Returns round 2 contributions of an account. */ function getR2Contribution(address accountArg) public view returns (uint256) { return _contributions[1][accountArg]; } /** * @dev Returns round 3 contributions of an account. */ function getR3Contribution(address accountArg) public view returns (uint256) { return _contributions[2][accountArg]; } /** * @dev Returns the total contributions of an account. */ function getContributionTotal(address accountArg) public view returns (uint256) { uint256 contributionR1 = getR1Contribution(accountArg); uint256 contributionR2 = getR2Contribution(accountArg); uint256 contributionR3 = getR3Contribution(accountArg); uint256 restaked = getRestakedDividends(accountArg); return contributionR1.add(contributionR2).add(contributionR3).add(restaked); } /** * @dev Returns the total contributions in the ISO (including restaked dividends). */ function getContributionsTotal() public view returns (uint256) { return _contributionsTotal.add(_totalRestakedDividends); } /** * @dev Returns expected round 1 staking bonus for an account. */ function getStakingBonusR1(address accountArg) public view returns (uint256) { uint256 contribution = _contributions[0][accountArg]; return (contribution.mul(_bonusReductionFactor)).div(10000); } /** * @dev Returns expected round 2 staking bonus for an account. */ function getStakingBonusR2(address accountArg) public view returns (uint256) { uint256 contribution = _contributions[1][accountArg]; return (contribution.mul(_bonusReductionFactor)).div(10000); } /** * @dev Returns expected round 3 staking bonus for an account. */ function getStakingBonusR3(address accountArg) public view returns (uint256) { uint256 contribution = _contributions[2][accountArg]; return (contribution.mul(_bonusReductionFactor)).div(10000); } /** * @dev Returns the total expected staking bonuses for an account. */ function getStakingBonusTotal(address accountArg) public view returns (uint256) { uint256 stakeR1 = getStakingBonusR1(accountArg); uint256 stakeR2 = getStakingBonusR2(accountArg); uint256 stakeR3 = getStakingBonusR3(accountArg); return stakeR1.add(stakeR2).add(stakeR3); } /** * @dev This function handles distribution of extra supply. */ function _distribute(uint256 amountArg) private { uint256 vested = amountArg.div(2); uint256 burned = amountArg.sub(vested); token.transfer(platformStakingContract, vested); token.burn(burned); } /** * @dev This function handles calculation of token withdrawals * (it also withdraws dividends and restaked dividends * during certain circumstances). */ function _withdrawTokens(uint8 indexArg) private { require(_hasEnded[0] && _hasEnded[1] && _hasEnded[2], "The rounds must be inactive before any tokens can be withdrawn"); require(!_hasWithdrawn[indexArg][msg.sender], "The caller must have withdrawable tokens available from this round"); claimDividends(); uint256 amount = _contributions[indexArg][msg.sender]; uint256 amountBonus = (amount.mul(_bonusReductionFactor)).div(10000); _contributions[indexArg][msg.sender] = _contributions[indexArg][msg.sender].sub(amount); _contributionsTotal = _contributionsTotal.sub(amount); uint256 contributions = getContributionTotal(msg.sender); uint256 restaked = getRestakedDividends(msg.sender); if (contributions.sub(restaked) == 0) withdrawRestakedDividends(); uint pending = _pendingDividends(msg.sender); _contributors[msg.sender].remainder = (_contributors[msg.sender].remainder).add(pending); _contributors[msg.sender].fromTotalDivs = _totalDividends; _contributors[msg.sender].phase = _phase; _hasWithdrawn[indexArg][msg.sender] = true; token.transfer(msg.sender, amount); _endStake(indexArg, msg.sender, amountBonus); } /** * @dev This function handles fund withdrawals. */ function _withdrawFunds(uint256 amountArg) private { require(msg.sender == wallet, "The caller must be the specified funds wallet of the team"); require(amountArg <= ((address(this).balance.sub(_fundsWithdrawn)).div(2)), "The 'amountArg' argument exceeds the limit"); require(!_hasEnded[2], "The third round is not active"); _fundsWithdrawn = _fundsWithdrawn.add(amountArg); wallet.transfer(amountArg); } /** * @dev This function handles token purchases for round 1. */ function _buyTokenR1() private { if (token.balanceOf(address(this)) > 0) { require(!_hasEnded[0], "The first round must be active"); bool isRoundEnded = _buyToken(0, rateR1, totalSupplyR1); if (isRoundEnded == true) { _startTimeR2 = block.timestamp.add(timeDelayR1); } } else { revert("The stake offering must be active"); } } /** * @dev This function handles token purchases for round 2. */ function _buyTokenR2() private { require(_hasEnded[0] && !_hasEnded[1], "The first round one must not be active while the second round must be active"); require(block.timestamp >= _startTimeR2, "The time delay between the first round and the second round must be surpassed"); bool isRoundEnded = _buyToken(1, rateR2, totalSupplyR2); if (isRoundEnded == true) { _startTimeR3 = block.timestamp.add(timeDelayR2); } } /** * @dev This function handles token purchases for round 3. */ function _buyTokenR3() private { require(_hasEnded[1] && !_hasEnded[2], "The second round one must not be active while the third round must be active"); require(block.timestamp >= _startTimeR3, "The time delay between the first round and the second round must be surpassed"); uint256 period = _calculatePeriod(block.timestamp); (bool isRoundClosed, uint256 actualPeriodTotalSupply) = _closeR3(period); if (!isRoundClosed) { bool isRoundEnded = _buyToken(2, rateR3, actualPeriodTotalSupply); if (isRoundEnded == true) { _endTimeR3 = block.timestamp; uint256 endingPeriod = _calculateEndingPeriod(); uint256 reductionFactor = _calculateBonusReductionFactor(endingPeriod); _bonusReductionFactor = reductionFactor; _endedDayR3 = endingPeriod; } } } /** * @dev This function handles bonus payouts and the split of forfeited bonuses. */ function _endStake(uint256 indexArg, address accountArg, uint256 amountArg) private { uint256 elapsedTime = (block.timestamp).sub(_bonusOfferingActivated); uint256 payout; uint256 duration = _getDuration(indexArg); if (elapsedTime >= duration) { payout = amountArg; } else if (elapsedTime >= duration.mul(3).div(4) && elapsedTime < duration) { payout = amountArg.mul(3).div(4); } else if (elapsedTime >= duration.div(2) && elapsedTime < duration.mul(3).div(4)) { payout = amountArg.div(2); } else if (elapsedTime >= duration.div(4) && elapsedTime < duration.div(2)) { payout = amountArg.div(4); } else { payout = 0; } _split(amountArg.sub(payout)); if (payout != 0) { token.transfer(accountArg, payout); } emit Ended(accountArg, amountArg, block.timestamp); } /** * @dev This function splits forfeited bonuses into dividends * and to timed distribution contract accordingly. */ function _split(uint256 amountArg) private { if (amountArg == 0) { return; } uint256 dividends = amountArg.div(2); uint256 platformStakingShare = amountArg.sub(dividends); _bonusTotal = _bonusTotal.sub(platformStakingShare); _latestStakingPlatformPayment = platformStakingShare; token.transfer(platformStakingContract, platformStakingShare); _addDividends(_latestStakingPlatformPayment); emit Splitted(msg.sender, dividends, platformStakingShare); } /** * @dev this function handles addition of new dividends. */ function _addDividends(uint256 bonusArg) private { uint256 latest = (bonusArg.mul(_scaling)).add(_scaledRemainder); uint256 dividendPerToken = latest.div(_contributionsTotal.add(_totalRestakedDividends)); _scaledRemainder = latest.mod(_contributionsTotal.add(_totalRestakedDividends)); _totalDividends = _totalDividends.add(dividendPerToken); _payouts[_phase] = _payouts[_phase-1].add(dividendPerToken); _phase++; } /** * @dev returns pending dividend rewards. */ function _pendingDividends(address accountArg) private returns (uint256) { uint256 amount = ((_totalDividends.sub(_payouts[_contributors[accountArg].phase - 1])).mul(getContributionTotal(accountArg))).div(_scaling); _contributors[accountArg].remainder += ((_totalDividends.sub(_payouts[_contributors[accountArg].phase - 1])).mul(getContributionTotal(accountArg))) % _scaling ; return amount; } /** * @dev This function creates a uniswap pair and handles liquidity provisioning. * Returns the uniswap token leftovers. */ function _createUniswapPair(uint256 endingPeriodArg) private returns (uint256) { uint256 listingPrice = endingPeriodArg.mul(decreasingPctRate); uint256 ethDecrease = uint256(5000).sub(endingPeriodArg.mul(decreasingPctETH)); uint256 ethOnUniswap = (_contributedFundsTotal.mul(ethDecrease)).div(10000); ethOnUniswap = ethOnUniswap <= (address(this).balance) ? ethOnUniswap : (address(this).balance); uint256 tokensOnUniswap = ethOnUniswap .mul(listingRate) .mul(10000) .div(uint256(10000).sub(listingPrice)) .div(100000); token.approve(address(uniswapRouter), tokensOnUniswap); uniswapRouter.addLiquidityETH.value(ethOnUniswap)( address(token), tokensOnUniswap, 0, 0, wallet, block.timestamp ); wallet.transfer(address(this).balance); return (totalSupplyUniswap.sub(tokensOnUniswap)); } /** * @dev this function will close round 3 if based on day and sold supply. * Returns whether a particular round has ended or not and * the max supply of a particular day during round 3. */ function _closeR3(uint256 periodArg) private returns (bool isRoundEnded, uint256 maxPeriodSupply) { require(_hasEnded[0] && _hasEnded[1] && !_hasEnded[2], 'Round 3 has ended or Round 1 or 2 have not ended yet'); require(block.timestamp >= _startTimeR3, 'Pause period between Round 2 and 3'); uint256 decreasingTokenNumber = totalSupplyR3.mul(decreasingPctToken).div(10000); maxPeriodSupply = totalSupplyR3.sub(periodArg.mul(decreasingTokenNumber)); if (maxPeriodSupply <= _actualSupply[2]) { msg.sender.transfer(msg.value); _hasEnded[2] = true; _endTimeR3 = block.timestamp; uint256 endingPeriod = _calculateEndingPeriod(); uint256 reductionFactor = _calculateBonusReductionFactor(endingPeriod); _endedDayR3 = endingPeriod; _bonusReductionFactor = reductionFactor; return (true, maxPeriodSupply); } else { return (false, maxPeriodSupply); } } /** * @dev this function handles low level token purchases. * Returns whether a particular round has ended or not. */ function _buyToken(uint8 indexArg, uint256 rateArg, uint256 totalSupplyArg) private returns (bool isRoundEnded) { uint256 tokensNumber = msg.value.mul(rateArg).div(100000); uint256 actualTotalBalance = _actualSupply[indexArg]; uint256 newTotalRoundBalance = actualTotalBalance.add(tokensNumber); if (!_contributor[msg.sender]) { _contributor[msg.sender] = true; _contributorsTotal++; } if (newTotalRoundBalance < totalSupplyArg) { _contributions[indexArg][msg.sender] = _contributions[indexArg][msg.sender].add(tokensNumber); _actualSupply[indexArg] = newTotalRoundBalance; _contributedFundsTotal = _contributedFundsTotal.add(msg.value); emit Bought(uint8(indexArg + 1), msg.sender, tokensNumber); return false; } else { uint256 availableTokens = totalSupplyArg.sub(actualTotalBalance); uint256 availableEth = availableTokens.mul(100000).div(rateArg); _contributions[indexArg][msg.sender] = _contributions[indexArg][msg.sender].add(availableTokens); _actualSupply[indexArg] = totalSupplyArg; _contributedFundsTotal = _contributedFundsTotal.add(availableEth); _hasEnded[indexArg] = true; msg.sender.transfer(msg.value.sub(availableEth)); emit Bought(uint8(indexArg + 1), msg.sender, availableTokens); return true; } } /** * @dev Returns the staking duration of a particular round. */ function _getDuration(uint256 indexArg) private view returns (uint256) { if (indexArg == 0) { return stakingPeriodR1; } if (indexArg == 1) { return stakingPeriodR2; } if (indexArg == 2) { return stakingPeriodR3; } } /** * @dev Returns the bonus reduction factor. */ function _calculateBonusReductionFactor(uint256 periodArg) private view returns (uint256) { uint256 reductionFactor = uint256(10000).sub(periodArg.mul(decreasingPctBonus)); return reductionFactor; } /** * @dev Returns the current round. */ function _calculateCurrentRound() private view returns (uint8) { if (!_hasEnded[0]) { return 0; } else if (_hasEnded[0] && !_hasEnded[1] && !_hasEnded[2]) { return 1; } else if (_hasEnded[0] && _hasEnded[1] && !_hasEnded[2]) { return 2; } else { return 2**8 - 1; } } /** * @dev Returns the current day. */ function _calculatePeriod(uint256 timeArg) private view returns (uint256) { uint256 period = ((timeArg.sub(_startTimeR3)).div(periodDurationR3)); uint256 maxPeriods = uint256(10000).div(decreasingPctToken); if (period > maxPeriods) { return maxPeriods; } return period; } /** * @dev Returns the ending day of round 3. */ function _calculateEndingPeriod() private view returns (uint256) { require(_endTimeR3 != (2**256) - 1, "The third round must be active"); uint256 endingPeriod = _calculatePeriod(_endTimeR3); return endingPeriod; } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"tokenArg","type":"address"},{"internalType":"uint256[3]","name":"totalSupplyArg","type":"uint256[3]"},{"internalType":"uint256","name":"totalSupplyUniswapArg","type":"uint256"},{"internalType":"uint256[3]","name":"ratesArg","type":"uint256[3]"},{"internalType":"uint256","name":"periodDurationR3Arg","type":"uint256"},{"internalType":"uint256","name":"timeDelayR1Arg","type":"uint256"},{"internalType":"uint256","name":"timeDelayR2Arg","type":"uint256"},{"internalType":"uint256[3]","name":"stakingPeriodArg","type":"uint256[3]"},{"internalType":"address","name":"uniswapRouterArg","type":"address"},{"internalType":"uint256[4]","name":"decreasingPctArg","type":"uint256[4]"},{"internalType":"uint256","name":"listingRateArg","type":"uint256"},{"internalType":"address","name":"platformStakingContractArg","type":"address"},{"internalType":"address payable","name":"walletArg","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"status","type":"bool"},{"indexed":false,"internalType":"uint256","name":"time","type":"uint256"}],"name":"Activated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint8","name":"round","type":"uint8"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Bought","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Claimed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"time","type":"uint256"}],"name":"Ended","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Penalized","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Reclaimed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount1","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount2","type":"uint256"}],"name":"Splitted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Staked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Withdrawn","type":"event"},{"inputs":[],"name":"activateStakesAndUniswapLiquidity","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"claimDividends","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"closeR3","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decreasingPctBonus","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decreasingPctETH","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decreasingPctRate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decreasingPctToken","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getContributedFundsTotal","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"accountArg","type":"address"}],"name":"getContributionTotal","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getContributionsTotal","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getContributorsTotal","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getCurrentDayR3","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getCurrentRound","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"accountArg","type":"address"}],"name":"getDividends","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getEndedDayR3","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getLatestStakingPlatformPayment","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"accountArg","type":"address"}],"name":"getR1Contribution","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getR1Sales","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"accountArg","type":"address"}],"name":"getR2Contribution","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getR2Sales","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getR2Start","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"accountArg","type":"address"}],"name":"getR3Contribution","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getR3End","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getR3Sales","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getR3Start","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getRemainingTimeDelayR1R2","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getRemainingTimeDelayR2R3","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"accountArg","type":"address"}],"name":"getRestakedDividends","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getRestakedDividendsTotal","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getStakingActivationStatus","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"accountArg","type":"address"}],"name":"getStakingBonusR1","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"accountArg","type":"address"}],"name":"getStakingBonusR2","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"accountArg","type":"address"}],"name":"getStakingBonusR3","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"accountArg","type":"address"}],"name":"getStakingBonusTotal","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getStakingBonusesTotal","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"hasR1Ended","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"hasR2Ended","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"hasR3Ended","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"listingRate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"periodDurationR3","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"platformStakingContract","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rateR1","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rateR2","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rateR3","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"restakeDividends","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"stakingPeriodR1","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"stakingPeriodR2","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"stakingPeriodR3","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"timeDelayR1","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"timeDelayR2","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"token","outputs":[{"internalType":"contract Token","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupplyR1","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupplyR2","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupplyR3","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupplyUniswap","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uniswapRouter","outputs":[{"internalType":"contract IUniswapV2Router02","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"wallet","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdrawFunds","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawR1Tokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawR2Tokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawR3Tokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawRestakedDividends","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
610340604052600019600955600019600a55600019600b55600c600a0a601b556001601c553480156200003157600080fd5b506040516200433e3803806200433e83398181016040526102c08110156200005857600080fd5b50805160808201516101008301516101208401516101408501516101c08601516102608701516102808801516102a08901519798602081019860a082019796959461016083019490936101e090930192909160005b6003811015620001b65760008d8260038110620000c657fe5b602002015111620001095760405162461bcd60e51b8152600401808060200182810382526036815260200180620041816036913960400191505060405180910390fd5b60008b82600381106200011857fe5b6020020151116200015b5760405162461bcd60e51b8152600401808060200182810382526030815260200180620042996030913960400191505060405180910390fd5b60008782600381106200016a57fe5b602002015111620001ad5760405162461bcd60e51b8152600401808060200182810382526038815260200180620043066038913960400191505060405180910390fd5b600101620000ad565b5060005b60048110156200022057612710858260048110620001d457fe5b602002015110620002175760405162461bcd60e51b815260040180806020018281038252603e81526020018062004229603e913960400191505060405180910390fd5b600101620001ba565b5060008b11620002625760405162461bcd60e51b815260040180806020018281038252603d815260200180620042c9603d913960400191505060405180910390fd5b60008911620002a35760405162461bcd60e51b8152600401808060200182810382526039815260200180620040da6039913960400191505060405180910390fd5b6001600160a01b038d16620002ea5760405162461bcd60e51b8152600401808060200182810382526032815260200180620042676032913960400191505060405180910390fd5b6001600160a01b038516620003315760405162461bcd60e51b815260040180806020018281038252603b81526020018062004113603b913960400191505060405180910390fd5b60008311620003725760405162461bcd60e51b8152600401808060200182810382526036815260200180620041f36036913960400191505060405180910390fd5b6001600160a01b038216620003b95760405162461bcd60e51b815260040180806020018281038252603c815260200180620041b7603c913960400191505060405180910390fd5b6001600160a01b038116620004005760405162461bcd60e51b81526004018080602001828103825260338152602001806200414e6033913960400191505060405180910390fd5b6001600160601b031960608e901b16610240528b6000602002015160a0528b6001602002015160c0528b6002602002015160e0526101008b90526101808990526101a08890526101c087905289600060200201516101205289600160200201516101405289600260200201516101605285600060200201516101e0528560016020020151610200528560026020020151610220526001600160601b0319606086901b166102605283600060200201516102805283600160200201516102a05283600260200201516102c05283600360200201516102e052610300929092526001600160601b0319606091821b81166103205291901b166080525050505050505050505060805160601c60a05160c05160e05161010051610120516101405161016051610180516101a0516101c0516101e05161020051610220516102405160601c6102605160601c610280516102a0516102c0516102e051610300516103205160601c613a05620006d560003980611ce95280612a315280613439525080611b99528061275c525080611b6f52806125705250806118e7528061268f52508061135852806126c652508061137c52806122e55280612406525080611a0a52806127b952806128d95250806103d95280610c6652806117f75280611d8f5280611ef2528061278a528061286c5280612a025280612aed5280612f99528061324f528061346a525080611e3e52806133ae525080611a54528061337e5250806113eb528061334e525080610ec152806115f35280611f18525080610d98528061197c5280611ece52508061190b52806122a5525080610fb85280611022525080610e6952806114c3525080610d4052806113a052508061143352806129ac52508061104652806111b852806123e55280612447525080610e8a52806111fd528061140f525080610d6152806111dc528061149f52508061161d52806128a9528061295e5280612b5c5280612c915250613a056000f3fe6080604052600436106103b15760003560e01c806370c20666116101e7578063a20ecbbb1161010d578063c43b8585116100a0578063f59a31721161006f578063f59a317214610b3e578063f5b6a29014610b71578063fc0c546a14610b86578063fcf8dc1914610b9b57610511565b8063c43b858514610aae578063da7f194714610ac3578063eee2f06f14610ad8578063f33735c014610b0b57610511565b8063b36f7169116100dc578063b36f716914610a3c578063b76ca69314610a51578063bad8392614610a84578063c07676a014610a9957610511565b8063a20ecbbb146109d2578063a32bf597146109e7578063b0c36bb314610a12578063b2f9ac5814610a2757610511565b806382f3eeb31161018557806393a88e0b1161015457806393a88e0b1461096057806393d356a01461099357806399442e30146109a85780639af774e9146109bd57610511565b806382f3eeb31461090c5780638cf3d9301461092157806391465a3f14610936578063936c34ea1461094b57610511565b806374cf8f46116101c157806374cf8f461461085e5780637d4025d0146108915780638197cb73146108a657806382416595146108d957610511565b806370c206661461081f5780637261093514610834578063735de9f71461084957610511565b80633146f142116102d75780635b7090171161026a578063697b2fcc11610239578063697b2fcc146107cb5780636a585bbe146107e05780636bf00e3c146107f55780636cddbe5c1461080a57610511565b80635b709017146107775780635db9b9f11461078c57806360cbe10c146107a1578063668038e0146107b657610511565b80634a93cf69116102a65780634a93cf69146107075780634a9f915b1461071c5780634ce813a514610731578063521eb2731461074657610511565b80633146f1421461068157806335a6b48114610696578063460ef09f146106bf5780634634d81c146106d457610511565b80632088b9011161034f5780632db639ed1161031e5780632db639ed1461060f5780632e9d40ff146106245780632f17affd14610639578063305f864d1461066c57610511565b80632088b901146105bb578063230e3217146105d057806324600fc3146105e557806324cce1c3146105fa57610511565b806313c643f61161038b57806313c643f614610567578063191e70361461057c5780631ad007c6146105915780631ca8face146105a657610511565b80630e542308146105165780630f77f8281461053d5780631389de7e1461055257610511565b3661051157604080516370a0823160e01b815230600482015290516000916001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016916370a0823191602480820192602092909190829003018186803b15801561042057600080fd5b505afa158015610434573d6000803e3d6000fd5b505050506040513d602081101561044a57600080fd5b505111156104d857600061045c610bb0565b905060ff81166104735761046e610c43565b6104d2565b8060ff16600114156104875761046e610dca565b8060ff166002141561049b5761046e610ef1565b60405162461bcd60e51b81526004018080602001828103825260288152602001806137b06028913960400191505060405180910390fd5b5061050f565b60405162461bcd60e51b81526004018080602001828103825260218152602001806136f56021913960400191505060405180910390fd5b005b600080fd5b34801561052257600080fd5b5061052b611014565b60408051918252519081900360200190f35b34801561054957600080fd5b5061052b61101a565b34801561055e57600080fd5b5061052b611020565b34801561057357600080fd5b5061052b611044565b34801561058857600080fd5b5061050f611068565b34801561059d57600080fd5b5061052b611338565b3480156105b257600080fd5b5061052b611356565b3480156105c757600080fd5b5061052b61137a565b3480156105dc57600080fd5b5061052b61139e565b3480156105f157600080fd5b5061050f6113c2565b34801561060657600080fd5b5061052b6113e9565b34801561061b57600080fd5b5061052b61140d565b34801561063057600080fd5b5061052b611431565b34801561064557600080fd5b5061052b6004803603602081101561065c57600080fd5b50356001600160a01b0316611455565b34801561067857600080fd5b5061052b61149d565b34801561068d57600080fd5b5061052b6114c1565b3480156106a257600080fd5b506106ab6114e5565b604080519115158252519081900360200190f35b3480156106cb57600080fd5b5061052b611507565b3480156106e057600080fd5b5061052b600480360360208110156106f757600080fd5b50356001600160a01b031661150d565b34801561071357600080fd5b5061052b6115eb565b34801561072857600080fd5b5061052b6115f1565b34801561073d57600080fd5b5061052b611615565b34801561075257600080fd5b5061075b61161b565b604080516001600160a01b039092168252519081900360200190f35b34801561078357600080fd5b5061052b61163f565b34801561079857600080fd5b5061050f61164d565b3480156107ad57600080fd5b5061052b611740565b3480156107c257600080fd5b5061050f611746565b3480156107d757600080fd5b5061052b6118df565b3480156107ec57600080fd5b5061052b6118e5565b34801561080157600080fd5b5061052b611909565b34801561081657600080fd5b5061050f61192d565b34801561082b57600080fd5b5061052b611978565b34801561084057600080fd5b5061052b6119fd565b34801561085557600080fd5b5061075b611a08565b34801561086a57600080fd5b5061052b6004803603602081101561088157600080fd5b50356001600160a01b0316611a2c565b34801561089d57600080fd5b5061052b611a52565b3480156108b257600080fd5b5061052b600480360360208110156108c957600080fd5b50356001600160a01b0316611a76565b3480156108e557600080fd5b5061052b600480360360208110156108fc57600080fd5b50356001600160a01b0316611acb565b34801561091857600080fd5b5061050f611ad5565b34801561092d57600080fd5b5061052b611b20565b34801561094257600080fd5b5061050f611b3e565b34801561095757600080fd5b5061052b611b54565b34801561096c57600080fd5b5061052b6004803603602081101561098357600080fd5b50356001600160a01b0316611b5a565b34801561099f57600080fd5b506106ab611b64565b3480156109b457600080fd5b5061052b611b6d565b3480156109c957600080fd5b5061052b611b91565b3480156109de57600080fd5b5061052b611b97565b3480156109f357600080fd5b506109fc611bbb565b6040805160ff9092168252519081900360200190f35b348015610a1e57600080fd5b506106ab611c91565b348015610a3357600080fd5b5061050f611c9c565b348015610a4857600080fd5b5061075b611ce7565b348015610a5d57600080fd5b5061052b60048036036020811015610a7457600080fd5b50356001600160a01b0316611d0b565b348015610a9057600080fd5b5061052b611d16565b348015610aa557600080fd5b506106ab611d20565b348015610aba57600080fd5b5061050f611d2a565b348015610acf57600080fd5b5061052b611e3c565b348015610ae457600080fd5b5061052b60048036036020811015610afb57600080fd5b50356001600160a01b0316611e60565b348015610b1757600080fd5b5061052b60048036036020811015610b2e57600080fd5b50356001600160a01b0316611e6c565b348015610b4a57600080fd5b5061052b60048036036020811015610b6157600080fd5b50356001600160a01b0316611e87565b348015610b7d57600080fd5b5061052b611ecc565b348015610b9257600080fd5b5061075b611ef0565b348015610ba757600080fd5b5061052b611f14565b60055460009060ff16610bc557506000610c40565b60055460ff168015610bdf5750600554610100900460ff16155b8015610bf4575060055462010000900460ff16155b15610c0157506001610c40565b60055460ff168015610c1a5750600554610100900460ff165b8015610c2f575060055462010000900460ff16155b15610c3c57506002610c40565b5060ff5b90565b604080516370a0823160e01b815230600482015290516000916001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016916370a0823191602480820192602092909190829003018186803b158015610cad57600080fd5b505afa158015610cc1573d6000803e3d6000fd5b505050506040513d6020811015610cd757600080fd5b505111156104d85760055460ff1615610d37576040805162461bcd60e51b815260206004820152601e60248201527f54686520666972737420726f756e64206d757374206265206163746976650000604482015290519081900360640190fd5b6000610d8560007f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000611f9e565b905060018115151415610dc657610dc2427f000000000000000000000000000000000000000000000000000000000000000063ffffffff61223a16565b6009555b505b565b60055460ff168015610de45750600554610100900460ff16155b610e1f5760405162461bcd60e51b815260040180806020018281038252604c815260200180613764604c913960600191505060405180910390fd5b600954421015610e605760405162461bcd60e51b815260040180806020018281038252604d815260200180613937604d913960600191505060405180910390fd5b6000610eae60017f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000611f9e565b905060018115151415610dc657610eeb427f000000000000000000000000000000000000000000000000000000000000000063ffffffff61223a16565b600a5550565b600554610100900460ff168015610f11575060055462010000900460ff16155b610f4c5760405162461bcd60e51b815260040180806020018281038252604c815260200180613984604c913960600191505060405180910390fd5b600a54421015610f8d5760405162461bcd60e51b815260040180806020018281038252604d815260200180613937604d913960600191505060405180910390fd5b6000610f984261229d565b9050600080610fa683612329565b915091508161100f576000610fdd60027f000000000000000000000000000000000000000000000000000000000000000084611f9e565b90506001811515141561100d5742600b556000610ff86124f6565b9050600061100582612564565b601555506017555b505b505050565b60175490565b60095490565b7f000000000000000000000000000000000000000000000000000000000000000081565b7f000000000000000000000000000000000000000000000000000000000000000081565b60055460ff1680156110815750600554610100900460ff165b8015611095575060055462010000900460ff165b6110e6576040805162461bcd60e51b815260206004820152601a60248201527f616c6c20726f756e6473206d757374206861766520656e646564000000000000604482015290519081900360640190fd5b600f5460ff16156111285760405162461bcd60e51b81526004018080602001828103825260438152602001806137d86043913960600191505060405180910390fd5b61113061369d565b604051806060016040528061116f612710611163601554600660006003811061115557fe5b01549063ffffffff6125a916565b9063ffffffff61260216565b815260200161118e612710611163601554600660016003811061115557fe5b81526020016111ad612710611163601554600660026003811061115557fe5b9052905060006112337f00000000000000000000000000000000000000000000000000000000000000006112277f00000000000000000000000000000000000000000000000000000000000000007f000000000000000000000000000000000000000000000000000000000000000063ffffffff61223a16565b9063ffffffff61223a16565b6008546007546006549293506000926112519291611227919061223a565b90506000611265838363ffffffff61264416565b60408501516020860151865192935060009261129592916112899182908990612644565b9063ffffffff61264416565b905060006112a4601754612686565b600f805460ff19166001179055426010556040870151602088015188519293506112d1926112279161223a565b60115560128490556112f56112f082611227868663ffffffff61223a16565b6129d7565b604080516001815242602082015281517fb54284f5fd75e14227c1c3e08aa77738209c8afa15679a3be5142169ed633468929181900390910190a1505050505050565b6000611351601d5460125461223a90919063ffffffff16565b905090565b7f000000000000000000000000000000000000000000000000000000000000000081565b7f000000000000000000000000000000000000000000000000000000000000000081565b7f000000000000000000000000000000000000000000000000000000000000000081565b60006113de60026111636016544761264490919063ffffffff16565b9050610dc681612b51565b7f000000000000000000000000000000000000000000000000000000000000000081565b7f000000000000000000000000000000000000000000000000000000000000000081565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000806002805b6001600160a01b038516600090815291016020526040902054601554909150611494906127109061116390849063ffffffff6125a916565b9150505b919050565b7f000000000000000000000000000000000000000000000000000000000000000081565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000600560015b602081049091015460ff601f9092166101000a900416905090565b601d5490565b60008061156a601b5461116361152286611a76565b6001600160a01b038716600090815260016020908152604080832054600019018352601f90915290205460195461155e9163ffffffff61264416565b9063ffffffff6125a916565b9050601b546115b761157b85611a76565b6001600160a01b038616600090815260016020908152604080832054600019018352601f90915290205460195461155e9163ffffffff61264416565b816115be57fe5b3360009081526001602081905260409091200154919006919091019061149490829063ffffffff61223a16565b600b5490565b7f000000000000000000000000000000000000000000000000000000000000000081565b60135490565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000600660025b0154905090565b600061165833612cde565b336000908152600160208190526040909120015490915061168090829063ffffffff61223a16565b9050336000908152601e60205260409020546116a2908263ffffffff61223a16565b336000908152601e6020526040902055601d546116c5908263ffffffff61223a16565b601d556011546116db908263ffffffff61264416565b601155601c54336000818152600160208181526040808420958655918501929092556019546002909401939093558251848152925191927f9e71bc8eea02a63969f509818f2dafb9254532904319f9dbda79b67bd34a5f3d929081900390910190a250565b60145490565b336000908152600160205260409020600201546019541115610dc857600061176d33612cde565b336000908152600160208190526040909120015490915061179590829063ffffffff61223a16565b9050601c5433600090815260016020819052604082209283558201556019546002909101556011546117cd908263ffffffff61264416565b6011556040805163a9059cbb60e01b81523360048201526024810183905290516001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169163a9059cbb9160448083019260209291908290030181600087803b15801561183f57600080fd5b505af1158015611853573d6000803e3d6000fd5b505050506040513d602081101561186957600080fd5b50516118a65760405162461bcd60e51b81526004018080602001828103825260258152602001806139126025913960400191505060405180910390fd5b60408051828152905133917fd8138f8a3f377c5259ca548e70e4c2de94f129f5a11036a15b69513cba2b426a919081900360200190a250565b60185490565b7f000000000000000000000000000000000000000000000000000000000000000081565b7f000000000000000000000000000000000000000000000000000000000000000081565b600f5460ff1661196e5760405162461bcd60e51b81526004018080602001828103825260248152602001806137406024913960400191505060405180910390fd5b610dc86002612d37565b60007f0000000000000000000000000000000000000000000000000000000000000000156119f55760055460ff1680156119ba5750600554610100900460ff16155b156119f5576009546000906119d5904263ffffffff61264416565b11156119f5576009546119ee904263ffffffff61264416565b9050610c40565b506000610c40565b600060066001611646565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000600260015b6001600160a01b03939093166000908152920160205250604090205490565b7f000000000000000000000000000000000000000000000000000000000000000081565b600080611a8283611acb565b90506000611a8f84611a2c565b90506000611a9c85611b5a565b90506000611aa986611e6c565b9050611ac1816112278481888863ffffffff61223a16565b9695505050505050565b6000600281611a33565b600f5460ff16611b165760405162461bcd60e51b81526004018080602001828103825260248152602001806137406024913960400191505060405180910390fd5b610dc86000612d37565b6000601754600014611b355750601754610c40565b6113514261229d565b6000611b494261229d565b905061100f81612329565b60115490565b6000600280611a33565b600f5460ff1690565b7f000000000000000000000000000000000000000000000000000000000000000081565b600a5490565b7f000000000000000000000000000000000000000000000000000000000000000081565b600080611bc6610bb0565b905060ff8116158015611bdc575060055460ff16155b15611beb576001915050610c40565b8060ff166001148015611c065750600554610100900460ff16155b8015611c14575060055460ff165b15611c36576009544211611c2c576000915050610c40565b6002915050610c40565b8060ff166002148015611c52575060055462010000900460ff16155b8015611c655750600554610100900460ff165b15611c8757600a544211611c7d576000915050610c40565b6003915050610c40565b6000915050610c40565b6000600560026114ec565b600f5460ff16611cdd5760405162461bcd60e51b81526004018080602001828103825260248152602001806137406024913960400191505060405180910390fd5b610dc86001612d37565b7f000000000000000000000000000000000000000000000000000000000000000081565b60008060028161145c565b6000600681611646565b60006005816114ec565b336000908152601e6020526040902054611d42611746565b336000908152601e6020526040812055601d54611d65908263ffffffff61264416565b601d556040805163a9059cbb60e01b81523360048201526024810183905290516001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169163a9059cbb9160448083019260209291908290030181600087803b158015611dd757600080fd5b505af1158015611deb573d6000803e3d6000fd5b505050506040513d6020811015611e0157600080fd5b505060408051828152905133917fcab347be18c8c37ef504626a027a12ea6725f491b5f5b154778d8d0c54f7841e919081900360200190a250565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000806002600161145c565b6001600160a01b03166000908152601e602052604090205490565b600080611e9383611d0b565b90506000611ea084611e60565b90506000611ead85611455565b9050611ec381611227858563ffffffff61223a16565b95945050505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b7f000000000000000000000000000000000000000000000000000000000000000081565b60007f0000000000000000000000000000000000000000000000000000000000000000156119f55760055460ff168015611f555750600554610100900460ff165b8015611f6a575060055462010000900460ff16155b156119f557600a54600090611f85904263ffffffff61264416565b11156119f557600a546119ee904263ffffffff61264416565b600080611fb8620186a0611163348763ffffffff6125a916565b9050600060068660ff1660038110611fcc57fe5b015490506000611fe2828463ffffffff61223a16565b3360009081526020819052604090205490915060ff1661202357336000908152602081905260409020805460ff191660019081179091556013805490910190555b848110156120ed5761205b8360028960ff166003811061203f57fe5b336000908152910160205260409020549063ffffffff61223a16565b60028860ff166003811061206b57fe5b3360009081529101602052604090205580600660ff89166003811061208c57fe5b01556014546120a1903463ffffffff61223a16565b601455604080518481529051339160ff60018b0116917f8f7828ad11cbdf0ae595d4a4af4eb3311e55f6ce810b53d00bf9f691f5092a949181900360200190a360009350505050612233565b60006120ff868463ffffffff61264416565b9050600061211a8861116384620186a063ffffffff6125a916565b90506121308260028b60ff166003811061203f57fe5b60028a60ff166003811061214057fe5b3360009081529101602052604090205586600660ff8b166003811061216157fe5b0155601454612176908263ffffffff61223a16565b6014556001600560ff8b166003811061218b57fe5b602081049091018054921515601f9092166101000a91820260ff90920219909216179055336108fc6121c3348463ffffffff61264416565b6040518115909202916000818181858888f193505050501580156121eb573d6000803e3d6000fd5b50604080518381529051339160ff60018d0116917f8f7828ad11cbdf0ae595d4a4af4eb3311e55f6ce810b53d00bf9f691f5092a949181900360200190a36001955050505050505b9392505050565b600082820183811015612294576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b90505b92915050565b6000806122d97f0000000000000000000000000000000000000000000000000000000000000000611163600a548661264490919063ffffffff16565b9050600061230f6127107f000000000000000000000000000000000000000000000000000000000000000063ffffffff61260216565b9050808211156123225791506114989050565b5092915050565b600554600090819060ff1680156123475750600554610100900460ff165b801561235c575060055462010000900460ff16155b6123975760405162461bcd60e51b81526004018080602001828103825260348152602001806138596034913960400191505060405180910390fd5b600a544210156123d85760405162461bcd60e51b81526004018080602001828103825260228152602001806138f06022913960400191505060405180910390fd5b60006124306127106111637f00000000000000000000000000000000000000000000000000000000000000007f000000000000000000000000000000000000000000000000000000000000000063ffffffff6125a916565b9050612472612445858363ffffffff6125a916565b7f00000000000000000000000000000000000000000000000000000000000000009063ffffffff61264416565b60085490925082116124eb5760405133903480156108fc02916000818181858888f193505050501580156124aa573d6000803e3d6000fd5b506005805462ff000019166201000017905542600b5560006124ca6124f6565b905060006124d782612564565b6017929092555060155550600191506124f1565b50600091505b915091565b6000600b546000191415612551576040805162461bcd60e51b815260206004820152601e60248201527f54686520746869726420726f756e64206d757374206265206163746976650000604482015290519081900360640190fd5b600061255e600b5461229d565b91505090565b60008061149461259a847f000000000000000000000000000000000000000000000000000000000000000063ffffffff6125a916565b6127109063ffffffff61264416565b6000826125b857506000612297565b828202828482816125c557fe5b04146122945760405162461bcd60e51b815260040180806020018281038252602181526020018061388d6021913960400191505060405180910390fd5b600061229483836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250613023565b600061229483836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f7700008152506130c5565b6000806126b9837f000000000000000000000000000000000000000000000000000000000000000063ffffffff6125a916565b905060006126ff6126f0857f000000000000000000000000000000000000000000000000000000000000000063ffffffff6125a916565b6113889063ffffffff61264416565b9050600061271e612710611163846014546125a990919063ffffffff16565b90504781111561272e5747612730565b805b90506000612786620186a06111636127506127108863ffffffff61264416565b61116361271061155e887f000000000000000000000000000000000000000000000000000000000000000063ffffffff6125a916565b90507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663095ea7b37f0000000000000000000000000000000000000000000000000000000000000000836040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050602060405180830381600087803b15801561282857600080fd5b505af115801561283c573d6000803e3d6000fd5b505050506040513d602081101561285257600080fd5b50506040805163f305d71960e01b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000811660048301526024820184905260006044830181905260648301527f0000000000000000000000000000000000000000000000000000000000000000811660848301524260a483015291517f00000000000000000000000000000000000000000000000000000000000000009092169163f305d71991859160c480830192606092919082900301818588803b15801561292457600080fd5b505af1158015612938573d6000803e3d6000fd5b50505050506040513d606081101561294f57600080fd5b50506040516001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016904780156108fc02916000818181858888f193505050501580156129a6573d6000803e3d6000fd5b50611ac17f00000000000000000000000000000000000000000000000000000000000000008263ffffffff61264416565b60006129ea82600263ffffffff61260216565b905060006129fe838363ffffffff61264416565b90507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a9059cbb7f0000000000000000000000000000000000000000000000000000000000000000846040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050602060405180830381600087803b158015612aa057600080fd5b505af1158015612ab4573d6000803e3d6000fd5b505050506040513d6020811015612aca57600080fd5b505060408051630852cd8d60e31b81526004810183905290516001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016916342966c6891602480830192600092919082900301818387803b158015612b3457600080fd5b505af1158015612b48573d6000803e3d6000fd5b50505050505050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614612bb85760405162461bcd60e51b81526004018080602001828103825260398152602001806136bc6039913960400191505060405180910390fd5b612bd260026111636016544761264490919063ffffffff16565b811115612c105760405162461bcd60e51b815260040180806020018281038252602a815260200180613716602a913960400191505060405180910390fd5b60055462010000900460ff1615612c6e576040805162461bcd60e51b815260206004820152601d60248201527f54686520746869726420726f756e64206973206e6f7420616374697665000000604482015290519081900360640190fd5b601654612c81908263ffffffff61223a16565b6016556040516001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169082156108fc029083906000818181858888f19350505050158015612cda573d6000803e3d6000fd5b5050565b600080612cf3601b5461116361152286611a76565b9050601b54612d0461157b85611a76565b81612d0b57fe5b6001600160a01b0394909416600090815260016020819052604090912001805491909406019092555090565b60055460ff168015612d505750600554610100900460ff165b8015612d64575060055462010000900460ff165b612d9f5760405162461bcd60e51b815260040180806020018281038252603e81526020018061381b603e913960400191505060405180910390fd5b600c8160ff1660038110612daf57fe5b3360009081529101602052604090205460ff1615612dfe5760405162461bcd60e51b81526004018080602001828103825260428152602001806138ae6042913960600191505060405180910390fd5b612e06611746565b600060028260ff1660038110612e1857fe5b33600090815291016020526040812054601554909250612e47906127109061116390859063ffffffff6125a916565b9050612e798260028560ff1660038110612e5d57fe5b336000908152910160205260409020549063ffffffff61264416565b60028460ff1660038110612e8957fe5b33600090815291016020526040902055601254612eac908363ffffffff61264416565b6012556000612eba33611a76565b90506000612ec733611e6c565b9050612ed9828263ffffffff61264416565b612ee557612ee5611d2a565b6000612ef033612cde565b3360009081526001602081905260409091200154909150612f17908263ffffffff61223a16565b336000908152600160208190526040909120808201929092556019546002830155601c54909155600c60ff881660038110612f4e57fe5b3360008181529190920160209081526040808320805460ff191695151595909517909455835163a9059cbb60e01b815260048101939093526024830189905292516001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169363a9059cbb93604480820194929392918390030190829087803b158015612fe057600080fd5b505af1158015612ff4573d6000803e3d6000fd5b505050506040513d602081101561300a57600080fd5b5061301b905060ff8716338661311f565b505050505050565b600081836130af5760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561307457818101518382015260200161305c565b50505050905090810190601f1680156130a15780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5060008385816130bb57fe5b0495945050505050565b600081848411156131175760405162461bcd60e51b815260206004820181815283516024840152835190928392604490910191908501908083836000831561307457818101518382015260200161305c565b505050900390565b60006131366010544261264490919063ffffffff16565b905060008061314486613344565b90508083106131555783915061322f565b61316b600461116383600363ffffffff6125a916565b831015801561317957508083105b1561319b57613194600461116386600363ffffffff6125a916565b915061322f565b6131ac81600263ffffffff61260216565b83101580156131cf57506131cc600461116383600363ffffffff6125a916565b83105b156131e55761319484600263ffffffff61260216565b6131f681600463ffffffff61260216565b8310158015613214575061321181600263ffffffff61260216565b83105b1561322a5761319484600463ffffffff61260216565b600091505b613247613242858463ffffffff61264416565b6133d2565b81156132fa577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a9059cbb86846040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050602060405180830381600087803b1580156132cd57600080fd5b505af11580156132e1573d6000803e3d6000fd5b505050506040513d60208110156132f757600080fd5b50505b6040805185815242602082015281516001600160a01b038816927fc6d99bc4696a33c554dbcc4e3d8af9493385fe991203d21d8e08a8e78bd34c26928290030190a2505050505050565b60008161337257507f0000000000000000000000000000000000000000000000000000000000000000611498565b81600114156133a257507f0000000000000000000000000000000000000000000000000000000000000000611498565b816002141561149857507f0000000000000000000000000000000000000000000000000000000000000000611498565b806133dc57610dc6565b60006133ef82600263ffffffff61260216565b90506000613403838363ffffffff61264416565b601154909150613419908263ffffffff61264416565b60115560188190556040805163a9059cbb60e01b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000811660048301526024820184905291517f00000000000000000000000000000000000000000000000000000000000000009092169163a9059cbb916044808201926020929091908290030181600087803b1580156134b557600080fd5b505af11580156134c9573d6000803e3d6000fd5b505050506040513d60208110156134df57600080fd5b50506018546134ed9061352c565b6040805183815260208101839052815133927f5b5150884a592e7c8bc5ac21883ec7aa3174e9b7e70b02fd6a5499da0c17c827928290030190a2505050565b6000613549601a54611227601b54856125a990919063ffffffff16565b90506000613574613567601d5460125461223a90919063ffffffff16565b839063ffffffff61260216565b905061359d613590601d5460125461223a90919063ffffffff16565b839063ffffffff6135fe16565b601a556019546135b3908263ffffffff61223a16565b601955601c54600019016000908152601f60205260409020546135dc908263ffffffff61223a16565b601c80546000908152601f602052604090209190915580546001019055505050565b600061229483836040518060400160405280601881526020017f536166654d6174683a206d6f64756c6f206279207a65726f00000000000000008152506000818361368a5760405162461bcd60e51b815260206004820181815283516024840152835190928392604490910191908501908083836000831561307457818101518382015260200161305c565b5082848161369457fe5b06949350505050565b6040518060600160405280600390602082028036833750919291505056fe5468652063616c6c6572206d75737420626520746865207370656369666965642066756e64732077616c6c6574206f6620746865207465616d546865207374616b65206f66666572696e67206d757374206265206163746976655468652027616d6f756e744172672720617267756d656e74206578636565647320746865206c696d697454686520626f6e7573206f66666572696e67206973206e6f74206163746976652079657454686520666972737420726f756e64206f6e65206d757374206e6f7420626520616374697665207768696c6520746865207365636f6e6420726f756e64206d75737420626520616374697665546865207374616b65206f66666572696e6720726f756e647320617265206e6f742061637469766574686520626f6e7573206f66666572696e6720616e6420756e697377617020706172696e672063616e206f6e6c7920626520646f6e65206f6e6365207065722049534f54686520726f756e6473206d75737420626520696e616374697665206265666f726520616e7920746f6b656e732063616e2062652077697468647261776e526f756e6420332068617320656e646564206f7220526f756e642031206f7220322068617665206e6f7420656e64656420796574536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f775468652063616c6c6572206d757374206861766520776974686472617761626c6520746f6b656e7320617661696c61626c652066726f6d207468697320726f756e64506175736520706572696f64206265747765656e20526f756e64203220616e6420334572726f7220696e2073656e64696e67207265776172642066726f6d20636f6e74726163745468652074696d652064656c6179206265747765656e2074686520666972737420726f756e6420616e6420746865207365636f6e6420726f756e64206d75737420626520737572706173736564546865207365636f6e6420726f756e64206f6e65206d757374206e6f7420626520616374697665207768696c652074686520746869726420726f756e64206d75737420626520616374697665a26469706673582212206c691727c49f8579fd730ffc5486b5e887bcfb9dfcd0883b58dfcf10c5611ab564736f6c634300060600335468652027736c6f744475726174696f6e52334172672720617267756d656e74206d757374206265206c6172676572207468616e207a65726f5468652027756e6973776170526f757465724172672720617267756d656e742063616e6e6f7420626520746865207a65726f206164647265737373546865202777616c6c65744172672720617267756d656e742063616e6e6f7420626520746865207a65726f20616464726573735468652027746f74616c537570706c794172672720617267756d656e74206d757374206265206c6172676572207468616e207a65726f546865202776657374696e67436f6e74726163744172672720617267756d656e742063616e6e6f7420626520746865207a65726f206164647265737354686520276c697374696e67526174654172672720617267756d656e74206d757374206265206c6172676572207468616e207a65726f546865202764656372656173696e675063744172672720617267756d656e7473206d757374206265206c657373207468616e203130302070657263656e745468652027746f6b656e4172672720617267756d656e742063616e6e6f7420626520746865207a65726f2061646472657373546865202772617465734172672720617267756d656e74206d757374206265206c6172676572207468616e207a65726f5468652027746f74616c537570706c79556e69737761704172672720617267756d656e74206d757374206265206c6172676572207468616e207a65726f54686520277374616b696e67506572696f644172672720617267756d656e74206d757374206265206c6172676572207468616e207a65726f0000000000000000000000009ed8e7c9604790f7ec589f99b94361d8aab64e5e000000000000000000000000000000000000000000108b2a2c28029094000000000000000000000000000000000000000000000000211654585005212800000000000000000000000000000000000000000000000031a17e847807b1bc000000000000000000000000000000000000000000000000084595161401484a00000000000000000000000000000000000000000000000000000000000000ee6b2800000000000000000000000000000000000000000000000000000000009ef21aab0000000000000000000000000000000000000000000000000000000077359400000000000000000000000000000000000000000000000000000000000001518000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000093a800000000000000000000000000000000000000000000000000000000000ed4e000000000000000000000000000000000000000000000000000000000000ed4e000000000000000000000000000000000000000000000000000000000000ed4e000000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d00000000000000000000000000000000000000000000000000000000000007d000000000000000000000000000000000000000000000000000000000000001f400000000000000000000000000000000000000000000000000000000000003e800000000000000000000000000000000000000000000000000000000000003e80000000000000000000000000000000000000000000000000000000017d7840000000000000000000000000036ef5ad3348da55519ffdcd17eb42b05c6108e570000000000000000000000000065bac24ce57aa77a676193e9a9a2bbeeaa3313
Deployed Bytecode
0x6080604052600436106103b15760003560e01c806370c20666116101e7578063a20ecbbb1161010d578063c43b8585116100a0578063f59a31721161006f578063f59a317214610b3e578063f5b6a29014610b71578063fc0c546a14610b86578063fcf8dc1914610b9b57610511565b8063c43b858514610aae578063da7f194714610ac3578063eee2f06f14610ad8578063f33735c014610b0b57610511565b8063b36f7169116100dc578063b36f716914610a3c578063b76ca69314610a51578063bad8392614610a84578063c07676a014610a9957610511565b8063a20ecbbb146109d2578063a32bf597146109e7578063b0c36bb314610a12578063b2f9ac5814610a2757610511565b806382f3eeb31161018557806393a88e0b1161015457806393a88e0b1461096057806393d356a01461099357806399442e30146109a85780639af774e9146109bd57610511565b806382f3eeb31461090c5780638cf3d9301461092157806391465a3f14610936578063936c34ea1461094b57610511565b806374cf8f46116101c157806374cf8f461461085e5780637d4025d0146108915780638197cb73146108a657806382416595146108d957610511565b806370c206661461081f5780637261093514610834578063735de9f71461084957610511565b80633146f142116102d75780635b7090171161026a578063697b2fcc11610239578063697b2fcc146107cb5780636a585bbe146107e05780636bf00e3c146107f55780636cddbe5c1461080a57610511565b80635b709017146107775780635db9b9f11461078c57806360cbe10c146107a1578063668038e0146107b657610511565b80634a93cf69116102a65780634a93cf69146107075780634a9f915b1461071c5780634ce813a514610731578063521eb2731461074657610511565b80633146f1421461068157806335a6b48114610696578063460ef09f146106bf5780634634d81c146106d457610511565b80632088b9011161034f5780632db639ed1161031e5780632db639ed1461060f5780632e9d40ff146106245780632f17affd14610639578063305f864d1461066c57610511565b80632088b901146105bb578063230e3217146105d057806324600fc3146105e557806324cce1c3146105fa57610511565b806313c643f61161038b57806313c643f614610567578063191e70361461057c5780631ad007c6146105915780631ca8face146105a657610511565b80630e542308146105165780630f77f8281461053d5780631389de7e1461055257610511565b3661051157604080516370a0823160e01b815230600482015290516000916001600160a01b037f0000000000000000000000009ed8e7c9604790f7ec589f99b94361d8aab64e5e16916370a0823191602480820192602092909190829003018186803b15801561042057600080fd5b505afa158015610434573d6000803e3d6000fd5b505050506040513d602081101561044a57600080fd5b505111156104d857600061045c610bb0565b905060ff81166104735761046e610c43565b6104d2565b8060ff16600114156104875761046e610dca565b8060ff166002141561049b5761046e610ef1565b60405162461bcd60e51b81526004018080602001828103825260288152602001806137b06028913960400191505060405180910390fd5b5061050f565b60405162461bcd60e51b81526004018080602001828103825260218152602001806136f56021913960400191505060405180910390fd5b005b600080fd5b34801561052257600080fd5b5061052b611014565b60408051918252519081900360200190f35b34801561054957600080fd5b5061052b61101a565b34801561055e57600080fd5b5061052b611020565b34801561057357600080fd5b5061052b611044565b34801561058857600080fd5b5061050f611068565b34801561059d57600080fd5b5061052b611338565b3480156105b257600080fd5b5061052b611356565b3480156105c757600080fd5b5061052b61137a565b3480156105dc57600080fd5b5061052b61139e565b3480156105f157600080fd5b5061050f6113c2565b34801561060657600080fd5b5061052b6113e9565b34801561061b57600080fd5b5061052b61140d565b34801561063057600080fd5b5061052b611431565b34801561064557600080fd5b5061052b6004803603602081101561065c57600080fd5b50356001600160a01b0316611455565b34801561067857600080fd5b5061052b61149d565b34801561068d57600080fd5b5061052b6114c1565b3480156106a257600080fd5b506106ab6114e5565b604080519115158252519081900360200190f35b3480156106cb57600080fd5b5061052b611507565b3480156106e057600080fd5b5061052b600480360360208110156106f757600080fd5b50356001600160a01b031661150d565b34801561071357600080fd5b5061052b6115eb565b34801561072857600080fd5b5061052b6115f1565b34801561073d57600080fd5b5061052b611615565b34801561075257600080fd5b5061075b61161b565b604080516001600160a01b039092168252519081900360200190f35b34801561078357600080fd5b5061052b61163f565b34801561079857600080fd5b5061050f61164d565b3480156107ad57600080fd5b5061052b611740565b3480156107c257600080fd5b5061050f611746565b3480156107d757600080fd5b5061052b6118df565b3480156107ec57600080fd5b5061052b6118e5565b34801561080157600080fd5b5061052b611909565b34801561081657600080fd5b5061050f61192d565b34801561082b57600080fd5b5061052b611978565b34801561084057600080fd5b5061052b6119fd565b34801561085557600080fd5b5061075b611a08565b34801561086a57600080fd5b5061052b6004803603602081101561088157600080fd5b50356001600160a01b0316611a2c565b34801561089d57600080fd5b5061052b611a52565b3480156108b257600080fd5b5061052b600480360360208110156108c957600080fd5b50356001600160a01b0316611a76565b3480156108e557600080fd5b5061052b600480360360208110156108fc57600080fd5b50356001600160a01b0316611acb565b34801561091857600080fd5b5061050f611ad5565b34801561092d57600080fd5b5061052b611b20565b34801561094257600080fd5b5061050f611b3e565b34801561095757600080fd5b5061052b611b54565b34801561096c57600080fd5b5061052b6004803603602081101561098357600080fd5b50356001600160a01b0316611b5a565b34801561099f57600080fd5b506106ab611b64565b3480156109b457600080fd5b5061052b611b6d565b3480156109c957600080fd5b5061052b611b91565b3480156109de57600080fd5b5061052b611b97565b3480156109f357600080fd5b506109fc611bbb565b6040805160ff9092168252519081900360200190f35b348015610a1e57600080fd5b506106ab611c91565b348015610a3357600080fd5b5061050f611c9c565b348015610a4857600080fd5b5061075b611ce7565b348015610a5d57600080fd5b5061052b60048036036020811015610a7457600080fd5b50356001600160a01b0316611d0b565b348015610a9057600080fd5b5061052b611d16565b348015610aa557600080fd5b506106ab611d20565b348015610aba57600080fd5b5061050f611d2a565b348015610acf57600080fd5b5061052b611e3c565b348015610ae457600080fd5b5061052b60048036036020811015610afb57600080fd5b50356001600160a01b0316611e60565b348015610b1757600080fd5b5061052b60048036036020811015610b2e57600080fd5b50356001600160a01b0316611e6c565b348015610b4a57600080fd5b5061052b60048036036020811015610b6157600080fd5b50356001600160a01b0316611e87565b348015610b7d57600080fd5b5061052b611ecc565b348015610b9257600080fd5b5061075b611ef0565b348015610ba757600080fd5b5061052b611f14565b60055460009060ff16610bc557506000610c40565b60055460ff168015610bdf5750600554610100900460ff16155b8015610bf4575060055462010000900460ff16155b15610c0157506001610c40565b60055460ff168015610c1a5750600554610100900460ff165b8015610c2f575060055462010000900460ff16155b15610c3c57506002610c40565b5060ff5b90565b604080516370a0823160e01b815230600482015290516000916001600160a01b037f0000000000000000000000009ed8e7c9604790f7ec589f99b94361d8aab64e5e16916370a0823191602480820192602092909190829003018186803b158015610cad57600080fd5b505afa158015610cc1573d6000803e3d6000fd5b505050506040513d6020811015610cd757600080fd5b505111156104d85760055460ff1615610d37576040805162461bcd60e51b815260206004820152601e60248201527f54686520666972737420726f756e64206d757374206265206163746976650000604482015290519081900360640190fd5b6000610d8560007f00000000000000000000000000000000000000000000000000000000ee6b28007f000000000000000000000000000000000000000000108b2a2c28029094000000611f9e565b905060018115151415610dc657610dc2427f000000000000000000000000000000000000000000000000000000000000000063ffffffff61223a16565b6009555b505b565b60055460ff168015610de45750600554610100900460ff16155b610e1f5760405162461bcd60e51b815260040180806020018281038252604c815260200180613764604c913960600191505060405180910390fd5b600954421015610e605760405162461bcd60e51b815260040180806020018281038252604d815260200180613937604d913960600191505060405180910390fd5b6000610eae60017f000000000000000000000000000000000000000000000000000000009ef21aab7f0000000000000000000000000000000000000000002116545850052128000000611f9e565b905060018115151415610dc657610eeb427f0000000000000000000000000000000000000000000000000000000000093a8063ffffffff61223a16565b600a5550565b600554610100900460ff168015610f11575060055462010000900460ff16155b610f4c5760405162461bcd60e51b815260040180806020018281038252604c815260200180613984604c913960600191505060405180910390fd5b600a54421015610f8d5760405162461bcd60e51b815260040180806020018281038252604d815260200180613937604d913960600191505060405180910390fd5b6000610f984261229d565b9050600080610fa683612329565b915091508161100f576000610fdd60027f000000000000000000000000000000000000000000000000000000007735940084611f9e565b90506001811515141561100d5742600b556000610ff86124f6565b9050600061100582612564565b601555506017555b505b505050565b60175490565b60095490565b7f000000000000000000000000000000000000000000000000000000007735940081565b7f00000000000000000000000000000000000000000031a17e847807b1bc00000081565b60055460ff1680156110815750600554610100900460ff165b8015611095575060055462010000900460ff165b6110e6576040805162461bcd60e51b815260206004820152601a60248201527f616c6c20726f756e6473206d757374206861766520656e646564000000000000604482015290519081900360640190fd5b600f5460ff16156111285760405162461bcd60e51b81526004018080602001828103825260438152602001806137d86043913960600191505060405180910390fd5b61113061369d565b604051806060016040528061116f612710611163601554600660006003811061115557fe5b01549063ffffffff6125a916565b9063ffffffff61260216565b815260200161118e612710611163601554600660016003811061115557fe5b81526020016111ad612710611163601554600660026003811061115557fe5b9052905060006112337f00000000000000000000000000000000000000000031a17e847807b1bc0000006112277f000000000000000000000000000000000000000000108b2a2c280290940000007f000000000000000000000000000000000000000000211654585005212800000063ffffffff61223a16565b9063ffffffff61223a16565b6008546007546006549293506000926112519291611227919061223a565b90506000611265838363ffffffff61264416565b60408501516020860151865192935060009261129592916112899182908990612644565b9063ffffffff61264416565b905060006112a4601754612686565b600f805460ff19166001179055426010556040870151602088015188519293506112d1926112279161223a565b60115560128490556112f56112f082611227868663ffffffff61223a16565b6129d7565b604080516001815242602082015281517fb54284f5fd75e14227c1c3e08aa77738209c8afa15679a3be5142169ed633468929181900390910190a1505050505050565b6000611351601d5460125461223a90919063ffffffff16565b905090565b7f00000000000000000000000000000000000000000000000000000000000001f481565b7f00000000000000000000000000000000000000000000000000000000000007d081565b7f00000000000000000000000000000000000000000000000000000000ee6b280081565b60006113de60026111636016544761264490919063ffffffff16565b9050610dc681612b51565b7f0000000000000000000000000000000000000000000000000000000000ed4e0081565b7f000000000000000000000000000000000000000000211654585005212800000081565b7f000000000000000000000000000000000000000000084595161401484a00000081565b6000806002805b6001600160a01b038516600090815291016020526040902054601554909150611494906127109061116390849063ffffffff6125a916565b9150505b919050565b7f000000000000000000000000000000000000000000108b2a2c2802909400000081565b7f000000000000000000000000000000000000000000000000000000009ef21aab81565b6000600560015b602081049091015460ff601f9092166101000a900416905090565b601d5490565b60008061156a601b5461116361152286611a76565b6001600160a01b038716600090815260016020908152604080832054600019018352601f90915290205460195461155e9163ffffffff61264416565b9063ffffffff6125a916565b9050601b546115b761157b85611a76565b6001600160a01b038616600090815260016020908152604080832054600019018352601f90915290205460195461155e9163ffffffff61264416565b816115be57fe5b3360009081526001602081905260409091200154919006919091019061149490829063ffffffff61223a16565b600b5490565b7f0000000000000000000000000000000000000000000000000000000000093a8081565b60135490565b7f0000000000000000000000000065bac24ce57aa77a676193e9a9a2bbeeaa331381565b6000600660025b0154905090565b600061165833612cde565b336000908152600160208190526040909120015490915061168090829063ffffffff61223a16565b9050336000908152601e60205260409020546116a2908263ffffffff61223a16565b336000908152601e6020526040902055601d546116c5908263ffffffff61223a16565b601d556011546116db908263ffffffff61264416565b601155601c54336000818152600160208181526040808420958655918501929092556019546002909401939093558251848152925191927f9e71bc8eea02a63969f509818f2dafb9254532904319f9dbda79b67bd34a5f3d929081900390910190a250565b60145490565b336000908152600160205260409020600201546019541115610dc857600061176d33612cde565b336000908152600160208190526040909120015490915061179590829063ffffffff61223a16565b9050601c5433600090815260016020819052604082209283558201556019546002909101556011546117cd908263ffffffff61264416565b6011556040805163a9059cbb60e01b81523360048201526024810183905290516001600160a01b037f0000000000000000000000009ed8e7c9604790f7ec589f99b94361d8aab64e5e169163a9059cbb9160448083019260209291908290030181600087803b15801561183f57600080fd5b505af1158015611853573d6000803e3d6000fd5b505050506040513d602081101561186957600080fd5b50516118a65760405162461bcd60e51b81526004018080602001828103825260258152602001806139126025913960400191505060405180910390fd5b60408051828152905133917fd8138f8a3f377c5259ca548e70e4c2de94f129f5a11036a15b69513cba2b426a919081900360200190a250565b60185490565b7f00000000000000000000000000000000000000000000000000000000000003e881565b7f000000000000000000000000000000000000000000000000000000000001518081565b600f5460ff1661196e5760405162461bcd60e51b81526004018080602001828103825260248152602001806137406024913960400191505060405180910390fd5b610dc86002612d37565b60007f0000000000000000000000000000000000000000000000000000000000000000156119f55760055460ff1680156119ba5750600554610100900460ff16155b156119f5576009546000906119d5904263ffffffff61264416565b11156119f5576009546119ee904263ffffffff61264416565b9050610c40565b506000610c40565b600060066001611646565b7f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d81565b6000600260015b6001600160a01b03939093166000908152920160205250604090205490565b7f0000000000000000000000000000000000000000000000000000000000ed4e0081565b600080611a8283611acb565b90506000611a8f84611a2c565b90506000611a9c85611b5a565b90506000611aa986611e6c565b9050611ac1816112278481888863ffffffff61223a16565b9695505050505050565b6000600281611a33565b600f5460ff16611b165760405162461bcd60e51b81526004018080602001828103825260248152602001806137406024913960400191505060405180910390fd5b610dc86000612d37565b6000601754600014611b355750601754610c40565b6113514261229d565b6000611b494261229d565b905061100f81612329565b60115490565b6000600280611a33565b600f5460ff1690565b7f00000000000000000000000000000000000000000000000000000000000003e881565b600a5490565b7f0000000000000000000000000000000000000000000000000000000017d7840081565b600080611bc6610bb0565b905060ff8116158015611bdc575060055460ff16155b15611beb576001915050610c40565b8060ff166001148015611c065750600554610100900460ff16155b8015611c14575060055460ff165b15611c36576009544211611c2c576000915050610c40565b6002915050610c40565b8060ff166002148015611c52575060055462010000900460ff16155b8015611c655750600554610100900460ff165b15611c8757600a544211611c7d576000915050610c40565b6003915050610c40565b6000915050610c40565b6000600560026114ec565b600f5460ff16611cdd5760405162461bcd60e51b81526004018080602001828103825260248152602001806137406024913960400191505060405180910390fd5b610dc86001612d37565b7f00000000000000000000000036ef5ad3348da55519ffdcd17eb42b05c6108e5781565b60008060028161145c565b6000600681611646565b60006005816114ec565b336000908152601e6020526040902054611d42611746565b336000908152601e6020526040812055601d54611d65908263ffffffff61264416565b601d556040805163a9059cbb60e01b81523360048201526024810183905290516001600160a01b037f0000000000000000000000009ed8e7c9604790f7ec589f99b94361d8aab64e5e169163a9059cbb9160448083019260209291908290030181600087803b158015611dd757600080fd5b505af1158015611deb573d6000803e3d6000fd5b505050506040513d6020811015611e0157600080fd5b505060408051828152905133917fcab347be18c8c37ef504626a027a12ea6725f491b5f5b154778d8d0c54f7841e919081900360200190a250565b7f0000000000000000000000000000000000000000000000000000000000ed4e0081565b6000806002600161145c565b6001600160a01b03166000908152601e602052604090205490565b600080611e9383611d0b565b90506000611ea084611e60565b90506000611ead85611455565b9050611ec381611227858563ffffffff61223a16565b95945050505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b7f0000000000000000000000009ed8e7c9604790f7ec589f99b94361d8aab64e5e81565b60007f0000000000000000000000000000000000000000000000000000000000093a80156119f55760055460ff168015611f555750600554610100900460ff165b8015611f6a575060055462010000900460ff16155b156119f557600a54600090611f85904263ffffffff61264416565b11156119f557600a546119ee904263ffffffff61264416565b600080611fb8620186a0611163348763ffffffff6125a916565b9050600060068660ff1660038110611fcc57fe5b015490506000611fe2828463ffffffff61223a16565b3360009081526020819052604090205490915060ff1661202357336000908152602081905260409020805460ff191660019081179091556013805490910190555b848110156120ed5761205b8360028960ff166003811061203f57fe5b336000908152910160205260409020549063ffffffff61223a16565b60028860ff166003811061206b57fe5b3360009081529101602052604090205580600660ff89166003811061208c57fe5b01556014546120a1903463ffffffff61223a16565b601455604080518481529051339160ff60018b0116917f8f7828ad11cbdf0ae595d4a4af4eb3311e55f6ce810b53d00bf9f691f5092a949181900360200190a360009350505050612233565b60006120ff868463ffffffff61264416565b9050600061211a8861116384620186a063ffffffff6125a916565b90506121308260028b60ff166003811061203f57fe5b60028a60ff166003811061214057fe5b3360009081529101602052604090205586600660ff8b166003811061216157fe5b0155601454612176908263ffffffff61223a16565b6014556001600560ff8b166003811061218b57fe5b602081049091018054921515601f9092166101000a91820260ff90920219909216179055336108fc6121c3348463ffffffff61264416565b6040518115909202916000818181858888f193505050501580156121eb573d6000803e3d6000fd5b50604080518381529051339160ff60018d0116917f8f7828ad11cbdf0ae595d4a4af4eb3311e55f6ce810b53d00bf9f691f5092a949181900360200190a36001955050505050505b9392505050565b600082820183811015612294576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b90505b92915050565b6000806122d97f0000000000000000000000000000000000000000000000000000000000015180611163600a548661264490919063ffffffff16565b9050600061230f6127107f00000000000000000000000000000000000000000000000000000000000007d063ffffffff61260216565b9050808211156123225791506114989050565b5092915050565b600554600090819060ff1680156123475750600554610100900460ff165b801561235c575060055462010000900460ff16155b6123975760405162461bcd60e51b81526004018080602001828103825260348152602001806138596034913960400191505060405180910390fd5b600a544210156123d85760405162461bcd60e51b81526004018080602001828103825260228152602001806138f06022913960400191505060405180910390fd5b60006124306127106111637f00000000000000000000000000000000000000000031a17e847807b1bc0000007f00000000000000000000000000000000000000000000000000000000000007d063ffffffff6125a916565b9050612472612445858363ffffffff6125a916565b7f00000000000000000000000000000000000000000031a17e847807b1bc0000009063ffffffff61264416565b60085490925082116124eb5760405133903480156108fc02916000818181858888f193505050501580156124aa573d6000803e3d6000fd5b506005805462ff000019166201000017905542600b5560006124ca6124f6565b905060006124d782612564565b6017929092555060155550600191506124f1565b50600091505b915091565b6000600b546000191415612551576040805162461bcd60e51b815260206004820152601e60248201527f54686520746869726420726f756e64206d757374206265206163746976650000604482015290519081900360640190fd5b600061255e600b5461229d565b91505090565b60008061149461259a847f00000000000000000000000000000000000000000000000000000000000003e863ffffffff6125a916565b6127109063ffffffff61264416565b6000826125b857506000612297565b828202828482816125c557fe5b04146122945760405162461bcd60e51b815260040180806020018281038252602181526020018061388d6021913960400191505060405180910390fd5b600061229483836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250613023565b600061229483836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f7700008152506130c5565b6000806126b9837f00000000000000000000000000000000000000000000000000000000000003e863ffffffff6125a916565b905060006126ff6126f0857f00000000000000000000000000000000000000000000000000000000000001f463ffffffff6125a916565b6113889063ffffffff61264416565b9050600061271e612710611163846014546125a990919063ffffffff16565b90504781111561272e5747612730565b805b90506000612786620186a06111636127506127108863ffffffff61264416565b61116361271061155e887f0000000000000000000000000000000000000000000000000000000017d7840063ffffffff6125a916565b90507f0000000000000000000000009ed8e7c9604790f7ec589f99b94361d8aab64e5e6001600160a01b031663095ea7b37f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d836040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050602060405180830381600087803b15801561282857600080fd5b505af115801561283c573d6000803e3d6000fd5b505050506040513d602081101561285257600080fd5b50506040805163f305d71960e01b81526001600160a01b037f0000000000000000000000009ed8e7c9604790f7ec589f99b94361d8aab64e5e811660048301526024820184905260006044830181905260648301527f0000000000000000000000000065bac24ce57aa77a676193e9a9a2bbeeaa3313811660848301524260a483015291517f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d9092169163f305d71991859160c480830192606092919082900301818588803b15801561292457600080fd5b505af1158015612938573d6000803e3d6000fd5b50505050506040513d606081101561294f57600080fd5b50506040516001600160a01b037f0000000000000000000000000065bac24ce57aa77a676193e9a9a2bbeeaa331316904780156108fc02916000818181858888f193505050501580156129a6573d6000803e3d6000fd5b50611ac17f000000000000000000000000000000000000000000084595161401484a0000008263ffffffff61264416565b60006129ea82600263ffffffff61260216565b905060006129fe838363ffffffff61264416565b90507f0000000000000000000000009ed8e7c9604790f7ec589f99b94361d8aab64e5e6001600160a01b031663a9059cbb7f00000000000000000000000036ef5ad3348da55519ffdcd17eb42b05c6108e57846040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050602060405180830381600087803b158015612aa057600080fd5b505af1158015612ab4573d6000803e3d6000fd5b505050506040513d6020811015612aca57600080fd5b505060408051630852cd8d60e31b81526004810183905290516001600160a01b037f0000000000000000000000009ed8e7c9604790f7ec589f99b94361d8aab64e5e16916342966c6891602480830192600092919082900301818387803b158015612b3457600080fd5b505af1158015612b48573d6000803e3d6000fd5b50505050505050565b336001600160a01b037f0000000000000000000000000065bac24ce57aa77a676193e9a9a2bbeeaa33131614612bb85760405162461bcd60e51b81526004018080602001828103825260398152602001806136bc6039913960400191505060405180910390fd5b612bd260026111636016544761264490919063ffffffff16565b811115612c105760405162461bcd60e51b815260040180806020018281038252602a815260200180613716602a913960400191505060405180910390fd5b60055462010000900460ff1615612c6e576040805162461bcd60e51b815260206004820152601d60248201527f54686520746869726420726f756e64206973206e6f7420616374697665000000604482015290519081900360640190fd5b601654612c81908263ffffffff61223a16565b6016556040516001600160a01b037f0000000000000000000000000065bac24ce57aa77a676193e9a9a2bbeeaa3313169082156108fc029083906000818181858888f19350505050158015612cda573d6000803e3d6000fd5b5050565b600080612cf3601b5461116361152286611a76565b9050601b54612d0461157b85611a76565b81612d0b57fe5b6001600160a01b0394909416600090815260016020819052604090912001805491909406019092555090565b60055460ff168015612d505750600554610100900460ff165b8015612d64575060055462010000900460ff165b612d9f5760405162461bcd60e51b815260040180806020018281038252603e81526020018061381b603e913960400191505060405180910390fd5b600c8160ff1660038110612daf57fe5b3360009081529101602052604090205460ff1615612dfe5760405162461bcd60e51b81526004018080602001828103825260428152602001806138ae6042913960600191505060405180910390fd5b612e06611746565b600060028260ff1660038110612e1857fe5b33600090815291016020526040812054601554909250612e47906127109061116390859063ffffffff6125a916565b9050612e798260028560ff1660038110612e5d57fe5b336000908152910160205260409020549063ffffffff61264416565b60028460ff1660038110612e8957fe5b33600090815291016020526040902055601254612eac908363ffffffff61264416565b6012556000612eba33611a76565b90506000612ec733611e6c565b9050612ed9828263ffffffff61264416565b612ee557612ee5611d2a565b6000612ef033612cde565b3360009081526001602081905260409091200154909150612f17908263ffffffff61223a16565b336000908152600160208190526040909120808201929092556019546002830155601c54909155600c60ff881660038110612f4e57fe5b3360008181529190920160209081526040808320805460ff191695151595909517909455835163a9059cbb60e01b815260048101939093526024830189905292516001600160a01b037f0000000000000000000000009ed8e7c9604790f7ec589f99b94361d8aab64e5e169363a9059cbb93604480820194929392918390030190829087803b158015612fe057600080fd5b505af1158015612ff4573d6000803e3d6000fd5b505050506040513d602081101561300a57600080fd5b5061301b905060ff8716338661311f565b505050505050565b600081836130af5760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561307457818101518382015260200161305c565b50505050905090810190601f1680156130a15780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5060008385816130bb57fe5b0495945050505050565b600081848411156131175760405162461bcd60e51b815260206004820181815283516024840152835190928392604490910191908501908083836000831561307457818101518382015260200161305c565b505050900390565b60006131366010544261264490919063ffffffff16565b905060008061314486613344565b90508083106131555783915061322f565b61316b600461116383600363ffffffff6125a916565b831015801561317957508083105b1561319b57613194600461116386600363ffffffff6125a916565b915061322f565b6131ac81600263ffffffff61260216565b83101580156131cf57506131cc600461116383600363ffffffff6125a916565b83105b156131e55761319484600263ffffffff61260216565b6131f681600463ffffffff61260216565b8310158015613214575061321181600263ffffffff61260216565b83105b1561322a5761319484600463ffffffff61260216565b600091505b613247613242858463ffffffff61264416565b6133d2565b81156132fa577f0000000000000000000000009ed8e7c9604790f7ec589f99b94361d8aab64e5e6001600160a01b031663a9059cbb86846040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050602060405180830381600087803b1580156132cd57600080fd5b505af11580156132e1573d6000803e3d6000fd5b505050506040513d60208110156132f757600080fd5b50505b6040805185815242602082015281516001600160a01b038816927fc6d99bc4696a33c554dbcc4e3d8af9493385fe991203d21d8e08a8e78bd34c26928290030190a2505050505050565b60008161337257507f0000000000000000000000000000000000000000000000000000000000ed4e00611498565b81600114156133a257507f0000000000000000000000000000000000000000000000000000000000ed4e00611498565b816002141561149857507f0000000000000000000000000000000000000000000000000000000000ed4e00611498565b806133dc57610dc6565b60006133ef82600263ffffffff61260216565b90506000613403838363ffffffff61264416565b601154909150613419908263ffffffff61264416565b60115560188190556040805163a9059cbb60e01b81526001600160a01b037f00000000000000000000000036ef5ad3348da55519ffdcd17eb42b05c6108e57811660048301526024820184905291517f0000000000000000000000009ed8e7c9604790f7ec589f99b94361d8aab64e5e9092169163a9059cbb916044808201926020929091908290030181600087803b1580156134b557600080fd5b505af11580156134c9573d6000803e3d6000fd5b505050506040513d60208110156134df57600080fd5b50506018546134ed9061352c565b6040805183815260208101839052815133927f5b5150884a592e7c8bc5ac21883ec7aa3174e9b7e70b02fd6a5499da0c17c827928290030190a2505050565b6000613549601a54611227601b54856125a990919063ffffffff16565b90506000613574613567601d5460125461223a90919063ffffffff16565b839063ffffffff61260216565b905061359d613590601d5460125461223a90919063ffffffff16565b839063ffffffff6135fe16565b601a556019546135b3908263ffffffff61223a16565b601955601c54600019016000908152601f60205260409020546135dc908263ffffffff61223a16565b601c80546000908152601f602052604090209190915580546001019055505050565b600061229483836040518060400160405280601881526020017f536166654d6174683a206d6f64756c6f206279207a65726f00000000000000008152506000818361368a5760405162461bcd60e51b815260206004820181815283516024840152835190928392604490910191908501908083836000831561307457818101518382015260200161305c565b5082848161369457fe5b06949350505050565b6040518060600160405280600390602082028036833750919291505056fe5468652063616c6c6572206d75737420626520746865207370656369666965642066756e64732077616c6c6574206f6620746865207465616d546865207374616b65206f66666572696e67206d757374206265206163746976655468652027616d6f756e744172672720617267756d656e74206578636565647320746865206c696d697454686520626f6e7573206f66666572696e67206973206e6f74206163746976652079657454686520666972737420726f756e64206f6e65206d757374206e6f7420626520616374697665207768696c6520746865207365636f6e6420726f756e64206d75737420626520616374697665546865207374616b65206f66666572696e6720726f756e647320617265206e6f742061637469766574686520626f6e7573206f66666572696e6720616e6420756e697377617020706172696e672063616e206f6e6c7920626520646f6e65206f6e6365207065722049534f54686520726f756e6473206d75737420626520696e616374697665206265666f726520616e7920746f6b656e732063616e2062652077697468647261776e526f756e6420332068617320656e646564206f7220526f756e642031206f7220322068617665206e6f7420656e64656420796574536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f775468652063616c6c6572206d757374206861766520776974686472617761626c6520746f6b656e7320617661696c61626c652066726f6d207468697320726f756e64506175736520706572696f64206265747765656e20526f756e64203220616e6420334572726f7220696e2073656e64696e67207265776172642066726f6d20636f6e74726163745468652074696d652064656c6179206265747765656e2074686520666972737420726f756e6420616e6420746865207365636f6e6420726f756e64206d75737420626520737572706173736564546865207365636f6e6420726f756e64206f6e65206d757374206e6f7420626520616374697665207768696c652074686520746869726420726f756e64206d75737420626520616374697665a26469706673582212206c691727c49f8579fd730ffc5486b5e887bcfb9dfcd0883b58dfcf10c5611ab564736f6c63430006060033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000009ed8e7c9604790f7ec589f99b94361d8aab64e5e000000000000000000000000000000000000000000108b2a2c28029094000000000000000000000000000000000000000000000000211654585005212800000000000000000000000000000000000000000000000031a17e847807b1bc000000000000000000000000000000000000000000000000084595161401484a00000000000000000000000000000000000000000000000000000000000000ee6b2800000000000000000000000000000000000000000000000000000000009ef21aab0000000000000000000000000000000000000000000000000000000077359400000000000000000000000000000000000000000000000000000000000001518000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000093a800000000000000000000000000000000000000000000000000000000000ed4e000000000000000000000000000000000000000000000000000000000000ed4e000000000000000000000000000000000000000000000000000000000000ed4e000000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d00000000000000000000000000000000000000000000000000000000000007d000000000000000000000000000000000000000000000000000000000000001f400000000000000000000000000000000000000000000000000000000000003e800000000000000000000000000000000000000000000000000000000000003e80000000000000000000000000000000000000000000000000000000017d7840000000000000000000000000036ef5ad3348da55519ffdcd17eb42b05c6108e570000000000000000000000000065bac24ce57aa77a676193e9a9a2bbeeaa3313
-----Decoded View---------------
Arg [0] : tokenArg (address): 0x9Ed8e7C9604790F7Ec589F99b94361d8AAB64E5E
Arg [1] : totalSupplyArg (uint256[3]): 20000000000000000000000000,40000000000000000000000000,60000000000000000000000000
Arg [2] : totalSupplyUniswapArg (uint256): 10000000000000000000000000
Arg [3] : ratesArg (uint256[3]): 4000000000,2666666667,2000000000
Arg [4] : periodDurationR3Arg (uint256): 86400
Arg [5] : timeDelayR1Arg (uint256): 0
Arg [6] : timeDelayR2Arg (uint256): 604800
Arg [7] : stakingPeriodArg (uint256[3]): 15552000,15552000,15552000
Arg [8] : uniswapRouterArg (address): 0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D
Arg [9] : decreasingPctArg (uint256[4]): 2000,500,1000,1000
Arg [10] : listingRateArg (uint256): 400000000
Arg [11] : platformStakingContractArg (address): 0x36EF5aD3348DA55519fFDCd17eB42B05C6108e57
Arg [12] : walletArg (address): 0x0065BaC24cE57aa77a676193e9A9A2BBeEaA3313
-----Encoded View---------------
22 Constructor Arguments found :
Arg [0] : 0000000000000000000000009ed8e7c9604790f7ec589f99b94361d8aab64e5e
Arg [1] : 000000000000000000000000000000000000000000108b2a2c28029094000000
Arg [2] : 0000000000000000000000000000000000000000002116545850052128000000
Arg [3] : 00000000000000000000000000000000000000000031a17e847807b1bc000000
Arg [4] : 000000000000000000000000000000000000000000084595161401484a000000
Arg [5] : 00000000000000000000000000000000000000000000000000000000ee6b2800
Arg [6] : 000000000000000000000000000000000000000000000000000000009ef21aab
Arg [7] : 0000000000000000000000000000000000000000000000000000000077359400
Arg [8] : 0000000000000000000000000000000000000000000000000000000000015180
Arg [9] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [10] : 0000000000000000000000000000000000000000000000000000000000093a80
Arg [11] : 0000000000000000000000000000000000000000000000000000000000ed4e00
Arg [12] : 0000000000000000000000000000000000000000000000000000000000ed4e00
Arg [13] : 0000000000000000000000000000000000000000000000000000000000ed4e00
Arg [14] : 0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d
Arg [15] : 00000000000000000000000000000000000000000000000000000000000007d0
Arg [16] : 00000000000000000000000000000000000000000000000000000000000001f4
Arg [17] : 00000000000000000000000000000000000000000000000000000000000003e8
Arg [18] : 00000000000000000000000000000000000000000000000000000000000003e8
Arg [19] : 0000000000000000000000000000000000000000000000000000000017d78400
Arg [20] : 00000000000000000000000036ef5ad3348da55519ffdcd17eb42b05c6108e57
Arg [21] : 0000000000000000000000000065bac24ce57aa77a676193e9a9a2bbeeaa3313
Deployed Bytecode Sourcemap
24206:34949:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31527:30;;;-1:-1:-1;;;31527:30:0;;31551:4;31527:30;;;;;;31560:1;;-1:-1:-1;;;;;31527:5:0;:15;;;;:30;;;;;;;;;;;;;;;:15;:30;;;2:2:-1;;;;27:1;24;17:12;2:2;31527:30:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;31527:30:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;31527:30:0;:34;31523:498;;;31576:18;31597:24;:22;:24::i;:::-;31576:45;-1:-1:-1;31650:17:0;;;31646:300;;31686:13;:11;:13::i;:::-;31646:300;;;31723:12;:17;;31739:1;31723:17;31719:227;;;31759:13;:11;:13::i;31719:227::-;31796:12;:17;;31812:1;31796:17;31792:154;;;31832:13;:11;:13::i;31792:154::-;31882:50;;-1:-1:-1;;;31882:50:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31792:154;31523:498;;;;31970:43;;-1:-1:-1;;;31970:43:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31523:498;24206:34949;;12:1:-1;9;2:12;37157:90:0;;5:9:-1;2:2;;;27:1;24;17:12;2:2;37157:90:0;;;:::i;:::-;;;;;;;;;;;;;;;;37318:88;;5:9:-1;2:2;;;27:1;24;17:12;2:2;37318:88:0;;;:::i;24689:31::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;24689:31:0;;;:::i;24522:38::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;24522:38:0;;;:::i;32395:1378::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;32395:1378:0;;;:::i;44385:133::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;44385:133:0;;;:::i;25133:41::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;25133:41:0;;;:::i;25085:43::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;25085:43:0;;;:::i;24617:31::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;24617:31:0;;;:::i;36036:158::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;36036:158:0;;;:::i;24859:40::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;24859:40:0;;;:::i;24479:38::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;24479:38:0;;;:::i;24567:43::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;24567:43:0;;;:::i;45223:220::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;45223:220:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;45223:220:0;-1:-1:-1;;;;;45223:220:0;;:::i;24436:38::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;24436:38:0;;;:::i;24653:31::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;24653:31:0;;;:::i;39015:85::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;39015:85:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;36291:115;;5:9:-1;2:2;;;27:1;24;17:12;2:2;36291:115:0;;;:::i;42517:430::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;42517:430:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;42517:430:0;-1:-1:-1;;;;;42517:430:0;;:::i;37630:84::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;37630:84:0;;;:::i;24816:36::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;24816:36:0;;;:::i;37801:104::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;37801:104:0;;;:::i;24390:39::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;24390:39:0;;;:::i;:::-;;;;-1:-1:-1;;;;;24390:39:0;;;;;;;;;;;;;;40761:92;;5:9:-1;2:2;;;27:1;24;17:12;2:2;40761:92:0;;;:::i;33871:651::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;33871:651:0;;;:::i;38002:112::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;38002:112:0;;;:::i;41179:723::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;41179:723:0;;;:::i;36704:126::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;36704:126:0;;;:::i;25179:42::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;25179:42:0;;;:::i;24727:41::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;24727:41:0;;;:::i;35790:160::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;35790:160:0;;;:::i;39360:448::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;39360:448:0;;;:::i;40599:92::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;40599:92:0;;;:::i;25029:49::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;25029:49:0;;;:::i;43432:128::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;43432:128:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;43432:128:0;-1:-1:-1;;;;;43432:128:0;;:::i;24904:40::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;24904:40:0;;;:::i;43853:421::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;43853:421:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;43853:421:0;-1:-1:-1;;;;;43853:421:0;;:::i;43221:128::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;43221:128:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;43221:128:0;-1:-1:-1;;;;;43221:128:0;;:::i;34833:164::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;34833:164:0;;;:::i;36901:185::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;36901:185:0;;;:::i;32109:118::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;32109:118:0;;;:::i;36491:99::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;36491:99:0;;;:::i;43641:129::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;43641:129:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;43641:129:0;-1:-1:-1;;;;;43641:129:0;;:::i;40968:109::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;40968:109:0;;;:::i;25226:43::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;25226:43:0;;;:::i;37475:88::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;37475:88:0;;;:::i;25278:36::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;25278:36:0;;;:::i;38188:588::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;38188:588:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;39177:86;;5:9:-1;2:2;;;27:1;24;17:12;2:2;39177:86:0;;;:::i;35313:164::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;35313:164:0;;;:::i;25319:48::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;25319:48:0;;;:::i;44607:220::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;44607:220:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;44607:220:0;-1:-1:-1;;;;;44607:220:0;;:::i;40437:92::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;40437:92:0;;;:::i;38853:85::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;38853:85:0;;;:::i;42002:445::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;42002:445:0;;;:::i;24949:40::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;24949:40:0;;;:::i;44915:220::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;44915:220:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;44915:220:0;-1:-1:-1;;;;;44915:220:0;;:::i;43010:132::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;43010:132:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;43010:132:0;-1:-1:-1;;;;;43010:132:0;;:::i;45537:304::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;45537:304:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;45537:304:0;-1:-1:-1;;;;;45537:304:0;;:::i;24775:36::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;24775:36:0;;;:::i;24996:28::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;24996:28:0;;;:::i;39903:464::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;39903:464:0;;;:::i;58064:348::-;58141:9;:12;58120:5;;58141:12;;58136:271;;-1:-1:-1;58175:1:0;58168:8;;58136:271;58196:9;:12;;;:29;;;;-1:-1:-1;58213:9:0;:12;;;;;;58212:13;58196:29;:46;;;;-1:-1:-1;58230:9:0;:12;;;;;;58229:13;58196:46;58192:215;;;-1:-1:-1;58264:1:0;58257:8;;58192:215;58285:9;:12;;;:28;;;;-1:-1:-1;58301:9:0;:12;;;;;;58285:28;:45;;;;-1:-1:-1;58318:9:0;:12;;;;;;58317:13;58285:45;58281:126;;;-1:-1:-1;58352:1:0;58345:8;;58281:126;-1:-1:-1;58389:8:0;58281:126;58064:348;:::o;48317:454::-;48361:30;;;-1:-1:-1;;;48361:30:0;;48385:4;48361:30;;;;;;48394:1;;-1:-1:-1;;;;;48361:5:0;:15;;;;:30;;;;;;;;;;;;;;;:15;:30;;;2:2:-1;;;;27:1;24;17:12;2:2;48361:30:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;48361:30:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;48361:30:0;:34;48357:409;;;48419:9;:12;;;48418:13;48410:68;;;;;-1:-1:-1;;;48410:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;48503:17;48523:35;48533:1;48536:6;48544:13;48523:9;:35::i;:::-;48503:55;-1:-1:-1;48603:4:0;48587:20;;;;48583:104;;;48641:32;:15;48661:11;48641:32;:19;:32;:::i;:::-;48626:12;:47;48583:104;48357:409;;48317:454::o;48857:492::-;48905:9;:12;;;:29;;;;-1:-1:-1;48922:9:0;:12;;;;;;48921:13;48905:29;48897:125;;;;-1:-1:-1;;;48897:125:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49058:12;;49039:15;:31;;49031:128;;;;-1:-1:-1;;;49031:128:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49176:17;49196:35;49206:1;49209:6;49217:13;49196:9;:35::i;:::-;49176:55;-1:-1:-1;49268:4:0;49252:20;;;;49248:96;;;49302:32;:15;49322:11;49302:32;:19;:32;:::i;:::-;49287:12;:47;48857:492;:::o;49435:942::-;49483:9;:12;;;;;;:29;;;;-1:-1:-1;49500:9:0;:12;;;;;;49499:13;49483:29;49475:125;;;;-1:-1:-1;;;49475:125:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49636:12;;49617:15;:31;;49609:128;;;;-1:-1:-1;;;49609:128:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49755:14;49772:33;49789:15;49772:16;:33::i;:::-;49755:50;;49823:18;49843:31;49878:16;49887:6;49878:8;:16::i;:::-;49822:72;;;;49910:13;49905:467;;49938:17;49958:45;49968:1;49971:6;49979:23;49958:9;:45::i;:::-;49938:65;-1:-1:-1;50048:4:0;50032:20;;;;50028:335;;;50084:15;50071:10;:28;50116:20;50139:24;:22;:24::i;:::-;50116:47;;50180:23;50206:44;50237:12;50206:30;:44::i;:::-;50267:21;:39;-1:-1:-1;50323:11:0;:26;50028:335;49905:467;;49435:942;;;:::o;37157:90::-;37230:11;;37157:90;:::o;37318:88::-;37388:12;;37318:88;:::o;24689:31::-;;;:::o;24522:38::-;;;:::o;32395:1378::-;32466:9;:12;;;:28;;;;-1:-1:-1;32482:9:0;:12;;;;;;32466:28;:44;;;;-1:-1:-1;32498:9:0;:12;;;;;;32466:44;32458:91;;;;;-1:-1:-1;;;32458:91:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;32567:20;;;;32566:21;32558:109;;;;-1:-1:-1;;;32558:109:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32684:31;;:::i;:::-;:254;;;;;;;;32731:56;32781:5;32732:43;32753:21;;32732:13;32746:1;32732:16;;;;;;;;;;:43;:20;:43;:::i;:::-;32731:49;:56;:49;:56;:::i;:::-;32684:254;;;;32800:56;32850:5;32801:43;32822:21;;32801:13;32815:1;32801:16;;;;;;32800:56;32684:254;;;;32869:56;32919:5;32870:43;32891:21;;32870:13;32884:1;32870:16;;;;;;32869:56;32684:254;;;-1:-1:-1;32959:19:0;32981:51;33018:13;32981:32;:13;32999;32981:32;:17;:32;:::i;:::-;:36;:51;:36;:51;:::i;:::-;33105:16;;33083;;33105:13;33062:16;32959:73;;-1:-1:-1;33041:18:0;;33062:60;;33105:16;33062:38;;:16;:20;:38::i;:60::-;33041:81;-1:-1:-1;33131:20:0;33154:27;:11;33041:81;33154:27;:15;:27;:::i;:::-;33310:16;;;;;33280;;;33250;;33131:50;;-1:-1:-1;33202:21:0;;33226:101;;33310:16;33226:71;;;;:11;;:23;:41::i;:::-;:53;:71;:53;:71;:::i;:101::-;33202:125;;33344:29;33376:31;33395:11;;33376:18;:31::i;:::-;33425:20;:27;;-1:-1:-1;;33425:27:0;33448:4;33425:27;;;33487:15;33461:23;:41;33568:16;;;;;33546;;;33525;;33344:63;;-1:-1:-1;33525:60:0;;:38;;:20;:38::i;:60::-;33511:11;:74;33594:19;:32;;;33643:71;33655:58;33691:21;33655:31;:12;33672:13;33655:31;:16;:31;:::i;:58::-;33643:11;:71::i;:::-;33735:32;;;33745:4;33735:32;;33751:15;33735:32;;;;;;;;;;;;;;;;;32395:1378;;;;;;:::o;44385:133::-;44439:7;44464:48;44488:23;;44464:19;;:23;;:48;;;;:::i;:::-;44457:55;;44385:133;:::o;25133:41::-;;;:::o;25085:43::-;;;:::o;24617:31::-;;;:::o;36036:158::-;36079:14;36096:53;36147:1;36097:44;36125:15;;36098:21;36097:27;;:44;;;;:::i;36096:53::-;36079:70;;36166:22;36181:6;36166:14;:22::i;24859:40::-;;;:::o;24479:38::-;;;:::o;24567:43::-;;;:::o;45223:220::-;45291:7;;45332:14;;:17;-1:-1:-1;;;;;45332:29:0;;;;;;:17;;:29;;;;;;45403:21;;45332:29;;-1:-1:-1;45385:52:0;;45431:5;;45386:39;;45332:29;;45386:39;:16;:39;:::i;45385:52::-;45378:59;;;45223:220;;;;:::o;24436:38::-;;;:::o;24653:31::-;;;:::o;39015:85::-;39060:4;39082:9;39092:1;39082:12;;;;;;;;;;;;;;;;;;;-1:-1:-1;39015:85:0;:::o;36291:115::-;36377:23;;36291:115;:::o;42517:430::-;42580:7;42598:14;42615:122;42728:8;;42616:106;42689:32;42710:10;42689:20;:32::i;:::-;-1:-1:-1;;;;;42646:25:0;;42637:45;42646:25;;;42680:1;42646:25;;;;;;;;:31;-1:-1:-1;;42646:35:0;42637:45;;:8;:45;;;;;;42617:15;;:66;;;:19;:66;:::i;:::-;42616:72;:106;:72;:106;:::i;42615:122::-;42598:139;;42867:8;;42757:106;42830:32;42851:10;42830:20;:32::i;:::-;-1:-1:-1;;;;;42787:25:0;;42778:45;42787:25;;;42821:1;42787:25;;;;;;;;:31;-1:-1:-1;;42787:35:0;42778:45;;:8;:45;;;;;;42758:15;;:66;;;:19;:66;:::i;42757:106::-;42756:119;;;;;42918:10;42904:25;;;;:13;:25;;;;;;;;:35;;42756:119;;;42746:129;;;;;42893:47;;42746:129;;42893:47;:10;:47;:::i;37630:84::-;37698:10;;37630:84;:::o;24816:36::-;;;:::o;37801:104::-;37881:18;;37801:104;:::o;24390:39::-;;;:::o;40761:92::-;40806:7;40831:13;40845:1;40831:16;;;40824:23;;40761:92;:::o;33871:651::-;33917:15;33935:29;33953:10;33935:17;:29::i;:::-;34009:10;33995:25;;;;:13;:25;;;;;;;;:35;;33917:47;;-1:-1:-1;33983:48:0;;33917:47;;33983:48;:11;:48;:::i;:::-;33973:58;-1:-1:-1;34160:10:0;34142:29;;;;:17;:29;;;;;;:42;;34176:7;34142:42;:33;:42;:::i;:::-;34128:10;34110:29;;;;:17;:29;;;;;:74;34219:23;;:36;;34247:7;34219:36;:27;:36;:::i;:::-;34193:23;:62;34278:11;;:24;;34294:7;34278:24;:15;:24;:::i;:::-;34264:11;:38;34347:6;;34327:10;34313:25;;;;:13;:25;;;;;;;;:40;;;34362:35;;;:39;;;;34452:15;;34410:39;;;;:57;;;;34489:27;;;;;;;34327:10;;34489:27;;;;;;;;;;;33871:651;:::o;38002:112::-;38086:22;;38002:112;:::o;41179:723::-;41257:10;41243:25;;;;:13;:25;;;;;:39;;;41225:15;;:57;41221:676;;;41297:15;41315:29;41333:10;41315:17;:29::i;:::-;41393:10;41379:25;;;;:13;:25;;;;;;;;:35;;41297:47;;-1:-1:-1;41367:48:0;;41297:47;;41367:48;:11;:48;:::i;:::-;41357:58;-1:-1:-1;41546:6:0;;41526:10;41512:25;;;;:13;:25;;;;;;;:40;;;41565:35;;:39;41659:15;;41617:39;;;;:57;41713:11;;:24;;41729:7;41713:24;:15;:24;:::i;:::-;41699:11;:38;41760:35;;;-1:-1:-1;;;41760:35:0;;41775:10;41760:35;;;;;;;;;;;;-1:-1:-1;;;;;41760:5:0;:14;;;;:35;;;;;;;;;;;;;;-1:-1:-1;41760:14:0;:35;;;2:2:-1;;;;27:1;24;17:12;2:2;41760:35:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;41760:35:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;41760:35:0;41752:85;;;;-1:-1:-1;;;41752:85:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41857:28;;;;;;;;41865:10;;41857:28;;;;;;;;;;41221:676;41179:723::o;36704:126::-;36795:29;;36704:126;:::o;25179:42::-;;;:::o;24727:41::-;;;:::o;35790:160::-;35844:20;;;;35836:77;;;;-1:-1:-1;;;35836:77:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35926:18;35942:1;35926:15;:18::i;39360:448::-;39420:7;39442:11;:15;39438:365;;39476:9;:12;;;:29;;;;-1:-1:-1;39493:9:0;:12;;;;;;39492:13;39476:29;39472:285;;;39528:12;;39564:1;;39528:33;;39545:15;39528:33;:16;:33;:::i;:::-;:37;39524:175;;;39595:12;;:33;;39612:15;39595:33;:16;:33;:::i;:::-;39588:40;;;;39524:175;-1:-1:-1;39680:1:0;39673:8;;40599:92;40644:7;40669:13;40683:1;40669:16;;25029:49;;;:::o;43432:128::-;43500:7;43525:14;43540:1;43525:17;-1:-1:-1;;;;;43525:29:0;;;;;;;;:17;;:29;;-1:-1:-1;43525:29:0;;;;;43432:128::o;24904:40::-;;;:::o;43853:421::-;43924:7;43942:22;43967:29;43985:10;43967:17;:29::i;:::-;43942:54;;44005:22;44030:29;44048:10;44030:17;:29::i;:::-;44005:54;;44068:22;44093:29;44111:10;44093:17;:29::i;:::-;44068:54;;44131:16;44150:32;44171:10;44150:20;:32::i;:::-;44131:51;-1:-1:-1;44200:68:0;44131:51;44200:54;44239:14;44200:54;:14;44219;44200:34;:18;:34;:::i;:68::-;44193:75;43853:421;-1:-1:-1;;;;;;43853:421:0:o;43221:128::-;43289:7;43314:14;43289:7;43314:17;;34833:164;34887:20;;;;34879:77;;;;-1:-1:-1;;;34879:77:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34973:18;34989:1;34973:15;:18::i;36901:185::-;36951:7;36973:11;;36988:1;36973:16;36969:63;;-1:-1:-1;37011:11:0;;37004:18;;36969:63;37047:33;37064:15;37047:16;:33::i;32109:118::-;32146:14;32163:33;32180:15;32163:16;:33::i;:::-;32146:50;;32205:16;32214:6;32205:8;:16::i;36491:99::-;36573:11;;36491:99;:::o;43641:129::-;43709:7;43735:14;;:17;;40968:109;41051:20;;;;40968:109;:::o;25226:43::-;;;:::o;37475:88::-;37545:12;;37475:88;:::o;25278:36::-;;;:::o;38188:588::-;38238:5;38254:11;38268:24;:22;:24::i;:::-;38254:38;-1:-1:-1;38313:10:0;;;;:27;;;;-1:-1:-1;38328:9:0;:12;;;38327:13;38313:27;38309:64;;;38362:1;38355:8;;;;;38309:64;38386:5;:10;;38395:1;38386:10;:27;;;;-1:-1:-1;38401:9:0;:12;;;;;;38400:13;38386:27;:43;;;;-1:-1:-1;38417:9:0;:12;;;38386:43;38382:168;;;38467:12;;38448:15;:31;38444:76;;38505:1;38498:8;;;;;38444:76;38539:1;38532:8;;;;;38382:168;38562:5;:10;;38571:1;38562:10;:27;;;;-1:-1:-1;38577:9:0;:12;;;;;;38576:13;38562:27;:43;;;;-1:-1:-1;38593:9:0;:12;;;;;;38562:43;38558:213;;;38643:12;;38624:15;:31;38620:76;;38681:1;38674:8;;;;;38620:76;38715:1;38708:8;;;;;38558:213;38760:1;38753:8;;;;;39177:86;39222:4;39245:9;39255:1;39245:12;;35313:164;35367:20;;;;35359:77;;;;-1:-1:-1;;;35359:77:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35453:18;35469:1;35453:15;:18::i;25319:48::-;;;:::o;44607:220::-;44675:7;;44716:14;44675:7;44716:17;;40437:92;40482:7;40507:13;40482:7;40507:16;;38853:85;38898:4;38920:9;38898:4;38920:12;;42002:445;42090:10;42055:14;42072:29;;;:17;:29;;;;;;42197:16;:14;:16::i;:::-;42248:10;42262:1;42230:29;;;:17;:29;;;;;:33;42298:23;;:35;;42326:6;42298:35;:27;:35;:::i;:::-;42272:23;:61;42350:34;;;-1:-1:-1;;;42350:34:0;;42365:10;42350:34;;;;;;;;;;;;-1:-1:-1;;;;;42350:5:0;:14;;;;:34;;;;;;;;;;;;;;-1:-1:-1;42350:14:0;:34;;;2:2:-1;;;;27:1;24;17:12;2:2;42350:34:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;42350:34:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;;42412:29:0;;;;;;;;42422:10;;42412:29;;;;;;42350:34;42412:29;;;42002:445;:::o;24949:40::-;;;:::o;44915:220::-;44983:7;;45024:14;45039:1;45024:17;;43010:132;-1:-1:-1;;;;;43107:29:0;43081:7;43107:29;;;:17;:29;;;;;;;43010:132::o;45537:304::-;45608:7;45626:15;45644:29;45662:10;45644:17;:29::i;:::-;45626:47;;45682:15;45700:29;45718:10;45700:17;:29::i;:::-;45682:47;;45738:15;45756:29;45774:10;45756:17;:29::i;:::-;45738:47;-1:-1:-1;45803:33:0;45738:47;45803:20;:7;45815;45803:20;:11;:20;:::i;:33::-;45796:40;45537:304;-1:-1:-1;;;;;45537:304:0:o;24775:36::-;;;:::o;24996:28::-;;;:::o;39903:464::-;39963:7;39985:11;:15;39981:381;;40019:9;:12;;;:28;;;;-1:-1:-1;40035:9:0;:12;;;;;;40019:28;:45;;;;-1:-1:-1;40052:9:0;:12;;;;;;40051:13;40019:45;40015:301;;;40087:12;;40123:1;;40087:33;;40104:15;40087:33;:16;:33;:::i;:::-;:37;40083:175;;;40154:12;;:33;;40171:15;40154:33;:16;:33;:::i;55785:1543::-;55878:17;;55929:34;55956:6;55929:22;:9;55943:7;55929:22;:13;:22;:::i;:34::-;55906:57;;55972:26;56001:13;56015:8;56001:23;;;;;;;;;;;;-1:-1:-1;56033:28:0;56064:36;56001:23;56087:12;56064:36;:22;:36;:::i;:::-;56135:10;56122:12;:24;;;;;;;;;;;56033:67;;-1:-1:-1;56122:24:0;;56117:118;;56174:10;56161:12;:24;;;;;;;;;;:31;;-1:-1:-1;;56161:31:0;56188:4;56161:31;;;;;;56205:18;:20;;;;;;;56117:118;56280:14;56257:20;:37;56253:1070;;;56348:54;56389:12;56348:14;56363:8;56348:24;;;;;;;;;56373:10;56348:36;;;;:24;;:36;;;;;;;:54;:40;:54;:::i;:::-;56309:14;56324:8;56309:24;;;;;;;;;56334:10;56309:36;;;;:24;;:36;;;;;:93;56441:20;56415:13;:23;;;;;;;;;;;:46;56499:22;;:37;;56526:9;56499:37;:26;:37;:::i;:::-;56474:22;:62;56566:53;;;;;;;;56594:10;;56566:53;56590:1;56579:12;;56566:53;;;;;;;;;;;56651:5;56644:12;;;;;;;56253:1070;56697:23;56723:38;:14;56742:18;56723:38;:18;:38;:::i;:::-;56697:64;-1:-1:-1;56774:20:0;56797:40;56829:7;56797:27;56697:64;56817:6;56797:27;:19;:27;:::i;:40::-;56774:63;;56901:57;56942:15;56901:14;56916:8;56901:24;;;;;;;;:57;56862:14;56877:8;56862:24;;;;;;;;;56887:10;56862:36;;;;:24;;:36;;;;;:96;56997:14;56971:13;:23;;;;;;;;;;;:40;57049:22;;:40;;57076:12;57049:40;:26;:40;:::i;:::-;57024:22;:65;57124:4;57102:9;:19;;;;;;;;;;;;;;;;:26;;;;;:19;;;;:26;;;;;;;;;;;;;;;;57153:10;:48;57173:27;:9;57187:12;57173:27;:13;:27;:::i;:::-;57153:48;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;57221:56:0;;;;;;;;57249:10;;57221:56;57245:1;57234:12;;57221:56;;;;;;;;;;;57309:4;57302:11;;;;;;;55785:1543;;;;;;:::o;866:181::-;924:7;956:5;;;980:6;;;;972:46;;;;;-1:-1:-1;;;972:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;1038:1;-1:-1:-1;866:181:0;;;;;:::o;58474:328::-;58539:7;58557:14;58575:49;58607:16;58576:25;58588:12;;58576:7;:11;;:25;;;;:::i;58575:49::-;58557:68;-1:-1:-1;58634:18:0;58655:38;58663:5;58674:18;58655:38;:18;:38;:::i;:::-;58634:59;;58723:10;58714:6;:19;58710:65;;;58755:10;-1:-1:-1;58748:17:0;;-1:-1:-1;58748:17:0;58710:65;-1:-1:-1;58790:6:0;58474:328;-1:-1:-1;;58474:328:0:o;54556:1083::-;54671:9;:12;54610:17;;;;54671:12;;:28;;;;-1:-1:-1;54687:9:0;:12;;;;;;54671:28;:45;;;;-1:-1:-1;54704:9:0;:12;;;;;;54703:13;54671:45;54663:117;;;;-1:-1:-1;;;54663:117:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54816:12;;54797:15;:31;;54789:85;;;;-1:-1:-1;;;54789:85:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54891:29;54923:48;54965:5;54923:37;:13;54941:18;54923:37;:17;:37;:::i;:48::-;54891:80;-1:-1:-1;54998:55:0;55016:36;:9;54891:80;55016:36;:13;:36;:::i;:::-;54998:13;;:55;:17;:55;:::i;:::-;55093:16;;54980:73;;-1:-1:-1;55074:35:0;;55070:564;;55124:30;;:10;;55144:9;55124:30;;;;;;;;;55144:9;55124:10;:30;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;55167:9:0;:19;;-1:-1:-1;;55167:19:0;;;;;55224:15;55211:10;:28;55167:12;55287:24;:22;:24::i;:::-;55264:47;;55324:23;55350:44;55381:12;55350:30;:44::i;:::-;55419:11;:26;;;;-1:-1:-1;55470:21:0;:39;-1:-1:-1;55530:4:0;;-1:-1:-1;55522:30:0;;55070:564;-1:-1:-1;55601:5:0;;-1:-1:-1;54556:1083:0;;;;:::o;58874:253::-;58930:7;58956:10;;-1:-1:-1;;58956:26:0;;58948:77;;;;;-1:-1:-1;;;58948:77:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;59042:20;59065:28;59082:10;;59065:16;:28::i;:::-;59042:51;-1:-1:-1;;58874:253:0;:::o;57784:215::-;57865:7;;57909:53;57928:33;:9;57942:18;57928:33;:13;:33;:::i;:::-;57917:5;;57909:53;:18;:53;:::i;2220:471::-;2278:7;2523:6;2519:47;;-1:-1:-1;2553:1:0;2546:8;;2519:47;2590:5;;;2594:1;2590;:5;:1;2614:5;;;;;:10;2606:56;;;;-1:-1:-1;;;2606:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3167:132;3225:7;3252:39;3256:1;3259;3252:39;;;;;;;;;;;;;;;;;:3;:39::i;1330:136::-;1388:7;1415:43;1419:1;1422;1415:43;;;;;;;;;;;;;;;;;:3;:43::i;53342:991::-;53412:7;;53453:38;:15;53473:17;53453:38;:19;:38;:::i;:::-;53430:61;-1:-1:-1;53502:19:0;53524:56;53542:37;:15;53562:16;53542:37;:19;:37;:::i;:::-;53532:4;;53524:56;:17;:56;:::i;:::-;53502:78;;53589:20;53612:52;53658:5;53613:39;53640:11;53613:22;;:26;;:39;;;;:::i;53612:52::-;53589:75;;53713:21;53696:12;:39;;:94;;53768:21;53696:94;;;53745:12;53696:94;53681:109;-1:-1:-1;53807:23:0;53833:122;53948:6;53833:102;53902:32;53910:5;53921:12;53902:32;:18;:32;:::i;:::-;53833:56;53883:5;53833:37;:12;53858:11;53833:37;:24;:37;:::i;:122::-;53807:148;;53972:5;-1:-1:-1;;;;;53972:13:0;;53994;54010:15;53972:54;;;;;;;;;;;;;-1:-1:-1;;;;;53972:54:0;-1:-1:-1;;;;;53972:54:0;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;53972:54:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;53972:54:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;;54043:164:0;;;-1:-1:-1;;;54043:164:0;;-1:-1:-1;;;;;54109:5:0;54043:164;;;;;;;;;;;;-1:-1:-1;54043:164:0;;;;;;;;;;54168:6;54043:164;;;;;;54183:15;54043:164;;;;;;:13;:29;;;;;;54079:12;;54043:164;;;;;;;;;;;;;;54079:12;54043:29;:164;;;2:2:-1;;;;27:1;24;17:12;2:2;54043:164:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;54043:164:0;;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;;54043:164:0;54224:38;-1:-1:-1;;;;;54224:6:0;:15;;54240:21;54224:38;;;;;;;;;54240:21;54224:15;:38;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;54287:39:0;:18;54310:15;54287:39;:22;:39;:::i;45931:234::-;45988:14;46005:16;:9;46019:1;46005:16;:13;:16;:::i;:::-;45988:33;-1:-1:-1;46030:14:0;46047:21;:9;45988:33;46047:21;:13;:21;:::i;:::-;46030:38;;46085:5;-1:-1:-1;;;;;46085:14:0;;46100:23;46125:6;46085:47;;;;;;;;;;;;;-1:-1:-1;;;;;46085:47:0;-1:-1:-1;;;;;46085:47:0;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;46085:47:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;46085:47:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;;46141:18:0;;;-1:-1:-1;;;46141:18:0;;;;;;;;;;-1:-1:-1;;;;;46141:5:0;:10;;;;:18;;;;;-1:-1:-1;;46141:18:0;;;;;;;-1:-1:-1;46141:10:0;:18;;;2:2:-1;;;;27:1;24;17:12;2:2;46141:18:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;46141:18:0;;;;45931:234;;;:::o;47751:481::-;47819:10;-1:-1:-1;;;;;47833:6:0;47819:20;;47811:98;;;;-1:-1:-1;;;47811:98:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47940:51;47989:1;47941:42;47967:15;;47941:21;:25;;:42;;;;:::i;47940:51::-;47926:9;:66;;47918:128;;;;-1:-1:-1;;;47918:128:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48064:9;:12;;;;;;48063:13;48055:63;;;;;-1:-1:-1;;;48055:63:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;48153:15;;:30;;48173:9;48153:30;:19;:30;:::i;:::-;48135:15;:48;48200:26;;-1:-1:-1;;;;;48200:6:0;:15;;:26;;;;;48216:9;;48200:26;;;;48216:9;48200:15;:26;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;48200:26:0;47751:481;:::o;52774:417::-;52838:7;52856:14;52873:122;52986:8;;52874:106;52947:32;52968:10;52947:20;:32::i;52873:122::-;52856:139;;53154:8;;53044:106;53117:32;53138:10;53117:20;:32::i;53044:106::-;53043:119;;;;;-1:-1:-1;;;;;53004:25:0;;;;;;;;:13;:25;;;;;;;;:35;:158;;53043:119;;;;53004:158;;;;-1:-1:-1;53179:6:0;52774:417::o;46351:1326::-;46417:9;:12;;;:28;;;;-1:-1:-1;46433:9:0;:12;;;;;;46417:28;:44;;;;-1:-1:-1;46449:9:0;:12;;;;;;46417:44;46409:127;;;;-1:-1:-1;;;46409:127:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46554:13;46568:8;46554:23;;;;;;;;;46578:10;46554:35;;;;:23;;:35;;;;;;;;46553:36;46545:123;;;;-1:-1:-1;;;46545:123:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46685:16;:14;:16::i;:::-;46718:14;46735;46750:8;46735:24;;;;;;;;;46760:10;46735:36;;;;:24;;:36;;;;;;46814:21;;46735:36;;-1:-1:-1;46802:46:0;;46842:5;;46803:33;;46735:36;;46803:33;:10;:33;:::i;46802:46::-;46780:68;;46904:48;46945:6;46904:14;46919:8;46904:24;;;;;;;;;46929:10;46904:36;;;;:24;;:36;;;;;;;:48;:40;:48;:::i;:::-;46865:14;46880:8;46865:24;;;;;;;;;46890:10;46865:36;;;;:24;;:36;;;;;:87;46983:19;;:31;;47007:6;46983:31;:23;:31;:::i;:::-;46961:19;:53;47031:21;47055:32;47076:10;47055:20;:32::i;:::-;47031:56;;47096:16;47115:32;47136:10;47115:20;:32::i;:::-;47096:51;-1:-1:-1;47168:27:0;:13;47096:51;47168:27;:17;:27;:::i;:::-;47164:65;;47202:27;:25;:27::i;:::-;47244:12;47259:29;47277:10;47259:17;:29::i;:::-;47350:10;47336:25;;;;:13;:25;;;;;;;;:35;;47244:44;;-1:-1:-1;47335:50:0;;47244:44;47335:50;:41;:50;:::i;:::-;47311:10;47297:25;;;;:13;:25;;;;;;;;:35;;;:88;;;;47436:15;;47394:39;;;:57;47494:6;;47460:40;;;47517:13;:23;;;;;;;;;;47541:10;47517:35;;;;:23;;;;:35;;;;;;;;:42;;-1:-1:-1;;47517:42:0;;;;;;;;;;;47576:34;;-1:-1:-1;;;47576:34:0;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;47576:5:0;:14;;;;:34;;;;;47517:35;;47576:34;;;;;;;;;:14;:34;;;2:2:-1;;;;27:1;24;17:12;2:2;47576:34:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;47576:34:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;47627:44:0;;-1:-1:-1;47627:44:0;;;47647:10;47659:11;47627:9;:44::i;:::-;46351:1326;;;;;;:::o;3795:278::-;3881:7;3916:12;3909:5;3901:28;;;;-1:-1:-1;;;3901:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;3901:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3940:9;3956:1;3952;:5;;;;;;;3795:278;-1:-1:-1;;;;;3795:278:0:o;1769:192::-;1855:7;1891:12;1883:6;;;;1875:29;;;;-1:-1:-1;;;1875:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27:10:-1;;8:100;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;1875:29:0;-1:-1:-1;;;1927:5:0;;;1769:192::o;50487:959::-;50580:19;50602:46;50624:23;;50603:15;50602:21;;:46;;;;:::i;:::-;50580:68;;50657:14;50688:16;50707:22;50720:8;50707:12;:22::i;:::-;50688:41;;50765:8;50750:11;:23;50746:492;;50797:9;50788:18;;50746:492;;;50841:22;50861:1;50841:15;:8;50854:1;50841:15;:12;:15;:::i;:22::-;50826:11;:37;;:63;;;;;50881:8;50867:11;:22;50826:63;50822:416;;;50913:23;50934:1;50913:16;:9;50927:1;50913:16;:13;:16;:::i;:23::-;50904:32;;50822:416;;;50971:15;:8;50984:1;50971:15;:12;:15;:::i;:::-;50956:11;:30;;:70;;;;-1:-1:-1;51004:22:0;51024:1;51004:15;:8;51017:1;51004:15;:12;:15;:::i;:22::-;50990:11;:36;50956:70;50952:286;;;51050:16;:9;51064:1;51050:16;:13;:16;:::i;50952:286::-;51101:15;:8;51114:1;51101:15;:12;:15;:::i;:::-;51086:11;:30;;:63;;;;-1:-1:-1;51134:15:0;:8;51147:1;51134:15;:12;:15;:::i;:::-;51120:11;:29;51086:63;51082:156;;;51173:16;:9;51187:1;51173:16;:13;:16;:::i;51082:156::-;51227:1;51218:10;;51082:156;51254:29;51261:21;:9;51275:6;51261:21;:13;:21;:::i;:::-;51254:6;:29::i;:::-;51304:11;;51300:74;;51330:5;-1:-1:-1;;;;;51330:14:0;;51345:10;51357:6;51330:34;;;;;;;;;;;;;-1:-1:-1;;;;;51330:34:0;-1:-1:-1;;;;;51330:34:0;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;51330:34:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;51330:34:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;;51300:74:0;51395:45;;;;;;51424:15;51395:45;;;;;;-1:-1:-1;;;;;51395:45:0;;;;;;;;;;;50487:959;;;;;;:::o;57414:295::-;57476:7;57498:13;57494:64;;-1:-1:-1;57533:15:0;57526:22;;57494:64;57570:8;57582:1;57570:13;57566:64;;;-1:-1:-1;57605:15:0;57598:22;;57566:64;57642:8;57654:1;57642:13;57638:64;;;-1:-1:-1;57677:15:0;57670:22;;51592:564;51648:14;51644:47;;51675:7;;51644:47;51707:17;51727:16;:9;51741:1;51727:16;:13;:16;:::i;:::-;51707:36;-1:-1:-1;51752:28:0;51783:24;:9;51707:36;51783:24;:13;:24;:::i;:::-;51838:11;;51752:55;;-1:-1:-1;51838:37:0;;51752:55;51838:37;:15;:37;:::i;:::-;51824:11;:51;51884:29;:52;;;51953:61;;;-1:-1:-1;;;51953:61:0;;-1:-1:-1;;;;;51968:23:0;51953:61;;;;;;;;;;;;;;:5;:14;;;;;;:61;;;;;;;;;;;;;;;-1:-1:-1;51953:14:0;:61;;;2:2:-1;;;;27:1;24;17:12;2:2;51953:61:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;51953:61:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;;52045:29:0;;52031:44;;:13;:44::i;:::-;52097:53;;;;;;;;;;;;;;52106:10;;52097:53;;;;;;;;51592:564;;;:::o;52242:460::-;52300:14;52317:46;52346:16;;52318:22;52331:8;;52318;:12;;:22;;;;:::i;52317:46::-;52300:63;;52372:24;52399:60;52410:48;52434:23;;52410:19;;:23;;:48;;;;:::i;:::-;52399:6;;:60;:10;:60;:::i;:::-;52372:87;;52487:60;52498:48;52522:23;;52498:19;;:23;;:48;;;;:::i;:::-;52487:6;;:60;:10;:60;:::i;:::-;52468:16;:79;52574:15;;:37;;52594:16;52574:37;:19;:37;:::i;:::-;52556:15;:55;52648:6;;-1:-1:-1;;52648:8:0;52639:18;;;;:8;:18;;;;;;:40;;52662:16;52639:40;:22;:40;:::i;:::-;52629:6;;;52620:16;;;;:8;:16;;;;;:59;;;;52688:8;;;;;;-1:-1:-1;;;52242:460:0:o;4538:130::-;4596:7;4623:37;4627:1;4630;4623:37;;;;;;;;;;;;;;;;;5239:7;5275:12;5267:6;5259:29;;;;-1:-1:-1;;;5259:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27:10:-1;;8:100;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;5259:29:0;;5310:1;5306;:5;;;;;;;5153:166;-1:-1:-1;;;;5153:166:0:o;24206:34949::-;;;;;;;;;;;29:2:-1;21:6;17:15;125:4;109:14;101:6;88:42;-1:-1;24206:34949:0;;;-1:-1:-1;;24206:34949:0:o
Swarm Source
ipfs://6c691727c49f8579fd730ffc5486b5e887bcfb9dfcd0883b58dfcf10c5611ab5
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.