ETH Price: $3,595.29 (+3.82%)
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Token Holdings

Transaction Hash
Method
Block
From
To
Withdraw Token201010772024-06-16 1:30:23202 days ago1718501423IN
0xfa84C21c...15e67a946
0 ETH0.000183392.2
Buy Token169459432023-03-31 8:17:11645 days ago1680250631IN
0xfa84C21c...15e67a946
0.011 ETH0.0005345120.39745802
Withdraw Token169173412023-03-27 7:49:35649 days ago1679903375IN
0xfa84C21c...15e67a946
0 ETH0.0014743517.68611658
Withdraw Token165877072023-02-09 0:46:23695 days ago1675903583IN
0xfa84C21c...15e67a946
0 ETH0.0024383729.25040783
Withdraw Token165870542023-02-08 22:35:11695 days ago1675895711IN
0xfa84C21c...15e67a946
0 ETH0.0023409328.08156537
Withdraw Token165868552023-02-08 21:55:23695 days ago1675893323IN
0xfa84C21c...15e67a946
0 ETH0.0029341835.19807687
Withdraw Token165853612023-02-08 16:50:59695 days ago1675875059IN
0xfa84C21c...15e67a946
0 ETH0.0044574853.47138462
Withdraw Token165842552023-02-08 13:07:47695 days ago1675861667IN
0xfa84C21c...15e67a946
0 ETH0.0020148224.16959759
Withdraw Token165838712023-02-08 11:49:35695 days ago1675856975IN
0xfa84C21c...15e67a946
0 ETH0.0018339622
Withdraw Token165834172023-02-08 10:18:47696 days ago1675851527IN
0xfa84C21c...15e67a946
0 ETH0.0019891723.86186371
Withdraw Token165831662023-02-08 9:28:23696 days ago1675848503IN
0xfa84C21c...15e67a946
0 ETH0.0020729524.86689434
Withdraw Token165831602023-02-08 9:27:11696 days ago1675848431IN
0xfa84C21c...15e67a946
0 ETH0.0019795623.74659526
Withdraw Token165828882023-02-08 8:32:11696 days ago1675845131IN
0xfa84C21c...15e67a946
0 ETH0.0019978823.96636588
Withdraw Token165826052023-02-08 7:35:11696 days ago1675841711IN
0xfa84C21c...15e67a946
0 ETH0.0019156722.9802371
Withdraw Token165819242023-02-08 5:18:23696 days ago1675833503IN
0xfa84C21c...15e67a946
0 ETH0.0024653529.57406824
Withdraw Token165817812023-02-08 4:49:35696 days ago1675831775IN
0xfa84C21c...15e67a946
0 ETH0.0022148626.56922674
Withdraw Token165813082023-02-08 3:14:35696 days ago1675826075IN
0xfa84C21c...15e67a946
0 ETH0.0026159631.38080184
Withdraw Token165812782023-02-08 3:08:35696 days ago1675825715IN
0xfa84C21c...15e67a946
0 ETH0.0013080730.5895607
Withdraw Token165812782023-02-08 3:08:35696 days ago1675825715IN
0xfa84C21c...15e67a946
0 ETH0.0025530.5895607
Withdraw Token165804512023-02-08 0:22:47696 days ago1675815767IN
0xfa84C21c...15e67a946
0 ETH0.0028089133.69541473
Withdraw Token165803342023-02-07 23:59:23696 days ago1675814363IN
0xfa84C21c...15e67a946
0 ETH0.0031386137.65042983
Withdraw Token165802732023-02-07 23:47:11696 days ago1675813631IN
0xfa84C21c...15e67a946
0 ETH0.0029898135.86548596
Withdraw Token165802592023-02-07 23:44:23696 days ago1675813463IN
0xfa84C21c...15e67a946
0 ETH0.0031971738.35295486
Withdraw Token165794132023-02-07 20:53:47696 days ago1675803227IN
0xfa84C21c...15e67a946
0 ETH0.0039940147.91170267
Withdraw Token165788712023-02-07 19:05:11696 days ago1675796711IN
0xfa84C21c...15e67a946
0 ETH0.0018699343.72887906
View all transactions

Latest 25 internal transactions (View All)

Advanced mode:
Parent Transaction Hash Block
From
To
164933352023-01-26 20:19:23708 days ago1674764363
0xfa84C21c...15e67a946
35.66498683 ETH
164795932023-01-24 22:16:11710 days ago1674598571
0xfa84C21c...15e67a946
50.84462978 ETH
164349492023-01-18 16:41:11716 days ago1674060071
0xfa84C21c...15e67a946
144.95186185 ETH
162199522022-12-19 16:31:23746 days ago1671467483
0xfa84C21c...15e67a946
131.56779284 ETH
160483252022-11-25 16:55:59770 days ago1669395359
0xfa84C21c...15e67a946
38.778359 ETH
160156472022-11-21 3:16:59775 days ago1669000619
0xfa84C21c...15e67a946
11.6136 ETH
159957102022-11-18 8:29:59778 days ago1668760199
0xfa84C21c...15e67a946
29.63447452 ETH
159647442022-11-14 0:38:47782 days ago1668386327
0xfa84C21c...15e67a946
25.37071324 ETH
159436622022-11-11 2:01:23785 days ago1668132083
0xfa84C21c...15e67a946
6.43739 ETH
159270782022-11-08 18:22:23787 days ago1667931743
0xfa84C21c...15e67a946
49.68682402 ETH
158795922022-11-02 3:16:47794 days ago1667359007
0xfa84C21c...15e67a946
44.74961214 ETH
158438492022-10-28 3:22:59799 days ago1666927379
0xfa84C21c...15e67a946
61.33053836 ETH
157987702022-10-21 20:08:47805 days ago1666382927
0xfa84C21c...15e67a946
13.4252 ETH
157934012022-10-21 2:09:35806 days ago1666318175
0xfa84C21c...15e67a946
39.47694299 ETH
157792632022-10-19 2:47:23808 days ago1666147643
0xfa84C21c...15e67a946
9.6528 ETH
157696542022-10-17 18:36:23809 days ago1666031783
0xfa84C21c...15e67a946
3.06 ETH
157690302022-10-17 16:31:11809 days ago1666024271
0xfa84C21c...15e67a946
0.832 ETH
157671192022-10-17 10:05:59810 days ago1666001159
0xfa84C21c...15e67a946
9.60205 ETH
157638892022-10-16 23:15:11810 days ago1665962111
0xfa84C21c...15e67a946
4.5235 ETH
157593512022-10-16 8:01:59811 days ago1665907319
0xfa84C21c...15e67a946
14.82 ETH
157591202022-10-16 7:15:23811 days ago1665904523
0xfa84C21c...15e67a946
18.7 ETH
157590542022-10-16 7:02:11811 days ago1665903731
0xfa84C21c...15e67a946
23.51729 ETH
157545912022-10-15 16:03:59811 days ago1665849839
0xfa84C21c...15e67a946
6.836684 ETH
157434852022-10-14 2:52:23813 days ago1665715943
0xfa84C21c...15e67a946
2.33542772 ETH
157013442022-10-08 5:41:23819 days ago1665207683
0xfa84C21c...15e67a946
0.0756 ETH
View All Internal Transactions
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
ToonPresale

Compiler Version
v0.8.0+commit.c7dfd78e

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-10-05
*/

/*##################     #############     #############     ###       ####
  ##################     ##         ##     ##         ##     ## ##      ##
	     ###             ##         ##     ##         ##     ##  ##     ##
	     ###             ##  #####  ##     ##  #####  ##     ##   ##    ##
	     ###             ##  #   #  ##     ##  #   #  ##     ##    ##   ##
	     ###             ##  #####  ##     ##  #####  ##     ##     ##  ##
	     ###             ##         ##     ##         ##     ##      ## ##
	     ###             ##         ##     ##         ##     ##       # ##
	     ###             #############     #############    ####       ###
		             
   ##########   ####   ###    ##       ##       ###    ##  #######  #######
	##           ##    ## #   ##      ## #      ## #   ##  ##       ##
	######       ##    ##  #  ##     ##   #     ##  #  ##  ##       #####
	##           ##    ##   # ##    ## # # #    ##   # ##  ##       ##
	##           ##    ##    ###   ##       #   ##    ###  ##       ##
	##          ####   ##     ##  ##         #  ##     ##  #######  #######
	*/

// SPDX-License-Identifier: MIT    

pragma solidity ^0.8.0;

library SafeMath {

    function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            uint256 c = a + b;
            if (c < a) return (false, 0);
            return (true, c);
        }
    }

    function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b > a) return (false, 0);
            return (true, a - b);
        }
    }

    function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (a == 0) return (true, 0);
            uint256 c = a * b;
            if (c / a != b) return (false, 0);
            return (true, c);
        }
    }

    function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a / b);
        }
    }

    function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a % b);
        }
    }

    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        return a + b;
    }

    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        return a - b;
    }

    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        return a * b;
    }

    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return a / b;
    }

    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        return a % b;
    }

    function sub(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b <= a, errorMessage);
            return a - b;
        }
    }

    function div(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b > 0, errorMessage);
            return a / b;
        }
    }

    function mod(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b > 0, errorMessage);
            return a % b;
        }
    }
}

pragma solidity ^0.8.0;

interface IERC20 {

    function totalSupply() external view returns (uint256);

    function balanceOf(address account) external view returns (uint256);

    function transfer(address recipient, uint256 amount) external returns (bool);

    function allowance(address owner, address spender) external view returns (uint256);

    function approve(address spender, uint256 amount) external returns (bool);

    function transferFrom(
        address sender,
        address recipient,
        uint256 amount
    ) external returns (bool);

    event Transfer(address indexed from, address indexed to, uint256 value);

    event Approval(address indexed owner, address indexed spender, uint256 value);
}

pragma solidity ^0.8.0;

abstract contract Context {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }

    function _msgData() internal view virtual returns (bytes calldata) {
        return msg.data;
    }
}

pragma solidity ^0.8.0;

abstract contract Ownable is Context {
    address private _owner;

    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);

    constructor() {
        _transferOwnership(_msgSender());
    }

    function owner() public view virtual returns (address) {
        return _owner;
    }

    modifier onlyOwner() {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
        _;
    }

    function renounceOwnership() public virtual onlyOwner {
        _transferOwnership(address(0));
    }

    function transferOwnership(address newOwner) public virtual onlyOwner {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        _transferOwnership(newOwner);
    }

    function _transferOwnership(address newOwner) internal virtual {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

pragma solidity ^0.8.0;



contract OwnerWithdrawable is Ownable {
    using SafeMath for uint256;

    receive() external payable {}

    fallback() external payable {}

    function withdraw(address token, uint256 amt) public onlyOwner {
        IERC20(token).transfer(msg.sender, amt);
    }

    function withdrawAll(address token) public onlyOwner {
        uint256 amt = IERC20(token).balanceOf(address(this));
        withdraw(token, amt);
    }

    function withdrawCurrency(uint256 amt) public onlyOwner {
        payable(msg.sender).transfer(amt);
    }
}

pragma solidity ^0.8.0;

library Address {

    function isContract(address account) internal view returns (bool) {

        uint256 size;
        assembly {
            size := extcodesize(account)
        }
        return size > 0;
    }

    function sendValue(address payable recipient, uint256 amount) internal {
        require(address(this).balance >= amount, "Address: insufficient balance");

        (bool success, ) = recipient.call{value: amount}("");
        require(success, "Address: unable to send value, recipient may have reverted");
    }

    function functionCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionCall(target, data, "Address: low-level call failed");
    }

    function functionCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        return functionCallWithValue(target, data, 0, errorMessage);
    }

    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value
    ) internal returns (bytes memory) {
        return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
    }

    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(address(this).balance >= value, "Address: insufficient balance for call");
        require(isContract(target), "Address: call to non-contract");

        (bool success, bytes memory returndata) = target.call{value: value}(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
        return functionStaticCall(target, data, "Address: low-level static call failed");
    }

    function functionStaticCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal view returns (bytes memory) {
        require(isContract(target), "Address: static call to non-contract");

        (bool success, bytes memory returndata) = target.staticcall(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionDelegateCall(target, data, "Address: low-level delegate call failed");
    }

    function functionDelegateCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(isContract(target), "Address: delegate call to non-contract");

        (bool success, bytes memory returndata) = target.delegatecall(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    function verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal pure returns (bytes memory) {
        if (success) {
            return returndata;
        } else {
            if (returndata.length > 0) {
                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}

pragma solidity ^0.8.0;

library SafeERC20 {
    using Address for address;

    function safeTransfer(
        IERC20 token,
        address to,
        uint256 value
    ) internal {
        _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));
    }

    function safeTransferFrom(
        IERC20 token,
        address from,
        address to,
        uint256 value
    ) internal {
        _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));
    }

    function safeApprove(
        IERC20 token,
        address spender,
        uint256 value
    ) internal {

        require(
            (value == 0) || (token.allowance(address(this), spender) == 0),
            "SafeERC20: approve from non-zero to non-zero allowance"
        );
        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));
    }

    function safeIncreaseAllowance(
        IERC20 token,
        address spender,
        uint256 value
    ) internal {
        uint256 newAllowance = token.allowance(address(this), spender) + value;
        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
    }

    function safeDecreaseAllowance(
        IERC20 token,
        address spender,
        uint256 value
    ) internal {
        unchecked {
            uint256 oldAllowance = token.allowance(address(this), spender);
            require(oldAllowance >= value, "SafeERC20: decreased allowance below zero");
            uint256 newAllowance = oldAllowance - value;
            _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
        }
    }

    function _callOptionalReturn(IERC20 token, bytes memory data) private {

        bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed");
        if (returndata.length > 0) {
            require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed");
        }
    }
}

