ETH Price: $2,545.80 (+5.53%)

Token

WHint Token (WHINT)
 

Overview

Max Total Supply

1,000,000,000 WHINT

Holders

24

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Filtered by Token Holder
Uniswap V2: WHINT-DAI
Balance
37,366,395.661481136726156619 WHINT

Value
$0.00
0x6e34a2e30f4fb8519c9c03ec3eb3b9ec4f0be545
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:
HINTToken

Compiler Version
v0.4.24+commit.e67f0147

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity Multiple files format)

File 3 of 3: WHint.sol
pragma solidity ^0.4.24;

import "./SobloToken.sol";

/**
 * @title HINTToken
 */
contract HINTToken is SobloToken {
    string public constant name = "WHint Token";
    string public constant symbol = "WHINT";
    uint8 public constant decimals = 18;
    
    uint256 public constant INITIAL_SUPPLY = 1e9 * (10 ** uint256(decimals));

    constructor() public {
        totalSupply_ = INITIAL_SUPPLY;
        balances[msg.sender] = INITIAL_SUPPLY;
        emit Transfer(0x0, msg.sender, INITIAL_SUPPLY);
    }
}

File 1 of 3: ERC1132.sol
pragma solidity ^0.4.24;

/**
 * @title ERC1132 interface
 * @dev see https://github.com/ethereum/EIPs/issues/1132
 */

contract ERC1132 {
    /**
     * @dev Reasons why a user's tokens have been locked
     */
    mapping(address => bytes32[]) public lockReason;

    /**
     * @dev locked token structure
     */
    struct lockToken {
        uint256 amount;
        uint256 validity;
        bool claimed;
    }

    /**
     * @dev Holds number & validity of tokens locked for a given reason for
     *      a specified address
     */
    mapping(address => mapping(bytes32 => lockToken)) public locked;

    /**
     * @dev Records data of all the tokens Locked
     */
    event Locked(
        address indexed _of,
        bytes32 indexed _reason,
        uint256 _amount,
        uint256 _validity
    );

    /**
     * @dev Records data of all the tokens unlocked
     */
    event Unlocked(
        address indexed _of,
        bytes32 indexed _reason,
        uint256 _amount
    );
    
    /**
     * @dev Locks a specified amount of tokens against an address,
     *      for a specified reason and time
     * @param _reason The reason to lock tokens
     * @param _amount Number of tokens to be locked
     * @param _time Lock time in seconds
     */
    function lock(bytes32 _reason, uint256 _amount, uint256 _time)
        public returns (bool);
  
    /**
     * @dev Returns tokens locked for a specified address for a
     *      specified reason
     *
     * @param _of The address whose tokens are locked
     * @param _reason The reason to query the lock tokens for
     */
    function tokensLocked(address _of, bytes32 _reason)
        public view returns (uint256 amount);
    
    /**
     * @dev Returns tokens locked for a specified address for a
     *      specified reason at a specific time
     *
     * @param _of The address whose tokens are locked
     * @param _reason The reason to query the lock tokens for
     * @param _time The timestamp to query the lock tokens for
     */
    function tokensLockedAtTime(address _of, bytes32 _reason, uint256 _time)
        public view returns (uint256 amount);
    
    /**
     * @dev Returns total tokens held by an address (locked + transferable)
     * @param _of The address to query the total balance of
     */
    function totalBalanceOf(address _of)
        public view returns (uint256 amount);
    
    /**
     * @dev Extends lock for a specified reason and time
     * @param _reason The reason to lock tokens
     * @param _time Lock extension time in seconds
     */
    function extendLock(bytes32 _reason, uint256 _time)
        public returns (bool);
    
    /**
     * @dev Increase number of tokens locked for a specified reason
     * @param _reason The reason to lock tokens
     * @param _amount Number of tokens to be increased
     */
    function increaseLockAmount(bytes32 _reason, uint256 _amount)
        public returns (bool);

    /**
     * @dev Returns unlockable tokens for a specified address for a specified reason
     * @param _of The address to query the the unlockable token count of
     * @param _reason The reason to query the unlockable tokens for
     */
    function tokensUnlockable(address _of, bytes32 _reason)
        public view returns (uint256 amount);
 
    /**
     * @dev Unlocks the unlockable tokens of a specified address
     * @param _of Address of user, claiming back unlockable tokens
     */
    function unlock(address _of)
        public returns (uint256 unlockableTokens);

    /**
     * @dev Gets the unlockable tokens of a specified address
     * @param _of The address to query the the unlockable token count of
     */
    function getUnlockableTokens(address _of)
        public view returns (uint256 unlockableTokens);

}

File 2 of 3: SobloToken.sol
pragma solidity ^0.4.24;


/**
 * Utility library of inline functions on addresses
 */
