contract XCOYNZ is ERC20Burnable, ERC20Detailed {
    string public constant NAME = "XCOYNZ Token"; // solium-disable-line uppercase
    string public constant SYMBOL = "XCZ"; // solium-disable-line uppercase
    address public constant tokenOwner = 0xbA643A286c43Ec70a02bA464653AF512BE4BB570;
    uint8 public constant DECIMALS = 18;
    uint256 public constant INITIAL_SUPPLY = 1250000000 * (10 ** uint256(DECIMALS));
    

    /**
     * @dev Constructor that gives msg.sender all of existing tokens.
     */
    constructor () public ERC20Detailed(NAME, SYMBOL, DECIMALS) {
        _mint(tokenOwner, INITIAL_SUPPLY);
    }


    /**
    * @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(this));
        if (msg.sender == tokenOwner)   
            if (uint64(now) <  1580515200)
                require((balanceOf(tokenOwner) - value) >= 377326483460000000000000000); //377326483.460000000000000000
            if (uint64(now) <  1596240000)
                require((balanceOf(tokenOwner) - value) >= 289145890080000000000000000); //289145890.080000000000000000
            if (uint64(now) <  1627776000)
                require((balanceOf(tokenOwner) - value) >= 165000000000000000000000000); //165000000.000000000000000000
            if (uint64(now) <  1659312000)
                require((balanceOf(tokenOwner) - value) >=  65625000000000000000000000); //65625000.000000000000000000


        _transfer(msg.sender, to, value);
        return true;
    }
    
     /**
     * @dev Transfer tokens from one address to another.
     * Note that while this function emits an Approval event, this is not required as per the specification,
     * and other compliant implementations may not emit the event.
     * @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(this));
        _allowed[from][msg.sender] = _allowed[from][msg.sender].sub(value);
        if (from == tokenOwner)   
            if (uint64(now) <  1580515200)
                require((balanceOf(tokenOwner) - value) >= 377326483460000000000000000); //377326483.460000000000000000
            if (uint64(now) <  1596240000)
                require((balanceOf(tokenOwner) - value) >= 289145890080000000000000000); //289145890.080000000000000000
            if (uint64(now) <  1627776000)
                require((balanceOf(tokenOwner) - value) >= 165000000000000000000000000); //165000000.000000000000000000
            if (uint64(now) <  1659312000)
                require((balanceOf(tokenOwner) - value) >=  65625000000000000000000000); //65625000.000000000000000000
        
        _transfer(from, to, value);
        emit Approval(from, msg.sender, _allowed[from][msg.sender]);
        return true;
    }
    
    /**
     * @dev Burns a specific amount of tokens.
     * @param value The amount of token to be burned.
     */
    function burn(uint256 value) public {
        require(msg.sender == tokenOwner);
        _burn(msg.sender, value);
    }

}
function burn(uint256 value) public {
    require(msg.sender == tokenOwner);
    _burn(msg.sender, value);
}

/**
 * @dev Burns a specific amount of tokens.
 * @param value The amount of token to be burned.
 */