contract CrowdsaleToken is ReleasableToken, UpgradeableToken {

  /** Name and symbol were updated. */
  event UpdatedTokenInformation(string newName, string newSymbol);

  string public name;

  string public symbol;

  uint8 public decimals;

  /**
   * Construct the token.
   *
   * This token must be created through a team multisig wallet, so that it is owned by that wallet.
   *
   * @param _name Token name
   * @param _symbol Token symbol - should be all caps
   * @param _initialSupply How many tokens we start with
   * @param _decimals Number of decimal places
   */
  function CrowdsaleToken(string _name, string _symbol, uint _initialSupply, uint8 _decimals)
    UpgradeableToken(msg.sender) public {

    // Create any address, can be transferred
    // to team multisig via changeOwner(),
    // also remember to call setUpgradeMaster()
    owner = msg.sender;

    name = _name;
    symbol = _symbol;

    totalSupply_ = _initialSupply;

    decimals = _decimals;

    // Create initially all balance on the team multisig
    balances[owner] = totalSupply_;
  }

  /**
   * When token is released to be transferable, enforce no new tokens can be created.
   */
  function releaseTokenTransfer() public onlyReleaseAgent {
    super.releaseTokenTransfer();
  }

  /**
   * Allow upgrade agent functionality kick in only if the crowdsale was success.
   */
  function canUpgrade() public constant returns(bool) {
    return released && super.canUpgrade();
  }

  /**
   * Owner can update token information here.
   *
   * It is often useful to conceal the actual token association, until
   * the token operations, like central issuance or reissuance have been completed.
   *
   * This function allows the token owner to rename the token after the operations
   * have been completed and then point the audience to use the token contract.
   */
  function setTokenInformation(string _name, string _symbol) onlyOwner {
    name = _name;
    symbol = _symbol;

    UpdatedTokenInformation(name, symbol);
  }

}
function CrowdsaleToken(string _name, string _symbol, uint _initialSupply, uint8 _decimals)
  UpgradeableToken(msg.sender) public {

  // Create any address, can be transferred
  // to team multisig via changeOwner(),
  // also remember to call setUpgradeMaster()
  owner = msg.sender;

  name = _name;
  symbol = _symbol;

  totalSupply_ = _initialSupply;

  decimals = _decimals;

  // Create initially all balance on the team multisig
  balances[owner] = totalSupply_;
}

/**
 * Construct the token.
 *
 * This token must be created through a team multisig wallet, so that it is owned by that wallet.
 *
 * @param _name Token name
 * @param _symbol Token symbol - should be all caps
 * @param _initialSupply How many tokens we start with
 * @param _decimals Number of decimal places
 */