library AddressUtils {

    /**
     * Returns whether the target address is a contract
     * dev This function will return false if invoked during the constructor of a contract,
     * as the code is not actually created until after the constructor finishes.
     * @param addr address to check
     * @return whether the target address is a contract
     */
    function isContract(address addr) internal view returns (bool) {
        uint256 size;
        // XXX Currently there is no better way to check if there is a contract in an address
        // than to check the size of the code at that address.
        // See https://ethereum.stackexchange.com/a/14016/36603
        // for more details about how this works.
        // TODO Check this again before the Serenity release, because all addresses will be
        // contracts then.
        // solium-disable-next-line security/no-inline-assembly
        assembly { size := extcodesize(addr) }
        return size > 0;
    }

}


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

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

        return c;
    }

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

        return c;
    }

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

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

        return c;
    }

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

        return c;
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * Reverts when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        require(b != 0, "SafeMath: modulo by zero");
        return a % b;
    }
}

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

    mapping(address => uint256) balances;

    uint256 totalSupply_;

    /**
    * @dev Total number of tokens in existence
    */
    function totalSupply() public view 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 returns (bool) {
        require(_to != address(0), "Recipient address is zero address(0). Check the address again.");
        require(_value <= balances[msg.sender], "The balance of account is insufficient.");

        balances[msg.sender] = balances[msg.sender].sub(_value);
        balances[_to] = balances[_to].add(_value);
        emit Transfer(msg.sender, _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 returns (uint256) {
        return balances[_owner];
    }

}

/**
 * @title ERC20 interface
 * @dev see https://github.com/ethereum/EIPs/issues/20
 */
contract ERC20 is ERC20Basic {
    function allowance(address owner, address spender)
    public view returns (uint256);

    function transferFrom(address from, address to, uint256 value)
    public returns (bool);

    function approve(address spender, uint256 value) public 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
    returns (bool)
    {
        require(_to != address(0), "Recipient address is zero address(0). Check the address again.");
        require(_value <= balances[_from], "The balance of account is insufficient.");
        require(_value <= allowed[_from][msg.sender], "Insufficient tokens approved from account owner.");

        balances[_from] = balances[_from].sub(_value);
        balances[_to] = balances[_to].add(_value);
        allowed[_from][msg.sender] = allowed[_from][msg.sender].sub(_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 returns (bool) {
        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
    returns (uint256)
    {
        return allowed[_owner][_spender];
    }

    /**
     * @dev Increase the amount of tokens that an owner allowed to a spender.
     * approve should be called when allowed[_spender] == 0. To increment
     * allowed value is better to use this function to avoid 2 calls (and wait until
     * the first transaction is mined)
     * From MonolithDAO Token.sol
     * @param _spender The address which will spend the funds.
     * @param _addedValue The amount of tokens to increase the allowance by.
     */
    function increaseApproval(
        address _spender,
        uint256 _addedValue
    )
    public
    returns (bool)
    {
        allowed[msg.sender][_spender] = (
        allowed[msg.sender][_spender].add(_addedValue));
        emit Approval(msg.sender, _spender, allowed[msg.sender][_spender]);
        return true;
    }

    /**
     * @dev Decrease the amount of tokens that an owner allowed to a spender.
     * approve should be called when allowed[_spender] == 0. To decrement
     * allowed value is better to use this function to avoid 2 calls (and wait until
     * the first transaction is mined)
     * From MonolithDAO Token.sol
     * @param _spender The address which will spend the funds.
     * @param _subtractedValue The amount of tokens to decrease the allowance by.
     */
    function decreaseApproval(
        address _spender,
        uint256 _subtractedValue
    )
    public
    returns (bool)
    {
        uint256 oldValue = allowed[msg.sender][_spender];
        if (_subtractedValue > oldValue) {
            allowed[msg.sender][_spender] = 0;
        } else {
            allowed[msg.sender][_spender] = oldValue.sub(_subtractedValue);
        }
        emit Approval(msg.sender, _spender, allowed[msg.sender][_spender]);
        return true;
    }

}

/**
 * @title MultiOwnable
 * @dev root -> superOwner -> owners 의 형태로 관리하는 멀티 관리자 기능
 */
contract MultiOwnable {
    using SafeMath for uint256;

    address public root; // 혹시 몰라 준비해둔 superOwner 의 백업. 하드웨어 월렛 주소로 세팅할 예정.
    address public superOwner;
    mapping (address => bool) public owners;
    address[] public ownerList;

    event ChangedRoot(address newRoot);
    event ChangedSuperOwner(address newSuperOwner);
    event AddedNewOwner(address newOwner);
    event DeletedOwner(address deletedOwner);

    constructor() public {
        root = msg.sender;
        superOwner = msg.sender;
        owners[root] = true;

        ownerList.push(msg.sender);
    }

    modifier onlyRoot() {
        require(msg.sender == root, "Root privilege is required.");
        _;
    }

    modifier onlySuperOwner() {
        require(msg.sender == superOwner, "SuperOwner priviledge is required.");
        _;
    }

    modifier onlyOwner() {
        require(owners[msg.sender], "Owner priviledge is required.");
        _;
    }

    /**
     * @dev root 교체 (root 는 root 와 superOwner 를 교체할 수 있는 권리가 있다.)
     * @dev 기존 루트가 관리자에서 지워지지 않고, 새 루트가 자동으로 관리자에 등록되지 않음을 유의!
     */
    function changeRoot(address newRoot) onlyRoot public returns (bool) {
        require(newRoot != address(0), "This address to be set is zero address(0). Check the input address.");

        root = newRoot;

        emit ChangedRoot(newRoot);
        return true;
    }

    /**
     * @dev superOwner 교체 (root 는 root 와 superOwner 를 교체할 수 있는 권리가 있다.)
     * @dev 기존 superOwner 가 관리자에서 지워지지 않고, 새 superOwner 가 자동으로 관리자에 등록되지 않음을 유의!
     */
    function changeSuperOwner(address newSuperOwner) onlyRoot public returns (bool) {
        require(newSuperOwner != address(0), "This address to be set is zero address(0). Check the input address.");

        superOwner = newSuperOwner;

        emit ChangedSuperOwner(newSuperOwner);
        return true;
    }


    function newOwner(address owner) onlySuperOwner public returns (bool) {
        require(owner != address(0), "This address to be set is zero address(0). Check the input address.");
        require(!owners[owner], "This address is already registered.");

        owners[owner] = true;
        ownerList.push(owner);

        emit AddedNewOwner(owner);
        return true;
    }

    function deleteOwner(address owner) onlySuperOwner public returns (bool) {
        require(owners[owner], "This input address is not an owner.");
        delete owners[owner];

        for (uint256 i = 0; i < ownerList.length; i++) {
            if (ownerList[i] == owner) {
                ownerList[i] = ownerList[ownerList.length.sub(1)];
                ownerList.length = ownerList.length.sub(1);
                break;
            }
        }

        emit DeletedOwner(owner);
        return true;
    }
}

/**
 * @title Lockable token
 */
contract LockableToken is StandardToken, MultiOwnable {
    bool public locked = true;
    uint256 public constant LOCK_MAX = uint256(-1);

    /**
     * @dev 락 상태에서도 거래 가능한 언락 계정
     */
    mapping(address => bool) public unlockAddrs;

    /**
     * @dev 계정 별로 lock value 만큼 잔고가 잠김
     * @dev - 값이 0 일 때 : 잔고가 0 이어도 되므로 제한이 없는 것임.
     * @dev - 값이 LOCK_MAX 일 때 : 잔고가 uint256 의 최대값이므로 아예 잠긴 것임.
     */
    mapping(address => uint256) public lockValues;

    event Locked(bool locked, string note);
    event LockedTo(address indexed addr, bool locked, string note);
    event SetLockValue(address indexed addr, uint256 value, string note);

    constructor() public {
        unlockTo(msg.sender,  "Default Unlock To Root");
    }

    modifier checkUnlock (address addr, uint256 value) {
        require(!locked || unlockAddrs[addr], "The account is currently locked.");
        require(balances[addr].sub(value) >= lockValues[addr], "Transferable limit exceeded. Check the status of the lock value.");
        _;
    }

    function lock(string note) onlyOwner public {
        locked = true;
        emit Locked(locked, note);
    }

    function unlock(string note) onlyOwner public {
        locked = false;
        emit Locked(locked, note);
    }

    function lockTo(address addr, string note) onlyOwner public {
        setLockValue(addr, LOCK_MAX, note);
        unlockAddrs[addr] = false;

        emit LockedTo(addr, true, note);
    }

    function unlockTo(address addr, string note) onlyOwner public {
        if (lockValues[addr] == LOCK_MAX)
            setLockValue(addr, 0, note);
        unlockAddrs[addr] = true;

        emit LockedTo(addr, false, note);
    }

    function setLockValue(address addr, uint256 value, string note) onlyOwner public {
        lockValues[addr] = value;
        emit SetLockValue(addr, value, note);
    }

    /**
     * @dev 이체 가능 금액을 조회한다.
     */
    function getMyUnlockValue() public view returns (uint256) {
        address addr = msg.sender;
        if ((!locked || unlockAddrs[addr]) && balances[addr] > lockValues[addr])
            return balances[addr].sub(lockValues[addr]);
        else
            return 0;
    }

    function transfer(address to, uint256 value) checkUnlock(msg.sender, value) public returns (bool) {
        return super.transfer(to, value);
    }

    function transferFrom(address from, address to, uint256 value) checkUnlock(from, value) public returns (bool) {
        return super.transferFrom(from, to, value);
    }
}


/**
 * @title SobloTokenReceiver Receiver
 */
contract SobloTokenReceiver {
    enum SobloTokenReceiveType { TOKEN_TRANSFER, TOKEN_MINT }
    function onSobloTokenReceived(address owner, address spender, uint256 value, SobloTokenReceiveType receiveType) public returns (bool);
}


/**
 * @title SobloToken
 */
contract SobloToken is LockableToken {
    using AddressUtils for address;
    
    enum SobloTransferType {
        TRANSFER_TO_TEAM, 
        TRANSFER_TO_PARTNER, 
        TRANSFER_TO_ECOSYSTEM, 
        TRANSFER_TO_BOUNTY, 
        TRANSFER_TO_RESERVE, 
        TRANSFER_TO_ETC 
    }
    
    event SobloTransferred(address indexed from, address indexed to, uint256 value, uint256 fromBalance, uint256 toBalance, string note);
    event SobloTransferredFrom(address indexed owner, address indexed spender, address indexed to, uint256 value, uint256 fromBalance, uint256 toBalance, string note);
    event SobloApproval(address indexed owner, address indexed spender, uint256 value, string note);
 
    
    event SobloMultiTransferred(address indexed owner, address indexed spender, address indexed to, uint256 value, SobloTransferType purpose, uint256 fromBalance, uint256 toBalance, string note);

    event TransferredToSobloDapp(
        address indexed owner,
        address indexed spender,
        address indexed to, 
        uint256 value, 
        string note, 
        SobloTokenReceiver.SobloTokenReceiveType receiveType
    );

    constructor() public {
	}


    // ERC20 함수들을 오버라이딩하여 super 로 올라가지 않고 무조건 soblo~ 함수로 지나가게 한다.
    function transfer(address to, uint256 value) public returns (bool ret) {
        return sobloTransfer(to, value, "called by transfer()");
    }

    function sobloTransfer(address to, uint256 value, string note) public returns (bool ret) {
        require(to != address(this), "The receive address is the Contact Address of Soblo Token. You cannot send money to this address.");

        ret = super.transfer(to, value);
        postTransfer(msg.sender, msg.sender, to, value, note, SobloTokenReceiver.SobloTokenReceiveType.TOKEN_TRANSFER);
        
        emit SobloTransferred(msg.sender, to, value, balanceOf(msg.sender), balanceOf(to), note);
    }

    function transferFrom(address from, address to, uint256 value) public returns (bool) {
        return sobloTransferFrom(from, to, value, "called by transferFrom()");
    }

    function sobloTransferFrom(address from, address to, uint256 value, string note) public returns (bool ret) {
        require(to != address(this), "The receive address is the Contact Address of Soblo Token. You cannot send money to this address.");

        ret = super.transferFrom(from, to, value);
        postTransfer(from, msg.sender, to, value, note, SobloTokenReceiver.SobloTokenReceiveType.TOKEN_TRANSFER);

        emit SobloTransferredFrom(from, msg.sender, to, value, balanceOf(from), balanceOf(to), note);
    }

    function approve(address spender, uint256 value) public returns (bool) {
        return sobloApprove(spender, value, "called by approve()");
    }

    function sobloApprove(address spender, uint256 value, string note) public returns (bool ret) {
        ret = super.approve(spender, value);
        emit SobloApproval(msg.sender, spender, value, note);
    }

    function increaseApproval(address spender, uint256 addedValue) public returns (bool) {
        return sobloIncreaseApproval(spender, addedValue, "called by increaseApproval()");
    }

    function sobloIncreaseApproval(address spender, uint256 addedValue, string note) public returns (bool ret) {
        ret = super.increaseApproval(spender, addedValue);
        emit SobloApproval(msg.sender, spender, allowed[msg.sender][spender], note);
    }

    function decreaseApproval(address spender, uint256 subtractedValue) public returns (bool) {
        return sobloDecreaseApproval(spender, subtractedValue, "called by decreaseApproval()");
    }

    function sobloDecreaseApproval(address spender, uint256 subtractedValue, string note) public returns (bool ret) {
        ret = super.decreaseApproval(spender, subtractedValue);
        emit SobloApproval(msg.sender, spender, allowed[msg.sender][spender], note);
    }


    
    function postTransfer(
        address owner, 
        address spender,
        address to,
        uint256 value,
        string note,
        SobloTokenReceiver.SobloTokenReceiveType receiveType
    ) internal returns (bool) {
        if (to.isContract()) {
            bool callOk = address(to).call(
                bytes4(keccak256("onSobloTokenReceived(address,address,uint256,uint8)")),
                owner,
                spender,
                value,
                receiveType
            );
            if (callOk) {
                emit TransferredToSobloDapp(owner, spender, to, value, note, receiveType);
                return true;
            }
        }
        
        return false;
    }    

    /**
     * @dev 다계좌 전송 (postTransfer 를 호출하지 않음에 유의!)
     * 
     * @param from 보낼 토큰의 주인 (내부적으로 transferFrom 을 이용함)
     * @param to 토큰을 받을 주소
     * @param purpose 팀에게 보내기, 파트너에게 보내기, 바운티 참여자에게 보내기 등의 목적을 선택
     * @param note 일반적인 메모
     */ 
    function sobloMultiTransfer(
        address from, address[] to,
        uint256[] values,
        SobloTransferType purpose,
        string note
    ) onlyOwner public returns (bool ret) {
        uint256 length = to.length;
        require(length == values.length, "The size of \'to\' and \'values\' array is different.");
        require(uint8(purpose) < 6);

        ret = true;
        for (uint256 i = 0; i < length; i++) {
            require(to[i] != address(this), "The receive address is the Contact Address of Soblo Token. You cannot send money to this address.");

            ret = ret && super.transferFrom(from, to[i], values[i]); // 관리자 기능으로 post 프로세스(댑의 onReceived 를 일깨움)를 타지 않기 위해 super.transferFrom 를 호출한다.
            emit SobloMultiTransferred(from, msg.sender, to[i], values[i], purpose, balanceOf(from), balanceOf(to[i]), note);
        }
    }

    function destroy() onlyRoot public {
        selfdestruct(root);
    }
    
    
    
}




/**
 * @title SobloTokenDappBase
 */
contract SobloTokenDappBase is SobloTokenReceiver {
    address internal _sobloToken;
    event LogOnReceivedSobloToken(address indexed owner, address indexed spender, uint256 value, SobloTokenReceiveType receiveType);

    constructor(address sobloToken) public {
        _sobloToken = sobloToken;
    }
    
    modifier onlySobloToken() {
        require(msg.sender == _sobloToken, "msg.sender must be the registered token contract");
        _;
    }
    
    // Override this function
    function onSobloTokenReceived(address owner, address spender, uint256 value, SobloTokenReceiveType receiveType)
        public onlySobloToken returns (bool)
    {
        emit LogOnReceivedSobloToken(owner, spender, value, receiveType);
    }
}

Contract Security Audit

Contract ABI

[{"constant":false,"inputs":[{"name":"addr","type":"address"},{"name":"note","type":"string"}],"name":"unlockTo","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"owners","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"name","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"spender","type":"address"},{"name":"value","type":"uint256"}],"name":"approve","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"spender","type":"address"},{"name":"addedValue","type":"uint256"},{"name":"note","type":"string"}],"name":"sobloIncreaseApproval","outputs":[{"name":"ret","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"newSuperOwner","type":"address"}],"name":"changeSuperOwner","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"totalSupply","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"to","type":"address"},{"name":"value","type":"uint256"},{"name":"note","type":"string"}],"name":"sobloTransfer","outputs":[{"name":"ret","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"from","type":"address"},{"name":"to","type":"address"},{"name":"value","type":"uint256"}],"name":"transferFrom","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"INITIAL_SUPPLY","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"decimals","outputs":[{"name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"note","type":"string"}],"name":"lock","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"LOCK_MAX","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"newRoot","type":"address"}],"name":"changeRoot","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"getMyUnlockValue","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"unlockAddrs","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"spender","type":"address"},{"name":"value","type":"uint256"},{"name":"note","type":"string"}],"name":"sobloApprove","outputs":[{"name":"ret","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"spender","type":"address"},{"name":"subtractedValue","type":"uint256"}],"name":"decreaseApproval","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"addr","type":"address"},{"name":"note","type":"string"}],"name":"lockTo","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_owner","type":"address"}],"name":"balanceOf","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"spender","type":"address"},{"name":"subtractedValue","type":"uint256"},{"name":"note","type":"string"}],"name":"sobloDecreaseApproval","outputs":[{"name":"ret","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"destroy","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"owner","type":"address"}],"name":"newOwner","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"superOwner","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"symbol","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"to","type":"address"},{"name":"value","type":"uint256"}],"name":"transfer","outputs":[{"name":"ret","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"note","type":"string"}],"name":"unlock","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"lockValues","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"owner","type":"address"}],"name":"deleteOwner","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"locked","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"addr","type":"address"},{"name":"value","type":"uint256"},{"name":"note","type":"string"}],"name":"setLockValue","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"spender","type":"address"},{"name":"addedValue","type":"uint256"}],"name":"increaseApproval","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_owner","type":"address"},{"name":"_spender","type":"address"}],"name":"allowance","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"ownerList","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"from","type":"address"},{"name":"to","type":"address[]"},{"name":"values","type":"uint256[]"},{"name":"purpose","type":"uint8"},{"name":"note","type":"string"}],"name":"sobloMultiTransfer","outputs":[{"name":"ret","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"root","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"from","type":"address"},{"name":"to","type":"address"},{"name":"value","type":"uint256"},{"name":"note","type":"string"}],"name":"sobloTransferFrom","outputs":[{"name":"ret","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"inputs":[],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"name":"from","type":"address"},{"indexed":true,"name":"to","type":"address"},{"indexed":false,"name":"value","type":"uint256"},{"indexed":false,"name":"fromBalance","type":"uint256"},{"indexed":false,"name":"toBalance","type":"uint256"},{"indexed":false,"name":"note","type":"string"}],"name":"SobloTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"owner","type":"address"},{"indexed":true,"name":"spender","type":"address"},{"indexed":true,"name":"to","type":"address"},{"indexed":false,"name":"value","type":"uint256"},{"indexed":false,"name":"fromBalance","type":"uint256"},{"indexed":false,"name":"toBalance","type":"uint256"},{"indexed":false,"name":"note","type":"string"}],"name":"SobloTransferredFrom","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"owner","type":"address"},{"indexed":true,"name":"spender","type":"address"},{"indexed":false,"name":"value","type":"uint256"},{"indexed":false,"name":"note","type":"string"}],"name":"SobloApproval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"owner","type":"address"},{"indexed":true,"name":"spender","type":"address"},{"indexed":true,"name":"to","type":"address"},{"indexed":false,"name":"value","type":"uint256"},{"indexed":false,"name":"purpose","type":"uint8"},{"indexed":false,"name":"fromBalance","type":"uint256"},{"indexed":false,"name":"toBalance","type":"uint256"},{"indexed":false,"name":"note","type":"string"}],"name":"SobloMultiTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"owner","type":"address"},{"indexed":true,"name":"spender","type":"address"},{"indexed":true,"name":"to","type":"address"},{"indexed":false,"name":"value","type":"uint256"},{"indexed":false,"name":"note","type":"string"},{"indexed":false,"name":"receiveType","type":"uint8"}],"name":"TransferredToSobloDapp","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"locked","type":"bool"},{"indexed":false,"name":"note","type":"string"}],"name":"Locked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"addr","type":"address"},{"indexed":false,"name":"locked","type":"bool"},{"indexed":false,"name":"note","type":"string"}],"name":"LockedTo","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"addr","type":"address"},{"indexed":false,"name":"value","type":"uint256"},{"indexed":false,"name":"note","type":"string"}],"name":"SetLockValue","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"newRoot","type":"address"}],"name":"ChangedRoot","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"newSuperOwner","type":"address"}],"name":"ChangedSuperOwner","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"newOwner","type":"address"}],"name":"AddedNewOwner","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"deletedOwner","type":"address"}],"name":"DeletedOwner","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"owner","type":"address"},{"indexed":true,"name":"spender","type":"address"},{"indexed":false,"name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"from","type":"address"},{"indexed":true,"name":"to","type":"address"},{"indexed":false,"name":"value","type":"uint256"}],"name":"Transfer","type":"event"}]

