ETH Price: $3,417.78 (+0.77%)

Token

EAS (EAS)
 

Overview

Max Total Supply

11,000,000 EAS

Holders

3,154

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Balance
0.0000000004 EAS

Value
$0.00
0x8980af4e361f78e07fefd1f243a1759f7db98ec6
Loading...
Loading
Loading...
Loading
Loading...
Loading

Click here to update the token information / general information
# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
EASContract

Compiler Version
v0.6.12+commit.27d51765

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2020-09-25
*/

// SPDX-License-Identifier: MIT

pragma solidity ^0.6.0;

/**
 * @dev Wrappers over Solidity's arithmetic operations with added overflow
 * checks.
 *
 * Arithmetic operations in Solidity wrap on overflow. This can easily result
 * in bugs, because programmers usually assume that an overflow raises an
 * error, which is the standard behavior in high level programming languages.
 * `SafeMath` restores this intuition by reverting the transaction when an
 * operation overflows.
 *
 * Using this library instead of the unchecked operations eliminates an entire
 * class of bugs, so it's recommended to use it always.
 */
library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `+` operator.
     *
     * Requirements:
     * - Addition cannot overflow.
     */
    function add(uint256 a, uint256 b) internal pure returns (uint256 c) {
        c = a + b;
        require(c >= a, "SafeMath: addition overflow");

        return c;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        return sub(a, b, "SafeMath: subtraction overflow");
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256 c) {
        require(b <= a, errorMessage);
        c = a - b;

        return c;
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `*` operator.
     *
     * Requirements:
     * - Multiplication cannot overflow.
     */
    function mul(uint256 a, uint256 b) internal pure returns (uint256 c) {
        // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
        // benefit is lost if 'b' is also tested.
        // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
        if (a == 0) {
            return 0;
        }

        c = a * b;
        require(c / a == b, "SafeMath: multiplication overflow");

        return c;
    }

    /**
     * @dev Returns the integer division of two unsigned integers. Reverts on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return div(a, b, "SafeMath: division by zero");
    }

    /**
     * @dev Returns the integer division of two unsigned integers. Reverts with custom message on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256 c) {
        // Solidity only automatically asserts when dividing by 0
        require(b > 0, errorMessage);
        c = a / b;
        // assert(a == b * c + a % b); // There is no case in which this doesn't hold

        return c;
    }
}

/**
 * @dev Collection of functions related to the address type
 */
library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * This test is non-exhaustive, and there may be false-negatives: during the
     * execution of a contract's constructor, its address will be reported as
     * not containing a contract.
     *
     * IMPORTANT: It is unsafe to assume that an address for which this
     * function returns false is an externally-owned account (EOA) and not a
     * contract.
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies in extcodesize, which returns 0 for contracts in
        // construction, since the code is only stored at the end of the
        // constructor execution.

        // According to EIP-1052, 0x0 is the value returned for not-yet created accounts
        // and 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470 is returned
        // for accounts without code, i.e. `keccak256('')`
        bytes32 codehash;
        bytes32 accountHash = 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470;
        // solhint-disable-next-line no-inline-assembly
        assembly { codehash := extcodehash(account) }
        return (codehash != 0x0 && codehash != accountHash);
    }

    /**
     * @dev Converts an `address` into `address payable`. Note that this is
     * simply a type cast: the actual underlying value is not changed.
     *
     * _Available since v2.4.0._
     */
    function toPayable(address account) internal pure returns (address payable) {
        return address(uint160(account));
    }
}


/**
 * @title ERC20Basic
 * @dev Simpler version of ERC20 interface
 * See https://github.com/ethereum/EIPs/issues/179
 */
interface ERC20Basic {
    function totalSupply() external view returns (uint256);
    function balanceOf(address who) external view returns (uint256);
    function transfer(address to, uint256 value) external returns (bool);
    event Transfer(
        address indexed _from,
        address indexed _to,
        uint256 _value
    );
}


/**
 * @title Basic token
 * @dev Basic version of StandardToken, with no allowances.
 */
contract BasicToken is ERC20Basic {
    using SafeMath for uint256;

    uint256 totalSupply_;

    mapping(address => uint256) balances;

    /**
     * @dev Total number of tokens in existence
     */
    function totalSupply() public view override returns (uint256) {
        return totalSupply_;
    }

    /**
     * @dev Transfer token for a specified address
     * @param _to The address to transfer to.
     * @param _value The amount to be transferred.
     */
    function transfer(address _to, uint256 _value) public override returns (bool) {
        return _transfer(msg.sender, _to, _value);
    }

    /**
     * @dev Transfer token for a specified address
     * @param _from The address to transfer from.
     * @param _to The address to transfer to.
     * @param _value The amount to be transferred.
     */
    function _transfer(address _from, address _to, uint256 _value) internal returns (bool) {
        require(_to != address(0), "transfer addr is the zero address");
        require(_value <= balances[_from], "lack of balance");

        balances[_from] = balances[_from].sub(_value);
        balances[_to] = balances[_to].add(_value);
        emit Transfer(_from, _to, _value);
        return true;
    }

    /**
     * @dev Gets the balance of the specified address.
     * @param _owner The address to query the the balance of.
     * @return An uint256 representing the amount owned by the passed address.
     */
    function balanceOf(address _owner) public view override returns (uint256) {
        return balances[_owner];
    }
}


/**
 * @title ERC20 interface
 * @dev see https://github.com/ethereum/EIPs/issues/20
 */
interface ERC20 is ERC20Basic {
    function allowance(address owner, address spender) external view returns (uint256);
    function transferFrom(address from, address to, uint256 value) external returns (bool);
    function approve(address spender, uint256 value) external returns (bool);
    event Approval(
        address indexed _owner,
        address indexed _spender,
        uint256 _value
    );
}


/**
 * @title Standard ERC20 token
 *
 * @dev Implementation of the basic standard token.
 * https://github.com/ethereum/EIPs/issues/20
 * Based on code by FirstBlood: https://github.com/Firstbloodio/token/blob/master/smart_contract/FirstBloodToken.sol
 */
contract StandardToken is ERC20, BasicToken {
    mapping (address => mapping (address => uint256)) internal allowed;

    /**
     * @dev Transfer tokens from one address to another
     * @param _from address The address which you want to send tokens from
     * @param _to address The address which you want to transfer to
     * @param _value uint256 the amount of tokens to be transferred
     */
    function transferFrom(
        address _from,
        address _to,
        uint256 _value
    )
        public
        override
        returns (bool)
    {
        require(_to != address(0), "transfer addr is the zero address");
        require(_value <= balances[_from], "lack of balance");
        require(_value <= allowed[_from][msg.sender], "lack of transfer balance allowed");
        
        allowed[_from][msg.sender] = allowed[_from][msg.sender].sub(_value);
        balances[_from] = balances[_from].sub(_value);
        balances[_to] = balances[_to].add(_value);

        emit Transfer(_from, _to, _value);
        return true;
    }

    /**
     * @dev Approve the passed address to spend the specified amount of tokens on behalf of msg.sender.
     * Beware that changing an allowance with this method brings the risk that someone may use both the old
     * and the new allowance by unfortunate transaction ordering. One possible solution to mitigate this
     * race condition is to first reduce the spender's allowance to 0 and set the desired value afterwards:
     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
     * @param _spender The address which will spend the funds.
     * @param _value The amount of tokens to be spent.
     */
    function approve(address _spender, uint256 _value) public override returns (bool) {
        // avoid race condition
        require((_value == 0) || (allowed[msg.sender][_spender] == 0), "reset allowance to 0 before change it's value.");
        allowed[msg.sender][_spender] = _value;
        emit Approval(msg.sender, _spender, _value);
        return true;
    }

    /**
     * @dev Function to check the amount of tokens that an owner allowed to a spender.
     * @param _owner address The address which owns the funds.
     * @param _spender address The address which will spend the funds.
     * @return A uint256 specifying the amount of tokens still available for the spender.
     */
    function allowance(
        address _owner,
        address _spender
    )
        public
        view
        override
        returns (uint256)
    {
        return allowed[_owner][_spender];
    }
}


contract Token_StandardToken is StandardToken {
    // region{fields}
    string public name;
    string public symbol;
    uint8 public decimals;

    // region{Constructor}
    // note : [(final)totalSupply] >> claimAmount * 10 ** decimals
    // example : args << "The Kh Token No.X", "ABC", "10000000000", "18"
    constructor(
        string memory _token_name,
        string memory _symbol,
        uint256 _claim_amount,
        uint8 _decimals,
        address minaddr
    ) public {
        name = _token_name;
        symbol = _symbol;
        decimals = _decimals;
        totalSupply_ = _claim_amount.mul(10 ** uint256(decimals));
        balances[minaddr] = totalSupply_;
        emit Transfer(address(0), minaddr, totalSupply_);
    }
}

/**
 * @dev Interface of the ERC20 standard as defined in the EIP. Does not include
 * the optional functions; to access them see {ERC20Detailed}.
 * USDT transfer and transferFrom not returns
 */
interface ITokenERC20_USDT {
    /**
     * @dev Returns the amount of tokens owned by `account`.
     */
    function balanceOf(address account) external view returns (uint256);

    /**
     * @dev Moves `amount` tokens from the caller's account to `recipient`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transfer(address recipient, uint256 amount) external;

    /**
     * @dev Moves `amount` tokens from `sender` to `recipient` using the
     * allowance mechanism. `amount` is then deducted from the caller's
     * allowance.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(address sender, address recipient, uint256 amount) external;
}

/**
 * @dev Interface of the ERC20 standard as defined in the EIP. Does not include
 * the optional functions; to access them see {ERC20Detailed}.
 */
interface ITokenERC20 {
    /**
     * @dev Returns the amount of tokens owned by `account`.
     */
    function balanceOf(address account) external view returns (uint256);

