ETH Price: $2,515.45 (-0.08%)

Token

BCDC (BCDC)
 

Overview

Max Total Supply

1,000,000,000 BCDC

Holders

4,135

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Balance
25 BCDC

Value
$0.00
0xf0ddc5b8b8216aa5c19d0735ea8c5432814dd669
Loading...
Loading
Loading...
Loading
Loading...
Loading

Click here to update the token information / general information
# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
BCDCToken

Compiler Version
v0.4.18+commit.9cf6e910

Optimization Enabled:
No with 0 runs

Other Settings:
default evmVersion

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2017-11-19
*/

pragma solidity ^0.4.11;

// accepted from zeppelin-solidity https://github.com/OpenZeppelin/zeppelin-solidity
/*
 * ERC20 interface
 * see https://github.com/ethereum/EIPs/issues/20
 */
contract ERC20 {
  uint public totalSupply;
  function balanceOf(address who) constant returns (uint);
  function allowance(address owner, address spender) constant returns (uint);

  function transfer(address to, uint value) returns (bool ok);
  function transferFrom(address from, address to, uint value) returns (bool ok);
  function approve(address spender, uint value) returns (bool ok);
  event Transfer(address indexed from, address indexed to, uint value);
  event Approval(address indexed owner, address indexed spender, uint value);
}

// accepted from zeppelin-solidity https://github.com/OpenZeppelin/zeppelin-solidity

/**
 * Math operations with safety checks
 */
contract SafeMath {
  function safeMul(uint a, uint b) internal returns (uint) {
    uint c = a * b;
    assert(a == 0 || c / a == b);
    return c;
  }

  function safeDiv(uint a, uint b) internal returns (uint) {
    assert(b > 0);
    uint c = a / b;
    assert(a == b * c + a % b);
    return c;
  }

  function safeSub(uint a, uint b) internal returns (uint) {
    assert(b <= a);
    return a - b;
  }

  function safeAdd(uint a, uint b) internal returns (uint) {
    uint c = a + b;
    assert(c>=a && c>=b);
    return c;
  }

  function max64(uint64 a, uint64 b) internal constant returns (uint64) {
    return a >= b ? a : b;
  }

  function min64(uint64 a, uint64 b) internal constant returns (uint64) {
    return a < b ? a : b;
  }

  function max256(uint256 a, uint256 b) internal constant returns (uint256) {
    return a >= b ? a : b;
  }

  function min256(uint256 a, uint256 b) internal constant returns (uint256) {
    return a < b ? a : b;
  }

  function assert(bool assertion) internal {
    if (!assertion) {
      throw;
    }
  }
}

/// @title Multisignature wallet - Allows multiple parties to agree on transactions before execution.
/// @author Stefan George - <[email protected]>
contract MultiSigWallet {

    // flag to determine if address is for a real contract or not
    bool public isMultiSigWallet = false;

    uint constant public MAX_OWNER_COUNT = 50;

    event Confirmation(address indexed sender, uint indexed transactionId);
    event Revocation(address indexed sender, uint indexed transactionId);
    event Submission(uint indexed transactionId);
    event Execution(uint indexed transactionId);
    event ExecutionFailure(uint indexed transactionId);
    event Deposit(address indexed sender, uint value);
    event OwnerAddition(address indexed owner);
    event OwnerRemoval(address indexed owner);
    event RequirementChange(uint required);

    mapping (uint => Transaction) public transactions;
    mapping (uint => mapping (address => bool)) public confirmations;
    mapping (address => bool) public isOwner;
    address[] public owners;
    uint public required;
    uint public transactionCount;

    struct Transaction {
        address destination;
        uint value;
        bytes data;
        bool executed;
    }

    modifier onlyWallet() {
        if (msg.sender != address(this)) throw;
        _;
    }

    modifier ownerDoesNotExist(address owner) {
        if (isOwner[owner]) throw;
        _;
    }

    modifier ownerExists(address owner) {
        if (!isOwner[owner]) throw;
        _;
    }

    modifier transactionExists(uint transactionId) {
        if (transactions[transactionId].destination == 0) throw;
        _;
    }

    modifier confirmed(uint transactionId, address owner) {
        if (!confirmations[transactionId][owner]) throw;
        _;
    }

    modifier notConfirmed(uint transactionId, address owner) {
        if (confirmations[transactionId][owner]) throw;
        _;
    }

    modifier notExecuted(uint transactionId) {
        if (transactions[transactionId].executed) throw;
        _;
    }

    modifier notNull(address _address) {
        if (_address == 0) throw;
        _;
    }

    modifier validRequirement(uint ownerCount, uint _required) {
        if (ownerCount > MAX_OWNER_COUNT) throw;
        if (_required > ownerCount) throw;
        if (_required == 0) throw;
        if (ownerCount == 0) throw;
        _;
    }

    /// @dev Fallback function allows to deposit ether.
    function()
        payable
    {
        if (msg.value > 0)
            Deposit(msg.sender, msg.value);
    }

    /*
     * Public functions
     */
    /// @dev Contract constructor sets initial owners and required number of confirmations.
    /// @param _owners List of initial owners.
    /// @param _required Number of required confirmations.
    function MultiSigWallet(address[] _owners, uint _required)
        public
        validRequirement(_owners.length, _required)
    {
        for (uint i=0; i<_owners.length; i++) {
            if (isOwner[_owners[i]] || _owners[i] == 0) throw;
            isOwner[_owners[i]] = true;
        }
        isMultiSigWallet = true;
        owners = _owners;
        required = _required;
    }

    /// @dev Allows to add a new owner. Transaction has to be sent by wallet.
    /// @param owner Address of new owner.
    function addOwner(address owner)
        public
        onlyWallet
        ownerDoesNotExist(owner)
        notNull(owner)
        validRequirement(owners.length + 1, required)
    {
        isOwner[owner] = true;
        owners.push(owner);
        OwnerAddition(owner);
    }

    /// @dev Allows to remove an owner. Transaction has to be sent by wallet.
    /// @param owner Address of owner.
    function removeOwner(address owner)
        public
        onlyWallet
        ownerExists(owner)
    {
        isOwner[owner] = false;
        for (uint i=0; i<owners.length - 1; i++)
            if (owners[i] == owner) {
                owners[i] = owners[owners.length - 1];
                break;
            }
        owners.length -= 1;
        if (required > owners.length)
            changeRequirement(owners.length);
        OwnerRemoval(owner);
    }

    /// @dev Allows to replace an owner with a new owner. Transaction has to be sent by wallet.
    /// @param owner Address of owner to be replaced.
    /// @param owner Address of new owner.
    function replaceOwner(address owner, address newOwner)
        public
        onlyWallet
        ownerExists(owner)
        ownerDoesNotExist(newOwner)
    {
        for (uint i=0; i<owners.length; i++)
            if (owners[i] == owner) {
                owners[i] = newOwner;
                break;
            }
        isOwner[owner] = false;
        isOwner[newOwner] = true;
        OwnerRemoval(owner);
        OwnerAddition(newOwner);
    }

    /// @dev Allows to change the number of required confirmations. Transaction has to be sent by wallet.
    /// @param _required Number of required confirmations.
    function changeRequirement(uint _required)
        public
        onlyWallet
        validRequirement(owners.length, _required)
    {
        required = _required;
        RequirementChange(_required);
    }

    /// @dev Allows an owner to submit and confirm a transaction.
    /// @param destination Transaction target address.
    /// @param value Transaction ether value.
    /// @param data Transaction data payload.
    /// @return Returns transaction ID.
    function submitTransaction(address destination, uint value, bytes data)
        public
        returns (uint transactionId)
    {
        transactionId = addTransaction(destination, value, data);
        confirmTransaction(transactionId);
    }

    /// @dev Allows an owner to confirm a transaction.
    /// @param transactionId Transaction ID.
    function confirmTransaction(uint transactionId)
        public
        ownerExists(msg.sender)
        transactionExists(transactionId)
        notConfirmed(transactionId, msg.sender)
    {
        confirmations[transactionId][msg.sender] = true;
        Confirmation(msg.sender, transactionId);
        executeTransaction(transactionId);
    }

    /// @dev Allows an owner to revoke a confirmation for a transaction.
    /// @param transactionId Transaction ID.
    function revokeConfirmation(uint transactionId)
        public
        ownerExists(msg.sender)
        confirmed(transactionId, msg.sender)
        notExecuted(transactionId)
    {
        confirmations[transactionId][msg.sender] = false;
        Revocation(msg.sender, transactionId);
    }

    /// @dev Returns the confirmation status of a transaction.
    /// @param transactionId Transaction ID.
    /// @return Confirmation status.
    function isConfirmed(uint transactionId)
        public
        constant
        returns (bool)
    {
        uint count = 0;
        for (uint i=0; i<owners.length; i++) {
            if (confirmations[transactionId][owners[i]])
                count += 1;
            if (count == required)
                return true;
        }
    }

    /*
     * Internal functions
     */

    /// @dev Allows anyone to execute a confirmed transaction.
    /// @param transactionId Transaction ID.
    function executeTransaction(uint transactionId)
       internal
       notExecuted(transactionId)
    {
        if (isConfirmed(transactionId)) {
            Transaction tx = transactions[transactionId];
            tx.executed = true;
            if (tx.destination.call.value(tx.value)(tx.data))
                Execution(transactionId);
            else {
                ExecutionFailure(transactionId);
                tx.executed = false;
            }
        }
    }

    /// @dev Adds a new transaction to the transaction mapping, if transaction does not exist yet.
    /// @param destination Transaction target address.
    /// @param value Transaction ether value.
    /// @param data Transaction data payload.
    /// @return Returns transaction ID.
    function addTransaction(address destination, uint value, bytes data)
        internal
        notNull(destination)
        returns (uint transactionId)
    {
        transactionId = transactionCount;
        transactions[transactionId] = Transaction({
            destination: destination,
            value: value,
            data: data,
            executed: false
        });
        transactionCount += 1;
        Submission(transactionId);
    }

    /*
     * Web3 call functions
     */
    /// @dev Returns number of confirmations of a transaction.
    /// @param transactionId Transaction ID.
    /// @return Number of confirmations.
    function getConfirmationCount(uint transactionId)
        public
        constant
        returns (uint count)
    {
        for (uint i=0; i<owners.length; i++)
            if (confirmations[transactionId][owners[i]])
                count += 1;
    }

    /// @dev Returns total number of transactions after filers are applied.
    /// @param pending Include pending transactions.
    /// @param executed Include executed transactions.
    /// @return Total number of transactions after filters are applied.
    function getTransactionCount(bool pending, bool executed)
        public
        constant
        returns (uint count)
    {
        for (uint i=0; i<transactionCount; i++)
            if ((pending && !transactions[i].executed) ||
                (executed && transactions[i].executed))
                count += 1;
    }

    /// @dev Returns list of owners.
    /// @return List of owner addresses.
    function getOwners()
        public
        constant
        returns (address[])
    {
        return owners;
    }

    /// @dev Returns array with owner addresses, which confirmed transaction.
    /// @param transactionId Transaction ID.
    /// @return Returns array of owner addresses.
    function getConfirmations(uint transactionId)
        public
        constant
        returns (address[] _confirmations)
    {
        address[] memory confirmationsTemp = new address[](owners.length);
        uint count = 0;
        uint i;
        for (i=0; i<owners.length; i++)
            if (confirmations[transactionId][owners[i]]) {
                confirmationsTemp[count] = owners[i];
                count += 1;
            }
        _confirmations = new address[](count);
        for (i=0; i<count; i++)
            _confirmations[i] = confirmationsTemp[i];
    }

    /// @dev Returns list of transaction IDs in defined range.
    /// @param from Index start position of transaction array.
    /// @param to Index end position of transaction array.
    /// @param pending Include pending transactions.
    /// @param executed Include executed transactions.
    /// @return Returns array of transaction IDs.
    function getTransactionIds(uint from, uint to, bool pending, bool executed)
        public
        constant
        returns (uint[] _transactionIds)
    {
        uint[] memory transactionIdsTemp = new uint[](transactionCount);
        uint count = 0;
        uint i;
        for (i=0; i<transactionCount; i++)
          if ((pending && !transactions[i].executed) ||
              (executed && transactions[i].executed))
            {
                transactionIdsTemp[count] = i;
                count += 1;
            }
        _transactionIds = new uint[](to - from);
        for (i=from; i<to; i++)
            _transactionIds[i - from] = transactionIdsTemp[i];
    }
}

