contract BMT is Token {
    mapping(address => uint256) balances;

    mapping (address => mapping (address => uint256)) allowed;

    uint256 public totalSupply;
  
    mapping(address => uint256) freezeAccount;

    address public minter;
 function BMT(uint256 initialSupply, string tokenName, uint8 decimalUnits,uint256 _totalSupply,string tokenSymbol) {
    minter = msg.sender;
	balances[msg.sender] = initialSupply; // Give the creator all initial tokens
	name = tokenName; // Set the name for display purposes
	decimals = decimalUnits; // Amount of decimals for display purposes
	totalSupply= _totalSupply; // All Token
	symbol = tokenSymbol; // Set the symbol for display purposes

  }
  function transfer(address _to, uint256 _value) returns (bool success) {
    //Default assumes totalSupply can't be over max (2^256 - 1).
    //If your token leaves out totalSupply and can issue more tokens as time goes on, you need to check if it doesn't wrap.
    //Replace the if with this one instead.
    if (balances[msg.sender] >= _value && balances[_to] + _value > balances[_to] && freezeAccount[msg.sender]==0) {
      balances[msg.sender] -= _value;
      balances[_to] += _value;
      Transfer(msg.sender, _to, _value);
      return true;
    } else { return false; }
  }

  function transferFrom(address _from, address _to, uint256 _value) returns (bool success) {
    //same as above. Replace this line with the following if you want to protect against wrapping uints.
    if (balances[_from] >= _value && allowed[_from][msg.sender] >= _value && balances[_to] + _value > balances[_to] && freezeAccount[_from]==0) {
      balances[_to] += _value;
      balances[_from] -= _value;
      allowed[_from][msg.sender] -= _value;
      Transfer(_from, _to, _value);
      return true;
    } else { return false; }
  }

  function balanceOf(address _owner) constant returns (uint256 balance) {
    return balances[_owner];
  }
  //account key
  function freezeAccountOf(address _owner) constant returns (uint256 freeze) {
    return freezeAccount[_owner];
  }
  //freeze account.if account !=0.freeze
  function freeze(address account,uint key) {
    if (msg.sender != minter) throw;
    freezeAccount[account] = key;
  }
  function approve(address _spender, uint256 _value) returns (bool success) {
    allowed[msg.sender][_spender] = _value;
    Approval(msg.sender, _spender, _value);
    return true;
  }

  function allowance(address _owner, address _spender) constant returns (uint256 remaining) {
    return allowed[_owner][_spender];
  }



}
function freezeAccountOf(address _owner) constant returns (uint256 freeze) {
  return freezeAccount[_owner];
}

//account key