    /**
     * @dev Moves `amount` tokens from the caller's account to `recipient`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transfer(address recipient, uint256 amount) external returns (bool);

    /**
     * @dev Moves `amount` tokens from `sender` to `recipient` using the
     * allowance mechanism. `amount` is then deducted from the caller's
     * allowance.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);
}

/**
 * @title DB
 * @dev This Provide database support services
 */
contract DB  {
    //lib using list

	struct UserInfo {
		uint id;
        address code;
		address rCode;
	}

	uint _uid = 0;
	mapping(uint => address) indexMapping;//UID address Mapping
    mapping(address => address) addressMapping;//inviteCode address Mapping
    mapping(address => UserInfo) userInfoMapping;//address UserInfo Mapping

    /**
     * @dev Create store user information
     * @param addr user addr
     * @param code user invite Code
     * @param rCode recommend code
     */
    function _registerUser(address addr, address code, address rCode)
        internal
    {
		UserInfo storage userInfo = userInfoMapping[addr];
        if (userInfo.id == 0) {
            if (_uid != 0) {
                require(isUsedCode(rCode), "DB: rCode not exist");
                address pAddr = addressMapping[rCode];
                require(pAddr != msg.sender, "DB: rCode can't be self");
                userInfo.rCode = rCode;
            }

            require(!isUsedCode(code), "DB: code is used");
            require(code != address(0), "DB: invalid invite code");

            _uid++;
            userInfo.id = _uid;
            userInfo.code = code;

            addressMapping[code] = addr;
            indexMapping[_uid] = addr;
        }
	}

    /**
     * @dev determine if user invite code is use
     * @param code user invite Code
     * @return bool
     */
    function _isUsedCode(address code)
        internal
        view
        returns (bool)
    {
		return addressMapping[code] != address(0);
	}

    /**
     * @dev get the user address of the corresponding user invite code
     * Authorization Required
     * @param code user invite Code
     * @return address
     */
    function _getCodeMapping(address code)
        internal
        view
        returns (address)
    {
		return addressMapping[code];
	}

    /**
     * @dev get the user address of the corresponding user id
     * Authorization Required
     * @param uid user id
     * @return address
     */
    function _getIndexMapping(uint uid)
        internal
        view
        returns (address)
    {
		return indexMapping[uid];
	}

    /**
     * @dev get the user address of the corresponding User info
     * Authorization Required or addr is owner
     * @param addr user address
     * @return info info[id,status,level,levelStatus]
     * @return code code
     * @return rCode rCode
     */
    function _getUserInfo(address addr)
        internal
        view
        returns (uint[1] memory info, address code, address rCode)
    {
		UserInfo memory userInfo = userInfoMapping[addr];
		info[0] = userInfo.id;

		return (info, userInfo.code, userInfo.rCode);
	}

    /**
     * @dev get the current latest ID
     * Authorization Required
     * @return current uid
     */
    function _getCurrentUserID()
        internal
        view
        returns (uint)
    {
		return _uid;
	}

    /**
     * @dev determine if user invite code is use
     * @param code user invite Code
     * @return bool
     */
    function isUsedCode(address code)
        public
        view
        returns (bool)
    {
		return _isUsedCode(code);
	}
}


/**
 * @title Utillibrary
 * @dev This integrates the basic functions.
 */
contract Utillibrary is Token_StandardToken {
    //lib using list
	using SafeMath for *;
    using Address for address;

    //base param setting
    // uint internal ethWei = 1 ether;
    uint internal USDTWei = 10 ** 6;
    uint internal ETTWei = 10 ** 18;
    uint internal USDT_ETTWei_Ratio = 10 ** 12;

    constructor() 
        Token_StandardToken("EAS", "EAS", 11000000, 18, address(this))
        public
    {

    }

    /**
     * @dev modifier to scope access to a Contract (uses tx.origin and msg.sender)
     */
	modifier isHuman() {
		require(msg.sender == tx.origin, "humans only");
		_;
	}

    /**
     * @dev check Zero Addr
     */
	modifier checkZeroAddr(address addr) {
		require(addr != address(0), "zero addr");
		_;
	}

    /**
     * @dev check Addr is Contract
     */
	modifier checkIsContract(address addr) {
		require(addr.isContract(), "not token addr");
		_;
	}

    /**
     * @dev check User ID
     * @param uid user ID
     */
    function checkUserID(uint uid)
        internal
        pure
    {
        require(uid != 0, "user not exist");
	}

    /**
     * @dev Transfer to designated user
     * @param _addr user address
     * @param _val transfer-out amount
     */
	function sendTokenToUser(address _addr, uint _val)
        internal
    {
		if (_val > 0) {
            _transfer(address(this), _addr, _val);//erc20 internal Function
		}
	}

    /**
     * @dev Gets the amount from the specified user
     * @param _addr user address
     * @param _val transfer-get amount
     */
	function getTokenFormUser(address _addr, uint _val)
        internal
    {
		if (_val > 0) {
            _transfer(_addr, address(this), _val);//erc20 internal Function
		}
	}

    /**
     * @dev Transfer to designated user
     * USDT transfer and transferFrom not returns
     * @param _taddr token address
     * @param _addr user address
     * @param _val transfer-out amount
     */
	function sendTokenToUser_USDT(address _taddr, address _addr, uint _val)
        internal
        checkZeroAddr(_addr)
        checkIsContract(_taddr)
    {
		if (_val > 0) {
            ITokenERC20_USDT(_taddr).transfer(_addr, _val);
		}
	}

    /**
     * @dev Gets the amount from the specified user
     * USDT transfer and transferFrom not returns
     * @param _taddr token address
     * @param _addr user address
     * @param _val transfer-get amount
     */
	function getTokenFormUser_USDT(address _taddr, address _addr, uint _val)
        internal
        checkZeroAddr(_addr)
        checkIsContract(_taddr)
    {
		if (_val > 0) {
            ITokenERC20_USDT(_taddr).transferFrom(_addr, address(this), _val);
		}
	}

    /**
     * @dev Check and correct transfer amount
     * @param sendMoney transfer-out amount
     * @return bool,amount
     */
	function isEnoughTokneBalance(address _taddr, uint sendMoney)
        internal
        view
        returns (bool, uint tokneBalance)
    {
        tokneBalance = ITokenERC20(_taddr).balanceOf(address(this));
		if (sendMoney > tokneBalance) {
			return (false, tokneBalance);
		} else {
			return (true, sendMoney);
		}
	}

    /**
     * @dev get Resonance Ratio for the Resonance ID
     * @param value Resonance ID
     * @return Resonance Ratio
     */
	function getResonanceRatio(uint value)
        internal
        view
        returns (uint)
    {
        // base 1U=10E
        // 1.10U=100E => 10/100U=1E => 1U=100/10E
        // 2.11U=100E => 11/100U=1E => 1U=100/11E
        // 3.12U=100E => 12/100U=1E => 1U=100/12E
        return USDT_ETTWei_Ratio * 100 / ((value - 1) + 10);
	}

    /**
     * @dev get scale for the level (*scale/1000)
     * @param level level
     * @return scale
     */
	function getScaleByLevel(uint level)
        internal
        pure
        returns (uint)
    {
		if (level == 1) {
			return 10;
		}
		if (level == 2) {
			return 12;
		}
		if (level == 3) {
			return 15;
		}
        if (level == 4) {
			return 15;
		}
		return 0;
	}

    /**
     * @dev get scale for the DailyDividend (*scale/1000)
     * @param level level
     * @return scale algebra
     */
	function getScaleByDailyDividend(uint level)
        internal
        pure
        returns (uint scale, uint algebra)
    {
		if (level == 1) {
			return (100, 1);
		}
		if (level == 2) {
			return (60, 5);
		}
		if (level == 3) {
            return (80, 8);
		}
        if (level == 4) {
            return (100, 10);
		}
		return (0, 0);
	}
}

contract EASContract is Utillibrary, DB {
    using SafeMath for *;

    //struct
	struct User {
		uint id;

        uint investAmountAddup;//add up invest Amount
        uint investAmountOut;//add up invest Amount Out

        uint investMoney;//invest amount current
        uint investAddupStaticBonus;//add up settlement static bonus amonut
        uint investAddupDynamicBonus;//add up settlement dynamic bonus amonut
        uint8 investOutMultiple;//invest Exit multiple of investment  n/10
        uint8 investLevel;//invest level
        uint40 investTime;//invest time
        uint40 investLastRwTime;//last settlement time

        uint bonusStaticAmount;//add up static bonus amonut (static bonus)
		uint bonusDynamicAmonut;//add up dynamic bonus amonut (dynamic bonus)

        uint takeBonusWallet;//takeBonus Wallet
        uint takeBonusAddup;//add up takeBonus
	}
    struct ResonanceData {
        uint40 time;//Resonance time
        uint ratio;//Resonance amount
        uint investMoney;//invest amount
	}

    //Loglist
    event InvestEvent(address indexed _addr, address indexed _code, address indexed _rCode, uint _value, uint time);
    event TakeBonusEvent(address indexed _addr, uint _type, uint _value_USDT, uint _value_ETT, uint time);

    //ERC Token addr
    address USDTToken;//USDT contract

    //base param setting
	address devAddr;//The special account

    //resonance
    uint internal rid = 1;//sell Round id
    mapping(uint => ResonanceData) internal resonanceDataMapping;//RoundID ResonanceData Mapping

    //address User Mapping
	mapping(address => User) userMapping;

    //addup
    uint AddupInvestUSD = 0;

    //ETT Token Pool
    uint ETTPool_User = ETTWei * 9900000;

    uint ETTPool_Dev = ETTWei * 1100000;
    uint ETTPool_Dev_RwAddup = 0;
    uint40 ETTPool_Dev_LastRwTime = uint40(now + 365 * 1 days);

    /**
     * @dev the content of contract is Beginning
     */
	constructor (
        address _devAddr,
        address _USDTAddr
    )
        public
    {
        //set addr
        devAddr = _devAddr;
        USDTToken = _USDTAddr;

        //init ResonanceData
        ResonanceData storage resonance = resonanceDataMapping[rid];
        if (resonance.ratio == 0) {
            resonance.time = uint40(now);
            resonance.ratio = getResonanceRatio(rid);
        }
    }

    /**
     * @dev the invest of contract is Beginning
     * @param money USDT amount for invest
     * @param rCode recommend code
     */
	function invest(uint money, address rCode)
        public
        isHuman()
    {
        address code = msg.sender;

        //判断是投资范围
        require(
            money == USDTWei * 2000
            || money == USDTWei * 1000
            || money == USDTWei * 500
            || money == USDTWei * 100
            , "invalid invest range");

        //init userInfo
        uint[1] memory user_data;
        (user_data, , ) = _getUserInfo(msg.sender);
        uint user_id = user_data[0];
		if (user_id == 0) {
			_registerUser(msg.sender, code, rCode);
            (user_data, , ) = _getUserInfo(msg.sender);
            user_id = user_data[0];
		}

		User storage user = userMapping[msg.sender];
		if (user.id == 0) {
            user.id = user_id;
		}

        //判断是已投资
        require(user.investMoney == 0, "Has been invested");

        //投资等级
        uint8 investLevel = 0;
        if(money == USDTWei * 2000) {
            investLevel = 4;
        } else if(money == USDTWei * 1000) {
            investLevel = 3;
        } else if(money == USDTWei * 500) {
            investLevel = 2;
        } else if(money == USDTWei * 100) {
            investLevel = 1;
        }
        require(investLevel >= user.investLevel,"invalid invest Level");

        if(AddupInvestUSD < USDTWei * 500000) {
            //Transfer USDT Token to Contract
            getTokenFormUser_USDT(USDTToken, msg.sender, money);
        } else {
            uint ETTMoney = money.mul(resonanceDataMapping[rid].ratio).mul(30).div(100);

            //Transfer USDT Token to Contract
            getTokenFormUser_USDT(USDTToken, msg.sender, money.mul(70).div(100));
            //Transfer ETT Token to Contract
            getTokenFormUser(msg.sender, ETTMoney);

            //add user Token pool
            ETTPool_User += ETTMoney;
        }

        //send USDT Token to dev addr
        sendTokenToUser_USDT(USDTToken, devAddr, money.div(20));

        //addup
        AddupInvestUSD += money;

        //user invest info
        user.investAmountAddup += money;
        user.investMoney = money;
        user.investAddupStaticBonus = 0;
        user.investAddupDynamicBonus = 0;
        user.investOutMultiple = 22;
        user.investLevel = investLevel;
        user.investTime = uint40(now);
        user.investLastRwTime = uint40(now);

        //update Ratio
        updateRatio(money);

        //触发更新直推投资出局倍数
        updateUser_Parent(rCode, money);

        emit InvestEvent(msg.sender, code, rCode, money, now);
	}

    /**
     * @dev settlement
     */
    function settlement()
        public
        isHuman()
    {
		User storage user = userMapping[msg.sender];
        checkUserID(user.id);

        require(user.investMoney > 0, "uninvested or out");
        require(now >= user.investLastRwTime, "not release time");

        //reacquire rCode
        address rCode;
        (, , rCode) = _getUserInfo(msg.sender);

        //-----------Static Start
        uint settlementNumber_base = (now - user.investLastRwTime) / 1 days;
        if (user.investMoney > 0 && settlementNumber_base > 0) 
        {
            uint moneyBonus_base = user.investMoney * getScaleByLevel(user.investLevel) / 1000;
            uint settlementNumber = settlementNumber_base;
            uint settlementMaxMoney = 0;
            if(user.investMoney * user.investOutMultiple / 10 >= user.investAddupStaticBonus + user.investAddupDynamicBonus) {
                settlementMaxMoney = user.investMoney * user.investOutMultiple / 10 - (user.investAddupStaticBonus + user.investAddupDynamicBonus);
            }
            uint moneyBonus = 0;
            if (moneyBonus_base * settlementNumber > settlementMaxMoney) 
            {
                settlementNumber = settlementMaxMoney / moneyBonus_base;
                if (moneyBonus_base * settlementNumber < settlementMaxMoney) {
                    settlementNumber ++;
                }
                if (settlementNumber > settlementNumber_base) {
                    settlementNumber = settlementNumber_base;
                }
                // moneyBonus = moneyBonus_base * settlementNumber;
                moneyBonus = settlementMaxMoney;
            } else {
                moneyBonus = moneyBonus_base * settlementNumber;
            }

            user.takeBonusWallet += moneyBonus;
            user.bonusStaticAmount += moneyBonus;

            user.investAddupStaticBonus += moneyBonus;
            user.investLastRwTime += uint40(settlementNumber * 1 days);
            //check out
            if (user.investAddupStaticBonus + user.investAddupDynamicBonus >= user.investMoney * user.investOutMultiple / 10) {
                user.investAmountOut += user.investMoney;
                user.investMoney = 0;//out
            }

            //Calculate the bonus (Daily Dividend)
            // countBonus_DailyDividend(rCode, moneyBonus, user.investMoney);
            countBonus_DailyDividend(rCode, moneyBonus_base * settlementNumber, user.investMoney);
        }
        //-----------Static End
	}

    /**
     * @dev the take bonus of contract is Beginning
     * @param _type take type 0:default 100%USDT, 1:30%ETT 70%USDT, 2:50%ETT 50%USDT, 3:70%ETT 30%USDT, 4:100%ETT 0%USDT
     */
    function takeBonus(uint8 _type)
        public
        isHuman()
    {
		User storage user = userMapping[msg.sender];
		checkUserID(user.id);

		require(user.takeBonusWallet >= USDTWei * 1, "invalid amount");

        uint sendDevMoney_USDT = user.takeBonusWallet.div(20);
		uint takeMoney_USDT = user.takeBonusWallet.sub(sendDevMoney_USDT);
        uint takeMoney_USDT_ETT = 0;

        //Calculation amount
        (takeMoney_USDT, takeMoney_USDT_ETT) = calculationTakeBonus(_type, takeMoney_USDT);

        bool isEnoughBalance = false;
        uint resultMoney = 0;

        //check send USDT
        //check USDT Enough Balance
        (isEnoughBalance, resultMoney) = isEnoughTokneBalance(USDTToken, takeMoney_USDT + sendDevMoney_USDT);
        if(isEnoughBalance == false)
        {
            require(resultMoney > 0, "not Enough Balance USDT");
            //correct
            sendDevMoney_USDT = resultMoney.div(20);
            takeMoney_USDT = resultMoney.sub(sendDevMoney_USDT);
            //Calculation amount
            (takeMoney_USDT, takeMoney_USDT_ETT) = calculationTakeBonus(_type, takeMoney_USDT);
        }

        //check send ETT
        if(takeMoney_USDT_ETT > 0)
        {
            uint ETTMoney = takeMoney_USDT_ETT.mul(resonanceDataMapping[rid].ratio);
            //check user Token pool
            if(ETTMoney > ETTPool_User) {
                ETTMoney = ETTPool_User;
                require(ETTMoney > 0, "not Enough Balance pool");
                //correct
                uint ETTMoney_USDT = ETTMoney.div(resonanceDataMapping[rid].ratio);
                sendDevMoney_USDT = sendDevMoney_USDT.mul(ETTMoney_USDT).div(takeMoney_USDT_ETT);
                takeMoney_USDT = takeMoney_USDT.mul(ETTMoney_USDT).div(takeMoney_USDT_ETT);
                takeMoney_USDT_ETT = ETTMoney_USDT;
            }

            //check ETT Enough Balance
            (isEnoughBalance, resultMoney) = isEnoughTokneBalance(address(this), ETTMoney);
            if(isEnoughBalance == false)
            {
                require(resultMoney > 0, "not Enough Balance ETT");
                //correct
                uint resultMoney_USDT = resultMoney.div(resonanceDataMapping[rid].ratio);
                sendDevMoney_USDT = sendDevMoney_USDT.mul(resultMoney_USDT).div(takeMoney_USDT_ETT);
                takeMoney_USDT = takeMoney_USDT.mul(resultMoney_USDT).div(takeMoney_USDT_ETT);
                takeMoney_USDT_ETT = resultMoney_USDT;
            }
        }

        if(sendDevMoney_USDT > 0)
        {
            //Transfer USDT Token to Dev
            sendTokenToUser_USDT(USDTToken, devAddr, sendDevMoney_USDT);
        }
        if(takeMoney_USDT > 0)
        {
            //Transfer USDT Token to User
            sendTokenToUser_USDT(USDTToken, msg.sender, takeMoney_USDT);
        }
        if(takeMoney_USDT_ETT > 0)
        {
            //Transfer ETT Token to User
            sendTokenToUser(msg.sender, takeMoney_USDT_ETT.mul(resonanceDataMapping[rid].ratio));
            ETTPool_User = ETTPool_User.sub(takeMoney_USDT_ETT.mul(resonanceDataMapping[rid].ratio));
        }

        user.takeBonusWallet = user.takeBonusWallet.sub(takeMoney_USDT).sub(takeMoney_USDT_ETT).sub(sendDevMoney_USDT);
        user.takeBonusAddup = user.takeBonusAddup.add(takeMoney_USDT).add(takeMoney_USDT_ETT).add(sendDevMoney_USDT);

        emit TakeBonusEvent(msg.sender, _type, takeMoney_USDT, takeMoney_USDT_ETT, now);
	}

    /**
     * @dev settlement ETT Pool Dev
     */
    function settlement_Dev()
        public
        isHuman()
    {
        require(now >= ETTPool_Dev_LastRwTime, "not release time");
        require(ETTPool_Dev > ETTPool_Dev_RwAddup, "release done");
        
        uint settlementNumber_base =  (now - ETTPool_Dev_LastRwTime) / 1 days;
        uint moneyBonus_base = ETTPool_Dev / 365;
        uint settlementNumber = settlementNumber_base;
        uint settlementMaxMoney = 0;
        if(ETTPool_Dev >= ETTPool_Dev_RwAddup) {
            settlementMaxMoney = ETTPool_Dev - ETTPool_Dev_RwAddup;
        }
        uint moneyBonus = 0;
        if (moneyBonus_base * settlementNumber > settlementMaxMoney) 
        {
            settlementNumber = settlementMaxMoney / moneyBonus_base;
            if (moneyBonus_base * settlementNumber < settlementMaxMoney) {
                settlementNumber ++;
            }
            if (settlementNumber > settlementNumber_base) {
                settlementNumber = settlementNumber_base;
            }
            // moneyBonus = moneyBonus_base * settlementNumber;
            moneyBonus = settlementMaxMoney;
        } else {
            moneyBonus = moneyBonus_base * settlementNumber;
        }

        //Transfer ETT Token to Dev
        sendTokenToUser(devAddr, moneyBonus);

        //update Dev_Rw
        ETTPool_Dev_RwAddup += moneyBonus;
        ETTPool_Dev_LastRwTime += uint40(settlementNumber * 1 days);
	}

    /**
     * @dev Show contract state view
     * @return info contract state view
     */
    function stateView()
        public
        view
        returns (uint[8] memory info)
    {
        info[0] = _getCurrentUserID();
        info[1] = rid;
        info[2] = resonanceDataMapping[rid].ratio;
        info[3] = resonanceDataMapping[rid].investMoney;
        info[4] = resonanceDataMapping[rid].time;
        info[5] = AddupInvestUSD;
        info[6] = ETTPool_Dev_RwAddup;
        info[7] = ETTPool_Dev_LastRwTime;

		return (info);
	}

    /**
     * @dev get the user info based
     * @param addr user addressrd
     * @return info user info
     */
	function getUserByAddress(
        address addr
    )
        public
        view
        returns (uint[14] memory info, address code, address rCode)
    {
        uint[1] memory user_data;
        (user_data, code, rCode) = _getUserInfo(addr);
        uint user_id = user_data[0];

		User storage user = userMapping[addr];

		info[0] = user_id;
        info[1] = user.investAmountAddup;
        info[2] = user.investAmountOut;
        info[3] = user.investMoney;
        info[4] = user.investAddupStaticBonus;
        info[5] = user.investAddupDynamicBonus;
        info[6] = user.investOutMultiple;
        info[7] = user.investLevel;
        info[8] = user.investTime;
        info[9] = user.investLastRwTime;
        info[10] = user.bonusStaticAmount;
        info[11] = user.bonusDynamicAmonut;
        info[12] = user.takeBonusWallet;
        info[13] = user.takeBonusAddup;
		return (info, code, rCode);
	}

    /**
     * @dev update Resonance Ratio
     * @param investMoney invest USDT amount
     */
	function updateRatio(uint investMoney)
        private
    {
        ResonanceData storage resonance = resonanceDataMapping[rid];
        resonance.investMoney += investMoney;

        //check
        if(AddupInvestUSD >= USDTWei * 500000)
        {
            uint newRatio = 0;
            uint newResonanceInvestMoney = 0;
            if(rid == 1)
            {
                if(resonance.investMoney >= USDTWei * 600000)
                {
                    newResonanceInvestMoney = resonance.investMoney - USDTWei * 600000;
                    resonance.investMoney = USDTWei * 600000;
                    newRatio = getResonanceRatio(rid + 1);
                }
            } else {
                if(resonance.investMoney >= USDTWei * 100000)
                {
                    newResonanceInvestMoney = resonance.investMoney - USDTWei * 100000;
                    resonance.investMoney = USDTWei * 100000;
                    newRatio = getResonanceRatio(rid + 1);
                }
            }

            if (newRatio > 0) 
            {
                rid ++;
                resonance = resonanceDataMapping[rid];
                resonance.time = uint40(now);
                resonance.ratio = newRatio;
                //Continuous rise
                resonance.investMoney = newResonanceInvestMoney;
                updateRatio(0);
            }
        }
	}

        /**
     * @dev update Parent User
     * @param rCode user recommend code
     * @param money invest money
     */
	function updateUser_Parent(address rCode, uint money)
        private
    {
		if (rCode == address(0)) {
            return;
        }

        User storage user = userMapping[rCode];

        //-----------updateUser_Parent Start
        if (user.investMoney > 0 && money >= user.investMoney) {
            user.investOutMultiple = 30;
        }
        //-----------updateUser_Parent End
	}

    /**
     * @dev Calculate the bonus (Daily Dividend)
     * @param rCode user recommend code
     * @param money base money
     * @param investMoney invest money
     */
	function countBonus_DailyDividend(address rCode, uint money, uint investMoney)
        private
    {
		address tmpReferrerCode = rCode;
        address tmpUser_rCode;

		for (uint i = 1; i <= 10; i++) {
			if (tmpReferrerCode == address(0)) {
				break;
			}

			User storage user = userMapping[tmpReferrerCode];

            //last rRcode and currUserInfo
            (, , tmpUser_rCode) = _getUserInfo(tmpReferrerCode);

            //-----------DailyDividend Start
            if (user.investMoney > 0) 
            {
                uint moneyBonusDailyDividend = 0;

                (uint scale, uint algebra) = getScaleByDailyDividend(user.investLevel);
                if (algebra >= i) 
                {
                    moneyBonusDailyDividend = money * scale / 1000;
                    //burns
                    if (user.investMoney < investMoney) {
                        moneyBonusDailyDividend = moneyBonusDailyDividend * user.investMoney / investMoney;
                    }
                    if (moneyBonusDailyDividend > 0) {
                        //check out

                        if (user.investAddupStaticBonus + user.investAddupDynamicBonus + moneyBonusDailyDividend >= user.investMoney * user.investOutMultiple / 10) {
                            moneyBonusDailyDividend = user.investMoney * user.investOutMultiple / 10 - (user.investAddupStaticBonus + user.investAddupDynamicBonus);

                            user.investAmountOut += user.investMoney;
                            user.investMoney = 0;//out
                        }
                        user.takeBonusWallet += moneyBonusDailyDividend;
                        user.bonusDynamicAmonut += moneyBonusDailyDividend;
                        user.investAddupDynamicBonus += moneyBonusDailyDividend;
                    }
                }
            }
            //-----------DailyDividend End

            tmpReferrerCode = tmpUser_rCode;
		}
	}


    /**
     * @dev Calculation amount
     * @param _type take type
     * @param takeMoney take Money
     * @return takeMoney_USDT take Money USDT
     * @return takeMoney_USDT_ETT take Money USDT(ETT)
     */
	function calculationTakeBonus(uint8 _type, uint takeMoney)
        internal
        pure
        returns (uint takeMoney_USDT, uint takeMoney_USDT_ETT)
    {
		takeMoney_USDT = takeMoney;

        if(_type == 1) {
            //ETT 30%
            takeMoney_USDT_ETT = takeMoney_USDT.mul(30).div(100);
        }
        else if(_type == 2) {
            //ETT 50%
            takeMoney_USDT_ETT = takeMoney_USDT.div(2);
        }
        else if(_type == 3) {
            //ETT 70%
            takeMoney_USDT_ETT = takeMoney_USDT.mul(70).div(100);
        }
        else if(_type == 4) {
            //ETT 100%
            takeMoney_USDT_ETT = takeMoney_USDT;
        }
        takeMoney_USDT = takeMoney_USDT.sub(takeMoney_USDT_ETT);
	}
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"_devAddr","type":"address"},{"internalType":"address","name":"_USDTAddr","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_owner","type":"address"},{"indexed":true,"internalType":"address","name":"_spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_addr","type":"address"},{"indexed":true,"internalType":"address","name":"_code","type":"address"},{"indexed":true,"internalType":"address","name":"_rCode","type":"address"},{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"time","type":"uint256"}],"name":"InvestEvent","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_addr","type":"address"},{"indexed":false,"internalType":"uint256","name":"_type","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_value_USDT","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_value_ETT","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"time","type":"uint256"}],"name":"TakeBonusEvent","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_from","type":"address"},{"indexed":true,"internalType":"address","name":"_to","type":"address"},{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"},{"internalType":"address","name":"_spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_spender","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"getUserByAddress","outputs":[{"internalType":"uint256[14]","name":"info","type":"uint256[14]"},{"internalType":"address","name":"code","type":"address"},{"internalType":"address","name":"rCode","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"money","type":"uint256"},{"internalType":"address","name":"rCode","type":"address"}],"name":"invest","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"code","type":"address"}],"name":"isUsedCode","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"settlement","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"settlement_Dev","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"stateView","outputs":[{"internalType":"uint256[8]","name":"info","type":"uint256[8]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint8","name":"_type","type":"uint8"}],"name":"takeBonus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"}]