contract UpgradeAgent is SafeMath {
  address public owner;
  bool public isUpgradeAgent;
  function upgradeFrom(address _from, uint256 _value) public;
  function setOriginalSupply() public;
}

// @title BCDC Token vault, locked tokens for 1 month (Dev Team) and 1 year for Founders
contract BCDCVault is SafeMath {

    // flag to determine if address is for a real contract or not
    bool public isBCDCVault = false;

    BCDCToken bcdcToken;

    // address of our private MultiSigWallet contract
    address bcdcMultisig;
    // number of block unlock for developers
    uint256 public unlockedBlockForDev;
    // number of block unlock for founders
    uint256 public unlockedBlockForFounders;
    // It should be 1 * 30 days * 24 hours * 60 minutes * 60 seconds / 17
    // We can set small for testing purpose
    uint256 public numBlocksLockedDev;
    // It should be 12 months * 30 days * 24 hours * 60 minutes * 60 seconds / 17
    // We can set small for testing purpose
    uint256 public numBlocksLockedFounders;

    // flag to determine all the token for developers already unlocked or not
    bool public unlockedAllTokensForDev = false;
    // flag to determine all the token for founders already unlocked or not
    bool public unlockedAllTokensForFounders = false;

    // Constructor function sets the BCDC Multisig address and
    // total number of locked tokens to transfer
    function BCDCVault(address _bcdcMultisig,uint256 _numBlocksLockedForDev,uint256 _numBlocksLockedForFounders) {
        // If it's not bcdcMultisig address then throw
        if (_bcdcMultisig == 0x0) throw;
        // Initalized bcdcToken
        bcdcToken = BCDCToken(msg.sender);
        // Initalized bcdcMultisig address
        bcdcMultisig = _bcdcMultisig;
        // Mark it as BCDCVault
        isBCDCVault = true;
        //Initalized numBlocksLockedDev and numBlocksLockedFounders with block number
        numBlocksLockedDev = _numBlocksLockedForDev;
        numBlocksLockedFounders = _numBlocksLockedForFounders;
        // Initalized unlockedBlockForDev with block number
        // according to current block
        unlockedBlockForDev = safeAdd(block.number, numBlocksLockedDev); // 30 days of blocks later
        // Initalized unlockedBlockForFounders with block number
        // according to current block
        unlockedBlockForFounders = safeAdd(block.number, numBlocksLockedFounders); // 365 days of blocks later
    }

    // Transfer Development Team Tokens To MultiSigWallet - 30 Days Locked
    function unlockForDevelopment() external {
        // If it has not reached 30 days mark do not transfer
        if (block.number < unlockedBlockForDev) throw;
        // If it is already unlocked then do not allowed
        if (unlockedAllTokensForDev) throw;
        // Mark it as unlocked
        unlockedAllTokensForDev = true;
        // Will fail if allocation (and therefore toTransfer) is 0.
        uint256 totalBalance = bcdcToken.balanceOf(this);
        // transfer half of token to development team
        uint256 developmentTokens = safeDiv(safeMul(totalBalance, 50), 100);
        if (!bcdcToken.transfer(bcdcMultisig, developmentTokens)) throw;
    }

    //  Transfer Founders Team Tokens To MultiSigWallet - 365 Days Locked
    function unlockForFounders() external {
        // If it has not reached 365 days mark do not transfer
        if (block.number < unlockedBlockForFounders) throw;
        // If it is already unlocked then do not allowed
        if (unlockedAllTokensForFounders) throw;
        // Mark it as unlocked
        unlockedAllTokensForFounders = true;
        // Will fail if allocation (and therefore toTransfer) is 0.
        if (!bcdcToken.transfer(bcdcMultisig, bcdcToken.balanceOf(this))) throw;
        // So that ether will not be trapped here.
        if (!bcdcMultisig.send(this.balance)) throw;
    }

    // disallow payment after unlock block
    function () payable {
        if (block.number >= unlockedBlockForFounders) throw;
    }

}

