contract AnimecardCore is AnimecardMinting {
    // contract AnimecardCore is AnimecardMinting {
    // Set in case the core contract is broken and a fork is required
    address public newContractAddress;

    function AnimecardCore() public {
        // Starts paused.
        paused = true;

        // The creator of the contract is the initial CEO
        ceoAddress = msg.sender;

        // The creator of the contract is also the initial Animator
        animatorAddress = msg.sender;
    }

    /// @dev Used to mark the smart contract as upgraded, in case there is a serious
    ///  breaking bug. This method does nothing but keep track of the new contract and
    ///  emit a message indicating that the new address is set. It's up to clients of this
    ///  contract to update to the new contract address in that case. (This contract will
    ///  be paused indefinitely if such an upgrade takes place.)
    /// @param _v2Address new address
    function setNewAddress(address _v2Address)
    external
    onlyCEO
    whenPaused {
        newContractAddress = _v2Address;
        ContractFork(_v2Address);
    }

    /// @dev Withdraw all Ether from the contract. This includes both the studio fee
    /// and blockpunk fee on every animecard sold and any Ether sent directly to
    /// contract address.
    /// Only the CFO can withdraw the balance or specify the address to send
    /// the balance to.
    function withdrawBalance(address _to) external onlyCFO {
        // We are using this boolean method to make sure that even if one fails it will still work
        if (_to == address(0)) {
            cfoAddress.transfer(this.balance);
        } else {
            _to.transfer(this.balance);
        }
    }

    /// @notice Returns all the relevant information about a specific animecard.
    /// @param _tokenId The tokenId of the animecard of interest.
    function getAnimecard(uint256 _tokenId)
    external
    view
    returns(
        string characterName,
        string studioName,
        string characterImageUrl,
        string characterImageHash,
        uint256 sellingPrice,
        address owner) {
        Animecard storage animecard = animecards[_tokenId];
        characterName = animecard.characterName;
        studioName = animecard.studioName;
        characterImageUrl = animecard.characterImageUrl;
        characterImageHash = animecard.characterImageHash;
        sellingPrice = animecardToPrice[_tokenId];
        owner = animecardToOwner[_tokenId];
    }


    /// @dev Override unpause so it requires all external contract addresses
    ///  to be set before contract can be unpaused. Also, we can't have
    ///  newContractAddress set either, because then the contract was upgraded.
    /// @notice This is public rather than external so we can call super.unpause
    ///  without using an expensive call.
    function unpause()
    public
    onlyCEO
    whenPaused {
        require(newContractAddress == address(0));

        // Actually unpause the contract.
        super.unpause();
    }

    /// @notice Direct donations
    function () external payable {}
}
// Cryptoanime: Anime collectibles on blockchain
function () external payable {}

/// @notice Direct donations