6080604052620f4240600655670de0b6b3a764000060075564e8d4a51000600855600060098190556001600f5560128190556a083068134c1ffd5380000060135569e8ef1e96ae38978000006014556015556016805464ffffffffff1916426301e133800164ffffffffff161790553480156200007b57600080fd5b50604051620027653803806200276583398181016040526040811015620000a157600080fd5b50805160209182015160408051808201825260038082526245415360e81b828701818152845180860190955282855296840152815194959394919362a7d8c0926012923092620000f19262000295565b5083516200010790600490602087019062000295565b506005805460ff191660ff84811691909117918290556200013a91859116600a0a62000212602090811b6200160317901c565b60008181556001600160a01b03831680825260016020908152604080842085905580519485525191937fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef929081900390910190a35050600e80546001600160a01b038088166001600160a01b031992831617909255600d8054928716929091169190911790555050600f54600090815260106020526040902060018101549091506200020957805464ffffffffff19164264ffffffffff16178155600f54620002039062000277565b60018201555b50505062000331565b600082620002235750600062000271565b50818102818382816200023257fe5b0414620002715760405162461bcd60e51b8152600401808060200182810382526021815260200180620027446021913960400191505060405180910390fd5b92915050565b600060018203600a01600854606402816200028e57fe5b0492915050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10620002d857805160ff191683800117855562000308565b8280016001018555821562000308579182015b8281111562000308578251825591602001919060010190620002eb565b50620003169291506200031a565b5090565b5b808211156200031657600081556001016200031b565b61240380620003416000396000f3fe608060405234801561001057600080fd5b50600436106101005760003560e01c80634c4a3c25116100975780637178af45116100665780637178af451461039257806395d89b411461039a578063a9059cbb146103a2578063dd62ed3e146103ce57610100565b80634c4a3c25146102a457806351160630146102e557806369c212f6146102ed57806370a082311461036c57610100565b806323b872dd116100d357806323b872dd146101fe5780632ce8d4bc14610234578063313ce5671461025a5780633d103b971461027857610100565b806301c79bee1461010557806306fdde0314610127578063095ea7b3146101a457806318160ddd146101e4575b600080fd5b6101256004803603602081101561011b57600080fd5b503560ff166103fc565b005b61012f61084b565b6040805160208082528351818301528351919283929083019185019080838360005b83811015610169578181015183820152602001610151565b50505050905090810190601f1680156101965780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6101d0600480360360408110156101ba57600080fd5b506001600160a01b0381351690602001356108d9565b604080519115158252519081900360200190f35b6101ec6109ac565b60408051918252519081900360200190f35b6101d06004803603606081101561021457600080fd5b506001600160a01b038135811691602081013590911690604001356109b2565b6101d06004803603602081101561024a57600080fd5b50356001600160a01b0316610bc9565b610262610bdc565b6040805160ff9092168252519081900360200190f35b6101256004803603604081101561028e57600080fd5b50803590602001356001600160a01b0316610be5565b6102ac610f9e565b604051808261010080838360005b838110156102d25781810151838201526020016102ba565b5050505090500191505060405180910390f35b610125611011565b6103136004803603602081101561030357600080fd5b50356001600160a01b03166112bf565b60405180846101c080838360005b83811015610339578181015183820152602001610321565b50505050905001836001600160a01b03168152602001826001600160a01b03168152602001935050505060405180910390f35b6101ec6004803603602081101561038257600080fd5b50356001600160a01b03166113a4565b6101256113bf565b61012f611569565b6101d0600480360360408110156103b857600080fd5b506001600160a01b0381351690602001356115c4565b6101ec600480360360408110156103e457600080fd5b506001600160a01b03813581169160200135166115d8565b33321461043e576040805162461bcd60e51b815260206004820152600b60248201526a68756d616e73206f6e6c7960a81b604482015290519081900360640190fd5b33600090815260116020526040902080546104589061165d565b600654600982015410156104a4576040805162461bcd60e51b815260206004820152600e60248201526d1a5b9d985b1a5908185b5bdd5b9d60921b604482015290519081900360640190fd5b60098101546000906104b79060146116a3565b905060006104d28284600901546116e590919063ffffffff16565b905060006104e08583611727565b600d5491935091506000908190610502906001600160a01b03168686016117a2565b90925090508161058a5760008111610561576040805162461bcd60e51b815260206004820152601760248201527f6e6f7420456e6f7567682042616c616e63652055534454000000000000000000604482015290519081900360640190fd5b61056c8160146116a3565b945061057881866116e5565b93506105848785611727565b90945092505b821561070657600f546000908152601060205260408120600101546105b0908590611603565b905060135481111561065d575060135480610612576040805162461bcd60e51b815260206004820152601760248201527f6e6f7420456e6f7567682042616c616e636520706f6f6c000000000000000000604482015290519081900360640190fd5b600f546000908152601060205260408120600101546106329083906116a3565b9050610648856106428984611603565b906116a3565b9650610658856106428884611603565b955093505b61066730826117a2565b90935091508261070457600082116106bf576040805162461bcd60e51b81526020600482015260166024820152751b9bdd08115b9bdd59da0810985b185b98d94811551560521b604482015290519081900360640190fd5b600f546000908152601060205260408120600101546106df9084906116a3565b90506106ef856106428984611603565b96506106ff856106428884611603565b955093505b505b841561072957600d54600e54610729916001600160a01b0390811691168761183f565b831561074657600d54610746906001600160a01b0316338661183f565b82156107a857600f54600090815260106020526040902060010154610777903390610772908690611603565b611959565b600f546000908152601060205260409020600101546107a49061079b908590611603565b601354906116e5565b6013555b6107cd856107c7856107c7888b600901546116e590919063ffffffff16565b906116e5565b6009870155600a8601546107f19086906107eb90869082908961196e565b9061196e565b600a8701556040805160ff8916815260208101869052808201859052426060820152905133917fd9cb4ae56afde26a5335323e67967ed65e306e1a933ac789e7320dfae6b8dd19919081900360800190a250505050505050565b6003805460408051602060026001851615610100026000190190941693909304601f810184900484028201840190925281815292918301828280156108d15780601f106108a6576101008083540402835291602001916108d1565b820191906000526020600020905b8154815290600101906020018083116108b457829003601f168201915b505050505081565b600081158061090957503360009081526002602090815260408083206001600160a01b0387168452909152902054155b6109445760405162461bcd60e51b815260040180806020018281038252602e81526020018061235e602e913960400191505060405180910390fd5b3360008181526002602090815260408083206001600160a01b03881680855290835292819020869055805186815290519293927f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925929181900390910190a35060015b92915050565b60005490565b60006001600160a01b0383166109f95760405162461bcd60e51b815260040180806020018281038252602181526020018061238c6021913960400191505060405180910390fd5b6001600160a01b038416600090815260016020526040902054821115610a58576040805162461bcd60e51b815260206004820152600f60248201526e6c61636b206f662062616c616e636560881b604482015290519081900360640190fd5b6001600160a01b0384166000908152600260209081526040808320338452909152902054821115610ad0576040805162461bcd60e51b815260206004820181905260248201527f6c61636b206f66207472616e736665722062616c616e636520616c6c6f776564604482015290519081900360640190fd5b6001600160a01b0384166000908152600260209081526040808320338452909152902054610afe90836116e5565b6001600160a01b038516600081815260026020908152604080832033845282528083209490945591815260019091522054610b3990836116e5565b6001600160a01b038086166000908152600160205260408082209390935590851681522054610b68908361196e565b6001600160a01b0380851660008181526001602090815260409182902094909455805186815290519193928816927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef92918290030190a35060019392505050565b6000610bd4826119c6565b90505b919050565b60055460ff1681565b333214610c27576040805162461bcd60e51b815260206004820152600b60248201526a68756d616e73206f6e6c7960a81b604482015290519081900360640190fd5b60065433906107d002831480610c4257506006546103e80283145b80610c5257506006546101f40283145b80610c61575060065460640283145b610ca9576040805162461bcd60e51b8152602060048201526014602482015273696e76616c696420696e766573742072616e676560601b604482015290519081900360640190fd5b610cb16122e1565b610cba336119e6565b5050805190915080610ce457610cd1338486611a4d565b610cda336119e6565b5050805190925090505b3360009081526011602052604090208054610cfd578181555b600381015415610d48576040805162461bcd60e51b815260206004820152601160248201527012185cc81899595b881a5b9d995cdd1959607a1b604482015290519081900360640190fd5b60006006546107d002871415610d6057506004610d9d565b6006546103e802871415610d7657506003610d9d565b6006546101f402871415610d8c57506002610d9d565b600654606402871415610d9d575060015b600682015460ff61010090910481169082161015610df9576040805162461bcd60e51b81526020600482015260146024820152731a5b9d985b1a59081a5b9d995cdd0813195d995b60621b604482015290519081900360640190fd5b6006546207a120026012541015610e2657600d54610e21906001600160a01b03163389611c62565b610e97565b600f54600090815260106020526040812060010154610e5a9060649061064290601e90610e54908d90611603565b90611603565b600d54909150610e83906001600160a01b031633610e7e60646106428d6046611603565b611c62565b610e8d3382611d5d565b6013805490910190555b600d54600e54610ebe916001600160a01b039081169116610eb98a60146116a3565b61183f565b601280548801905560018201805488019055600382018790556000600483018190556005830155600682018054601660ff199091161761ff00191661010060ff8416021766ffffffffff00001916620100004264ffffffffff169081029190911764ffffffffff60381b1916600160381b91909102179055610f3f87611d6e565b610f498688611e74565b6040805188815242602082015281516001600160a01b03808a16939089169233927f84240542a1fb013913d7acd4a99a1bd8618f8f82ca151785357e6e2c2410efc2929181900390910190a450505050505050565b610fa66122ff565b610fae611ecf565b8152600f546020808301829052600082815260108083526040808320600181015491870191909152600281015460608701529390915290525464ffffffffff908116608083015260125460a083015260155460c08301526016541660e082015290565b333214611053576040805162461bcd60e51b815260206004820152600b60248201526a68756d616e73206f6e6c7960a81b604482015290519081900360640190fd5b336000908152601160205260409020805461106d9061165d565b60008160030154116110ba576040805162461bcd60e51b81526020600482015260116024820152701d5b9a5b9d995cdd1959081bdc881bdd5d607a1b604482015290519081900360640190fd5b6006810154600160381b900464ffffffffff16421015611114576040805162461bcd60e51b815260206004820152601060248201526f6e6f742072656c656173652074696d6560801b604482015290519081900360640190fd5b600061111f336119e6565b600685015490935060009250620151809150600160381b900464ffffffffff164203049050600083600301541180156111585750600081115b156112ba5760068301546000906103e89061117a90610100900460ff16611ed5565b8560030154028161118757fe5b600586015460048701546006880154600389015494909304945085936000939190920191600a9160ff160204106111df5760058601546004870154600688015460038901549190920191600a9160ff90911602040390505b600081838502111561121b578382816111f457fe5b049250818385021015611208576001909201915b84831115611214578492505b5080611220565b508282025b60098701805482019055600787018054820190556004870180548201905560068701805464ffffffffff600160381b8083048216620151808802019091160264ffffffffff60381b1990911617908190556003880154600a9160ff1602048760050154886004015401106112a4576003870180546002890180549091019055600090555b6112b5868486028960030154611f23565b505050505b505050565b6112c761231e565b6000806112d26122e1565b6112db856119e6565b91516001600160a01b03979097166000908152601160209081526040918290209888526001890154908801526002880154908701526003870154606087015260048701546080870152600587015460a0870152600687015460ff80821660c089015261010080830490911660e089015264ffffffffff620100008304811691890191909152600160381b90910416610120870152600787015461014087015260088701546101608701526009870154610180870152600a909601546101a0860152939592505050565b6001600160a01b031660009081526001602052604090205490565b333214611401576040805162461bcd60e51b815260206004820152600b60248201526a68756d616e73206f6e6c7960a81b604482015290519081900360640190fd5b60165464ffffffffff16421015611452576040805162461bcd60e51b815260206004820152601060248201526f6e6f742072656c656173652074696d6560801b604482015290519081900360640190fd5b60155460145411611499576040805162461bcd60e51b815260206004820152600c60248201526b72656c6561736520646f6e6560a01b604482015290519081900360640190fd5b601654600090620151809064ffffffffff164203049050600061016d601454816114bf57fe5b04905060008290506000601554601454106114dd5750601554601454035b6000818385021115611519578382816114f257fe5b049250818385021015611506576001909201915b84831115611512578492505b508061151e565b508282025b600e54611534906001600160a01b031682611959565b60158054919091019055506016805464ffffffffff198116620151809390930264ffffffffff91821601169190911790555050565b6004805460408051602060026001851615610100026000190190941693909304601f810184900484028201840190925281815292918301828280156108d15780601f106108a6576101008083540402835291602001916108d1565b60006115d1338484612063565b9392505050565b6001600160a01b03918216600090815260026020908152604080832093909416825291909152205490565b600082611612575060006109a6565b508181028183828161162057fe5b04146109a65760405162461bcd60e51b81526004018080602001828103825260218152602001806123ad6021913960400191505060405180910390fd5b806116a0576040805162461bcd60e51b815260206004820152600e60248201526d1d5cd95c881b9bdd08195e1a5cdd60921b604482015290519081900360640190fd5b50565b60006115d183836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f00000000000081525061212c565b60006115d183836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f7700008152506121cb565b806000600160ff8516141561174d57611746606461064284601e611603565b905061178f565b8360ff1660021415611764576117468260026116a3565b8360ff1660031415611780576117466064610642846046611603565b8360ff166004141561178f5750805b61179982826116e5565b91509250929050565b600080836001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b1580156117f257600080fd5b505afa158015611806573d6000803e3d6000fd5b505050506040513d602081101561181c57600080fd5b50519050808311156118315760009150611838565b5060019050815b9250929050565b816001600160a01b038116611887576040805162461bcd60e51b81526020600482015260096024820152683d32b9379030b2323960b91b604482015290519081900360640190fd5b8361189a816001600160a01b0316612225565b6118dc576040805162461bcd60e51b815260206004820152600e60248201526d3737ba103a37b5b2b71030b2323960911b604482015290519081900360640190fd5b821561195257846001600160a01b031663a9059cbb85856040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050600060405180830381600087803b15801561193957600080fd5b505af115801561194d573d6000803e3d6000fd5b505050505b5050505050565b801561196a576112ba308383612063565b5050565b818101828110156109a6576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b6001600160a01b039081166000908152600b602052604090205416151590565b6119ee6122e1565b6000806119f961233d565b5050506001600160a01b039182166000908152600c60209081526040918290208251606081018452815480825260018301548716938201938452600290920154909516949092019384529082525191519092565b6001600160a01b0383166000908152600c602052604090208054611c5c5760095415611b5257611a7c82610bc9565b611ac3576040805162461bcd60e51b815260206004820152601360248201527211108e881c90dbd919481b9bdd08195e1a5cdd606a1b604482015290519081900360640190fd5b6001600160a01b038083166000908152600b60205260409020541633811415611b33576040805162461bcd60e51b815260206004820152601760248201527f44423a2072436f64652063616e27742062652073656c66000000000000000000604482015290519081900360640190fd5b506002810180546001600160a01b0319166001600160a01b0384161790555b611b5b83610bc9565b15611ba0576040805162461bcd60e51b815260206004820152601060248201526f11108e8818dbd919481a5cc81d5cd95960821b604482015290519081900360640190fd5b6001600160a01b038316611bfb576040805162461bcd60e51b815260206004820152601760248201527f44423a20696e76616c696420696e7669746520636f6465000000000000000000604482015290519081900360640190fd5b6009805460019081018083558355820180546001600160a01b03199081166001600160a01b038781169182179093556000908152600b6020908152604080832080548516958b16958617905594548252600a90529290922080549092161790555b50505050565b816001600160a01b038116611caa576040805162461bcd60e51b81526020600482015260096024820152683d32b9379030b2323960b91b604482015290519081900360640190fd5b83611cbd816001600160a01b0316612225565b611cff576040805162461bcd60e51b815260206004820152600e60248201526d3737ba103a37b5b2b71030b2323960911b604482015290519081900360640190fd5b821561195257604080516323b872dd60e01b81526001600160a01b038681166004830152306024830152604482018690529151918716916323b872dd9160648082019260009290919082900301818387803b15801561193957600080fd5b801561196a576112ba823083612063565b600f546000908152601060205260409020600281018054830190556006546012546207a1209091021161196a57600080600f5460011415611dea57600654620927c002836002015410611de55750600654600283018054620927c090920290819055600f54910390611de290600101612261565b91505b611e26565b600654620186a002836002015410611e265750600654600283018054620186a090920290819055600f54910390611e2390600101612261565b91505b8115611c5c57600f80546001908101918290556000918252601060205260408220805464ffffffffff19164264ffffffffff16178155908101849055600281018390559350611c5c90611d6e565b6001600160a01b038216611e875761196a565b6001600160a01b0382166000908152601160205260409020600381015415801590611eb6575080600301548210155b156112ba5760068101805460ff1916601e179055505050565b60095490565b60008160011415611ee85750600a610bd7565b8160021415611ef95750600c610bd7565b8160031415611f0a5750600f610bd7565b8160041415611f1b5750600f610bd7565b506000919050565b82600060015b600a811161205b576001600160a01b038316611f445761205b565b6001600160a01b0383166000908152601160205260409020611f65846119e6565b600384015490955015915061204d905057600681015460009081908190611f9390610100900460ff1661227e565b91509150848110612049576103e88983020492508784600301541015611fc657878460030154840281611fc257fe5b0492505b82156120495760068401546003850154600a9160ff160204838560050154866004015401011061202a5760058401546004850154600686015460038701805460028901805482019055600090915591909201600a60ff909316909102919091040392505b6009840180548401905560088401805484019055600584018054840190555b5050505b509091508190600101611f29565b505050505050565b60006001600160a01b0383166120aa5760405162461bcd60e51b815260040180806020018281038252602181526020018061238c6021913960400191505060405180910390fd5b6001600160a01b038416600090815260016020526040902054821115612109576040805162461bcd60e51b815260206004820152600f60248201526e6c61636b206f662062616c616e636560881b604482015290519081900360640190fd5b6001600160a01b038416600090815260016020526040902054610b3990836116e5565b600081836121b85760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561217d578181015183820152602001612165565b50505050905090810190601f1680156121aa5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b508284816121c257fe5b04949350505050565b6000818484111561221d5760405162461bcd60e51b815260206004820181815283516024840152835190928392604490910191908501908083836000831561217d578181015183820152602001612165565b505050900390565b6000813f7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a47081158015906122595750808214155b949350505050565b600060018203600a016008546064028161227757fe5b0492915050565b600080826001141561229657506064905060016122dc565b82600214156122ab5750603c905060056122dc565b82600314156122c057506050905060086122dc565b82600414156122d5575060649050600a6122dc565b5060009050805b915091565b60405180602001604052806001906020820280368337509192915050565b6040518061010001604052806008906020820280368337509192915050565b604051806101c00160405280600e906020820280368337509192915050565b60408051606081018252600080825260208201819052918101919091529056fe726573657420616c6c6f77616e636520746f2030206265666f7265206368616e676520697427732076616c75652e7472616e73666572206164647220697320746865207a65726f2061646472657373536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f77a26469706673582212206d02311a90b9127e1fde2853a5cac04a3e7838df8a507c97ac88de2bea740b6d64736f6c634300060c0033536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f77000000000000000000000000d692d6626cad6d5bf6780660d6f4a2f1ca989f89000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec7

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106101005760003560e01c80634c4a3c25116100975780637178af45116100665780637178af451461039257806395d89b411461039a578063a9059cbb146103a2578063dd62ed3e146103ce57610100565b80634c4a3c25146102a457806351160630146102e557806369c212f6146102ed57806370a082311461036c57610100565b806323b872dd116100d357806323b872dd146101fe5780632ce8d4bc14610234578063313ce5671461025a5780633d103b971461027857610100565b806301c79bee1461010557806306fdde0314610127578063095ea7b3146101a457806318160ddd146101e4575b600080fd5b6101256004803603602081101561011b57600080fd5b503560ff166103fc565b005b61012f61084b565b6040805160208082528351818301528351919283929083019185019080838360005b83811015610169578181015183820152602001610151565b50505050905090810190601f1680156101965780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6101d0600480360360408110156101ba57600080fd5b506001600160a01b0381351690602001356108d9565b604080519115158252519081900360200190f35b6101ec6109ac565b60408051918252519081900360200190f35b6101d06004803603606081101561021457600080fd5b506001600160a01b038135811691602081013590911690604001356109b2565b6101d06004803603602081101561024a57600080fd5b50356001600160a01b0316610bc9565b610262610bdc565b6040805160ff9092168252519081900360200190f35b6101256004803603604081101561028e57600080fd5b50803590602001356001600160a01b0316610be5565b6102ac610f9e565b604051808261010080838360005b838110156102d25781810151838201526020016102ba565b5050505090500191505060405180910390f35b610125611011565b6103136004803603602081101561030357600080fd5b50356001600160a01b03166112bf565b60405180846101c080838360005b83811015610339578181015183820152602001610321565b50505050905001836001600160a01b03168152602001826001600160a01b03168152602001935050505060405180910390f35b6101ec6004803603602081101561038257600080fd5b50356001600160a01b03166113a4565b6101256113bf565b61012f611569565b6101d0600480360360408110156103b857600080fd5b506001600160a01b0381351690602001356115c4565b6101ec600480360360408110156103e457600080fd5b506001600160a01b03813581169160200135166115d8565b33321461043e576040805162461bcd60e51b815260206004820152600b60248201526a68756d616e73206f6e6c7960a81b604482015290519081900360640190fd5b33600090815260116020526040902080546104589061165d565b600654600982015410156104a4576040805162461bcd60e51b815260206004820152600e60248201526d1a5b9d985b1a5908185b5bdd5b9d60921b604482015290519081900360640190fd5b60098101546000906104b79060146116a3565b905060006104d28284600901546116e590919063ffffffff16565b905060006104e08583611727565b600d5491935091506000908190610502906001600160a01b03168686016117a2565b90925090508161058a5760008111610561576040805162461bcd60e51b815260206004820152601760248201527f6e6f7420456e6f7567682042616c616e63652055534454000000000000000000604482015290519081900360640190fd5b61056c8160146116a3565b945061057881866116e5565b93506105848785611727565b90945092505b821561070657600f546000908152601060205260408120600101546105b0908590611603565b905060135481111561065d575060135480610612576040805162461bcd60e51b815260206004820152601760248201527f6e6f7420456e6f7567682042616c616e636520706f6f6c000000000000000000604482015290519081900360640190fd5b600f546000908152601060205260408120600101546106329083906116a3565b9050610648856106428984611603565b906116a3565b9650610658856106428884611603565b955093505b61066730826117a2565b90935091508261070457600082116106bf576040805162461bcd60e51b81526020600482015260166024820152751b9bdd08115b9bdd59da0810985b185b98d94811551560521b604482015290519081900360640190fd5b600f546000908152601060205260408120600101546106df9084906116a3565b90506106ef856106428984611603565b96506106ff856106428884611603565b955093505b505b841561072957600d54600e54610729916001600160a01b0390811691168761183f565b831561074657600d54610746906001600160a01b0316338661183f565b82156107a857600f54600090815260106020526040902060010154610777903390610772908690611603565b611959565b600f546000908152601060205260409020600101546107a49061079b908590611603565b601354906116e5565b6013555b6107cd856107c7856107c7888b600901546116e590919063ffffffff16565b906116e5565b6009870155600a8601546107f19086906107eb90869082908961196e565b9061196e565b600a8701556040805160ff8916815260208101869052808201859052426060820152905133917fd9cb4ae56afde26a5335323e67967ed65e306e1a933ac789e7320dfae6b8dd19919081900360800190a250505050505050565b6003805460408051602060026001851615610100026000190190941693909304601f810184900484028201840190925281815292918301828280156108d15780601f106108a6576101008083540402835291602001916108d1565b820191906000526020600020905b8154815290600101906020018083116108b457829003601f168201915b505050505081565b600081158061090957503360009081526002602090815260408083206001600160a01b0387168452909152902054155b6109445760405162461bcd60e51b815260040180806020018281038252602e81526020018061235e602e913960400191505060405180910390fd5b3360008181526002602090815260408083206001600160a01b03881680855290835292819020869055805186815290519293927f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925929181900390910190a35060015b92915050565b60005490565b60006001600160a01b0383166109f95760405162461bcd60e51b815260040180806020018281038252602181526020018061238c6021913960400191505060405180910390fd5b6001600160a01b038416600090815260016020526040902054821115610a58576040805162461bcd60e51b815260206004820152600f60248201526e6c61636b206f662062616c616e636560881b604482015290519081900360640190fd5b6001600160a01b0384166000908152600260209081526040808320338452909152902054821115610ad0576040805162461bcd60e51b815260206004820181905260248201527f6c61636b206f66207472616e736665722062616c616e636520616c6c6f776564604482015290519081900360640190fd5b6001600160a01b0384166000908152600260209081526040808320338452909152902054610afe90836116e5565b6001600160a01b038516600081815260026020908152604080832033845282528083209490945591815260019091522054610b3990836116e5565b6001600160a01b038086166000908152600160205260408082209390935590851681522054610b68908361196e565b6001600160a01b0380851660008181526001602090815260409182902094909455805186815290519193928816927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef92918290030190a35060019392505050565b6000610bd4826119c6565b90505b919050565b60055460ff1681565b333214610c27576040805162461bcd60e51b815260206004820152600b60248201526a68756d616e73206f6e6c7960a81b604482015290519081900360640190fd5b60065433906107d002831480610c4257506006546103e80283145b80610c5257506006546101f40283145b80610c61575060065460640283145b610ca9576040805162461bcd60e51b8152602060048201526014602482015273696e76616c696420696e766573742072616e676560601b604482015290519081900360640190fd5b610cb16122e1565b610cba336119e6565b5050805190915080610ce457610cd1338486611a4d565b610cda336119e6565b5050805190925090505b3360009081526011602052604090208054610cfd578181555b600381015415610d48576040805162461bcd60e51b815260206004820152601160248201527012185cc81899595b881a5b9d995cdd1959607a1b604482015290519081900360640190fd5b60006006546107d002871415610d6057506004610d9d565b6006546103e802871415610d7657506003610d9d565b6006546101f402871415610d8c57506002610d9d565b600654606402871415610d9d575060015b600682015460ff61010090910481169082161015610df9576040805162461bcd60e51b81526020600482015260146024820152731a5b9d985b1a59081a5b9d995cdd0813195d995b60621b604482015290519081900360640190fd5b6006546207a120026012541015610e2657600d54610e21906001600160a01b03163389611c62565b610e97565b600f54600090815260106020526040812060010154610e5a9060649061064290601e90610e54908d90611603565b90611603565b600d54909150610e83906001600160a01b031633610e7e60646106428d6046611603565b611c62565b610e8d3382611d5d565b6013805490910190555b600d54600e54610ebe916001600160a01b039081169116610eb98a60146116a3565b61183f565b601280548801905560018201805488019055600382018790556000600483018190556005830155600682018054601660ff199091161761ff00191661010060ff8416021766ffffffffff00001916620100004264ffffffffff169081029190911764ffffffffff60381b1916600160381b91909102179055610f3f87611d6e565b610f498688611e74565b6040805188815242602082015281516001600160a01b03808a16939089169233927f84240542a1fb013913d7acd4a99a1bd8618f8f82ca151785357e6e2c2410efc2929181900390910190a450505050505050565b610fa66122ff565b610fae611ecf565b8152600f546020808301829052600082815260108083526040808320600181015491870191909152600281015460608701529390915290525464ffffffffff908116608083015260125460a083015260155460c08301526016541660e082015290565b333214611053576040805162461bcd60e51b815260206004820152600b60248201526a68756d616e73206f6e6c7960a81b604482015290519081900360640190fd5b336000908152601160205260409020805461106d9061165d565b60008160030154116110ba576040805162461bcd60e51b81526020600482015260116024820152701d5b9a5b9d995cdd1959081bdc881bdd5d607a1b604482015290519081900360640190fd5b6006810154600160381b900464ffffffffff16421015611114576040805162461bcd60e51b815260206004820152601060248201526f6e6f742072656c656173652074696d6560801b604482015290519081900360640190fd5b600061111f336119e6565b600685015490935060009250620151809150600160381b900464ffffffffff164203049050600083600301541180156111585750600081115b156112ba5760068301546000906103e89061117a90610100900460ff16611ed5565b8560030154028161118757fe5b600586015460048701546006880154600389015494909304945085936000939190920191600a9160ff160204106111df5760058601546004870154600688015460038901549190920191600a9160ff90911602040390505b600081838502111561121b578382816111f457fe5b049250818385021015611208576001909201915b84831115611214578492505b5080611220565b508282025b60098701805482019055600787018054820190556004870180548201905560068701805464ffffffffff600160381b8083048216620151808802019091160264ffffffffff60381b1990911617908190556003880154600a9160ff1602048760050154886004015401106112a4576003870180546002890180549091019055600090555b6112b5868486028960030154611f23565b505050505b505050565b6112c761231e565b6000806112d26122e1565b6112db856119e6565b91516001600160a01b03979097166000908152601160209081526040918290209888526001890154908801526002880154908701526003870154606087015260048701546080870152600587015460a0870152600687015460ff80821660c089015261010080830490911660e089015264ffffffffff620100008304811691890191909152600160381b90910416610120870152600787015461014087015260088701546101608701526009870154610180870152600a909601546101a0860152939592505050565b6001600160a01b031660009081526001602052604090205490565b333214611401576040805162461bcd60e51b815260206004820152600b60248201526a68756d616e73206f6e6c7960a81b604482015290519081900360640190fd5b60165464ffffffffff16421015611452576040805162461bcd60e51b815260206004820152601060248201526f6e6f742072656c656173652074696d6560801b604482015290519081900360640190fd5b60155460145411611499576040805162461bcd60e51b815260206004820152600c60248201526b72656c6561736520646f6e6560a01b604482015290519081900360640190fd5b601654600090620151809064ffffffffff164203049050600061016d601454816114bf57fe5b04905060008290506000601554601454106114dd5750601554601454035b6000818385021115611519578382816114f257fe5b049250818385021015611506576001909201915b84831115611512578492505b508061151e565b508282025b600e54611534906001600160a01b031682611959565b60158054919091019055506016805464ffffffffff198116620151809390930264ffffffffff91821601169190911790555050565b6004805460408051602060026001851615610100026000190190941693909304601f810184900484028201840190925281815292918301828280156108d15780601f106108a6576101008083540402835291602001916108d1565b60006115d1338484612063565b9392505050565b6001600160a01b03918216600090815260026020908152604080832093909416825291909152205490565b600082611612575060006109a6565b508181028183828161162057fe5b04146109a65760405162461bcd60e51b81526004018080602001828103825260218152602001806123ad6021913960400191505060405180910390fd5b806116a0576040805162461bcd60e51b815260206004820152600e60248201526d1d5cd95c881b9bdd08195e1a5cdd60921b604482015290519081900360640190fd5b50565b60006115d183836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f00000000000081525061212c565b60006115d183836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f7700008152506121cb565b806000600160ff8516141561174d57611746606461064284601e611603565b905061178f565b8360ff1660021415611764576117468260026116a3565b8360ff1660031415611780576117466064610642846046611603565b8360ff166004141561178f5750805b61179982826116e5565b91509250929050565b600080836001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b1580156117f257600080fd5b505afa158015611806573d6000803e3d6000fd5b505050506040513d602081101561181c57600080fd5b50519050808311156118315760009150611838565b5060019050815b9250929050565b816001600160a01b038116611887576040805162461bcd60e51b81526020600482015260096024820152683d32b9379030b2323960b91b604482015290519081900360640190fd5b8361189a816001600160a01b0316612225565b6118dc576040805162461bcd60e51b815260206004820152600e60248201526d3737ba103a37b5b2b71030b2323960911b604482015290519081900360640190fd5b821561195257846001600160a01b031663a9059cbb85856040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050600060405180830381600087803b15801561193957600080fd5b505af115801561194d573d6000803e3d6000fd5b505050505b5050505050565b801561196a576112ba308383612063565b5050565b818101828110156109a6576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b6001600160a01b039081166000908152600b602052604090205416151590565b6119ee6122e1565b6000806119f961233d565b5050506001600160a01b039182166000908152600c60209081526040918290208251606081018452815480825260018301548716938201938452600290920154909516949092019384529082525191519092565b6001600160a01b0383166000908152600c602052604090208054611c5c5760095415611b5257611a7c82610bc9565b611ac3576040805162461bcd60e51b815260206004820152601360248201527211108e881c90dbd919481b9bdd08195e1a5cdd606a1b604482015290519081900360640190fd5b6001600160a01b038083166000908152600b60205260409020541633811415611b33576040805162461bcd60e51b815260206004820152601760248201527f44423a2072436f64652063616e27742062652073656c66000000000000000000604482015290519081900360640190fd5b506002810180546001600160a01b0319166001600160a01b0384161790555b611b5b83610bc9565b15611ba0576040805162461bcd60e51b815260206004820152601060248201526f11108e8818dbd919481a5cc81d5cd95960821b604482015290519081900360640190fd5b6001600160a01b038316611bfb576040805162461bcd60e51b815260206004820152601760248201527f44423a20696e76616c696420696e7669746520636f6465000000000000000000604482015290519081900360640190fd5b6009805460019081018083558355820180546001600160a01b03199081166001600160a01b038781169182179093556000908152600b6020908152604080832080548516958b16958617905594548252600a90529290922080549092161790555b50505050565b816001600160a01b038116611caa576040805162461bcd60e51b81526020600482015260096024820152683d32b9379030b2323960b91b604482015290519081900360640190fd5b83611cbd816001600160a01b0316612225565b611cff576040805162461bcd60e51b815260206004820152600e60248201526d3737ba103a37b5b2b71030b2323960911b604482015290519081900360640190fd5b821561195257604080516323b872dd60e01b81526001600160a01b038681166004830152306024830152604482018690529151918716916323b872dd9160648082019260009290919082900301818387803b15801561193957600080fd5b801561196a576112ba823083612063565b600f546000908152601060205260409020600281018054830190556006546012546207a1209091021161196a57600080600f5460011415611dea57600654620927c002836002015410611de55750600654600283018054620927c090920290819055600f54910390611de290600101612261565b91505b611e26565b600654620186a002836002015410611e265750600654600283018054620186a090920290819055600f54910390611e2390600101612261565b91505b8115611c5c57600f80546001908101918290556000918252601060205260408220805464ffffffffff19164264ffffffffff16178155908101849055600281018390559350611c5c90611d6e565b6001600160a01b038216611e875761196a565b6001600160a01b0382166000908152601160205260409020600381015415801590611eb6575080600301548210155b156112ba5760068101805460ff1916601e179055505050565b60095490565b60008160011415611ee85750600a610bd7565b8160021415611ef95750600c610bd7565b8160031415611f0a5750600f610bd7565b8160041415611f1b5750600f610bd7565b506000919050565b82600060015b600a811161205b576001600160a01b038316611f445761205b565b6001600160a01b0383166000908152601160205260409020611f65846119e6565b600384015490955015915061204d905057600681015460009081908190611f9390610100900460ff1661227e565b91509150848110612049576103e88983020492508784600301541015611fc657878460030154840281611fc257fe5b0492505b82156120495760068401546003850154600a9160ff160204838560050154866004015401011061202a5760058401546004850154600686015460038701805460028901805482019055600090915591909201600a60ff909316909102919091040392505b6009840180548401905560088401805484019055600584018054840190555b5050505b509091508190600101611f29565b505050505050565b60006001600160a01b0383166120aa5760405162461bcd60e51b815260040180806020018281038252602181526020018061238c6021913960400191505060405180910390fd5b6001600160a01b038416600090815260016020526040902054821115612109576040805162461bcd60e51b815260206004820152600f60248201526e6c61636b206f662062616c616e636560881b604482015290519081900360640190fd5b6001600160a01b038416600090815260016020526040902054610b3990836116e5565b600081836121b85760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561217d578181015183820152602001612165565b50505050905090810190601f1680156121aa5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b508284816121c257fe5b04949350505050565b6000818484111561221d5760405162461bcd60e51b815260206004820181815283516024840152835190928392604490910191908501908083836000831561217d578181015183820152602001612165565b505050900390565b6000813f7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a47081158015906122595750808214155b949350505050565b600060018203600a016008546064028161227757fe5b0492915050565b600080826001141561229657506064905060016122dc565b82600214156122ab5750603c905060056122dc565b82600314156122c057506050905060086122dc565b82600414156122d5575060649050600a6122dc565b5060009050805b915091565b60405180602001604052806001906020820280368337509192915050565b6040518061010001604052806008906020820280368337509192915050565b604051806101c00160405280600e906020820280368337509192915050565b60408051606081018252600080825260208201819052918101919091529056fe726573657420616c6c6f77616e636520746f2030206265666f7265206368616e676520697427732076616c75652e7472616e73666572206164647220697320746865207a65726f2061646472657373536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f77a26469706673582212206d02311a90b9127e1fde2853a5cac04a3e7838df8a507c97ac88de2bea740b6d64736f6c634300060c0033

Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)