pragma solidity ^0.8.0;

interface IERC20Metadata is IERC20 {

    function name() external view returns (string memory);

    function symbol() external view returns (string memory);

    function decimals() external view returns (uint8);
}

pragma solidity ^0.8.0;

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 IRouter 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;
}

pragma solidity ^0.8.0;

contract ToonPresale is OwnerWithdrawable {
    using SafeMath for uint256;
    using SafeERC20 for IERC20;
    using SafeERC20 for IERC20Metadata;

    IRouter public router;

    uint256 public rate;

    address public saleToken;
    uint public saleTokenDec;

    uint256 public totalTokensforSale;

    mapping(address => bool) public tokenWL;

    mapping(address => uint256) public tokenPrices;

    uint256 public preSaleStartTime;

    uint256 public preSaleEndTime;

    uint256 public lockingPeriod1;

    uint256 public lockingPeriod2;

    uint256 public percentTokens1;

    address[] public buyers;

    mapping(address => BuyerTokenDetails) public buyersAmount;

    uint256 public totalTokensSold;

    struct BuyerTokenDetails {
        uint amount;
        bool lockingPeriod1Claimed;
    }

    constructor() {

    }

    modifier saleStarted(){
        if(preSaleStartTime != 0){
            require(block.timestamp < preSaleStartTime);
        }
        _;
    }

    modifier saleDuration(){
        require(block.timestamp > preSaleStartTime);
        require(block.timestamp < preSaleEndTime);
        _;
    }

    modifier saleValid(
        uint256 _preSaleStartTime, uint256 _preSaleEndTime,
        uint256 _lockingPeriod1, uint256 _lockingPeriod2
    ){
        require(block.timestamp < _preSaleStartTime);
        require(_preSaleStartTime < _preSaleEndTime);
        require(_preSaleEndTime < _lockingPeriod1);
        require(_lockingPeriod1 < _lockingPeriod2);
        _;
    }

    function setSaleTokenParams(
        address _saleToken, uint256 _totalTokensforSale, uint256 _rate
    )external onlyOwner saleStarted{
        require(_rate != 0);
        rate = _rate;
        saleToken = _saleToken;
        saleTokenDec = IERC20Metadata(saleToken).decimals();
        totalTokensforSale = _totalTokensforSale;
        IERC20(saleToken).safeTransferFrom(msg.sender, address(this), totalTokensforSale);
    }

    function setSalePeriodParams(
        uint256 _preSaleStartTime,
        uint256 _preSaleEndTime,
        uint256 _lockingPeriod1,
        uint256 _lockingPeriod2,
        uint256 _percentTokens1
    )external onlyOwner saleStarted saleValid(_preSaleStartTime, _preSaleEndTime, _lockingPeriod1, _lockingPeriod2){

        preSaleStartTime = _preSaleStartTime;
        preSaleEndTime = _preSaleEndTime;
        lockingPeriod1 = _lockingPeriod1;
        lockingPeriod2 = _lockingPeriod2;
        percentTokens1 = _percentTokens1;

    }

    function addWhiteListedToken(
        address[] memory _tokens,
        uint256[] memory _prices
    ) external onlyOwner saleStarted{
        require(
            _tokens.length == _prices.length,
            "Presale: tokens & prices arrays length mismatch"
            );

        for (uint256 i = 0; i < _tokens.length; i++) {
            require(_prices[i] != 0);
            tokenWL[_tokens[i]] = true;
            tokenPrices[_tokens[i]] = _prices[i];
        }
    }

    function updateTokenRate(
        address[] memory _tokens,
        uint256[] memory _prices,
        uint256 _rate
    )external onlyOwner{
        require(
            _tokens.length == _prices.length,
            "Presale: tokens & prices arrays length mismatch"

        );

        if(_rate != 0){
            rate = _rate;
        }

        for(uint256 i = 0; i < _tokens.length; i+=1){
            require(tokenWL[_tokens[i]] == true);
            require(_prices[i] != 0);
            tokenPrices[_tokens[i]] = _prices[i];
        }
    }

    function stopSale() external onlyOwner {
        require(block.timestamp > preSaleStartTime);
        if(block.timestamp < preSaleEndTime){
            preSaleEndTime = block.timestamp;
        }
    }

    function getTokenAmount(address token, uint256 amount)
        public
        view
        returns (uint256)
    {
        uint256 amtOut;
        if(token != address(0)){
            require(tokenWL[token] == true);
            uint256 price = tokenPrices[token];
            amtOut = amount.mul(10**saleTokenDec).div(price);
        }
        else{
            amtOut = amount.mul(10**saleTokenDec).div(rate);
        }
        return amtOut;
    }

    function buyToken(address _token, uint256 _amount) external payable saleDuration{

        uint256 saleTokenAmt;
        if(_token != address(0)){
            require(_amount > 0);
            require(tokenWL[_token] == true);

            saleTokenAmt = getTokenAmount(_token, _amount);
            require((totalTokensSold + saleTokenAmt) < totalTokensforSale);
            IERC20(_token).safeTransferFrom(msg.sender, address(this), _amount);
        }
        else{
            saleTokenAmt = getTokenAmount(address(0), msg.value);
            require((totalTokensSold + saleTokenAmt) < totalTokensforSale);
        }
        totalTokensSold += saleTokenAmt;
        buyersAmount[msg.sender].amount += saleTokenAmt;
    }

    function withdrawToken()external {
        uint256 tokensforWithdraw;
        if(block.timestamp < lockingPeriod2){
            require(!buyersAmount[msg.sender].lockingPeriod1Claimed);
            require(block.timestamp > lockingPeriod1);
            tokensforWithdraw = buyersAmount[msg.sender].amount * percentTokens1 / 100;
            buyersAmount[msg.sender].lockingPeriod1Claimed = true;
        }
        else
        {
            tokensforWithdraw = buyersAmount[msg.sender].amount;
            buyersAmount[msg.sender].lockingPeriod1Claimed = true;
        }
        buyersAmount[msg.sender].amount -= tokensforWithdraw;
        IERC20(saleToken).safeTransfer(msg.sender, tokensforWithdraw);
    }

    function setUniSwapRouterAddress(address _router) external onlyOwner{
        require(_router != address(0));
        router = IRouter(_router);
    }

    function addLiquidity(uint256 amountSaleToken) external payable onlyOwner returns (uint256, uint256, uint256){
        IERC20(saleToken).safeTransferFrom(msg.sender, address(this), amountSaleToken);

        IERC20(saleToken).approve(address(router), amountSaleToken);

        (uint256 amountA , uint256 amountB ,uint256 amounts) = router.addLiquidityETH{ value: msg.value }(saleToken, amountSaleToken, 0, 0, msg.sender, 2 * block.timestamp);
        return(amountA, amountB, amounts);
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"stateMutability":"payable","type":"fallback"},{"inputs":[{"internalType":"uint256","name":"amountSaleToken","type":"uint256"}],"name":"addLiquidity","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_tokens","type":"address[]"},{"internalType":"uint256[]","name":"_prices","type":"uint256[]"}],"name":"addWhiteListedToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"buyToken","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"buyers","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"buyersAmount","outputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bool","name":"lockingPeriod1Claimed","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"getTokenAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lockingPeriod1","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lockingPeriod2","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"percentTokens1","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"preSaleEndTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"preSaleStartTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"router","outputs":[{"internalType":"contract IRouter","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"saleToken","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"saleTokenDec","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_preSaleStartTime","type":"uint256"},{"internalType":"uint256","name":"_preSaleEndTime","type":"uint256"},{"internalType":"uint256","name":"_lockingPeriod1","type":"uint256"},{"internalType":"uint256","name":"_lockingPeriod2","type":"uint256"},{"internalType":"uint256","name":"_percentTokens1","type":"uint256"}],"name":"setSalePeriodParams","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_saleToken","type":"address"},{"internalType":"uint256","name":"_totalTokensforSale","type":"uint256"},{"internalType":"uint256","name":"_rate","type":"uint256"}],"name":"setSaleTokenParams","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_router","type":"address"}],"name":"setUniSwapRouterAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"stopSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"tokenPrices","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"tokenWL","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalTokensSold","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalTokensforSale","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_tokens","type":"address[]"},{"internalType":"uint256[]","name":"_prices","type":"uint256[]"},{"internalType":"uint256","name":"_rate","type":"uint256"}],"name":"updateTokenRate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amt","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"withdrawAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amt","type":"uint256"}],"name":"withdrawCurrency","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