// @title BCDC Token Contract with Token Sale Functionality as well
contract BCDCToken is SafeMath, ERC20 {

    // flag to determine if address is for a real contract or not
    bool public isBCDCToken = false;
    bool public upgradeAgentStatus = false;
    // Address of Owner for this Contract
    address public owner;

    // Define the current state of crowdsale
    enum State{PreFunding, Funding, Success, Failure}

    // Token related information
    string public constant name = "BCDC Token";
    string public constant symbol = "BCDC";
    uint256 public constant decimals = 18;  // decimal places

    // Mapping of token balance and allowed address for each address with transfer limit
    mapping (address => uint256) balances;
    // This is only for refund purpose, as we have price range during different weeks of Crowdfunding,
    //  need to maintain total investment done so refund would be exactly same.
    mapping (address => uint256) investment;
    mapping (address => mapping (address => uint256)) allowed;

    // Crowdsale information
    bool public finalizedCrowdfunding = false;
    // flag to determine is perallocation done or not
    bool public preallocated = false;
    uint256 public fundingStartBlock; // crowdsale start block
    uint256 public fundingEndBlock; // crowdsale end block
    // change price of token when current block reached

    // Maximum Token Sale (Crowdsale + Early Sale + Supporters)
    // Approximate 250 millions ITS + 125 millions for early investors + 75 Millions to Supports
    uint256 public tokenSaleMax;
    // Min tokens needs to be sold out for success
    // Approximate 1/4 of 250 millions
    uint256 public tokenSaleMin;
    //1 Billion BCDC Tokens
    uint256 public constant maxTokenSupply = 1000000000 ether;
    // Team token percentages to store in time vault
    uint256 public constant vaultPercentOfTotal = 5;
    // Project Reserved Fund Token %
    uint256 public constant reservedPercentTotal = 25;

    // Multisig Wallet Address
    address public bcdcMultisig;
    // Project Reserve Fund address
    address bcdcReserveFund;
    // BCDC's time-locked vault
    BCDCVault public timeVault;

    // Events for refund process
    event Refund(address indexed _from, uint256 _value);
    event Upgrade(address indexed _from, address indexed _to, uint256 _value);
    event UpgradeFinalized(address sender, address upgradeAgent);
    event UpgradeAgentSet(address agent);
    // BCDC:ETH exchange rate
    uint256 tokensPerEther;

    // @dev To Halt in Emergency Condition
    bool public halted;

    bool public finalizedUpgrade = false;
    address public upgradeMaster;
    UpgradeAgent public upgradeAgent;
    uint256 public totalUpgraded;


    // Constructor function sets following
    // @param bcdcMultisig address of bcdcMultisigWallet
    // @param fundingStartBlock block number at which funding will start
    // @param fundingEndBlock block number at which funding will end
    // @param tokenSaleMax maximum number of token to sale
    // @param tokenSaleMin minimum number of token to sale
    // @param tokensPerEther number of token to sale per ether
    function BCDCToken(address _bcdcMultiSig,
                      address _upgradeMaster,
                      uint256 _fundingStartBlock,
                      uint256 _fundingEndBlock,
                      uint256 _tokenSaleMax,
                      uint256 _tokenSaleMin,
                      uint256 _tokensPerEther,
                      uint256 _numBlocksLockedForDev,
                      uint256 _numBlocksLockedForFounders) {
        // Is not bcdcMultisig address correct then throw
        if (_bcdcMultiSig == 0) throw;
        // Is funding already started then throw
        if (_upgradeMaster == 0) throw;

        if (_fundingStartBlock <= block.number) throw;
        // If fundingEndBlock or fundingStartBlock value is not correct then throw
        if (_fundingEndBlock   <= _fundingStartBlock) throw;
        // If tokenSaleMax or tokenSaleMin value is not correct then throw
        if (_tokenSaleMax <= _tokenSaleMin) throw;
        // If tokensPerEther value is 0 then throw
        if (_tokensPerEther == 0) throw;
        // Mark it is BCDCToken
        isBCDCToken = true;
        // Initalized all param
        upgradeMaster = _upgradeMaster;
        fundingStartBlock = _fundingStartBlock;
        fundingEndBlock = _fundingEndBlock;
        tokenSaleMax = _tokenSaleMax;
        tokenSaleMin = _tokenSaleMin;
        tokensPerEther = _tokensPerEther;
        // Initalized timeVault as BCDCVault
        timeVault = new BCDCVault(_bcdcMultiSig,_numBlocksLockedForDev,_numBlocksLockedForFounders);
        // If timeVault is not BCDCVault then throw
        if (!timeVault.isBCDCVault()) throw;
        // Initalized bcdcMultisig address
        bcdcMultisig = _bcdcMultiSig;
        // Initalized owner
        owner = msg.sender;
        // MultiSigWallet is not bcdcMultisig then throw
        if (!MultiSigWallet(bcdcMultisig).isMultiSigWallet()) throw;
    }
    // Ownership related modifer and functions
    // @dev Throws if called by any account other than the owner
    modifier onlyOwner() {
      if (msg.sender != owner) {
        throw;
      }
      _;
    }

    // @dev Allows the current owner to transfer control of the contract to a newOwner.
    // @param newOwner The address to transfer ownership to.
    function transferOwnership(address newOwner) onlyOwner {
      if (newOwner != address(0)) {
        owner = newOwner;
      }
    }

    // @param _bcdcReserveFund Ether Address for Project Reserve Fund
    // This has to be called before preAllocation
    // Only to be called by Owner of this contract
    function setBcdcReserveFund(address _bcdcReserveFund) onlyOwner{
        if (getState() != State.PreFunding) throw;
        if (preallocated) throw; // Has to be done before preallocation
        if (_bcdcReserveFund == 0x0) throw;
        bcdcReserveFund = _bcdcReserveFund;
    }

    // @param who The address of the investor to check balance
    // @return balance tokens of investor address
    function balanceOf(address who) constant returns (uint) {
        return balances[who];
    }

    // @param who The address of the investor to check investment amount
    // @return total investment done by ethereum address
    // This method is only usable up to Crowdfunding ends (Success or Fail)
    // So if tokens are transfered post crowdsale investment will not change.
    function checkInvestment(address who) constant returns (uint) {
        return investment[who];
    }

    // @param owner The address of the account owning tokens
    // @param spender The address of the account able to transfer the tokens
    // @return Amount of remaining tokens allowed to spent
    function allowance(address owner, address spender) constant returns (uint) {
        return allowed[owner][spender];
    }

    //  Transfer `value` BCDC tokens from sender's account
    // `msg.sender` to provided account address `to`.
    // @dev Required state: Success
    // @param to The address of the recipient
    // @param value The number of BCDC tokens to transfer
    // @return Whether the transfer was successful or not
    function transfer(address to, uint value) returns (bool ok) {
        if (getState() != State.Success) throw; // Abort if crowdfunding was not a success.
        uint256 senderBalance = balances[msg.sender];
        if ( senderBalance >= value && value > 0) {
            senderBalance = safeSub(senderBalance, value);
            balances[msg.sender] = senderBalance;
            balances[to] = safeAdd(balances[to], value);
            Transfer(msg.sender, to, value);
            return true;
        }
        return false;
    }

    //  Transfer `value` BCDC tokens from sender 'from'
    // to provided account address `to`.
    // @dev Required state: Success
    // @param from The address of the sender
    // @param to The address of the recipient
    // @param value The number of BCDC to transfer
    // @return Whether the transfer was successful or not
    function transferFrom(address from, address to, uint value) returns (bool ok) {
        if (getState() != State.Success) throw; // Abort if crowdfunding was not a success.
        if (balances[from] >= value &&
            allowed[from][msg.sender] >= value &&
            value > 0)
        {
            balances[to] = safeAdd(balances[to], value);
            balances[from] = safeSub(balances[from], value);
            allowed[from][msg.sender] = safeSub(allowed[from][msg.sender], value);
            Transfer(from, to, value);
            return true;
        } else { return false; }
    }

    //  `msg.sender` approves `spender` to spend `value` tokens
    // @param spender The address of the account able to transfer the tokens
    // @param value The amount of wei to be approved for transfer
    // @return Whether the approval was successful or not
    function approve(address spender, uint value) returns (bool ok) {
        if (getState() != State.Success) throw; // Abort if not in Success state.
        allowed[msg.sender][spender] = value;
        Approval(msg.sender, spender, value);
        return true;
    }

    // Sale of the tokens. Investors can call this method to invest into BCDC Tokens
    // Only when it's in funding mode. In case of emergecy it will be halted.
    function() payable stopIfHalted external {
        // Allow only to invest in funding state
        if (getState() != State.Funding) throw;

        // Sorry !! We do not allow to invest with 0 as value
        if (msg.value == 0) throw;

        // multiply by exchange rate to get newly created token amount
        uint256 createdTokens = safeMul(msg.value, tokensPerEther);

        // Wait we crossed maximum token sale goal. It's successful token sale !!
        if (safeAdd(createdTokens, totalSupply) > tokenSaleMax) throw;

        // Call to Internal function to assign tokens
        assignTokens(msg.sender, createdTokens);

        // Track the investment for each address till crowdsale ends
        investment[msg.sender] = safeAdd(investment[msg.sender], msg.value);
    }

    // To allocate tokens to Project Fund - eg. RecycleToCoin before Token Sale
    // Tokens allocated to these will not be count in totalSupply till the Token Sale Success and Finalized in finalizeCrowdfunding()
    function preAllocation() onlyOwner stopIfHalted external {
        // Allow only in Pre Funding Mode
        if (getState() != State.PreFunding) throw;
        // Check if BCDC Reserve Fund is set or not
        if (bcdcReserveFund == 0x0) throw;
        // To prevent multiple call by mistake
        if (preallocated) throw;
        preallocated = true;
        // 25% of overall Token Supply to project reseve fund
        uint256 projectTokens = safeDiv(safeMul(maxTokenSupply, reservedPercentTotal), 100);
        // At this time we will not add to totalSupply because these are not part of Sale
        // It will be added in totalSupply once the Token Sale is Finalized
        balances[bcdcReserveFund] = projectTokens;
        // Log the event
        Transfer(0, bcdcReserveFund, projectTokens);
    }

    // BCDC accepts Early Investment through manual process in Fiat Currency
    // BCDC Team will assign the tokens to investors manually through this function
    function earlyInvestment(address earlyInvestor, uint256 assignedTokens) onlyOwner stopIfHalted external {
        // Allow only in Pre Funding Mode And Funding Mode
        if (getState() != State.PreFunding && getState() != State.Funding) throw;
        // Check if earlyInvestor address is set or not
        if (earlyInvestor == 0x0) throw;
        // By mistake tokens mentioned as 0, save the cost of assigning tokens.
        if (assignedTokens == 0 ) throw;

        // Call to Internal function to assign tokens
        assignTokens(earlyInvestor, assignedTokens);

        // Track the investment for each address
        // Refund for this investor is taken care by out side the contract.because they are investing in their fiat currency
        //investment[earlyInvestor] = safeAdd(investment[earlyInvestor], etherValue);
    }

    // Function will transfer the tokens to investor's address
    // Common function code for Early Investor and Crowdsale Investor
    function assignTokens(address investor, uint256 tokens) internal {
        // Creating tokens and  increasing the totalSupply
        totalSupply = safeAdd(totalSupply, tokens);

        // Assign new tokens to the sender
        balances[investor] = safeAdd(balances[investor], tokens);

        // Finally token created for sender, log the creation event
        Transfer(0, investor, tokens);
    }

    // Finalize crowdfunding
    // Finally - Transfer the Ether to Multisig Wallet
    function finalizeCrowdfunding() stopIfHalted external {
        // Abort if not in Funding Success state.
        if (getState() != State.Success) throw; // don't finalize unless we won
        if (finalizedCrowdfunding) throw; // can't finalize twice (so sneaky!)

        // prevent more creation of tokens
        finalizedCrowdfunding = true;

        // Check if Unsold tokens out 450 millions
        // 250 Millions Sale + 125 Millions for Early Investors + 75 Millions for Supporters
        uint256 unsoldTokens = safeSub(tokenSaleMax, totalSupply);

        // Founders and Tech Team Tokens Goes to Vault, Locked for 1 month (Tech) and 1 year(Team)
        uint256 vaultTokens = safeDiv(safeMul(maxTokenSupply, vaultPercentOfTotal), 100);
        totalSupply = safeAdd(totalSupply, vaultTokens);
        balances[timeVault] = safeAdd(balances[timeVault], vaultTokens);
        Transfer(0, timeVault, vaultTokens);

        // Only transact if there are any unsold tokens
        if(unsoldTokens > 0) {
            totalSupply = safeAdd(totalSupply, unsoldTokens);
            // Remaining unsold tokens assign to multisig wallet
            balances[bcdcMultisig] = safeAdd(balances[bcdcMultisig], unsoldTokens);// Assign Reward Tokens to Multisig wallet
            Transfer(0, bcdcMultisig, unsoldTokens);
        }

        // Add pre allocated tokens to project reserve fund to totalSupply
        uint256 preallocatedTokens = safeDiv(safeMul(maxTokenSupply, reservedPercentTotal), 100);
        // project tokens already counted, so only add preallcated tokens
        totalSupply = safeAdd(totalSupply, preallocatedTokens);
        // 250 millions reward tokens to multisig (equal to reservefund prellocation).
        // Reward to token holders on their commitment with BCDC (25 % of 1 billion = 250 millions)
        uint256 rewardTokens = safeDiv(safeMul(maxTokenSupply, reservedPercentTotal), 100);
        balances[bcdcMultisig] = safeAdd(balances[bcdcMultisig], rewardTokens);// Assign Reward Tokens to Multisig wallet
        totalSupply = safeAdd(totalSupply, rewardTokens);

        // Total Supply Should not be greater than 1 Billion
        if (totalSupply > maxTokenSupply) throw;
        // Transfer ETH to the BCDC Multisig address.
        if (!bcdcMultisig.send(this.balance)) throw;
    }

    // Call this function to get the refund of investment done during Crowdsale
    // Refund can be done only when Min Goal has not reached and Crowdsale is over
    function refund() external {
        // Abort if not in Funding Failure state.
        if (getState() != State.Failure) throw;

        uint256 bcdcValue = balances[msg.sender];
        if (bcdcValue == 0) throw;
        balances[msg.sender] = 0;
        totalSupply = safeSub(totalSupply, bcdcValue);

        uint256 ethValue = investment[msg.sender];
        investment[msg.sender] = 0;
        Refund(msg.sender, ethValue);
        if (!msg.sender.send(ethValue)) throw;
    }

    // This will return the current state of Token Sale
    // Read only method so no transaction fees
    function getState() public constant returns (State){
      if (block.number < fundingStartBlock) return State.PreFunding;
      else if (block.number <= fundingEndBlock && totalSupply < tokenSaleMax) return State.Funding;
      else if (totalSupply >= tokenSaleMin || upgradeAgentStatus) return State.Success;
      else return State.Failure;
    }

    // Token upgrade functionality

    /// @notice Upgrade tokens to the new token contract.
    /// @dev Required state: Success
    /// @param value The number of tokens to upgrade
    function upgrade(uint256 value) external {
        if (!upgradeAgentStatus) throw;
        /*if (getState() != State.Success) throw; // Abort if not in Success state.*/
        if (upgradeAgent.owner() == 0x0) throw; // need a real upgradeAgent address
        if (finalizedUpgrade) throw; // cannot upgrade if finalized

        // Validate input value.
        if (value == 0) throw;
        if (value > balances[msg.sender]) throw;

        // update the balances here first before calling out (reentrancy)
        balances[msg.sender] = safeSub(balances[msg.sender], value);
        totalSupply = safeSub(totalSupply, value);
        totalUpgraded = safeAdd(totalUpgraded, value);
        upgradeAgent.upgradeFrom(msg.sender, value);
        Upgrade(msg.sender, upgradeAgent, value);
    }

    /// @notice Set address of upgrade target contract and enable upgrade
    /// process.
    /// @dev Required state: Success
    /// @param agent The address of the UpgradeAgent contract
    function setUpgradeAgent(address agent) external {
        if (getState() != State.Success) throw; // Abort if not in Success state.
        if (agent == 0x0) throw; // don't set agent to nothing
        if (msg.sender != upgradeMaster) throw; // Only a master can designate the next agent
        upgradeAgent = UpgradeAgent(agent);
        if (!upgradeAgent.isUpgradeAgent()) throw;
        // this needs to be called in success condition to guarantee the invariant is true
        upgradeAgentStatus = true;
        upgradeAgent.setOriginalSupply();
        UpgradeAgentSet(upgradeAgent);
    }

    /// @notice Set address of upgrade target contract and enable upgrade
    /// process.
    /// @dev Required state: Success
    /// @param master The address that will manage upgrades, not the upgradeAgent contract address
    function setUpgradeMaster(address master) external {
        if (getState() != State.Success) throw; // Abort if not in Success state.
        if (master == 0x0) throw;
        if (msg.sender != upgradeMaster) throw; // Only a master can designate the next master
        upgradeMaster = master;
    }

    // These modifier and functions related to halt the sale in case of emergency

    // @dev Use this as function modifier that should not execute if contract state Halted
    modifier stopIfHalted {
      if(halted) throw;
      _;
    }

    // @dev Use this as function modifier that should execute only if contract state Halted
    modifier runIfHalted{
      if(!halted) throw;
      _;
    }

    // @dev called by only owner in case of any emergecy situation
    function halt() external onlyOwner{
      halted = true;
    }

    // @dev called by only owner to stop the emergency situation
    function unhalt() external onlyOwner{
      halted = false;
    }

    // This method is only use for transfer bcdctoken from bcdcReserveFund
    // @dev Required state: is bcdcReserveFund set
    // @param to The address of the recipient
    // @param value The number of BCDC tokens to transfer
    // @return Whether the transfer was successful or not
    function reserveTokenClaim(address claimAddress,uint256 token) onlyBcdcReserve returns (bool ok){
      // Check if BCDC Reserve Fund is set or not
      if ( bcdcReserveFund == 0x0) throw;
      uint256 senderBalance = balances[msg.sender];
      if(senderBalance >= token && token>0){
        senderBalance = safeSub(senderBalance, token);
        balances[msg.sender] = senderBalance;
        balances[claimAddress] = safeAdd(balances[claimAddress], token);
        Transfer(msg.sender, claimAddress, token);
        return true;
      }
      return false;
    }

    // This method is for getting bcdctoken as rewards
	  // @param tokens The number of tokens back for rewards
  	function backTokenForRewards(uint256 tokens) external{
  		// Check that token available for transfer
  		if(balances[msg.sender] < tokens && tokens <= 0) throw;

  		// Debit tokens from msg.sender
  		balances[msg.sender] = safeSub(balances[msg.sender], tokens);

  		// Credit tokens into bcdcReserveFund
  		balances[bcdcReserveFund] = safeAdd(balances[bcdcReserveFund], tokens);
  		Transfer(msg.sender, bcdcReserveFund, tokens);
  	}

    // bcdcReserveFund related modifer and functions
    // @dev Throws if called by any account other than the bcdcReserveFund owner
    modifier onlyBcdcReserve() {
      if (msg.sender != bcdcReserveFund) {
        throw;
      }
      _;
    }
}