60806040526001600760006101000a81548160ff0219169083151502179055503480156200002c57600080fd5b5033600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555033600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600160056000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060063390806001815401808255809150509060018203906000526020600020016000909192909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050620001df336040805190810160405280601681526020017f44656661756c7420556e6c6f636b20546f20526f6f7400000000000000000000815250620002a6640100000000026401000000009004565b601260ff16600a0a633b9aca0002600181905550601260ff16600a0a633b9aca00026000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055503373ffffffffffffffffffffffffffffffffffffffff1660007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef601260ff16600a0a633b9aca00026040518082815260200191505060405180910390a3620006d6565b600560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16151562000368576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601d8152602001807f4f776e65722070726976696c656467652069732072657175697265642e00000081525060200191505060405180910390fd5b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541415620003ee57620003ed826000836200050d640100000000026401000000009004565b5b6001600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff167f4bf46282901af80a4309ce07c36d841184ce98297f8735f7769d169497ac7a4c600083604051808315151515815260200180602001828103825283818151815260200191508051906020019080838360005b83811015620004cd578082015181840152602081019050620004b0565b50505050905090810190601f168015620004fb5780820380516001836020036101000a031916815260200191505b50935050505060405180910390a25050565b600560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161515620005cf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601d8152602001807f4f776e65722070726976696c656467652069732072657175697265642e00000081525060200191505060405180910390fd5b81600960008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff167fb19425af6288c6bb0d88f64d6d1cfe5eb7e2d31ee92f1012798df97a9b6b011a83836040518083815260200180602001828103825283818151815260200191508051906020019080838360005b838110156200069557808201518184015260208101905062000678565b50505050905090810190601f168015620006c35780820380516001836020036101000a031916815260200191505b50935050505060405180910390a2505050565b61517980620006e66000396000f3006080604052600436106101cc576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff1680623078b0146101d1578063022914a71461025a57806306fdde03146102b5578063095ea7b3146103455780630c870a6b146103aa5780631044c66b1461045557806318160ddd146104b05780631d07b1ec146104db57806323b872dd146105865780632ff2e9dc1461060b578063313ce56714610636578063320a98fd146106675780633d8731ac146106d05780634a7902d2146106fb5780634aa678c314610756578063505450d4146107815780635a791156146107dc57806366188463146108875780636bd5e26a146108ec57806370a08231146109755780637b5ac141146109cc57806383197ef014610a775780638595245414610a8e57806387dcd2b614610ae957806395d89b4114610b40578063a9059cbb14610bd0578063a96ce7aa14610c35578063cb619a3314610c9e578063cd5c4c7014610cf5578063cf30901214610d50578063d712800f14610d7f578063d73dd62314610e12578063dd62ed3e14610e77578063def79ab514610eee578063e22ca81914610f5b578063ebf0c7171461108f578063f913042b146110e6575b600080fd5b3480156101dd57600080fd5b50610258600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001908201803590602001908080601f01602080910402602001604051908101604052809392919081815260200183838082843782019150505050505091929192905050506111b1565b005b34801561026657600080fd5b5061029b600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611402565b604051808215151515815260200191505060405180910390f35b3480156102c157600080fd5b506102ca611422565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561030a5780820151818401526020810190506102ef565b50505050905090810190601f1680156103375780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561035157600080fd5b50610390600480360381019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919050505061145b565b604051808215151515815260200191505060405180910390f35b3480156103b657600080fd5b5061043b600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190803590602001908201803590602001908080601f01602080910402602001604051908101604052809392919081815260200183838082843782019150505050505091929192905050506114a5565b604051808215151515815260200191505060405180910390f35b34801561046157600080fd5b50610496600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611608565b604051808215151515815260200191505060405180910390f35b3480156104bc57600080fd5b506104c561186d565b6040518082815260200191505060405180910390f35b3480156104e757600080fd5b5061056c600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190803590602001908201803590602001908080601f0160208091040260200160405190810160405280939291908181526020018383808284378201915050505050509192919290505050611877565b604051808215151515815260200191505060405180910390f35b34801561059257600080fd5b506105f1600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611aa4565b604051808215151515815260200191505060405180910390f35b34801561061757600080fd5b50610620611af0565b6040518082815260200191505060405180910390f35b34801561064257600080fd5b5061064b611b01565b604051808260ff1660ff16815260200191505060405180910390f35b34801561067357600080fd5b506106ce600480360381019080803590602001908201803590602001908080601f0160208091040260200160405190810160405280939291908181526020018383808284378201915050505050509192919290505050611b06565b005b3480156106dc57600080fd5b506106e5611c9c565b6040518082815260200191505060405180910390f35b34801561070757600080fd5b5061073c600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611cc0565b604051808215151515815260200191505060405180910390f35b34801561076257600080fd5b5061076b611f25565b6040518082815260200191505060405180910390f35b34801561078d57600080fd5b506107c2600480360381019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506120bd565b604051808215151515815260200191505060405180910390f35b3480156107e857600080fd5b5061086d600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190803590602001908201803590602001908080601f01602080910402602001604051908101604052809392919081815260200183838082843782019150505050505091929192905050506120dd565b604051808215151515815260200191505060405180910390f35b34801561089357600080fd5b506108d2600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506121c4565b604051808215151515815260200191505060405180910390f35b3480156108f857600080fd5b50610973600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001908201803590602001908080601f016020809104026020016040519081016040528093929190818152602001838380828437820191505050505050919291929050505061220e565b005b34801561098157600080fd5b506109b6600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612416565b6040518082815260200191505060405180910390f35b3480156109d857600080fd5b50610a5d600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190803590602001908201803590602001908080601f016020809104026020016040519081016040528093929190818152602001838380828437820191505050505050919291929050505061245e565b604051808215151515815260200191505060405180910390f35b348015610a8357600080fd5b50610a8c6125c1565b005b348015610a9a57600080fd5b50610acf600480360381019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506126c1565b604051808215151515815260200191505060405180910390f35b348015610af557600080fd5b50610afe612ab1565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b348015610b4c57600080fd5b50610b55612ad7565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610b95578082015181840152602081019050610b7a565b50505050905090810190601f168015610bc25780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b348015610bdc57600080fd5b50610c1b600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050612b10565b604051808215151515815260200191505060405180910390f35b348015610c4157600080fd5b50610c9c600480360381019080803590602001908201803590602001908080601f0160208091040260200160405190810160405280939291908181526020018383808284378201915050505050509192919290505050612b5a565b005b348015610caa57600080fd5b50610cdf600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612cf0565b6040518082815260200191505060405180910390f35b348015610d0157600080fd5b50610d36600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612d08565b604051808215151515815260200191505060405180910390f35b348015610d5c57600080fd5b50610d656130fa565b604051808215151515815260200191505060405180910390f35b348015610d8b57600080fd5b50610e10600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190803590602001908201803590602001908080601f016020809104026020016040519081016040528093929190818152602001838380828437820191505050505050919291929050505061310d565b005b348015610e1e57600080fd5b50610e5d600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506132d2565b604051808215151515815260200191505060405180910390f35b348015610e8357600080fd5b50610ed8600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061331c565b6040518082815260200191505060405180910390f35b348015610efa57600080fd5b50610f19600480360381019080803590602001909291905050506133a3565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b348015610f6757600080fd5b50611075600480360381019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019082018035906020019080806020026020016040519081016040528093929190818152602001838360200280828437820191505050505050919291929080359060200190820180359060200190808060200260200160405190810160405280939291908181526020018383602002808284378201915050505050509192919290803560ff169060200190929190803590602001908201803590602001908080601f01602080910402602001604051908101604052809392919081815260200183838082843782019150505050505091929192905050506133e1565b604051808215151515815260200191505060405180910390f35b34801561109b57600080fd5b506110a4613864565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3480156110f257600080fd5b50611197600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190803590602001908201803590602001908080601f016020809104026020016040519081016040528093929190818152602001838380828437820191505050505050919291929050505061388a565b604051808215151515815260200191505060405180910390f35b600560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161515611272576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601d8152602001807f4f776e65722070726976696c656467652069732072657175697265642e00000081525060200191505060405180910390fd5b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205414156112e6576112e58260008361310d565b5b6001600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff167f4bf46282901af80a4309ce07c36d841184ce98297f8735f7769d169497ac7a4c600083604051808315151515815260200180602001828103825283818151815260200191508051906020019080838360005b838110156113c35780820151818401526020810190506113a8565b50505050905090810190601f1680156113f05780820380516001836020036101000a031916815260200191505b50935050505060405180910390a25050565b60056020528060005260406000206000915054906101000a900460ff1681565b6040805190810160405280600b81526020017f5748696e7420546f6b656e00000000000000000000000000000000000000000081525081565b600061149d83836040805190810160405280601381526020017f63616c6c656420627920617070726f76652829000000000000000000000000008152506120dd565b905092915050565b60006114b18484613ad0565b90508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f873a5dfdc9d3efb66def120ac20495bf0dc772d6e19c1b8bd78f43da51787e8a600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054856040518083815260200180602001828103825283818151815260200191508051906020019080838360005b838110156115c65780820151818401526020810190506115ab565b50505050905090810190601f1680156115f35780820380516001836020036101000a031916815260200191505b50935050505060405180910390a39392505050565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156116cf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f526f6f742070726976696c6567652069732072657175697265642e000000000081525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141515156117c0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260438152602001807f54686973206164647265737320746f20626520736574206973207a65726f206181526020017f6464726573732830292e20436865636b2074686520696e70757420616464726581526020017f73732e000000000000000000000000000000000000000000000000000000000081525060600191505060405180910390fd5b81600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507f94b17f1a4844062cbed00809347b0f8149fc88c5a3ea720c7aed42c559eed46d82604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a160019050919050565b6000600154905090565b60003073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415151561198f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260618152602001807f546865207265636569766520616464726573732069732074686520436f6e746181526020017f63742041646472657373206f6620536f626c6f20546f6b656e2e20596f75206381526020017f616e6e6f742073656e64206d6f6e657920746f2074686973206164647265737381526020017f2e0000000000000000000000000000000000000000000000000000000000000081525060800191505060405180910390fd5b6119998484613ccc565b90506119aa33338686866000613eea565b508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fa609c322062a32354cef4c3627f131b25e0a79ca1c09649756e6b790ddf7697485611a0433612416565b611a0d89612416565b876040518085815260200184815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b83811015611a60578082015181840152602081019050611a45565b50505050905090810190601f168015611a8d5780820380516001836020036101000a031916815260200191505b509550505050505060405180910390a39392505050565b6000611ae78484846040805190810160405280601881526020017f63616c6c6564206279207472616e7366657246726f6d2829000000000000000081525061388a565b90509392505050565b601260ff16600a0a633b9aca000281565b601281565b600560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161515611bc7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601d8152602001807f4f776e65722070726976696c656467652069732072657175697265642e00000081525060200191505060405180910390fd5b6001600760006101000a81548160ff0219169083151502179055507fc1086893b0a3f1d991fd25e26cd28cad11de174842b04a55cc2423ed178e4382600760009054906101000a900460ff1682604051808315151515815260200180602001828103825283818151815260200191508051906020019080838360005b83811015611c5e578082015181840152602081019050611c43565b50505050905090810190601f168015611c8b5780820380516001836020036101000a031916815260200191505b50935050505060405180910390a150565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611d87576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f526f6f742070726976696c6567652069732072657175697265642e000000000081525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614151515611e78576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260438152602001807f54686973206164647265737320746f20626520736574206973207a65726f206181526020017f6464726573732830292e20436865636b2074686520696e70757420616464726581526020017f73732e000000000000000000000000000000000000000000000000000000000081525060600191505060405180910390fd5b81600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507f43ddeae7116ae634a7d05c2d1c588bca11b7bbc8cb96fbb2cb9c5b1afdf9ce1282604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a160019050919050565b600080339050600760009054906101000a900460ff161580611f905750600860008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b80156120185750600960008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546000808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054115b156120b4576120ad600960008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461418e90919063ffffffff16565b91506120b9565b600091505b5090565b60086020528060005260406000206000915054906101000a900460ff1681565b60006120e98484614218565b90508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f873a5dfdc9d3efb66def120ac20495bf0dc772d6e19c1b8bd78f43da51787e8a85856040518083815260200180602001828103825283818151815260200191508051906020019080838360005b83811015612182578082015181840152602081019050612167565b50505050905090810190601f1680156121af5780820380516001836020036101000a031916815260200191505b50935050505060405180910390a39392505050565b600061220683836040805190810160405280601c81526020017f63616c6c6564206279206465637265617365417070726f76616c28290000000081525061245e565b905092915050565b600560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615156122cf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601d8152602001807f4f776e65722070726976696c656467652069732072657175697265642e00000081525060200191505060405180910390fd5b6122fa827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8361310d565b6000600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff167f4bf46282901af80a4309ce07c36d841184ce98297f8735f7769d169497ac7a4c600183604051808315151515815260200180602001828103825283818151815260200191508051906020019080838360005b838110156123d75780820151818401526020810190506123bc565b50505050905090810190601f1680156124045780820380516001836020036101000a031916815260200191505b50935050505060405180910390a25050565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b600061246a848461430a565b90508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f873a5dfdc9d3efb66def120ac20495bf0dc772d6e19c1b8bd78f43da51787e8a600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054856040518083815260200180602001828103825283818151815260200191508051906020019080838360005b8381101561257f578082015181840152602081019050612564565b50505050905090810190601f1680156125ac5780820380516001836020036101000a031916815260200191505b50935050505060405180910390a39392505050565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515612686576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f526f6f742070726976696c6567652069732072657175697265642e000000000081525060200191505060405180910390fd5b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16ff5b6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156127ae576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260228152602001807f53757065724f776e65722070726976696c65646765206973207265717569726581526020017f642e00000000000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415151561289f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260438152602001807f54686973206164647265737320746f20626520736574206973207a65726f206181526020017f6464726573732830292e20436865636b2074686520696e70757420616464726581526020017f73732e000000000000000000000000000000000000000000000000000000000081525060600191505060405180910390fd5b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16151515612987576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260238152602001807f54686973206164647265737320697320616c726561647920726567697374657281526020017f65642e000000000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b6001600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060068290806001815401808255809150509060018203906000526020600020016000909192909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550507f5446d64d957daf41eca8227aa8fa5eb7f92c617adf03fbd9df64e8eb564d824e82604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a160019050919050565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6040805190810160405280600581526020017f5748494e5400000000000000000000000000000000000000000000000000000081525081565b6000612b5283836040805190810160405280601481526020017f63616c6c6564206279207472616e736665722829000000000000000000000000815250611877565b905092915050565b600560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161515612c1b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601d8152602001807f4f776e65722070726976696c656467652069732072657175697265642e00000081525060200191505060405180910390fd5b6000600760006101000a81548160ff0219169083151502179055507fc1086893b0a3f1d991fd25e26cd28cad11de174842b04a55cc2423ed178e4382600760009054906101000a900460ff1682604051808315151515815260200180602001828103825283818151815260200191508051906020019080838360005b83811015612cb2578082015181840152602081019050612c97565b50505050905090810190601f168015612cdf5780820380516001836020036101000a031916815260200191505b50935050505060405180910390a150565b60096020528060005260406000206000915090505481565b600080600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515612df6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260228152602001807f53757065724f776e65722070726976696c65646765206973207265717569726581526020017f642e00000000000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161515612edd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260238152602001807f5468697320696e7075742061646472657373206973206e6f7420616e206f776e81526020017f65722e000000000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81549060ff0219169055600090505b60068054905081101561308d578273ffffffffffffffffffffffffffffffffffffffff16600682815481101515612f6457fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415613080576006612fc6600160068054905061418e90919063ffffffff16565b815481101515612fd257fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1660068281548110151561300c57fe5b9060005260206000200160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555061306d600160068054905061418e90919063ffffffff16565b60068161307a91906150fc565b5061308d565b8080600101915050612f31565b7f1e64d9a491033a9731fa82493f0ab60e9f74294eca27edd93629f1fbaa15d28783604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a16001915050919050565b600760009054906101000a900460ff1681565b600560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615156131ce576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601d8152602001807f4f776e65722070726976696c656467652069732072657175697265642e00000081525060200191505060405180910390fd5b81600960008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff167fb19425af6288c6bb0d88f64d6d1cfe5eb7e2d31ee92f1012798df97a9b6b011a83836040518083815260200180602001828103825283818151815260200191508051906020019080838360005b83811015613292578082015181840152602081019050613277565b50505050905090810190601f1680156132bf5780820380516001836020036101000a031916815260200191505b50935050505060405180910390a2505050565b600061331483836040805190810160405280601c81526020017f63616c6c656420627920696e637265617365417070726f76616c2829000000008152506114a5565b905092915050565b6000600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b6006818154811015156133b257fe5b906000526020600020016000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000806000600560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615156134a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601d8152602001807f4f776e65722070726976696c656467652069732072657175697265642e00000081525060200191505060405180910390fd5b86519150855182141515613549576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260318152602001807f5468652073697a65206f662027746f2720616e64202776616c7565732720617281526020017f72617920697320646966666572656e742e00000000000000000000000000000081525060400191505060405180910390fd5b600685600581111561355757fe5b60ff1610151561356657600080fd5b60019250600090505b81811015613859573073ffffffffffffffffffffffffffffffffffffffff16878281518110151561359c57fe5b9060200190602002015173ffffffffffffffffffffffffffffffffffffffff16141515156136a4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260618152602001807f546865207265636569766520616464726573732069732074686520436f6e746181526020017f63742041646472657373206f6620536f626c6f20546f6b656e2e20596f75206381526020017f616e6e6f742073656e64206d6f6e657920746f2074686973206164647265737381526020017f2e0000000000000000000000000000000000000000000000000000000000000081525060800191505060405180910390fd5b8280156136e657506136e58888838151811015156136be57fe5b9060200190602002015188848151811015156136d657fe5b9060200190602002015161459b565b5b925086818151811015156136f657fe5b9060200190602002015173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff167f88098165ed6db5b0cb36499c27d46197630154717a26b48aede92bd7cd6ee12b898581518110151561377357fe5b90602001906020020151896137878e612416565b6137a78e8981518110151561379857fe5b90602001906020020151612416565b8b604051808681526020018560058111156137be57fe5b60ff16815260200184815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b8381101561380e5780820151818401526020810190506137f3565b50505050905090810190601f16801561383b5780820380516001836020036101000a031916815260200191505b50965050505050505060405180910390a4808060010191505061356f565b505095945050505050565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60003073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16141515156139a2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260618152602001807f546865207265636569766520616464726573732069732074686520436f6e746181526020017f63742041646472657373206f6620536f626c6f20546f6b656e2e20596f75206381526020017f616e6e6f742073656e64206d6f6e657920746f2074686973206164647265737381526020017f2e0000000000000000000000000000000000000000000000000000000000000081525060800191505060405180910390fd5b6139ad85858561459b565b90506139be85338686866000613eea565b508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167f98885723734242dd9facd4a9d474af4699a809ba2f59ecf9c30a223b905007ee86613a2f8a612416565b613a388a612416565b886040518085815260200184815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b83811015613a8b578082015181840152602081019050613a70565b50505050905090810190601f168015613ab85780820380516001836020036101000a031916815260200191505b509550505050505060405180910390a4949350505050565b6000613b6182600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546147bb90919063ffffffff16565b600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546040518082815260200191505060405180910390a36001905092915050565b60003382600760009054906101000a900460ff161580613d355750600860008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b1515613da9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f546865206163636f756e742069732063757272656e746c79206c6f636b65642e81525060200191505060405180910390fd5b600960008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054613e3a826000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461418e90919063ffffffff16565b10151515613ed6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260408152602001807f5472616e7366657261626c65206c696d69742065786365656465642e2043686581526020017f636b2074686520737461747573206f6620746865206c6f636b2076616c75652e81525060400191505060405180910390fd5b613ee08585614845565b9250505092915050565b600080613f0c8673ffffffffffffffffffffffffffffffffffffffff16614b82565b1561417e578573ffffffffffffffffffffffffffffffffffffffff1660405180807f6f6e536f626c6f546f6b656e526563656976656428616464726573732c61646481526020017f726573732c75696e743235362c75696e74382900000000000000000000000000815250603301905060405180910390207c01000000000000000000000000000000000000000000000000000000009004898988876040518563ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200183815260200182600181111561404d57fe5b60ff1681526020019450505050506000604051808303816000875af1925050509050801561417d578573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff167f52bcea5f2b1d4e11b2c554106feef51ce4146f2b5fe97e8b026576e10793339388888860405180848152602001806020018360018111156140f857fe5b60ff168152602001828103825284818151815260200191508051906020019080838360005b8381101561413857808201518184015260208101905061411d565b50505050905090810190601f1680156141655780820380516001836020036101000a031916815260200191505b5094505050505060405180910390a460019150614183565b5b600091505b509695505050505050565b600080838311151515614209576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601e8152602001807f536166654d6174683a207375627472616374696f6e206f766572666c6f77000081525060200191505060405180910390fd5b82840390508091505092915050565b600081600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040518082815260200191505060405180910390a36001905092915050565b600080600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490508083111561441b576000600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506144af565b61442e838261418e90919063ffffffff16565b600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b8373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546040518082815260200191505060405180910390a3600191505092915050565b60008382600760009054906101000a900460ff1615806146045750600860008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b1515614678576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f546865206163636f756e742069732063757272656e746c79206c6f636b65642e81525060200191505060405180910390fd5b600960008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054614709826000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461418e90919063ffffffff16565b101515156147a5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260408152602001807f5472616e7366657261626c65206c696d69742065786365656465642e2043686581526020017f636b2074686520737461747573206f6620746865206c6f636b2076616c75652e81525060400191505060405180910390fd5b6147b0868686614b95565b925050509392505050565b600080828401905083811015151561483b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f536166654d6174683a206164646974696f6e206f766572666c6f77000000000081525060200191505060405180910390fd5b8091505092915050565b60008073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614151515614911576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603e8152602001807f526563697069656e742061646472657373206973207a65726f2061646472657381526020017f732830292e20436865636b20746865206164647265737320616761696e2e000081525060400191505060405180910390fd5b6000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205482111515156149ed576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260278152602001807f5468652062616c616e6365206f66206163636f756e7420697320696e7375666681526020017f696369656e742e0000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b614a3e826000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461418e90919063ffffffff16565b6000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550614ad1826000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546147bb90919063ffffffff16565b6000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a36001905092915050565b600080823b905060008111915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614151515614c61576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603e8152602001807f526563697069656e742061646472657373206973207a65726f2061646472657381526020017f732830292e20436865636b20746865206164647265737320616761696e2e000081525060400191505060405180910390fd5b6000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020548211151515614d3d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260278152602001807f5468652062616c616e6365206f66206163636f756e7420697320696e7375666681526020017f696369656e742e0000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020548211151515614e57576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260308152602001807f496e73756666696369656e7420746f6b656e7320617070726f7665642066726f81526020017f6d206163636f756e74206f776e65722e0000000000000000000000000000000081525060400191505060405180910390fd5b614ea8826000808773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461418e90919063ffffffff16565b6000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550614f3b826000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546147bb90919063ffffffff16565b6000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061500c82600260008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461418e90919063ffffffff16565b600260008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a3600190509392505050565b815481835581811115615123578183600052602060002091820191016151229190615128565b5b505050565b61514a91905b8082111561514657600081600090555060010161512e565b5090565b905600a165627a7a72305820a1d8fa0ee0acac4df746aa903e38529923a5c9c5f96c4ea6a1c5b4ab918a31f40029