60806040523480156200001157600080fd5b5062000032620000266200003860201b60201c565b6200004060201b60201c565b62000104565b600033905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6132bf80620001146000396000f3fe6080604052600436106101dc5760003560e01c80638da5cb5b11610102578063e36b0b3711610095578063f3fef3a311610064578063f3fef3a314610677578063f6f89c63146106a0578063f887ea40146106cb578063fa09e630146106f6576101e3565b8063e36b0b37146105cf578063e985e367146105e6578063f2aa821814610611578063f2fde38b1461064e576101e3565b8063b765ef59116100d1578063b765ef591461053b578063ca628c7814610564578063cce29ea71461057b578063d99a170f146105a6576101e3565b80638da5cb5b146104915780639238c722146104bc578063a78cebc3146104e7578063ace1741c14610510576101e3565b80633c00a36c1161017a57806368f8fc101161014957806368f8fc10146103f65780636bcedf9c14610412578063715018a61461043d5780638ce0b9d214610454576101e3565b80633c00a36c1461033257806351c6590a1461035b57806354a9f1021461038d57806363b20117146103cb576101e3565b8063204120bc116101b6578063204120bc146102765780632c4e722e146102b35780633115329e146102de5780633a137ba814610307576101e3565b806306d65af3146101e55780630c1453f114610210578063115ece4c14610239576101e3565b366101e357005b005b3480156101f157600080fd5b506101fa61071f565b6040516102079190612cbf565b60405180910390f35b34801561021c57600080fd5b5061023760048036038101906102329190612543565b610725565b005b34801561024557600080fd5b50610260600480360381019061025b9190612507565b610916565b60405161026d9190612cbf565b60405180910390f35b34801561028257600080fd5b5061029d600480360381019061029891906124de565b610a6b565b6040516102aa9190612cbf565b60405180910390f35b3480156102bf57600080fd5b506102c8610a83565b6040516102d59190612cbf565b60405180910390f35b3480156102ea57600080fd5b50610305600480360381019061030091906125fe565b610a89565b005b34801561031357600080fd5b5061031c610d2e565b6040516103299190612cbf565b60405180910390f35b34801561033e57600080fd5b50610359600480360381019061035491906126a6565b610d34565b005b610375600480360381019061037091906126a6565b610dfa565b60405161038493929190612d03565b60405180910390f35b34801561039957600080fd5b506103b460048036038101906103af91906124de565b6110a1565b6040516103c2929190612cda565b60405180910390f35b3480156103d757600080fd5b506103e06110d2565b6040516103ed9190612cbf565b60405180910390f35b610410600480360381019061040b9190612507565b6110d8565b005b34801561041e57600080fd5b5061042761128c565b6040516104349190612cbf565b60405180910390f35b34801561044957600080fd5b50610452611292565b005b34801561046057600080fd5b5061047b600480360381019061047691906124de565b61131a565b6040516104889190612ba7565b60405180910390f35b34801561049d57600080fd5b506104a661133a565b6040516104b39190612acb565b60405180910390f35b3480156104c857600080fd5b506104d1611363565b6040516104de9190612cbf565b60405180910390f35b3480156104f357600080fd5b5061050e600480360381019061050991906124de565b611369565b005b34801561051c57600080fd5b50610525611463565b6040516105329190612cbf565b60405180910390f35b34801561054757600080fd5b50610562600480360381019061055d9190612592565b611469565b005b34801561057057600080fd5b50610579611710565b005b34801561058757600080fd5b5061059061198c565b60405161059d9190612cbf565b60405180910390f35b3480156105b257600080fd5b506105cd60048036038101906105c89190612747565b611992565b005b3480156105db57600080fd5b506105e4611a89565b005b3480156105f257600080fd5b506105fb611b27565b6040516106089190612acb565b60405180910390f35b34801561061d57600080fd5b50610638600480360381019061063391906126a6565b611b4d565b6040516106459190612acb565b60405180910390f35b34801561065a57600080fd5b50610675600480360381019061067091906124de565b611b8c565b005b34801561068357600080fd5b5061069e60048036038101906106999190612507565b611c84565b005b3480156106ac57600080fd5b506106b5611d92565b6040516106c29190612cbf565b60405180910390f35b3480156106d757600080fd5b506106e0611d98565b6040516106ed9190612bc2565b60405180910390f35b34801561070257600080fd5b5061071d600480360381019061071891906124de565b611dbe565b005b60085481565b61072d611ed5565b73ffffffffffffffffffffffffffffffffffffffff1661074b61133a565b73ffffffffffffffffffffffffffffffffffffffff16146107a1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161079890612c5f565b60405180910390fd5b6000600854146107ba5760085442106107b957600080fd5b5b60008114156107c857600080fd5b8060028190555082600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b15801561087857600080fd5b505afa15801561088c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108b091906127be565b60ff16600481905550816005819055506109113330600554600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16611edd909392919063ffffffff16565b505050565b600080600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614610a295760011515600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161515146109aa57600080fd5b6000600760008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050610a2181610a13600454600a610a049190612ecf565b87611f6690919063ffffffff16565b611f7c90919063ffffffff16565b915050610a61565b610a5e600254610a50600454600a610a419190612ecf565b86611f6690919063ffffffff16565b611f7c90919063ffffffff16565b90505b8091505092915050565b60076020528060005260406000206000915090505481565b60025481565b610a91611ed5565b73ffffffffffffffffffffffffffffffffffffffff16610aaf61133a565b73ffffffffffffffffffffffffffffffffffffffff1614610b05576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610afc90612c5f565b60405180910390fd5b8151835114610b49576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b4090612c3f565b60405180910390fd5b60008114610b5957806002819055505b60005b8351811015610d28576001151560066000868481518110610ba6577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16151514610c0257600080fd5b6000838281518110610c3d577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101511415610c5057600080fd5b828181518110610c89577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015160076000868481518110610cce577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600181610d219190612df5565b9050610b5c565b50505050565b600b5481565b610d3c611ed5565b73ffffffffffffffffffffffffffffffffffffffff16610d5a61133a565b73ffffffffffffffffffffffffffffffffffffffff1614610db0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610da790612c5f565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015610df6573d6000803e3d6000fd5b5050565b6000806000610e07611ed5565b73ffffffffffffffffffffffffffffffffffffffff16610e2561133a565b73ffffffffffffffffffffffffffffffffffffffff1614610e7b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e7290612c5f565b60405180910390fd5b610eca333086600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16611edd909392919063ffffffff16565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663095ea7b3600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16866040518363ffffffff1660e01b8152600401610f49929190612b1d565b602060405180830381600087803b158015610f6357600080fd5b505af1158015610f77573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f9b919061267d565b506000806000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663f305d71934600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168a600080334260026110159190612fed565b6040518863ffffffff1660e01b815260040161103696959493929190612b46565b6060604051808303818588803b15801561104f57600080fd5b505af1158015611063573d6000803e3d6000fd5b50505050506040513d601f19601f8201168201806040525081019061108891906126f8565b9250925092508282829550955095505050509193909250565b600e6020528060005260406000206000915090508060000154908060010160009054906101000a900460ff16905082565b600f5481565b60085442116110e657600080fd5b60095442106110f457600080fd5b60008073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146111ec576000821161113657600080fd5b60011515600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615151461119357600080fd5b61119d8383610916565b905060055481600f546111b09190612df5565b106111ba57600080fd5b6111e73330848673ffffffffffffffffffffffffffffffffffffffff16611edd909392919063ffffffff16565b611215565b6111f7600034610916565b905060055481600f5461120a9190612df5565b1061121457600080fd5b5b80600f60008282546112279190612df5565b9250508190555080600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282546112809190612df5565b92505081905550505050565b60055481565b61129a611ed5565b73ffffffffffffffffffffffffffffffffffffffff166112b861133a565b73ffffffffffffffffffffffffffffffffffffffff161461130e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161130590612c5f565b60405180910390fd5b6113186000611f92565b565b60066020528060005260406000206000915054906101000a900460ff1681565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600c5481565b611371611ed5565b73ffffffffffffffffffffffffffffffffffffffff1661138f61133a565b73ffffffffffffffffffffffffffffffffffffffff16146113e5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113dc90612c5f565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561141f57600080fd5b80600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60045481565b611471611ed5565b73ffffffffffffffffffffffffffffffffffffffff1661148f61133a565b73ffffffffffffffffffffffffffffffffffffffff16146114e5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114dc90612c5f565b60405180910390fd5b6000600854146114fe5760085442106114fd57600080fd5b5b8051825114611542576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161153990612c3f565b60405180910390fd5b60005b825181101561170b576000828281518110611589577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151141561159c57600080fd5b6001600660008584815181106115db577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555081818151811061166d577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151600760008584815181106116b2577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550808061170390613139565b915050611545565b505050565b6000600b5442101561184257600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160009054906101000a900460ff161561177657600080fd5b600a54421161178457600080fd5b6064600c54600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001546117d69190612fed565b6117e09190612e4b565b90506001600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160006101000a81548160ff0219169083151502179055506118e3565b600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000015490506001600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160006101000a81548160ff0219169083151502179055505b80600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282546119359190613047565b925050819055506119893382600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166120569092919063ffffffff16565b50565b60095481565b61199a611ed5565b73ffffffffffffffffffffffffffffffffffffffff166119b861133a565b73ffffffffffffffffffffffffffffffffffffffff1614611a0e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a0590612c5f565b60405180910390fd5b600060085414611a27576008544210611a2657600080fd5b5b84848484834210611a3757600080fd5b828410611a4357600080fd5b818310611a4f57600080fd5b808210611a5b57600080fd5b886008819055508760098190555086600a8190555085600b8190555084600c81905550505050505050505050565b611a91611ed5565b73ffffffffffffffffffffffffffffffffffffffff16611aaf61133a565b73ffffffffffffffffffffffffffffffffffffffff1614611b05576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611afc90612c5f565b60405180910390fd5b6008544211611b1357600080fd5b600954421015611b2557426009819055505b565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600d8181548110611b5d57600080fd5b906000526020600020016000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b611b94611ed5565b73ffffffffffffffffffffffffffffffffffffffff16611bb261133a565b73ffffffffffffffffffffffffffffffffffffffff1614611c08576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bff90612c5f565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611c78576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c6f90612bff565b60405180910390fd5b611c8181611f92565b50565b611c8c611ed5565b73ffffffffffffffffffffffffffffffffffffffff16611caa61133a565b73ffffffffffffffffffffffffffffffffffffffff1614611d00576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cf790612c5f565b60405180910390fd5b8173ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33836040518363ffffffff1660e01b8152600401611d3b929190612b1d565b602060405180830381600087803b158015611d5557600080fd5b505af1158015611d69573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d8d919061267d565b505050565b600a5481565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b611dc6611ed5565b73ffffffffffffffffffffffffffffffffffffffff16611de461133a565b73ffffffffffffffffffffffffffffffffffffffff1614611e3a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e3190612c5f565b60405180910390fd5b60008173ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401611e759190612acb565b60206040518083038186803b158015611e8d57600080fd5b505afa158015611ea1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ec591906126cf565b9050611ed18282611c84565b5050565b600033905090565b611f60846323b872dd60e01b858585604051602401611efe93929190612ae6565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506120dc565b50505050565b60008183611f749190612fed565b905092915050565b60008183611f8a9190612e4b565b905092915050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6120d78363a9059cbb60e01b8484604051602401612075929190612b1d565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506120dc565b505050565b600061213e826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166121a39092919063ffffffff16565b905060008151111561219e578080602001905181019061215e919061267d565b61219d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161219490612c9f565b60405180910390fd5b5b505050565b60606121b284846000856121bb565b90509392505050565b606082471015612200576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121f790612c1f565b60405180910390fd5b612209856122cf565b612248576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161223f90612c7f565b60405180910390fd5b6000808673ffffffffffffffffffffffffffffffffffffffff1685876040516122719190612ab4565b60006040518083038185875af1925050503d80600081146122ae576040519150601f19603f3d011682016040523d82523d6000602084013e6122b3565b606091505b50915091506122c38282866122e2565b92505050949350505050565b600080823b905060008111915050919050565b606083156122f257829050612342565b6000835111156123055782518084602001fd5b816040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123399190612bdd565b60405180910390fd5b9392505050565b600061235c61235784612d6b565b612d3a565b9050808382526020820190508285602086028201111561237b57600080fd5b60005b858110156123ab57816123918882612421565b84526020840193506020830192505060018101905061237e565b5050509392505050565b60006123c86123c384612d97565b612d3a565b905080838252602082019050828560208602820111156123e757600080fd5b60005b8581101561241757816123fd888261249f565b8452602084019350602083019250506001810190506123ea565b5050509392505050565b6000813590506124308161322d565b92915050565b600082601f83011261244757600080fd5b8135612457848260208601612349565b91505092915050565b600082601f83011261247157600080fd5b81356124818482602086016123b5565b91505092915050565b60008151905061249981613244565b92915050565b6000813590506124ae8161325b565b92915050565b6000815190506124c38161325b565b92915050565b6000815190506124d881613272565b92915050565b6000602082840312156124f057600080fd5b60006124fe84828501612421565b91505092915050565b6000806040838503121561251a57600080fd5b600061252885828601612421565b92505060206125398582860161249f565b9150509250929050565b60008060006060848603121561255857600080fd5b600061256686828701612421565b93505060206125778682870161249f565b92505060406125888682870161249f565b9150509250925092565b600080604083850312156125a557600080fd5b600083013567ffffffffffffffff8111156125bf57600080fd5b6125cb85828601612436565b925050602083013567ffffffffffffffff8111156125e857600080fd5b6125f485828601612460565b9150509250929050565b60008060006060848603121561261357600080fd5b600084013567ffffffffffffffff81111561262d57600080fd5b61263986828701612436565b935050602084013567ffffffffffffffff81111561265657600080fd5b61266286828701612460565b92505060406126738682870161249f565b9150509250925092565b60006020828403121561268f57600080fd5b600061269d8482850161248a565b91505092915050565b6000602082840312156126b857600080fd5b60006126c68482850161249f565b91505092915050565b6000602082840312156126e157600080fd5b60006126ef848285016124b4565b91505092915050565b60008060006060848603121561270d57600080fd5b600061271b868287016124b4565b935050602061272c868287016124b4565b925050604061273d868287016124b4565b9150509250925092565b600080600080600060a0868803121561275f57600080fd5b600061276d8882890161249f565b955050602061277e8882890161249f565b945050604061278f8882890161249f565b93505060606127a08882890161249f565b92505060806127b18882890161249f565b9150509295509295909350565b6000602082840312156127d057600080fd5b60006127de848285016124c9565b91505092915050565b6127f08161307b565b82525050565b6127ff8161308d565b82525050565b600061281082612dc3565b61281a8185612dd9565b935061282a818560208601613106565b80840191505092915050565b61283f816130d0565b82525050565b61284e816130f4565b82525050565b600061285f82612dce565b6128698185612de4565b9350612879818560208601613106565b6128828161320f565b840191505092915050565b600061289a602683612de4565b91507f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008301527f64647265737300000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000612900602683612de4565b91507f416464726573733a20696e73756666696369656e742062616c616e636520666f60008301527f722063616c6c00000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000612966602f83612de4565b91507f50726573616c653a20746f6b656e73202620707269636573206172726179732060008301527f6c656e677468206d69736d6174636800000000000000000000000000000000006020830152604082019050919050565b60006129cc602083612de4565b91507f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726000830152602082019050919050565b6000612a0c601d83612de4565b91507f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006000830152602082019050919050565b6000612a4c602a83612de4565b91507f5361666545524332303a204552433230206f7065726174696f6e20646964206e60008301527f6f742073756363656564000000000000000000000000000000000000000000006020830152604082019050919050565b612aae816130b9565b82525050565b6000612ac08284612805565b915081905092915050565b6000602082019050612ae060008301846127e7565b92915050565b6000606082019050612afb60008301866127e7565b612b0860208301856127e7565b612b156040830184612aa5565b949350505050565b6000604082019050612b3260008301856127e7565b612b3f6020830184612aa5565b9392505050565b600060c082019050612b5b60008301896127e7565b612b686020830188612aa5565b612b756040830187612845565b612b826060830186612845565b612b8f60808301856127e7565b612b9c60a0830184612aa5565b979650505050505050565b6000602082019050612bbc60008301846127f6565b92915050565b6000602082019050612bd76000830184612836565b92915050565b60006020820190508181036000830152612bf78184612854565b905092915050565b60006020820190508181036000830152612c188161288d565b9050919050565b60006020820190508181036000830152612c38816128f3565b9050919050565b60006020820190508181036000830152612c5881612959565b9050919050565b60006020820190508181036000830152612c78816129bf565b9050919050565b60006020820190508181036000830152612c98816129ff565b9050919050565b60006020820190508181036000830152612cb881612a3f565b9050919050565b6000602082019050612cd46000830184612aa5565b92915050565b6000604082019050612cef6000830185612aa5565b612cfc60208301846127f6565b9392505050565b6000606082019050612d186000830186612aa5565b612d256020830185612aa5565b612d326040830184612aa5565b949350505050565b6000604051905081810181811067ffffffffffffffff82111715612d6157612d606131e0565b5b8060405250919050565b600067ffffffffffffffff821115612d8657612d856131e0565b5b602082029050602081019050919050565b600067ffffffffffffffff821115612db257612db16131e0565b5b602082029050602081019050919050565b600081519050919050565b600081519050919050565b600081905092915050565b600082825260208201905092915050565b6000612e00826130b9565b9150612e0b836130b9565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115612e4057612e3f613182565b5b828201905092915050565b6000612e56826130b9565b9150612e61836130b9565b925082612e7157612e706131b1565b5b828204905092915050565b6000808291508390505b6001851115612ec657808604811115612ea257612ea1613182565b5b6001851615612eb15780820291505b8081029050612ebf85613220565b9450612e86565b94509492505050565b6000612eda826130b9565b9150612ee5836130b9565b9250612f127fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8484612f1a565b905092915050565b600082612f2a5760019050612fe6565b81612f385760009050612fe6565b8160018114612f4e5760028114612f5857612f87565b6001915050612fe6565b60ff841115612f6a57612f69613182565b5b8360020a915084821115612f8157612f80613182565b5b50612fe6565b5060208310610133831016604e8410600b8410161715612fbc5782820a905083811115612fb757612fb6613182565b5b612fe6565b612fc98484846001612e7c565b92509050818404811115612fe057612fdf613182565b5b81810290505b9392505050565b6000612ff8826130b9565b9150613003836130b9565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561303c5761303b613182565b5b828202905092915050565b6000613052826130b9565b915061305d836130b9565b9250828210156130705761306f613182565b5b828203905092915050565b600061308682613099565b9050919050565b60008115159050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b60006130db826130e2565b9050919050565b60006130ed82613099565b9050919050565b60006130ff826130b9565b9050919050565b60005b83811015613124578082015181840152602081019050613109565b83811115613133576000848401525b50505050565b6000613144826130b9565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561317757613176613182565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b60008160011c9050919050565b6132368161307b565b811461324157600080fd5b50565b61324d8161308d565b811461325857600080fd5b50565b613264816130b9565b811461326f57600080fd5b50565b61327b816130c3565b811461328657600080fd5b5056fea2646970667358221220b797a93f7f3ed8be790155eb8ad390f2345c92c9e5cf78d27010b916d026156b64736f6c63430008000033