Contract Security Audit

Contract ABI

[{"constant":true,"inputs":[],"name":"name","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"vaultPercentOfTotal","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"spender","type":"address"},{"name":"value","type":"uint256"}],"name":"approve","outputs":[{"name":"ok","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"totalSupply","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getState","outputs":[{"name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"upgradeAgentStatus","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"finalizeCrowdfunding","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"from","type":"address"},{"name":"to","type":"address"},{"name":"value","type":"uint256"}],"name":"transferFrom","outputs":[{"name":"ok","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"preallocated","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"decimals","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"tokenSaleMax","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"value","type":"uint256"}],"name":"upgrade","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"finalizedUpgrade","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"maxTokenSupply","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"refund","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"bcdcMultisig","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"upgradeAgent","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"halt","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"upgradeMaster","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"earlyInvestor","type":"address"},{"name":"assignedTokens","type":"uint256"}],"name":"earlyInvestment","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"finalizedCrowdfunding","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"reservedPercentTotal","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"who","type":"address"}],"name":"balanceOf","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"fundingEndBlock","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"symbol","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"to","type":"address"},{"name":"value","type":"uint256"}],"name":"transfer","outputs":[{"name":"ok","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_bcdcReserveFund","type":"address"}],"name":"setBcdcReserveFund","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"halted","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"tokens","type":"uint256"}],"name":"backTokenForRewards","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"totalUpgraded","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"unhalt","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"isBCDCToken","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"preAllocation","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"fundingStartBlock","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"agent","type":"address"}],"name":"setUpgradeAgent","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"tokenSaleMin","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"owner","type":"address"},{"name":"spender","type":"address"}],"name":"allowance","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"claimAddress","type":"address"},{"name":"token","type":"uint256"}],"name":"reserveTokenClaim","outputs":[{"name":"ok","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"timeVault","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"who","type":"address"}],"name":"checkInvestment","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"master","type":"address"}],"name":"setUpgradeMaster","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"inputs":[{"name":"_bcdcMultiSig","type":"address"},{"name":"_upgradeMaster","type":"address"},{"name":"_fundingStartBlock","type":"uint256"},{"name":"_fundingEndBlock","type":"uint256"},{"name":"_tokenSaleMax","type":"uint256"},{"name":"_tokenSaleMin","type":"uint256"},{"name":"_tokensPerEther","type":"uint256"},{"name":"_numBlocksLockedForDev","type":"uint256"},{"name":"_numBlocksLockedForFounders","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"payable":true,"stateMutability":"payable","type":"fallback"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_from","type":"address"},{"indexed":false,"name":"_value","type":"uint256"}],"name":"Refund","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_from","type":"address"},{"indexed":true,"name":"_to","type":"address"},{"indexed":false,"name":"_value","type":"uint256"}],"name":"Upgrade","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"sender","type":"address"},{"indexed":false,"name":"upgradeAgent","type":"address"}],"name":"UpgradeFinalized","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"agent","type":"address"}],"name":"UpgradeAgentSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"from","type":"address"},{"indexed":true,"name":"to","type":"address"},{"indexed":false,"name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"owner","type":"address"},{"indexed":true,"name":"spender","type":"address"},{"indexed":false,"name":"value","type":"uint256"}],"name":"Approval","type":"event"}]

60606040526000600160006101000a81548160ff02191690831515021790555060006001806101000a81548160ff0219169083151502179055506000600560006101000a81548160ff0219169083151502179055506000600560016101000a81548160ff0219169083151502179055506000600e60016101000a81548160ff02191690831515021790555034156200009657600080fd5b60405161012080620041078339810160405280805190602001909190805190602001909190805190602001909190805190602001909190805190602001909190805190602001909190805190602001909190805190602001909190805190602001909190505060008973ffffffffffffffffffffffffffffffffffffffff1614156200012157600080fd5b60008873ffffffffffffffffffffffffffffffffffffffff1614156200014657600080fd5b43871115156200015557600080fd5b86861115156200016457600080fd5b83851115156200017357600080fd5b60008314156200018257600080fd5b60018060006101000a81548160ff02191690831515021790555087600e60026101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508660068190555085600781905550846008819055508360098190555082600d819055508882826200020d620004a7565b808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018381526020018281526020019350505050604051809103906000f08015156200026857600080fd5b600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663178f4da66000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b15156200033757600080fd5b6102c65a03f115156200034957600080fd5b5050506040518051905015156200035f57600080fd5b88600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555033600160026101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16634c3a6ae06000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b15156200047057600080fd5b6102c65a03f115156200048257600080fd5b5050506040518051905015156200049857600080fd5b505050505050505050620004b8565b604051610a3d80620036ca83390190565b61320280620004c86000396000f30060606040526004361061020f576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806306fdde031461032657806308e496ea146103b4578063095ea7b3146103dd57806318160ddd146104375780631865c57d1461046057806318d0122a146104975780631ed692c0146104c457806323b872dd146104d95780632925827c14610552578063313ce5671461057f578063427982f2146105a857806345977d03146105d157806347858c79146105f457806350f7c20414610621578063590e1ae31461064a5780635b0dad8e1461065f5780635de4ccb0146106b45780635ed7ca5b14610709578063600440cb1461071e578063686d31ac1461077357806368f67330146107b55780636bce6569146107e257806370a082311461080b5780638da5cb5b1461085857806391b43d13146108ad57806395d89b41146108d6578063a9059cbb14610964578063b6c4a2f1146109be578063b9b8af0b146109f7578063bce23a7814610a24578063c752ff6214610a47578063cb3e64fd14610a70578063ccb6499714610a85578063d3b7bcf114610ab2578063d648a64714610ac7578063d7e7088a14610af0578063d873f0d614610b29578063dd62ed3e14610b52578063dda0463714610bbe578063f2fde38b14610c18578063f4660ff514610c51578063fb05ed3714610ca6578063ffeb7d7514610cf3575b6000600e60009054906101000a900460ff161561022b57600080fd5b6001600381111561023857fe5b610240610d2c565b600381111561024b57fe5b14151561025757600080fd5b600034141561026557600080fd5b61027134600d54610d98565b905060085461028282600054610dcb565b111561028d57600080fd5b6102973382610df5565b6102e0600360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205434610dcb565b600360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555050005b341561033157600080fd5b610339610ee7565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561037957808201518184015260208101905061035e565b50505050905090810190601f1680156103a65780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34156103bf57600080fd5b6103c7610f20565b6040518082815260200191505060405180910390f35b34156103e857600080fd5b61041d600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050610f25565b604051808215151515815260200191505060405180910390f35b341561044257600080fd5b61044a611043565b6040518082815260200191505060405180910390f35b341561046b57600080fd5b610473610d2c565b6040518082600381111561048357fe5b60ff16815260200191505060405180910390f35b34156104a257600080fd5b6104aa611049565b604051808215151515815260200191505060405180910390f35b34156104cf57600080fd5b6104d761105b565b005b34156104e457600080fd5b610538600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050611595565b604051808215151515815260200191505060405180910390f35b341561055d57600080fd5b610565611937565b604051808215151515815260200191505060405180910390f35b341561058a57600080fd5b61059261194a565b6040518082815260200191505060405180910390f35b34156105b357600080fd5b6105bb61194f565b6040518082815260200191505060405180910390f35b34156105dc57600080fd5b6105f26004808035906020019091905050611955565b005b34156105ff57600080fd5b610607611cc1565b604051808215151515815260200191505060405180910390f35b341561062c57600080fd5b610634611cd4565b6040518082815260200191505060405180910390f35b341561065557600080fd5b61065d611ce4565b005b341561066a57600080fd5b610672611ed2565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156106bf57600080fd5b6106c7611ef8565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561071457600080fd5b61071c611f1e565b005b341561072957600080fd5b610731611f97565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561077e57600080fd5b6107b3600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050611fbd565b005b34156107c057600080fd5b6107c86120c9565b604051808215151515815260200191505060405180910390f35b34156107ed57600080fd5b6107f56120dc565b6040518082815260200191505060405180910390f35b341561081657600080fd5b610842600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506120e1565b6040518082815260200191505060405180910390f35b341561086357600080fd5b61086b61212a565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156108b857600080fd5b6108c0612150565b6040518082815260200191505060405180910390f35b34156108e157600080fd5b6108e9612156565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561092957808201518184015260208101905061090e565b50505050905090810190601f1680156109565780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b341561096f57600080fd5b6109a4600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803590602001909190505061218f565b604051808215151515815260200191505060405180910390f35b34156109c957600080fd5b6109f5600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190505061236b565b005b3415610a0257600080fd5b610a0a612475565b604051808215151515815260200191505060405180910390f35b3415610a2f57600080fd5b610a456004808035906020019091905050612488565b005b3415610a5257600080fd5b610a5a6126c7565b6040518082815260200191505060405180910390f35b3415610a7b57600080fd5b610a836126cd565b005b3415610a9057600080fd5b610a98612746565b604051808215151515815260200191505060405180910390f35b3415610abd57600080fd5b610ac5612759565b005b3415610ad257600080fd5b610ada612976565b6040518082815260200191505060405180910390f35b3415610afb57600080fd5b610b27600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190505061297c565b005b3415610b3457600080fd5b610b3c612c58565b6040518082815260200191505060405180910390f35b3415610b5d57600080fd5b610ba8600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050612c5e565b6040518082815260200191505060405180910390f35b3415610bc957600080fd5b610bfe600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050612ce5565b604051808215151515815260200191505060405180910390f35b3415610c2357600080fd5b610c4f600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050612f37565b005b3415610c5c57600080fd5b610c6461300e565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3415610cb157600080fd5b610cdd600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050613034565b6040518082815260200191505060405180910390f35b3415610cfe57600080fd5b610d2a600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190505061307d565b005b6000600654431015610d415760009050610d95565b6007544311158015610d565750600854600054105b15610d645760019050610d95565b600954600054101580610d8257506001809054906101000a900460ff165b15610d905760029050610d95565b600390505b90565b6000808284029050610dc16000851480610dbc5750838583811515610db957fe5b04145b61316d565b8091505092915050565b6000808284019050610deb848210158015610de65750838210155b61316d565b8091505092915050565b610e0160005482610dcb565b600081905550610e50600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205482610dcb565b600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff1660007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a35050565b6040805190810160405280600a81526020017f4243444320546f6b656e0000000000000000000000000000000000000000000081525081565b600581565b600060026003811115610f3457fe5b610f3c610d2c565b6003811115610f4757fe5b141515610f5357600080fd5b81600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040518082815260200191505060405180910390a36001905092915050565b60005481565b6001809054906101000a900460ff1681565b600080600080600e60009054906101000a900460ff161561107b57600080fd5b6002600381111561108857fe5b611090610d2c565b600381111561109b57fe5b1415156110a757600080fd5b600560009054906101000a900460ff16156110c157600080fd5b6001600560006101000a81548160ff0219169083151502179055506110ea60085460005461317c565b935061110d6111066b033b2e3c9fd0803ce80000006005610d98565b6064613195565b925061111b60005484610dcb565b60008190555061118c60026000600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205484610dcb565b60026000600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1660007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef856040518082815260200191505060405180910390a360008411156113c15761127860005485610dcb565b6000819055506112e960026000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205485610dcb565b60026000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1660007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef866040518082815260200191505060405180910390a35b6113e26113db6b033b2e3c9fd0803ce80000006019610d98565b6064613195565b91506113f060005483610dcb565b6000819055506114176114106b033b2e3c9fd0803ce80000006019610d98565b6064613195565b905061148460026000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205482610dcb565b60026000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506114f560005482610dcb565b6000819055506b033b2e3c9fd0803ce8000000600054111561151657600080fd5b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc3073ffffffffffffffffffffffffffffffffffffffff16319081150290604051600060405180830381858888f19350505050151561158f57600080fd5b50505050565b6000600260038111156115a457fe5b6115ac610d2c565b60038111156115b757fe5b1415156115c357600080fd5b81600260008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541015801561168e575081600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205410155b801561169a5750600082115b1561192b576116e8600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205483610dcb565b600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550611774600260008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020548361317c565b600260008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061183d600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020548361317c565b600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a360019050611930565b600090505b9392505050565b600560019054906101000a900460ff1681565b601281565b60085481565b6001809054906101000a900460ff16151561196f57600080fd5b6000600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b15156119ff57600080fd5b6102c65a03f11515611a1057600080fd5b5050506040518051905073ffffffffffffffffffffffffffffffffffffffff161415611a3b57600080fd5b600e60019054906101000a900460ff1615611a5557600080fd5b6000811415611a6357600080fd5b600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054811115611aaf57600080fd5b611af8600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020548261317c565b600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550611b476000548261317c565b600081905550611b5960105482610dcb565b601081905550600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663753e88e533836040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050600060405180830381600087803b1515611c2357600080fd5b6102c65a03f11515611c3457600080fd5b505050600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f7e5c344a8141a805725cb476f76c6953b842222b967edd1f78ddb6e8b3f397ac836040518082815260200191505060405180910390a350565b600e60019054906101000a900460ff1681565b6b033b2e3c9fd0803ce800000081565b600080600380811115611cf357fe5b611cfb610d2c565b6003811115611d0657fe5b141515611d1257600080fd5b600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205491506000821415611d6257600080fd5b6000600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550611db36000548361317c565b600081905550600360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490506000600360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055503373ffffffffffffffffffffffffffffffffffffffff167fbb28353e4598c3b9199101a66e0989549b659a59a54d2c27fbb183f1932c8e6d826040518082815260200191505060405180910390a23373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f193505050501515611ece57600080fd5b5050565b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600160029054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611f7a57600080fd5b6001600e60006101000a81548160ff021916908315150217905550565b600e60029054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600160029054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561201957600080fd5b600e60009054906101000a900460ff161561203357600080fd5b6000600381111561204057fe5b612048610d2c565b600381111561205357fe5b1415801561207f57506001600381111561206957fe5b612071610d2c565b600381111561207c57fe5b14155b1561208957600080fd5b60008273ffffffffffffffffffffffffffffffffffffffff1614156120ad57600080fd5b60008114156120bb57600080fd5b6120c58282610df5565b5050565b600560009054906101000a900460ff1681565b601981565b6000600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b600160029054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60075481565b6040805190810160405280600481526020017f424344430000000000000000000000000000000000000000000000000000000081525081565b6000806002600381111561219f57fe5b6121a7610d2c565b60038111156121b257fe5b1415156121be57600080fd5b600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490508281101580156122105750600083115b1561235f5761221f818461317c565b905080600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506122ae600260008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205484610dcb565b600260008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef856040518082815260200191505060405180910390a360019150612364565b600091505b5092915050565b600160029054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156123c757600080fd5b600060038111156123d457fe5b6123dc610d2c565b60038111156123e757fe5b1415156123f357600080fd5b600560019054906101000a900460ff161561240d57600080fd5b60008173ffffffffffffffffffffffffffffffffffffffff16141561243157600080fd5b80600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600e60009054906101000a900460ff1681565b80600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541080156124d7575060008111155b156124e157600080fd5b61252a600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020548261317c565b600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506125d860026000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205482610dcb565b60026000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a350565b60105481565b600160029054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561272957600080fd5b6000600e60006101000a81548160ff021916908315150217905550565b600160009054906101000a900460ff1681565b6000600160029054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156127b757600080fd5b600e60009054906101000a900460ff16156127d157600080fd5b600060038111156127de57fe5b6127e6610d2c565b60038111156127f157fe5b1415156127fd57600080fd5b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141561284357600080fd5b600560019054906101000a900460ff161561285d57600080fd5b6001600560016101000a81548160ff0219169083151502179055506128996128926b033b2e3c9fd0803ce80000006019610d98565b6064613195565b90508060026000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1660007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a350565b60065481565b6002600381111561298957fe5b612991610d2c565b600381111561299c57fe5b1415156129a857600080fd5b60008173ffffffffffffffffffffffffffffffffffffffff1614156129cc57600080fd5b600e60029054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515612a2857600080fd5b80600f60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166361d3d7a66000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b1515612af757600080fd5b6102c65a03f11515612b0857600080fd5b505050604051805190501515612b1d57600080fd5b60018060016101000a81548160ff021916908315150217905550600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16639ef916ab6040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401600060405180830381600087803b1515612bbc57600080fd5b6102c65a03f11515612bcd57600080fd5b5050507f7845d5aa74cc410e35571258d954f23b82276e160fe8c188fa80566580f279cc600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a150565b60095481565b6000600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b600080600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515612d4457600080fd5b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415612d8a57600080fd5b600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050828110158015612ddc5750600083115b15612f2b57612deb818461317c565b905080600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550612e7a600260008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205484610dcb565b600260008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef856040518082815260200191505060405180910390a360019150612f30565b600091505b5092915050565b600160029054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515612f9357600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614151561300b5780600160026101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b50565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6002600381111561308a57fe5b613092610d2c565b600381111561309d57fe5b1415156130a957600080fd5b60008173ffffffffffffffffffffffffffffffffffffffff1614156130cd57600080fd5b600e60029054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561312957600080fd5b80600e60026101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b80151561317957600080fd5b50565b600061318a8383111561316d565b818303905092915050565b6000806131a46000841161316d565b82848115156131af57fe5b0490506131cc83858115156131c057fe5b0682850201851461316d565b80915050929150505600a165627a7a723058202b27988bab4bbb73b18a76853e45265712aadb2a107f3556d8b299da0d5e68120029606060405260008060006101000a81548160ff0219169083151502179055506000600660006101000a81548160ff0219169083151502179055506000600660016101000a81548160ff021916908315150217905550341561005f57600080fd5b604051606080610a3d8339810160405280805190602001909190805190602001909190805190602001909190505060008373ffffffffffffffffffffffffffffffffffffffff1614156100b157600080fd5b33600060016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555082600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060016000806101000a81548160ff021916908315150217905550816004819055508060058190555061017a436004546101ad640100000000026107df176401000000009004565b60028190555061019f436005546101ad640100000000026107df176401000000009004565b6003819055505050506101f9565b60008082840190506101e08482101580156101c85750838210155b6101ea640100000000026107d0176401000000009004565b8091505092915050565b8015156101f657600080fd5b50565b610835806102086000396000f300606060405260043610610099576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff168063178f4da6146100ab5780631a5d708e146100d85780634117b6af14610101578063558fafc51461012a5780635b262eb21461015757806377b35b4714610180578063829c0095146101ad5780639009e123146101c2578063a1fc2a2e146101eb575b600354431015156100a957600080fd5b005b34156100b657600080fd5b6100be610200565b604051808215151515815260200191505060405180910390f35b34156100e357600080fd5b6100eb610212565b6040518082815260200191505060405180910390f35b341561010c57600080fd5b610114610218565b6040518082815260200191505060405180910390f35b341561013557600080fd5b61013d61021e565b604051808215151515815260200191505060405180910390f35b341561016257600080fd5b61016a610231565b6040518082815260200191505060405180910390f35b341561018b57600080fd5b610193610237565b604051808215151515815260200191505060405180910390f35b34156101b857600080fd5b6101c061024a565b005b34156101cd57600080fd5b6101d56104fd565b6040518082815260200191505060405180910390f35b34156101f657600080fd5b6101fe610503565b005b6000809054906101000a900460ff1681565b60035481565b60045481565b600660019054906101000a900460ff1681565b60025481565b600660009054906101000a900460ff1681565b60035443101561025957600080fd5b600660019054906101000a900460ff161561027357600080fd5b6001600660016101000a81548160ff021916908315150217905550600060019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600060019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306000604051602001526040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001915050602060405180830381600087803b15156103b457600080fd5b6102c65a03f115156103c557600080fd5b505050604051805190506000604051602001526040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b151561045c57600080fd5b6102c65a03f1151561046d57600080fd5b50505060405180519050151561048257600080fd5b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc3073ffffffffffffffffffffffffffffffffffffffff16319081150290604051600060405180830381858888f1935050505015156104fb57600080fd5b565b60055481565b60008060025443101561051557600080fd5b600660009054906101000a900460ff161561052f57600080fd5b6001600660006101000a81548160ff021916908315150217905550600060019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306000604051602001526040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001915050602060405180830381600087803b151561060f57600080fd5b6102c65a03f1151561062057600080fd5b50505060405180519050915061064161063a83603261075c565b606461078f565b9050600060019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16836000604051602001526040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b151561073257600080fd5b6102c65a03f1151561074357600080fd5b50505060405180519050151561075857600080fd5b5050565b60008082840290506107856000851480610780575083858381151561077d57fe5b04145b6107d0565b8091505092915050565b60008061079e600084116107d0565b82848115156107a957fe5b0490506107c683858115156107ba57fe5b068285020185146107d0565b8091505092915050565b8015156107dc57600080fd5b50565b60008082840190506107ff8482101580156107fa5750838210155b6107d0565b80915050929150505600a165627a7a72305820607ad7668db15fb233fe35276b9ccc9d7aee2b531a4511cf275e0580875e88010029000000000000000000000000ec71c55893ee571d2eb8592f0b7b2816c115a4a20000000000000000000000005adc335afa4f6f97d5920996f0f0ff06ace3b998000000000000000000000000000000000000000000000000000000000046151d000000000000000000000000000000000000000000000000000000000046c21d000000000000000000000000000000000000000001743b34e18439b50200000000000000000000000000000000000000000000000001a784379d99db420000000000000000000000000000000000000000000000000000000000000000000190000000000000000000000000000000000000000000000000000000000003c068000000000000000000000000000000000000000000000000000000000021197a

Deployed Bytecode

0x60606040526004361061020f576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806306fdde031461032657806308e496ea146103b4578063095ea7b3146103dd57806318160ddd146104375780631865c57d1461046057806318d0122a146104975780631ed692c0146104c457806323b872dd146104d95780632925827c14610552578063313ce5671461057f578063427982f2146105a857806345977d03146105d157806347858c79146105f457806350f7c20414610621578063590e1ae31461064a5780635b0dad8e1461065f5780635de4ccb0146106b45780635ed7ca5b14610709578063600440cb1461071e578063686d31ac1461077357806368f67330146107b55780636bce6569146107e257806370a082311461080b5780638da5cb5b1461085857806391b43d13146108ad57806395d89b41146108d6578063a9059cbb14610964578063b6c4a2f1146109be578063b9b8af0b146109f7578063bce23a7814610a24578063c752ff6214610a47578063cb3e64fd14610a70578063ccb6499714610a85578063d3b7bcf114610ab2578063d648a64714610ac7578063d7e7088a14610af0578063d873f0d614610b29578063dd62ed3e14610b52578063dda0463714610bbe578063f2fde38b14610c18578063f4660ff514610c51578063fb05ed3714610ca6578063ffeb7d7514610cf3575b6000600e60009054906101000a900460ff161561022b57600080fd5b6001600381111561023857fe5b610240610d2c565b600381111561024b57fe5b14151561025757600080fd5b600034141561026557600080fd5b61027134600d54610d98565b905060085461028282600054610dcb565b111561028d57600080fd5b6102973382610df5565b6102e0600360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205434610dcb565b600360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555050005b341561033157600080fd5b610339610ee7565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561037957808201518184015260208101905061035e565b50505050905090810190601f1680156103a65780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34156103bf57600080fd5b6103c7610f20565b6040518082815260200191505060405180910390f35b34156103e857600080fd5b61041d600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050610f25565b604051808215151515815260200191505060405180910390f35b341561044257600080fd5b61044a611043565b6040518082815260200191505060405180910390f35b341561046b57600080fd5b610473610d2c565b6040518082600381111561048357fe5b60ff16815260200191505060405180910390f35b34156104a257600080fd5b6104aa611049565b604051808215151515815260200191505060405180910390f35b34156104cf57600080fd5b6104d761105b565b005b34156104e457600080fd5b610538600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050611595565b604051808215151515815260200191505060405180910390f35b341561055d57600080fd5b610565611937565b604051808215151515815260200191505060405180910390f35b341561058a57600080fd5b61059261194a565b6040518082815260200191505060405180910390f35b34156105b357600080fd5b6105bb61194f565b6040518082815260200191505060405180910390f35b34156105dc57600080fd5b6105f26004808035906020019091905050611955565b005b34156105ff57600080fd5b610607611cc1565b604051808215151515815260200191505060405180910390f35b341561062c57600080fd5b610634611cd4565b6040518082815260200191505060405180910390f35b341561065557600080fd5b61065d611ce4565b005b341561066a57600080fd5b610672611ed2565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156106bf57600080fd5b6106c7611ef8565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561071457600080fd5b61071c611f1e565b005b341561072957600080fd5b610731611f97565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561077e57600080fd5b6107b3600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050611fbd565b005b34156107c057600080fd5b6107c86120c9565b604051808215151515815260200191505060405180910390f35b34156107ed57600080fd5b6107f56120dc565b6040518082815260200191505060405180910390f35b341561081657600080fd5b610842600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506120e1565b6040518082815260200191505060405180910390f35b341561086357600080fd5b61086b61212a565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156108b857600080fd5b6108c0612150565b6040518082815260200191505060405180910390f35b34156108e157600080fd5b6108e9612156565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561092957808201518184015260208101905061090e565b50505050905090810190601f1680156109565780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b341561096f57600080fd5b6109a4600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803590602001909190505061218f565b604051808215151515815260200191505060405180910390f35b34156109c957600080fd5b6109f5600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190505061236b565b005b3415610a0257600080fd5b610a0a612475565b604051808215151515815260200191505060405180910390f35b3415610a2f57600080fd5b610a456004808035906020019091905050612488565b005b3415610a5257600080fd5b610a5a6126c7565b6040518082815260200191505060405180910390f35b3415610a7b57600080fd5b610a836126cd565b005b3415610a9057600080fd5b610a98612746565b604051808215151515815260200191505060405180910390f35b3415610abd57600080fd5b610ac5612759565b005b3415610ad257600080fd5b610ada612976565b6040518082815260200191505060405180910390f35b3415610afb57600080fd5b610b27600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190505061297c565b005b3415610b3457600080fd5b610b3c612c58565b6040518082815260200191505060405180910390f35b3415610b5d57600080fd5b610ba8600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050612c5e565b6040518082815260200191505060405180910390f35b3415610bc957600080fd5b610bfe600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050612ce5565b604051808215151515815260200191505060405180910390f35b3415610c2357600080fd5b610c4f600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050612f37565b005b3415610c5c57600080fd5b610c6461300e565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3415610cb157600080fd5b610cdd600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050613034565b6040518082815260200191505060405180910390f35b3415610cfe57600080fd5b610d2a600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190505061307d565b005b6000600654431015610d415760009050610d95565b6007544311158015610d565750600854600054105b15610d645760019050610d95565b600954600054101580610d8257506001809054906101000a900460ff165b15610d905760029050610d95565b600390505b90565b6000808284029050610dc16000851480610dbc5750838583811515610db957fe5b04145b61316d565b8091505092915050565b6000808284019050610deb848210158015610de65750838210155b61316d565b8091505092915050565b610e0160005482610dcb565b600081905550610e50600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205482610dcb565b600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff1660007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a35050565b6040805190810160405280600a81526020017f4243444320546f6b656e0000000000000000000000000000000000000000000081525081565b600581565b600060026003811115610f3457fe5b610f3c610d2c565b6003811115610f4757fe5b141515610f5357600080fd5b81600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040518082815260200191505060405180910390a36001905092915050565b60005481565b6001809054906101000a900460ff1681565b600080600080600e60009054906101000a900460ff161561107b57600080fd5b6002600381111561108857fe5b611090610d2c565b600381111561109b57fe5b1415156110a757600080fd5b600560009054906101000a900460ff16156110c157600080fd5b6001600560006101000a81548160ff0219169083151502179055506110ea60085460005461317c565b935061110d6111066b033b2e3c9fd0803ce80000006005610d98565b6064613195565b925061111b60005484610dcb565b60008190555061118c60026000600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205484610dcb565b60026000600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1660007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef856040518082815260200191505060405180910390a360008411156113c15761127860005485610dcb565b6000819055506112e960026000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205485610dcb565b60026000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1660007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef866040518082815260200191505060405180910390a35b6113e26113db6b033b2e3c9fd0803ce80000006019610d98565b6064613195565b91506113f060005483610dcb565b6000819055506114176114106b033b2e3c9fd0803ce80000006019610d98565b6064613195565b905061148460026000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205482610dcb565b60026000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506114f560005482610dcb565b6000819055506b033b2e3c9fd0803ce8000000600054111561151657600080fd5b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc3073ffffffffffffffffffffffffffffffffffffffff16319081150290604051600060405180830381858888f19350505050151561158f57600080fd5b50505050565b6000600260038111156115a457fe5b6115ac610d2c565b60038111156115b757fe5b1415156115c357600080fd5b81600260008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541015801561168e575081600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205410155b801561169a5750600082115b1561192b576116e8600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205483610dcb565b600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550611774600260008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020548361317c565b600260008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061183d600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020548361317c565b600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a360019050611930565b600090505b9392505050565b600560019054906101000a900460ff1681565b601281565b60085481565b6001809054906101000a900460ff16151561196f57600080fd5b6000600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b15156119ff57600080fd5b6102c65a03f11515611a1057600080fd5b5050506040518051905073ffffffffffffffffffffffffffffffffffffffff161415611a3b57600080fd5b600e60019054906101000a900460ff1615611a5557600080fd5b6000811415611a6357600080fd5b600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054811115611aaf57600080fd5b611af8600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020548261317c565b600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550611b476000548261317c565b600081905550611b5960105482610dcb565b601081905550600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663753e88e533836040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050600060405180830381600087803b1515611c2357600080fd5b6102c65a03f11515611c3457600080fd5b505050600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f7e5c344a8141a805725cb476f76c6953b842222b967edd1f78ddb6e8b3f397ac836040518082815260200191505060405180910390a350565b600e60019054906101000a900460ff1681565b6b033b2e3c9fd0803ce800000081565b600080600380811115611cf357fe5b611cfb610d2c565b6003811115611d0657fe5b141515611d1257600080fd5b600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205491506000821415611d6257600080fd5b6000600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550611db36000548361317c565b600081905550600360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490506000600360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055503373ffffffffffffffffffffffffffffffffffffffff167fbb28353e4598c3b9199101a66e0989549b659a59a54d2c27fbb183f1932c8e6d826040518082815260200191505060405180910390a23373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f193505050501515611ece57600080fd5b5050565b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600160029054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611f7a57600080fd5b6001600e60006101000a81548160ff021916908315150217905550565b600e60029054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600160029054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561201957600080fd5b600e60009054906101000a900460ff161561203357600080fd5b6000600381111561204057fe5b612048610d2c565b600381111561205357fe5b1415801561207f57506001600381111561206957fe5b612071610d2c565b600381111561207c57fe5b14155b1561208957600080fd5b60008273ffffffffffffffffffffffffffffffffffffffff1614156120ad57600080fd5b60008114156120bb57600080fd5b6120c58282610df5565b5050565b600560009054906101000a900460ff1681565b601981565b6000600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b600160029054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60075481565b6040805190810160405280600481526020017f424344430000000000000000000000000000000000000000000000000000000081525081565b6000806002600381111561219f57fe5b6121a7610d2c565b60038111156121b257fe5b1415156121be57600080fd5b600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490508281101580156122105750600083115b1561235f5761221f818461317c565b905080600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506122ae600260008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205484610dcb565b600260008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef856040518082815260200191505060405180910390a360019150612364565b600091505b5092915050565b600160029054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156123c757600080fd5b600060038111156123d457fe5b6123dc610d2c565b60038111156123e757fe5b1415156123f357600080fd5b600560019054906101000a900460ff161561240d57600080fd5b60008173ffffffffffffffffffffffffffffffffffffffff16141561243157600080fd5b80600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600e60009054906101000a900460ff1681565b80600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541080156124d7575060008111155b156124e157600080fd5b61252a600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020548261317c565b600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506125d860026000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205482610dcb565b60026000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a350565b60105481565b600160029054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561272957600080fd5b6000600e60006101000a81548160ff021916908315150217905550565b600160009054906101000a900460ff1681565b6000600160029054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156127b757600080fd5b600e60009054906101000a900460ff16156127d157600080fd5b600060038111156127de57fe5b6127e6610d2c565b60038111156127f157fe5b1415156127fd57600080fd5b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141561284357600080fd5b600560019054906101000a900460ff161561285d57600080fd5b6001600560016101000a81548160ff0219169083151502179055506128996128926b033b2e3c9fd0803ce80000006019610d98565b6064613195565b90508060026000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1660007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a350565b60065481565b6002600381111561298957fe5b612991610d2c565b600381111561299c57fe5b1415156129a857600080fd5b60008173ffffffffffffffffffffffffffffffffffffffff1614156129cc57600080fd5b600e60029054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515612a2857600080fd5b80600f60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166361d3d7a66000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b1515612af757600080fd5b6102c65a03f11515612b0857600080fd5b505050604051805190501515612b1d57600080fd5b60018060016101000a81548160ff021916908315150217905550600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16639ef916ab6040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401600060405180830381600087803b1515612bbc57600080fd5b6102c65a03f11515612bcd57600080fd5b5050507f7845d5aa74cc410e35571258d954f23b82276e160fe8c188fa80566580f279cc600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a150565b60095481565b6000600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b600080600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515612d4457600080fd5b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415612d8a57600080fd5b600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050828110158015612ddc5750600083115b15612f2b57612deb818461317c565b905080600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550612e7a600260008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205484610dcb565b600260008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef856040518082815260200191505060405180910390a360019150612f30565b600091505b5092915050565b600160029054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515612f9357600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614151561300b5780600160026101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b50565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6002600381111561308a57fe5b613092610d2c565b600381111561309d57fe5b1415156130a957600080fd5b60008173ffffffffffffffffffffffffffffffffffffffff1614156130cd57600080fd5b600e60029054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561312957600080fd5b80600e60026101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b80151561317957600080fd5b50565b600061318a8383111561316d565b818303905092915050565b6000806131a46000841161316d565b82848115156131af57fe5b0490506131cc83858115156131c057fe5b0682850201851461316d565b80915050929150505600a165627a7a723058202b27988bab4bbb73b18a76853e45265712aadb2a107f3556d8b299da0d5e68120029

Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)