Deployed Bytecode

0x6080604052600436106101cc576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff1680623078b0146101d1578063022914a71461025a57806306fdde03146102b5578063095ea7b3146103455780630c870a6b146103aa5780631044c66b1461045557806318160ddd146104b05780631d07b1ec146104db57806323b872dd146105865780632ff2e9dc1461060b578063313ce56714610636578063320a98fd146106675780633d8731ac146106d05780634a7902d2146106fb5780634aa678c314610756578063505450d4146107815780635a791156146107dc57806366188463146108875780636bd5e26a146108ec57806370a08231146109755780637b5ac141146109cc57806383197ef014610a775780638595245414610a8e57806387dcd2b614610ae957806395d89b4114610b40578063a9059cbb14610bd0578063a96ce7aa14610c35578063cb619a3314610c9e578063cd5c4c7014610cf5578063cf30901214610d50578063d712800f14610d7f578063d73dd62314610e12578063dd62ed3e14610e77578063def79ab514610eee578063e22ca81914610f5b578063ebf0c7171461108f578063f913042b146110e6575b600080fd5b3480156101dd57600080fd5b50610258600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001908201803590602001908080601f01602080910402602001604051908101604052809392919081815260200183838082843782019150505050505091929192905050506111b1565b005b34801561026657600080fd5b5061029b600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611402565b604051808215151515815260200191505060405180910390f35b3480156102c157600080fd5b506102ca611422565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561030a5780820151818401526020810190506102ef565b50505050905090810190601f1680156103375780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561035157600080fd5b50610390600480360381019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919050505061145b565b604051808215151515815260200191505060405180910390f35b3480156103b657600080fd5b5061043b600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190803590602001908201803590602001908080601f01602080910402602001604051908101604052809392919081815260200183838082843782019150505050505091929192905050506114a5565b604051808215151515815260200191505060405180910390f35b34801561046157600080fd5b50610496600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611608565b604051808215151515815260200191505060405180910390f35b3480156104bc57600080fd5b506104c561186d565b6040518082815260200191505060405180910390f35b3480156104e757600080fd5b5061056c600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190803590602001908201803590602001908080601f0160208091040260200160405190810160405280939291908181526020018383808284378201915050505050509192919290505050611877565b604051808215151515815260200191505060405180910390f35b34801561059257600080fd5b506105f1600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611aa4565b604051808215151515815260200191505060405180910390f35b34801561061757600080fd5b50610620611af0565b6040518082815260200191505060405180910390f35b34801561064257600080fd5b5061064b611b01565b604051808260ff1660ff16815260200191505060405180910390f35b34801561067357600080fd5b506106ce600480360381019080803590602001908201803590602001908080601f0160208091040260200160405190810160405280939291908181526020018383808284378201915050505050509192919290505050611b06565b005b3480156106dc57600080fd5b506106e5611c9c565b6040518082815260200191505060405180910390f35b34801561070757600080fd5b5061073c600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611cc0565b604051808215151515815260200191505060405180910390f35b34801561076257600080fd5b5061076b611f25565b6040518082815260200191505060405180910390f35b34801561078d57600080fd5b506107c2600480360381019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506120bd565b604051808215151515815260200191505060405180910390f35b3480156107e857600080fd5b5061086d600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190803590602001908201803590602001908080601f01602080910402602001604051908101604052809392919081815260200183838082843782019150505050505091929192905050506120dd565b604051808215151515815260200191505060405180910390f35b34801561089357600080fd5b506108d2600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506121c4565b604051808215151515815260200191505060405180910390f35b3480156108f857600080fd5b50610973600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001908201803590602001908080601f016020809104026020016040519081016040528093929190818152602001838380828437820191505050505050919291929050505061220e565b005b34801561098157600080fd5b506109b6600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612416565b6040518082815260200191505060405180910390f35b3480156109d857600080fd5b50610a5d600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190803590602001908201803590602001908080601f016020809104026020016040519081016040528093929190818152602001838380828437820191505050505050919291929050505061245e565b604051808215151515815260200191505060405180910390f35b348015610a8357600080fd5b50610a8c6125c1565b005b348015610a9a57600080fd5b50610acf600480360381019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506126c1565b604051808215151515815260200191505060405180910390f35b348015610af557600080fd5b50610afe612ab1565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b348015610b4c57600080fd5b50610b55612ad7565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610b95578082015181840152602081019050610b7a565b50505050905090810190601f168015610bc25780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b348015610bdc57600080fd5b50610c1b600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050612b10565b604051808215151515815260200191505060405180910390f35b348015610c4157600080fd5b50610c9c600480360381019080803590602001908201803590602001908080601f0160208091040260200160405190810160405280939291908181526020018383808284378201915050505050509192919290505050612b5a565b005b348015610caa57600080fd5b50610cdf600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612cf0565b6040518082815260200191505060405180910390f35b348015610d0157600080fd5b50610d36600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612d08565b604051808215151515815260200191505060405180910390f35b348015610d5c57600080fd5b50610d656130fa565b604051808215151515815260200191505060405180910390f35b348015610d8b57600080fd5b50610e10600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190803590602001908201803590602001908080601f016020809104026020016040519081016040528093929190818152602001838380828437820191505050505050919291929050505061310d565b005b348015610e1e57600080fd5b50610e5d600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506132d2565b604051808215151515815260200191505060405180910390f35b348015610e8357600080fd5b50610ed8600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061331c565b6040518082815260200191505060405180910390f35b348015610efa57600080fd5b50610f19600480360381019080803590602001909291905050506133a3565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b348015610f6757600080fd5b50611075600480360381019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019082018035906020019080806020026020016040519081016040528093929190818152602001838360200280828437820191505050505050919291929080359060200190820180359060200190808060200260200160405190810160405280939291908181526020018383602002808284378201915050505050509192919290803560ff169060200190929190803590602001908201803590602001908080601f01602080910402602001604051908101604052809392919081815260200183838082843782019150505050505091929192905050506133e1565b604051808215151515815260200191505060405180910390f35b34801561109b57600080fd5b506110a4613864565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3480156110f257600080fd5b50611197600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190803590602001908201803590602001908080601f016020809104026020016040519081016040528093929190818152602001838380828437820191505050505050919291929050505061388a565b604051808215151515815260200191505060405180910390f35b600560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161515611272576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601d8152602001807f4f776e65722070726976696c656467652069732072657175697265642e00000081525060200191505060405180910390fd5b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205414156112e6576112e58260008361310d565b5b6001600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff167f4bf46282901af80a4309ce07c36d841184ce98297f8735f7769d169497ac7a4c600083604051808315151515815260200180602001828103825283818151815260200191508051906020019080838360005b838110156113c35780820151818401526020810190506113a8565b50505050905090810190601f1680156113f05780820380516001836020036101000a031916815260200191505b50935050505060405180910390a25050565b60056020528060005260406000206000915054906101000a900460ff1681565b6040805190810160405280600b81526020017f5748696e7420546f6b656e00000000000000000000000000000000000000000081525081565b600061149d83836040805190810160405280601381526020017f63616c6c656420627920617070726f76652829000000000000000000000000008152506120dd565b905092915050565b60006114b18484613ad0565b90508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f873a5dfdc9d3efb66def120ac20495bf0dc772d6e19c1b8bd78f43da51787e8a600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054856040518083815260200180602001828103825283818151815260200191508051906020019080838360005b838110156115c65780820151818401526020810190506115ab565b50505050905090810190601f1680156115f35780820380516001836020036101000a031916815260200191505b50935050505060405180910390a39392505050565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156116cf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f526f6f742070726976696c6567652069732072657175697265642e000000000081525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141515156117c0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260438152602001807f54686973206164647265737320746f20626520736574206973207a65726f206181526020017f6464726573732830292e20436865636b2074686520696e70757420616464726581526020017f73732e000000000000000000000000000000000000000000000000000000000081525060600191505060405180910390fd5b81600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507f94b17f1a4844062cbed00809347b0f8149fc88c5a3ea720c7aed42c559eed46d82604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a160019050919050565b6000600154905090565b60003073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415151561198f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260618152602001807f546865207265636569766520616464726573732069732074686520436f6e746181526020017f63742041646472657373206f6620536f626c6f20546f6b656e2e20596f75206381526020017f616e6e6f742073656e64206d6f6e657920746f2074686973206164647265737381526020017f2e0000000000000000000000000000000000000000000000000000000000000081525060800191505060405180910390fd5b6119998484613ccc565b90506119aa33338686866000613eea565b508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fa609c322062a32354cef4c3627f131b25e0a79ca1c09649756e6b790ddf7697485611a0433612416565b611a0d89612416565b876040518085815260200184815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b83811015611a60578082015181840152602081019050611a45565b50505050905090810190601f168015611a8d5780820380516001836020036101000a031916815260200191505b509550505050505060405180910390a39392505050565b6000611ae78484846040805190810160405280601881526020017f63616c6c6564206279207472616e7366657246726f6d2829000000000000000081525061388a565b90509392505050565b601260ff16600a0a633b9aca000281565b601281565b600560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161515611bc7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601d8152602001807f4f776e65722070726976696c656467652069732072657175697265642e00000081525060200191505060405180910390fd5b6001600760006101000a81548160ff0219169083151502179055507fc1086893b0a3f1d991fd25e26cd28cad11de174842b04a55cc2423ed178e4382600760009054906101000a900460ff1682604051808315151515815260200180602001828103825283818151815260200191508051906020019080838360005b83811015611c5e578082015181840152602081019050611c43565b50505050905090810190601f168015611c8b5780820380516001836020036101000a031916815260200191505b50935050505060405180910390a150565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611d87576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f526f6f742070726976696c6567652069732072657175697265642e000000000081525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614151515611e78576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260438152602001807f54686973206164647265737320746f20626520736574206973207a65726f206181526020017f6464726573732830292e20436865636b2074686520696e70757420616464726581526020017f73732e000000000000000000000000000000000000000000000000000000000081525060600191505060405180910390fd5b81600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507f43ddeae7116ae634a7d05c2d1c588bca11b7bbc8cb96fbb2cb9c5b1afdf9ce1282604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a160019050919050565b600080339050600760009054906101000a900460ff161580611f905750600860008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b80156120185750600960008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546000808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054115b156120b4576120ad600960008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461418e90919063ffffffff16565b91506120b9565b600091505b5090565b60086020528060005260406000206000915054906101000a900460ff1681565b60006120e98484614218565b90508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f873a5dfdc9d3efb66def120ac20495bf0dc772d6e19c1b8bd78f43da51787e8a85856040518083815260200180602001828103825283818151815260200191508051906020019080838360005b83811015612182578082015181840152602081019050612167565b50505050905090810190601f1680156121af5780820380516001836020036101000a031916815260200191505b50935050505060405180910390a39392505050565b600061220683836040805190810160405280601c81526020017f63616c6c6564206279206465637265617365417070726f76616c28290000000081525061245e565b905092915050565b600560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615156122cf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601d8152602001807f4f776e65722070726976696c656467652069732072657175697265642e00000081525060200191505060405180910390fd5b6122fa827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8361310d565b6000600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff167f4bf46282901af80a4309ce07c36d841184ce98297f8735f7769d169497ac7a4c600183604051808315151515815260200180602001828103825283818151815260200191508051906020019080838360005b838110156123d75780820151818401526020810190506123bc565b50505050905090810190601f1680156124045780820380516001836020036101000a031916815260200191505b50935050505060405180910390a25050565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b600061246a848461430a565b90508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f873a5dfdc9d3efb66def120ac20495bf0dc772d6e19c1b8bd78f43da51787e8a600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054856040518083815260200180602001828103825283818151815260200191508051906020019080838360005b8381101561257f578082015181840152602081019050612564565b50505050905090810190601f1680156125ac5780820380516001836020036101000a031916815260200191505b50935050505060405180910390a39392505050565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515612686576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f526f6f742070726976696c6567652069732072657175697265642e000000000081525060200191505060405180910390fd5b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16ff5b6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156127ae576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260228152602001807f53757065724f776e65722070726976696c65646765206973207265717569726581526020017f642e00000000000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415151561289f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260438152602001807f54686973206164647265737320746f20626520736574206973207a65726f206181526020017f6464726573732830292e20436865636b2074686520696e70757420616464726581526020017f73732e000000000000000000000000000000000000000000000000000000000081525060600191505060405180910390fd5b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16151515612987576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260238152602001807f54686973206164647265737320697320616c726561647920726567697374657281526020017f65642e000000000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b6001600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060068290806001815401808255809150509060018203906000526020600020016000909192909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550507f5446d64d957daf41eca8227aa8fa5eb7f92c617adf03fbd9df64e8eb564d824e82604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a160019050919050565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6040805190810160405280600581526020017f5748494e5400000000000000000000000000000000000000000000000000000081525081565b6000612b5283836040805190810160405280601481526020017f63616c6c6564206279207472616e736665722829000000000000000000000000815250611877565b905092915050565b600560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161515612c1b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601d8152602001807f4f776e65722070726976696c656467652069732072657175697265642e00000081525060200191505060405180910390fd5b6000600760006101000a81548160ff0219169083151502179055507fc1086893b0a3f1d991fd25e26cd28cad11de174842b04a55cc2423ed178e4382600760009054906101000a900460ff1682604051808315151515815260200180602001828103825283818151815260200191508051906020019080838360005b83811015612cb2578082015181840152602081019050612c97565b50505050905090810190601f168015612cdf5780820380516001836020036101000a031916815260200191505b50935050505060405180910390a150565b60096020528060005260406000206000915090505481565b600080600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515612df6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260228152602001807f53757065724f776e65722070726976696c65646765206973207265717569726581526020017f642e00000000000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161515612edd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260238152602001807f5468697320696e7075742061646472657373206973206e6f7420616e206f776e81526020017f65722e000000000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81549060ff0219169055600090505b60068054905081101561308d578273ffffffffffffffffffffffffffffffffffffffff16600682815481101515612f6457fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415613080576006612fc6600160068054905061418e90919063ffffffff16565b815481101515612fd257fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1660068281548110151561300c57fe5b9060005260206000200160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555061306d600160068054905061418e90919063ffffffff16565b60068161307a91906150fc565b5061308d565b8080600101915050612f31565b7f1e64d9a491033a9731fa82493f0ab60e9f74294eca27edd93629f1fbaa15d28783604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a16001915050919050565b600760009054906101000a900460ff1681565b600560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615156131ce576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601d8152602001807f4f776e65722070726976696c656467652069732072657175697265642e00000081525060200191505060405180910390fd5b81600960008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff167fb19425af6288c6bb0d88f64d6d1cfe5eb7e2d31ee92f1012798df97a9b6b011a83836040518083815260200180602001828103825283818151815260200191508051906020019080838360005b83811015613292578082015181840152602081019050613277565b50505050905090810190601f1680156132bf5780820380516001836020036101000a031916815260200191505b50935050505060405180910390a2505050565b600061331483836040805190810160405280601c81526020017f63616c6c656420627920696e637265617365417070726f76616c2829000000008152506114a5565b905092915050565b6000600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b6006818154811015156133b257fe5b906000526020600020016000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000806000600560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615156134a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601d8152602001807f4f776e65722070726976696c656467652069732072657175697265642e00000081525060200191505060405180910390fd5b86519150855182141515613549576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260318152602001807f5468652073697a65206f662027746f2720616e64202776616c7565732720617281526020017f72617920697320646966666572656e742e00000000000000000000000000000081525060400191505060405180910390fd5b600685600581111561355757fe5b60ff1610151561356657600080fd5b60019250600090505b81811015613859573073ffffffffffffffffffffffffffffffffffffffff16878281518110151561359c57fe5b9060200190602002015173ffffffffffffffffffffffffffffffffffffffff16141515156136a4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260618152602001807f546865207265636569766520616464726573732069732074686520436f6e746181526020017f63742041646472657373206f6620536f626c6f20546f6b656e2e20596f75206381526020017f616e6e6f742073656e64206d6f6e657920746f2074686973206164647265737381526020017f2e0000000000000000000000000000000000000000000000000000000000000081525060800191505060405180910390fd5b8280156136e657506136e58888838151811015156136be57fe5b9060200190602002015188848151811015156136d657fe5b9060200190602002015161459b565b5b925086818151811015156136f657fe5b9060200190602002015173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff167f88098165ed6db5b0cb36499c27d46197630154717a26b48aede92bd7cd6ee12b898581518110151561377357fe5b90602001906020020151896137878e612416565b6137a78e8981518110151561379857fe5b90602001906020020151612416565b8b604051808681526020018560058111156137be57fe5b60ff16815260200184815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b8381101561380e5780820151818401526020810190506137f3565b50505050905090810190601f16801561383b5780820380516001836020036101000a031916815260200191505b50965050505050505060405180910390a4808060010191505061356f565b505095945050505050565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60003073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16141515156139a2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260618152602001807f546865207265636569766520616464726573732069732074686520436f6e746181526020017f63742041646472657373206f6620536f626c6f20546f6b656e2e20596f75206381526020017f616e6e6f742073656e64206d6f6e657920746f2074686973206164647265737381526020017f2e0000000000000000000000000000000000000000000000000000000000000081525060800191505060405180910390fd5b6139ad85858561459b565b90506139be85338686866000613eea565b508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167f98885723734242dd9facd4a9d474af4699a809ba2f59ecf9c30a223b905007ee86613a2f8a612416565b613a388a612416565b886040518085815260200184815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b83811015613a8b578082015181840152602081019050613a70565b50505050905090810190601f168015613ab85780820380516001836020036101000a031916815260200191505b509550505050505060405180910390a4949350505050565b6000613b6182600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546147bb90919063ffffffff16565b600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546040518082815260200191505060405180910390a36001905092915050565b60003382600760009054906101000a900460ff161580613d355750600860008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b1515613da9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f546865206163636f756e742069732063757272656e746c79206c6f636b65642e81525060200191505060405180910390fd5b600960008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054613e3a826000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461418e90919063ffffffff16565b10151515613ed6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260408152602001807f5472616e7366657261626c65206c696d69742065786365656465642e2043686581526020017f636b2074686520737461747573206f6620746865206c6f636b2076616c75652e81525060400191505060405180910390fd5b613ee08585614845565b9250505092915050565b600080613f0c8673ffffffffffffffffffffffffffffffffffffffff16614b82565b1561417e578573ffffffffffffffffffffffffffffffffffffffff1660405180807f6f6e536f626c6f546f6b656e526563656976656428616464726573732c61646481526020017f726573732c75696e743235362c75696e74382900000000000000000000000000815250603301905060405180910390207c01000000000000000000000000000000000000000000000000000000009004898988876040518563ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200183815260200182600181111561404d57fe5b60ff1681526020019450505050506000604051808303816000875af1925050509050801561417d578573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff167f52bcea5f2b1d4e11b2c554106feef51ce4146f2b5fe97e8b026576e10793339388888860405180848152602001806020018360018111156140f857fe5b60ff168152602001828103825284818151815260200191508051906020019080838360005b8381101561413857808201518184015260208101905061411d565b50505050905090810190601f1680156141655780820380516001836020036101000a031916815260200191505b5094505050505060405180910390a460019150614183565b5b600091505b509695505050505050565b600080838311151515614209576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601e8152602001807f536166654d6174683a207375627472616374696f6e206f766572666c6f77000081525060200191505060405180910390fd5b82840390508091505092915050565b600081600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040518082815260200191505060405180910390a36001905092915050565b600080600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490508083111561441b576000600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506144af565b61442e838261418e90919063ffffffff16565b600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b8373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546040518082815260200191505060405180910390a3600191505092915050565b60008382600760009054906101000a900460ff1615806146045750600860008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b1515614678576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f546865206163636f756e742069732063757272656e746c79206c6f636b65642e81525060200191505060405180910390fd5b600960008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054614709826000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461418e90919063ffffffff16565b101515156147a5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260408152602001807f5472616e7366657261626c65206c696d69742065786365656465642e2043686581526020017f636b2074686520737461747573206f6620746865206c6f636b2076616c75652e81525060400191505060405180910390fd5b6147b0868686614b95565b925050509392505050565b600080828401905083811015151561483b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f536166654d6174683a206164646974696f6e206f766572666c6f77000000000081525060200191505060405180910390fd5b8091505092915050565b60008073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614151515614911576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603e8152602001807f526563697069656e742061646472657373206973207a65726f2061646472657381526020017f732830292e20436865636b20746865206164647265737320616761696e2e000081525060400191505060405180910390fd5b6000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205482111515156149ed576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260278152602001807f5468652062616c616e6365206f66206163636f756e7420697320696e7375666681526020017f696369656e742e0000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b614a3e826000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461418e90919063ffffffff16565b6000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550614ad1826000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546147bb90919063ffffffff16565b6000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a36001905092915050565b600080823b905060008111915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614151515614c61576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603e8152602001807f526563697069656e742061646472657373206973207a65726f2061646472657381526020017f732830292e20436865636b20746865206164647265737320616761696e2e000081525060400191505060405180910390fd5b6000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020548211151515614d3d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260278152602001807f5468652062616c616e6365206f66206163636f756e7420697320696e7375666681526020017f696369656e742e0000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020548211151515614e57576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260308152602001807f496e73756666696369656e7420746f6b656e7320617070726f7665642066726f81526020017f6d206163636f756e74206f776e65722e0000000000000000000000000000000081525060400191505060405180910390fd5b614ea8826000808773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461418e90919063ffffffff16565b6000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550614f3b826000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546147bb90919063ffffffff16565b6000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061500c82600260008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461418e90919063ffffffff16565b600260008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a3600190509392505050565b815481835581811115615123578183600052602060002091820191016151229190615128565b5b505050565b61514a91905b8082111561514657600081600090555060010161512e565b5090565b905600a165627a7a72305820a1d8fa0ee0acac4df746aa903e38529923a5c9c5f96c4ea6a1c5b4ab918a31f40029

