contract ERC223
{
  uint public totalSupply;

  // ERC223 and ERC20 functions and events
  function balanceOf(address who) public view returns (uint);
  function totalSupply() public view returns (uint256 _supply);
  function transfer(address to, uint value) public returns (bool ok);
  function transfer(address to, uint value, bytes data) public returns (bool ok);
  function transfer(address to, uint value, bytes data, string custom_fallback) public returns (bool ok);
  event Transfer(address indexed from, address indexed to, uint value, bytes indexed data);

  // ERC223 functions
  function name() public view returns (string _name);
  function symbol() public view returns (string _symbol);
  function decimals() public view returns (uint8 _decimals);

  // ERC20 functions and events
  function transferFrom(address _from, address _to, uint256 _value) public returns (bool success);
  function approve(address _spender, uint256 _value) public returns (bool success);
  function allowance(address _owner, address _spender) public view returns (uint256 remaining);
  event Transfer(address indexed _from, address indexed _to, uint256 _value);
  event Approval(address indexed _owner, address indexed _spender, uint _value);
}
/**
 * @title ERC223
 * @dev ERC223 contract interface with ERC20 functions and events
 *    Fully backward compatible with ERC20
 *    Recommended implementation used at https://github.com/Dexaran/ERC223-token-standard/tree/Recommended
 */
function transferFrom(address _from, address _to, uint256 _value) public returns (bool success);

// ERC20 functions and events