000000000000000000000000d692d6626cad6d5bf6780660d6f4a2f1ca989f89000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec7

-----Decoded View---------------
Arg [0] : _devAddr (address): 0xD692D6626CAd6D5bF6780660d6F4A2f1Ca989f89
Arg [1] : _USDTAddr (address): 0xdAC17F958D2ee523a2206206994597C13D831ec7

-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 000000000000000000000000d692d6626cad6d5bf6780660d6f4a2f1ca989f89
Arg [1] : 000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec7


Deployed Bytecode Sourcemap

22444:19950:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30471:3530;;;;;;;;;;;;;;;;-1:-1:-1;30471:3530:0;;;;:::i;:::-;;11528:18;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10522:371;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;10522:371:0;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;6612:100;;;:::i;:::-;;;;;;;;;;;;;;;;9208:665;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;9208:665:0;;;;;;;;;;;;;;;;;:::i;17591:127::-;;;;;;;;;;;;;;;;-1:-1:-1;17591:127:0;-1:-1:-1;;;;;17591:127:0;;:::i;11580:21::-;;;:::i;:::-;;;;;;;;;;;;;;;;;;;25016:2653;;;;;;;;;;;;;;;;-1:-1:-1;25016:2653:0;;;;;;-1:-1:-1;;;;;25016:2653:0;;:::i;35618:463::-;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27719:2551;;;:::i;36207:941::-;;;;;;;;;;;;;;;;-1:-1:-1;36207:941:0;-1:-1:-1;;;;;36207:941:0;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;36207:941:0;;;;;;-1:-1:-1;;;;;36207:941:0;;;;;;;;;;;;;;;;;7889:116;;;;;;;;;;;;;;;;-1:-1:-1;7889:116:0;-1:-1:-1;;;;;7889:116:0;;:::i;34064:1449::-;;;:::i;11553:20::-;;;:::i;6889:138::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;6889:138:0;;;;;;;;:::i;11234:209::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;11234:209:0;;;;;;;;;;:::i;30471:3530::-;18387:10;18401:9;18387:23;18379:47;;;;;-1:-1:-1;;;18379:47:0;;;;;;;;;;;;-1:-1:-1;;;18379:47:0;;;;;;;;;;;;;;;30580:10:::1;30548:17;30568:23:::0;;;:11:::1;:23;::::0;;;;30608:7;;30596:20:::1;::::0;:11:::1;:20::i;:::-;30655:7;::::0;30631:20:::1;::::0;::::1;::::0;:35:::1;;30623:62;;;::::0;;-1:-1:-1;;;30623:62:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;30623:62:0;;;;;;;;;;;;;::::1;;30723:20;::::0;::::1;::::0;30698:22:::1;::::0;30723:28:::1;::::0;30748:2:::1;30723:24;:28::i;:::-;30698:53;;30756:19;30778:43;30803:17;30778:4;:20;;;:24;;:43;;;;:::i;:::-;30756:65;;30832:23;30941:43;30962:5;30969:14;30941:20;:43::i;:::-;31187:9;::::0;30902:82;;-1:-1:-1;30902:82:0;-1:-1:-1;30997:20:0::1;::::0;;;31166:67:::1;::::0;-1:-1:-1;;;;;31187:9:0::1;31198:34:::0;;::::1;31166:20;:67::i;:::-;31133:100:::0;;-1:-1:-1;31133:100:0;-1:-1:-1;31247:24:0;31244:390:::1;;31319:1;31305:11;:15;31297:51;;;::::0;;-1:-1:-1;;;31297:51:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;31406:19;:11:::0;31422:2:::1;31406:15;:19::i;:::-;31386:39:::0;-1:-1:-1;31457:34:0::1;:11:::0;31386:39;31457:15:::1;:34::i;:::-;31440:51;;31579:43;31600:5;31607:14;31579:20;:43::i;:::-;31540:82:::0;;-1:-1:-1;31540:82:0;-1:-1:-1;31244:390:0::1;31675:22:::0;;31672:1343:::1;;31783:3;::::0;31723:13:::1;31762:25:::0;;;:20:::1;:25;::::0;;;;:31:::1;;::::0;31739:55:::1;::::0;:18;;:22:::1;:55::i;:::-;31723:71;;31860:12;;31849:8;:23;31846:510;;;-1:-1:-1::0;31904:12:0::1;::::0;31943;31935:48:::1;;;::::0;;-1:-1:-1;;;31935:48:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;32084:3;::::0;32029:18:::1;32063:25:::0;;;:20:::1;:25;::::0;;;;:31:::1;;::::0;32050:45:::1;::::0;:8;;:12:::1;:45::i;:::-;32029:66:::0;-1:-1:-1;32134:60:0::1;32175:18:::0;32134:36:::1;:17:::0;32029:66;32134:21:::1;:36::i;:::-;:40:::0;::::1;:60::i;:::-;32114:80:::0;-1:-1:-1;32230:57:0::1;32268:18:::0;32230:33:::1;:14:::0;32249:13;32230:18:::1;:33::i;:57::-;32213:74:::0;-1:-1:-1;32327:13:0;-1:-1:-1;31846:510:0::1;32445:45;32474:4;32481:8;32445:20;:45::i;:::-;32412:78:::0;;-1:-1:-1;32412:78:0;-1:-1:-1;32508:24:0;32505:499:::1;;32588:1;32574:11;:15;32566:50;;;::::0;;-1:-1:-1;;;32566:50:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;32566:50:0;;;;;;;;;;;;;::::1;;32723:3;::::0;32662:21:::1;32702:25:::0;;;:20:::1;:25;::::0;;;;:31:::1;;::::0;32686:48:::1;::::0;:11;;:15:::1;:48::i;:::-;32662:72:::0;-1:-1:-1;32773:63:0::1;32817:18:::0;32773:39:::1;:17:::0;32662:72;32773:21:::1;:39::i;:63::-;32753:83:::0;-1:-1:-1;32872:60:0::1;32913:18:::0;32872:36:::1;:14:::0;32891:16;32872:18:::1;:36::i;:60::-;32855:77:::0;-1:-1:-1;32972:16:0;-1:-1:-1;32505:499:0::1;31672:1343;;33030:21:::0;;33027:163:::1;;33140:9;::::0;33151:7:::1;::::0;33119:59:::1;::::0;-1:-1:-1;;;;;33140:9:0;;::::1;::::0;33151:7:::1;33160:17:::0;33119:20:::1;:59::i;:::-;33203:18:::0;;33200:161:::1;;33311:9;::::0;33290:59:::1;::::0;-1:-1:-1;;;;;33311:9:0::1;33322:10;33334:14:::0;33290:20:::1;:59::i;:::-;33374:22:::0;;33371:292:::1;;33536:3;::::0;33515:25:::1;::::0;;;:20:::1;:25;::::0;;;;:31:::1;;::::0;33464:84:::1;::::0;33480:10:::1;::::0;33492:55:::1;::::0;:18;;:22:::1;:55::i;:::-;33464:15;:84::i;:::-;33639:3;::::0;33618:25:::1;::::0;;;:20:::1;:25;::::0;;;;:31:::1;;::::0;33578:73:::1;::::0;33595:55:::1;::::0;:18;;:22:::1;:55::i;:::-;33578:12;::::0;;:16:::1;:73::i;:::-;33563:12;:88:::0;33371:292:::1;33698:87;33767:17;33698:64;33743:18;33698:40;33723:14;33698:4;:20;;;:24;;:40;;;;:::i;:::-;:44:::0;::::1;:64::i;:87::-;33675:20;::::0;::::1;:110:::0;33818:19:::1;::::0;::::1;::::0;:86:::1;::::0;33886:17;;33818:63:::1;::::0;33862:18;;33818:63;;33842:14;33818:23:::1;:39::i;:::-;:43:::0;::::1;:63::i;:86::-;33796:19;::::0;::::1;:108:::0;33922:74:::1;::::0;;::::1;::::0;::::1;::::0;;::::1;::::0;::::1;::::0;;;;;;;;;33992:3:::1;33922:74:::0;;;;;;33937:10:::1;::::0;33922:74:::1;::::0;;;;;;;;::::1;18431:1;;;;;;30471:3530:::0;:::o;11528:18::-;;;;;;;;;;;;;;;-1:-1:-1;;11528:18:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;10522:371::-;10598:4;10657:11;;;10656:53;;-1:-1:-1;10682:10:0;10674:19;;;;:7;:19;;;;;;;;-1:-1:-1;;;;;10674:29:0;;;;;;;;;;:34;10656:53;10648:112;;;;-1:-1:-1;;;10648:112:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10779:10;10771:19;;;;:7;:19;;;;;;;;-1:-1:-1;;;;;10771:29:0;;;;;;;;;;;;:38;;;10825;;;;;;;10771:29;;10779:10;10825:38;;;;;;;;;;;-1:-1:-1;10881:4:0;10522:371;;;;;:::o;6612:100::-;6665:7;6692:12;6612:100;:::o;9208:665::-;9360:4;-1:-1:-1;;;;;9390:17:0;;9382:63;;;;-1:-1:-1;;;9382:63:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;9474:15:0;;;;;;:8;:15;;;;;;9464:25;;;9456:53;;;;;-1:-1:-1;;;9456:53:0;;;;;;;;;;;;-1:-1:-1;;;9456:53:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;9538:14:0;;;;;;:7;:14;;;;;;;;9553:10;9538:26;;;;;;;;9528:36;;;9520:81;;;;;-1:-1:-1;;;9520:81:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;9651:14:0;;;;;;:7;:14;;;;;;;;9666:10;9651:26;;;;;;;;:38;;9682:6;9651:30;:38::i;:::-;-1:-1:-1;;;;;9622:14:0;;;;;;:7;:14;;;;;;;;9637:10;9622:26;;;;;;;:67;;;;9718:15;;;:8;:15;;;;;:27;;9738:6;9718:19;:27::i;:::-;-1:-1:-1;;;;;9700:15:0;;;;;;;:8;:15;;;;;;:45;;;;9772:13;;;;;;;:25;;9790:6;9772:17;:25::i;:::-;-1:-1:-1;;;;;9756:13:0;;;;;;;:8;:13;;;;;;;;;:41;;;;9815:28;;;;;;;9756:13;;9815:28;;;;;;;;;;;;;-1:-1:-1;9861:4:0;9208:665;;;;;:::o;17591:127::-;17673:4;17696:17;17708:4;17696:11;:17::i;:::-;17689:24;;17591:127;;;;:::o;11580:21::-;;;;;;:::o;25016:2653::-;18387:10;18401:9;18387:23;18379:47;;;;;-1:-1:-1;;;18379:47:0;;;;;;;;;;;;-1:-1:-1;;;18379:47:0;;;;;;;;;;;;;;;25212:7:::1;::::0;25125:10:::1;::::0;25222:4:::1;25212:14;25203:23:::0;::::1;::::0;:63:::1;;;25252:7;;25262:4;25252:14;25243:5;:23;25203:63;:102;;;;25292:7;;25302:3;25292:13;25283:5;:22;25203:102;:141;;;;25331:7;;25341:3;25331:13;25322:5;:22;25203:141;25181:202;;;::::0;;-1:-1:-1;;;25181:202:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;25181:202:0;;;;;;;;;;;;;::::1;;25421:24;;:::i;:::-;25474;25487:10;25474:12;:24::i;:::-;-1:-1:-1::0;;25524:12:0;;25456:42;;-1:-1:-1;25524:12:0;25541:162:::1;;25565:38;25579:10;25591:4;25597:5;25565:13;:38::i;:::-;25636:24;25649:10;25636:12;:24::i;:::-;-1:-1:-1::0;;25685:12:0;;25618:42;;-1:-1:-1;25685:12:0;-1:-1:-1;25541:162:0::1;25741:10;25709:17;25729:23:::0;;;:11:::1;:23;::::0;;;;25761:7;;25757:56:::1;;25790:17:::0;;;25757:56:::1;25863:16;::::0;::::1;::::0;:21;25855:51:::1;;;::::0;;-1:-1:-1;;;25855:51:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;25855:51:0;;;;;;;;;;;;;::::1;;25943:17;25987:7;;25997:4;25987:14;25978:5;:23;25975:296;;;-1:-1:-1::0;26032:1:0::1;25975:296;;;26063:7;;26073:4;26063:14;26054:5;:23;26051:220;;;-1:-1:-1::0;26108:1:0::1;26051:220;;;26139:7;;26149:3;26139:13;26130:5;:22;26127:144;;;-1:-1:-1::0;26183:1:0::1;26127:144;;;26214:7;;26224:3;26214:13;26205:5;:22;26202:69;;;-1:-1:-1::0;26258:1:0::1;26202:69;26304:16;::::0;::::1;::::0;::::1;;::::0;;::::1;::::0;::::1;26289:31:::0;;::::1;;;26281:63;;;::::0;;-1:-1:-1;;;26281:63:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;26281:63:0;;;;;;;;;;;;;::::1;;26377:7;;26387:6;26377:16;26360:14;;:33;26357:578;;;26479:9;::::0;26457:51:::1;::::0;-1:-1:-1;;;;;26479:9:0::1;26490:10;26502:5:::0;26457:21:::1;:51::i;:::-;26357:578;;;26588:3;::::0;26541:13:::1;26567:25:::0;;;:20:::1;:25;::::0;;;;:31:::1;;::::0;26557:59:::1;::::0;26612:3:::1;::::0;26557:50:::1;::::0;26604:2:::1;::::0;26557:42:::1;::::0;:5;;:9:::1;:42::i;:::-;:46:::0;::::1;:50::i;:59::-;26702:9;::::0;26541:75;;-1:-1:-1;26680:68:0::1;::::0;-1:-1:-1;;;;;26702:9:0::1;26713:10;26725:22;26743:3;26725:13;:5:::0;26735:2:::1;26725:9;:13::i;:22::-;26680:21;:68::i;:::-;26809:38;26826:10;26838:8;26809:16;:38::i;:::-;26899:12;:24:::0;;;;::::1;::::0;;26357:578:::1;27007:9;::::0;27018:7:::1;::::0;26986:55:::1;::::0;-1:-1:-1;;;;;27007:9:0;;::::1;::::0;27018:7:::1;27027:13;:5:::0;27037:2:::1;27027:9;:13::i;:::-;26986:20;:55::i;:::-;27071:14;:23:::0;;;::::1;::::0;;-1:-1:-1;27135:22:0;::::1;:31:::0;;;::::1;::::0;;27177:16:::1;::::0;::::1;:24:::0;;;-1:-1:-1;27212:27:0::1;::::0;::::1;:31:::0;;;27254:28:::1;::::0;::::1;:32:::0;27297:22:::1;::::0;::::1;:27:::0;;27322:2:::1;-1:-1:-1::0;;27297:27:0;;::::1;;-1:-1:-1::0;;27335:30:0::1;27297:27;;27335:30:::0;::::1;;;-1:-1:-1::0;;27376:29:0::1;::::0;27401:3:::1;27376:29;;::::0;;::::1;::::0;;;::::1;-1:-1:-1::0;;;;27416:35:0::1;-1:-1:-1::0;;;27416:35:0;;;::::1;;::::0;;27488:18:::1;27071:23:::0;27488:11:::1;:18::i;:::-;27567:31;27585:5;27592;27567:17;:31::i;:::-;27616:48;::::0;;;;;27660:3:::1;27616:48;::::0;::::1;::::0;;;-1:-1:-1;;;;;27616:48:0;;::::1;::::0;;;::::1;::::0;27628:10:::1;::::0;27616:48:::1;::::0;;;;;;;;;::::1;18431:1;;;;;25016:2653:::0;;:::o;35618:463::-;35687:19;;:::i;:::-;35734;:17;:19::i;:::-;35724:29;;35774:3;;35724:7;35764;;;:13;;;35729:1;35798:25;;;:20;:25;;;;;;;35769:1;35798:31;;;35788:7;;;:41;;;;35793:1;35850:37;;;35840:7;;;:47;35908:25;;;;;;:30;;;;;35898:7;;;:40;35959:14;;35949:7;;;:24;35994:19;;35984:7;;;:29;36034:22;;;36024:7;;;:32;35724:4;35618:463::o;27719:2551::-;18387:10;18401:9;18387:23;18379:47;;;;;-1:-1:-1;;;18379:47:0;;;;;;;;;;;;-1:-1:-1;;;18379:47:0;;;;;;;;;;;;;;;27818:10:::1;27786:17;27806:23:::0;;;:11:::1;:23;::::0;;;;27852:7;;27840:20:::1;::::0;:11:::1;:20::i;:::-;27900:1;27881:4;:16;;;:20;27873:50;;;::::0;;-1:-1:-1;;;27873:50:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;27873:50:0;;;;;;;;;;;;;::::1;;27949:21;::::0;::::1;::::0;-1:-1:-1;;;27949:21:0;::::1;;;27942:3;:28;;27934:57;;;::::0;;-1:-1:-1;;;27934:57:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;27934:57:0;;;;;;;;;;;;;::::1;;28031:13;28069:24;28082:10;28069:12;:24::i;:::-;28177:21;::::0;::::1;::::0;28055:38;;-1:-1:-1;28141:26:0::1;::::0;-1:-1:-1;28202:6:0::1;::::0;-1:-1:-1;;;;28177:21:0;::::1;;;28171:3;:27;28170:38;28141:67;;28242:1;28223:4;:16;;;:20;:49;;;;;28271:1;28247:21;:25;28223:49;28219:2014;;;28357:16;::::0;::::1;::::0;28299:20:::1;::::0;28377:4:::1;::::0;28341:33:::1;::::0;28357:16:::1;::::0;::::1;;;28341:15;:33::i;:::-;28322:4;:16;;;:52;:59;;;;;28581:28;::::0;::::1;::::0;28551:27:::1;::::0;::::1;::::0;28520:22:::1;::::0;::::1;::::0;28501:16:::1;::::0;::::1;::::0;28322:59;;;::::1;::::0;-1:-1:-1;28420:21:0;;28396::::1;::::0;28551:58;;;::::1;::::0;28545:2:::1;::::0;28520:22:::1;;28501:41;:46;:108;28498:278;;28731:28;::::0;::::1;::::0;28701:27:::1;::::0;::::1;::::0;28670:22:::1;::::0;::::1;::::0;28651:16:::1;::::0;::::1;::::0;28701:58;;;::::1;::::0;28695:2:::1;::::0;28670:22:::1;::::0;;::::1;28651:41;:46;:109;28630:130;;28498:278;28790:15;28865:18;28846:16;28828:15;:34;:55;28824:660;;;28958:15;28937:18;:36;;;;;;28918:55;;29033:18;29014:16;28996:15;:34;:55;28992:123;;;29076:19;::::0;;::::1;::::0;28992:123:::1;29156:21;29137:16;:40;29133:129;;;29221:21;29202:40;;29133:129;-1:-1:-1::0;29362:18:0;28824:660:::1;;;-1:-1:-1::0;29434:34:0;;::::1;28824:660;29500:20;::::0;::::1;:34:::0;;;::::1;::::0;;29549:22:::1;::::0;::::1;:36:::0;;;::::1;::::0;;29602:27:::1;::::0;::::1;:41:::0;;;::::1;::::0;;29658:21:::1;::::0;::::1;:58:::0;;::::1;-1:-1:-1::0;;;29658:58:0;;::::1;::::0;::::1;29709:6;29690:25:::0;::::1;29658:58;::::0;;::::1;;-1:-1:-1::0;;;;29658:58:0;;::::1;;::::0;;;;-1:-1:-1;29822:16:0;::::1;::::0;29866:2:::1;::::0;29841:22:::1;;29822:41;:46;29790:4;:28;;;29760:4;:27;;;:58;:108;29756:233;;29913:16;::::0;::::1;::::0;;29889:20:::1;::::0;::::1;:40:::0;;;;::::1;::::0;;:20:::1;29948::::0;;29756:233:::1;30136:85;30161:5;30186:16;30168:15;:34;30204:4;:16;;;30136:24;:85::i;:::-;28219:2014;;;;;18431:1;;;27719:2551::o:0;36207:941::-;36311:20;;:::i;:::-;36333:12;36347:13;36378:24;;:::i;:::-;36440:18;36453:4;36440:12;:18::i;:::-;36484:12;;-1:-1:-1;;;;;36523:17:0;;;;36469:12;36523:17;;;:11;36484:12;36523:17;;;;;;;;36547;;;36585:22;;;;36575:7;;;:32;36628:20;;;;36618:7;;;:30;36669:16;;;;36659:7;;;:26;36706:27;;;;36696:7;;;:37;36754:28;;;;36744:7;;;:38;36803:22;;;;;;;;36793:7;;;:32;36846:16;;;;;;;36836:7;;;:26;36883:15;;;;;;36873:7;;;:25;;;;-1:-1:-1;;;36919:21:0;;;;36909:7;;;:31;36841:1;36962:22;;;36951:8;;;:33;36878:1;37006:23;;;36995:8;;;:34;36914:1;37051:20;;;37040:8;;;:31;36956:2;37093:19;;;;37082:8;;;:30;36547:4;;36207:941;-1:-1:-1;;;36207:941:0:o;7889:116::-;-1:-1:-1;;;;;7981:16:0;7954:7;7981:16;;;:8;:16;;;;;;;7889:116::o;34064:1449::-;18387:10;18401:9;18387:23;18379:47;;;;;-1:-1:-1;;;18379:47:0;;;;;;;;;;;;-1:-1:-1;;;18379:47:0;;;;;;;;;;;;;;;34156:22:::1;::::0;::::1;;34149:3;:29;;34141:58;;;::::0;;-1:-1:-1;;;34141:58:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;34141:58:0;;;;;;;;;;;;;::::1;;34232:19;;34218:11;;:33;34210:58;;;::::0;;-1:-1:-1;;;34210:58:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;34210:58:0;;;;;;;;;;;;;::::1;;34326:22;::::0;34289:26:::1;::::0;34352:6:::1;::::0;34326:22:::1;;34320:3;:28;34319:39;34289:69;;34369:20;34406:3;34392:11;;:17;;;;;;34369:40;;34420:21;34444;34420:45;;34476:23;34532:19;;34517:11;;:34;34514:120;;-1:-1:-1::0;34603:19:0::1;::::0;34589:11:::1;::::0;:33:::1;34514:120;34644:15;34715:18;34696:16;34678:15;:34;:55;34674:608;;;34800:15;34779:18;:36;;;;;;34760:55;;34871:18;34852:16;34834:15;:34;:55;34830:115;;;34910:19;::::0;;::::1;::::0;34830:115:::1;34982:21;34963:16;:40;34959:121;;;35043:21;35024:40;;34959:121;-1:-1:-1::0;35172:18:0;34674:608:::1;;;-1:-1:-1::0;35236:34:0;;::::1;34674:608;35347:7;::::0;35331:36:::1;::::0;-1:-1:-1;;;;;35347:7:0::1;35356:10:::0;35331:15:::1;:36::i;:::-;35405:19;:33:::0;;;;;::::1;::::0;;-1:-1:-1;35449:22:0::1;:59:::0;;-1:-1:-1;;35449:59:0;::::1;35501:6;35482:25:::0;;;::::1;35449:59;::::0;;::::1;;;::::0;;;::::1;::::0;;-1:-1:-1;;34064:1449:0:o;11553:20::-;;;;;;;;;;;;;;;-1:-1:-1;;11553:20:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6889:138;6961:4;6985:34;6995:10;7007:3;7012:6;6985:9;:34::i;:::-;6978:41;6889:138;-1:-1:-1;;;6889:138:0:o;11234:209::-;-1:-1:-1;;;;;11410:15:0;;;11378:7;11410:15;;;:7;:15;;;;;;;;:25;;;;;;;;;;;;;11234:209::o;2212:465::-;2270:9;2517:6;2513:47;;-1:-1:-1;2547:1:0;2540:8;;2513:47;-1:-1:-1;2576:5:0;;;2580:1;2576;:5;:1;2600:5;;;;;:10;2592:56;;;;-1:-1:-1;;;2592:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18820:119;18907:8;18899:35;;;;;-1:-1:-1;;;18899:35:0;;;;;;;;;;;;-1:-1:-1;;;18899:35:0;;;;;;;;;;;;;;;18820:119;:::o;3145:132::-;3203:7;3230:39;3234:1;3237;3230:39;;;;;;;;;;;;;;;;;:3;:39::i;1344:136::-;1402:7;1429:43;1433:1;1436;1429:43;;;;;;;;;;;;;;;;;:3;:43::i;41630:761::-;41812:9;41739:19;41846:1;41837:10;;;;41834:487;;;41908:31;41935:3;41908:22;:14;41927:2;41908:18;:22::i;:31::-;41887:52;;41834:487;;;41969:5;:10;;41978:1;41969:10;41966:355;;;42040:21;:14;42059:1;42040:18;:21::i;41966:355::-;42091:5;:10;;42100:1;42091:10;42088:233;;;42162:31;42189:3;42162:22;:14;42181:2;42162:18;:22::i;42088:233::-;42223:5;:10;;42232:1;42223:10;42220:101;;;-1:-1:-1;42295:14:0;42220:101;42348:38;:14;42367:18;42348;:38::i;:::-;42331:55;;41630:761;;;;;:::o;20709:333::-;20821:4;20827:17;20889:6;-1:-1:-1;;;;;20877:29:0;;20915:4;20877:44;;;;;;;;;;;;;-1:-1:-1;;;;;20877:44:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;20877:44:0;;-1:-1:-1;20930:24:0;;;20926:112;;;20970:5;20962:28;;;;20926:112;-1:-1:-1;21016:4:0;;-1:-1:-1;21022:9:0;20926:112;20709:333;;;;;:::o;19813:248::-;19926:5;-1:-1:-1;;;;;18539:18:0;;18531:40;;;;;-1:-1:-1;;;18531:40:0;;;;;;;;;;;;-1:-1:-1;;;18531:40:0;;;;;;;;;;;;;;;19958:6:::1;18693:17;:4;-1:-1:-1::0;;;;;18693:15:0::1;;:17::i;:::-;18685:44;;;::::0;;-1:-1:-1;;;18685:44:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;18685:44:0;;;;;;;;;;;;;::::1;;19980:8:::0;;19976:81:::2;;20022:6;-1:-1:-1::0;;;;;20005:33:0::2;;20039:5;20046:4;20005:46;;;;;;;;;;;;;-1:-1:-1::0;;;;;20005:46:0::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;19976:81;18576:1:::1;19813:248:::0;;;;:::o;19077:180::-;19160:8;;19156:97;;19185:37;19203:4;19210:5;19217:4;19185:9;:37::i;19156:97::-;19077:180;;:::o;894:175::-;978:5;;;1002:6;;;;994:46;;;;;-1:-1:-1;;;994:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;15883:147;-1:-1:-1;;;;;15991:20:0;;;15968:4;15991:20;;;:14;:20;;;;;;;:34;;;15883:147::o;16946:276::-;17032:19;;:::i;:::-;17053:12;17067:13;17092:24;;:::i;:::-;-1:-1:-1;;;;;;;;17119:21:0;;;;;;;:15;:21;;;;;;;;;17092:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17145:21;;;17187:13;17202:14;;17145:4;;16946:276::o;14966:783::-;-1:-1:-1;;;;;15088:21:0;;15060:25;15088:21;;;:15;:21;;;;;15124:11;;15120:625;;15161:4;;:9;15157:270;;15199:17;15210:5;15199:10;:17::i;:::-;15191:49;;;;;-1:-1:-1;;;15191:49:0;;;;;;;;;;;;-1:-1:-1;;;15191:49:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;15275:21:0;;;15259:13;15275:21;;;:14;:21;;;;;;;15332:10;15323:19;;;15315:55;;;;;-1:-1:-1;;;15315:55:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;15389:14:0;;;:22;;-1:-1:-1;;;;;;15389:22:0;-1:-1:-1;;;;;15389:22:0;;;;;15157:270;15452:16;15463:4;15452:10;:16::i;:::-;15451:17;15443:46;;;;;-1:-1:-1;;;15443:46:0;;;;;;;;;;;;-1:-1:-1;;;15443:46:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;15512:18:0;;15504:54;;;;;-1:-1:-1;;;15504:54:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;15575:4;:6;;;;;;;;;15596:18;;15629:13;;:20;;-1:-1:-1;;;;;;15629:20:0;;;-1:-1:-1;;;;;15629:20:0;;;;;;;;;-1:-1:-1;15666:20:0;;;:14;:20;;;;;;;;:27;;;;;;;;;;;;15721:4;;15708:18;;:12;:18;;;;;;:25;;;;;;;;15120:625;14966:783;;;;:::o;20298:268::-;20412:5;-1:-1:-1;;;;;18539:18:0;;18531:40;;;;;-1:-1:-1;;;18531:40:0;;;;;;;;;;;;-1:-1:-1;;;18531:40:0;;;;;;;;;;;;;;;20444:6:::1;18693:17;:4;-1:-1:-1::0;;;;;18693:15:0::1;;:17::i;:::-;18685:44;;;::::0;;-1:-1:-1;;;18685:44:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;18685:44:0;;;;;;;;;;;;;::::1;;20466:8:::0;;20462:100:::2;;20491:65;::::0;;-1:-1:-1;;;20491:65:0;;-1:-1:-1;;;;;20491:65:0;;::::2;;::::0;::::2;::::0;20544:4:::2;20491:65:::0;;;;;;;;;;;;:37;;::::2;::::0;::::2;::::0;:65;;;;;-1:-1:-1;;20491:65:0;;;;;;;;-1:-1:-1;20491:37:0;:65;::::2;;::::0;::::2;;;;::::0;::::2;19407:181:::0;19491:8;;19487:97;;19516:37;19526:5;19541:4;19548;19516:9;:37::i;37253:1426::-;37380:3;;37325:31;37359:25;;;:20;:25;;;;;37395:21;;;:36;;;;;;37482:7;;37464:14;;37492:6;37482:16;;;-1:-1:-1;37461:1214:0;;37524:13;37556:28;37606:3;;37613:1;37606:8;37603:690;;;37676:7;;37686:6;37676:16;37651:9;:21;;;:41;37648:295;;-1:-1:-1;37784:7:0;;37760:21;;;;;37794:6;37784:16;;;37823:40;;;;37915:3;;37760:40;;;37897:26;;-1:-1:-1;37915:7:0;37897:17;:26::i;:::-;37886:37;;37648:295;37603:690;;;38011:7;;38021:6;38011:16;37986:9;:21;;;:41;37983:295;;-1:-1:-1;38119:7:0;;38095:21;;;;;38129:6;38119:16;;;38158:40;;;;38250:3;;38095:40;;;38232:26;;-1:-1:-1;38250:7:0;38232:17;:26::i;:::-;38221:37;;37983:295;38313:12;;38309:355;;38360:3;:6;;;;;;;;;;-1:-1:-1;38397:25:0;;;:20;:25;;;;;38441:28;;-1:-1:-1;;38441:28:0;38465:3;38441:28;;;;;38488:15;;;:26;;;38568:21;;;:47;;;38397:25;-1:-1:-1;38634:14:0;;:11;:14::i;38813:405::-;-1:-1:-1;;;;;38898:19:0;;38894:58;;38934:7;;38894:58;-1:-1:-1;;;;;38984:18:0;;38964:17;38984:18;;;:11;:18;;;;;39065:16;;;;:20;;;;:49;;;39098:4;:16;;;39089:5;:25;;39065:49;39061:109;;;39131:22;;;:27;;-1:-1:-1;;39131:27:0;39156:2;39131:27;;;38813:405;;;:::o;17346:111::-;17448:4;;17346:111;:::o;21652:286::-;21739:4;21759:5;21768:1;21759:10;21755:37;;;-1:-1:-1;21784:2:0;21777:9;;21755:37;21800:5;21809:1;21800:10;21796:37;;;-1:-1:-1;21825:2:0;21818:9;;21796:37;21841:5;21850:1;21841:10;21837:37;;;-1:-1:-1;21866:2:0;21859:9;;21837:37;21888:5;21897:1;21888:10;21884:37;;;-1:-1:-1;21913:2:0;21906:9;;21884:37;-1:-1:-1;21932:1:0;21652:286;;;:::o;39404:1999::-;39536:5;39510:23;39594:1;39580:1819;39602:2;39597:1;:7;39580:1819;;-1:-1:-1;;;;;39621:29:0;;39617:54;;39659:5;;39617:54;-1:-1:-1;;;;;39698:28:0;;39678:17;39698:28;;;:11;:28;;;;;39809:29;39710:15;39809:12;:29::i;:::-;39905:16;;;;39787:51;;-1:-1:-1;39905:20:0;;-1:-1:-1;39901:1401:0;;-1:-1:-1;39901:1401:0;40066:16;;;;39960:28;;;;;;40042:41;;40066:16;;;;;40042:23;:41::i;:::-;40013:70;;;;40117:1;40106:7;:12;40102:1185;;40203:4;40187:13;;;:20;40161:46;;40282:11;40263:4;:16;;;:30;40259:169;;;40393:11;40374:4;:16;;;40348:23;:42;:56;;;;;;40322:82;;40259:169;40454:27;;40450:818;;40660:22;;;;40641:16;;;;40685:2;;40660:22;;40641:41;:46;40614:23;40583:4;:28;;;40553:4;:27;;;:58;:84;:134;40549:463;;40826:28;;;;40796:27;;;;40765:22;;;;40746:16;;;;;40888:20;;;:40;;;;;;-1:-1:-1;40959:20:0;;;40796:58;;;;40790:2;40765:22;;;;40746:41;;;:46;;;;:109;;-1:-1:-1;40549:463:0;41038:20;;;:47;;;;;;41112:23;;;:50;;;;;;41189:28;;;:55;;;;;;40450:818;39901:1401;;;;-1:-1:-1;41380:13:0;;-1:-1:-1;41380:13:0;;39606:3;;39580:1819;;;;39404:1999;;;;;:::o;7255:409::-;7336:4;-1:-1:-1;;;;;7361:17:0;;7353:63;;;;-1:-1:-1;;;7353:63:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;7445:15:0;;;;;;:8;:15;;;;;;7435:25;;;7427:53;;;;;-1:-1:-1;;;7427:53:0;;;;;;;;;;;;-1:-1:-1;;;7427:53:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;7511:15:0;;;;;;:8;:15;;;;;;:27;;7531:6;7511:19;:27::i;3765:339::-;3851:9;3955:12;3948:5;3940:28;;;;-1:-1:-1;;;3940:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3987:1;3983;:5;;;;;;;3765:339;-1:-1:-1;;;;3765:339:0:o;1775:186::-;1861:9;1899:12;1891:6;;;;1883:29;;;;-1:-1:-1;;;1883:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;1927:5:0;;;1775:186::o;4658:810::-;4718:4;5377:20;;5220:66;5417:15;;;;;:42;;;5448:11;5436:8;:23;;5417:42;5409:51;4658:810;-1:-1:-1;;;;4658:810:0:o;21185:344::-;21274:4;21516:1;21508:5;:9;21521:2;21507:16;21480:17;;21500:3;21480:23;:44;;;;;;;21185:344;-1:-1:-1;;21185:344:0:o;22077:360::-;22172:10;22184:12;22212:5;22221:1;22212:10;22208:43;;;-1:-1:-1;22238:3:0;;-1:-1:-1;22243:1:0;22230:15;;22208:43;22259:5;22268:1;22259:10;22255:42;;;-1:-1:-1;22285:2:0;;-1:-1:-1;22289:1:0;22277:14;;22255:42;22305:5;22314:1;22305:10;22301:51;;;-1:-1:-1;22340:2:0;;-1:-1:-1;22344:1:0;22332:14;;22301:51;22366:5;22375:1;22366:10;22362:53;;;-1:-1:-1;22401:3:0;;-1:-1:-1;22406:2:0;22393:16;;22362:53;-1:-1:-1;22427:1:0;;-1:-1:-1;22427:1:0;22077:360;;;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o

Swarm Source

ipfs://6d02311a90b9127e1fde2853a5cac04a3e7838df8a507c97ac88de2bea740b6d
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.