Deployed Bytecode Sourcemap

82:430:2:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16022:229:1;;8:9:-1;5:2;;;30:1;27;20:12;5:2;16022:229:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11615:39;;8:9:-1;5:2;;;30:1;27;20:12;5:2;11615:39:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;121:43:2;;8:9:-1;5:2;;;30:1;27;20:12;5:2;121:43:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;121:43:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20085:146:1;;8:9:-1;5:2;;;30:1;27;20:12;5:2;20085:146:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20639:258;;8:9:-1;5:2;;;30:1;27;20:12;5:2;20639:258:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13185:310;;8:9:-1;5:2;;;30:1;27;20:12;5:2;13185:310:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5297:89;;8:9:-1;5:2;;;30:1;27;20:12;5:2;5297:89:1;;;;;;;;;;;;;;;;;;;;;;;18870:504;;8:9:-1;5:2;;;30:1;27;20:12;5:2;18870:504:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19380:171;;8:9:-1;5:2;;;30:1;27;20:12;5:2;19380:171:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;261:72:2;;8:9:-1;5:2;;;30:1;27;20:12;5:2;261:72:2;;;;;;;;;;;;;;;;;;;;;;;215:35;;8:9:-1;5:2;;;30:1;27;20:12;5:2;215:35:2;;;;;;;;;;;;;;;;;;;;;;;;;;;15595:109:1;;8:9:-1;5:2;;;30:1;27;20:12;5:2;15595:109:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14523:46;;8:9:-1;5:2;;;30:1;27;20:12;5:2;14523:46:1;;;;;;;;;;;;;;;;;;;;;;;12644:268;;8:9:-1;5:2;;;30:1;27;20:12;5:2;12644:268:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16497:273;;8:9:-1;5:2;;;30:1;27;20:12;5:2;16497:273:1;;;;;;;;;;;;;;;;;;;;;;;14655:43;;8:9:-1;5:2;;;30:1;27;20:12;5:2;14655:43:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20237:207;;8:9:-1;5:2;;;30:1;27;20:12;5:2;20237:207:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20903:193;;8:9:-1;5:2;;;30:1;27;20:12;5:2;20903:193:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15828:188;;8:9:-1;5:2;;;30:1;27;20:12;5:2;15828:188:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6222:105;;8:9:-1;5:2;;;30:1;27;20:12;5:2;6222:105:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21102:268;;8:9:-1;5:2;;;30:1;27;20:12;5:2;21102:268:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23439:70;;8:9:-1;5:2;;;30:1;27;20:12;5:2;23439:70:1;;;;;;13502:377;;8:9:-1;5:2;;;30:1;27;20:12;5:2;13502:377:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11584:25;;8:9:-1;5:2;;;30:1;27;20:12;5:2;11584:25:1;;;;;;;;;;;;;;;;;;;;;;;;;;;170:39:2;;8:9:-1;5:2;;;30:1;27;20:12;5:2;170:39:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;170:39:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18721:143:1;;8:9:-1;5:2;;;30:1;27;20:12;5:2;18721:143:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15710:112;;8:9:-1;5:2;;;30:1;27;20:12;5:2;15710:112:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14975:45;;8:9:-1;5:2;;;30:1;27;20:12;5:2;14975:45:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13885:510;;8:9:-1;5:2;;;30:1;27;20:12;5:2;13885:510:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14492:25;;8:9:-1;5:2;;;30:1;27;20:12;5:2;14492:25:1;;;;;;;;;;;;;;;;;;;;;;;;;;;16257:168;;8:9:-1;5:2;;;30:1;27;20:12;5:2;16257:168:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20450:183;;8:9:-1;5:2;;;30:1;27;20:12;5:2;20450:183:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9349:170;;8:9:-1;5:2;;;30:1;27;20:12;5:2;9349:170:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11660:26;;8:9:-1;5:2;;;30:1;27;20:12;5:2;11660:26:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22508:925;;8:9:-1;5:2;;;30:1;27;20:12;5:2;22508:925:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11458:19;;8:9:-1;5:2;;;30:1;27;20:12;5:2;11458:19:1;;;;;;;;;;;;;;;;;;;;;;;;;;;19557:522;;8:9:-1;5:2;;;30:1;27;20:12;5:2;19557:522:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16022:229;12317:6;:18;12324:10;12317:18;;;;;;;;;;;;;;;;;;;;;;;;;12309:60;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14566:2;16098:10;:16;16109:4;16098:16;;;;;;;;;;;;;;;;:28;16094:73;;;16140:27;16153:4;16159:1;16162:4;16140:12;:27::i;:::-;16094:73;16197:4;16177:11;:17;16189:4;16177:17;;;;;;;;;;;;;;;;:24;;;;;;;;;;;;;;;;;;16226:4;16217:27;;;16232:5;16239:4;16217:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;16217:27:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16022:229;;:::o;11615:39::-;;;;;;;;;;;;;;;;;;;;;;:::o;121:43:2:-;;;;;;;;;;;;;;;;;;;;:::o;20085:146:1:-;20150:4;20173:51;20186:7;20195:5;20173:51;;;;;;;;;;;;;;;;;;:12;:51::i;:::-;20166:58;;20085:146;;;;:::o;20639:258::-;20736:8;20762:43;20785:7;20794:10;20762:22;:43::i;:::-;20756:49;;20846:7;20820:70;;20834:10;20820:70;;;20855:7;:19;20863:10;20855:19;;;;;;;;;;;;;;;:28;20875:7;20855:28;;;;;;;;;;;;;;;;20885:4;20820:70;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;20820:70:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20639:258;;;;;:::o;13185:310::-;13259:4;12087;;;;;;;;;;;12073:18;;:10;:18;;;12065:58;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13308:1;13283:27;;:13;:27;;;;13275:107;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13406:13;13393:10;;:26;;;;;;;;;;;;;;;;;;13435:32;13453:13;13435:32;;;;;;;;;;;;;;;;;;;;;;13484:4;13477:11;;13185:310;;;:::o;5297:89::-;5341:7;5367:12;;5360:19;;5297:89;:::o;18870:504::-;18949:8;18991:4;18977:19;;:2;:19;;;;18969:129;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19115:25;19130:2;19134:5;19115:14;:25::i;:::-;19109:31;;19150:110;19163:10;19175;19187:2;19191:5;19198:4;19204:55;19150:12;:110::i;:::-;;19313:2;19284:83;;19301:10;19284:83;;;19317:5;19324:21;19334:10;19324:9;:21::i;:::-;19347:13;19357:2;19347:9;:13::i;:::-;19362:4;19284:83;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;19284:83:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18870:504;;;;;:::o;19380:171::-;19459:4;19482:62;19500:4;19506:2;19510:5;19482:62;;;;;;;;;;;;;;;;;;:17;:62::i;:::-;19475:69;;19380:171;;;;;:::o;261:72:2:-;248:2;315:17;;309:2;:23;302:3;:31;261:72;:::o;215:35::-;248:2;215:35;:::o;15595:109:1:-;12317:6;:18;12324:10;12317:18;;;;;;;;;;;;;;;;;;;;;;;;;12309:60;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15658:4;15649:6;;:13;;;;;;;;;;;;;;;;;;15677:20;15684:6;;;;;;;;;;;15692:4;15677:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;15677:20:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15595:109;:::o;14523:46::-;14566:2;14523:46;:::o;12644:268::-;12706:4;12087;;;;;;;;;;;12073:18;;:10;:18;;;12065:58;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12749:1;12730:21;;:7;:21;;;;12722:101;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12841:7;12834:4;;:14;;;;;;;;;;;;;;;;;;12864:20;12876:7;12864:20;;;;;;;;;;;;;;;;;;;;;;12901:4;12894:11;;12644:268;;;:::o;16497:273::-;16546:7;16565:12;16580:10;16565:25;;16606:6;;;;;;;;;;;16605:7;:28;;;;16616:11;:17;16628:4;16616:17;;;;;;;;;;;;;;;;;;;;;;;;;16605:28;16604:67;;;;;16655:10;:16;16666:4;16655:16;;;;;;;;;;;;;;;;16638:8;:14;16647:4;16638:14;;;;;;;;;;;;;;;;:33;16604:67;16600:163;;;16692:36;16711:10;:16;16722:4;16711:16;;;;;;;;;;;;;;;;16692:8;:14;16701:4;16692:14;;;;;;;;;;;;;;;;:18;;:36;;;;:::i;:::-;16685:43;;;;16600:163;16762:1;16755:8;;16497:273;;;:::o;14655:43::-;;;;;;;;;;;;;;;;;;;;;;:::o;20237:207::-;20320:8;20346:29;20360:7;20369:5;20346:13;:29::i;:::-;20340:35;;20416:7;20390:47;;20404:10;20390:47;;;20425:5;20432:4;20390:47;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;20390:47:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20237:207;;;;;:::o;20903:193::-;20987:4;21010:79;21032:7;21041:15;21010:79;;;;;;;;;;;;;;;;;;:21;:79::i;:::-;21003:86;;20903:193;;;;:::o;15828:188::-;12317:6;:18;12324:10;12317:18;;;;;;;;;;;;;;;;;;;;;;;;;12309:60;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15898:34;15911:4;14566:2;15927:4;15898:12;:34::i;:::-;15962:5;15942:11;:17;15954:4;15942:17;;;;;;;;;;;;;;;;:25;;;;;;;;;;;;;;;;;;15992:4;15983:26;;;15998:4;16004;15983:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;15983:26:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15828:188;;:::o;6222:105::-;6278:7;6304:8;:16;6313:6;6304:16;;;;;;;;;;;;;;;;6297:23;;6222:105;;;:::o;21102:268::-;21204:8;21230:48;21253:7;21262:15;21230:22;:48::i;:::-;21224:54;;21319:7;21293:70;;21307:10;21293:70;;;21328:7;:19;21336:10;21328:19;;;;;;;;;;;;;;;:28;21348:7;21328:28;;;;;;;;;;;;;;;;21358:4;21293:70;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;21293:70:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21102:268;;;;;:::o;23439:70::-;12087:4;;;;;;;;;;;12073:18;;:10;:18;;;12065:58;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23497:4;;;;;;;;;;;23484:18;;;13502:377;13566:4;12205:10;;;;;;;;;;;12191:24;;:10;:24;;;12183:71;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13607:1;13590:19;;:5;:19;;;;13582:99;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13700:6;:13;13707:5;13700:13;;;;;;;;;;;;;;;;;;;;;;;;;13699:14;13691:62;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13780:4;13764:6;:13;13771:5;13764:13;;;;;;;;;;;;;;;;:20;;;;;;;;;;;;;;;;;;13794:9;13809:5;13794:21;;39:1:-1;33:3;27:10;23:18;57:10;52:3;45:23;79:10;72:17;;0:93;13794:21:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13831:20;13845:5;13831:20;;;;;;;;;;;;;;;;;;;;;;13868:4;13861:11;;13502:377;;;:::o;11584:25::-;;;;;;;;;;;;;:::o;170:39:2:-;;;;;;;;;;;;;;;;;;;;:::o;18721:143:1:-;18782:8;18809:48;18823:2;18827:5;18809:48;;;;;;;;;;;;;;;;;;:13;:48::i;:::-;18802:55;;18721:143;;;;:::o;15710:112::-;12317:6;:18;12324:10;12317:18;;;;;;;;;;;;;;;;;;;;;;;;;12309:60;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15775:5;15766:6;;:14;;;;;;;;;;;;;;;;;;15795:20;15802:6;;;;;;;;;;;15810:4;15795:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;15795:20:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15710:112;:::o;14975:45::-;;;;;;;;;;;;;;;;;:::o;13885:510::-;13952:4;14075:9;12205:10;;;;;;;;;;;12191:24;;:10;:24;;;12183:71;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13976:6;:13;13983:5;13976:13;;;;;;;;;;;;;;;;;;;;;;;;;13968:61;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14046:6;:13;14053:5;14046:13;;;;;;;;;;;;;;;;14039:20;;;;;;;;;;;14087:1;14075:13;;14070:263;14094:9;:16;;;;14090:1;:20;14070:263;;;14151:5;14135:21;;:9;14145:1;14135:12;;;;;;;;;;;;;;;;;;;;;;;;;;;:21;;;14131:192;;;14191:9;14201:23;14222:1;14201:9;:16;;;;:20;;:23;;;;:::i;:::-;14191:34;;;;;;;;;;;;;;;;;;;;;;;;;;;14176:9;14186:1;14176:12;;;;;;;;;;;;;;;;;;:49;;;;;;;;;;;;;;;;;;14262:23;14283:1;14262:9;:16;;;;:20;;:23;;;;:::i;:::-;14243:9;:42;;;;;:::i;:::-;;14303:5;;14131:192;14112:3;;;;;;;14070:263;;;14348:19;14361:5;14348:19;;;;;;;;;;;;;;;;;;;;;;14384:4;14377:11;;13885:510;;;;:::o;14492:25::-;;;;;;;;;;;;;:::o;16257:168::-;12317:6;:18;12324:10;12317:18;;;;;;;;;;;;;;;;;;;;;;;;;12309:60;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16367:5;16348:10;:16;16359:4;16348:16;;;;;;;;;;;;;;;:24;;;;16400:4;16387:31;;;16406:5;16413:4;16387:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;16387:31:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16257:168;;;:::o;20450:183::-;20529:4;20552:74;20574:7;20583:10;20552:74;;;;;;;;;;;;;;;;;;:21;:74::i;:::-;20545:81;;20450:183;;;;:::o;9349:170::-;9457:7;9487;:15;9495:6;9487:15;;;;;;;;;;;;;;;:25;9503:8;9487:25;;;;;;;;;;;;;;;;9480:32;;9349:170;;;;:::o;11660:26::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;22508:925::-;22686:8;22706:14;22904:9;12317:6;:18;12324:10;12317:18;;;;;;;;;;;;;;;;;;;;;;;;;12309:60;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22723:2;:9;22706:26;;22760:6;:13;22750:6;:23;22742:89;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22866:1;22855:7;22849:14;;;;;;;;:18;;;22841:27;;;;;;;;22885:4;22879:10;;22916:1;22904:13;;22899:528;22923:6;22919:1;:10;22899:528;;;22975:4;22958:22;;:2;22961:1;22958:5;;;;;;;;;;;;;;;;;;:22;;;;22950:132;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23103:3;:49;;;;;23110:42;23129:4;23135:2;23138:1;23135:5;;;;;;;;;;;;;;;;;;23142:6;23149:1;23142:9;;;;;;;;;;;;;;;;;;23110:18;:42::i;:::-;23103:49;23097:55;;23349:2;23352:1;23349:5;;;;;;;;;;;;;;;;;;23309:107;;23337:10;23309:107;;23331:4;23309:107;;;23356:6;23363:1;23356:9;;;;;;;;;;;;;;;;;;23367:7;23376:15;23386:4;23376:9;:15::i;:::-;23393:16;23403:2;23406:1;23403:5;;;;;;;;;;;;;;;;;;23393:9;:16::i;:::-;23411:4;23309:107;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;23309:107:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22931:3;;;;;;;22899:528;;;22508:925;;;;;;;;;:::o;11458:19::-;;;;;;;;;;;;;:::o;19557:522::-;19654:8;19696:4;19682:19;;:2;:19;;;;19674:129;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19820:35;19839:4;19845:2;19849:5;19820:18;:35::i;:::-;19814:41;;19865:104;19878:4;19884:10;19896:2;19900:5;19907:4;19913:55;19865:12;:104::i;:::-;;20024:2;19985:87;;20012:10;19985:87;;20006:4;19985:87;;;20028:5;20035:15;20045:4;20035:9;:15::i;:::-;20052:13;20062:2;20052:9;:13::i;:::-;20067:4;19985:87;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;19985:87:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19557:522;;;;;;:::o;9991:324::-;10102:4;10164:46;10198:11;10164:7;:19;10172:10;10164:19;;;;;;;;;;;;;;;:29;10184:8;10164:29;;;;;;;;;;;;;;;;:33;;:46;;;;:::i;:::-;10122:7;:19;10130:10;10122:19;;;;;;;;;;;;;;;:29;10142:8;10122:29;;;;;;;;;;;;;;;:89;;;;10247:8;10226:61;;10235:10;10226:61;;;10257:7;:19;10265:10;10257:19;;;;;;;;;;;;;;;:29;10277:8;10257:29;;;;;;;;;;;;;;;;10226:61;;;;;;;;;;;;;;;;;;10304:4;10297:11;;9991:324;;;;:::o;16776:147::-;16868:4;16833:10;16845:5;15375:6;;;;;;;;;;;15374:7;:28;;;;15385:11;:17;15397:4;15385:17;;;;;;;;;;;;;;;;;;;;;;;;;15374:28;15366:73;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15486:10;:16;15497:4;15486:16;;;;;;;;;;;;;;;;15457:25;15476:5;15457:8;:14;15466:4;15457:14;;;;;;;;;;;;;;;;:18;;:25;;;;:::i;:::-;:45;;15449:122;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16891:25;16906:2;16910:5;16891:14;:25::i;:::-;16884:32;;16776:147;;;;;;:::o;21382:714::-;21603:4;21654:11;21623:15;:2;:13;;;:15::i;:::-;21619:440;;;21676:2;21668:16;;21709:64;;;;;;;;;;;;;;;;;;;;;;;;21668:220;;;21792:5;21815:7;21840:5;21863:11;21668:220;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21654:234;;21906:6;21902:147;;;21976:2;21937:68;;21967:7;21937:68;;21960:5;21937:68;;;21980:5;21987:4;21993:11;21937:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;21937:68:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22030:4;22023:11;;;;21902:147;21619:440;22084:5;22077:12;;21382:714;;;;;;;;;;:::o;2747:179::-;2805:7;2883:9;2837:1;2832;:6;;2824:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2899:1;2895;:5;2883:17;;2918:1;2911:8;;2747:179;;;;;:::o;8814:202::-;8881:4;8929:6;8897:7;:19;8905:10;8897:19;;;;;;;;;;;;;;;:29;8917:8;8897:29;;;;;;;;;;;;;;;:38;;;;8971:8;8950:38;;8959:10;8950:38;;;8981:6;8950:38;;;;;;;;;;;;;;;;;;9005:4;8998:11;;8814:202;;;;:::o;10792:481::-;10908:4;10928:16;10947:7;:19;10955:10;10947:19;;;;;;;;;;;;;;;:29;10967:8;10947:29;;;;;;;;;;;;;;;;10928:48;;11009:8;10990:16;:27;10986:184;;;11065:1;11033:7;:19;11041:10;11033:19;;;;;;;;;;;;;;;:29;11053:8;11033:29;;;;;;;;;;;;;;;:33;;;;10986:184;;;11129:30;11142:16;11129:8;:12;;:30;;;;:::i;:::-;11097:7;:19;11105:10;11097:19;;;;;;;;;;;;;;;:29;11117:8;11097:29;;;;;;;;;;;;;;;:62;;;;10986:184;11205:8;11184:61;;11193:10;11184:61;;;11215:7;:19;11223:10;11215:19;;;;;;;;;;;;;;;:29;11235:8;11215:29;;;;;;;;;;;;;;;;11184:61;;;;;;;;;;;;;;;;;;11262:4;11255:11;;10792:481;;;;;:::o;16929:169::-;17033:4;17004;17010:5;15375:6;;;;;;;;;;;15374:7;:28;;;;15385:11;:17;15397:4;15385:17;;;;;;;;;;;;;;;;;;;;;;;;;15374:28;15366:73;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15486:10;:16;15497:4;15486:16;;;;;;;;;;;;;;;;15457:25;15476:5;15457:8;:14;15466:4;15457:14;;;;;;;;;;;;;;;;:18;;:25;;;;:::i;:::-;:45;;15449:122;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17056:35;17075:4;17081:2;17085:5;17056:18;:35::i;:::-;17049:42;;16929:169;;;;;;;:::o;2307:176::-;2365:7;2384:9;2400:1;2396;:5;2384:17;;2424:1;2419;:6;;2411:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2475:1;2468:8;;2307:176;;;;;:::o;5552:456::-;5615:4;5654:1;5639:17;;:3;:17;;;;5631:92;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5751:8;:20;5760:10;5751:20;;;;;;;;;;;;;;;;5741:6;:30;;5733:82;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5849:32;5874:6;5849:8;:20;5858:10;5849:20;;;;;;;;;;;;;;;;:24;;:32;;;;:::i;:::-;5826:8;:20;5835:10;5826:20;;;;;;;;;;;;;;;:55;;;;5907:25;5925:6;5907:8;:13;5916:3;5907:13;;;;;;;;;;;;;;;;:17;;:25;;;;:::i;:::-;5891:8;:13;5900:3;5891:13;;;;;;;;;;;;;;;:41;;;;5968:3;5947:33;;5956:10;5947:33;;;5973:6;5947:33;;;;;;;;;;;;;;;;;;5997:4;5990:11;;5552:456;;;;:::o;452:618::-;509:4;525:12;1032:4;1020:17;1012:25;;1062:1;1055:4;:8;1048:15;;452:618;;;;:::o;7495:681::-;7615:4;7658:1;7643:17;;:3;:17;;;;7635:92;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7755:8;:15;7764:5;7755:15;;;;;;;;;;;;;;;;7745:6;:25;;7737:77;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7842:7;:14;7850:5;7842:14;;;;;;;;;;;;;;;:26;7857:10;7842:26;;;;;;;;;;;;;;;;7832:6;:36;;7824:97;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7950:27;7970:6;7950:8;:15;7959:5;7950:15;;;;;;;;;;;;;;;;:19;;:27;;;;:::i;:::-;7932:8;:15;7941:5;7932:15;;;;;;;;;;;;;;;:45;;;;8003:25;8021:6;8003:8;:13;8012:3;8003:13;;;;;;;;;;;;;;;;:17;;:25;;;;:::i;:::-;7987:8;:13;7996:3;7987:13;;;;;;;;;;;;;;;:41;;;;8067:38;8098:6;8067:7;:14;8075:5;8067:14;;;;;;;;;;;;;;;:26;8082:10;8067:26;;;;;;;;;;;;;;;;:30;;:38;;;;:::i;:::-;8038:7;:14;8046:5;8038:14;;;;;;;;;;;;;;;:26;8053:10;8038:26;;;;;;;;;;;;;;;:67;;;;8136:3;8120:28;;8129:5;8120:28;;;8141:6;8120:28;;;;;;;;;;;;;;;;;;8165:4;8158:11;;7495:681;;;;;:::o;82:430:2:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o

Swarm Source

bzzr://a1d8fa0ee0acac4df746aa903e38529923a5c9c5f96c4ea6a1c5b4ab918a31f4
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.