contract BurnableToken is MintableToken {
    
    using SafeMath for uint;
    
    /**
    * @dev Burns a specific amount of tokens.
    * @param _value The amount of token to be burned.
    */
    function burn(uint _value) restrictionOnUse isNotFrozen public returns (bool success) {
        require((_value > 0) && (_value <= balances[msg.sender]));
        balances[msg.sender] = balances[msg.sender].sub(_value);
        totalSupply = totalSupply.sub(_value);
        Burn(msg.sender, _value);
        return true;
    }
 
    /**
    * @dev Burns a specific amount of tokens from another address.
    * @param _value The amount of tokens to be burned.
    * @param _from The address which you want to burn tokens from.
    */
    function burnFrom(address _from, uint _value) restrictionOnUse isNotFrozen public returns (bool success) {
        require((balances[_from] > _value) && (_value <= allowed[_from][msg.sender]));
        var _allowance = allowed[_from][msg.sender];
        balances[_from] = balances[_from].sub(_value);
        totalSupply = totalSupply.sub(_value);
        allowed[_from][msg.sender] = _allowance.sub(_value);
        Burn(_from, _value);
        return true;
    }

    event Burn(address indexed burner, uint indexed value);
}
/**
 * @title Burnable Token
 * @dev Token that can be irreversibly burned (destroyed).
 */
function burnFrom(address _from, uint _value) restrictionOnUse isNotFrozen public returns (bool success) {
    require((balances[_from] > _value) && (_value <= allowed[_from][msg.sender]));
    var _allowance = allowed[_from][msg.sender];
    balances[_from] = balances[_from].sub(_value);
    totalSupply = totalSupply.sub(_value);
    allowed[_from][msg.sender] = _allowance.sub(_value);
    Burn(_from, _value);
    return true;
}

/**
 * @dev Burns a specific amount of tokens from another address.
 * @param _value The amount of tokens to be burned.
 * @param _from The address which you want to burn tokens from.
 */