Deployed Bytecode

0x6080604052600436106101dc5760003560e01c80638da5cb5b11610102578063e36b0b3711610095578063f3fef3a311610064578063f3fef3a314610677578063f6f89c63146106a0578063f887ea40146106cb578063fa09e630146106f6576101e3565b8063e36b0b37146105cf578063e985e367146105e6578063f2aa821814610611578063f2fde38b1461064e576101e3565b8063b765ef59116100d1578063b765ef591461053b578063ca628c7814610564578063cce29ea71461057b578063d99a170f146105a6576101e3565b80638da5cb5b146104915780639238c722146104bc578063a78cebc3146104e7578063ace1741c14610510576101e3565b80633c00a36c1161017a57806368f8fc101161014957806368f8fc10146103f65780636bcedf9c14610412578063715018a61461043d5780638ce0b9d214610454576101e3565b80633c00a36c1461033257806351c6590a1461035b57806354a9f1021461038d57806363b20117146103cb576101e3565b8063204120bc116101b6578063204120bc146102765780632c4e722e146102b35780633115329e146102de5780633a137ba814610307576101e3565b806306d65af3146101e55780630c1453f114610210578063115ece4c14610239576101e3565b366101e357005b005b3480156101f157600080fd5b506101fa61071f565b6040516102079190612cbf565b60405180910390f35b34801561021c57600080fd5b5061023760048036038101906102329190612543565b610725565b005b34801561024557600080fd5b50610260600480360381019061025b9190612507565b610916565b60405161026d9190612cbf565b60405180910390f35b34801561028257600080fd5b5061029d600480360381019061029891906124de565b610a6b565b6040516102aa9190612cbf565b60405180910390f35b3480156102bf57600080fd5b506102c8610a83565b6040516102d59190612cbf565b60405180910390f35b3480156102ea57600080fd5b50610305600480360381019061030091906125fe565b610a89565b005b34801561031357600080fd5b5061031c610d2e565b6040516103299190612cbf565b60405180910390f35b34801561033e57600080fd5b50610359600480360381019061035491906126a6565b610d34565b005b610375600480360381019061037091906126a6565b610dfa565b60405161038493929190612d03565b60405180910390f35b34801561039957600080fd5b506103b460048036038101906103af91906124de565b6110a1565b6040516103c2929190612cda565b60405180910390f35b3480156103d757600080fd5b506103e06110d2565b6040516103ed9190612cbf565b60405180910390f35b610410600480360381019061040b9190612507565b6110d8565b005b34801561041e57600080fd5b5061042761128c565b6040516104349190612cbf565b60405180910390f35b34801561044957600080fd5b50610452611292565b005b34801561046057600080fd5b5061047b600480360381019061047691906124de565b61131a565b6040516104889190612ba7565b60405180910390f35b34801561049d57600080fd5b506104a661133a565b6040516104b39190612acb565b60405180910390f35b3480156104c857600080fd5b506104d1611363565b6040516104de9190612cbf565b60405180910390f35b3480156104f357600080fd5b5061050e600480360381019061050991906124de565b611369565b005b34801561051c57600080fd5b50610525611463565b6040516105329190612cbf565b60405180910390f35b34801561054757600080fd5b50610562600480360381019061055d9190612592565b611469565b005b34801561057057600080fd5b50610579611710565b005b34801561058757600080fd5b5061059061198c565b60405161059d9190612cbf565b60405180910390f35b3480156105b257600080fd5b506105cd60048036038101906105c89190612747565b611992565b005b3480156105db57600080fd5b506105e4611a89565b005b3480156105f257600080fd5b506105fb611b27565b6040516106089190612acb565b60405180910390f35b34801561061d57600080fd5b50610638600480360381019061063391906126a6565b611b4d565b6040516106459190612acb565b60405180910390f35b34801561065a57600080fd5b50610675600480360381019061067091906124de565b611b8c565b005b34801561068357600080fd5b5061069e60048036038101906106999190612507565b611c84565b005b3480156106ac57600080fd5b506106b5611d92565b6040516106c29190612cbf565b60405180910390f35b3480156106d757600080fd5b506106e0611d98565b6040516106ed9190612bc2565b60405180910390f35b34801561070257600080fd5b5061071d600480360381019061071891906124de565b611dbe565b005b60085481565b61072d611ed5565b73ffffffffffffffffffffffffffffffffffffffff1661074b61133a565b73ffffffffffffffffffffffffffffffffffffffff16146107a1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161079890612c5f565b60405180910390fd5b6000600854146107ba5760085442106107b957600080fd5b5b60008114156107c857600080fd5b8060028190555082600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b15801561087857600080fd5b505afa15801561088c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108b091906127be565b60ff16600481905550816005819055506109113330600554600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16611edd909392919063ffffffff16565b505050565b600080600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614610a295760011515600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161515146109aa57600080fd5b6000600760008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050610a2181610a13600454600a610a049190612ecf565b87611f6690919063ffffffff16565b611f7c90919063ffffffff16565b915050610a61565b610a5e600254610a50600454600a610a419190612ecf565b86611f6690919063ffffffff16565b611f7c90919063ffffffff16565b90505b8091505092915050565b60076020528060005260406000206000915090505481565b60025481565b610a91611ed5565b73ffffffffffffffffffffffffffffffffffffffff16610aaf61133a565b73ffffffffffffffffffffffffffffffffffffffff1614610b05576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610afc90612c5f565b60405180910390fd5b8151835114610b49576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b4090612c3f565b60405180910390fd5b60008114610b5957806002819055505b60005b8351811015610d28576001151560066000868481518110610ba6577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16151514610c0257600080fd5b6000838281518110610c3d577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101511415610c5057600080fd5b828181518110610c89577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015160076000868481518110610cce577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600181610d219190612df5565b9050610b5c565b50505050565b600b5481565b610d3c611ed5565b73ffffffffffffffffffffffffffffffffffffffff16610d5a61133a565b73ffffffffffffffffffffffffffffffffffffffff1614610db0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610da790612c5f565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015610df6573d6000803e3d6000fd5b5050565b6000806000610e07611ed5565b73ffffffffffffffffffffffffffffffffffffffff16610e2561133a565b73ffffffffffffffffffffffffffffffffffffffff1614610e7b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e7290612c5f565b60405180910390fd5b610eca333086600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16611edd909392919063ffffffff16565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663095ea7b3600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16866040518363ffffffff1660e01b8152600401610f49929190612b1d565b602060405180830381600087803b158015610f6357600080fd5b505af1158015610f77573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f9b919061267d565b506000806000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663f305d71934600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168a600080334260026110159190612fed565b6040518863ffffffff1660e01b815260040161103696959493929190612b46565b6060604051808303818588803b15801561104f57600080fd5b505af1158015611063573d6000803e3d6000fd5b50505050506040513d601f19601f8201168201806040525081019061108891906126f8565b9250925092508282829550955095505050509193909250565b600e6020528060005260406000206000915090508060000154908060010160009054906101000a900460ff16905082565b600f5481565b60085442116110e657600080fd5b60095442106110f457600080fd5b60008073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146111ec576000821161113657600080fd5b60011515600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615151461119357600080fd5b61119d8383610916565b905060055481600f546111b09190612df5565b106111ba57600080fd5b6111e73330848673ffffffffffffffffffffffffffffffffffffffff16611edd909392919063ffffffff16565b611215565b6111f7600034610916565b905060055481600f5461120a9190612df5565b1061121457600080fd5b5b80600f60008282546112279190612df5565b9250508190555080600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282546112809190612df5565b92505081905550505050565b60055481565b61129a611ed5565b73ffffffffffffffffffffffffffffffffffffffff166112b861133a565b73ffffffffffffffffffffffffffffffffffffffff161461130e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161130590612c5f565b60405180910390fd5b6113186000611f92565b565b60066020528060005260406000206000915054906101000a900460ff1681565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600c5481565b611371611ed5565b73ffffffffffffffffffffffffffffffffffffffff1661138f61133a565b73ffffffffffffffffffffffffffffffffffffffff16146113e5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113dc90612c5f565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561141f57600080fd5b80600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60045481565b611471611ed5565b73ffffffffffffffffffffffffffffffffffffffff1661148f61133a565b73ffffffffffffffffffffffffffffffffffffffff16146114e5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114dc90612c5f565b60405180910390fd5b6000600854146114fe5760085442106114fd57600080fd5b5b8051825114611542576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161153990612c3f565b60405180910390fd5b60005b825181101561170b576000828281518110611589577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151141561159c57600080fd5b6001600660008584815181106115db577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555081818151811061166d577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151600760008584815181106116b2577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550808061170390613139565b915050611545565b505050565b6000600b5442101561184257600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160009054906101000a900460ff161561177657600080fd5b600a54421161178457600080fd5b6064600c54600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001546117d69190612fed565b6117e09190612e4b565b90506001600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160006101000a81548160ff0219169083151502179055506118e3565b600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000015490506001600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160006101000a81548160ff0219169083151502179055505b80600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282546119359190613047565b925050819055506119893382600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166120569092919063ffffffff16565b50565b60095481565b61199a611ed5565b73ffffffffffffffffffffffffffffffffffffffff166119b861133a565b73ffffffffffffffffffffffffffffffffffffffff1614611a0e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a0590612c5f565b60405180910390fd5b600060085414611a27576008544210611a2657600080fd5b5b84848484834210611a3757600080fd5b828410611a4357600080fd5b818310611a4f57600080fd5b808210611a5b57600080fd5b886008819055508760098190555086600a8190555085600b8190555084600c81905550505050505050505050565b611a91611ed5565b73ffffffffffffffffffffffffffffffffffffffff16611aaf61133a565b73ffffffffffffffffffffffffffffffffffffffff1614611b05576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611afc90612c5f565b60405180910390fd5b6008544211611b1357600080fd5b600954421015611b2557426009819055505b565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600d8181548110611b5d57600080fd5b906000526020600020016000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b611b94611ed5565b73ffffffffffffffffffffffffffffffffffffffff16611bb261133a565b73ffffffffffffffffffffffffffffffffffffffff1614611c08576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bff90612c5f565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611c78576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c6f90612bff565b60405180910390fd5b611c8181611f92565b50565b611c8c611ed5565b73ffffffffffffffffffffffffffffffffffffffff16611caa61133a565b73ffffffffffffffffffffffffffffffffffffffff1614611d00576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cf790612c5f565b60405180910390fd5b8173ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33836040518363ffffffff1660e01b8152600401611d3b929190612b1d565b602060405180830381600087803b158015611d5557600080fd5b505af1158015611d69573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d8d919061267d565b505050565b600a5481565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b611dc6611ed5565b73ffffffffffffffffffffffffffffffffffffffff16611de461133a565b73ffffffffffffffffffffffffffffffffffffffff1614611e3a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e3190612c5f565b60405180910390fd5b60008173ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401611e759190612acb565b60206040518083038186803b158015611e8d57600080fd5b505afa158015611ea1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ec591906126cf565b9050611ed18282611c84565b5050565b600033905090565b611f60846323b872dd60e01b858585604051602401611efe93929190612ae6565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506120dc565b50505050565b60008183611f749190612fed565b905092915050565b60008183611f8a9190612e4b565b905092915050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6120d78363a9059cbb60e01b8484604051602401612075929190612b1d565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506120dc565b505050565b600061213e826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166121a39092919063ffffffff16565b905060008151111561219e578080602001905181019061215e919061267d565b61219d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161219490612c9f565b60405180910390fd5b5b505050565b60606121b284846000856121bb565b90509392505050565b606082471015612200576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121f790612c1f565b60405180910390fd5b612209856122cf565b612248576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161223f90612c7f565b60405180910390fd5b6000808673ffffffffffffffffffffffffffffffffffffffff1685876040516122719190612ab4565b60006040518083038185875af1925050503d80600081146122ae576040519150601f19603f3d011682016040523d82523d6000602084013e6122b3565b606091505b50915091506122c38282866122e2565b92505050949350505050565b600080823b905060008111915050919050565b606083156122f257829050612342565b6000835111156123055782518084602001fd5b816040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123399190612bdd565b60405180910390fd5b9392505050565b600061235c61235784612d6b565b612d3a565b9050808382526020820190508285602086028201111561237b57600080fd5b60005b858110156123ab57816123918882612421565b84526020840193506020830192505060018101905061237e565b5050509392505050565b60006123c86123c384612d97565b612d3a565b905080838252602082019050828560208602820111156123e757600080fd5b60005b8581101561241757816123fd888261249f565b8452602084019350602083019250506001810190506123ea565b5050509392505050565b6000813590506124308161322d565b92915050565b600082601f83011261244757600080fd5b8135612457848260208601612349565b91505092915050565b600082601f83011261247157600080fd5b81356124818482602086016123b5565b91505092915050565b60008151905061249981613244565b92915050565b6000813590506124ae8161325b565b92915050565b6000815190506124c38161325b565b92915050565b6000815190506124d881613272565b92915050565b6000602082840312156124f057600080fd5b60006124fe84828501612421565b91505092915050565b6000806040838503121561251a57600080fd5b600061252885828601612421565b92505060206125398582860161249f565b9150509250929050565b60008060006060848603121561255857600080fd5b600061256686828701612421565b93505060206125778682870161249f565b92505060406125888682870161249f565b9150509250925092565b600080604083850312156125a557600080fd5b600083013567ffffffffffffffff8111156125bf57600080fd5b6125cb85828601612436565b925050602083013567ffffffffffffffff8111156125e857600080fd5b6125f485828601612460565b9150509250929050565b60008060006060848603121561261357600080fd5b600084013567ffffffffffffffff81111561262d57600080fd5b61263986828701612436565b935050602084013567ffffffffffffffff81111561265657600080fd5b61266286828701612460565b92505060406126738682870161249f565b9150509250925092565b60006020828403121561268f57600080fd5b600061269d8482850161248a565b91505092915050565b6000602082840312156126b857600080fd5b60006126c68482850161249f565b91505092915050565b6000602082840312156126e157600080fd5b60006126ef848285016124b4565b91505092915050565b60008060006060848603121561270d57600080fd5b600061271b868287016124b4565b935050602061272c868287016124b4565b925050604061273d868287016124b4565b9150509250925092565b600080600080600060a0868803121561275f57600080fd5b600061276d8882890161249f565b955050602061277e8882890161249f565b945050604061278f8882890161249f565b93505060606127a08882890161249f565b92505060806127b18882890161249f565b9150509295509295909350565b6000602082840312156127d057600080fd5b60006127de848285016124c9565b91505092915050565b6127f08161307b565b82525050565b6127ff8161308d565b82525050565b600061281082612dc3565b61281a8185612dd9565b935061282a818560208601613106565b80840191505092915050565b61283f816130d0565b82525050565b61284e816130f4565b82525050565b600061285f82612dce565b6128698185612de4565b9350612879818560208601613106565b6128828161320f565b840191505092915050565b600061289a602683612de4565b91507f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008301527f64647265737300000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000612900602683612de4565b91507f416464726573733a20696e73756666696369656e742062616c616e636520666f60008301527f722063616c6c00000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000612966602f83612de4565b91507f50726573616c653a20746f6b656e73202620707269636573206172726179732060008301527f6c656e677468206d69736d6174636800000000000000000000000000000000006020830152604082019050919050565b60006129cc602083612de4565b91507f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726000830152602082019050919050565b6000612a0c601d83612de4565b91507f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006000830152602082019050919050565b6000612a4c602a83612de4565b91507f5361666545524332303a204552433230206f7065726174696f6e20646964206e60008301527f6f742073756363656564000000000000000000000000000000000000000000006020830152604082019050919050565b612aae816130b9565b82525050565b6000612ac08284612805565b915081905092915050565b6000602082019050612ae060008301846127e7565b92915050565b6000606082019050612afb60008301866127e7565b612b0860208301856127e7565b612b156040830184612aa5565b949350505050565b6000604082019050612b3260008301856127e7565b612b3f6020830184612aa5565b9392505050565b600060c082019050612b5b60008301896127e7565b612b686020830188612aa5565b612b756040830187612845565b612b826060830186612845565b612b8f60808301856127e7565b612b9c60a0830184612aa5565b979650505050505050565b6000602082019050612bbc60008301846127f6565b92915050565b6000602082019050612bd76000830184612836565b92915050565b60006020820190508181036000830152612bf78184612854565b905092915050565b60006020820190508181036000830152612c188161288d565b9050919050565b60006020820190508181036000830152612c38816128f3565b9050919050565b60006020820190508181036000830152612c5881612959565b9050919050565b60006020820190508181036000830152612c78816129bf565b9050919050565b60006020820190508181036000830152612c98816129ff565b9050919050565b60006020820190508181036000830152612cb881612a3f565b9050919050565b6000602082019050612cd46000830184612aa5565b92915050565b6000604082019050612cef6000830185612aa5565b612cfc60208301846127f6565b9392505050565b6000606082019050612d186000830186612aa5565b612d256020830185612aa5565b612d326040830184612aa5565b949350505050565b6000604051905081810181811067ffffffffffffffff82111715612d6157612d606131e0565b5b8060405250919050565b600067ffffffffffffffff821115612d8657612d856131e0565b5b602082029050602081019050919050565b600067ffffffffffffffff821115612db257612db16131e0565b5b602082029050602081019050919050565b600081519050919050565b600081519050919050565b600081905092915050565b600082825260208201905092915050565b6000612e00826130b9565b9150612e0b836130b9565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115612e4057612e3f613182565b5b828201905092915050565b6000612e56826130b9565b9150612e61836130b9565b925082612e7157612e706131b1565b5b828204905092915050565b6000808291508390505b6001851115612ec657808604811115612ea257612ea1613182565b5b6001851615612eb15780820291505b8081029050612ebf85613220565b9450612e86565b94509492505050565b6000612eda826130b9565b9150612ee5836130b9565b9250612f127fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8484612f1a565b905092915050565b600082612f2a5760019050612fe6565b81612f385760009050612fe6565b8160018114612f4e5760028114612f5857612f87565b6001915050612fe6565b60ff841115612f6a57612f69613182565b5b8360020a915084821115612f8157612f80613182565b5b50612fe6565b5060208310610133831016604e8410600b8410161715612fbc5782820a905083811115612fb757612fb6613182565b5b612fe6565b612fc98484846001612e7c565b92509050818404811115612fe057612fdf613182565b5b81810290505b9392505050565b6000612ff8826130b9565b9150613003836130b9565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561303c5761303b613182565b5b828202905092915050565b6000613052826130b9565b915061305d836130b9565b9250828210156130705761306f613182565b5b828203905092915050565b600061308682613099565b9050919050565b60008115159050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b60006130db826130e2565b9050919050565b60006130ed82613099565b9050919050565b60006130ff826130b9565b9050919050565b60005b83811015613124578082015181840152602081019050613109565b83811115613133576000848401525b50505050565b6000613144826130b9565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561317757613176613182565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b60008160011c9050919050565b6132368161307b565b811461324157600080fd5b50565b61324d8161308d565b811461325857600080fd5b50565b613264816130b9565b811461326f57600080fd5b50565b61327b816130c3565b811461328657600080fd5b5056fea2646970667358221220b797a93f7f3ed8be790155eb8ad390f2345c92c9e5cf78d27010b916d026156b64736f6c63430008000033