000000000000000000000000ec71c55893ee571d2eb8592f0b7b2816c115a4a20000000000000000000000005adc335afa4f6f97d5920996f0f0ff06ace3b998000000000000000000000000000000000000000000000000000000000046151d000000000000000000000000000000000000000000000000000000000046c21d000000000000000000000000000000000000000001743b34e18439b50200000000000000000000000000000000000000000000000001a784379d99db420000000000000000000000000000000000000000000000000000000000000000000190000000000000000000000000000000000000000000000000000000000003c068000000000000000000000000000000000000000000000000000000000021197a

-----Decoded View---------------
Arg [0] : _bcdcMultiSig (address): 0xec71C55893eE571d2Eb8592f0B7b2816c115a4a2
Arg [1] : _upgradeMaster (address): 0x5adc335aFA4f6F97d5920996f0f0fF06ACe3b998
Arg [2] : _fundingStartBlock (uint256): 4592925
Arg [3] : _fundingEndBlock (uint256): 4637213
Arg [4] : _tokenSaleMax (uint256): 450000000000000000000000000
Arg [5] : _tokenSaleMin (uint256): 2000000000000000000000000
Arg [6] : _tokensPerEther (uint256): 400
Arg [7] : _numBlocksLockedForDev (uint256): 245864
Arg [8] : _numBlocksLockedForFounders (uint256): 2169210

-----Encoded View---------------
9 Constructor Arguments found :
Arg [0] : 000000000000000000000000ec71c55893ee571d2eb8592f0b7b2816c115a4a2
Arg [1] : 0000000000000000000000005adc335afa4f6f97d5920996f0f0ff06ace3b998
Arg [2] : 000000000000000000000000000000000000000000000000000000000046151d
Arg [3] : 000000000000000000000000000000000000000000000000000000000046c21d
Arg [4] : 000000000000000000000000000000000000000001743b34e18439b502000000
Arg [5] : 00000000000000000000000000000000000000000001a784379d99db42000000
Arg [6] : 0000000000000000000000000000000000000000000000000000000000000190
Arg [7] : 000000000000000000000000000000000000000000000000000000000003c068
Arg [8] : 000000000000000000000000000000000000000000000000000000000021197a


Swarm Source

bzzr://607ad7668db15fb233fe35276b9ccc9d7aee2b531a4511cf275e0580875e8801
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.