Deployed Bytecode Sourcemap

17896:6489:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18321:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;19483:436;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;21768:465;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;18266:46;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;18084:19;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20979:567;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;18437:29;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;6111:108;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;23883:499;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;18545:57;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;18611:30;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22241:741;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;18176:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5115:103;;;;;;;;;;;;;:::i;:::-;;18218:39;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4892:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;18475:29;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23722:153;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;18143:24;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20483:488;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;22990:724;;;;;;;;;;;;;:::i;:::-;;18361:29;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;19927:548;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;21554:206;;;;;;;;;;;;;:::i;:::-;;18112:24;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;18513:23;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5226:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;5819:121;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;18399:29;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;18054:21;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5948:155;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;18321:31;;;;:::o;19483:436::-;5038:12;:10;:12::i;:::-;5027:23;;:7;:5;:7::i;:::-;:23;;;5019:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;18838:1:::1;18818:16;;:21;18815:95;;18881:16;;18863:15;:34;18855:43;;;::::0;::::1;;18815:95;19648:1:::2;19639:5;:10;;19631:19;;;::::0;::::2;;19668:5;19661:4;:12;;;;19696:10;19684:9;;:22;;;;;;;;;;;;;;;;;;19747:9;;;;;;;;;;;19732:34;;;:36;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;19717:51;;:12;:51;;;;19800:19;19779:18;:40;;;;19830:81;19865:10;19885:4;19892:18;;19837:9;;;;;;;;;;;19830:34;;;;:81;;;;;;:::i;:::-;19483:436:::0;;;:::o;21768:465::-;21871:7;21896:14;21941:1;21924:19;;:5;:19;;;21921:281;;21985:4;21967:22;;:7;:14;21975:5;21967:14;;;;;;;;;;;;;;;;;;;;;;;;;:22;;;21959:31;;;;;;22005:13;22021:11;:18;22033:5;22021:18;;;;;;;;;;;;;;;;22005:34;;22063:39;22096:5;22063:28;22078:12;;22074:2;:16;;;;:::i;:::-;22063:6;:10;;:28;;;;:::i;:::-;:32;;:39;;;;:::i;:::-;22054:48;;21921:281;;;;22152:38;22185:4;;22152:28;22167:12;;22163:2;:16;;;;:::i;:::-;22152:6;:10;;:28;;;;:::i;:::-;:32;;:38;;;;:::i;:::-;22143:47;;21921:281;22219:6;22212:13;;;21768:465;;;;:::o;18266:46::-;;;;;;;;;;;;;;;;;:::o;18084:19::-;;;;:::o;20979:567::-;5038:12;:10;:12::i;:::-;5027:23;;:7;:5;:7::i;:::-;:23;;;5019:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;21173:7:::1;:14;21155:7;:14;:32;21133:131;;;;;;;;;;;;:::i;:::-;;;;;;;;;21289:1;21280:5;:10;21277:53;;21313:5;21306:4;:12;;;;21277:53;21346:9;21342:197;21365:7;:14;21361:1;:18;21342:197;;;21432:4;21409:27;;:7;:19;21417:7;21425:1;21417:10;;;;;;;;;;;;;;;;;;;;;;21409:19;;;;;;;;;;;;;;;;;;;;;;;;;:27;;;21401:36;;;::::0;::::1;;21474:1;21460:7;21468:1;21460:10;;;;;;;;;;;;;;;;;;;;;;:15;;21452:24;;;::::0;::::1;;21517:7;21525:1;21517:10;;;;;;;;;;;;;;;;;;;;;;21491:11;:23;21503:7;21511:1;21503:10;;;;;;;;;;;;;;;;;;;;;;21491:23;;;;;;;;;;;;;;;:36;;;;21384:1;21381:4;;;;;:::i;:::-;;;21342:197;;;;20979:567:::0;;;:::o;18437:29::-;;;;:::o;6111:108::-;5038:12;:10;:12::i;:::-;5027:23;;:7;:5;:7::i;:::-;:23;;;5019:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;6186:10:::1;6178:28;;:33;6207:3;6178:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;6111:108:::0;:::o;23883:499::-;23966:7;23975;23984;5038:12;:10;:12::i;:::-;5027:23;;:7;:5;:7::i;:::-;:23;;;5019:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;24003:78:::1;24038:10;24058:4;24065:15;24010:9;;;;;;;;;;;24003:34;;;;:78;;;;;;:::i;:::-;24101:9;;;;;;;;;;;24094:25;;;24128:6;;;;;;;;;;;24137:15;24094:59;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;24167:15;24185::::0;24202::::1;24221:6;;;;;;;;;;;:22;;;24252:9;24264;;;;;;;;;;;24275:15;24292:1;24295::::0;24298:10:::1;24314:15;24310:1;:19;;;;:::i;:::-;24221:109;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;24166:164;;;;;;24348:7;24357;24366;24341:33;;;;;;;;;23883:499:::0;;;;;:::o;18545:57::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;18611:30::-;;;;:::o;22241:741::-;18997:16;;18979:15;:34;18971:43;;;;;;19051:14;;19033:15;:32;19025:41;;;;;;22334:20:::1;22386:1:::0;22368:20:::1;;:6;:20;;;22365:510;;22422:1;22412:7;:11;22404:20;;;::::0;::::1;;22466:4;22447:23;;:7;:15;22455:6;22447:15;;;;;;;;;;;;;;;;;;;;;;;;;:23;;;22439:32;;;::::0;::::1;;22503:31;22518:6;22526:7;22503:14;:31::i;:::-;22488:46;;22592:18;;22576:12;22558:15;;:30;;;;:::i;:::-;22557:53;22549:62;;;::::0;::::1;;22626:67;22658:10;22678:4;22685:7;22633:6;22626:31;;;;:67;;;;;;:::i;:::-;22365:510;;;22749:37;22772:1;22776:9;22749:14;:37::i;:::-;22734:52;;22844:18;;22828:12;22810:15;;:30;;;;:::i;:::-;22809:53;22801:62;;;::::0;::::1;;22365:510;22904:12;22885:15;;:31;;;;;;;:::i;:::-;;;;;;;;22962:12;22927;:24;22940:10;22927:24;;;;;;;;;;;;;;;:31;;;:47;;;;;;;:::i;:::-;;;;;;;;19077:1;22241:741:::0;;:::o;18176:33::-;;;;:::o;5115:103::-;5038:12;:10;:12::i;:::-;5027:23;;:7;:5;:7::i;:::-;:23;;;5019:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;5180:30:::1;5207:1;5180:18;:30::i;:::-;5115:103::o:0;18218:39::-;;;;;;;;;;;;;;;;;;;;;;:::o;4892:87::-;4938:7;4965:6;;;;;;;;;;;4958:13;;4892:87;:::o;18475:29::-;;;;:::o;23722:153::-;5038:12;:10;:12::i;:::-;5027:23;;:7;:5;:7::i;:::-;:23;;;5019:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;23828:1:::1;23809:21;;:7;:21;;;;23801:30;;;::::0;::::1;;23859:7;23842:6;;:25;;;;;;;;;;;;;;;;;;23722:153:::0;:::o;18143:24::-;;;;:::o;20483:488::-;5038:12;:10;:12::i;:::-;5027:23;;:7;:5;:7::i;:::-;:23;;;5019:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;18838:1:::1;18818:16;;:21;18815:95;;18881:16;;18863:15;:34;18855:43;;;::::0;::::1;;18815:95;20670:7:::2;:14;20652:7;:14;:32;20630:133;;;;;;;;;;;;:::i;:::-;;;;;;;;;20781:9;20776:188;20800:7;:14;20796:1;:18;20776:188;;;20858:1;20844:7;20852:1;20844:10;;;;;;;;;;;;;;;;;;;;;;:15;;20836:24;;;::::0;::::2;;20897:4;20875:7;:19;20883:7;20891:1;20883:10;;;;;;;;;;;;;;;;;;;;;;20875:19;;;;;;;;;;;;;;;;:26;;;;;;;;;;;;;;;;;;20942:7;20950:1;20942:10;;;;;;;;;;;;;;;;;;;;;;20916:11;:23;20928:7;20936:1;20928:10;;;;;;;;;;;;;;;;;;;;;;20916:23;;;;;;;;;;;;;;;:36;;;;20816:3;;;;;:::i;:::-;;;;20776:188;;;;20483:488:::0;;:::o;22990:724::-;23034:25;23091:14;;23073:15;:32;23070:502;;;23130:12;:24;23143:10;23130:24;;;;;;;;;;;;;;;:46;;;;;;;;;;;;23129:47;23121:56;;;;;;23218:14;;23200:15;:32;23192:41;;;;;;23319:3;23302:14;;23268:12;:24;23281:10;23268:24;;;;;;;;;;;;;;;:31;;;:48;;;;:::i;:::-;:54;;;;:::i;:::-;23248:74;;23386:4;23337:12;:24;23350:10;23337:24;;;;;;;;;;;;;;;:46;;;:53;;;;;;;;;;;;;;;;;;23070:502;;;23461:12;:24;23474:10;23461:24;;;;;;;;;;;;;;;:31;;;23441:51;;23556:4;23507:12;:24;23520:10;23507:24;;;;;;;;;;;;;;;:46;;;:53;;;;;;;;;;;;;;;;;;23070:502;23617:17;23582:12;:24;23595:10;23582:24;;;;;;;;;;;;;;;:31;;;:52;;;;;;;:::i;:::-;;;;;;;;23645:61;23676:10;23688:17;23652:9;;;;;;;;;;;23645:30;;;;:61;;;;;:::i;:::-;22990:724;:::o;18361:29::-;;;;:::o;19927:548::-;5038:12;:10;:12::i;:::-;5027:23;;:7;:5;:7::i;:::-;:23;;;5019:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;18838:1:::1;18818:16;;:21;18815:95;;18881:16;;18863:15;:34;18855:43;;;::::0;::::1;;18815:95;20175:17:::2;20194:15;20211;20228;19276:17;19258:15;:35;19250:44;;;::::0;::::2;;19333:15;19313:17;:35;19305:44;;;::::0;::::2;;19386:15;19368;:33;19360:42;;;::::0;::::2;;19439:15;19421;:33;19413:42;;;::::0;::::2;;20276:17:::3;20257:16;:36;;;;20321:15;20304:14;:32;;;;20364:15;20347:14;:32;;;;20407:15;20390:14;:32;;;;20450:15;20433:14;:32;;;;18920:1:::2;;;;19927:548:::0;;;;;:::o;21554:206::-;5038:12;:10;:12::i;:::-;5027:23;;:7;:5;:7::i;:::-;:23;;;5019:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;21630:16:::1;;21612:15;:34;21604:43;;;::::0;::::1;;21679:14;;21661:15;:32;21658:95;;;21726:15;21709:14;:32;;;;21658:95;21554:206::o:0;18112:24::-;;;;;;;;;;;;;:::o;18513:23::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;5226:201::-;5038:12;:10;:12::i;:::-;5027:23;;:7;:5;:7::i;:::-;:23;;;5019:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;5335:1:::1;5315:22;;:8;:22;;;;5307:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;5391:28;5410:8;5391:18;:28::i;:::-;5226:201:::0;:::o;5819:121::-;5038:12;:10;:12::i;:::-;5027:23;;:7;:5;:7::i;:::-;:23;;;5019:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;5900:5:::1;5893:22;;;5916:10;5928:3;5893:39;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;5819:121:::0;;:::o;18399:29::-;;;;:::o;18054:21::-;;;;;;;;;;;;;:::o;5948:155::-;5038:12;:10;:12::i;:::-;5027:23;;:7;:5;:7::i;:::-;:23;;;5019:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;6012:11:::1;6033:5;6026:23;;;6058:4;6026:38;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;6012:52;;6075:20;6084:5;6091:3;6075:8;:20::i;:::-;5098:1;5948:155:::0;:::o;4411:98::-;4464:7;4491:10;4484:17;;4411:98;:::o;10099:248::-;10243:96;10263:5;10293:27;;;10322:4;10328:2;10332:5;10270:68;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10243:19;:96::i;:::-;10099:248;;;;:::o;2538:98::-;2596:7;2627:1;2623;:5;;;;:::i;:::-;2616:12;;2538:98;;;;:::o;2644:::-;2702:7;2733:1;2729;:5;;;;:::i;:::-;2722:12;;2644:98;;;;:::o;5435:191::-;5509:16;5528:6;;;;;;;;;;;5509:25;;5554:8;5545:6;;:17;;;;;;;;;;;;;;;;;;5609:8;5578:40;;5599:8;5578:40;;;;;;;;;;;;5435:191;;:::o;9880:211::-;9997:86;10017:5;10047:23;;;10072:2;10076:5;10024:58;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9997:19;:86::i;:::-;9880:211;;;:::o;11591:335::-;11674:23;11700:69;11728:4;11700:69;;;;;;;;;;;;;;;;;11708:5;11700:27;;;;:69;;;;;:::i;:::-;11674:95;;11804:1;11784:10;:17;:21;11780:139;;;11841:10;11830:30;;;;;;;;;;;;:::i;:::-;11822:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;11780:139;11591:335;;;:::o;6992:229::-;7129:12;7161:52;7183:6;7191:4;7197:1;7200:12;7161:21;:52::i;:::-;7154:59;;6992:229;;;;;:::o;7497:510::-;7667:12;7725:5;7700:21;:30;;7692:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;7792:18;7803:6;7792:10;:18::i;:::-;7784:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;7858:12;7872:23;7899:6;:11;;7918:5;7925:4;7899:31;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7857:73;;;;7948:51;7965:7;7974:10;7986:12;7948:16;:51::i;:::-;7941:58;;;;7497:510;;;;;;:::o;6278:198::-;6338:4;6357:12;6424:7;6412:20;6404:28;;6467:1;6460:4;:8;6453:15;;;6278:198;;;:::o;9237:550::-;9387:12;9416:7;9412:368;;;9447:10;9440:17;;;;9412:368;9514:1;9494:10;:17;:21;9490:279;;;9597:10;9591:17;9658:15;9645:10;9641:2;9637:19;9630:44;9545:148;9740:12;9733:20;;;;;;;;;;;:::i;:::-;;;;;;;;9237:550;;;;;;:::o;24:622:1:-;;145:80;160:64;217:6;160:64;:::i;:::-;145:80;:::i;:::-;136:89;;245:5;273:6;266:5;259:21;299:4;292:5;288:16;281:23;;324:6;374:3;366:4;358:6;354:17;349:3;345:27;342:36;339:2;;;391:1;388;381:12;339:2;419:1;404:236;429:6;426:1;423:13;404:236;;;496:3;524:37;557:3;545:10;524:37;:::i;:::-;519:3;512:50;591:4;586:3;582:14;575:21;;625:4;620:3;616:14;609:21;;464:176;451:1;448;444:9;439:14;;404:236;;;408:14;126:520;;;;;;;:::o;669:622::-;;790:80;805:64;862:6;805:64;:::i;:::-;790:80;:::i;:::-;781:89;;890:5;918:6;911:5;904:21;944:4;937:5;933:16;926:23;;969:6;1019:3;1011:4;1003:6;999:17;994:3;990:27;987:36;984:2;;;1036:1;1033;1026:12;984:2;1064:1;1049:236;1074:6;1071:1;1068:13;1049:236;;;1141:3;1169:37;1202:3;1190:10;1169:37;:::i;:::-;1164:3;1157:50;1236:4;1231:3;1227:14;1220:21;;1270:4;1265:3;1261:14;1254:21;;1109:176;1096:1;1093;1089:9;1084:14;;1049:236;;;1053:14;771:520;;;;;;;:::o;1297:139::-;;1381:6;1368:20;1359:29;;1397:33;1424:5;1397:33;:::i;:::-;1349:87;;;;:::o;1459:303::-;;1579:3;1572:4;1564:6;1560:17;1556:27;1546:2;;1597:1;1594;1587:12;1546:2;1637:6;1624:20;1662:94;1752:3;1744:6;1737:4;1729:6;1725:17;1662:94;:::i;:::-;1653:103;;1536:226;;;;;:::o;1785:303::-;;1905:3;1898:4;1890:6;1886:17;1882:27;1872:2;;1923:1;1920;1913:12;1872:2;1963:6;1950:20;1988:94;2078:3;2070:6;2063:4;2055:6;2051:17;1988:94;:::i;:::-;1979:103;;1862:226;;;;;:::o;2094:137::-;;2179:6;2173:13;2164:22;;2195:30;2219:5;2195:30;:::i;:::-;2154:77;;;;:::o;2237:139::-;;2321:6;2308:20;2299:29;;2337:33;2364:5;2337:33;:::i;:::-;2289:87;;;;:::o;2382:143::-;;2470:6;2464:13;2455:22;;2486:33;2513:5;2486:33;:::i;:::-;2445:80;;;;:::o;2531:139::-;;2617:6;2611:13;2602:22;;2633:31;2658:5;2633:31;:::i;:::-;2592:78;;;;:::o;2676:262::-;;2784:2;2772:9;2763:7;2759:23;2755:32;2752:2;;;2800:1;2797;2790:12;2752:2;2843:1;2868:53;2913:7;2904:6;2893:9;2889:22;2868:53;:::i;:::-;2858:63;;2814:117;2742:196;;;;:::o;2944:407::-;;;3069:2;3057:9;3048:7;3044:23;3040:32;3037:2;;;3085:1;3082;3075:12;3037:2;3128:1;3153:53;3198:7;3189:6;3178:9;3174:22;3153:53;:::i;:::-;3143:63;;3099:117;3255:2;3281:53;3326:7;3317:6;3306:9;3302:22;3281:53;:::i;:::-;3271:63;;3226:118;3027:324;;;;;:::o;3357:552::-;;;;3499:2;3487:9;3478:7;3474:23;3470:32;3467:2;;;3515:1;3512;3505:12;3467:2;3558:1;3583:53;3628:7;3619:6;3608:9;3604:22;3583:53;:::i;:::-;3573:63;;3529:117;3685:2;3711:53;3756:7;3747:6;3736:9;3732:22;3711:53;:::i;:::-;3701:63;;3656:118;3813:2;3839:53;3884:7;3875:6;3864:9;3860:22;3839:53;:::i;:::-;3829:63;;3784:118;3457:452;;;;;:::o;3915:693::-;;;4090:2;4078:9;4069:7;4065:23;4061:32;4058:2;;;4106:1;4103;4096:12;4058:2;4177:1;4166:9;4162:17;4149:31;4207:18;4199:6;4196:30;4193:2;;;4239:1;4236;4229:12;4193:2;4267:78;4337:7;4328:6;4317:9;4313:22;4267:78;:::i;:::-;4257:88;;4120:235;4422:2;4411:9;4407:18;4394:32;4453:18;4445:6;4442:30;4439:2;;;4485:1;4482;4475:12;4439:2;4513:78;4583:7;4574:6;4563:9;4559:22;4513:78;:::i;:::-;4503:88;;4365:236;4048:560;;;;;:::o;4614:838::-;;;;4806:2;4794:9;4785:7;4781:23;4777:32;4774:2;;;4822:1;4819;4812:12;4774:2;4893:1;4882:9;4878:17;4865:31;4923:18;4915:6;4912:30;4909:2;;;4955:1;4952;4945:12;4909:2;4983:78;5053:7;5044:6;5033:9;5029:22;4983:78;:::i;:::-;4973:88;;4836:235;5138:2;5127:9;5123:18;5110:32;5169:18;5161:6;5158:30;5155:2;;;5201:1;5198;5191:12;5155:2;5229:78;5299:7;5290:6;5279:9;5275:22;5229:78;:::i;:::-;5219:88;;5081:236;5356:2;5382:53;5427:7;5418:6;5407:9;5403:22;5382:53;:::i;:::-;5372:63;;5327:118;4764:688;;;;;:::o;5458:278::-;;5574:2;5562:9;5553:7;5549:23;5545:32;5542:2;;;5590:1;5587;5580:12;5542:2;5633:1;5658:61;5711:7;5702:6;5691:9;5687:22;5658:61;:::i;:::-;5648:71;;5604:125;5532:204;;;;:::o;5742:262::-;;5850:2;5838:9;5829:7;5825:23;5821:32;5818:2;;;5866:1;5863;5856:12;5818:2;5909:1;5934:53;5979:7;5970:6;5959:9;5955:22;5934:53;:::i;:::-;5924:63;;5880:117;5808:196;;;;:::o;6010:284::-;;6129:2;6117:9;6108:7;6104:23;6100:32;6097:2;;;6145:1;6142;6135:12;6097:2;6188:1;6213:64;6269:7;6260:6;6249:9;6245:22;6213:64;:::i;:::-;6203:74;;6159:128;6087:207;;;;:::o;6300:596::-;;;;6453:2;6441:9;6432:7;6428:23;6424:32;6421:2;;;6469:1;6466;6459:12;6421:2;6512:1;6537:64;6593:7;6584:6;6573:9;6569:22;6537:64;:::i;:::-;6527:74;;6483:128;6650:2;6676:64;6732:7;6723:6;6712:9;6708:22;6676:64;:::i;:::-;6666:74;;6621:129;6789:2;6815:64;6871:7;6862:6;6851:9;6847:22;6815:64;:::i;:::-;6805:74;;6760:129;6411:485;;;;;:::o;6902:844::-;;;;;;7078:3;7066:9;7057:7;7053:23;7049:33;7046:2;;;7095:1;7092;7085:12;7046:2;7138:1;7163:53;7208:7;7199:6;7188:9;7184:22;7163:53;:::i;:::-;7153:63;;7109:117;7265:2;7291:53;7336:7;7327:6;7316:9;7312:22;7291:53;:::i;:::-;7281:63;;7236:118;7393:2;7419:53;7464:7;7455:6;7444:9;7440:22;7419:53;:::i;:::-;7409:63;;7364:118;7521:2;7547:53;7592:7;7583:6;7572:9;7568:22;7547:53;:::i;:::-;7537:63;;7492:118;7649:3;7676:53;7721:7;7712:6;7701:9;7697:22;7676:53;:::i;:::-;7666:63;;7620:119;7036:710;;;;;;;;:::o;7752:280::-;;7869:2;7857:9;7848:7;7844:23;7840:32;7837:2;;;7885:1;7882;7875:12;7837:2;7928:1;7953:62;8007:7;7998:6;7987:9;7983:22;7953:62;:::i;:::-;7943:72;;7899:126;7827:205;;;;:::o;8038:118::-;8125:24;8143:5;8125:24;:::i;:::-;8120:3;8113:37;8103:53;;:::o;8162:109::-;8243:21;8258:5;8243:21;:::i;:::-;8238:3;8231:34;8221:50;;:::o;8277:373::-;;8409:38;8441:5;8409:38;:::i;:::-;8463:88;8544:6;8539:3;8463:88;:::i;:::-;8456:95;;8560:52;8605:6;8600:3;8593:4;8586:5;8582:16;8560:52;:::i;:::-;8637:6;8632:3;8628:16;8621:23;;8385:265;;;;;:::o;8656:163::-;8759:53;8806:5;8759:53;:::i;:::-;8754:3;8747:66;8737:82;;:::o;8825:147::-;8920:45;8959:5;8920:45;:::i;:::-;8915:3;8908:58;8898:74;;:::o;8978:364::-;;9094:39;9127:5;9094:39;:::i;:::-;9149:71;9213:6;9208:3;9149:71;:::i;:::-;9142:78;;9229:52;9274:6;9269:3;9262:4;9255:5;9251:16;9229:52;:::i;:::-;9306:29;9328:6;9306:29;:::i;:::-;9301:3;9297:39;9290:46;;9070:272;;;;;:::o;9348:370::-;;9511:67;9575:2;9570:3;9511:67;:::i;:::-;9504:74;;9608:34;9604:1;9599:3;9595:11;9588:55;9674:8;9669:2;9664:3;9660:12;9653:30;9709:2;9704:3;9700:12;9693:19;;9494:224;;;:::o;9724:370::-;;9887:67;9951:2;9946:3;9887:67;:::i;:::-;9880:74;;9984:34;9980:1;9975:3;9971:11;9964:55;10050:8;10045:2;10040:3;10036:12;10029:30;10085:2;10080:3;10076:12;10069:19;;9870:224;;;:::o;10100:379::-;;10263:67;10327:2;10322:3;10263:67;:::i;:::-;10256:74;;10360:34;10356:1;10351:3;10347:11;10340:55;10426:17;10421:2;10416:3;10412:12;10405:39;10470:2;10465:3;10461:12;10454:19;;10246:233;;;:::o;10485:330::-;;10648:67;10712:2;10707:3;10648:67;:::i;:::-;10641:74;;10745:34;10741:1;10736:3;10732:11;10725:55;10806:2;10801:3;10797:12;10790:19;;10631:184;;;:::o;10821:327::-;;10984:67;11048:2;11043:3;10984:67;:::i;:::-;10977:74;;11081:31;11077:1;11072:3;11068:11;11061:52;11139:2;11134:3;11130:12;11123:19;;10967:181;;;:::o;11154:374::-;;11317:67;11381:2;11376:3;11317:67;:::i;:::-;11310:74;;11414:34;11410:1;11405:3;11401:11;11394:55;11480:12;11475:2;11470:3;11466:12;11459:34;11519:2;11514:3;11510:12;11503:19;;11300:228;;;:::o;11534:118::-;11621:24;11639:5;11621:24;:::i;:::-;11616:3;11609:37;11599:53;;:::o;11658:271::-;;11810:93;11899:3;11890:6;11810:93;:::i;:::-;11803:100;;11920:3;11913:10;;11792:137;;;;:::o;11935:222::-;;12066:2;12055:9;12051:18;12043:26;;12079:71;12147:1;12136:9;12132:17;12123:6;12079:71;:::i;:::-;12033:124;;;;:::o;12163:442::-;;12350:2;12339:9;12335:18;12327:26;;12363:71;12431:1;12420:9;12416:17;12407:6;12363:71;:::i;:::-;12444:72;12512:2;12501:9;12497:18;12488:6;12444:72;:::i;:::-;12526;12594:2;12583:9;12579:18;12570:6;12526:72;:::i;:::-;12317:288;;;;;;:::o;12611:332::-;;12770:2;12759:9;12755:18;12747:26;;12783:71;12851:1;12840:9;12836:17;12827:6;12783:71;:::i;:::-;12864:72;12932:2;12921:9;12917:18;12908:6;12864:72;:::i;:::-;12737:206;;;;;:::o;12949:807::-;;13236:3;13225:9;13221:19;13213:27;;13250:71;13318:1;13307:9;13303:17;13294:6;13250:71;:::i;:::-;13331:72;13399:2;13388:9;13384:18;13375:6;13331:72;:::i;:::-;13413:80;13489:2;13478:9;13474:18;13465:6;13413:80;:::i;:::-;13503;13579:2;13568:9;13564:18;13555:6;13503:80;:::i;:::-;13593:73;13661:3;13650:9;13646:19;13637:6;13593:73;:::i;:::-;13676;13744:3;13733:9;13729:19;13720:6;13676:73;:::i;:::-;13203:553;;;;;;;;;:::o;13762:210::-;;13887:2;13876:9;13872:18;13864:26;;13900:65;13962:1;13951:9;13947:17;13938:6;13900:65;:::i;:::-;13854:118;;;;:::o;13978:254::-;;14125:2;14114:9;14110:18;14102:26;;14138:87;14222:1;14211:9;14207:17;14198:6;14138:87;:::i;:::-;14092:140;;;;:::o;14238:313::-;;14389:2;14378:9;14374:18;14366:26;;14438:9;14432:4;14428:20;14424:1;14413:9;14409:17;14402:47;14466:78;14539:4;14530:6;14466:78;:::i;:::-;14458:86;;14356:195;;;;:::o;14557:419::-;;14761:2;14750:9;14746:18;14738:26;;14810:9;14804:4;14800:20;14796:1;14785:9;14781:17;14774:47;14838:131;14964:4;14838:131;:::i;:::-;14830:139;;14728:248;;;:::o;14982:419::-;;15186:2;15175:9;15171:18;15163:26;;15235:9;15229:4;15225:20;15221:1;15210:9;15206:17;15199:47;15263:131;15389:4;15263:131;:::i;:::-;15255:139;;15153:248;;;:::o;15407:419::-;;15611:2;15600:9;15596:18;15588:26;;15660:9;15654:4;15650:20;15646:1;15635:9;15631:17;15624:47;15688:131;15814:4;15688:131;:::i;:::-;15680:139;;15578:248;;;:::o;15832:419::-;;16036:2;16025:9;16021:18;16013:26;;16085:9;16079:4;16075:20;16071:1;16060:9;16056:17;16049:47;16113:131;16239:4;16113:131;:::i;:::-;16105:139;;16003:248;;;:::o;16257:419::-;;16461:2;16450:9;16446:18;16438:26;;16510:9;16504:4;16500:20;16496:1;16485:9;16481:17;16474:47;16538:131;16664:4;16538:131;:::i;:::-;16530:139;;16428:248;;;:::o;16682:419::-;;16886:2;16875:9;16871:18;16863:26;;16935:9;16929:4;16925:20;16921:1;16910:9;16906:17;16899:47;16963:131;17089:4;16963:131;:::i;:::-;16955:139;;16853:248;;;:::o;17107:222::-;;17238:2;17227:9;17223:18;17215:26;;17251:71;17319:1;17308:9;17304:17;17295:6;17251:71;:::i;:::-;17205:124;;;;:::o;17335:320::-;;17488:2;17477:9;17473:18;17465:26;;17501:71;17569:1;17558:9;17554:17;17545:6;17501:71;:::i;:::-;17582:66;17644:2;17633:9;17629:18;17620:6;17582:66;:::i;:::-;17455:200;;;;;:::o;17661:442::-;;17848:2;17837:9;17833:18;17825:26;;17861:71;17929:1;17918:9;17914:17;17905:6;17861:71;:::i;:::-;17942:72;18010:2;17999:9;17995:18;17986:6;17942:72;:::i;:::-;18024;18092:2;18081:9;18077:18;18068:6;18024:72;:::i;:::-;17815:288;;;;;;:::o;18109:283::-;;18175:2;18169:9;18159:19;;18217:4;18209:6;18205:17;18324:6;18312:10;18309:22;18288:18;18276:10;18273:34;18270:62;18267:2;;;18335:18;;:::i;:::-;18267:2;18375:10;18371:2;18364:22;18149:243;;;;:::o;18398:311::-;;18565:18;18557:6;18554:30;18551:2;;;18587:18;;:::i;:::-;18551:2;18637:4;18629:6;18625:17;18617:25;;18697:4;18691;18687:15;18679:23;;18480:229;;;:::o;18715:311::-;;18882:18;18874:6;18871:30;18868:2;;;18904:18;;:::i;:::-;18868:2;18954:4;18946:6;18942:17;18934:25;;19014:4;19008;19004:15;18996:23;;18797:229;;;:::o;19032:98::-;;19117:5;19111:12;19101:22;;19090:40;;;:::o;19136:99::-;;19222:5;19216:12;19206:22;;19195:40;;;:::o;19241:147::-;;19379:3;19364:18;;19354:34;;;;:::o;19394:169::-;;19512:6;19507:3;19500:19;19552:4;19547:3;19543:14;19528:29;;19490:73;;;;:::o;19569:305::-;;19628:20;19646:1;19628:20;:::i;:::-;19623:25;;19662:20;19680:1;19662:20;:::i;:::-;19657:25;;19816:1;19748:66;19744:74;19741:1;19738:81;19735:2;;;19822:18;;:::i;:::-;19735:2;19866:1;19863;19859:9;19852:16;;19613:261;;;;:::o;19880:185::-;;19937:20;19955:1;19937:20;:::i;:::-;19932:25;;19971:20;19989:1;19971:20;:::i;:::-;19966:25;;20010:1;20000:2;;20015:18;;:::i;:::-;20000:2;20057:1;20054;20050:9;20045:14;;19922:143;;;;:::o;20071:848::-;;;20163:6;20154:15;;20187:5;20178:14;;20201:712;20222:1;20212:8;20209:15;20201:712;;;20317:4;20312:3;20308:14;20302:4;20299:24;20296:2;;;20326:18;;:::i;:::-;20296:2;20376:1;20366:8;20362:16;20359:2;;;20791:4;20784:5;20780:16;20771:25;;20359:2;20841:4;20835;20831:15;20823:23;;20871:32;20894:8;20871:32;:::i;:::-;20859:44;;20201:712;;;20144:775;;;;;;;:::o;20925:285::-;;21009:23;21027:4;21009:23;:::i;:::-;21001:31;;21053:27;21071:8;21053:27;:::i;:::-;21041:39;;21099:104;21136:66;21126:8;21120:4;21099:104;:::i;:::-;21090:113;;20991:219;;;;:::o;21216:1073::-;;21461:8;21451:2;;21482:1;21473:10;;21484:5;;21451:2;21510:4;21500:2;;21527:1;21518:10;;21529:5;;21500:2;21596:4;21644:1;21639:27;;;;21680:1;21675:191;;;;21589:277;;21639:27;21657:1;21648:10;;21659:5;;;21675:191;21720:3;21710:8;21707:17;21704:2;;;21727:18;;:::i;:::-;21704:2;21776:8;21773:1;21769:16;21760:25;;21811:3;21804:5;21801:14;21798:2;;;21818:18;;:::i;:::-;21798:2;21851:5;;;21589:277;;21975:2;21965:8;21962:16;21956:3;21950:4;21947:13;21943:36;21925:2;21915:8;21912:16;21907:2;21901:4;21898:12;21894:35;21878:111;21875:2;;;22031:8;22025:4;22021:19;22012:28;;22066:3;22059:5;22056:14;22053:2;;;22073:18;;:::i;:::-;22053:2;22106:5;;21875:2;22146:42;22184:3;22174:8;22168:4;22165:1;22146:42;:::i;:::-;22131:57;;;;22220:4;22215:3;22211:14;22204:5;22201:25;22198:2;;;22229:18;;:::i;:::-;22198:2;22278:4;22271:5;22267:16;22258:25;;21276:1013;;;;;;:::o;22295:348::-;;22358:20;22376:1;22358:20;:::i;:::-;22353:25;;22392:20;22410:1;22392:20;:::i;:::-;22387:25;;22580:1;22512:66;22508:74;22505:1;22502:81;22497:1;22490:9;22483:17;22479:105;22476:2;;;22587:18;;:::i;:::-;22476:2;22635:1;22632;22628:9;22617:20;;22343:300;;;;:::o;22649:191::-;;22709:20;22727:1;22709:20;:::i;:::-;22704:25;;22743:20;22761:1;22743:20;:::i;:::-;22738:25;;22782:1;22779;22776:8;22773:2;;;22787:18;;:::i;:::-;22773:2;22832:1;22829;22825:9;22817:17;;22694:146;;;;:::o;22846:96::-;;22912:24;22930:5;22912:24;:::i;:::-;22901:35;;22891:51;;;:::o;22948:90::-;;23025:5;23018:13;23011:21;23000:32;;22990:48;;;:::o;23044:126::-;;23121:42;23114:5;23110:54;23099:65;;23089:81;;;:::o;23176:77::-;;23242:5;23231:16;;23221:32;;;:::o;23259:86::-;;23334:4;23327:5;23323:16;23312:27;;23302:43;;;:::o;23351:158::-;;23450:53;23497:5;23450:53;:::i;:::-;23437:66;;23427:82;;;:::o;23515:129::-;;23614:24;23632:5;23614:24;:::i;:::-;23601:37;;23591:53;;;:::o;23650:121::-;;23741:24;23759:5;23741:24;:::i;:::-;23728:37;;23718:53;;;:::o;23777:307::-;23845:1;23855:113;23869:6;23866:1;23863:13;23855:113;;;23954:1;23949:3;23945:11;23939:18;23935:1;23930:3;23926:11;23919:39;23891:2;23888:1;23884:10;23879:15;;23855:113;;;23986:6;23983:1;23980:13;23977:2;;;24066:1;24057:6;24052:3;24048:16;24041:27;23977:2;23826:258;;;;:::o;24090:233::-;;24152:24;24170:5;24152:24;:::i;:::-;24143:33;;24198:66;24191:5;24188:77;24185:2;;;24268:18;;:::i;:::-;24185:2;24315:1;24308:5;24304:13;24297:20;;24133:190;;;:::o;24329:180::-;24377:77;24374:1;24367:88;24474:4;24471:1;24464:15;24498:4;24495:1;24488:15;24515:180;24563:77;24560:1;24553:88;24660:4;24657:1;24650:15;24684:4;24681:1;24674:15;24701:180;24749:77;24746:1;24739:88;24846:4;24843:1;24836:15;24870:4;24867:1;24860:15;24887:102;;24979:2;24975:7;24970:2;24963:5;24959:14;24955:28;24945:38;;24935:54;;;:::o;24995:102::-;;25084:5;25081:1;25077:13;25056:34;;25046:51;;;:::o;25103:122::-;25176:24;25194:5;25176:24;:::i;:::-;25169:5;25166:35;25156:2;;25215:1;25212;25205:12;25156:2;25146:79;:::o;25231:116::-;25301:21;25316:5;25301:21;:::i;:::-;25294:5;25291:32;25281:2;;25337:1;25334;25327:12;25281:2;25271:76;:::o;25353:122::-;25426:24;25444:5;25426:24;:::i;:::-;25419:5;25416:35;25406:2;;25465:1;25462;25455:12;25406:2;25396:79;:::o;25481:118::-;25552:22;25568:5;25552:22;:::i;:::-;25545:5;25542:33;25532:2;;25589:1;25586;25579:12;25532:2;25522:77;:::o

Swarm Source

ipfs://b797a93f7f3ed8be790155eb8ad390f2345c92c9e5cf78d27010b916d026156b

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
Loading...
Loading

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
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.